openvibers/openvibe.ai Commits

Delete dead fallback and per-role model config from the docs (#3)

OP OpenVibers committed 2 Oct 2026 · e569b27a77 · 4 files, +5 −14

checks run by GitHub CI (test, test-pg) · CI ✓ 3/3 · review SHIP by DeepSeek harness · 1 fix round

https://github.com/OpenVibers/OpenVibe.AI/pull/3

Changes

ddiff --git a/.env.example b/.env.example
iindex bb37abb..e028ddc 100644
---- a/.env.example
++++ b/.env.example
@@@ -50,7 +50,7 @@ OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000
#AI_CREDENTIALS_KEY=
# ── The shared provider — the same names as OpenVibe.Live's admin AI settings ──
--# (ai_enabled, ai_provider, ai_base_url, ai_api_key, ai_model, ai_model_<role>, ai_pricing_json,
++# (ai_enabled, ai_provider, ai_base_url, ai_api_key, ai_model, ai_pricing_json,
# ai_input/output_cost_per_mtok, ai_max_cost_usd_per_day).
#AI_ENABLED=true
# anthropic | openai | openrouter | groq | ollama | (blank = OpenAI-shaped). Anthropic only when
@@@ -60,11 +60,6 @@ AI_PROVIDER=
AI_API_KEY=
# Blank = claude-sonnet-5 for anthropic, gpt-4o-mini otherwise (Live's defaults)
AI_MODEL=
--# Per-role models for Live's workflows (routes live.chat / live.vision / live.director / live.summary)
--#AI_MODEL_CHAT=gpt-5-nano
--#AI_MODEL_VISION=gpt-5-mini
--#AI_MODEL_DIRECTOR=gpt-5-mini
--#AI_MODEL_SUMMARY=gpt-5-mini
#AI_EMBEDDING_MODEL=text-embedding-3-small
#AI_PROVIDER_TIMEOUT_MS=30000
# USD per million tokens, longest model-prefix match: {"gpt-5-nano":{"in":0.05,"out":0.4,"cached":0.005}}
@@@ -72,11 +67,6 @@ AI_MODEL=
#AI_INPUT_COST_PER_MTOK=3
#AI_OUTPUT_COST_PER_MTOK=15
--# Optional second provider used as every route's fallback (OpenAI-compatible unless =anthropic)
--#AI_FALLBACK_PROVIDER=
--#AI_FALLBACK_BASE_URL=
--#AI_FALLBACK_API_KEY=
--#AI_FALLBACK_MODEL=
# Optional local HTTP seam provider (POST {operation, request} -> {text, json, usage})
#AI_HTTP_SEAM_URL=http://127.0.0.1:4799/complete
# A local model server speaking the OpenAI API (llama.cpp llama-server, Ollama /v1): provider `local`, route
ddiff --git a/README.md b/README.md
iindex c49f420..0cfae91 100644
---- a/README.md
++++ b/README.md
@@@ -122,7 +122,7 @@ produce a real answer ends `failed` with an explicit code — `provider.unavaila
`route.unavailable`, `fetch.refused`, `source.unavailable`, `input.insufficient`, `output.empty`,
`output.invalid`, `run.interrupted` — and never with filler content.
--The capability ids and the `ai` service manifest are released in openvibe-contracts v0.29.0 (the
++The capability ids and the `ai` service manifest are released in openvibe-contracts v0.76.0 (the
drafts stay in `docs/capabilities-proposal/`); `server/auth.js` checks them with the contracts grant
rule (exact id or `family.*`). A token's `ns` claim limits which
workflow namespaces it may run (`live.*`, `wiki.*`, …), and namespaces fail closed: a token with
ddiff --git a/STATUS.json b/STATUS.json
iindex fef61cd..0b01592 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -8,6 +8,7 @@
"port": 4700,
"domain": "ai.openvibe.network still serves the OpenVibe.Sites placeholder; the service runs on openvibe-ovh (/opt/openvibe.ai, unit openvibe-ai) on 127.0.0.1:4700, loopback only, used by OpenVibe.Live and OpenVibe.Network",
"contracts": "openvibe-contracts v0.76.0",
++ "sdk": "openvibe-sdk v0.25.2",
"capabilities": [
"ai.run.create",
"ai.run.read",
@@@ -26,7 +27,7 @@
"whisper.cpp",
"local llama.cpp server (openvibe-llm.service)"
],
-- "livePatch": "applied: Live fa22de5 runs AI_SERVICE=remote in production since 2026-09-23 ~15:34 UTC (309 runs by 18:30 UTC across 13 live.* workflows and 1 network.site_copy, 0 failed). As of 2026-09-23, not moved yet: VOD captions/whisper and streamers' own provider keys stayed in Live and most Live features were passthrough prompts built by Live (since 2026-09-27 AI has live.media.transcribe, stored provider keys and versioned templates for most live.* workflows); the deployed Network still falls back to Live's /internal/ai/site-copy; scripts/import-from-live.js ran on production at 2026-09-23 18:29 UTC (79,657 ledger rows: 79,647 live.ai_usage, 2 channel_ai_config, 8 site_settings; 11 holds: provider settings and the key stay env references, 1 streamer BYO key stays in Live, 3,021 translations are unrepresentable and stay in Live); every route has fallbacks=[]; 0 citation rows; no /metrics",
++ "livePatch": "applied: Live fa22de5 runs AI_SERVICE=remote in production since 2026-09-23 ~15:34 UTC (309 runs by 18:30 UTC across 13 live.* workflows and 1 network.site_copy, 0 failed). As of 2026-09-23, not moved yet: VOD captions/whisper and streamers' own provider keys stayed in Live and most Live features were passthrough prompts built by Live (since 2026-09-27 AI has live.media.transcribe, stored provider keys and versioned templates for most live.* workflows); the deployed Network still falls back to Live's /internal/ai/site-copy; scripts/import-from-live.js ran on production at 2026-09-23 18:29 UTC (79,657 ledger rows: 79,647 live.ai_usage, 2 channel_ai_config, 8 site_settings; 11 holds: provider settings and the key stay env references, 1 streamer BYO key stays in Live, 3,021 translations are unrepresentable and stay in Live); text routes (live.<role>, default.chat, default.json) are capability pools placed by openvibe-sdk/placement; live.stt, default.embedding and media.paid are single-provider and answer 503 provider.unavailable when it fails; 0 citation rows; no /metrics",
"deployed": true,
"updated": "2026-09-28",
"features": [
ddiff --git a/server/config.js b/server/config.js
iindex 5a0f752..320eb8f 100644
---- a/server/config.js
++++ b/server/config.js
@@@ -6,7 +6,7 @@
* load(env) is pure so tests can build a config without touching process.env.
*
* Provider settings keep the names OpenVibe.Live used for them (its admin site settings
-- * ai_provider / ai_base_url / ai_api_key / ai_model / ai_model_<role> / ai_pricing_json /
++ * ai_provider / ai_base_url / ai_api_key / ai_model / ai_pricing_json /
* ai_max_cost_usd_per_day, upper-cased here) and Live's own environment names for whisper.cpp
* (WHISPER_*), so the same keys work on both sides of the move. Secrets are only ever read by
* NAME through secretRef(); nothing here logs or returns a value.