{"code":0,"data":{"id":529,"title":"7 个 AI 模型的全员会议：JMS CLI 功能头脑风暴","content":"## 背景\n\nJMS 是一个 Go 写的 JumpServer CLI 客户端，日常用于 SRE 运维。经过多轮迭代，已经具备了相当丰富的功能：WebSocket 终端、exec 单命令执行、SFTP 文件传输、Miller Column TUI 资产浏览器、AI Panel（通过 Claude API 在终端内提供 AI 辅助）、Web UI 同步查看、自动重连、PCap 抓包、Skill 系统、Context compaction 等。\n\n功能做得越多，越容易陷入\"下一步做什么\"的选择困难。于是决定开一场全员会议——让 7 个 AI 模型同时给建议。\n\n## 全员会议机制\n\n通过 Claude Code 的后台技能系统，同时启动 6 个模型的分析任务：\n\n```plantuml\n@startuml\n!theme plain\nskinparam backgroundColor #FEFEFE\n\nparticipant \"Claude\\n(Orchestrator)\" as C\nparticipant \"Gemini 3\" as G\nparticipant \"Codex\\n(GPT-5.2-pro)\" as X\nparticipant \"Kimi\\n(K2.5)\" as K\nparticipant \"DeepSeek\\n(V3.2)\" as D\nparticipant \"GLM-5\" as GL\nparticipant \"Qwen3-Max\" as Q\n\nC -> C : 分析 codebase\\n(Explore agent)\nC -> G : 后台分析请求\nC -> X : 后台分析请求\nC -> K : 后台分析请求\nC -> D : 后台分析请求\nC -> GL : 后台分析请求\nC -> Q : 后台分析请求\n\nnote over C : 不阻塞，继续工作\n\nG --> C : 6 个功能建议\nX --> C : 7 个功能建议\nK --> C : 8 个功能建议\nD --> C : (输出截断)\nGL --> C : 8 个功能建议\nQ --> C : 7 个功能建议\n\nC -> C : 汇总对比矩阵\n@enduml\n```\n\n每个模型收到相同的项目描述和现有功能列表，独立给出 5-8 个功能建议。Claude 作为 orchestrator 同时深度分析了代码库（通过 Explore agent 读取了所有 15 个 Go 源文件），最后汇总各方观点。\n\n## 共识矩阵\n\n| 功能 | Claude | Gemini | Codex | Kimi | DeepSeek | GLM | Qwen | 共识 |\n|------|:------:|:------:|:-----:|:----:|:--------:|:---:|:----:|:----:|\n| **批量并发执行** | - | HIGH | HIGH | HIGH | - | HIGH | yes | **5/7** |\n| **会话录制回放** | yes | - | MED | HIGH | - | MED | yes | **5/7** |\n| **命令历史/模板** | yes | - | HIGH | MED | - | MED | yes | **5/7** |\n| **端口转发隧道** | - | MED | MED | - | - | HIGH | - | **3/7** |\n| **诊断剧本/Runbook** | - | - | HIGH | HIGH | - | - | yes | **3/7** |\n| **一键排障采集包** | - | MED | HIGH | - | - | - | - | **2/7** |\n| **资产书签/收藏** | yes | - | - | HIGH | - | - | - | **2/7** |\n| **AI 日志流分析** | - | HIGH | - | - | - | - | - | **1/7** |\n| **工具热注入** | - | HIGH | - | - | - | - | - | **1/7** |\n\n三个功能获得了 5/7 的最高共识：**批量并发执行**、**会话录制**、**命令历史/模板**。\n\n## 各方独到见解\n\n### Gemini：工具热注入\n\n最有创意的建议。生产环境容器通常缺少 `tcpdump`、`htop`、`dig` 等调试工具。Gemini 提议维护一个预编译的静态链接工具包，通过 SFTP 自动上传到 `/tmp`，用完清理：\n\n> 用户只需输入 `/run tcpdump`，JMS 自动完成上传-执行-结果拉取-清理全过程。\n\n### Codex (GPT-5.2-pro)：Fleet Exec --diff\n\n对批量执行功能提出了一个杀手级子特性：`--diff` 和 `--unique` 模式。在几十台机器上执行相同命令后，只显示输出不同的主机：\n\n```bash\njms fleet exec 'web-*' -- 'cat /etc/hosts' --unique\n# 只显示输出不同于大多数主机的异常节点\n```\n\n这比逐行看输出高效得多，大规模巡检时是真正的效率倍增器。\n\n### Kimi：诊断剧本 + AI 分析\n\n提出了 YAML 格式的诊断剧本系统，关键亮点是最后一步 `ai_analyze: true`，将采集到的所有信息发送给 AI Panel 分析：\n\n```yaml\n# ~/.jms/playbooks/k8s-pod-crash.yaml\nname: K8s Pod Crash 诊断\nsteps:\n  - name: 获取异常 Pod\n    cmd: kubectl get pods -n {{namespace}} | grep -v Running\n    capture: failed_pods\n  - name: 查看 Pod 日志\n    cmd: kubectl logs -n {{namespace}} {{failed_pods.0}} --previous\n  - name: 查看事件\n    cmd: kubectl get events -n {{namespace}} --sort-by=.lastTimestamp | tail -20\n  - ai_analyze: true\n```\n\n这与 JMS 已有的 AI Panel 和 Skill 系统完美结合。\n\n### GLM：简洁实用\n\n用一个表格交付了 8 个功能建议，没有多余的话。建议了端口转发功能 `jms forward <asset> <remotePort> [localPort]`，这确实是 SRE 通过跳板机访问内网服务时最痛的点之一。\n\n### Qwen：自动生成 Plan\n\n最有趣的行为差异——Qwen 没有直接回答问题，而是读取了项目的 plan skill，然后自动生成了一个 `plan/plan-2026-02-26-jms-enhancement-features.md` 文件。虽然内容不如直接回答详细，但这种\"按框架办事\"的行为挺有意思。\n\n### DeepSeek：沉默的读者\n\n读了所有 Go 源文件，写了一句\"我来分析 JMS 项目的代码架构\"，然后……就没了。可能是 OpenRouter 限制或超时。全场最短输出。\n\n## 最终优先级排序\n\n综合各方意见，按投入产出比排序：\n\n### Tier 1 — 立刻做\n\n| 功能 | 理由 | 工作量 |\n|------|------|--------|\n| 批量并发执行 | 6/7 推荐，现有 exec 基础上加并发调度 | 中 |\n| 资产书签 | 极低成本，高频使用 | 小 |\n| AI Panel 命令历史 | 5 分钟实现 | 极小 |\n\n### Tier 2 — 解决真实痛点\n\n| 功能 | 理由 | 工作量 |\n|------|------|--------|\n| 会话录制 | 故障复盘 + 审计，已有 termBuf 基础 | 中 |\n| Support Bundle | 标准化采集 → 下载 → AI 分析闭环 | 中 |\n| 诊断剧本 | 与 Skill 系统互补 | 中 |\n\n### Tier 3 — 长期价值\n\n| 功能 | 理由 | 工作量 |\n|------|------|--------|\n| 批量 Diff | 配置漂移检测的轻量版 | 小 |\n| 命令模板 | 避免重复输入长命令 | 小 |\n\n## 会后立刻落地：AI Panel 命令历史\n\n既然 Tier 1 里有个\"极小\"工作量的，当场就做了。改动只涉及 `panel.go`：\n\n1. 新增 3 个字段：`inputHistory []string`、`historyIdx int`、`inputDraft []rune`\n2. Enter 提交时将查询存入 history（最多 100 条，最新在前）\n3. Arrow Up/Down 从滚动改为历史导航\n4. Ctrl+J/K 保留为滚动\n\n核心逻辑：\n\n```go\ncase 'A': // Up — history older\n    if len(p.inputHistory) > 0 && p.historyIdx < len(p.inputHistory)-1 {\n        if p.historyIdx == -1 {\n            p.inputDraft = make([]rune, len(p.inputBuf))\n            copy(p.inputDraft, p.inputBuf)\n        }\n        p.historyIdx++\n        p.inputBuf = []rune(p.inputHistory[p.historyIdx])\n    }\ncase 'B': // Down — history newer\n    if p.historyIdx >= 0 {\n        p.historyIdx--\n        if p.historyIdx == -1 {\n            p.inputBuf = p.inputDraft\n            p.inputDraft = nil\n        } else {\n            p.inputBuf = []rune(p.inputHistory[p.historyIdx])\n        }\n    }\n```\n\n按 Up 进入历史时，先把当前输入保存为 draft；按 Down 回到最新时恢复 draft。和 bash shell 的行为一致。\n\n## 总结\n\n多模型全员会议的价值不在于\"谁更对\"，而在于：\n- **覆盖盲区**：每个模型都提出了其他模型没想到的点\n- **共识验证**：5/7 一致推荐的功能基本不会选错\n- **行为差异**：观察不同模型的\"做事方式\"本身也很有趣（Qwen 自动写 plan、DeepSeek 先读代码再说话）\n\n总耗时约 3 分钟（并行执行），成本低廉，收获的是多角度的功能路线图。值得在需要方向决策时常规使用。","acl":"public","tags":["ai","multi-model","golang","sre","jumpserver","cli"],"category_id":2,"category":{"id":2,"name":"work","description":"","color":"#25292e","created_at":"0001-01-01T00:00:00Z","updated_at":"0001-01-01T00:00:00Z"},"author":{"id":1,"username":"kiyor","email":"cai@kiyor.com"},"enable_variables":false,"created_at":"2026-02-27T08:40:26.269+08:00","updated_at":"2026-02-27T08:40:26.269+08:00"}}
