ForcePilot/backend/package/yuxi/agents/buildin/chatbot/graph.py
Wenjie Zhang 42636477c2 refactor: Agent Graph 和 Toolkits 更新
- chatbot/deep_agent graph 清理废弃导入
- toolkits __init__ 调整导出
- install_skill 工具函数重构,简化安装逻辑
2026-05-26 17:40:17 +08:00

96 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from deepagents.middleware.filesystem import FilesystemMiddleware
from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware
from deepagents.middleware.subagents import SubAgentMiddleware
from langchain.agents import create_agent
from langchain.agents.middleware import ModelRetryMiddleware, TodoListMiddleware
from yuxi.agents import BaseAgent, BaseState, load_chat_model
from yuxi.agents.backends import create_agent_composite_backend
from yuxi.agents.context import prepare_agent_runtime_context
from yuxi.agents.middlewares import (
SummaryOffloadMiddleware,
save_attachments_to_fs,
)
from yuxi.agents.middlewares.knowledge_base_middleware import KnowledgeBaseMiddleware
from yuxi.agents.middlewares.skills_middleware import SkillsMiddleware
from yuxi.services.subagent_service import get_subagents_from_slugs
from yuxi.services.tool_service import resolve_configured_runtime_tools
from .prompt import TODO_MID_PROMPT, build_prompt_with_context
async def _build_middlewares(context):
"""构建中间件列表"""
# summary middleware
# 主 Agent 上下文优化90k tokens 触发压缩128k context window 的 70%
summary_middleware = SummaryOffloadMiddleware(
model=load_chat_model(fully_specified_name=context.model),
trigger=("tokens", getattr(context, "summary_threshold", 100) * 1024),
trim_tokens_to_summarize=4000,
summary_offload_threshold=500,
max_retention_ratio=0.5,
)
# subagents
subagents = await get_subagents_from_slugs(context.subagents)
subagents_middleware = SubAgentMiddleware(
default_model=load_chat_model(fully_specified_name=context.subagents_model),
subagents=subagents,
general_purpose_agent=True,
default_middleware=[
FilesystemMiddleware(backend=create_agent_composite_backend), # 文件系统后端
PatchToolCallsMiddleware(),
summary_middleware,
],
)
# all middlewares
middlewares = [
FilesystemMiddleware(backend=create_agent_composite_backend), # 文件系统后端
save_attachments_to_fs, # 附件注入提示词
KnowledgeBaseMiddleware(), # 知识库工具
SkillsMiddleware(), # Skills 中间件(提示词注入、依赖展开、动态激活)
subagents_middleware,
summary_middleware,
TodoListMiddleware(system_prompt=TODO_MID_PROMPT), # 待办事项中间件
PatchToolCallsMiddleware(),
ModelRetryMiddleware(), # 模型重试中间件
]
return middlewares
class ChatbotAgent(BaseAgent):
name = "智能助手"
description = "基础的对话机器人,可以回答问题,可在配置中启用需要的工具。"
capabilities = ["file_upload", "files"] # 支持文件上传功能
def __init__(self, **kwargs):
super().__init__(**kwargs)
async def get_graph(self, context=None, **kwargs):
context = await prepare_agent_runtime_context(
context or self.context_schema(),
context_schema=self.context_schema,
)
# 使用 create_agent 创建智能体
graph = create_agent(
model=load_chat_model(fully_specified_name=context.model),
tools=await resolve_configured_runtime_tools(context),
system_prompt=build_prompt_with_context(context),
middleware=await _build_middlewares(context),
state_schema=BaseState,
checkpointer=await self._get_checkpointer(),
)
return graph
def main():
pass
if __name__ == "__main__":
main()
# asyncio.run(main())