haiku.rag/haiku_rag_slim/haiku/rag
Yiorgis Gozadinos 4aee18dcbe
Operator dashboard at GET /; tighten Logfire span shape
Self-contained HTML status page served from the ingester's FastAPI app.
Polls /health, /sources, /stats, /jobs?status={claimed,dead,succeeded}
every 3s from the browser and renders queue chips, sources with
last-poll/skip-reason/circuit state, active jobs with cancel, recent
failures with retry, and recently-completed feed with op badges so
DELETE rows are visually distinct from UPSERTs. Zero external deps —
single static HTML, no CDN, no fonts, no images. Works offline.

To support the dashboard:
- New /stats endpoint exposing rolling throughput (5m/30m/1h), worker
  occupancy, oldest-queued age, and per-source DLQ + queue-depth
  breakdowns. Each field is a single SQL aggregation against the queue.
- JobRepo gains count_succeeded_since, oldest_queued_age_seconds,
  counts_by_source.
- SourceSummary gains last_skip_reason. BasePoller now records the
  reason the most recent sweep attempt was skipped ("pending_work" /
  "circuit_open"), cleared on the next successful poll. Closes the
  gap where operators couldn't tell from /sources alone why a source
  wasn't picking up new work.

Auth: dashboard route is unauthenticated (markup only). The JS attaches
the bearer to its own JSON fetches; on 401 it prompts once and stashes
the token in localStorage.

Two Logfire fixes that landed alongside:

- Drop logfire.instrument_fastapi() and the [fastapi] extra. The control
  plane is polled frequently (dashboard + docker healthcheck), so every
  endpoint became a span and drowned the useful traces. logfire itself
  stays — pulled in transitively via pydantic-ai-slim[logfire] — so
  ingester.poller.* / ingester.job / document.* spans keep emitting.

- Wrap FSPoller._handle_watch_change in an ingester.poller.watch_event
  span and pass _enqueue_extra. Without this, the watchfiles callback
  ran with no active context, the _otel carrier in job.extra was empty,
  and the worker's ingester.job span surfaced as an orphan trace root
  instead of nesting under the FS event that caused it.
2026-05-26 11:44:47 +03:00
..
chat rotate chat TUI conversation id per launch / clear-chat 2026-05-21 14:21:51 +03:00
chunkers round-robin docling-serve across multiple base_urls 2026-05-26 11:44:45 +03:00
client typed UnsupportedSourceError replaces pipeline string-marker matching 2026-05-26 11:44:46 +03:00
config PDF split-convert-merge for memory-bound large PDFs 2026-05-26 11:44:45 +03:00
converters Bound pdf_split memory + release lock between slices 2026-05-26 11:44:46 +03:00
embeddings Expose embedding batch size as config 2026-05-13 14:09:47 +03:00
ingester Operator dashboard at GET /; tighten Logfire span shape 2026-05-26 11:44:47 +03:00
inspector render attached pictures in inspector context modal under qa.model.vision 2026-05-06 12:00:12 +03:00
providers round-robin docling-serve across multiple base_urls 2026-05-26 11:44:45 +03:00
reranking fix mxbai reranker crash in chat TUI 2026-05-20 17:18:57 +03:00
sandbox sandbox + cite: guard sort precondition; require rag in cite fallback 2026-05-20 13:02:25 +03:00
skill_generator Drop the multi-agent research workflow 2026-05-20 12:46:48 +03:00
skills drop list_documents/get_document from default RAG skill 2026-05-26 11:35:43 +03:00
store Cover unparseable-metadata path 2026-05-26 11:44:47 +03:00
tools Verify picture bytes before attaching to multimodal tool returns 2026-05-13 16:01:39 +03:00
__init__.py Restructure into uv workspace to support minimal and full installations 2025-11-04 17:59:12 +02:00
app.py Add --host, --port to ingester cli, update docker compose example 2026-05-26 11:44:45 +03:00
cli.py Add --host, --port to ingester cli, update docker compose example 2026-05-26 11:44:45 +03:00
context.py search: only attach picture bytes from pre-expansion chunks 2026-05-19 15:03:22 +03:00
logging.py Restructure into uv workspace to support minimal and full installations 2025-11-04 17:59:12 +02:00
mcp.py Drop the multi-agent research workflow 2026-05-20 12:46:48 +03:00
s3.py swap aioboto3 for obstore in the S3 client path 2026-05-11 11:29:42 +03:00
utils.py Drop the multi-agent research workflow 2026-05-20 12:46:48 +03:00