Skip to content
D · 01 · TECHNICAL WRITE-UP

Luminary.

Een voice-first deep-research-agent.

Praat met een van vier stemagents over wat je maar wilt — markten, bedrijven, wetenschap, geschiedenis. Luminary kiest een diepgang, draait een echte bronnengebaseerde research-pipeline en leest het resultaat voor. Desgewenst zet het er een podcast met twee presentatoren van.

01 · WAT HET DOET

Drie diepgangen, automatisch gekozen uit je stem.

Je start het door iets te zeggen tegen een van de stemagents — Maya, Barnaby, Consultant of Rutger. Luminary leidt de diepgang af uit de formulering en routeert daarop. Elke run is een echt, bronnengebaseerd onderzoek — geen enkele losse LLM-aanroep. Claimvalidatie over studies heen vangt tegenstrijdigheden tussen bronnen op voordat ze je bereiken. QA-anticipatie beantwoordt alvast de vervolgvragen die je waarschijnlijk gaat stellen.

DiepgangStemtriggerPipelineBudget
Quick"quick look at X" · "brief on X"Eén onderzoeker, geen vervolgvragen.~3 min
Standard(standaard)Deelvragen-fan-out → parallel onderzoek → vervolgvragen → synthese.~10 min
Deep"deep dive on X" · "comprehensive analysis of X"Iteratieve pipeline over meerdere studies: query-analyse → studieplanning → iteratief onderzoek → claimvalidatie → QA-anticipatie → strategische analyse → mastersynthese.tot 60 min
02 · ARCHITECTUUR

Eén orchestrator, één deep pipeline, 24 met ADK gebouwde agents.

Een ElevenLabs-stemagent post naar een webhook (HMAC-geverifieerd). De research-orchestrator leidt de diepgang af, zet een plan/confirm-gate bij deep, injecteert geheugen en de knowledge graph, en geeft het door aan de deep pipeline. Studies waaieren parallel uit. Een synthese-evaluator loopt samen met een gap-analyzer rond totdat de bevindingen niet meer veranderen. Claimvalidatie vangt tegenstrijdigheden over studies heen op, QA-anticipatie beantwoordt alvast de voor de hand liggende vervolgvragen, en een mastersynthese landt het antwoord. Resultaten worden in GCS bewaard, aan de knowledge base van de agent gekoppeld voor de volgende stembeurt, en desgewenst geproduceerd als een podcast met twee presentatoren.

ElevenLabs voice agent  ──▶  webhook /webhook/elevenlabs (HMAC-verified)
                                        │
                                        ▼
                          ┌──────────────────────────┐
                          │  research_orchestrator   │
                          │  ─ depth detection       │
                          │  ─ plan/confirm gate     │
                          │  ─ memory + KG injection │
                          └──────────┬───────────────┘
                                     ▼
              ┌───────────────────────────────────────────────┐
              │                deep_pipeline                  │
              │                                               │
              │   query_analyzer ─▶ study_planner ─▶ iterative│
              │           ▼                                   │
              │   parallel(researcher × N studies)            │
              │           ▼                                   │
              │   synthesis_evaluator ─▶ gap_analyzer (loop)  │
              │           ▼                                   │
              │   claim_validator ─▶ qa_anticipator           │
              │           ▼                                   │
              │   strategic_analyst ─▶ master synthesis       │
              └───────────────────────┬───────────────────────┘
                                      ▼
                       GCS results · memory · knowledge graph
                                      ▼
                       agent KB attach  →  next voice turn
                       podcast_generator (optional, 2-host)
                       Observable dashboard (`/explore`)
03 · MODEL ROUTING

Elke fase het model dat past.

Multi-provider routing is het hele punt. Geen enkel model is het juiste gereedschap voor elke fase, dus elke fase krijgt zijn eigen standaard en een fallback chain. Alles is tijdens runtime te overrulen via env vars (GEMINI_MODEL, GEMINI_PRO_MODEL, OPENAI_REASONING_MODEL).

Pipeline-faseStandaardmodel
Query analysisGemini 2.5 Flash
Study planningGemini 2.5 Flash
Study researchGemini 2.5 Flash (with google_search grounding)
Complex study researchGemini Deep Research (autonomous agent)
Study synthesisOpenAI o4-mini → Gemini Pro → Flash (fallback chain)
Master synthesisOpenAI o4-mini → Gemini Pro → Flash
Claim validationOpenAI o4-mini (contradiction detection)
Strategic analysisGemini 2.5 Pro
VerificationGemini 2.5 Flash (with web_search tool)
04 · OPVALLENDE ONTWERPKEUZES

De niet voor de hand liggende keuzes die bepalen wat het kan.

Plan/confirm-gate vóór deep runs
Deep-modus heeft een budget van 60 minuten. Luminary bouwt eerst het studieplan, leest het via spraak terug ter bevestiging, en voert het pas daarna uit. AUTO_PROCEED_* env vars stellen dit per diepgang af.
Annuleren is async-veilig
Een door de gebruiker gestart annuleren werpt een ResearchCancelled op moduleniveau op, die elke task-handler opnieuw doorgooit. Geen verweesde threads, geen zombie LLM-aanroepen.
Checkpoints naar GCS
Lange deep runs bewaren tussenliggende staat in Google Cloud Storage. Een gecrashte run hervat in plaats van opnieuw te beginnen.
Geheugen + knowledge graph
Eerdere onderzoeksbevindingen worden opnieuw geïnjecteerd in verwante queries. De knowledge graph houdt entiteiten over studies heen bij, zodat claims over studies heen gevalideerd kunnen worden en tegenstrijdigheden aan het licht komen.
KB-limiet per agent
Elke ElevenLabs-stemagent heeft op enig moment hoogstens MAX_AGENT_KB_DOCS onderzoeksdocumenten gekoppeld (standaard 3). De oudste wordt bij een nieuwe koppeling verwijderd, zodat de werkverzameling van de agent scherp blijft.
Podcast met twee presentatoren genereren
Elke synthese kan opnieuw worden weergegeven als een podcast met twee presentatoren (Maya + Barnaby) via ElevenLabs TTS. Dit is dezelfde afkomst waarop de podcasts van rutgertuit.nl draaien.
05 · STACK

Wat er onder draait.

  • Google ADK — het agent-framework. 24 op maat gebouwde agents (query_analyzer, study_planner, iterative_researcher, claim_validator, qa_anticipator, strategic_analyst, synthesis_evaluator, podcast_generator, watch_checker, memory_extractor, …).
  • Gemini — 2.5 Flash voor analyse + bronnengebaseerd studieonderzoek, 2.5 Pro voor strategische analyse, Deep Research als autonome agent voor complexe studies.
  • OpenAI o4-mini — synthese + claimvalidatie. Betere detectie van tegenstrijdigheden voor deze prijs dan de Gemini-alternatieven tijdens de evaluatie.
  • Grok — optionele secundaire provider voor specifieke fasen.
  • ElevenLabs Conversational + TTS — vier inkomende stemagents en de uitgaande podcastgenerator.
  • Flask + Gunicorn — Python-backend. Blueprints voor health, webhook, ui_api, explore.
  • Observable Framework — het /explore-dashboard. Visualiseert onderzoeksjobs, kosten, pipeline-traces, knowledge graph. Ingebouwd in de Docker-image.
  • Google Cloud Run + Secret Manager + GCS — serverless runtime, secrets, persistentie van resultaten. Multi-stage Dockerfile (Node 20 bouwt het dashboard, Python 3.11 draait de app).
WAAROM DIT BESTAAT

Voor mij bleek spraak een betere ingang tot deep research dan typen. Een vraag in een chatvenster typen is een bottleneck — het meeste onderzoek dat ik echt wil doen, gebeurt terwijl ik loop, rijd, of tussen vergaderingen door zit. Luminary is de versie waarmee ik een vraag onderweg kan afgeven en er een bronnengebaseerd antwoord als audio voor terugkrijg. Dat het ook kan exporteren naar een podcast met twee presentatoren is de naad waar dit project en de podcasts van rutgertuit.nl samenkomen: dezelfde ElevenLabs-afkomst, dezelfde regel van prompten-en-dan-kiezen.

Lees de broncode op GitHub →