Stacks
Wanneer Python en FastAPI in je AI-backend horen
Voor aanroepen naar een taalmodel is TypeScript genoeg. Verwerk je documenten of maak je eigen embeddings, kies dan een FastAPI-service met een getypeerde client.

Python hoort in je stack als je meer doet dan een taalmodel aanroepen: documenten verwerken, eigen embeddings maken, evaluaties draaien of open modellen zelf hosten. Roep je alleen de API van een model aan, dan kan dat prima vanuit je bestaande TypeScript-backend. Is Python wel nodig, dan kies ik FastAPI: een aparte service met een OpenAPI-contract, waaruit je frontend een getypeerde client genereert.
Voor API-aanroepen is TypeScript genoeg
Voor chat, samenvattingen of tool use via een API heb je geen Python nodig. Anthropic heeft officiële SDK's voor Python, TypeScript, C#, Go, Java, PHP en Ruby, met streaming en retries erin.
Blijf in dat geval bij één taal. Een tweede taal betekent een tweede build en een tweede set dependencies om bij te houden, en dat is het pas waard als je er iets voor terugkrijgt. Hoe je AI-functies in een bestaande applicatie inbouwt, los van de taal, staat in het stuk over AI-functies toevoegen aan bestaande software.
Wanneer Python wel loont
Python wordt interessant zodra je met de data zelf aan de slag gaat, want het meeste ML-gereedschap heeft Python als eerste taal. Ik kies voor Python bij:
- het parsen van PDF's, scans en andere lastige documenten;
- een retrieval-pipeline met eigen chunking, embeddings en reranking;
- evaluaties op een vaste dataset, zodat je ziet of een promptwijziging iets verbetert;
- een open model dat je zelf draait in plaats van via een API.
Dat laatste hangt af van je hosting, want een model op een GPU draaien is een vak apart.
Waarom FastAPI
FastAPI is gebouwd op gewone Python-type hints, met Starlette voor het webgedeelte en Pydantic voor de data. Je beschrijft een request en een response met types, en FastAPI valideert de invoer en maakt er een OpenAPI-specificatie van. Op /docs staat meteen interactieve documentatie.
De async-ondersteuning past bij AI-werk. Een request dat op een taalmodel wacht, doet vooral niets, en met async handelt de server intussen andere requests af. Sinds versie 0.135.0 heeft FastAPI ook ingebouwde ondersteuning voor Server-Sent Events, waarmee je tokens naar de browser streamt.
Pydantic komt ook van pas bij gestructureerde output. Je definieert één keer het schema dat je van het model verwacht, en je valideert het antwoord daartegen voordat je er iets mee doet.
Django blijft een goede keuze als je ook een admin en een ORM wilt. Voor een interne AI-service is dat vaak meer dan je nodig hebt.
Het contract tussen TypeScript en Python
De koppeling met je frontend loopt via de OpenAPI-specificatie die FastAPI genereert. Daaruit maak je een TypeScript-client. De FastAPI-documentatie raadt daarvoor Hey API aan (@hey-api/openapi-ts). Met een eigen generate_unique_id_function krijg je nette functienamen in plaats van lange gegenereerde namen.
Mijn advies is om die generatie in CI te laten draaien. Verandert de specificatie en is de client niet opnieuw gegenereerd, dan faalt de build. Zo zie je een breaking change in de Python-service in je TypeScript-code, voordat een gebruiker er last van heeft. Boris schreef meer over API-first ontwerpen.
Python achter je TypeScript-backend
In de opzet die ik meestal adviseer, praat de Next.js-frontend met je TypeScript-backend, en die regelt authenticatie en de database. De Python-service draait daarachter en doet alleen het AI-werk. Zo regel je authenticatie op één plek. Geef de Python-service daarom geen publieke URL. Alleen de TypeScript-backend kan erbij, bijvoorbeeld via een intern netwerk in Docker Compose of in je cloudomgeving.
Langlopend werk, zoals een map met honderd PDF's verwerken, stop je niet in een HTTP-request. Zet het in een queue, laat een worker het oppakken en geef de frontend een status terug. Een antwoord streamen kan wel binnen een request, met Server-Sent Events door de hele keten heen.
Valkuilen in productie
Blokkerende code in een async def-functie houdt de hele server op. FastAPI draait een gewone def-functie in een aparte threadpool, dus gebruik die voor bibliotheken zonder await. Zwaar rekenwerk, zoals lokaal embeddings berekenen, hoort in een aparte worker.
Pin je dependencies met een lockfile, bijvoorbeeld met uv of Poetry, en draai mypy of pyright in CI. Dan heeft de Python-kant dezelfde discipline als je TypeScript-code. ML-bibliotheken maken Docker-images groot, dus houd de image van de API klein en zet zware modellen in een eigen service.
Log per request welk model je aanriep, hoeveel tokens het kostte en hoe lang het duurde. Zonder die gegevens weet je niet waar de kosten en de wachttijd vandaan komen.
Zorg ten slotte dat minstens twee mensen in het team de Python-service kunnen onderhouden. Eén Python-developer in een TypeScript-team is een risico zodra die op vakantie gaat. Neem die tweede persoon dus mee als je het team plant.
Bronnen
Veelgestelde vragen
Heb ik Python nodig om AI-functies te bouwen?
Niet als je alleen de API van een taalmodel aanroept. Daarvoor zijn officiële SDK's voor TypeScript en andere talen. Python loont als je documenten verwerkt, eigen embeddings maakt, evaluaties draait of zelf modellen host.
Hoe koppel je een FastAPI-backend aan een TypeScript-frontend?
FastAPI genereert een OpenAPI-specificatie. Daaruit maak je een getypeerde TypeScript-client, bijvoorbeeld met Hey API. Laat die generatie in CI draaien, dan vallen wijzigingen in het contract meteen op.
Kan FastAPI antwoorden van een taalmodel streamen?
Ja. FastAPI ondersteunt async en heeft sinds versie 0.135.0 ingebouwde ondersteuning voor Server-Sent Events. Daarmee stuur je tokens door naar de browser terwijl het model nog schrijft.
Over de auteur

Barry Willems
Head of AI
Barry is Head of AI bij Brainpower Group en hoort bij het team in Servië. Hij is full-stack developer.
Meer van Barry




