阶段十四:OmniRoute 官方能力接入与搜索试点
阶段状态:进行中
计划状态:已完成
当前工作包:P14-1 OmniRoute 搜索 MCP 双监听接入与三工具验收
📌 结论摘要
P14 已从占位阶段进入实施阶段,搜索试点主链路已经可用。 102 同时监听 Tailnet 与局域网,101 默认使用 100.64.0.4:39200 接入 OmniRoute 官方 MCP;本地 local_search_registry 与 Omni omniroute_search_101 当前同时启用,Omni 客户端只暴露 omniroute_web_search、omniroute_web_fetch、omniroute_tool_search 三个工具。omniroute_x_search 已从 Codex 客户端移除,xAI 上游模型也已关闭,因此不再是待修复项。依据是 /root/.codex/config.toml、codex mcp list、本地与 Omni 各 5 项真实查询以及独立通道复核;影响是日常搜索可以继续本地优先,本地失败后再显式回退 Omni,当前无需修改 OmniRoute 包、数据库或 Provider 配置。
🧾 计划状态
| 项目 | 当前值 | 依据 |
|---|---|---|
| 当前阶段 | P14 | docs/plans/state.json |
| 阶段状态 | 进行中 | 用户已授权并完成首轮实施 |
| 计划状态 | 已完成 | 工作包、边界、验收与回退已冻结 |
| 当前工作包 | P14-1 OmniRoute 搜索 MCP 双监听接入与三工具验收 |
双监听、专用 Key、三工具客户端裁剪和双通道真实测试已执行 |
| 上一阶段 | P13 已完成并归档 | P13 完成归档 |
| 生产权威 | 102 官方 omniroute@3.8.51 |
未升级、未改源码、未替换官方包 |
P14 的边界不是“继续做 P13 未完成事项”,而是把官方 OmniRoute 能力安全地暴露给 101 Codex。当前只启用搜索第一阶段,不启用 Memory 自动注入、压缩自动接管、媒体生成自动路由或全局 MCP_TOOL_ALLOW。
🧱 技术栈与架构选型
| 方案 | 优点 | 缺点 | 决策 |
|---|---|---|---|
| 102 双监听 + 101 Tailnet 默认接入 | 保留局域网低延迟,Tailnet 可作为节点回退;不新增中间代理 | 需要按接口分别维护来源 guard | 采用 |
| 只保留 Tailnet 单监听 | 配置最少 | 本机局域网链路无法直接验证,地址变化时路径单一 | 不采用 |
| 用 101 本地反向代理做双 URL 自动切换 | 表面上自动容灾 | 新增自建常驻层,扩大故障面和恢复复杂度 | 不采用 |
| 改 OmniRoute 源码或构建产物 | 可强行改变工具目录或会话行为 | 违反官方不可变包规则,升级即被覆盖 | 禁止 |
Omni 全局 MCP_TOOL_ALLOW |
服务端真正缩减 tools/list |
会影响所有同入口客户端,误伤面大 | 暂不采用 |
Codex 客户端 enabled_tools |
按节点即时裁剪、易回退 | 服务端仍下发完整清单 | 采用 |
架构继续复用 Tailscale、systemd、官方 OmniRoute、Codex MCP 客户端和现有 102 服务,不新增调度器、Runtime、网关、数据库写者或平行状态源。实施只修改宿主层 edge 脚本和 101 客户端配置,OmniRoute npm 包、数据库和服务文件未改。
🎯 目标、成果与验收契约
| 工作包 | 目标 | 当前状态 | 验收依据 |
|---|---|---|---|
| P14-0 | 确认三项决策与边界 | 已完成 | 双监听、Tailnet 默认已实施;客户端工具面最终收敛为三工具 |
| P14-1.1 | 102 增加 LAN 监听且按接口 guard | 已完成 | 192.168.50.102:39200 与 100.64.0.4:39200 同时监听 |
| P14-1.2 | 101 使用专用最小范围 Key 接入 | 已完成 | agentmeshos-search-mcp-101-20261001 与 0600 凭据文件 |
| P14-1.3 | 只向模型暴露三个搜索工具 | 已完成 | enabled_tools 仅保留 web_search、web_fetch、tool_search;x_search 已移除 |
| P14-1.4 | 真实测试三个工具与两条搜索通道 | 已完成 | 本地与 Omni 各 5 项查询通过;web_fetch、tool_search 和当前独立复核通过 |
| P14-1.5 | 排除功能重叠的旧 MCP | 已完成 | omniroute_full_boundary.enabled=false |
验收规则固定为:搜索默认先调用本机 local_search_registry;本地报错、超时或无有效结果时,回退 omniroute_web_search 并显式选择 Provider。auto 不作为稳定默认,避免再次命中不稳定 Provider。
🧩 分布式底座接入声明
接入结论:P14-1 接入 102 的官方 OmniRoute MCP 和 101 Codex 客户端配置,不接入 Nomad 任务面。
| 使用层 | 执行映射 | 边界 |
|---|---|---|
| Network | 101 → 100.64.0.4:39200;LAN 192.168.50.102:39200 作人工测试入口 |
102 guard 只放行授权来源,其他来源 DROP |
| Compute | 搜索执行发生在 102 OmniRoute 进程内 | 不向 Nomad 提交 Job,不改变 Runtime |
| Storage | 继续使用 102 /root/.omniroute/storage.sqlite |
未做迁移、停写、恢复或 schema 变更 |
| Observability | health、日志、systemd 和真实工具调用 | 不新增常驻观察服务 |
| Credentials | /root/.codex/credentials/omniroute-search-mcp-101.env |
0600;Key 原文不进入项目、日志或回复 |
| Lifecycle | systemd socket/guard + 101 Codex 配置 | 失败可由脚本 rollback 恢复入口,客户端配置有备份 |
101 默认地址已从公网旧入口切换为 Tailnet 私有入口,旧 omniroute_full_boundary 保留但停用,作为明确回退材料,不并行下发工具清单。
🧪 执行与现场证据
| 证据 | 结果 | 说明 |
|---|---|---|
| 102 版本与服务 | 官方 omniroute@3.8.51 |
未修改包内容、未重新编译 |
| 双监听 | 100.64.0.4:39200、192.168.50.102:39200 |
ss 回读均显示 systemd-socket-proxyd |
| 双入口 health | 两地址均返回 healthy |
从 101 实测 |
| 本地搜索 | 独立禁用 Omni 后,5/5 查询成功并各返回 3 条 | 第一条命中分别为 OpenAI、SearXNG、PostgreSQL、OpenAI DevDay、Tailscale 官方页面 |
| Omni 回退 | 独立禁用本地后,serper-search 5/5 查询成功并各返回 3 条 |
首条与本地一致;单次约 1.6–2.0 秒、0.001 USD,带发布时间和 Provider 元数据 |
| 当前复核 | 本地 search_web 与 Omni omniroute_web_search(provider=serper-search) 均返回 https://openai.com/ |
Omni 本次 response_time_ms=2756、search_cost_usd=0.001;证明接口改动后两条通道仍可用 |
| 抓取 | firecrawl 成功返回 OpenAI 页面 Markdown |
omniroute_web_fetch 通过 |
| 工具发现 | omniroute_tool_search("search") 返回 8 个工具 |
MCP 工具搜索可用 |
| X 搜索 | omniroute_x_search 已从 Codex 客户端移除,Omni 控制台中的对应模型已关闭 |
不再把它列为阻塞项,也不以源码补丁绕过上游授权 |
| 客户端裁剪 | 三个工具可调用,omniroute_get_health 不可见 |
证明 enabled_tools 生效 |
102 edge 脚本仓库版本为 v0.2.0,SHA-256 为 22b280165773d371e0548ae52c01a266d24aefa2c23f64c392c0b60316400fe2。部署前备份位于 102 /root/.omniroute-edge-backups/agentmeshos-omniroute-edge.sh.20261001T040425Z.pre-v0.2.0。
🔁 回退方案
| 变更 | 回退方式 | 回退点 |
|---|---|---|
| 102 双监听与 guard | 将 edge 脚本恢复到 v0.1.2 并执行 rollback,再重新 apply |
102 /root/.omniroute-edge-backups/ |
| 101 搜索 MCP | 恢复 config.toml 备份并重启或重新加载 Codex MCP |
/root/.codex/config.toml.bak.20261001T035946Z.omniroute-search-mcp-101 |
| 旧全量 MCP | 可显式重新启用旧条目 | 当前仅停用,未删除 |
| 专用 Key | 通过官方 OmniRoute 控制台撤销或停用 | Key ID bb05f5ac-3458-495d-8fff-66d66de0b63e |
回退不得修改 OmniRoute 包内容、数据库 schema 或其他节点服务。生产权威和唯一 SQLite 写者仍是 102。
⚠️ 风险与未决项
| 事项 | 当前事实 | 下一步 |
|---|---|---|
| 本地优先与 Omni 回退 | 两套入口当前同时启用,实测均可独立完成搜索 | 保留“本地优先、Omni 显式 Provider 兜底”,不增加本机代理或自动切换层 |
xquik-search |
官方实现存在,但当前没有配置凭据 | 非当前必经路径;除非明确启用 xquik,否则不处理 |
| SearXNG 瞬时超时 | 首次 MCP 查询返回 0,日志显示部分引擎 timeout/429,随后重试成功 | 保留本地优先和 Omni 显式 Provider 回退,不把单次失败升级为架构改造 |
| 桌面会话缓存 | 当前运行中的旧任务可能仍持有旧 MCP 清单 | 新任务已回读三工具清单;旧任务不强制重启,后续新任务生效 |
| MCP 审计页时区 | 102 宿主为 Asia/Shanghai;官方 3.8.51 将 UTC created_at 原样返回,前端把不带时区的值按本地时间显示,因此页面仍显示 UTC 数值 |
页面值按 UTC 读取,或等待官方上游修复;不修改官方前端、包文件、数据库结构,也不以浏览器/VNC 时区作为该问题的修复路径 |
当前 P14-1 不要求再修改 OmniRoute 包、数据库或 102 服务。若后续要扩展其他 MCP 能力,应另立工作包并按实际需求分类裁剪。