Syncs the repo to the deployed /app/data/librechat.yaml (md5 a856831404d5b522cd2e47a8e63466ad,
verified in-container 2026-11-07): full /v1/audio/* endpoint URLs, tinfoil/voxtral-small-24b
(STT) + tinfoil/voxtral-tts (TTS) with the 20 provider voices, seeded speechTab client
defaults (external engines), and languageSTT 'en' pinned as the transcription-language
default (members' own saved settings always win) after a first-press Spanish misdetect.
This run's TTS latency fix lives in the gateway (code/litellm 5d38403), not here.
A modelSpec webSearch:true forces web_search into the ephemeral agent on every
new conversation and re-applies it on context re-keys (the client's spec effect
does not consult per-conversation toggle state for new convos), so the model
could call web_search (SearXNG) with the member's toggle OFF. The toggle state
and the ephemeral agent are the same store, but the spec default kept winning.
Remove the spec-level default so the toggle alone decides; interface.webSearch
permission, defaultPinnedTools badge and the searxng webSearch block stay.
Server-side needs no change: @librechat/api never injects search from specs.
The key is auto-seeded within 10 minutes of first login by sync-keys.js, but a new user's first screen is the API-keys panel, which reads as mandatory. The welcome line is the surface we control; the settings dialog builds its strings from templates in a component chunk with no en locale bundle, so it is not cleanly patchable. Option 1 of three in the issue, approved by the GM.
With enforce: true (in place since at least Oct 23), every send whose body
carries no `spec` is rejected by api/server/middleware/buildEndpointOption.js
with "No model spec selected", surfaced to members as "Inference Co-op could
not complete this request."
400 of 547 conversations across 37 users had no `spec` — all created before
the spec system (newest Oct 20). They fail on the members' first send;
new chats were fine because the softDefault spec pre-selects.
enforce: false lets those conversations send with their own stored model
exactly as before Oct 20. prioritize stays true, so the spec picker is still
the primary chooser — it is just no longer mandatory. Verified: the change is
read at boot (no watcher in the image), so the app was restarted; the served
stylesheet md5 is unchanged by the restart; the mirror is byte-identical to
the deployed file (sha256 219dbdf2ca0b64f8…). Backup of the previous config
stays on the volume as /app/data/librechat.yaml.bak-20261027T221149Z.
If enforcement is ever restored, backfill `spec` on those conversations first,
mapping by each conversation's own `model` (only exact matches — a mismatch
triggers "Model spec mismatch" instead).
- CloudronManifest.json: byte-identical copy of the OFFICIAL appstore manifest
(the hand-edited one stripped addons and crash-looped the app on 2026-10-18)
- Dockerfile: pinned base (202610150224320000), brand assets only + title sed
- librechat.yaml: schema 1.3.17; chat models only in picker (qwen-image moved
to the agent image tool); speech via gateway with capped key refs; SearXNG
web search; inference-docs MCP server; forward-compatible interface.theme
- mcp/server.py: docs MCP server (stdio, stdlib-only, tool search_docs)
- assets/: co-op logo + favicons/PWA icons