I built this project and wrote this post for the Google Cloud "All Things Agentic" Hackathon.
The problem
Ask an AI to help preserve an endangered language and it will fluently produce translations, grammar notes and example sentences — some of them wrong, none of them traceable to a source. For a language with a few hundred speakers left, a confident guess isn't a contribution; it's contamination.
The data usually already exists — scattered across field recordings, historical dictionaries, linguists' notes and half-transcribed corpora. The hard part isn't generating more text. It's reconciling what's already there without inventing the gaps. Language Recovery OS is not a translator or a chatbot. You give autonomous agents an archive and one goal — "process this archive" — and every claim they produce carries its evidence and provenance.
How it's built
A Google ADK orchestrator runs a six-stage pipeline:
-
GovernanceAgent — deliberately not an LLM. Enforces an
access_levelon every source (PUBLIC/COMMUNITY_ONLY/RESEARCH_ONLY/RESTRICTED/SACRED_DO_NOT_PROCESS) set by the human who uploaded it, before any content reaches a model call. Restricted material never leaves the server. - ArchiveAgent (Gemini) — inventories every cleared source and proposes a workflow.
- TranscriptionAgent (Gemini multimodal) — reads the audio bytes directly, no separate ASR pipeline, and returns ranked transcription hypotheses with explicit confidence.
-
EvidenceAgent (Gemini) — for each transcribed claim, a plain-Python keyword search pulls candidate snippets from the archive's own dictionary/grammar/corpus; the agent judges each snippet's stance:
supports/contradicts/related. - LinguistAgent (Gemini) — proposes a meaning/lemma hypothesis grounded only in the judged evidence, always framed as a hypothesis.
-
ConflictAgent (Gemini) + GemmaConflictAgent (Gemma) — run concurrently via
asyncio.gather, re-checking the same evidence for genuine cross-source contradictions.merge_conflict_checksunions both reads: a conflict either model raises is kept.
Then the Deterministic Confidence Engine (pure Python) combines transcription confidence (35%), evidence support (35%) and cross-source agreement (30%), applies a conflict penalty, and maps to SUPPORTED / HYPOTHESIS / NEEDS_VALIDATION / CONFLICTED. Two hard rules an LLM is never trusted to apply to itself: a claim with zero supporting evidence can never auto-accept, and an unresolved conflict always routes to a human, regardless of score. Human decisions are stored with full provenance, and the job resumes when the last pending claim is resolved.
The moment that made the design worth it
On a real Mapudungun recording, the system surfaced a genuine conflict between the audio and Augusta's 1916 dictionary, admitted it couldn't resolve it, and waited for a human expert. That's the whole point — the knowledge base only grows through evidence or a human sign-off, never a model's best guess.
Honest scope
What actually runs today is one Cloud Run service, an ADK/Gemini pipeline, plain-Python evidence search and SQLite for job state. Firestore, a managed RAG Engine and a graph database are documented upgrade paths, not part of the current build. The demo archive is built entirely from public-domain and Creative-Commons sources (a 1916 dictionary, a 1903 grammar, an AVENUE corpus excerpt, a Wikitongues recording).
Links
- Project & full write-up on Devpost: https://devpost.com/software/language-recovery-os
- Demo video: https://youtu.be/c7wjtfZt2VI
Stack: Gemini 3.5 Flash-Lite (multimodal) + Gemma via Google ADK, FastAPI + SSE, SQLite, deployed on Google Cloud Run with Secret Manager. Built for the Google Cloud "All Things Agentic" Hackathon.
Top comments (0)