fix: add missing hermes_gateway + omlx_server specs + all M map spec fields

This commit is contained in:
hmo
2026-07-18 13:28:50 +08:00
parent 0ac756b241
commit 7dc5cc1c74
3 changed files with 104 additions and 6 deletions
+50
View File
@@ -0,0 +1,50 @@
{
"module": "hermes_gateway",
"version": "1.0",
"purpose": "Hermes AI Gateway — 运行在 246 Linux,为每个 Hermes Agent(莫荷、知微)提供 OpenAI 兼容 API 端点。Mohe 端口 8642Zhiwei 端口 8643。",
"ui_location": "F Tab → AI网关 → Hermes网关-莫荷 / Hermes网关-知微",
"human_help": {
"title": "Hermes AI 网关",
"description": [
"这是 Hermes Agent 的 API 服务器,提供 OpenAI 兼容的 /v1/chat/completions 接口。",
"每个 Hermes Agent 对应一个独立的实例:莫荷(8642)和知微(8643)。",
"Gateway 负责接收 LLM 请求、管理 session 上下文、调用底层 AI Provider。",
"所有 Agent 间的消息路由和 AI 处理都通过 Hermes Gateway 完成。"
],
"usage": [
"状态在 F Tab 的 AI网关 层查看,健康检查通过 /v1/health 端点检测。",
"如果状态 stopped:检查 systemd 服务 hermes-gateway@mohe 或 hermes-gateway@zhiwei",
"查看日志:journalctl -u hermes-gateway@mohe -n 50 --no-pager"
],
"troubleshooting": [
"如果 Hermes 不回复消息:检查 Gateway 进程是否运行 — curl http://127.0.0.1:8642/v1/models",
"如果 session 上下文丢失:检查是否误开了 session 自动重置(正常应关闭)",
"如果 Provider 报错:检查 ~/.hermes/config.yaml 中的 provider 配置是否正确"
],
"related": "依赖 ejabberd XMPP 服务器进行 Agent 间通信;依赖 AI Provider(如 ocg-new、volcengine)进行 LLM 推理"
},
"ai_spec": {
"apis": [
{"method": "GET", "path": "/v1/models", "returns": "模型列表", "desc": "查询可用模型"},
{"method": "GET", "path": "/v1/health", "returns": "{ok, version, uptime}", "desc": "健康检查"},
{"method": "POST", "path": "/v1/chat/completions", "body": "OpenAI chat completion 格式", "returns": "OpenAI 格式响应", "desc": "LLM 推理主端点"}
],
"dependencies": [
"ejabberd 192.168.1.246:5222 — XMPP 服务器",
"AI Provider 配置 (ocg-new / volcengine)",
"~/.hermes/config.yaml — 主配置"
],
"constraints": [
"每个 Gateway 实例绑定唯一端口(8642/8643),不可共享",
"sisyphus session 永不自动重置,api_server session 可能自动重置",
"Gateway 必须通过 systemd 管理(hermes-gateway@.service 模板)"
],
"related_files": [
"~/.hermes/config.yaml — 主配置",
"deploy/linux/hermes-gateway@.service — systemd 模板",
"gateway/scripts/specs/hermes_gateway.json — 本 spec"
]
}
}
+46
View File
@@ -0,0 +1,46 @@
{
"module": "omlx_server",
"version": "1.0",
"purpose": "OMLX 推理服务 — 运行在小果(Mac 192.168.1.122:18003),提供本地 LLM 推理能力。通过 OMLX 框架加载本地模型,为 Agent 提供低延迟推理。",
"ui_location": "F Tab → AI网关 → OMLX推理服务(小果)",
"human_help": {
"title": "OMLX 本地推理服务",
"description": [
"小果(Mac Mini)上运行的本地推理服务,使用 OMLX 框架加载 GGUF 格式的本地模型。",
"提供 OpenAI 兼容接口,延迟低、无需网络、不消耗云端配额。",
"适合轻量推理、快速响应场景;复杂推理仍走云 Provider。"
],
"usage": [
"状态在 F Tab 的 AI网关 层查看(小果的远程服务标记为 remote)",
"Dashboard 运行在 246 Linux,无法直接检测 Mac 端口 → 通过 ejabberd 在线状态推断"
],
"troubleshooting": [
"如果 OMLX 服务不可达:检查小果的 omlx_server 进程是否运行",
"如果 Mac 离线:检查 EasyTier VPN 是否连通",
"日志在小果本地:~/omlx/server.log"
],
"related": "依赖 EasyTier VPN 连通 246 ↔ Mac;依赖本地 GGUF 模型文件"
},
"ai_spec": {
"apis": [
{"method": "GET", "path": "/v1/health", "returns": "{ok, model_loaded}", "desc": "健康检查 + 模型加载状态"},
{"method": "POST", "path": "/v1/chat/completions", "body": "OpenAI chat completion 格式", "returns": "OpenAI 格式响应", "desc": "本地 LLM 推理"}
],
"dependencies": [
"EasyTier VPN — 跨平台网络",
"本地 GGUF 模型文件",
"OMLX 框架"
],
"constraints": [
"仅能在 Mac192.168.1.122)上运行",
"首次加载模型较慢(冷启动)",
"Dashboard 只能通过 XMPP 在线状态间接监控"
],
"related_files": [
"gateway/scripts/specs/omlx_server.json — 本 spec",
"config/agents.yaml — agent-003 定义"
]
}
}
+8 -6
View File
@@ -168,13 +168,14 @@ async function fHealth(){try{
M.wechat_bridge={n:'莫荷微信桥接',l:'通信层',i:'微信消息收发中断',spec:'wechat_bridge'};
M.article_processor={n:'文章抓取服务',l:'辅助服务',i:'微信长文章无法读取',spec:'article_processor'};
// 兼容层:/api/services 返回的旧名称仍然映射到友好标签
M.xmpp_bot={n:'XMPP消息收发',l:'通信层',i:'消息收发中断'};
M.hermes_gateway={n:'Hermes网关',l:'AI网关',i:'Hermes Agent不可用'};
M.xmpp_bot={n:'XMPP消息收发',l:'通信层',i:'消息收发中断',spec:'xmpp_bot'};
M.hermes_gateway={n:'Hermes网关',l:'AI网关',i:'Hermes Agent不可用',spec:'hermes_gateway'};
M.ejabberd={n:'XMPP服务器',l:'通信层',i:'所有XMPP连接不可用'};
M.gateway_mohe={n:'Gateway-莫荷',l:'AI网关',i:'莫荷智能体不可用'};
M.gateway_zhiwei={n:'Gateway-知微',l:'AI网关',i:'知微智能体不可用'};
M.dashboard={n:'管理门户',l:'辅助服务',i:'Dashboard无法访问'};
M.gateway_mohe={n:'Gateway-莫荷',l:'AI网关',i:'莫荷智能体不可用',spec:'hermes_gateway'};
M.gateway_zhiwei={n:'Gateway-知微',l:'AI网关',i:'知微智能体不可用',spec:'hermes_gateway'};
M.dashboard={n:'管理门户',l:'辅助服务',i:'Dashboard无法访问',spec:'dashboard'};
M.watchdog={n:'进程看门狗',l:'辅助服务',i:'异常进程无自动恢复'};
M.ejabberd={n:'XMPP服务器',l:'通信层',i:'所有XMPP连接不可用',spec:'ejabberd'};
M['agents-health-check']={n:'健康检查(5min)',l:'定时任务',i:'5分钟级健康检测未运行'};
M['agents-daily-health']={n:'日报健康检查(每日)',l:'定时任务',i:'日报统计未运行'};
var layerOrder=['通信层','AI网关','辅助服务','定时任务'];
@@ -236,7 +237,8 @@ async function fHealth(){try{
var rawN=(M[s.name]||{}).n||s.name;
if(!layers[rawL])layers[rawL]=[];
var hStatus=s.health&&s.health.ok?'running':'down';
layers[rawL].push({name:s.name,label:rawN,port:s.port,status:hStatus,critical:false});}}
var mSpec=(M[s.name]||{}).spec||'';
layers[rawL].push({name:s.name,label:rawN,port:s.port,status:hStatus,critical:false,spec:mSpec});}}
h+='<div class=section><h2 style=margin-bottom:8px>全部服务</h2>';
for(var li=0;li<layerOrder.length;li++){var ln=layerOrder[li];
var items=layers[ln];