The 2026-10-08 rename moved the harness model ids and the homepage cards; the served aliases on the wire stayed frank-primary/frank-large/ frank-secondary. This closes the gap: the alias each endpoint announces is now the family name, while the services, units, scripts, env files and runbooks keep the old names (container identity stays stable). - scripts/frank-secondary.env ALIAS, scripts/frank-large.env HALOGEN_MODEL_ID, scripts/frank-primary.env FRANK_PRIMARY_SERVED_NAME (+ the two serve-script defaults/gate messages) - seams re-pinned: frank_secondary/frank_large/frank_primary unit bats - fleet harnesses retargeted: bench-probe, deep-probe, calib-push, fleet-probes-swift15, autoresearch(+measure), bench-threads-batch-http, bench-decode - shared/homepage/docs.html: api-id annotations and the "switchover will rename the ids" footnote removed — the page's names are now the ids; opencode/Pi/curl examples send frank-zealot - dankclaw/hermes/config.yaml.example: frank-large -> frank-dragoon and the live 262144 context (Hermes routes by served id; see Hermes.md) Consumers with live state re-keyed out-of-band in the same window: OpenWebUI (model row, access_grant, openai.api_configs model_ids) and the Hermes config.yaml.
57 lines
3.2 KiB
Bash
Executable File
57 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# fleet-probes-swift15.sh — RUNS ON DANKSERVER. The cutover contract probes.
|
|
set -uo pipefail
|
|
B=http://localhost:7770/v1
|
|
|
|
echo "== vision (solid red 512px, expect 'Red')"
|
|
python3 - <<'PY'
|
|
import base64, json, urllib.request, struct, zlib
|
|
def png(color):
|
|
w = h = 512
|
|
raw = b"".join(b"\x00" + bytes(color) * w for _ in range(h))
|
|
def chunk(t, d):
|
|
c = t + d
|
|
return struct.pack(">I", len(d)) + c + struct.pack(">I", zlib.crc32(c))
|
|
return (b"\x89PNG\r\n\x1a\n"
|
|
+ chunk(b"IHDR", struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0))
|
|
+ chunk(b"IDAT", zlib.compress(raw)) + chunk(b"IEND", b""))
|
|
b64 = base64.b64encode(png((255, 0, 0))).decode()
|
|
body = json.dumps({"model": "frank-archon", "max_tokens": 256, "temperature": 0,
|
|
"messages": [{"role": "user", "content": [
|
|
{"type": "image_url", "image_url": {"url": "data:image/png;base64," + b64}},
|
|
{"type": "text", "text": "What color is this image? Answer with one word."}]}]}).encode()
|
|
r = urllib.request.Request("http://localhost:7770/v1" + "/chat/completions",
|
|
data=body, headers={"Content-Type": "application/json"})
|
|
d = json.load(urllib.request.urlopen(r, timeout=300))
|
|
m = d["choices"][0]["message"]
|
|
ans = (m.get("content") or m.get("reasoning_content") or "")
|
|
print("VISION ANSWER:", ans[:80].replace("\n", " "))
|
|
PY
|
|
|
|
echo "== tools (expect tool_calls)"
|
|
curl -s -m 120 $B/chat/completions -H 'Content-Type: application/json' -d '{
|
|
"model":"frank-archon","temperature":0,"max_tokens":128,
|
|
"messages":[{"role":"user","content":"What is 23 times 47? Use the calculator tool."}],
|
|
"tools":[{"type":"function","function":{"name":"calculator","description":"evaluate arithmetic",
|
|
"parameters":{"type":"object","properties":{"expr":{"type":"string"}},"required":["expr"]}}}]}' \
|
|
| python3 -c 'import json,sys; d=json.load(sys.stdin); m=d["choices"][0]["message"]; print("TOOL_CALLS:", m.get("tool_calls"))'
|
|
|
|
echo "== reasoning_effort fold (xhigh/medium/low/high all 200 on froggeric v22.5)"
|
|
for lvl in xhigh medium low high; do
|
|
code=$(curl -s -o /dev/null -w "%{http_code}" -m 120 $B/chat/completions \
|
|
-H 'Content-Type: application/json' \
|
|
-d "{\"model\":\"frank-archon\",\"max_tokens\":8,\"reasoning_effort\":\"$lvl\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}")
|
|
echo " reasoning_effort=$lvl -> HTTP $code"
|
|
done
|
|
|
|
echo "== reasoning_content channel"
|
|
curl -s -m 120 $B/chat/completions -H 'Content-Type: application/json' \
|
|
-d '{"model":"frank-archon","max_tokens":64,"messages":[{"role":"user","content":"Is 97 prime? Think briefly."}]}' \
|
|
| python3 -c 'import json,sys; m=json.load(sys.stdin)["choices"][0]["message"]; print("has reasoning_content:", bool(m.get("reasoning_content")), "| content:", (m.get("content") or "")[:60].replace(chr(10)," "))'
|
|
|
|
echo "== response_format json_object"
|
|
curl -s -m 120 $B/chat/completions -H 'Content-Type: application/json' \
|
|
-d '{"model":"frank-archon","max_tokens":64,"response_format":{"type":"json_object"},"messages":[{"role":"user","content":"Return JSON {\"ok\": true}"}]}' \
|
|
| python3 -c 'import json,sys; d=json.load(sys.stdin); print("JSON MODE:", (d["choices"][0]["message"].get("content") or "")[:60])'
|
|
echo "PROBES_DONE"
|