เอกสาร / สรุปงาน · 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)
```
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"}]}'
```
| อยากได้ | ทำอย่างไร |
|---|---|
| คุยต่อจาก 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-stream | 200 · 4.9 วิ · content "ok" |
| chat stream (SSE) | 4–5 วิ · frames: role → delta → stop → [DONE] |
X-Hermes-Session ต่อเรื่อง | ตอบคำถาม "เมื่อกี้ผมพูดอะไร" ถูก → session sync จริง |
| เรียกผ่าน HTTPS จากนอกเครื่อง | 200 ทั้ง models และ chat |
hermes -z คืนข้อความครั้งเดียว จึงส่ง SSE เป็นก้อน (400 ตัวอักษร/ก้อน) ถ้าจะให้ไหลทีละ token ต้องคุยผ่าน WS /api/ws ซึ่งต้องมี session token ของ dashboard (ต้องมีรหัสผู้ใช้)
```bash
cd /opt/data/apps/hermes-bridge && nohup python3 bridge.py >> bridge.log 2>&1 &
```
--yolo — approvals ยังเป็น smart ตาม configจำไว้นะ ...) เพราะจะเขียน MEMORY.md จริง