diff --git a/docs/changelog/update.md b/docs/changelog/update.md
index 6100609c..fa9c8227 100644
--- a/docs/changelog/update.md
+++ b/docs/changelog/update.md
@@ -13,6 +13,8 @@
- [ ] 当出现不支持的文件类型的时候,前端没有限制
- [ ] 默认智能体设置后,在一些情况下依然仅加载第一个智能体
- [ ] 目前只能获取默认的 tools,单个智能体的tools没法展示
+- [ ] 生成的过程中切换对话,会出现消息渲染混乱的问题,消息完全记载完成之后不会出现混乱
+- [ ] 当消息生成的时候有报错的时候,前端无显示
💯 **More**:
diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py
index 08caa184..b3201d34 100644
--- a/server/routers/chat_router.py
+++ b/server/routers/chat_router.py
@@ -179,10 +179,17 @@ async def update_chat_models(model_provider: str, model_names: list[str], curren
return {"models": config.model_names[model_provider]["models"]}
@chat.get("/tools")
-async def get_tools(agent_id: str, current_user: User = Depends(get_admin_user)):
+async def get_tools(agent_id: str, current_user: User = Depends(get_required_user)):
"""获取所有可用工具(需要登录)"""
- logger.info(f"agent_id: {agent_id}")
- tools = get_buildin_tools()
+ # 获取Agent实例和配置类
+ if not (agent := agent_manager.get_agent(agent_id)):
+ raise HTTPException(status_code=404, detail=f"智能体 {agent_id} 不存在")
+
+ if hasattr(agent, "agent_tools"):
+ tools = agent.agent_tools
+ else:
+ tools = get_buildin_tools()
+
tools_info = gen_tool_info(tools)
return {"tools": {tool["id"]: tool for tool in tools_info}}
@@ -190,9 +197,9 @@ async def get_tools(agent_id: str, current_user: User = Depends(get_admin_user))
async def save_agent_config(
agent_id: str,
config: dict = Body(...),
- current_user: User = Depends(get_admin_user)
+ current_user: User = Depends(get_required_user)
):
- """保存智能体配置到YAML文件(需要管理员权限)"""
+ """保存智能体配置到YAML文件(需要登录)"""
try:
# 获取Agent实例和配置类
if not (agent := agent_manager.get_agent(agent_id)):
diff --git a/src/agents/chatbot/context.py b/src/agents/chatbot/context.py
index a056d935..797565d1 100644
--- a/src/agents/chatbot/context.py
+++ b/src/agents/chatbot/context.py
@@ -2,7 +2,9 @@ from typing import Annotated
from dataclasses import dataclass, field
from src.agents.common.context import BaseContext
-from src.agents.common.tools import get_buildin_tools
+from src.agents.common.tools import gen_tool_info
+
+from .tools import get_tools
@dataclass(kw_only=True)
class Context(BaseContext):
@@ -16,11 +18,11 @@ class Context(BaseContext):
},
)
- tools: Annotated[list[str], {"__template_metadata__": {"kind": "tools"}}] = field(
+ tools: Annotated[list[dict], {"__template_metadata__": {"kind": "tools"}}] = field(
default_factory=list,
metadata={
"name": "工具",
- "options": [t.name for t in get_buildin_tools()], # 这里的选择是所有的工具
+ "options": gen_tool_info(get_tools()), # 这里的选择是所有的工具
"description": "工具列表"
},
)
diff --git a/src/agents/chatbot/graph.py b/src/agents/chatbot/graph.py
index 7aa04470..ca89eeee 100644
--- a/src/agents/chatbot/graph.py
+++ b/src/agents/chatbot/graph.py
@@ -34,20 +34,21 @@ class ChatbotAgent(BaseAgent):
self.context_schema = Context
self.workdir = Path(sys_config.save_dir) / "agents" / self.module_name
self.workdir.mkdir(parents=True, exist_ok=True)
+ self.agent_tools = get_tools()
def _get_tools(self, tools: list[str]):
"""根据配置获取工具。
默认不使用任何工具。
如果配置为列表,则使用列表中的工具。
"""
- platform_tools = get_tools()
+ self.agent_tools = get_tools()
if tools is None or not isinstance(tools, list) or len(tools) == 0:
# 默认不使用任何工具
logger.info("未配置工具或配置为空,不使用任何工具")
return []
else:
# 使用配置中指定的工具
- tools = [tool for tool in platform_tools if tool.name in tools]
+ tools = [tool for tool in self.agent_tools if tool.name in tools]
logger.info(f"使用工具: {[tool.name for tool in tools]}")
return tools
diff --git a/src/utils/logging_config.py b/src/utils/logging_config.py
index 90d33cdf..d1563f29 100644
--- a/src/utils/logging_config.py
+++ b/src/utils/logging_config.py
@@ -20,7 +20,7 @@ def setup_logger(name, level="DEBUG", console=True):
loguru_logger.add(
LOG_FILE,
level=level,
- format="{time:YYYY-MM-DD HH:mm:ss} - {level} - {name} - {message}",
+ format="{time:YYYY-MM-DD HH:mm:ss} - {level} - {name}:{line} - {message}",
encoding="utf-8",
rotation="10 MB", # 文件大小达到 10MB 时轮转
retention="30 days", # 保留30天的日志
@@ -32,7 +32,7 @@ def setup_logger(name, level="DEBUG", console=True):
loguru_logger.add(
lambda msg: print(msg, end=""),
level=level,
- format="{time:MM-DD HH:mm:ss} {level} {name}: {message}",
+ format="{time:MM-DD HH:mm:ss} {level} {name}:{line}: {message}",
colorize=True
)
diff --git a/web/src/stores/agent.js b/web/src/stores/agent.js
index ccd40ece..200e0553 100644
--- a/web/src/stores/agent.js
+++ b/web/src/stores/agent.js
@@ -50,7 +50,7 @@ export const useAgentStore = defineStore('agent', {
configurableItems: (state) => {
const agent = state.selectedAgentId ? state.agents[state.selectedAgentId] : null;
if (!agent || !agent.configurable_items) return {};
-
+
const agentConfigurableItems = agent.configurable_items;
const items = { ...agentConfigurableItems };
Object.keys(items).forEach(key => {
@@ -108,13 +108,13 @@ export const useAgentStore = defineStore('agent', {
try {
// 首先加载智能体列表
await this.fetchAgents();
-
+
// 然后设置默认智能体
await this.fetchDefaultAgent();
-
+
// 最后加载工具
await this.fetchTools();
-
+
this.isInitialized = true;
} catch (error) {
console.error('Failed to initialize agent store:', error);
@@ -244,7 +244,7 @@ export const useAgentStore = defineStore('agent', {
this.error = null;
try {
- const response = await agentApi.getTools();
+ const response = await agentApi.getTools(this.selectedAgentId);
this.availableTools = response.tools;
} catch (error) {
console.error('Failed to fetch tools:', error);
@@ -444,7 +444,7 @@ export const useAgentStore = defineStore('agent', {
this.isStreaming = true;
this.resetOnGoingConv();
-
+
// 创建新的 AbortController
this.streamAbortController = new AbortController();
@@ -472,7 +472,7 @@ export const useAgentStore = defineStore('agent', {
if (this.streamAbortController && this.streamAbortController.signal.aborted) {
break;
}
-
+
const { done, value } = await reader.read();
if (done) break;
@@ -491,7 +491,7 @@ export const useAgentStore = defineStore('agent', {
}
}
}
-
+
// Process any remaining data in the buffer
if (buffer.trim() && (!this.streamAbortController || !this.streamAbortController.signal.aborted)) {
try {
@@ -542,7 +542,7 @@ export const useAgentStore = defineStore('agent', {
this.streamAbortController.abort();
this.streamAbortController = null;
}
-
+
this.agents = {};
this.selectedAgentId = null;
this.defaultAgentId = null;