feat(observability): enhance logging setup to route Python warnings and improve telemetry
agharsallah
3e954d6
feat: require live infrastructure for event store and inference, removing offline mode
agharsallah
eed2172
feat: add Hugging Face inference backend next to Modal
agharsallah
45917c7
Introduce a second, serverless inference backend (Hugging Face Inference
Providers) alongside the self-hosted Modal vLLM endpoints, and surface the
choice in the Fishbowl Lab.
- src/models/hf_catalogue.py: stdlib-only, offline-safe catalogue of small
instruct models (tiny<=4B .. strong<=32B); binding_for yields the same
LiteLLM custom-endpoint form, so the existing transport calls it unchanged.
- src/models/inference.py: one facade unifying Modal + HF behind
entries/binding_for/default_key_for_profile/backend_available. Models are
named by backend-qualified keys ("hf:<repo>"); a bare key means Modal, so
all existing keys/config/tests are untouched.
- router, registry endpoint: expansion, and has_live_credentials now read the
facade (live = any backend configured).
- Fishbowl Lab gains a headline "00 - Inference backend" radio (Modal vs HF)
driving the cast/judge pickers; the topbar chip names the live backend(s).
A composed run forces live on the chosen backend when it…
feat: add optional mem0 cloud backend for memory index and update documentation
agharsallah
c3f5c19
feat: unify model catalogue and self-hosted routing
agharsallah+1: Codex
9dd6dab
- move model metadata to a shared modal/catalogue.py source of truth and keep modal/registry.py as a compatibility re-export
- add src/models/modal_catalogue.py bridge and resolve config/models.yaml endpoint keys into concrete model/base_url/api_key bindings
- make live-path detection depend on Modal bindings (MODAL_WORKSPACE or MODAL_LLM_BASE_URL) and remove generic cloud-model fallback defaults
- switch memory index default embeddings to local sentence-transformers and document the off-grid behavior
- add ADR-0019 and update architecture/deployment docs, env examples, tests, and lockfile
Co-authored-by: Codex <codex@openai.com>
feat: LiteLLM gateway routing profiles to Modal-served small models
agharsallah+1: Codex
7df0a45
Add LiteLLMProvider; ModelRouter binds each profile (tiny/fast/balanced/strong)
to its Modal vLLM endpoint (workspace env-templated, not hardcoded) and meters
real token + cost usage into the Governor, making hourly_budget_usd live. Env-
gated; offline keeps the deterministic stub. 212 passed, 1 skipped. ADR-0015.
Co-Authored-By: Codex <codex@openai.com>
feat: env-gated Postgres event store via SQLAlchemy (layered)
agharsallah+1: Codex
98938c3
Add SqlAlchemyLedger — a durable backend behind the Ledger interface, driving
both Postgres (Neon) and SQLite through one code path. The append-only ledger
stays the source of truth; backend selection is env-gated by DATABASE_URL with
in-memory fallback, so the suite stays green offline (201 passed, 1 Postgres-
gated skip). eventsourcing evaluated and declined (flat-envelope events don't
map to its aggregate model) — rationale in ADR-0014.
Co-Authored-By: Codex <codex@openai.com>
Refactor code structure for improved readability and maintainability
Engine additions (zero scenario edits required):
- EpisodicMemory: per-agent filtered view over the ledger; agents see only their
own actions and globally-visible event kinds, capped at 8 events for small-model
context windows
- ContextBuilder: single point of prompt assembly (persona → scene → memory →
visitor disturbances); changing prompt strategy is now a one-file edit
- Governor: enforces max_turns / max_calls_per_turn / max_total_calls; raises
BudgetExceeded before a runaway cascade can burn quota
Model provider:
- OpenAICompatProvider: works with any OpenAI-compatible endpoint; config via
OPENAI_API_KEY / OPENAI_BASE_URL / MODEL_NAME; falls back to deterministic stub
when no key is present
Agents + scenarios:
- All four Tiny Wood agents use ContextBuilder with rich personas and episodic memory
- New EchoAgent transforms visitor injections through the wood's logic
- Mystery Roots (src/scenarios/mystery_roots.py): convergent blackboard swarm with
ClueGatherer / Hyp…