openvibers/openvibe.ai Commits
Delete dead fallback and per-role model config from the docs (#3)
Changes
@@@ -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@@@ -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 (thedrafts stay in `docs/capabilities-proposal/`); `server/auth.js` checks them with the contracts grantrule (exact id or `family.*`). A token's `ns` claim limits whichworkflow namespaces it may run (`live.*`, `wiki.*`, …), and namespaces fail closed: a token with@@@ -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": [@@@ -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.
@@ -50,7 +50,7 @@ OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000
@@ -50,7 +50,7 @@ OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000
#AI_CREDENTIALS_KEY=
#AI_CREDENTIALS_KEY=
# ── The shared provider — the same names as OpenVibe.Live's admin AI settings ──
# ── 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_input/output_cost_per_mtok, ai_max_cost_usd_per_day).
#AI_ENABLED=true
#AI_ENABLED=true
# anthropic | openai | openrouter | groq | ollama | (blank = OpenAI-shaped). Anthropic only when
# anthropic | openai | openrouter | groq | ollama | (blank = OpenAI-shaped). Anthropic only when
@@ -60,11 +60,6 @@ AI_PROVIDER=
@@ -60,11 +60,6 @@ AI_PROVIDER=
AI_API_KEY=
AI_API_KEY=
# Blank = claude-sonnet-5 for anthropic, gpt-4o-mini otherwise (Live's defaults)
# Blank = claude-sonnet-5 for anthropic, gpt-4o-mini otherwise (Live's defaults)
AI_MODEL=
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_EMBEDDING_MODEL=text-embedding-3-small
#AI_PROVIDER_TIMEOUT_MS=30000
#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}}
# 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=
@@ -72,11 +67,6 @@ AI_MODEL=
#AI_INPUT_COST_PER_MTOK=3
#AI_INPUT_COST_PER_MTOK=3
#AI_OUTPUT_COST_PER_MTOK=15
#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})
# Optional local HTTP seam provider (POST {operation, request} -> {text, json, usage})
#AI_HTTP_SEAM_URL=http://127.0.0.1:4799/complete
#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
# A local model server speaking the OpenAI API (llama.cpp llama-server, Ollama /v1): provider `local`, route
@@ -122,7 +122,7 @@ produce a real answer ends `failed` with an explicit code — `provider.unavaila
@@ -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`,
`route.unavailable`, `fetch.refused`, `source.unavailable`, `input.insufficient`, `output.empty`,
`output.invalid`, `run.interrupted` — and never with filler content.
`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
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
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
workflow namespaces it may run (`live.*`, `wiki.*`, …), and namespaces fail closed: a token with
@@ -8,6 +8,7 @@
@@ -8,6 +8,7 @@
"port": 4700,
"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",
"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",
"contracts": "openvibe-contracts v0.76.0",
+ "sdk": "openvibe-sdk v0.25.2",
"capabilities": [
"capabilities": [
"ai.run.create",
"ai.run.create",
"ai.run.read",
"ai.run.read",
@@ -26,7 +27,7 @@
@@ -26,7 +27,7 @@
"whisper.cpp",
"whisper.cpp",
"local llama.cpp server (openvibe-llm.service)"
"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,
"deployed": true,
"updated": "2026-09-28",
"updated": "2026-09-28",
"features": [
"features": [
@@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
* load(env) is pure so tests can build a config without touching process.env.
* 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
* 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
* 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
* (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.
* NAME through secretRef(); nothing here logs or returns a value.