Waterschap Brabantse Delta · R&D-lab · runbook

Eddy op eigen model: migratie naar Perplexity (sonar-pro) & operationele runbook

R&D-lab eerste versie 2026-07-06 laatst bijgewerkt 2026-07-06 versie 1.0 concept
Eddy's antwoordmodel verhuist van een persoonlijk Claude-abonnement (geleend via een OAuth-bridge — ToS-risico en abonnementslimieten) naar een eigen Perplexity-API-account van het waterschap. Omdat Eddy modelonafhankelijk is opgezet (LibreChat-agent + MCP-tools), is dit een configuratie- en deploy-oefening, geen herbouw. Dit document is de stap-voor-stap runbook, inclusief de valkuilen die we onderweg tegenkwamen.

Waarom deze migratie

Het anthropic-endpoint van Eddy draaide via de eddy-claude-bridge: die leende een persoonlijk Claude-abonnement (Max/Team, OAuth) in plaats van een reguliere API-sleutel. Dat valt buiten het bedoelde gebruik van de leverancier (risico voor dát account) en is aan de limieten van een consumentenabonnement gebonden. Een eigen Perplexity-account geeft het waterschap grip: eigen contract, geen ToS-risico, en een model dat als los onderdeel te vervangen is.

Modelkeuze & verificatie

Eddy is een tool-gebruikende agent: elk antwoord kan een MCP-tool aanroepen (Z-info, documenten, kaarten). Het model moet dus OpenAI-stijl tool_calls kunnen teruggeven op het /chat/completions-endpoint. Getest tegen api.perplexity.ai op 2026-07-06:

Tool-calling-ondersteuning per Perplexity-model (directe API-test). Alleen de pro-tier geeft een geldig tool_calls-antwoord; de rest weigert tools.
ModelTool-callingUitkomst
sonar-pro✅ ja200 · correct tool_calls
sonar-reasoning-pro✅ ja200 · correct tool_calls
sonar❌ nee400 · "Tool calling is not supported"
sonar-reasoning❌ nee400 · "Tool calling is not supported"

let op Zet de Eddy-agent nooit op sonar of sonar-reasoning — dan vallen alle MCP-tools stil en wordt Eddy een gewone webzoek-chat. Gebruik sonar-pro (default).

Configuratie (wat er in de repo's staat)

De drie plekken die samen het model aansturen. Alle drie zijn naar main gemerged (eddy#9, infra#24).
BestandWijziging
eddy/librechat/librechat.yamlPerplexity als OpenAI-compatibel custom-endpoint (baseURL https://api.perplexity.ai, sleutel ${PERPLEXITY_API_KEY}, modellen sonar-pro/sonar-reasoning-pro).
infra/stacks/eddy/compose.ymlPassthrough PERPLEXITY_API_KEY: ${EDDY_PERPLEXITY_API_KEY} naar de librechat-container.
infra/cloud/.env (hub, niet in git)EDDY_PERPLEXITY_API_KEY=pplx-…

Deploy-runbook (stap voor stap)

  1. Merge de config-PR's gedaan

    Eddy #9 (librechat.yaml) en infra #24 (compose-passthrough) staan op main.

  2. Zet de sleutel in de centrale .env gedaan

    Op de hub, in ~/infra/cloud/.env. Naam = EDDY_PERPLEXITY_API_KEY (dat is de naam die de compose uitleest). Een tweede naam EDDY_PERPLEXITY_KEY met dezelfde waarde is onschadelijk maar wordt niet gelezen.

    EDDY_PERPLEXITY_API_KEY=pplx-…
  3. Zet de compose-passthrough op de deploy-branch te doen

    De hub deployt infra vanaf feat/nextcloud; die branch mist infra#24 nog. Haal alléén die wijziging binnen (cherry-pick) of merge main erin, zodat stacks/eddy/compose.yml de PERPLEXITY_API_KEY-regel bevat.

    cd ~/infra && git cherry-pick <infra#24-sha>
    grep -n PERPLEXITY stacks/eddy/compose.yml   # verifieer
  4. Werk de eddy-checkout bij te doen

    De hub-~/eddy staat op main maar loopt achter op eddy#9. De eddy-stack mount deze librechat.yaml, dus die moet het Perplexity-endpoint bevatten.

    cd ~/eddy && git pull --ff-only
    grep -n Perplexity librechat/librechat.yaml   # verifieer
  5. Herdeploy de eddy-stack te doen

    Recreëert de librechat-container zodat die de nieuwe librechat.yaml én de nieuwe env-variabele oppikt.

    cd ~/infra/cloud && ./stack eddy up -d
  6. Zet het agent-model om te doen

    Het model van de Eddy-agent (agent_gobe34Z5dkTOJ5cmWcSjW) staat in Mongo, niet in de yaml. Zet het in de LibreChat Agent Builder om: endpoint → Perplexity, model → sonar-pro, opslaan. (Alternatief: direct in eddy-mongo.)

Verificatie na de deploy

Open Eddy op eddy.wbd-rd.nl en stel een vraag die een tool vereist, bijv. een niveau/debiet van een gemaal. Als Eddy de Z-info-tool aanroept en met echte meetdata + grafiek antwoordt, werkt de tool-lus op het nieuwe model. Controleer daarnaast dat het Perplexity-endpoint in de modelkiezer verschijnt en dat de eddy-claude-bridge geen verkeer meer krijgt.

Valkuilen (uit de praktijk)

Terugrollen

De eddy-claude-bridge en het anthropic-endpoint blijven voorlopig staan. Terugrollen = het agent-model in de Agent Builder terugzetten op claude-haiku-4-5 (endpoint anthropic). Geen herbouw nodig; dit is precies waarom het model uitwisselbaar is.

Bronnen

  1. RnD/eddydocs/decisions.md besluit 7, en librechat/librechat.yaml. git.wbd-rd.nl/RnD/eddy ↗ geraadpleegd 2026-07-06
  2. RnD/infrastacks/eddy/compose.yml + cloud/ deploy-helper. git.wbd-rd.nl/RnD/infra ↗ geraadpleegd 2026-07-06
  3. Perplexity API — tool-calling geverifieerd tegen api.perplexity.ai/chat/completions. test 2026-07-06
Data-vintage Repo- en hub-configuratie t/m 2026-07-06
Methode Migratie uitgevoerd + geverifieerd; stappen 3–6 nog openstaand bij publicatie
Code & reproduceerbaarheid RnD/eddy + RnD/infra · dit bestand (view-source)
Contact R&D-lab · lab.wbd-rd.nl