V1.23.24 Externalisation des prompts et évolutions des collaborateurs

This commit is contained in:
2026-09-11 20:25:48 +00:00
parent 05df1c5a28
commit bac56b85a0
17 changed files with 787 additions and 162 deletions
+15 -53
View File
@@ -74,6 +74,7 @@
session_start();
header('Content-Type: application/json; charset=utf-8');
require __DIR__ . '/db.php';
require __DIR__ . '/moteur_prompts.php';
if (empty($_SESSION['USR_Code'])) {
http_response_code(401);
@@ -236,59 +237,20 @@ $listeActions = $actionsDisponibles
? implode(', ', array_map(fn($a) => $a['ACT_Code'] . ' = ' . $a['ACT_Libelle'], $actionsDisponibles))
: '(aucune action de référence configurée)';
$promptSysteme = <<<PROMPT
Tu extrais des informations de contact professionnel (prospection commerciale
d'un CRM français) à partir d'une dictée vocale libre en français, brute et
parfois hésitante (hésitations, reprises, "euh", phrases inachevées).
Règles impératives :
- N'invente RIEN. Un champ non mentionné clairement, ou ambigu, reste null.
- Ne devine jamais une orthographe que tu ne peux pas déduire du texte fourni.
- CNT_Statut : uniquement l'un de ces codes exacts, ou null si aucun statut
n'est évoqué : {$listeStatuts}
- Profession : compare ce qui est dicté à cette liste existante (id = libellé) :
{$listeProfessions}
Si une correspondance claire existe, renvoie profession_existante_id (et
laisse profession_nouvelle_libelle à null). Sinon, si une profession est
bien mentionnée mais absente de la liste, renvoie son libellé dans
profession_nouvelle_libelle (et laisse profession_existante_id à null). Si
aucune profession n'est mentionnée, les deux restent null.
- CNT_Notes : tout ce qui est dit et utile au contact mais qui ne correspond
à aucun champ structuré ci-dessus (contexte de rencontre, centres
d'intérêt, demande explicite comme "envoyer la doc", remarques...) — un
résumé concis en français, pas nécessairement mot pour mot. Ne recopie pas
dans les notes une information déjà correctement placée dans un champ.
- Un numéro de téléphone fixe va dans CNT_Tel, un mobile dans CNT_Portable ;
si le type n'est pas précisé et qu'un seul numéro est dicté, mets-le dans
CNT_Tel.
- CNT_Mail : une adresse mail ne contient JAMAIS d'accent (é, è, à, ç, ï...).
Si la transcription dictée en laisse apparaître un dans ce qui doit devenir
une adresse mail, retire l'accent (é→e, è→e, à→a...) plutôt que de le
recopier tel quel — ne jamais produire une adresse mail accentuée.
- assistant_id : l'assistant explicitement nommé par la dictée, parmi cette
liste (id = nom) : {$listeAgents}
Ne renvoie un id que si un de ces noms (ou une de ses variantes tolérées)
est clairement prononcé. Aucun assistant nommé → null, ne suppose JAMAIS un
assistant par défaut.
- actions : identifie chaque action explicitement demandée dans la dictée
(ex. "il faut lui envoyer la doc", "envoyer une proposition de tarif",
"ajoute ce contact"...). Compare à cette liste existante (code = libellé) :
{$listeActions}
Pour chaque action reconnue, renvoie action_existante_code si elle
correspond clairement à un code de cette liste (action_nouvelle_libelle
reste null), sinon renvoie son libellé en français dans
action_nouvelle_libelle (action_existante_code reste null). Un tableau vide
si aucune action n'est explicitement demandée — ne déduis jamais une action
qui ne serait qu'implicite ou probable.
La création/l'ajout du contact lui-même ("ajoute ce contact", "crée-le",
"enregistre ce contact"...) est une action à part entière au même titre
que les autres, même si elle n'a pas de code dans la liste ci-dessus —
utilise alors exactement le libellé "Ajouter le contact" dans
action_nouvelle_libelle (formulation fixe, pour rester comparable d'une
dictée à l'autre). Quand elle est demandée, place-la TOUJOURS en premier
dans le tableau actions, avant les autres actions éventuelles (envoyer une
doc, etc.) : c'est en général la première chose voulue chronologiquement.
PROMPT;
// Texte sorti du code le 11 septembre 2026 — voir moteur_prompts.php pour le
// texte par défaut/la table ASP_Prompts, bo_prompts.html pour l'édition.
try {
$promptSysteme = chargerPromptSysteme($pdo, 'CONTACT_IA_INTERPRETE', [
'{{LISTE_STATUTS}}' => $listeStatuts,
'{{LISTE_PROFESSIONS}}' => $listeProfessions,
'{{LISTE_AGENTS}}' => $listeAgents,
'{{LISTE_ACTIONS}}' => $listeActions,
]);
} catch (Throwable $e) {
http_response_code(500);
echo json_encode(['error' => 'Prompt système indisponible : ' . $e->getMessage()]);
exit;
}
// -------- Appel OpenAI --------
$corpsRequete = [