Status : IMPLEMENTEE
ToolsClient.pollJob() fait du polling toutes les 500ms vers ai-orchestrator — des centaines de requetes HTTP inutilescallback_url) — ulias-org ne les utilise PASFichier : packages/server/src/tools/client.ts
Remplacer pollJob() (polling 500ms) par un systeme callback :
- Map<jobId, {resolve, reject, timer}> pour les jobs en attente
- Quand on cree un job : passer callback_url=http://192.168.1.12:5515/internal/job-callback/{jobId}
- Attendre une Promise qui se resolve quand le callback arrive
- Timeout failsafe : si le callback n'arrive pas apres X secondes, reject
Le callback fonctionne deja — ai-orchestrator envoie des webhooks vers http://192.168.1.12:5510/callback/... (claude-memory). Meme pattern pour ulias-org sur port 5515.
Fichier : packages/server/src/index.ts
Ajouter un endpoint HTTP interne :
.post('/internal/job-callback/:jobId', async ({ params, body }) => {
// Resolve la Promise en attente pour ce jobId
// body = {job_id, status, output_result, error_message, processing_time_ms, gpu_id, ...}
})
ToolsClient.callLLM() — avant/apres chaque appel :
[LLM] → ${model} tools=${N} ctx=${num_ctx} priority=${priority} timeout=${timeout}ms
[LLM] Job ${jobId} created (queue_pos=${pos})
[LLM] Job ${jobId} completed in ${duration}ms (${tokens} tokens, GPU${gpuId})
[LLM] Job ${jobId} TIMEOUT after ${timeout}ms
[LLM] Job ${jobId} FAILED: ${error}
AgentRunner — chaque iteration :
[Agent:${name}] iter=${i}/${max} → LLM call (${messages.length} msgs, ${model})
[Agent:${name}] iter=${i} ← ${toolCalls} tools / ${content.length} chars (${duration}ms)
[Agent:${name}] Tool ${toolName}(${argsPreview}) → ${resultLength} chars (${duration}ms)
Interpreter — routing :
[Interpreter] Routing via ${model} (timeout=${timeout}ms)
[Interpreter] Job ${jobId} → routed to ${agent} (${duration}ms)
Nouveaux events envoyes au frontend via le WebSocket existant :
{type: 'llm_started', data: {model, iteration, messageCount}}
{type: 'llm_completed', data: {model, duration, toolCalls, tokens}}
Le frontend affichera dans le streaming indicator : "LLM qwen3:8b en cours (iter 1/10)..." au lieu de rien.
| Composant | Avant | Apres | Raison |
|---|---|---|---|
| Routing Interpreter | 90s | 180s | Cold start Ollama possible |
| Agent Runner global | 300s | 600s | Laisser le temps aux multi-step |
| callLLM default | 300s | 300s | Inchange (par appel) |
| Suggestions | 15s | 30s | Moins de timeouts inutiles |
| Auto-title | 30s | 30s | OK |
| pollJob fallback | 500ms poll | callback + 300s failsafe | Plus de polling |
| Fichier | Changement |
|---|---|
tools/client.ts |
Callback au lieu de polling, logging, timeouts |
index.ts |
Endpoint /internal/job-callback/:jobId |
agent-runner/index.ts |
Logging iterations + events frontend |
agents/interpreter.ts |
Logging + timeout 180s |