Webhooks en Events

Efficiƫnt omgaan met asynchrone AI-taken via het callback-patroon.

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:

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.

Best Practice: Zorg ervoor dat uw webhook-endpoint idempotent is. Zo voorkomt u dat hetzelfde bericht dubbel verwerkt wordt bij een netwerk hapering. Beheer uw actieve endpoints en roteer uw API keys veilig via het llmnet Hub Dashboard.