feat: 向量记忆 RAG、工具市场、SSE 流式响应、前端集成与测试覆盖

- 新增 embedding_service(语义检索)、knowledge_service(RAG)、text_chunker、document_parser
- 新增 tool_registry(自定义工具注册表)并完善工具市场 API(CRUD + code/http 执行)
- 新增 agent_vector_memory / knowledge_base 模型及对应数据库表
- 实现 SSE 流式响应与 Agent 预算控制
- AgentChat.vue 集成 MainLayout 导航布局
- 完善测试体系:7 个新测试文件共 110 个测试覆盖
- 修复 conftest.py SQLite 内存数据库连接隔离问题

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
renjianbo
2026-05-01 22:30:46 +08:00
parent 036f533881
commit 7b9e0826de
35 changed files with 4353 additions and 365 deletions

View File

@@ -3,9 +3,8 @@ Agent 工具管理器:包装已有 ToolRegistry提供 Agent 需要的工具
"""
from __future__ import annotations
import json
import logging
from typing import Any, Callable, Dict, List, Optional
from typing import Any, Dict, List, Optional
from app.services.tool_registry import tool_registry
@@ -58,6 +57,8 @@ class AgentToolManager:
"""
执行工具调用。
优先查找内置工具其次查找数据库自定义工具HTTP / Code
Args:
name: 工具名称
args: 工具参数字典
@@ -65,27 +66,8 @@ class AgentToolManager:
Returns:
工具执行结果的字符串表示
"""
func: Optional[Callable] = tool_registry.get_tool_function(name)
if not func:
err = f"工具 '{name}' 不存在"
logger.error(err)
return json.dumps({"error": err}, ensure_ascii=False)
logger.info("Agent 执行工具: %s, 参数: %s", name, args)
try:
import asyncio
if asyncio.iscoroutinefunction(func):
result = await func(**args)
else:
result = func(**args)
if isinstance(result, (dict, list)):
return json.dumps(result, ensure_ascii=False)
return str(result)
except Exception as e:
err_msg = f"工具 '{name}' 执行失败: {e}"
logger.error(err_msg, exc_info=True)
return json.dumps({"error": err_msg}, ensure_ascii=False)
logger.info("Agent 执行工具: %s", name)
return await tool_registry.execute_tool(name, args)
@staticmethod
def _extract_tool_name(schema: Dict[str, Any]) -> Optional[str]: