['entree' => 1.0, 'sortie' => 5.0], 'claude-sonnet-5' => ['entree' => 2.0, 'sortie' => 10.0], 'claude-opus-5' => ['entree' => 5.0, 'sortie' => 25.0], 'claude-fable-5-1' => ['entree' => 10.0, 'sortie' => 50.0], ]; /** * Enregistre un appel réel à l'API Anthropic. $usage est le champ "usage" * tel que renvoyé par l'API (input_tokens, output_tokens, * cache_creation_input_tokens, cache_read_input_tokens — ces deux derniers * absents/à 0 si le cache n'a pas été sollicité ce tour-ci). Jamais * bloquant : une erreur ici ne doit jamais faire échouer le dialogue * lui-même, seulement être signalée dans les journaux serveur. */ function journaliserAppelIA(PDO $pdo, string $origine, ?int $agentIncr, ?int $missionIncr, string $modele, array $usage): void { $entreeFrais = (int) ($usage['input_tokens'] ?? 0); $entreeCache = (int) ($usage['cache_read_input_tokens'] ?? 0); $ecritureCache = (int) ($usage['cache_creation_input_tokens'] ?? 0); $sortie = (int) ($usage['output_tokens'] ?? 0); $tarif = TARIFS_IA[$modele] ?? TARIFS_IA['claude-sonnet-5']; $cout = ( $entreeFrais / 1_000_000 * $tarif['entree'] + $ecritureCache / 1_000_000 * $tarif['entree'] * 1.25 + $entreeCache / 1_000_000 * $tarif['entree'] * 0.1 + $sortie / 1_000_000 * $tarif['sortie'] ); try { $pdo->prepare( 'INSERT INTO ASP_AppelsIA (AIA_Origine, AIA_AgentIncr, AIA_MissionIncr, AIA_Modele, AIA_TokensEntreeFrais, AIA_TokensEntreeCache, AIA_TokensEcritureCache, AIA_TokensSortie, AIA_CoutEstimeUsd) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' )->execute([$origine, $agentIncr, $missionIncr, $modele, $entreeFrais, $entreeCache, $ecritureCache, $sortie, $cout]); } catch (PDOException $e) { error_log('ASPIC journal_ia : échec de journalisation — ' . $e->getMessage()); } }