diff --git a/docs/gns3-copilot/implemented/ai-assistant-overview.md b/docs/gns3-copilot/implemented/ai-assistant-overview.md deleted file mode 100644 index cbb30d781..000000000 --- a/docs/gns3-copilot/implemented/ai-assistant-overview.md +++ /dev/null @@ -1,161 +0,0 @@ - - -# GNS3-Copilot AI 助手概览 - -## 整体架构 - -```mermaid -flowchart TB - subgraph "客户端" - A["Web UI"] --> B["SSE 流式响应"] - end - - subgraph "FastAPI 路由层" - B --> C["POST /chat/stream\nPOST /chat/inject"] - C --> D["认证 + LLM配置加载\n设置ContextVars"] - end - - subgraph "AgentService(项目级)" - D --> E["LangGraph Agent\nStateGraph"] - E --> F["SQLite Checkpointer\ncopilot_checkpoints.db"] - end - - subgraph "LangGraph 工作流" - E --> G["llm_call 节点\n模型调用"] - E --> H["tool_node\n工具执行"] - E --> I["title_generator_node\n自动生成标题"] - E --> J["abort_handler_node\n终止处理"] - end - - subgraph "三种 Copilot 模式" - G --> K["teaching_assistant\n诊断只读"] - G --> L["lab_automation_assistant\n完全控制"] - G --> M["troubleshooting_injection\n故障注入"] - end - - subgraph "LLM 配置系统" - D --> N["用户自有配置\n用户组配置继承\nAPI密钥加密存储"] - end -``` - -## API 端点 - -| 端点 | 功能 | -|---|---| -| `POST /v3/projects/{pid}/chat/stream` | 流式对话(SSE),支持三种 copilot 模式 | -| `POST /v3/projects/{pid}/chat/inject` | 故障注入入口,自动切换为 `troubleshooting_injection` 模式 | -| `GET /v3/projects/{pid}/chat/sessions` | 列出会话(支持过滤、分页) | -| `DELETE /v3/projects/{pid}/chat/sessions/{sid}` | 删除会话 | -| `PATCH /v3/projects/{pid}/chat/sessions/{sid}` | 更新会话(重命名、置顶) | -| `POST /v3/projects/{pid}/chat/sessions/{sid}/abort` | 终止正在进行的会话 | - -## LangGraph Agent 工作流 - -```mermaid -sequenceDiagram - participant U as User - participant API as FastAPI - participant AS as AgentService - participant LLM as LLM Node - participant Tool as Tool Node - participant TGen as Title Node - - U->>API: 发送消息 - API->>AS: stream_chat() - AS->>AS: 设置ContextVars
(jwt_token, llm_config) - - Note over AS,LLM: llm_call 节点 - AS->>LLM: invoke预编译模型 - LLM->>LLM: pre_model_hook
注入拓扑+裁剪上下文 - LLM-->>AS: AI回复(含可能tool_calls) - - alt 有工具调用 - AS->>Tool: 执行工具 - Tool-->>AS: 工具结果 - AS->>LLM: 继续LLM调用 - end - - opt 第一轮且无标题 - AS->>TGen: 自动生成标题 - TGen-->>AS: 会话标题 - end - - AS-->>API: SSE流式返回 - API-->>U: 流式输出 -``` - -## 三种 Copilot 模式 - -### 模式对照 - -| 模式 | 工具范围 | 适用场景 | -|---|---|---| -| `teaching_assistant`(默认) | 诊断只读 + 数据包分析 + 节点管理 | 教学演示、故障排查指导 | -| `lab_automation_assistant` | 全部工具(含配置变更) | 实验自动化、设备配置 | -| `troubleshooting_injection` | 故障注入工具集 | 排错练习、故障模拟 | - -### 工具绑定明细 - -| 工具 | teaching_assistant | lab_automation_assistant | troubleshooting_injection | -|---|---|---|---| -| `GNS3TemplateTool` 获取模板 | ✓ | ✓ | | -| `GNS3CreateNodeTool` 创建节点 | ✓ | ✓ | | -| `GNS3LinkTool` 创建链路 | ✓ | ✓ | | -| `GNS3StartNodeTool` 启动节点 | ✓ | ✓ | | -| `GNS3UpdateNodeNameTool` 更新名称 | ✓ | ✓ | | -| `GNS3StopNodeTool` 停止节点 | | ✓ | | -| `GNS3SuspendNodeTool` 挂起节点 | | ✓ | | -| `ExecuteMultipleDeviceCommands` 只读命令 | ✓ | ✓ | ✓ | -| `ExecuteMultipleDeviceConfigCommands` 配置命令 | | ✓ | ✓ | -| `VPCSCommands` VPCS命令 | | ✓ | | -| `PacketAnalysisTool` 实时抓包分析 | ✓ | ✓ | | -| `PacketAnalysisSkillsTool` 协议知识查询 | ✓ | ✓ | | -| `DeviceSkillsTool` 设备技能查询 | ✓ | ✓ | | -| `GNS3PacketFilterTool` 链路滤波器 | | | ✓ | -| `InjectionSkillsTool` 故障注入技能 | | | ✓ | -| `GNS3TopologyTool` 拓扑信息 | | | ✓ | - -模式通过 `llm_call` 节点中的 `copilot_mode` 选择对应工具列表,调用 `create_base_model_with_tools(mode_tools, llm_config)` 将工具绑定到 LLM 模型实例。 - -## 上下文窗口管理 - -```mermaid -flowchart LR - A["LLM调用触发"] --> B["pre_model_hook"] - B --> C["注入拓扑信息\n到System Prompt"] - B --> D["估算工具定义\ntoken消耗"] - B --> E["trim_messages\n按策略裁剪"] - E --> F["conservative 60%\nbalanced 75%\naggressive 85%"] - F --> G["调用LLM"] -``` - -- 使用 tiktoken(`cl100k_base`)精确计数 -- 三层裁剪策略:conservative / balanced / aggressive -- 自动注入 `{{topology_info}}` 到 System Prompt - -## 会话管理 - -- 每个项目独立的 SQLite 数据库(`gns3-copilot/copilot_checkpoints.db`) -- 支持置顶、重命名、删除、历史查询 -- 自动记录 token 用量、消息数、LLM 调用次数 - -## LLM 配置系统 - -| 特性 | 说明 | -|---|---| -| 用户级配置 | 每个用户可独立配置 provider / model / api_key | -| 用户组继承 | 用户未配置时自动继承所属组配置 | -| API 密钥加密 | 数据库存储时自动加密 | -| 乐观锁 | version 字段防止并发修改冲突 | - -## 关键设计要点 - -1. **项目级隔离** — 每个 GNS3 项目拥有独立的 Agent 实例和 SQLite 存储 -2. **ContextVars 安全传递** — JWT token、API key 仅存于内存,随请求结束自动清除 -3. **LangGraph StateGraph** — 自定义节点 + 条件边,支持 ReAct 循环和递归限制 -4. **流式 SSE** — 实时推送 content / tool_call / tool_start / tool_end / error / done 事件 -5. **热重载** — System Prompt、Skills、Protocols 均支持运行时重载 -6. **模式化工具集** — 三种 copilot 模式绑定不同工具组合,按场景安全隔离 diff --git a/docs/gns3-copilot/implemented/fault-injection-overview.md b/docs/gns3-copilot/implemented/fault-injection-overview.md deleted file mode 100644 index b77acc028..000000000 --- a/docs/gns3-copilot/implemented/fault-injection-overview.md +++ /dev/null @@ -1,104 +0,0 @@ - - -# GNS3-Copilot 故障注入概览 - -## 核心流程 - -```mermaid -flowchart TB - subgraph "① 接口触发与模式切换" - A["POST /chat/inject\n用户请求注入故障"] --> B["验证项目已打开"] - B --> C["设置copilot_mode =\ntroubleshooting_injection"] - C --> D["启动Agent\n携带故障注入工具集"] - end - - subgraph "② 拓扑分析与故障选型" - D --> E["GNS3TopologyTool\n获取拓扑信息"] - E --> F["ExecuteMultipleDeviceCommands\n获取设备配置"] - F --> G["InjectionSkillsTool\n查询可用故障类型"] - G --> H{"注入技能仓库\ngns3/gns3-skills"} - H --> I["返回匹配的故障定义\n含配置注入命令"] - end - - subgraph "③ 故障注入" - I --> J["选择注入方式"] - J --> K["ExecuteMultipleDeviceConfigCommands\n注入配置变更"] - J --> L["GNS3PacketFilterTool\n注入链路层故障"] - end - - subgraph "④ 结果确认" - K --> M["验证故障生效"] - L --> M - M --> N["记录故障详情\n含恢复命令"] - end -``` - -## 工具总览 - -| 工具 | 源文件 | 作用 | 可用模式 | -|---|---|---|---| -| `InjectionSkillsTool` | `registry.py`(skills 模块) | 查询协议级故障定义(配置变更命令) | troubleshooting_injection | -| `GNS3PacketFilterTool` | `gns3_packet_filter.py` | 链路层故障注入(延迟、丢包、损坏、BPF) | troubleshooting_injection | -| `ExecuteMultipleDeviceConfigCommands` | `config_tools_nornir.py` | 批量执行设备配置变更 | troubleshooting_injection | -| `ExecuteMultipleDeviceCommands` | `display_tools_nornir.py` | 读取设备配置(只读) | troubleshooting_injection | -| `GNS3TopologyTool` | `gns3_client` | 获取项目拓扑信息 | troubleshooting_injection | - -## 故障注入 API - -| 端点 | 功能 | -|---|---| -| `POST /v3/projects/{pid}/chat/inject` | 触发故障注入,设置 `troubleshooting_injection` 模式后启动 Agent | - -**前置条件**:项目必须为 `opened` 状态,否则返回 403。 - -## GNS3PacketFilterTool 链路滤波器 - -| 滤波器类型 | 功能 | 参数 | -|---|---|---| -| `delay` | 延迟 + 抖动 | `[latency(0-32767), jitter(0-32767)]` | -| `packet_loss` | 丢包率 | `[chance(0-100)]` | -| `corrupt` | 包损坏率 | `[chance(0-100)]` | -| `frequency_drop` | 每 N 包丢弃一个 | `[frequency(-1~32767)]` | -| `bpf` | Berkeley Packet Filter | 表达式文本 | - -## Agent 工作流(LangGraph) - -```mermaid -sequenceDiagram - participant U as User - participant API as POST /chat/inject - participant LLM as LLM Node - participant Topo as GNS3TopologyTool - participant DC as ExecuteMultipleDeviceCommands - participant CC as ExecuteMultipleDeviceConfigCommands - participant Skill as InjectionSkillsTool - participant Filter as GNS3PacketFilterTool - - U->>API: 注入一个OSPF故障 - API->>LLM: 设置mode=troubleshooting_injection - LLM->>Topo: 获取拓扑 - Topo-->>LLM: 拓扑信息 - LLM->>DC: 查看设备配置 - DC-->>LLM: Running配置 - LLM->>Skill: list context=["ospf"] - Skill-->>LLM: 匹配的故障类型 - LLM->>Skill: get device_type=injection_ospf - Skill-->>LLM: 故障定义+注入命令 - LLM->>CC: 执行配置注入 - CC-->>LLM: 注入结果 - LLM->>Filter: set filters={delay:[200,50]} - Filter-->>LLM: 链路延迟注入成功 - LLM-->>U: 故障已注入,含恢复命令 -``` - -## 关键设计要点 - -1. **专用 API 入口** — `POST /chat/inject` 端点专门用于故障注入,自动切换为 `troubleshooting_injection` 模式 -2. **LLM 主导故障选型** — LLM 分析拓扑后通过 `InjectionSkillsTool` 查询匹配协议栈的故障,不硬编码故障场景 -3. **双层注入** — 设备级配置变更 + 链路级网络损伤,覆盖完整排错场景 -4. **故障可逆** — 每条注入均附带恢复命令,链路滤波器可通过 `action: clear` 一键清除 -5. **安全前置** — BPF 语法通过 tshark 预验证,配置命令受 `command_filter` 限制 -6. **上下文过滤** — `InjectionSkillsTool` 强制要求传入 `context` 参数,只返回与拓扑协议匹配的故障 diff --git a/docs/gns3-copilot/implemented/packet-analysis-overview.md b/docs/gns3-copilot/implemented/packet-analysis-overview.md deleted file mode 100644 index a45f294f4..000000000 --- a/docs/gns3-copilot/implemented/packet-analysis-overview.md +++ /dev/null @@ -1,75 +0,0 @@ - - -# GNS3-Copilot 实时数据包 AI 分析架构 - -## 核心流程 - -```mermaid -flowchart TB - subgraph "① 分析触发与知识查询" - A["用户提问\n如'分析OSPF邻居状态'"] --> B["LLM调用\nPacketAnalysisSkillsTool"] - B --> C{"协议知识仓库\ngns3/gns3-skills"} - C --> D["返回协议定义\nfields/base_filter/check_rules"] - B --> E["LLM调用\nsearch_fields模式"] - E --> F["tshark -G fields\n字段名搜索"] - F --> G["返回有效字段名"] - end - - subgraph "② 实时捕获与分析" - D --> H["LLM构造tshark_args"] - G --> H - H --> I["PacketAnalysisTool\ncapture分析模式"] - I --> J["GET /capture/file\n下载实时PCAP"] - J --> K["预验证-e字段名"] - K --> L["tshark -r pcap\n执行分析"] - L --> M["返回分析结果"] - end -``` - -## 工具总览 - -| 工具 | 源文件 | 作用 | 可用模式 | -|---|---|---|---| -| `PacketAnalysisTool` | `packet_analysis_tool.py` | 下载实时 PCAP + tshark 分析 | teaching / lab_automation | -| `PacketAnalysisSkillsTool` | `registry.py`(skills 模块) | 查询协议级分析知识(字段、过滤规则) | teaching / lab_automation | - - -## Agent 工作流(LangGraph) - -```mermaid -sequenceDiagram - participant U as User - participant LLM as LLM Node - participant Skills as PacketAnalysisSkillsTool - participant Pcap as PacketAnalysisTool - - U->>LLM: OSPF邻居无法建立,分析一下 - LLM->>Skills: get protocol=ospf - Skills-->>LLM: ospf字段、filter定义 - LLM->>Pcap: search_fields query=ospf.hello - Pcap-->>LLM: 有效-e字段名 - LLM->>Pcap: 下载PCAP + tshark_args - Pcap-->>LLM: tshark输出结果 - LLM->>LLM: 分析发现Dead间隔不匹配 - LLM-->>U: OSPF Dead间隔不一致 -``` - -## 服务端 Capture API - -| 端点 | 功能 | -|---|---| -| `POST /v3/projects/{pid}/links/{lid}/capture/start` | 启动链路上的数据包捕获 | -| `POST /v3/projects/{pid}/links/{lid}/capture/stop` | 停止捕获 | -| `GET /v3/projects/{pid}/links/{lid}/capture/file` | 下载 PCAP 文件(捕获进行中也可下载) | -| `GET /v3/projects/{pid}/links/{lid}/capture/stream` | 流式传输 PCAP 数据 | -| `WS /v3/projects/{pid}/links/{lid}/capture/web-wireshark` | Web Wireshark WebSocket 代理 | - -## 关键设计要点 - -1. **LLM 主导分析** — LLM 自行构造 tshark 参数,框架不做协议硬编码,只做安全验证 -2. **实时 PCAP** — 捕获运行时即可下载分析,无需停止抓包 -3. **双重知识源** — 外部仓库提供协议预定义知识,本地 tshark field registry 提供精确字段名 -4. **安全前置** — tshark 字段名预验证,避免无效字段导致执行失败