Inspiration

Low-resource languages already have archives — recordings, dictionaries, field notes — but turning them into structured, trustworthy, queryable knowledge takes trained linguists most communities can't access. LLMs are tempting here and dangerous: a model will fluently "translate" a language it never learned. We wanted agents that do the tedious first pass without ever asserting a fact, and a decision layer a model is never allowed to touch.

What it does

  • Ingests a mixed archive (audio, dictionaries, grammars, corpora), each source tagged with an access level.
  • A Governance step in plain Python — not a model — blocks restricted or sacred sources from ever reaching an LLM.
  • The Archive agent inventories the sources and proposes a workflow.
  • The Transcription agent reads the audio bytes directly via Gemini 3.5 Flash-Lite multimodal input — there is no separate speech-recognition system.
  • For each transcribed fragment, a plain-Python keyword search pulls candidate snippets from the archive's own dictionary, grammar, and corpus; the Evidence agent judges each one as supporting, contradicting, or merely related.
  • The Linguist agent proposes a meaning — always labelled a hypothesis, never a fact.
  • A Conflict agent on Gemini and a second Conflict agent on Gemma independently check for cross-source contradictions. A conflict either model raises is kept (union, not intersection).
  • A Scoring engine in Python combines every signal into a final confidence and status: SUPPORTED, HYPOTHESIS, NEEDS VALIDATION, or CONFLICTED. Two hard rules the LLM is never trusted to apply to itself: a claim with zero supporting evidence can never auto-accept; a claim with an unresolved conflict always goes to a human, whatever its score.
  • Human validation is recorded as provenance — who, what value, and when — permanently on the job. Resolving the last pending claim closes the job.
  • Every claim keeps its evidence, source, and locator.

How we built it

  • Google Agent Development Kit (ADK): every model-backed agent is an ADK LlmAgent.
  • Gemini 3.5 Flash-Lite for transcription, evidence judging, linguistic hypotheses, and the primary conflict check.
  • Gemma as an independent second model family for the conflict check.
  • FastAPI + uvicorn backend, streaming the pipeline to the browser live over server-sent events; SQLite for job storage; plain-Python retrieval (no managed RAG engine).
  • Pydantic schemas for every agent's structured input and output.
  • Deployed on Google Cloud Run (request timeout raised to 900s); the Gemini key lives in Secret Manager, not an environment variable.
  • 32 passing tests.

Challenges we ran into

  • Keeping the LLM out of the decision. Every time the scoring logic drifted toward "let the model decide," we pulled it back into deterministic Python.
  • Streaming a 2-5 minute multi-agent run to a browser without the request hanging: agent-call timeouts, an atomic job-claim to prevent double execution, and lost-update protection on human validation.
  • Multimodal transcription of a real, noisy field recording with no dedicated ASR.
  • Making the governance gate provably non-bypassable: the access-level check has to run before any content reaches a model.

Accomplishments that we're proud of

  • The accept / hypothesis / escalate call is 100% Python. The model never grades its own work.
  • Provenance on every claim, including the human step.
  • Genuinely language-agnostic — demoed on Mapudungun, tested on English and Spanish with no code change.
  • Two independent model families on the conflict check, with union semantics so a real disagreement is never silently dropped.
  • A governance gate that respects Indigenous data sovereignty (CARE principles) by construction.

What we learned

  • For high-stakes reasoning, the useful division of labour is: LLMs generate and judge candidates; deterministic code owns the final decision and the audit trail.
  • "Route to a human" is a feature, not a failure — as long as it is recorded as provenance.

What's next for Language Recovery OS

  • Richer retrieval so real archives surface more supporting evidence instead of deferring almost everything to humans.
  • Batch mode for whole archive collections.
  • Export to standard linguistic interchange formats.
  • A community-facing validation UI with role-based trust levels.

One of four

One of four projects on the same spine — an LLM proposes structure, deterministic code decides the outcome, and every claim is grounded in an independent source. Here it's the archive's own dictionary, grammar and corpus; a point-in-time Wayback capture in The Promise Ledger, Mexico's SAT shell-company blacklist in Trusted Hire México, versioned business rules in ScopeCouncil.

Built With

  • fastapi
  • gemini
  • gemma
  • google-adk
  • google-cloud-run
  • multi-agent
  • pydantic
  • python
  • server-sent-events
  • sqlite
  • uvicorn
Share this project:

Updates