Een coding-harness of agentraamwerk is in essentie een orchestrator: de uiteindelijke codekwaliteit en de bijbehorende rekening worden bepaald door het onderliggende taalmodel dat de taken uitvoert. In deze praktijkgids lees je hoe je orchestrators zoals Claude Code of vergelijkbare CLI-assistenten zwaar programmeerwerk laat uitbesteden aan kostenefficiënte modellen via een tussenliggende OpenAI-compatibele proxy, inclusief een sluitende audit-trail en realtime inzicht in je verbruik per taak.
Veel populaire coding-harnesses en assistenten worden geleverd als een hechte monoliet. De systeemprompt, gereedschapsdefinities, gespreksgeschiedenis, contextmanagement en API-verbindingen zitten verwerkt in één enkel binaire bestand of afgesloten pakket. Wil je een ander model inzetten of een externe toolchain aansluiten, dan moet je sleutelen in de broncode van software van derden. Zodra de onderliggende software bijgewerkt wordt, loop je het risico dat eigen aanpassingen verloren gaan of breken.
Door de interface en orkestratie functioneel te scheiden van de feitelijke modelaanroep, ontstaat een flexibele modulaire architectuur. In zo'n opzet blijft de orchestratielaag verantwoordelijk voor de interactie met de ontwikkelaar en de lokale context (zoals het doorzoeken van een git-repository of het inlezen van lokale bestanden), terwijl het rekenintensieve programmeerwerk via een flexibele adapter wordt doorgestuurd naar een model dat voor die specifieke taak het meest geschikt en voordelig is.
Deze ontkoppeling biedt drie grote voordelen voor indie developers en kleine teams:
In een robuuste ontwikkelstraat vervult elk component een afgebakende rol. Een orchestrator (zoals een interactieve agent in je terminal) begrijpt de context van je codebase, maakt een actieplan en bepaalt welke bestanden moeten worden bewerkt. Het genereren van complexe logica, wiskundige algoritmes of refactoring delegeert de orchestrator vervolgens aan een gespecificeerde uitvoeringslaag.
De architectuur bestaat uit drie functionele lagen:
Het scheiden van deze verantwoordelijkheden sluit naadloos aan bij de principes van robuuste API-integraties, waarbij foutafhandeling, herhaalpogingen (retries) en logging gecentraliseerd worden in plaats van versnipperd over individuele CLI-tools.
Het datapad van een gedelegeerde programmeertaak verloopt sequentieel van de lokale werkplek naar de provider en weer terug:
Ontwikkelaar / CLI Orchestrator (bv. Claude Code, Kimi Code)
│
▼
Delegeer-script / Lokale wrapper (taakdefinitie & contextbundeling)
│
▼
Uitvoerings-harness (headless worker)
│
▼
Zelfgehoste OpenAI-compatibele proxy (bv. LiteLLM op http://localhost:PORT/v1)
├─ Registreert: Traceer-ID (cid), taaktype, timestamp
├─ Berekent: In- en out-tokens, geschatte kosten
│
▼
Externe Provider API (bv. DeepSeek, Qwen of OpenAI-compatibel eindpunt)
│
▼
Respons keert via de proxy terug naar de lokale werkomgeving
Doordat de proxy een standaard OpenAI-interface nabootst, merkt de aanroepende harness niet dat er een inspectie- en loglaag tussen zit. De configuratie vereist slechts het instellen van een alternatieve basis-URL.
De kern van deze opzet is een lokale of zelfgehoste reverse proxy die API-aanroepen vertaalt en logt. Een bekend open-source voorbeeld hiervan is LiteLLM, maar je kunt hiervoor elke OpenAI-compatibele proxy of gateway inzetten. De proxy draait als een achtergrondproces of binnen een container.
Draai je de infrastructuur lokaal of op een thuisserver, bekijk dan de instructies voor lokale modellen in Docker draaien om containers netjes te isoleren en via een intern netwerk te benaderen.
Een typische configuratie van zo'n proxy koppelt een logisch model aan een specifiek provider-eindpunt en slaat de sessiegegevens lokaal op. Hieronder zie je een conceptueel configuratievoorbeeld (bijvoorbeeld proxy-config.yaml):
# proxy-config.yaml - Voorbeeldconfiguratie voor een lokale LLM-proxy
model_list:
- model_name: code-worker-heavy
litellm_params:
model: deepseek/deepseek-chat
api_base: https://api.deepseek.com/v1
api_key: "os.environ/DEEPSEEK_API_KEY"
- model_name: code-worker-fast
litellm_params:
model: openai/gpt-4o-mini
api_base: https://api.openai.com/v1
api_key: "os.environ/OPENAI_API_KEY"
general_settings:
master_key: "sk-jouw-lokale-proxy-sleutel"
database_url: "sqlite:////pad/naar/proxy_tracking.db"
logging_format: "jsonl"
log_file_path: "/pad/naar/logs/api_access.jsonl"
Start de proxy vervolgens op een poort naar keuze (in voorbeelden aangeduid als PORT):
# Starten van de proxy (voorbeeld)
litellm --config /pad/naar/proxy-config.yaml --port PORT
Een harness is het raamwerk dat de codeeropdracht ontvangt, eventuele bestandsbomen analyseert en de daadwerkelijke prompt construeert. Configureer de harness zo dat deze communiceert met je lokale proxy in plaats van rechtstreeks met de cloudprovider.
In het configuratiebestand van je harness (vaak een YAML- of JSON-bestand in je thuismap) stel je de basis-URL en de API-sleutel in:
# settings.yaml van de harness
model_provider:
name: "custom-proxy"
baseURL: "http://localhost:PORT/v1"
apiKey: "sk-jouw-lokale-proxy-sleutel"
defaultModel: "code-worker-heavy"
Let op de URL-structuur: De meeste SDK's en harnesses voegen zelf automatisch /chat/completions toe aan de basis-URL. Geef daarom uitsluitend het basispad op tot en met /v1 (bijvoorbeeld http://localhost:PORT/v1 of https://jouw-proxy.example/v1). Sluit je per ongeluk af met /chat/completions, dan leidt dit tot 404-foutmeldingen.
Om vanuit een interactieve CLI-sessie soepel werk te delegeren, maak je een klein wrapper-script. Dit script start de harness in zogeheten 'headless' modus (zonder interactieve TUI), stuurt de opdracht door en registreert de uitkomst.
#!/usr/bin/env bash
# delegate-task.sh — Delegeer een afgebakende taak naar het gespecialiseerde model
set -euo pipefail
TASK_DESCRIPTION="$1"
LOG_DIR="/pad/naar/project/logs"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
CORRELATION_ID="task-$(openssl rand -hex 4)"
mkdir -p "$LOG_DIR"
echo "[INFO] Start taak ${CORRELATION_ID}: ${TASK_DESCRIPTION}"
# Aanroep van de headless harness met injectie van het correlatie-ID
HARNESS_TASK_ID="${CORRELATION_ID}" execute-harness --headless \
--endpoint "http://localhost:PORT/v1" \
--task "$TASK_DESCRIPTION" \
> "${LOG_DIR}/${TIMESTAMP}_${CORRELATION_ID}.log" 2>&1
echo "[SUCCESS] Taak ${CORRELATION_ID} afgerond. Zie logboek voor details."
Om te zorgen dat orchestrators zoals Claude Code consistent van deze werkwijze gebruikmaken, definieer je een instructiebestand (een zogeheten skill of prompt-instructie). Plaats dit bestand in de configuratiemap van je orchestrator (bijvoorbeeld .claude/skills/delegatie/SKILL.md of .agent/skills/delegatie.md):
# Richtlijn voor taakdelegatie
Wanneer je een taak tegenkomt die voldoet aan de volgende criteria:
1. Het betreft een opzichzelfstaande module, refactor of testsuite met duidelijke specificaties.
2. De taak vereist substantiële codegeneratie (meer dan 100 regels code).
3. Er zijn geen multimodale invoerbestanden (zoals afbeeldingen of UI-mockups) vereist die het doelmodel niet ondersteunt.
Voer de taak NIET zelf direct uit, maar delegeer deze via het script:
`./scripts/delegate-task.sh "<volledige instructie inclusief context en bestandspaden>"`
Controleer na uitvoering het resultaat via het gegenereerde logbestand en valideer de gewijzigde bestanden.
Het belangrijkste argument voor deze modulaire opzet is inzicht en besparing. Wanneer ontwikkelaars alle codeeropdrachten blindelings naar het standaard frontier-model van hun orchestrator sturen, lopen de kosten bij grote context-windows snel op. Door zwaar werk te routeren naar modellen die geoptimaliseerd zijn voor codeer- en redeneertaken, behoud je een hoge doorvoersnelheid tegen beheersbare kosten.
In het artikel over rate limits en kostenbeheer wordt dieper ingegaan op budgetbewaking en concurrency-limieten bij intensief API-gebruik.
Om het financiële effect inzichtelijk te maken, vergelijken we een hypothetische refactoringstaak. Stel dat een complexe herstructurering van een backend-module 50.000 input-tokens aan context vereist (bestanden, types, eerdere tests) en 4.000 output-tokens aan nieuwe code genereert.
| Modelcategorie (illustratief) | Aard van de taak | Context (Tokens) | Gegenereerd (Tokens) | Kostenfactor |
|---|---|---|---|---|
| Algemeen Frontier Model | Orkestratie & Planning | 50.000 in | 4.000 uit | 100% (Referentie) |
| Gespecialiseerd Redeneermodel | Gedelegeerde Code-uitvoering | 50.000 in | 4.000 uit | ~10% tot 20% |
| Lokaal Open-Weight Model | Boilerplate & Eenvoudige Tests | 50.000 in | 4.000 uit | Enkel stroom/hardware |
In een actieve ontwikkelweek waarin tientallen van dergelijke deelopdrachten draaien, zorgt de routering ervoor dat de totale API-rekening aanzienlijk daalt, zonder dat je inboet op de kwaliteit van de softwarearchitectuur.
Niet elk model blinkt uit in dezelfde discipline. Het voordeel van een centrale proxy is dat je per taaktype dynamisch kunt schakelen. Raadpleeg het overzicht van gespecialiseerde modellen voor code om te bepalen welke modellen op dit moment toonaangevend zijn voor talen als TypeScript, Python, Rust of Go.
Daarnaast helpt de gids over het selecteren van het juiste model per taak bij het opstellen van routeringsregels op basis van redeneerkracht, contextgrootte en latentie. De benchmarks op modelkwaliteit per taak bieden houvast bij het objectief vergelijken van programmeerprestaties.
| Type Programmeertaak | Aanbevolen Modelklasse | Waarom via de router? |
|---|---|---|
| Architectuurontwerp & Planningsfase | Algemeen High-Reasoning Model | Vereist breed abstractievermogen en sterke instructievolging. |
| Implementatie van algoritmes & Refactoring | Gespecialiseerd Codeermodel (bv. DeepSeek, Qwen) | Hoge dichtheid van correcte syntax tegen lage tokentarieven. |
| Unit tests schrijven & Type-definities | Snel, kleiner model of lokaal model | Repetitief werk met lage complexiteit waarbij snelheid telt. |
| Documentatie & Changelogs | Lichtgewicht taalmodel | Minimale redeneerkracht nodig, focus op natuurlijk taalgebruik. |
Het opzetten van een meervoudige keten brengt een aantal praktische aandachtspunten met zich mee:
code-worker-heavy), kan de client een foutmelding geven. Los dit op door de proxy de modelnaam te laten herschrijven of door in het /v1/models-eindpunt van de proxy de bekende namen terug te geven.Een belangrijk aspect van professioneel software ontwikkelen met AI is verantwoording. Door alle verzoeken via een centrale proxy te routeren, bouw je automatisch een JSONL-logbestand op. Dit bestand fungeert als het centrale logboek van je geautomatiseerde ontwikkelstraat.
Een representatieve regel uit zo'n logbestand ziet er als volgt uit:
{
"timestamp": "2026-08-19T14:32:10Z",
"correlation_id": "task-8f3a1b2c",
"orchestrator": "claude-code",
"routed_model": "deepseek-chat",
"provider": "deepseek",
"task_type": "unit-test-generation",
"tokens": {
"prompt_tokens": 14250,
"completion_tokens": 1820,
"total_tokens": 16070
},
"cost_estimate_usd": 0.0052,
"status": "success",
"latency_ms": 4210
}
Met behulp van eenvoudige command-line utilities zoals jq kun je direct analyses uitvoeren op je dagelijkse of wekelijkse verbruik:
# Bereken het totale aantal tokens dat vandaag via de proxy is verwerkt
jq -s 'map(.tokens.total_tokens) | add' /pad/naar/logs/api_access.jsonl
# Toon alle taken die langer dan 10 seconden duurden
jq 'select(.latency_ms > 10000) | {id: .correlation_id, model: .routed_model, duur: .latency_ms}' /pad/naar/logs/api_access.jsonl
Deze modulaire architectuur is met name geschikt voor:
Door de orkestratie los te koppelen van de daadwerkelijke modeluitvoering en daar een intelligente proxy tussen te plaatsen, transformeer je een verzameling losse AI-tools in een schaalbare, kostenbewuste en transparante ontwikkelomgeving.
===EIND===