Files
AgentsMeeting/gateway/scripts/specs/chat_bridge.json
T

81 lines
5.2 KiB
JSON
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.
{
"module": "chat_bridge",
"version": "2.0",
"purpose": "Chat Bridge — 直接 HTTP API 调用 OpenCode serve session,带模型 fallback + session 持久化。消息双写到 bridge_context.jsonl(即时上下文注入)和 opencode.dbsession_search 可回溯)。上下文窗口上限 200 条,超出用 session_search。支持 TUI 活跃 session 追踪。",
"ui_location": "无直接 UI — 被 xmpp_bot.py 调用",
"human_help": {
"title": "Chat Bridge — Session 桥接",
"description": [
"chat_bridge.py 是 XMPP 消息和 OpenCode serve session 之间的桥梁。它把群聊/私聊消息发送到 OpenCode API,获取 AI 回复,支持多模型 fallback。",
"消息双写:① bridge_context.jsonl — 立即注入到下次 API 调用的上下文 ② opencode.db — 持久化存储,session_search 可回溯。",
"TUI 追踪:当 xxm 在 TUI 中与用户对话,mark_active_tui_session() 记录活跃 session ID。bot 处理群消息时会注入 TUI 上下文,让 LLM 知道用户在 TUI 讨论了什么。",
"模型 fallback:主模型(deepseek-v4-pro)→ 超时/失败 → fallback 模型。失败不丢消息,降级处理。"
],
"usage": [
"1. 创建实例: bridge = SessionBridge(session_id='ses_xxm_xmpp')",
"2. 发送消息: bridge.chat(message, source='xmpp', sender='hmo') → AI 回复文本",
"3. TUI 追踪: mark_active_tui_session('ses_xxx') → bot 自动注入 TUI 上下文",
"4. 上下文注入: bridge 自动读取最近 200 条 session 消息 + TUI 活跃 session 内容",
"5. 日志: gateway/logs/bridge.log"
],
"troubleshooting": [
"如果 API 调用超时: 检查 OpenCode serve 是否在线 (localhost:4096),模型 API 是否可用",
"如果回复乱码: 检查上下文注入是否过长(上限200条),model fallback 是否降级到较差模型",
"如果 TUI 上下文不生效: 检查 _.active_tui_session.json 是否存在且未过期(1小时)"
]
},
"ai_spec": {
"apis": [
{"method": "POST", "path": "OpenCode API /v1/chat/completions", "returns": "AI 回复文本", "note": "直接 HTTP 调用 OpenCode serve — 非 OpenAI 兼容格式"},
{"method": "POST", "path": "OpenCode API fallback model", "returns": "AI 回复文本", "note": "主模型超时/失败后降级到备用模型"}
],
"dependencies": [
"OpenCode serve session (localhost:4096) — API 后端",
"opencode.db (SQLite) — session 持久化存储(~/.local/share/opencode/opencode.db",
"session_router.py — extract_session_context() + 命令协议",
"requests — HTTP 库(已经设了 no_proxy='*'",
"Model API — deepseek-v4-pro (主) + fallback model"
],
"architecture": {
"flow": "XMPP消息 → SessionBridge.chat() → ① 读取最近200条 context (SQLite) → ② 注入 TUI 活跃 session 内容 → ③ 构建 prompt → ④ POST OpenCode API → ⑤ 解析回复 → ⑥ 双写 (bridge_context.jsonl + opencode.db) → 返回文本",
"dual_write": "每条消息同时写入 bridge_context.jsonl 和 opencode.db — 前者即时上下文,后者持久可回溯",
"tui_tracking": "mark_active_tui_session() 写 JSON 文件 → get_active_tui_session() 读取 → 1h 自动过期",
"fallback": "主模型超时/失败 → 切换到 fallback 模型 — 不丢消息"
},
"constraints": [
"上下文窗口硬上限 200 条 — 防止 prompt 过长",
"TUI session 1h 自动过期 — 匹配 Hermes state_meta 模式",
"no_proxy='*' — 确保本地 API 调用不走代理",
"双写操作需要文件系统写入权限 — temp/ 和 opencode.db"
],
"must_not": [
"不要在 API 调用失败时返回空 — 至少返回错误描述",
"不要超过 200 条上下文 — 可能导致 prompt 截断",
"不要修改 opencode.db 的表结构 — 只读/只插入,不 DDL"
],
"related_modules": [
{"module": "xmpp_bot", "relation": "xmpp_bot 通过 SessionBridge 发送消息到 OpenCode API — chat_bridge 是 xmpp_bot 的 LLM 调用层"},
{"module": "session_router", "relation": "session_router 包装 SessionBridge,增加命令路由 + 多 channel 支持"}
],
"tests": [
{"id": "CB01", "name": "chat() 返回非空字符串", "endpoint": "bridge.chat('hello') → str"},
{"id": "CB02", "name": "TUI session 1h 过期", "endpoint": "设 timestamp 2h 前 → get_active_tui_session() 返回 None"},
{"id": "CB03", "name": "消息双写成功", "endpoint": "chat() 后检查 bridge_context.jsonl 和 opencode.db 都有新记录"}
],
"known_issues": [
"API 调用是同步阻塞的 — 不适用于高并发场景(但 XMPP 消息量小,问题不大)",
"双写数据可能不一致 — 如果仅一个写入成功(极少发生)"
],
"related_files": [
"gateway/scripts/chat_bridge.py — 本文件 (754行)",
"gateway/scripts/session_router.py — extract_session_context()",
"gateway/temp/bridge_context.jsonl — 即时上下文文件",
"~/.local/share/opencode/opencode.db — Session 持久化 DB",
"gateway/temp/.active_tui_session.json — TUI session 追踪文件",
"gateway/logs/bridge.log — 桥接日志"
]
}
}