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 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.

Zeg iets tegen een van de vier stemagents (Maya, Barnaby, Consultant of Rutger). Luminary leidt de diepgang af uit hoe je het formuleert. "Quick look at" levert één onderzoeker op; "deep dive on" de volledige pipeline over meerdere studies, die hieronder staat beschreven.

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

Een orchestrator, een deep pipeline en 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 schrijft het eindantwoord. 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.

Geen enkel model paste bij elke fase, dus elke fase heeft een 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, en de knowledge graph houdt entiteiten over studies heen bij.
KB-limiet per agent
Elke ElevenLabs-stemagent heeft op enig moment hoogstens MAX_AGENT_KB_DOCS onderzoeksdocumenten gekoppeld (standaard 3). De oudste vervalt bij een nieuwe koppeling, zodat de agent met zijn meest recente onderzoek werkt.
Podcast met twee presentatoren genereren
Elke synthese kan opnieuw worden weergegeven als een podcast met twee presentatoren (Maya + Barnaby) via ElevenLabs TTS.
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; de stap voor het opsporen van tegenstrijdigheden is hierop gebouwd en afgesteld.
  • 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 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 →