connect any agent · verified end-to-end 2026-09-10

Hermes Agent Integration

The endpoint

Base URL
http://100.126.153.18:8081/v1  (THE GATEWAY — memory + persona + tracing layered; raw llama-swap lane: http://100.126.153.18:8080/v1)
API
OpenAI-compatible: /v1/chat/completions, /v1/embeddings, tools/function-calling
Auth
API key required (Bearer) — two independent keys live since 2026-09-12 (builder + owner; keys at /srv/llm/secrets/api-key and api-key-2 on the box); firewall restricts :8080/:8081/:18190 to tailnet 100.64.0.0/10
Rerank
http://frame-serv-2:18190/v1/rerank — POST {"query":…,"documents":[…]}
Model ids
qwen38-27b · flashnext-iq1s · flashnext-fp4 · glm53-flash · dsv4-flash · llama-3.3-70b · embed

Drop-in Hermes profile (working, verified)

Live on the operator's node at ~/.hermes/profiles/frameserv2/ — verified end-to-end ("ARISE" round-trip through hermes → tailnet → llama-swap → MTP inference):

~/.hermes/profiles/frameserv2/config.yaml
---
model:
  default: "qwen38-27b"
  provider: "custom:frameserv2"
  base_url: "http://100.126.153.18:8081/v1"
  api_key: ""
providers:
  custom:frameserv2:
    base_url: "http://100.126.153.18:8081/v1"
    model_prefix: ""
    api_key: ""

agent:
  max_turns: 60
  task_completion_guidance: true

display:
  personality: technical
  show_cost: false
  show_reasoning: false
  compact: true

Run it: hermes --profile frameserv2 · one-shot: hermes --profile frameserv2 -z "…"

Switch models by changing model.default to any of the model ids above — one endpoint, three brains:

Multiple profiles can share this endpoint with different personas (SOUL.md) — same pattern as zaraki/ishigami on ashborn-prime.

Plain OpenAI client (any agent framework)

from openai import OpenAI
client = OpenAI(base_url="http://100.126.153.18:8081/v1", api_key="…")
r = client.chat.completions.create(
    model="qwen38-27b",
    messages=[{"role": "user", "content": "Hello"}],
)
print(r.choices[0].message.content)

Network reachability matrix

FromReachable?Path
Any tailnet device (dxverm tailnet)yesTailscale → firewalld rich-rule (100.64.0.0/10 scoped) → :8081/:8080/:18190
Friend's LAN (10.141.47.x)planned open at handbackowner moves the box to a static IP on his LAN; firewalld opens the AI ports to his subnet (see Roadmap 5.3)
Public internetneverNo port-forward exists. Post-handback remote access method is the owner's choice (tunnel plan retired 2026-09-10)

Security posture: API-key auth is enforced on every inference endpoint (401 without a valid key; two independent keys live since 2026-09-12) on top of tailnet-scoped reachability. Verified: 401 with a wrong or missing key, 200 with either key.

Try it visually

The Model Playground (on the box, tailnet-only) runs one prompt against every model sequentially with live streaming — the fastest way to see the differences.

What this endpoint gives an agent

CapabilityModelsVerified
Chat + streamingallyes
Tool / function calling (OpenAI schema)qwen38-27b, flashnext-iq1s, flashnext-fp4, glm53-flash, llama-70b, dsv4yes
Vision (image input)qwen38-27b, flashnext-iq1syes
Embeddings (1024-dim)embedyes
Reranking:18190 (bge-reranker-v2-m3)yes
Server-side MCP web toolsweb-search + web-fetch on qwen38-27b and glm53-flashexperimental — registration verified; emission varies by model