Date : 11/02/2026 Status : IMPLEMENTEE Scope : ai-orchestrator + connectors-api (2 repos) Impact : Non-breaking, ajout de champs
L'ai-orchestrator retourne gpu_id, processing_time_ms, vram_used_mb pour chaque job.
Connectors-api ne remonte aucune de ces infos au frontend. La colonne metadata JSONB existe deja sur ai_messages (migration 015).
main.py) - Webhook payloadFichier : app/main.py ligne ~1423
Modif : Ajouter gpu_id dans le payload webhook
# AVANT
payload = {
"job_id": job_id,
"status": job_data.get("status"),
"tool_id": job_data.get("tool_id"),
...
"processing_time_ms": job_data.get("processing_time_ms"),
}
# APRES
payload = {
"job_id": job_id,
"status": job_data.get("status"),
"tool_id": job_data.get("tool_id"),
...
"processing_time_ms": job_data.get("processing_time_ms"),
"gpu_id": job_data.get("gpu_id"), # AJOUT
"vram_used_mb": job_data.get("vram_used_mb"), # AJOUT
}
ai.ts - pollJobResult()Fichier : src/services/ai.ts ligne ~93
Modif : Retourner les metadata GPU en plus de outputResult
// Type de retour enrichi
Promise<{
success: boolean;
response?: string;
outputResult?: any;
gpuId?: number;
processingTimeMs?: number;
vramUsedMb?: number;
error?: string;
}>
// Dans le bloc status.status === 'completed' :
return {
success: true,
response: ...,
outputResult,
gpuId: status.gpu_id ?? undefined,
processingTimeMs: status.processing_time_ms ?? undefined,
vramUsedMb: status.vram_used_mb ?? undefined,
};
aiChat.ts - executeToolCall() ai_jobFichier : src/services/aiChat.ts ligne ~676
Modif : Stocker les metadata GPU dans le message assistant via metadata JSONB
Apres le pollJobResult(), construire un objet metadata :
const jobMeta = {
gpu_id: result.gpuId,
processing_time_ms: result.processingTimeMs,
vram_used_mb: result.vramUsedMb,
};
Ce metadata sera retourne avec le contenu pour stockage dans ai_messages.metadata.
intentExecutor.ts - executeAiJobIntent()Fichier : src/services/intentExecutor.ts ligne ~275
Modif : Meme pattern, inclure les metadata dans le retour
return {
success: true,
data: output,
metadata: {
gpu_id: result.gpuId,
processing_time_ms: result.processingTimeMs,
vram_used_mb: result.vramUsedMb,
},
formattedData: ...
};
index.ts - Webhook handlerFichier : src/index.ts ligne ~4944
Modif : Extraire gpu_id, processing_time_ms, vram_used_mb du body webhook et les stocker dans ai_messages.metadata
const { job_id, status: jobStatus, output_result, error_message,
gpu_id, processing_time_ms, vram_used_mb } = body as any;
// Dans l'insert ai_messages :
await supabase.insert('ai_messages', {
conversation_id,
role: 'assistant',
content: aiJobResponse,
model: 'background',
duration_ms: processing_time_ms || 0,
metadata: { gpu_id, processing_time_ms, vram_used_mb },
});
aiChat.ts - Stockage metadata dans sendMessage/streamDans les endroits ou le message assistant est insere en DB (apres un ai_job), inclure metadata: jobMeta dans l'insert.
const GPU_NAMES: Record<number, string> = {
0: 'RTX 3090',
1: 'RTX 2070 Super',
};
Le frontend pourra utiliser metadata.gpu_id + ce mapping pour afficher un badge GPU.