Files
tatlock/.env.example
T
jpmschweitzerandClaude Fable 5 5b141669ce feat(backend): T-4 — named sessions through the boilerroom wrapper
The flavor probe gains a third answer: the wrapper names itself on
/health, so behind OLLAMA_HOST tatlock now distinguishes boilerroom,
a bare llama-server, and Ollama. Through the wrapper each pipeline
phase is a named session with the decided eviction ranking —
tatlock-steward/-orchestrate/-synthesize at 40, librarian at 30,
lower parks sooner (webber will sit at 20; Open WebUI stays
session-less and can never evict anyone). Against a bare llama-server
the raw id_slot pins survive unchanged, Ollama gets neither, and an
unprobed flavor sends nothing rather than guessing — the backend
stays swappable by env alone. tool_choice through the wrapper follows
the llama-server rule, since that is who answers.

The wrapper's balancing and compaction-due signals are read
everywhere: an httpx response hook on the provider covers every
PydanticAI call, streams included, and the steward's raw call reads
the body extras. Acting on compaction_due is a future ticket — the
signal just must not pass silently.

Verified end to end against the live wrapper: the dev server probed
flavor=boilerroom, a full pipeline turn answered in 5.7 s, and
GET /sessions showed all three phase sessions resident at rank 40
with engine-reported occupancies. The demonstration also filled the
production slot map — session-less prod delegations would have 503d
— cleared by a wrapper restart and filed as boilerroom T-11 (sessions
need an exit). A latent test flaw surfaced too: the ollama
tool_choice test relied on the dev backend probing as ollama; it now
pins the flavor it claims to test.

27 selector tests (9 new), 677 total green; three mutations shown to
fail their tests (librarian rank, the wrapper branch, the no-nudge
set); the new wrapper contract class runs 10/10 against the live
boundary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-12 16:13:29 +02:00

69 lines
2.1 KiB
Bash

# Application Configuration
APP_NAME="OpenAI-Compatible API"
ENVIRONMENT=development
DEBUG=false
# API Configuration
API_HOST=0.0.0.0
API_PORT=8000
API_PREFIX=/v1
# Local backend (primary). The var name is legacy: any OpenAI-compatible
# server works — Ollama, a bare llama-server, or the boilerroom wrapper
# (http://127.0.0.1:8602 on tower-of-joy). The flavor is probed at
# startup; through the wrapper, BACKEND_SLOT_PINNING=true sends named
# sessions with the T-4 eviction ranking instead of raw slot pins.
OLLAMA_HOST=http://localhost:11434
OLLAMA_DEFAULT_MODEL=gemma4:e2b
OLLAMA_TIMEOUT=120
STEWARD_TIMEOUT=60
BACKEND_SLOT_PINNING=false
# Anthropic Configuration (Claude - cloud fallback)
# Set ANTHROPIC_API_KEY to keep the Claude fallback available: it is used
# automatically when Ollama is down, or exclusively when PREFER_CLOUD_BACKEND=true
# Without an API key, Tatlock uses Ollama only
# ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
ANTHROPIC_MODEL=claude-sonnet-5
PREFER_CLOUD_BACKEND=false
# SearXNG Configuration
SEARXNG_HOST=http://localhost:8087
SEARXNG_TIMEOUT=30
# Redis Configuration
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_MEMORY_DB=1
REDIS_TIMEOUT=5
# Qdrant Configuration
QDRANT_HOST=localhost
QDRANT_PORT=6333
# Logging
# LOG_LEVEL is auto-selected based on ENVIRONMENT if not set:
# - development: DEBUG (maximum verbosity)
# - production: WARNING (minimal noise)
# Uncomment to override: LOG_LEVEL=INFO
# Note: Log format is auto-selected based on ENVIRONMENT (console for dev, json for production)
# User Configuration
# DEFAULT_USER is auto-selected based on ENVIRONMENT if not set:
# - development/testing: llm_tester (isolated test scope)
# - production: jpmschweitzer (real user)
# Uncomment to override: DEFAULT_USER=your_username
# Library-Desk Configuration (The Librarian backend)
# LIBRARY_DESK_HOST=http://localhost:8089
# LIBRARY_DESK_API_KEY=your-library-desk-api-key
# LIBRARY_DESK_TIMEOUT=60
# Core-API Configuration (The Housekeeper backend)
# CORE_API_HOST=http://localhost:8090
# CORE_API_KEY=your-core-api-key
# CORE_API_TIMEOUT=30
# CORS (comma-separated list)
CORS_ORIGINS=["*"]