Waarom Asynchrone Verwerking?
Het genereren van output via geavanceerde AI-modellen vergt aanzienlijke rekenkracht. Zeker wanneer dit gepaard gaat met het verwerken van grote hoeveelheden context of het doorzoeken van vector databases (RAG), kan een antwoord even op zich laten wachten. Een HTTP-verzoek dat seconden of minuten open blijft staan, is onwenselijk. Het blokkeert resources en verhoogt de kans op netwerk time-outs. Om uw applicatie responsief te houden, maakt onze API voor de zwaarste rekentaken gebruik van asynchrone verwerking.
Statuspolling versus Webhooks
Wanneer u een asynchrone taak start, krijgt u direct een task_id terug. Er zijn twee manieren om het uiteindelijke resultaat te verkrijgen:
- Statuspolling: Uw applicatie vraagt periodiek (bijv. elke 5 seconden) via een apart endpoint de status van de taak op. Dit leidt tot veel onnodige netwerkverzoeken en inefficiƫnt gebruik van bandbreedte.
- Webhooks (Aanbevolen): Uw applicatie levert vooraf een webhook-URL aan. Zodra de inferentie of taak is afgerond, "pusht" onze server de resultaten direct via een POST-verzoek naar uw server. Dit bespaart rekenkracht en levert het resultaat exact op het moment dat het beschikbaar is.
Het Callback-patroon in de Praktijk
Het implementeren van een robuuste webhook-integratie is verrassend eenvoudig en bestaat uit twee stappen.
1. De Taak Initialiseren
Bij het versturen van uw prompt geeft u een callback_url mee in de body. In dit voorbeeld illustreren we een complex verzoek aan een DeepSeek model in combinatie met RAG.
import requests
api_url = "https://api.llmnet.nl/v1/completions/async"
payload = {
"model": "deepseek-coder-v2-instruct",
"messages": [{"role": "user", "content": "Analyseer de bijgevoegde documentatie..."}],
"use_rag": True,
"callback_url": "https://uw-applicatie.nl/webhooks/llm-ready"
}
headers = {"Authorization": "Bearer sk-dummy-key-xxxx"}
response = requests.post(api_url, json=payload, headers=headers)
print(response.json())
# Output: {"task_id": "req_a8b9c0d1e2", "status": "processing"}
2. Het Event Ontvangen
U stelt op uw eigen server een POST-endpoint beschikbaar. Zodra de payload arriveert, verwerkt u de data en stuurt u direct een HTTP 200 (OK) response terug.
from flask import Flask, request
app = Flask(__name__)
@app.route('/webhooks/llm-ready', methods=['POST'])
def handle_webhook():
event = request.json
# Controleer de status van de afgeronde taak
if event.get('status') == 'completed':
# Haal de gegenereerde tekst of vectoren op
resultaat = event['data']['choices'][0]['message']['content']
# Voer uw bedrijfslogica uit, zoals opslaan of websocket broadcast
print(f"Taak {event['task_id']} is succesvol afgerond!")
return "OK", 200 # Voorkom time-outs door snel te antwoorden
Betrouwbaarheid en Retries
Om te garanderen dat geen enkele inferentie verloren gaat, hebben we een failsafe mechanisme ingebouwd. Indien uw applicatie geen HTTP 200-statuscode retourneert of onbereikbaar is wanneer wij de webhook sturen, maken wij gebruik van een exponential backoff strategie. Wij proberen het event na 1 minuut opnieuw af te leveren, dan na 5 minuten, en vervolgens elk uur tot een maximum van 24 uur.