diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index 8978a81a..95ce2ebb 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -211,10 +211,16 @@ async def chat_agent( name = msg_dict.get("name", "") if tool_call_id: + # 确保tool_output是字符串类型,避免SQLite不支持列表类型 + if isinstance(content, list): + tool_output = json.dumps(content) if content else "" + else: + tool_output = str(content) + # 通过 LangGraph tool_call_id 精确匹配并更新 updated_tc = conv_mgr.update_tool_call_output( langgraph_tool_call_id=tool_call_id, - tool_output=content, + tool_output=tool_output, status="success", ) if updated_tc: diff --git a/src/agents/common/models.py b/src/agents/common/models.py index befe1329..bbe078f2 100644 --- a/src/agents/common/models.py +++ b/src/agents/common/models.py @@ -26,6 +26,7 @@ def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: model=model_name, api_key=SecretStr(api_key), base_url=base_url, + stream_usage=True, ) model_info = config.model_names.get(provider, {}) @@ -40,6 +41,7 @@ def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: api_key=SecretStr(api_key), base_url=base_url, api_base=base_url, + stream_usage=True, ) elif provider == "together": @@ -49,6 +51,7 @@ def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: model=model, api_key=SecretStr(api_key), base_url=base_url, + stream_usage=True, ) else: @@ -59,6 +62,7 @@ def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: model=model, api_key=SecretStr(api_key), base_url=base_url, + stream_usage=True, ) except Exception as e: raise ValueError(f"Model provider {provider} load failed, {e} \n {traceback.format_exc()}") diff --git a/src/agents/common/utils.py b/src/agents/common/utils.py index 84dc5077..ebbcbfdb 100644 --- a/src/agents/common/utils.py +++ b/src/agents/common/utils.py @@ -1,71 +1,8 @@ -import os -import traceback from datetime import UTC, datetime -from langchain_core.language_models import BaseChatModel from langchain_core.messages import AIMessageChunk, ToolMessage from langchain_core.runnables import RunnableConfig -from pydantic import SecretStr - -from src import config from src.agents.common.base import BaseAgent -from src.models import get_custom_model -from src.utils import get_docker_safe_url - - -def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: - """ - Load a chat model from a fully specified name. - """ - provider, model = fully_specified_name.split("/", maxsplit=1) - - if provider == "custom": - from langchain_openai import ChatOpenAI - - model_info = get_custom_model(model) - api_key = model_info.get("api_key") or "custom_model" - base_url = get_docker_safe_url(model_info["api_base"]) - model_name = model_info.get("name") or "custom_model" - return ChatOpenAI( - model=model_name, - api_key=SecretStr(api_key), - base_url=base_url, - ) - - model_info = config.model_names.get(provider, {}) - api_key = os.getenv(model_info["env"][0], model_info["env"][0]) - base_url = get_docker_safe_url(model_info["base_url"]) - - if provider in ["deepseek", "dashscope"]: - from langchain_deepseek import ChatDeepSeek - - return ChatDeepSeek( - model=model, - api_key=SecretStr(api_key), - base_url=base_url, - api_base=base_url, - ) - - elif provider == "together": - from langchain_together import ChatTogether - - return ChatTogether( - model=model, - api_key=SecretStr(api_key), - base_url=base_url, - ) - - else: - try: # 其他模型,默认使用OpenAIBase, like openai, zhipuai - from langchain_openai import ChatOpenAI - - return ChatOpenAI( - model=model, - api_key=SecretStr(api_key), - base_url=base_url, - ) - except Exception as e: - raise ValueError(f"Model provider {provider} load failed, {e} \n {traceback.format_exc()}") async def agent_cli(agent: BaseAgent, config: RunnableConfig | None = None): diff --git a/web/src/components/dashboard/AgentStatsComponent.vue b/web/src/components/dashboard/AgentStatsComponent.vue index 49947619..6254de86 100644 --- a/web/src/components/dashboard/AgentStatsComponent.vue +++ b/web/src/components/dashboard/AgentStatsComponent.vue @@ -63,8 +63,6 @@ :data-source="topPerformers" size="small" :pagination="false" - :row-class-name="getRowClassName" - :scroll="{ y: 240 }" >