%% 3.4 CAD 工具呼叫流程
%% 當 classify_intent 判斷為 cad_tool 時,LangGraph 透過 MCP Client
%% 呼叫 CAD Tools MCP Server(Port 8100),於 CAD 環境中執行指定操作並取得結果
flowchart TD
A(["classify_intent\n判斷意圖為 cad_tool"]) --> B["LangGraph\ncad_tool_node\n進入 MCP 工具呼叫路徑"]
B --> C["MCP Client\n初始化連線\nCAD Tools MCP Server :8100"]
C --> CONN{MCP Server\n連線狀態}
CONN -->|"❌ 連線失敗\n(Server 未啟動 / 逾時)"| ERR_CONN["記錄錯誤\nerror_type: connection_failed"]
CONN -->|"✅ 連線成功"| PARSE["解析操作語義\n從 user_message 提取\nsoftware / macro_name / assembly_path"]
PARSE --> TOOL_SEL{選擇 MCP 工具\n依操作類型}
TOOL_SEL -->|"包含關鍵詞:\n執行巨集 / 跑腳本 / 自動化 / 批次處理"| CMD["呼叫 cad_run_macro\n必填參數:\n• software(SW / CATIA)\n• macro_name(巨集名稱)\n• parameters(執行參數,可選)"]
TOOL_SEL -->|"包含關鍵詞:\n干涉 / 碰撞 / 間隙 / 干涉分析"| SHORT["呼叫 cad_check_interference\n必填參數:\n• software(SW / CATIA)\n• assembly_path(組件路徑)"]
TOOL_SEL -->|"同時符合\n兩種操作"| BOTH["同時呼叫\ncad_run_macro\n+ cad_check_interference"]
CMD --> SERVER["CAD Tools MCP Server\nPort 8100\n執行工具邏輯"]
SHORT --> SERVER
BOTH --> SERVER
SERVER --> RESULT{工具執行結果}
RESULT -->|"✅ 成功回傳"| DATA["MCP 工具執行結果\n• 巨集執行狀態 / 輸出日誌(run_macro)\n• 干涉清單 / 碰撞位置 / 間隙數值(check_interference)"]
RESULT -->|"⚠️ 查無結果\n(keyword 無匹配)"| EMPTY["空結果處理\n回傳『查無此指令』\n建議使用者換詞重試"]
RESULT -->|"❌ 執行錯誤\n(工具異常 / 資料庫錯誤)"| RETRY{重試次數\n≤ 3 次?}
RETRY -->|"是,重試"| SERVER
RETRY -->|"第 3 次仍失敗"| ERR_EXEC["降級處理\n記錄錯誤至 audit_log\n轉至 RAG 查詢補充"]
%% ─────────────────────────────────────────
subgraph COMBO_CHECK ["複合意圖判斷(cad_tool + rag)"]
direction TB
DATA --> IS_COMBO{原始意圖\n是否含 rag?}
IS_COMBO -->|"是,複合意圖\n需補充文件說明"| RAG_TRIGGER["觸發 RAG 流程\nrag_retrieve → rerank\n→ compress_context"]
IS_COMBO -->|"否,純 MCP 執行操作"| MERGE
RAG_TRIGGER --> MERGE
end
%% ─────────────────────────────────────────
%% 收斂合流
EMPTY --> MERGE
ERR_EXEC --> MERGE
ERR_CONN --> MERGE
MERGE(["合併輸出結果\n① MCP 結構化 CAD 資料(若有)\n② RAG 文件 Context 片段(若有)\n③ 錯誤 / 空值說明(若觸發降級)"])
MERGE --> PROMPT["組裝 Prompt\n結合對話歷史\n送入 LLM 生成自然語言回應"]
PROMPT --> LLM["LLM 推理\nQwen2.5-VL 7B\n(llama.cpp Server)"]
LLM --> SSE["SSE 串流輸出\ntoken 事件 逐字推送\nsources 事件 引用來源\ndone 事件 session_id"]
SSE --> UI([前端 ChatWindow\n顯示 CAD 執行操作結果])
LLM --> AUDIT["audit_log\n非同步寫入\n記錄 session_id / action / timestamp"]
%% ─────────────────────────────────────────
%% 樣式
classDef decision fill:#4a3000,stroke:#ffaa00,color:#fff
classDef tool fill:#1e3a5f,stroke:#4a9eff,color:#fff
classDef server fill:#1a2a3a,stroke:#66aaff,color:#fff
classDef error fill:#3a1a1a,stroke:#ff6666,color:#fff
classDef success fill:#1a3a1a,stroke:#4caf50,color:#fff
classDef llm fill:#3a1a3a,stroke:#cc88ff,color:#fff
classDef io fill:#1a3a1a,stroke:#4caf50,color:#fff
classDef audit fill:#3a1a1a,stroke:#ff8888,color:#fff
class CONN,TOOL_SEL,RESULT,RETRY,IS_COMBO decision
class CMD,SHORT,BOTH tool
class SERVER server
class ERR_CONN,ERR_EXEC,EMPTY error
class DATA success
class LLM llm
class A,UI io
class AUDIT audit
Comments...
No Comments Yet...