åºäº LangGraph çäŒäžçº§å€ Agent æºèœäœæ¡æ¶ïŒéçš Orchestrator-Worker çŒææš¡åŒïŒéæç¥è¯åºæ£çŽ¢ïŒRAGïŒãMCP å·¥å ·è°çšãæèœç³»ç»åå€èœ®å¯¹è¯èœåãæ¯æééæºåšäººéæïŒæäŸå¯è§åé 眮äžå¿ã
è®Ÿè®¡äº ThinkingStreamer ç»ä»¶ïŒéè¿ LangGraph åç get_stream_writer() + contextvars æºå¶ïŒåšä»»æè°çšæ·±åºŠèªåšè·å writerãäžå¡å±ïŒDetector / Recognizer / ExpertïŒéè¿ stream_llm() / stream_agent() æ¥å£è°çšïŒå®å
šäžæç¥æµåŒ/忥差åŒïŒç¬Šååäžè莣ååã
æ¶æå³çïŒç»æåèŸåºïŒæ
ç»ªåæ JSONãæåŸè¯å« JSONïŒäžèªç¶è¯èšæèè¿çšèµ°äžåè·¯åŸ â åè
éè¿ stream_llm_structured() é黿¶éïŒåè
éè¿ stream_llm() é token æšé STEP_THINKING äºä»¶ãçšæ·çå°çæ¯èç¹ COMPLETED æèŠ + 宿¶æèè¿çšïŒèéåå§ JSONã
ææ Expert éè¿ PLUGIN.yaml 声æåŒé
çœ®ïŒæ¡æ¶å¯åšæ¶èªåšå®æåŸèç¹æ³šåïŒadd_node + add_edgeïŒãè·¯ç±æ å°ïŒCATEGORY_EXPERT_MAPïŒãèœåæè¿°ïŒDECOMPOSE_PROMPTïŒãæåŸæ³šåãæ°å¢ Expert åªéäžæ¥ïŒå建æä»¶ç®åœ â ç»§æ¿ ExpertPlugin â æ³šåïŒæ¡æ¶ä»£ç é¶æ¹åšã
æ¶æå³çïŒå°åæ¬ç¡¬çŒç çæ å°å ³ç³»ïŒäžå®¶ç±»å«âèç¹ãæåŸâè·¯ç±ãèœåæè¿°ïŒå šéšä» Manifest åšæçæïŒæ¶é€äºæ°å¢ Expert æ¶çæ¡æ¶ä»£ç äŸµå ¥ã
Planner æå䞺 DecomposeïŒåè§£ïŒå DispatchïŒè°åºŠïŒäž€äžªèç¹ãDispatch ææ³¢æ¬¡è°åºŠïŒç¬ç«åä»»å¡å¹¶è¡ SendïŒäŸèµåä»»å¡ææ³¢æ¬¡äž²è¡ïŒåŸªç¯çŽå°å šéšå®æãæ¯äžª complex_plan æåŸç¬ç«è°çš LLM åè§£ïŒLLM 泚æå 100% èçŠåäžªç®æ ïŒå解莚éäžåå ¶ä»æåŸäžäžæå¹²æ°ã
æ¶æå³çïŒExpert æ§è¡å®åå° DispatchïŒèéçŽæ¥å° MergeïŒïŒéè¿ __subtask_idx__ è·¯ç±æ è®°åºåè°åºŠæ¥æºïŒæ¯æå€æ³¢æ¬¡äŸèµè°åºŠã
æåŸè¯å«éçšäžçº§æŒæïŒL1 å ³é®è¯å¹é ïŒ<1msïŒâ L2 åéè¯ä¹ïŒä¿çå ¥å£ïŒâ L3 LLM Function CallingïŒ1-2sïŒãæåŸç±»åä»å€äžªæ¥æºåšææ³šåïŒæèœ SKILL.mdãç¥è¯åº databases.jsonãMCP å·¥å · registry.pyïŒïŒæ é硬çŒç ã
玢åŒåšïŒChromaDB / MilvusïŒãæ£çŽ¢åšïŒSimple / Reranking / FilteredïŒãçæåšïŒStuff / MapReduce / RefineïŒåäžºå¯ææç»ä»¶ïŒæ¯æçµæŽ»ç»åãè·¯ç±å𿝿 LLM æºèœéæ©ç¥è¯åºïŒæ¥è¯¢æ©å±éè¿ LLM çæå乿¥è¯¢è¯åå¹¶å»éã
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Client (React + Vite) â
â Chat UI · Config Panel · File Preview â
ââââââââââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââââ
â SSE / REST
ââââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââââââââ
â Gateway (Nginx) â
ââââââââ¬âââââââââââ¬âââââââââââ¬âââââââââââ¬ââââââââââââââââââââââââââââââ
â â â â
ââââââââŒââââ âââââŒâââââ ââââŒââââ âââââŒâââââââ
â Flask â â MCP â â DB â â Consul â
â App â â Server â â API â â Registry â
ââââââââ¬ââââ âââââ¬âââââ ââââ¬ââââ ââââââââââââ
â â â
⌠⌠âŒ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â LangGraph StateGraph â
â â
â ââââââââââââ ââââââââââââ âââââââââââââ ââââââââââââââââââ â
â â Feeling ââââ¶â Intent ââââ¶â Supervisor ââââ¶â Planner â â
â â Detect â â Recognizeâ â â â Decompose â â
â ââââââââââââ ââââââââââââ âââââââââââââ âââââââââ¬âââââââââ â
â â â
â ââââââââââŒâââââââââ â
â â Planner Dispatch â â
â â (波次è°åºŠ) â â
â ââââ¬âââ¬âââ¬âââ¬âââââ â
â ââââââââââââââââââââââââââââââââ â â â â
â âââââââŒââââââ ââââââââŒââââââ âââââââŒââââââ ââââââŒââââ
â â MCP â â Skill â â RAG â â Chat â
â â Expert â â Expert â â Expert â â Expert â
â âââââââ¬ââââââ ââââââââ¬ââââââ âââââââ¬ââââââ âââââ¬âââââ
â âââââââââââââââââ¬âŽââââââââââââââââ â
â âââââŒâââââââââââââââââââââââââââââââ
â â Merge Node (åå¹¶æ¶Šè²) â
â ââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â â â
ââââââââŒââââ ââââââââŒâââââââ âââââŒâââââ ââââââââââââ
â ChromaDB â â MCP Tools â â Skills â â Redis â
â Milvus â â (éé/倩æ°) â â â â Checkpointâ
ââââââââââââ âââââââââââââââ ââââââââââ ââââââââââââ
sequenceDiagram
participant User
participant Feeling as feeling_detect
participant Intent as intent_recognize
participant Supervisor as supervisor
participant Planner as planner_decompose
participant Dispatch as planner_dispatch
participant MCP as mcp_expert
participant Skill as skill_expert
participant RAG as rag_expert
participant Chat as chat_expert
participant Merge as merge
User->>Feeling: query
Feeling->>Intent: feeling
Intent->>Supervisor: intents
Supervisor->>Supervisor: é眮 agent_results / planned_subtasks
Supervisor->>Planner: ç»äžè·¯ç±
Planner->>Planner: 坿§è¡æåŸçŽæ¥æå»ºåä»»å¡ïŒäžè° LLMïŒ
Planner->>Planner: complex_plan æåŸ LLM ç¬ç«åè§£
Planner->>Planner: å并䞺ç»äžåä»»å¡å衚
Planner->>Dispatch: planned_subtasks
loop 波次è°åºŠåŸªç¯
Dispatch->>Dispatch: 计ç®å°±ç»ªåä»»å¡ïŒdepends_on 已满足ïŒ
Dispatch->>MCP: SendïŒå¹¶è¡ïŒ
Dispatch->>Skill: SendïŒå¹¶è¡ïŒ
Dispatch->>RAG: SendïŒå¹¶è¡ïŒ
Dispatch->>Chat: SendïŒå¹¶è¡ïŒ
MCP->>Dispatch: agent_results
Skill->>Dispatch: agent_results
RAG->>Dispatch: agent_results
Chat->>Dispatch: agent_results
end
Dispatch->>Merge: å
šéšå®æ
Merge->>Merge: åå¹¶ç»æ + LLM æ¶Šè²
Merge-->>User: æç»åç
æ··å坿§è¡æåŸ â çšæ·èŸå ¥ïŒ"æ¥æå·å€©æ°ïŒç»æ¶æåŸ"
çšæ·èŸå
¥ â intent_recognize â [mcp: æ¥å€©æ°, skill: ç»æ¶æåŸ]
â supervisor â planner_decompose
â 坿§è¡æåŸçŽæ¥æå»ºåä»»å¡ïŒäžè° LLMïŒïŒ
[0] mcp: æ¥æå·å€©æ° depends_on: []
[1] skill: ç»æ¶æåŸ depends_on: []
â planner_dispatchïŒç¬¬1æ³¢ïŒïŒready=[0,1] â å¹¶è¡ Send
â mcp_expert + skill_expert å¹¶è¡æ§è¡
â planner_dispatchïŒç¬¬2æ³¢ïŒïŒå
šéšå®æ â merge
â LLM æ¶Šè² â æç»åç
倿任å¡è§å â çšæ·èŸå ¥ïŒ"å建äžäžªåšçº¿è¡šæ Œåºçš"
çšæ·èŸå
¥ â intent_recognize â [complex_plan]
â supervisor â planner_decompose
â LLM ç¬ç«åè§£ complex_planïŒ
[0] chat: åææ žå¿éæ± depends_on: []
[1] chat: è®Ÿè®¡æ°æ®æš¡å depends_on: [0]
[2] chat: è§åææ¯éå depends_on: [0]
[3] chat: æŽåèŸåºåŒå计å depends_on: [1,2]
â planner_dispatch 波次è°åºŠïŒ
第1æ³¢ïŒ[0] â chat_expert
第2æ³¢ïŒ[1,2] â chat_expert à 2ïŒå¹¶è¡ïŒ
第3æ³¢ïŒ[3] â chat_expert
â merge â LLM æ¶Šè² â æç»åç
éçš å屿Œæè·¯ç±æ¶æïŒå å¿«åæ ¢ãå äœææ¬å髿ºèœïŒ
| å±çº§ | çç¥ | å»¶è¿ | 诎æ |
|---|---|---|---|
| L1 | å ³é®è¯/æ£åå¹é | <1ms | å€çåºå®æä»€ïŒ/help, exit, yes/noïŒ |
| L2 | åéè¯ä¹å¹é | 30-100ms | ä¿çå ¥å£ïŒå€çå乿¹å |
| L3 | LLM Function Calling | 1-2s | å€çå€æè¯·æ±åå€æåŸ |
æåŸç±»åïŒ
| ç±»å« | æäžŸåŒ | 诎æ | ç€ºäŸ |
|---|---|---|---|
| RAG | rag |
ç¥è¯åºæ£çŽ¢ | rag_exams, rag_politics |
| Skill | skill |
æèœæ§è¡ | skill_drawio-skill, skill_analysis |
| MCP | mcp |
MCP å·¥å ·è°çš | mcp_weather, mcp_dingtalk_schedule |
| Plan | complex_plan |
倿任å¡çŒæ | Planner åè§£ + 波次è°åºŠ |
| Chat | chat |
éçšå¯¹è¯ | Chat Expert æ¶Šè² |
| System | system |
ç³»ç»æä»€ | system_help, system_exit |
æåŸåšææ³šåïŒç³»ç»å¯åšæ¶èªåšä»å€äžªæ¥æºæ³šåæåŸç±»å â æèœïŒSKILL.mdïŒãç¥è¯åºïŒdatabases.jsonïŒãMCP å·¥å ·ïŒtools/registry.pyïŒïŒæ é硬çŒç ã
Orchestrator-Worker æš¡åŒïŒPlanner æå䞺 DecomposeïŒåè§£ïŒå DispatchïŒè°åºŠïŒäž€äžªèç¹ïŒ
- PlannerDecomposeïŒå¯æ§è¡æåŸçŽæ¥æå»ºåä»»å¡ïŒæ LLMïŒïŒcomplex_plan æåŸç¬ç«è°çš LLM åè§£
- PlannerDispatchïŒææ³¢æ¬¡è°åºŠïŒç¬ç«åä»»å¡å¹¶è¡ SendïŒäŸèµåä»»å¡ææ³¢æ¬¡äž²è¡ïŒåŸªç¯çŽå°å šéšå®æ
Expert èç¹ïŒ
| Expert | ç±»å« | å·¥å ·é | æ§è¡æµçš |
|---|---|---|---|
mcp_expert |
MCP | MCP åšæå·¥å · + mcp_execute å åº | ReAct 埪ç¯éå·¥å ·âæåâæ§è¡ |
skill_expert |
Skill | Skill åšæå·¥å · + skill_execute å åº | ReAct 埪ç¯éæèœâæåâæ§è¡ |
rag_expert |
RAG | knowledge_search + knowledge_generate | ReAct 埪ç¯éç¥è¯åºâæ£çŽ¢âçæ |
chat_expert |
Chat | æ å·¥å ·ïŒçº¯å 容çæïŒ | çŽæ¥å¯¹è¯ |
æ°å¢ Expert åªéäžæ¥ïŒæ¡æ¶ä»£ç é¶æ¹åšïŒ
- å建æä»¶ç®åœïŒå«
PLUGIN.yaml+plugin.pyïŒ - ç»§æ¿
ExpertPluginïŒå®ç°meta+execute registry.register(YourPlugin())
æ¡æ¶èªåšå®æïŒåŸæ³šåïŒadd_node + add_edgeïŒãè·¯ç±æ å°ïŒCATEGORY_EXPERT_MAPïŒãèœåæè¿°ïŒDECOMPOSE_PROMPTïŒãæåŸæ³šåã
PLUGIN.yaml 瀺äŸïŒMCP ExpertïŒïŒ
name: mcp_expert
description: å€éšå·¥å
·è°çšïŒå€©æ°æ¥è¯¢ãé鿥çšãæ¶æ¯æšéçïŒ
version: "1.0.0"
expert:
category: mcp
icon: ð§
label: å·¥å
·è°çš Agent
priority: 100
routing:
target_format: "mcp:{tool_name}"
target_prefix: "mcp:"
aliases: {}
default_fallback: false
intents:
dynamic: true # è¿è¡æ¶ä» MCP å·¥å
·åè¡šåšæåç°
static: []
prompt:
capability_template: "mcp: {description}ãåœåå¯çšå·¥å
·ïŒ{tools}"坿æç»ä»¶è®Ÿè®¡ïŒæ¯æçµæŽ»ç»åïŒ
| ç»ä»¶ | å®ç° |
|---|---|
| 玢åŒåš | ChromaIndexer, MilvusIndexer |
| æ£çŽ¢åš | SimpleVectorRetriever, RerankingRetriever, FilteredRetriever |
| çæåš | StuffGenerator, MapReduceGenerator, RefineGenerator |
| è·¯ç±åš | SimpleRouter, LLMRouterïŒæºèœéæ©ç¥è¯åºïŒ |
| æ¥è¯¢æ©å± | LLM çæå乿¥è¯¢è¯ïŒå并倿¬¡æ£çŽ¢ç»æå»é |
ç¬ç«éšçœ²ç MCP æå¡åšïŒåºäº Streamable HTTP åè®®ïŒ
- å€©æ°æ¥è¯¢ïŒget_weather, weather_recommend
- éééæïŒæ¥çšå建/æ¥è¯¢/å é€ãåŸ åäºé¡¹ç®¡ç
- 衚åæäº€ïŒsubmit_form
- åšææ©å±ïŒéè¿ tools/registry.py æ³šåæ°å·¥å ·ïŒèªåšæŽé²äžº MCP èœå
åºäº SKILL.md çæèœå¹é åæ§è¡åŒæïŒ
| æèœ | 诎æ |
|---|---|
| drawio-skill | çæ Draw.io æ¶æåŸ/æµçšåŸïŒæ¯æå€ç§æ ·åŒé¢è®Ÿ |
| tldraw-skill | çæ tldraw çœæ¿ç»åŸ |
| data-analysis | æ°æ®åæäžå¯è§å |
| trip-plan | æ è¡è§å |
æèœå¹é æ¯æåéè¯ä¹çŽ¢åŒïŒèªåšå¹é æçžå ³çæèœã
éè¿ LangGraph Checkpoint æºå¶å®ç°äŒè¯ç¶ææä¹ åïŒ
| ååš | 诎æ |
|---|---|
| MemoryCheckpointSaver | å åååšïŒåŒåè°è¯çš |
| RedisCheckpointSaver | Redis æä¹ åïŒç产ç¯å¢æšè |
6 ç§æ ç»ªæ£æµïŒåšææŽæ° Prompt è¯æ°é£æ ŒïŒ
| æ 绪 | 诎æ | å žåå ³é®è¯ |
|---|---|---|
| default | äžæ§ | â |
| upbeat | 积æåäž | å æ²¹ãåªåã奿 |
| angry | æ€æäžæ»¡ | çæ°ãæè¯ãå·®è¯ |
| cheerful | æ¬¢å¿«åæŠ | 倪æ£äºãå害ãå®çŸ |
| depressed | æ¶æäœèœ | éŸè¿ãçŠèãè¿·è« |
| friendly | å奜亲å | 谢谢ã麻çŠäœ ãèŸèŠäº |
å¯¹éœ AG-UI (Agent-User Interaction) åè®®æ åïŒ
| äºä»¶ç±»å | 诎æ |
|---|---|
| STEP_STARTED | èç¹åŒå§æ§è¡ |
| STEP_THINKING | èç¹æèè¿çšïŒé token æšéïŒæåæºææïŒ |
| STEP_FINISHED | èç¹æ§è¡å®æ |
| TEXT_MESSAGE_CONTENT | LLM é token èŸåºæç»åçïŒæåæºææïŒå šéïŒ |
| RUN_FINISHED | æŽäœè¿è¡å®æ |
| RUN_ERROR | è¿è¡åŒåžž |
åºäº React çå¯è§åé 眮管ççé¢ïŒäžäžªåèœé¢æ¿ïŒ
- å建 / å é€ç¥è¯åº
- ææ¡£äžäŒ ïŒæ¯æææœïŒæ ŒåŒïŒPDF / Word / Excel / TXT / MDïŒïŒäžäŒ åèªåšè¿è¡ RAG åéå玢åŒ
- ææ¡£å衚管çäžå é€
- å
眮æä»¶é¢è§äŸ§æ ïŒ
- ExcelïŒéè¿çºµæšª SDK åšçº¿é¢è§
- WordïŒéè¿ééä»é¢çŒèŸåšåšçº¿é¢è§
- PDFïŒéè¿ react-pdf æž²æé¢è§
- çº¯ææ¬ïŒçŽæ¥æž²æ
- æ·»å / å é€ MCP æå¡åšïŒé 眮åç§°ãURLãåè®®ïŒ
- è¿æ¥æµè¯
- æå¡åšç¶æçæ§ïŒconnected / disconnectedïŒ
- éè¿ URL å®è£ æèœïŒèªåšäžèœœ SKILL.md 并泚åïŒ
- å·²å®è£ æèœå衚æ¥çäžå é€
éè¿ dingtalk-stream SDK å®ç°ééæºåšäººå®æ¶æ¶æ¯æ¶åïŒ
- Stream é¿è¿æ¥ïŒåºäº WebSocket çéé Stream APIïŒæ éå ¬çœåè°å°å
- æ¶æ¯å»éïŒåºäº message_id å»éïŒé²æ¢éå€å€ç
- äŒè¯ç®¡çïŒæçšæ· ID 绎æ€ç¬ç«äŒè¯ïŒæ¯æå€èœ®å¯¹è¯
- èªåšåå€ïŒæ¥æ¶çšæ·æ¶æ¯ â LangGraph Agent å€ç â èªåšåå€
ééåšçº¿è¡šæ Œé¢è§èœåïŒæ¯æ Excel æä»¶åšééå çŽæ¥æåŒåçŒèŸã
ééææ¡£é¢è§èœåïŒæ¯æ Word çææ¡£åšééå çŽæ¥æ¥çã
ééçžå ³ MCP å·¥å ·ïŒæ¯æéè¿èªç¶è¯èšæäœééåèœïŒ
| å·¥å · | 诎æ |
|---|---|
| dingtalk_schedule_create | å建æ¥çšïŒæ¯ææ¶éŽãåäžè ãå°ç¹ïŒ |
| dingtalk_schedule_query | æ¥è¯¢æ¥çšå衚 |
| dingtalk_schedule_delete | å 逿¥çš |
| dingtalk_todo | 管çåŸ åäºé¡¹ |
䜿çšç€ºäŸïŒ
çšæ·: "åž®æå建æå€©äžå3ç¹çäŒè®®æ¥çš"
â intent_recognize â mcp:dingtalk_schedule_create
â mcp_expert â è°çšéé API å建æ¥çš
â merge â "已䞺æšå建æå€©äžå3ç¹çäŒè®®æ¥çš"
| ç±»å« | ææ¯ |
|---|---|
| Web æ¡æ¶ | Flask + Flask-CORS + Flask-Limiter |
| Agent æ¡æ¶ | LangGraph 1.0+ (StateGraph, Checkpoint, Send API) |
| LLM éæ | LangChain 1.0+ / OpenAI SDK (å Œå®¹ Qwen, GPT ç) |
| åéæ°æ®åº | ChromaDB / Milvus Lite |
| MCP åè®® | FastMCP + Streamable HTTP |
| éééæ | dingtalk-stream (æºåšäºº) + 纵暪 SDK (è¡šæ Œé¢è§) + ä»é¢çŒèŸåš (æåé¢è§) |
| ç¶ææä¹ å | Redis / Memory Checkpoint |
| ææ¡£è§£æ | pypdf, python-docx, pandas, openpyxl |
| æå¡æ³šå | Consul |
| 容åšå | Docker + Docker Compose |
| ç±»å« | ææ¯ | 诎æ |
|---|---|---|
| æ¡æ¶ | React 18 + Vite 5 | SPAïŒSSE æµåŒæž²æ |
| ç¶æç®¡ç | Zustand 5 | 蜻éçº§ç¶æç®¡çïŒæ¿ä»£ Redux |
| HTTP | Axios | REST API è°çš |
| æä»¶é¢è§ | exceljsïŒExcel æž²æïŒãmammoth-plus-plus-2ïŒWord 蜬 HTMLïŒãreact-pdfïŒPDF æž²æïŒ | é 眮äžå¿å 眮é¢è§äŸ§æ |
| ééé¢è§ | 纵暪 SDKïŒè¡šæ ŒïŒãä»é¢çŒèŸåšïŒæåïŒ | ééå çŽæ¥æåŒ/çŒèŸ |
| éšçœ² | Nginx + Docker | åå代ç + éæèµæº |
éè¿ get_stream_writer() + contextvars æºå¶ïŒThinkingStreamer å
éšèªåšç®¡ç writerïŒäžå¡å±éè¿ stream_llm() / stream_llm_structured() / stream_agent() æ¥å£è°çšïŒå®å
šäžæç¥æµåŒ/忥差åŒãç»æåèŸåºäžèªç¶è¯èšæèèµ°äžåè·¯åŸïŒé¿å
åå§ JSON æŽé²ç»çšæ·ã
Planner æå䞺 DecomposeïŒåè§£ïŒå DispatchïŒè°åºŠïŒäž€äžªèç¹ïŒèéåäž AgentïŒ
- Decompose åªèŽèŽ£å解任å¡ïŒäžæ§è¡
- Dispatch ææ³¢æ¬¡è°åºŠïŒæ¯æäŸèµå ³ç³»
- Expert æ§è¡å®åå° DispatchïŒèéçŽæ¥å° Merge
æ¯äžª complex_plan æåŸç¬ç«è°çš LLM åè§£ïŒèéåå¹¶åè§£ïŒ
- LLM 泚æå 100% èçŠåäžªç®æ
- å解莚éäžåå ¶ä»æåŸäžäžæå¹²æ°
éè¿ __subtask_idx__ åºå Expert çè°åºŠæ¥æºïŒ
- Supervisor è°åºŠ â Expert â merge
- Planner è°åºŠ â Expert â planner_dispatchïŒåå°æ³¢æ¬¡è°åºŠïŒ
ææåæ¬ç¡¬çŒç çæ å°å ³ç³»ïŒCATEGORY_EXPERT_MAPãPLANNER_DISPATCH_TARGETSãDECOMPOSE_PROMPT èœåæè¿°çïŒåä» PLUGIN.yaml åšæçæïŒæ°å¢ Expert æ¶æ¡æ¶ä»£ç é¶æ¹åšã
mcp_server/ïŒç¬ç« MCP æå¡åšïŒFastMCP + å·¥å
·æä»¶ïŒäž server/modules/mcp/ïŒMCP 客æ·ç«¯ïŒè¿æ¥è¿çš MCP æå¡åšè·åå·¥å
·ïŒè莣å犻ïŒé¿å
客æ·ç«¯é»èŸäžæå¡ç«¯ä»£ç èŠåã
PlannerDecompose èç¹å éšå§æç»äž€äžªå¯¹ç§°åè§£åšïŒ
| åè§£åš | éçšæåŸ | æ¹åŒ | LLM åŒé |
|---|---|---|---|
| ExecutableIntentDecomposer | mcp/skill/rag/chat/system | è§åæ å°ïŒåç±»å«å并䞺äžäžªåä»»å¡ | 0 |
| ComplexPlanDecomposer | complex_plan | LLM ç¬ç«åè§£ïŒç»æåèŸåºïŒTaskDecompositionïŒ | 1-2s |
坿§è¡ç±»å«ä» PluginRegistry åšæè·åïŒæ°å¢æä»¶æ¶æ éä¿®æ¹åè§£åšä»£ç ãComplexPlanDecomposer äœ¿çš build_task_decomposition_model() è¿è¡æ¶åšæçæ Pydantic æš¡åïŒå° Manifest äžçç±»å«é项å target æ ŒåŒæè¿°æ³šå
¥ FieldïŒç¡®ä¿ LLM èŸåºäžæ³šåæä»¶äžèŽã
LangGraph Send API å¹¶è¡åå Expert æ¶ïŒå€äžªèç¹åæ¶åå ¥ state éèŠèªå®ä¹ reducer è§£å³å²çªïŒ
| åæ®µ | Reducer | 诎æ |
|---|---|---|
agent_results |
add_agent_results |
å¹¶è¡ Expert 远å ç»æïŒSupervisor è¿å None é眮ïŒè§£å³è·šè¯·æ±çŽ¯ç§¯é®é¢ïŒ |
planned_subtasks |
keep_last |
åªè¯»å段ïŒå¹¶è¡èç¹åŒäžåïŒåæåäžäžªå³å¯ |
__dispatch_complete__ |
keep_last |
è°åºŠå®ææ è®°ïŒåæåäžäžª |
chat_history |
add_messages_with_truncation |
åçä¿ç + è¶ é¿è£åª |
åè Context Engineering æäœ³å®è·µïŒå° Agent æ§è¡æéççšæ·ä¿¡æ¯ãäŒè¯ä¿¡æ¯ãæ§è¡äžäžæãè¿è¡æ¶é
眮ç»äžå°è£
䞺 AgentContextïŒPydantic BaseModelïŒïŒé¿å
åæ°ççžãåæš¡åéè¿ context è·åæéä¿¡æ¯ïŒèééå±äŒ éåæ°ã
LangChain Classic ç AgentExecutor åšè°çš tool.run() æ¶äžäŒ é RunnableConfigïŒå¯ŒèŽå·¥å
·æ æ³ä» config.configurable è·å skill_name çé
眮ãéè¿éå _perform_agent_action æ¹æ³ïŒåšå·¥å
·è°çšæ¶æ³šå
¥ configïŒç¡®ä¿ Skill çåšæå·¥å
·èœæ£ç¡®è·åè¿è¡æ¶é
眮ã
DocumentLoaderFactory éçšæ³šåæš¡åŒïŒæ¯ç§æä»¶æ ŒåŒå¯¹åºäžäžªå 蜜åšïŒ
| æ ŒåŒ | å èœœåš | è§£æåº |
|---|---|---|
| PdfLoader | pypdf | |
| Word | DocxLoader | python-docx |
| Excel | ExcelLoader | pandas + openpyxl |
| TXT/MD | TextLoader | åç读å |
æ°å¢æ ŒåŒåªé DocumentLoaderFactory.register_loader(extension, LoaderClass) 泚åã
å®ä¹ Agent astream çç»äžèŸåºæ ŒåŒ StreamEvent(token, event_type, metadata)ïŒææå®ç° astream ç Agent å¿
é¡»éµåŸªæ€åè®®ãThinkingStreamer æ éåæ ŒåŒå€æïŒçŽæ¥è¯»å token åæ®µãåœå Expert Agent ä»äœ¿çšåæ¥è°çšïŒinvokeïŒïŒæªæ¥å®ç° astream å坿¯æ ReAct 埪ç¯äžçé token æèèŸåºã
SSEEventProcessor éè¿ _STATUS_TO_EVENT æ å°è¡šå° StepStatus 蜬æ¢äžº EventTypeïŒæ¶é€ if-elif éŸãå€çäžç§æµæš¡åŒïŒupdates / custom / messagesïŒïŒç»äžèŸåº AG-UI æ åäºä»¶ã
åºäº Flask-Limiter å®ç°å¯é
眮ç API éæµïŒæ¯æä»ç¯å¢åé读åéæµè§åïŒRATE_LIMIT_ENABLEDãRATE_LIMIT_DEFAULTïŒïŒæ IP å°åéæµïŒé²æ¢æ¥å£æ»¥çšã
LangGraphAgent/
âââ mcp_server/ # MCP æå¡åšïŒç¬ç«éšçœ²ïŒ
â âââ mcp_server.py # FastMCP æå¡åšæ žå¿ïŒStreamable HTTPïŒ
â âââ config.py # MCP æå¡åšé
眮
â âââ logger.py # æ¥å¿æš¡å
â âââ start.py # å¯åšèæ¬
â âââ tools/ # å·¥å
·æä»¶ç®åœ
â âââ registry.py # å·¥å
·æ³šå衚
â âââ weather_plugin.py # å€©æ°æ¥è¯¢
â âââ weather_recommend_plugin.py # å€©æ°æšè
â âââ submit_form_plugin.py # 衚åæäº€
â âââ dingtalk/ # ééå·¥å
·
â âââ dingtalk_client.py # éé API 客æ·ç«¯
â âââ dingtalk_schedule_create_plugin.py
â âââ dingtalk_schedule_query_plugin.py
â âââ dingtalk_schedule_delete_plugin.py
â âââ dingtalk_todo_plugin.py
â
âââ server/ # Python å端æå¡
â âââ app.py # Flask äž»åºçšå
¥å£
â âââ db.py # åéåºç®¡ç API
â âââ DingWebHook.py # éé Stream æºåšäººå
¥å£
â âââ docker-compose.yml # Docker Compose çŒæ
â âââ requirements.txt # Python äŸèµ
â âââ config/ # é
眮æä»¶
â â âââ config.yaml # äž»é
眮
â â âââ mcp_servers.yaml # MCP æå¡åšå°åé
眮
â âââ modules/ # æ žå¿åèœæš¡å
â â âââ langgraph/ # LangGraph ç¶æåŸ
â â â âââ agent.py # äž»å
¥å£ïŒç»ä»¶åå§åãæä»¶æ³šåãåŸçŒè¯ïŒ
â â â âââ state.py # ç¶æå®ä¹
â â â âââ context_builder.py # äžäžææå»ºåšïŒRAG ææ¡£/对è¯åå² â promptïŒ
â â â âââ config_aware_executor.py # ConfigAwareAgentExecutorïŒä¿®å€ config äŒ éïŒ
â â â âââ nodes/ # å眮èç¹ïŒfeeling, intent, stepsïŒ
â â â âââ multi_agent/ # å€ Agent åäœæš¡å
â â â âââ graph.py # äž»åŸæå»ºåš
â â â âââ states.py # MultiAgentStateïŒèªå®ä¹ reducerïŒ
â â â âââ thinking_streamer.py # ç»äžæµåŒæèç»ä»¶
â â â âââ manifest.py # PLUGIN.yaml è§£æåš + æ°æ®ç±»
â â â âââ plugin_base.py # ExpertPlugin æœè±¡åºç±»
â â â âââ plugin_registry.py # PluginRegistry æä»¶æ³šå衚
â â â âââ meta.py # ExpertMeta æ°æ®ç±»
â â â âââ helpers.py # æä»¶å
Œ
±å·¥å
·åœæ°
â â â âââ expert_agent_factory.py # é¢åäžç²Ÿ Agent å·¥åïŒå·¥å
·é犻ïŒ
â â â âââ nodes/ # Supervisor + Merge èç¹
â â â âââ planner/ # ä»»å¡è§åæš¡å
â â â â âââ decompose.py # åè§£èç¹ïŒçº¯çŒæè
ïŒ
â â â â âââ dispatch.py # 波次è°åºŠèç¹ïŒSend API å¹¶è¡ïŒ
â â â â âââ executable_intent_decomposer.py # 坿§è¡æåŸåè§£åšïŒè§åæ å°ïŒ
â â â â âââ complex_plan_decomposer.py # 倿æåŸåè§£åšïŒLLMïŒ
â â â â âââ models.py # Pydantic ç»æåèŸåºæš¡åïŒåšæçæïŒ
â â â â âââ prompts.py # åè§£ Prompt æš¡æ¿
â â â âââ tools/ # Expert å·¥å
·éé
åš
â â â â âââ mcp_tools.py # MCP å·¥å
·åšæéé
â â â â âââ rag_tools.py # RAG å·¥å
·å°è£
â â â â âââ skill_tools.py # Skill å·¥å
·åšæéé
â â â âââ plugins/ # äžå¡æä»¶
â â â âââ mcp_plugin/ # MCP æä»¶ïŒPLUGIN.yaml + plugin.pyïŒ
â â â âââ rag_plugin/ # RAG æä»¶
â â â âââ skill_plugin/ # Skill æä»¶
â â â âââ chat_plugin/ # Chat æä»¶
â â âââ executors/ # æåŸæ§è¡åšïŒBase â MCP/RAG/SkillïŒ
â â âââ mcp/ # MCP 客æ·ç«¯ïŒè¿æ¥è¿çš MCP æå¡åšïŒ
â â â âââ client.py # MCPToolServiceïŒå·¥å
·è·å/çŒå/é蜜ïŒ
â â â âââ config_manager.py # mcp_servers.yaml é
眮管ç
â â âââ feeling/ # æ
绪æç¥æš¡å
â â âââ checkpoint/ # æ£æ¥ç¹ååšïŒMemory / RedisïŒ
â â âââ intent/ # æåŸè¯å«æš¡å
â â âââ rag/ # RAG æš¡å
â â â âââ rag.py # RAG äžå¡å
¥å£
â â â âââ indexer/ # 玢åŒåšïŒChroma / MilvusïŒ
â â â âââ retriever/ # æ£çŽ¢åšïŒSimple / Reranking / FilteredïŒ
â â â âââ generator/ # çæåšïŒStuff / MapReduce / RefineïŒ
â â â âââ router/ # è·¯ç±åšïŒSimple / LLM æºèœéæ©ç¥è¯åºïŒ
â â âââ skill/ # æèœç³»ç»
â â â âââ loader.py # æèœå 蜜åšïŒè§£æ SKILL.mdïŒ
â â â âââ indexer.py # æèœåé玢åŒåšïŒå€çš ChromaIndexerïŒ
â â â âââ matcher.py # æèœå¹é
åšïŒè¯ä¹ + å
³é®è¯å
åºïŒ
â â â âââ executor.py # æèœæ§è¡åš
â â â âââ manager.py # æèœç®¡çåš
â â â âââ tools/ # æèœå·¥å
·ïŒlist/instructions/run_script/save_fileïŒ
â â âââ document_loaders/ # ææ¡£å 蜜åšå·¥åïŒPDF/Word/Excel/TXTïŒ
â â âââ rate_limit/ # API éæµïŒFlask-LimiterïŒ
â â âââ sse/ # SSE æµåŒååº
â â â âââ events.py # AG-UI äºä»¶ç±»åå®ä¹
â â â âââ processor.py # SSE äºä»¶å€çåšïŒçç¥æ å°ïŒ
â â â âââ formatter.py # SSE æ ŒåŒåèŸåº
â â âââ ai_client.py # LLM 客æ·ç«¯ïŒLangChain ChatOpenAI + DashScope EmbeddingsïŒ
â â âââ assistant.py # LangChain Agent å°è£
â â âââ context.py # AgentContext ç»äžäžäžæ
â â âââ factory.py # ç³»ç»ç»ä»¶åå§åå·¥å
â â âââ tools.py # å·¥å
·ç®¡çåšïŒMCP + Skill ç»äžç®¡çïŒ
â â âââ logger.py # ç»äžæ¥å¿æš¡å
â âââ skills/ # æèœå®ä¹ç®åœ
â â âââ {skill}/
â â âââ SKILL.md # æèœæè¿°æä»¶
â âââ api/ # REST API
â âââ tests/ # æµè¯
â
âââ client/ # React å端
âââ src/
â âââ components/
â â âââ chat/ # 对è¯ç»ä»¶ïŒChatArea, Header, InputAreaïŒ
â â âââ config/ # é
çœ®é¢æ¿ïŒMCP, Skill, Database, SidebarïŒ
â â âââ vectorDbManagerComponents/ # ç¥è¯åºç®¡çç»ä»¶
â âââ preview/ # æä»¶é¢è§ç»ä»¶
â â âââ previews/ # Excel / PDF / Word / Text é¢è§
â â âââ utils/ # excelConverter, wordConverter
â âââ stores/ # ç¶æç®¡çïŒZustandïŒ
â âââ api/ # API æ¥å£å°è£
â âââ hooks/ # èªå®ä¹ Hooks
â âââ constants/ # åžžéå®ä¹
âââ package.json
âââ vite.config.js
âââ Dockerfile
âââ nginx.conf
Docker Compose çŒæ 6 䞪æå¡ïŒ
ââââââââââââ ââââââââââââ ââââââââââââ
â Gateway â â Client â â Consul â
â (Nginx) â â (React) â â (泚åäžå¿) â
ââââââ¬ââââââ ââââââââââââ ââââââ¬ââââââ
â â
ââââââŒââââââ ââââââââââââ âââââŒâââââââ
â App â â MCP â â Redis â
â (Flask) â â (FastMCP)â â (çŒå) â
ââââââ¬ââââââ ââââââââââââ ââââââââââââ
â
ââââââŒââââââ
â DB â
â (åéåº) â
ââââââââââââ
- MCP æ¶æè¿ç§» + å·¥å ·ç¬ç«éšçœ²ïŒStreamable HTTPïŒ
- æš¡åå RAG æ¡æ¶ïŒå¯ææçŽ¢åŒåš/æ£çŽ¢åš/çæåšïŒ
- LangGraph æ¶æè¿ç§» + ç¶ææä¹ 忣æ¥ç¹
- æåŸè¯å«ç³»ç»ïŒå屿Œæè·¯ç± + 倿åŸè¯å«ïŒ
- å€ Agent åäœïŒSupervisor + Expert + Planner çŒæïŒ
- Planner åè§£ + 波次è°åºŠïŒOrchestrator-Worker æš¡åŒïŒ
- æä»¶åæ¶æïŒExpertPlugin + PluginRegistry + Manifest 驱åšïŒ
- ç»äžæµåŒæèç»ä»¶ïŒThinkingStreamerïŒäžå¡å±é¶æç¥ writerïŒ
- æèœç³»ç»ïŒSKILL.md å¹é + åéè¯ä¹çŽ¢åŒïŒ
- éééæïŒæºåšäºº Stream + 纵暪 SDK è¡šæ Œé¢è§ + ä»é¢çŒèŸåšæåé¢è§ + MCP å·¥å ·ïŒ
- æ 绪æç¥
- Docker 容åšåéšçœ² + Consul æå¡æ³šå
- å¯è§åé 眮äžå¿ + æä»¶é¢è§ïŒWord/Excel/PDFïŒ
- ç»äžæ¥å¿æš¡å + éæµæš¡å + SSE æµåŒååºïŒAG-UI åè®®ïŒ
- æ°æ®åºæ¿ä»£ JSON ååš
- API å®å šéªè¯
- L2 åéè¯ä¹å¹é å®ç°
- æŽå€æèœæ¯æ
- Merge æ¶Šè²äŒåïŒå段涊è²åå°èæ¶ïŒ
项ç®å®æŽæ¯æ Docker Compose äžé®éšçœ²ïŒçŒæ 7 䞪æå¡ïŒ
cd server
docker-compose up -d| æå¡ | éå | ç«¯å£ | 诎æ |
|---|---|---|---|
| gateway | nginx:alpine | 80 / 443 | åå代ççœå ³ |
| client | èªå»º (React) | 15174â80 | å端çé¢ |
| app | èªå»º (Flask) | 18000â5000 | äž»åºçšïŒLangGraph AgentïŒ |
| mcp | èªå»º (FastMCP) | 8888â8080 | MCP å·¥å ·æå¡åš |
| db | èªå»º (Flask) | 15001â5001 | åéåºç®¡ç API |
| redis | redis:7-alpine | 16379â6379 | çŒå + Checkpoint æä¹ å |
| consul | consul:1.15 | 18500â8500 | æå¡æ³šåäžåç° |
æå¡äŸèµå ³ç³»ïŒconsulïŒå¥åº·æ£æ¥ïŒâ redisïŒå¥åº·æ£æ¥ïŒâ mcp â app / db â client â gateway
æ°æ®æä¹ åïŒRedis æ°æ®å Consul æ°æ®éè¿ Docker Volume æä¹ åïŒChromaDB åéåºåç¥è¯åºæä»¶éè¿ Bind Mount æèœœã
ç¯å¢åéé
眮ïŒéè¿ server/.env æä»¶é
眮 API Keyãæš¡åãééåè¯çïŒdocker-compose.yml äžåŒçš ${VAR:-default} æ ŒåŒïŒæªè®Ÿçœ®æ¶äœ¿çšé»è®€åŒã



