Hermes Agent เป็น OpenAI-compatible API (bridge) — 2026-10-27

เอกสาร / สรุปงาน · 2026-10-27 · /opt/data/docs/2026-10-27-agent-bridge.md

ทำอะไร

เปิด HTTP endpoint ให้ client ที่พูดภาษา OpenAI (/v1/models, /v1/chat/completions) เรียก

Hermes agent ตัวจริง (มี tools, skills, memory, cron) ได้จากแอปอื่น — Open WebUI, LibreChat,

Chatbox, แอปมือถือ, สคริปต์ ฯลฯ

และเพราะทุกครั้งวิ่งผ่าน session store เดียวกับ dashboard/TUI → คุยต่อกันได้ (sync)

Endpoint

```

base_url https://hermes.thisaan.com/agent-api/v1

model hermes-agent

api key อ่านจาก /opt/data/apps/hermes-bridge/.key (600, ไม่ใส่ในแชต)

health https://hermes.thisaan.com/agent-api/health (ไม่ต้องมีคีย์)

```

ทดสอบ:

```bash

KEY=$(cat /opt/data/apps/hermes-bridge/.key)

curl -s https://hermes.thisaan.com/agent-api/v1/models -H "Authorization: Bearer $KEY"

curl -s https://hermes.thisaan.com/agent-api/v1/chat/completions \

-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \

-d '{"model":"hermes-agent","messages":[{"role":"user","content":"ตอบคำเดียว: ok"}]}'

```

Sync ระหว่างช่องทาง

อยากได้ทำอย่างไร
คุยต่อจาก session เดิมส่ง header X-Hermes-Session: <session_id>
เอา session ที่คุยใน /ui/ มาคุยต่อจากแอปอื่นดู id จาก GET /api/sessions ของ dashboard หรือจาก response field hermes.session_id
ให้แอปอื่นเริ่มเรื่องใหม่ไม่ส่ง header — bridge จะสร้าง session ใหม่และคืน id มาให้

response มี metadata:

```json

"hermes": {"session_id": "local-97885f...", "elapsed_s": 4.9}

```

ข้อจำกัดจริง: gateway อนุญาต transport เดียวต่อ session — ถ้า dashboard เปิด session นั้นอยู่

แล้ว bridge ส่งเข้าไป มันจะยึด transport (ฝั่ง dashboard จะไม่ได้รับ stream ต่อ) ไม่ใช่ error แต่ต้องรู้ไว้

สถาปัตยกรรม

```

client (Open WebUI/curl)

└─ https://hermes.thisaan.com/agent-api/* [Caddy บน host, strip_prefix]

└─ http://172.16.1.2:8790 [bridge.py ในคอนเทนเนอร์]

└─ subprocess: hermes -z "<prompt>" (--resume <sid> ถ้าส่ง session มา)

└─ session store /opt/data/state.db ← ใช้ร่วมกับทุกช่องทาง

```

ไฟล์: /opt/data/apps/hermes-bridge/{bridge.py,.env,.key,bridge.log} (ไม่ใช้ dependency ภายนอก)

ผลทดสอบ (วันนี้)

เคสผล
GET /v1/models มีคีย์200 · [{id: hermes-agent}]
ไม่มีคีย์401
chat non-stream200 · 4.9 วิ · content "ok"
chat stream (SSE)4–5 วิ · frames: role → delta → stop → [DONE]
X-Hermes-Session ต่อเรื่องตอบคำถาม "เมื่อกี้ผมพูดอะไร" ถูก → session sync จริง
เรียกผ่าน HTTPS จากนอกเครื่อง200 ทั้ง models และ chat

สิ่งที่ยังไม่ทำ / ข้อจำกัด

ถ้าจะให้ไหลทีละ token ต้องคุยผ่าน WS /api/ws ซึ่งต้องมี session token ของ dashboard (ต้องมีรหัสผู้ใช้)

```bash

cd /opt/data/apps/hermes-bridge && nohup python3 bridge.py >> bridge.log 2>&1 &

```

ความปลอดภัย