Files
Momento/memento-note/lib/ai/utils/clean-ai-response.ts
Antigravity a623454347
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m32s
CI / Deploy production (on server) (push) Has been skipped
perf: memo GridCard, fuse save fns, fix slash tab active color
2026-06-14 14:06:05 +00:00

44 lines
1.5 KiB
TypeScript

/**
* Utilitaires de nettoyage des réponses IA
* Certains modèles (DeepSeek-R1, MiniMax, etc.) génèrent des blocs <think>
* qui corrompent le parsing JSON si non supprimés.
*/
/**
* Supprime les blocs <think>...</think> d'une réponse IA.
* Gère aussi les blocs non fermés (balise ouvrante sans fermeture).
* Supprime ensuite les fences Markdown (```json ... ```) éventuelles.
*/
export function cleanAIJsonResponse(text: string): string {
// 1. Supprimer les blocs <think>...</think> fermés (greedy-safe)
let cleaned = text.replace(/<think>[\s\S]*?<\/think>/gi, '').trim()
// 2. Si un <think> reste (non fermé), chercher le premier '[' ou '{'
if (/<think>/i.test(cleaned)) {
const jsonStart = cleaned.search(/[\[{]/)
if (jsonStart !== -1) {
cleaned = cleaned.slice(jsonStart)
} else {
// Aucun JSON trouvé après le think → vider pour provoquer une erreur propre
cleaned = ''
}
}
// 3. Supprimer les fences Markdown
cleaned = cleaned.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '').trim()
return cleaned
}
/**
* Supprime les blocs <think> d'une réponse texte libre (non-JSON).
*/
export function cleanAITextResponse(text: string): string {
let cleaned = text.replace(/<think>[\s\S]*?<\/think>/gi, '').trim()
if (/<think>/i.test(cleaned)) {
// Supprimer tout ce qui précède la fermeture du think ou jusqu'à la fin
cleaned = cleaned.replace(/<think>[\s\S]*/i, '').trim()
}
return cleaned
}