feat: 更新Docker配置和API端口,优化流式响应处理

refactor: 重构工具管理和路由逻辑,提升代码可维护性

fix: 修正配置文件中的传输协议和工具调用名称

docs: 更新README和归档文件,添加生产环境配置说明

perf: 优化流式响应生成,减少内存消耗
This commit is contained in:
2025-11-07 15:56:45 +08:00
17 changed files with 256 additions and 179 deletions

View File

@@ -9,8 +9,10 @@ from loguru import logger
from fastmcp.tools.tool import Tool
from lang_agent.config import InstantiateConfig, ToolConfig
from lang_agent.base import LangToolBase
from lang_agent.client_tool_manager import ClientToolManagerConfig
from lang_agent.rag.simple import SimpleRagConfig
from lang_agent.dummy.calculator import CalculatorConfig
# from lang_agent.dummy.calculator import CalculatorConfig
# from catering_end.lang_tool import CartToolConfig, CartTool
from langchain_core.tools.structured import StructuredTool
from lang_agent.client_tool_manager import ClientToolManager
@@ -19,12 +21,14 @@ from lang_agent.client_tool_manager import ClientToolManager
class ToolManagerConfig(InstantiateConfig):
_target: Type = field(default_factory=lambda: ToolManager)
client_tool_manager: ClientToolManagerConfig = field(default_factory=ClientToolManagerConfig)
# tool configs here; MUST HAVE 'config' in name and must be dataclass
rag_config: SimpleRagConfig = field(default_factory=SimpleRagConfig)
# cart_config: CartToolConfig = field(default_factory=CartToolConfig)
calc_config: CalculatorConfig = field(default_factory=CalculatorConfig)
# calc_config: CalculatorConfig = field(default_factory=CalculatorConfig)
def async_to_sync(async_func: Callable) -> Callable:
@@ -97,9 +101,10 @@ class ToolManager:
logger.info(f"skipping tool:{tool_name}")
try:
from lang_agent.client_tool_manager import ClientToolManagerConfig
client_config = ClientToolManagerConfig()
self.client_tool_manager = ClientToolManager(client_config)
# client_config = self.config.client_tool_manager
# self.client_tool_manager = ClientToolManager(client_config)
# self.client_tool_manager = ClientToolManager(self.config.client_tool_manager)
self.client_tool_manager:ClientToolManager = self.config.client_tool_manager.setup()
logger.info("Successfully initialized client_tool_manager for MCP tools")
except Exception as e:
logger.warning(f"Failed to initialize client_tool_manager: {e}")
@@ -134,25 +139,26 @@ class ToolManager:
self.langchain_tools = []
for func in self.get_tool_fncs():
if isinstance(func, StructuredTool):
self.langchain_tools.append(func)
if hasattr(func, 'coroutine') and func.coroutine is not None and (not hasattr(func, 'func') or func.func is None):
sync_func = async_to_sync(func.coroutine)
new_tool = StructuredTool(
name=func.name,
description=func.description,
args_schema=func.args_schema,
func=sync_func,
coroutine=func.coroutine,
metadata=func.metadata if hasattr(func, 'metadata') else None,
return_direct=func.return_direct if hasattr(func, 'return_direct') else False,
)
self.langchain_tools.append(new_tool)
else:
self.langchain_tools.append(func)
else:
self.langchain_tools.append(self.fnc_to_structool(func))
return self.langchain_tools
def get_list_langchain_tools(self)->List[StructuredTool]:
all_langchain_tools = []
all_langchain_tools.extend(self.langchain_tools)
# 如果有 client_tool_manager添加 MCP 工具(已经是 LangChain 格式)
if self.client_tool_manager:
try:
# 获取 MCP 工具(已经是 StructuredTool 格式)
mcp_tools = self.client_tool_manager.get_tools()
all_langchain_tools.extend(mcp_tools)
except Exception as e:
logger.warning(f"Failed to get MCP tools: {e}")
return all_langchain_tools
return self.langchain_tools
if __name__ == "__main__":