feat(backend): adapt every completion to the detected backend (workspace T-137)
One choke point in the sanitized client: the flavor is probed once (the boilerroom wrapper names itself on /health, a bare llama-server serves /props, Ollama answers neither) and every completion adapts. The agents' tool_choice "required" survives only on Ollama — advisory there, enforced by llama-server, an unbreakable tool loop through the wrapper. Through the wrapper every completion carries webber's session identity: session webber, eviction_order 20 in the decided ranking, configurable via settings. The wrapper's balancing and compaction signals are read from the response body's extra fields — an httpx event-hook variant was tried and never fires under the openai SDK. The enabling fix: the sanitized client was never in the request path. The provider assigned self._openai_client, an attribute nobody reads — OllamaProvider.client serves self._client — so every completion has bypassed the null-content sanitizer since the class was introduced. Exposed when the wrapper 503'd a session-less request the choke point should have named; the client now goes through the constructor's official openai_client parameter, and a wiring test pins provider.client to the sanitized type. The same bug exists in tatlock (its T-6, filed). Verified against the live wrapper from the dev server: flavor boilerroom detected, a tool-using explore run answered in 4.8 s with no tool loop, webber resident at rank 20, and the wrapper parked librarian and tatlock-experts to seat it — the ranking doing exactly its job. Six new tests (227 green), five mutation-checked: the rank default, the strip condition, the session-add condition, the no-cache-on-failure rule, and the client wiring. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,13 @@ class Settings(BaseSettings):
|
||||
ollama_agent_model: str = "gemma4:e2b"
|
||||
ollama_embed_model: str = "nomic-embed-text:latest"
|
||||
|
||||
# Session identity through the boilerroom wrapper (workspace T-137):
|
||||
# rank 20 in the decided ordering — tatlock phases 40, experts 35,
|
||||
# librarian 30, webber 20; lower parks sooner. The fields only mean
|
||||
# something to the wrapper; Ollama and a bare llama-server ignore them.
|
||||
backend_session_name: str = "webber"
|
||||
backend_session_rank: int = 20
|
||||
|
||||
# Auth - Tatlock integration
|
||||
tatlock_api_url: str | None = "http://tatlock:8000"
|
||||
internal_api_key: str | None = None
|
||||
|
||||
Reference in New Issue
Block a user