live: heartbeat sync 2026-10-18T17:49:00-07:00 (Refs #11)

This commit is contained in:
Frank committed 2026-10-18 17:49:00 -07:00
1 parent b3d3df4bdb
commit 57e255f930
15 files changed
+352 -19

No files matched your search

+46
View File
@@ -254,3 +254,49 @@ providers:
# prior assistants' <think> blocks from history. Keep them —
# multi-turn tool traffic on this endpoint is the majority.
preserve_thinking: true
# Speech endpoint — the fleet's TTS, NOT a chat provider. `api:
# openai-speech` is a runner API (catalog kind `tts`), so this row never
# enters the chat picker, the Ctrl+P cycle, or any chat role: it is
# reachable only through the `speech` model role and the tts device.
# frank-tts (host port 7772) is the OpenAI /v1/audio/speech façade that
# resolves a voice BY NAME; its engine (frank-tts-engine, container-internal
# 8880, never published) is arm A qwentts.cpp 5916bf7 — measured 0.55-0.67
# RTF warm and 86-451 ms to the first audio byte on Dankclaw's CPU, with
# mainline llama-tts (TTS_BACKEND=llama-tts-cli) kept as the rollback.
# Transport contract, read out of the harness itself: the request body is
# {model, input, response_format, voice?, speed?}; `voice` is forwarded ONLY
# when explicitly set, and sampleRate/bitRate are REJECTED outright (the
# transport throws "openai-speech does not support sampleRate"), so the
# codec comes from the output_path suffix and the only tunable that matters
# is the voice name — which must be a real pack name (narrator1/2/3); an
# unknown name is an engine error, not a fallback.
# DELIBERATELY NOT WIRED YET: config.yml `modelRoles.speech` still points at
# local/kokoro. Flip it to "frank-tts (dankclaw)/frank-tts" only after the
# service is deployed and has answered a real synthesis, because `auth: none`
# makes the provider read as AVAILABLE even while the container is down — the
# role would then fail instead of falling back to Kokoro. The same flip must
# re-key `speech.voice` (now am_fenrir, a Kokoro voice) to a pack name.
# SCHEMA LAW, learned the hard way (2026-10-18): provider-level `api` must be
# a CHAT transport — the models.yml schema accepts only the chat/judge APIs
# there, and naming a runner API (`openai-speech`) at provider level fails the
# file's validation, which DISABLES EVERY custom provider: all three fleet
# endpoints vanish from the registry, not just this one (`omp models` prints
# "models.yml validation failed — custom providers disabled" and lists only
# local/kokoro). The runner api belongs on the MODEL entry only, which is what
# the block below does — `auth: none` covers the credential requirement, and
# `contextWindow`/`maxTokens` stay unset because the check only fires when they
# are provided (the bundled Kokoro row is null on both). `omp models --kind tts`
# still prints 128K/16K for this row — the registry fills display defaults — and
# the speech transport never reads them: its whole request body is the five
# fields named above. Verified 2026-10-18 with `omp models --kind tts` (row
# present) and `omp models` (frank-tts absent from the chat roster, all three
# fleet providers still listed).
"frank-tts (dankclaw)":
baseUrl: http://192.168.0.143:7772/v1
auth: none
models:
- id: frank-tts
name: "frank-tts (dankclaw) — cloned voices"
api: openai-speech
input: [text]