{"openapi":"3.1.0","info":{"title":"Cerveau memoire","version":"0.1.0"},"paths":{"/v1/memories":{"post":{"summary":"Ingest","operationId":"ingest_v1_memories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memories/search":{"get":{"summary":"Search","operationId":"search_v1_memories_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"Question / requete en langage naturel","title":"Q"},"description":"Question / requete en langage naturel"},{"name":"k","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":5,"title":"K"}},{"name":"contexte","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtre contexte (travail/prive)","title":"Contexte"},"description":"Filtre contexte (travail/prive)"},{"name":"contexte_conversation","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"description":"Derniers tours de la conversation en cours (court). Enrichit l'embedding et desambiguise les mots banals de la question (« espace » dans une discussion design = mise en page, pas le caractere).","title":"Contexte Conversation"},"description":"Derniers tours de la conversation en cours (court). Enrichit l'embedding et desambiguise les mots banals de la question (« espace » dans une discussion design = mise en page, pas le caractere)."},{"name":"synthese","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Demander une reponse REDIGEE en plus des souvenirs bruts (cf. synthese.py). true = le Cerveau tranche entre une reponse sourcee et un « information insuffisante » + questions de clarification, rendus dans le champ `synthese` ; false = jamais. Non precise : le canal decide (cf. SYNTHESE_CANAUX_AUTO). Coute un appel modele borne en temps — a demander quand la question merite une reponse, pas a chaque tour d'un agent.","title":"Synthese"},"description":"Demander une reponse REDIGEE en plus des souvenirs bruts (cf. synthese.py). true = le Cerveau tranche entre une reponse sourcee et un « information insuffisante » + questions de clarification, rendus dans le champ `synthese` ; false = jamais. Non precise : le canal decide (cf. SYNTHESE_CANAUX_AUTO). Coute un appel modele borne en temps — a demander quand la question merite une reponse, pas a chaque tour d'un agent."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RechercheResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memories/exchange":{"post":{"summary":"Distiller Echange","description":"Greffier : distille un échange terminé en 0 à 3 faits durables (au lieu de stocker le\nbrut) et met à jour la fiche projet. À appeler par le daemon à la place de la note brute :\nla curation vit côté Cerveau, plus aucun agent interne côté daemon (cf. curation.py).","operationId":"distiller_echange_v1_memories_exchange_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Distiller Echange V1 Memories Exchange Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projets/{projet}/fiche":{"get":{"summary":"Get Fiche","description":"Fiche projet curée (markdown) — contexte non déductible du dépôt, maintenu par le\ngreffier. `fiche` = null si aucune fiche n'existe encore pour ce projet.","operationId":"get_fiche_v1_projets__projet__fiche_get","parameters":[{"name":"projet","in":"path","required":true,"schema":{"type":"string","title":"Projet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fiche V1 Projets  Projet  Fiche Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Fiche","description":"Écrit/remplace la fiche projet (édition manuelle / dashboard).","operationId":"put_fiche_v1_projets__projet__fiche_put","parameters":[{"name":"projet","in":"path","required":true,"schema":{"type":"string","title":"Projet"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FicheRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Fiche V1 Projets  Projet  Fiche Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Fiche","description":"Supprime la fiche projet.","operationId":"delete_fiche_v1_projets__projet__fiche_delete","parameters":[{"name":"projet","in":"path","required":true,"schema":{"type":"string","title":"Projet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Fiche V1 Projets  Projet  Fiche Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/carte":{"get":{"summary":"Carte","description":"Carte de base (Couche 3) — index des sujets connus. `complet=1` rend l'aperçu de\nchaque sujet en entier (affichage dashboard) ; sinon version courte injectée au LLM.","operationId":"carte_v1_carte_get","parameters":[{"name":"complet","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Complet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Carte V1 Carte Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memories/{souvenir_id}":{"get":{"summary":"Get Memory","operationId":"get_memory_v1_memories__souvenir_id__get","parameters":[{"name":"souvenir_id","in":"path","required":true,"schema":{"type":"string","title":"Souvenir Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SouvenirOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Memory","description":"Suppression DÉFINITIVE d'un souvenir (liens, vecteur, ligne) — destruction, pas\noubli : pour un oubli réversible, préférer ``POST /memories/{id}/statut`` avec\n``perime``. Même chemin que l'outil MCP `oublier_souvenir` et le bouton 1-clic du\ndashboard.","operationId":"delete_memory_v1_memories__souvenir_id__delete","parameters":[{"name":"souvenir_id","in":"path","required":true,"schema":{"type":"string","title":"Souvenir Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Memory V1 Memories  Souvenir Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memories/{souvenir_id}/statut":{"post":{"summary":"Set Memory Status","description":"Change le statut d'un souvenir SANS le détruire. ``perime`` = OUBLI DOUX : le\nsouvenir devient dormant (hors du rappel normal, mais gardé en base et retrouvable en\nhistorique), pas effacé — un souvenir qui s'estompe, pas une lésion. ``actif``\nréactive, ``rejete`` marque une piste écartée (avec ``motif``). Pendant REST du bouton\nstatut du dashboard ; complète le hard DELETE (destruction définitive).","operationId":"set_memory_status_v1_memories__souvenir_id__statut_post","parameters":[{"name":"souvenir_id","in":"path","required":true,"schema":{"type":"string","title":"Souvenir Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SouvenirStatutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Memory Status V1 Memories  Souvenir Id  Statut Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills":{"get":{"summary":"List Skills","description":"Sans `q` ni en-tête projet : mode gestion (dashboard), toutes les skills. Avec `q`\net/ou `X-Cerveau-Project` : mode RAPPEL — mêmes règles de pertinence que le canal MCP\n(toutes les `global`, plus les `projet` dont le projet ou un sujet matche la tâche),\npour que les clients REST (daemon Paseo) puissent injecter les procédures utiles.","operationId":"list_skills_v1_skills_get","parameters":[{"name":"statut","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statut"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tache en cours : filtre les skills pertinentes","title":"Q"},"description":"Tache en cours : filtre les skills pertinentes"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillOut"},"title":"Response List Skills V1 Skills Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills/{skill_id}":{"get":{"summary":"Detail Skill","operationId":"detail_skill_v1_skills__skill_id__get","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Skill","operationId":"delete_skill_v1_skills__skill_id__delete","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Skill V1 Skills  Skill Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills/{skill_id}/activate":{"post":{"summary":"Activate Skill","operationId":"activate_skill_v1_skills__skill_id__activate_post","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Activate Skill V1 Skills  Skill Id  Activate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills/{skill_id}/archive":{"post":{"summary":"Archive Skill","operationId":"archive_skill_v1_skills__skill_id__archive_post","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Skill V1 Skills  Skill Id  Archive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/coffre-backfill":{"post":{"summary":"Coffre Backfill","description":"Lance (en tâche de fond, dans CE processus) l'extraction des secrets sur les\ndiscussions déjà mémorisées. Réutilise l'embedder de l'app pour ne pas saturer la RAM.","operationId":"coffre_backfill_v1_admin_coffre_backfill_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Coffre Backfill V1 Admin Coffre Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Coffre Backfill Status","description":"État du dernier backfill du coffre (en cours / dernier bilan).","operationId":"coffre_backfill_status_v1_admin_coffre_backfill_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Coffre Backfill Status V1 Admin Coffre Backfill Get"}}}}}}},"/v1/admin/reclasser-skills":{"post":{"summary":"Reclasser Skills","description":"(Re)classe la portée + les catégories des skills existants (LLM seul). En tâche de\nfond, dans CE processus. `force=true` reclasse tout, sinon seulement les non-classés.","operationId":"reclasser_skills_v1_admin_reclasser_skills_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reclasser Skills V1 Admin Reclasser Skills Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Reclasser Skills Status","description":"État du dernier reclassement des skills (en cours / dernier bilan).","operationId":"reclasser_skills_status_v1_admin_reclasser_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reclasser Skills Status V1 Admin Reclasser Skills Get"}}}}}}},"/v1/admin/backfill-dates-origine":{"post":{"summary":"Backfill Dates Origine","description":"Rattrape la date d'ORIGINE des souvenirs déjà en mémoire (cf. temporel).\n\nSans ce rattrapage, « ce que X m'a envoyé le 12 juillet » ne vaut que pour ce qui a été\nappris après la mise en service. 100 % SQL + regex (ni LLM ni embedding), aucune\nréindexation, synchrone et borné par `limit` — rejouable tant que `reste > 0`.\nVérifier d'abord avec `?dry_run=true`.","operationId":"backfill_dates_origine_v1_admin_backfill_dates_origine_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"default":2000,"title":"Limit"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backfill Dates Origine V1 Admin Backfill Dates Origine Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/regen-generiques":{"get":{"summary":"Regen Generiques Status","description":"État de la dernière régénération des vues d'ensemble.","operationId":"regen_generiques_status_v1_admin_regen_generiques_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Regen Generiques Status V1 Admin Regen Generiques Get"}}}}}},"post":{"summary":"Regen Generiques","description":"Régénère les vues d'ensemble (généiques) COMPLETES à partir de tous les résumés/faits\nde chaque thème. En tâche de fond, dans CE processus (réutilise les modèles chargés).","operationId":"regen_generiques_v1_admin_regen_generiques_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Regen Generiques V1 Admin Regen Generiques Post"}}}}}}},"/v1/admin/dedup-discussions":{"post":{"summary":"Dedup Discussions","description":"Fusionne les discussions DÉJÀ enregistrées qui décrivent le même sujet (résumé très\nproche) dans la plus ancienne — une seule carte par sujet. En tâche de fond, dans CE\nprocessus. Idempotent : relançable sans risque.\n\n`?dry_run=true` : ne modifie rien, renvoie tout de suite les regroupements PROPOSÉS\n(à vérifier sur données réelles avant la fusion destructive).","operationId":"dedup_discussions_v1_admin_dedup_discussions_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dedup Discussions V1 Admin Dedup Discussions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Dedup Discussions Status","description":"État de la dernière déduplication des discussions.","operationId":"dedup_discussions_status_v1_admin_dedup_discussions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dedup Discussions Status V1 Admin Dedup Discussions Get"}}}}}}},"/v1/admin/dedup-sessions-id":{"post":{"summary":"Dedup Sessions Id","description":"Fusionne les sessions qui sont la MÊME discussion stockée sous deux formats de clé\n(UUID préfixé du client « claude-code:<uuid> » vs UUID nu) dans la plus ancienne.\nDéterministe, zéro faux positif (aucune comparaison de texte). En tâche de fond, dans\nCE processus. `?dry_run=true` : renvoie les collisions proposées sans rien modifier.","operationId":"dedup_sessions_id_v1_admin_dedup_sessions_id_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dedup Sessions Id V1 Admin Dedup Sessions Id Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Dedup Sessions Id Status","description":"État de la dernière déduplication des sessions par identifiant.","operationId":"dedup_sessions_id_status_v1_admin_dedup_sessions_id_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dedup Sessions Id Status V1 Admin Dedup Sessions Id Get"}}}}}}},"/v1/admin/purge-discussions":{"post":{"summary":"Purge Discussions","description":"Purge les discussions parasites dont le fil brut commence par `prefixe` (défaut :\nla sonde du watchdog auth). Match déterministe par préfixe — TOUJOURS vérifier\n`?dry_run=true` avant la passe destructive. Synchrone (sélection ciblée, rapide).","operationId":"purge_discussions_v1_admin_purge_discussions_post","parameters":[{"name":"prefixe","in":"query","required":false,"schema":{"type":"string","default":"👤 reponds uniquement: ok","title":"Prefixe"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Purge Discussions V1 Admin Purge Discussions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/purge-brut":{"post":{"summary":"Purge Brut","description":"Ménage du mot-à-mot déjà digéré (cf. cycle_vie.py) : le brut est oublié quelques\njours après une synthèse RÉUSSIE, jamais avant, jamais en cas de doute.\n\n⚠ Contrairement aux autres passes d'administration, `dry_run` vaut **true par défaut**\nici : un brut effacé est IRRÉCUPÉRABLE. La suppression réelle demande donc DEUX gestes\nexplicites : `?dry_run=false&confirmer=oui`. `limite` borne la passe (nettoyage du parc\npar lots : on peut commencer par 50, vérifier, puis continuer).\n\nL'aperçu renvoie le compte de ce qui serait effacé, les octets libérables et le détail\ndes fils CONSERVÉS avec leur motif (synthèse en échec, résumé manquant, révision\nattendue…) — c'est cette liste qu'on lit AVANT d'allumer quoi que ce soit.","operationId":"purge_brut_v1_admin_purge_brut_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"confirmer","in":"query","required":false,"schema":{"type":"string","default":"","title":"Confirmer"}},{"name":"limite","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":1},{"type":"null"}],"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Purge Brut V1 Admin Purge Brut Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Purge Brut Etat","description":"État du cycle de vie du brut : réglages en vigueur, volume encore en base, ce qui\nest mûr, et le journal des derniers oublis (affiché dans l'onglet Santé).","operationId":"purge_brut_etat_v1_admin_purge_brut_get","parameters":[{"name":"journal","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":0,"default":50,"title":"Journal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Purge Brut Etat V1 Admin Purge Brut Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/audit-rappel":{"post":{"summary":"Audit Rappel Run","description":"Lance À LA DEMANDE un contrôle du taux de rappel : on tire au sort de vrais\nsouvenirs (tous canaux, tous projets), on en dérive une question naturelle et on\nvérifie qu'ils ressortent d'un VRAI rappel. En tâche de fond, dans CE processus\n(réutilise les modèles déjà chargés). Sinon lancé chaque nuit.\n\n`graine` fige l'échantillon : même graine = mêmes souvenirs et mêmes questions, ce\nqui permet une comparaison avant/après honnête (ex. autour d'une réindexation).","operationId":"audit_rappel_run_v1_admin_audit_rappel_post","parameters":[{"name":"taille","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"title":"Taille"}},{"name":"graine","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Graine"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Rappel Run V1 Admin Audit Rappel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Audit Rappel Status","description":"Bilan du dernier contrôle : taux global, ventilation par canal et par type,\nsouvenirs « invisibles au rappel », alertes de dégradation.","operationId":"audit_rappel_status_v1_admin_audit_rappel_get","parameters":[{"name":"cas","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":0,"default":40,"title":"Cas"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Rappel Status V1 Admin Audit Rappel Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/reindex-enrichi":{"post":{"summary":"Reindex Enrichi Run","description":"Rejoue l'indexation des souvenirs existants avec l'en-tête de métadonnées (projet,\nsujets, type, personne, date). Aucune re-synthèse, aucun appel LLM, aucun texte\nmodifié : seuls les vecteurs sont refaits. En tâche de fond, dans CE processus\n(modèles déjà chargés). Rejouable : ce qui est déjà à jour n'est pas refait.","operationId":"reindex_enrichi_run_v1_admin_reindex_enrichi_post","parameters":[{"name":"limite","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limite"}},{"name":"lot","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Lot"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reindex Enrichi Run V1 Admin Reindex Enrichi Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Reindex Enrichi Status","description":"Avancement de la réindexation en cours (ou bilan de la dernière).","operationId":"reindex_enrichi_status_v1_admin_reindex_enrichi_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reindex Enrichi Status V1 Admin Reindex Enrichi Get"}}}}}}},"/v1/admin/passages-migration":{"post":{"summary":"Passages Migration Run","description":"Découpe le mot-à-mot existant en passages et les indexe, en tâche de fond dans CE\nprocessus (modèles déjà chargés : jamais un second BGE-M3). Rejouable sans doublon :\nce qui est à jour est sauté, une passe interrompue reprend, une conversation arrivée\nentre-temps est rattrapée. `dry_run` compte sans rien écrire.","operationId":"passages_migration_run_v1_admin_passages_migration_post","parameters":[{"name":"limite","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limite"}},{"name":"lot","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"title":"Lot"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Passages Migration Run V1 Admin Passages Migration Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Passages Migration Status","description":"Avancement de la migration en cours (ou rapport chiffré de la dernière), plus les\ncompteurs relus dans la base et dans l'index.","operationId":"passages_migration_status_v1_admin_passages_migration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Passages Migration Status V1 Admin Passages Migration Get"}}}}}},"delete":{"summary":"Passages Migration Purge","description":"RETOUR EN ARRIÈRE : efface tous les passages et leur index. L'ancienne mémoire\nn'est pas touchée et les conversations d'origine restent intactes.","operationId":"passages_migration_purge_v1_admin_passages_migration_delete","parameters":[{"name":"garder_index","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Garder Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Passages Migration Purge V1 Admin Passages Migration Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/passages/recherche":{"get":{"summary":"Passages Recherche","description":"Recherche hybride sur les PASSAGES : sens + mots exacts, fraîcheur qui départage.\n\nRend des extraits datés et situés avec toute leur provenance (conversation, fil, rang,\nbornes à surligner, source, projet), le total réel des correspondances à côté du\nnombre montré, et le temps passé à chaque étape. 100 % local : aucune génération de\ntexte, aucun appel à un service externe — la route répond avec tout LLM coupé.","operationId":"passages_recherche_v1_passages_recherche_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"Question / requête en langage naturel","title":"Q"},"description":"Question / requête en langage naturel"},{"name":"k","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":8,"title":"K"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provenance (claude-code, whatsapp…)","title":"Source"},"description":"Provenance (claude-code, whatsapp…)"},{"name":"projet","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projet"}},{"name":"discussion_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discussion Id"}},{"name":"depuis","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Date d'origine minimale (ISO)","title":"Depuis"},"description":"Date d'origine minimale (ISO)"},{"name":"jusqu_a","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Date d'origine maximale (ISO)","title":"Jusqu A"},"description":"Date d'origine maximale (ISO)"},{"name":"hybride","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"false = le sens seul, sans les mots exacts","title":"Hybride"},"description":"false = le sens seul, sans les mots exacts"},{"name":"rerank","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Allumer le juge de pertinence local","title":"Rerank"},"description":"Allumer le juge de pertinence local"},{"name":"fusion","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(rrf|dbsf)$"},{"type":"null"}],"title":"Fusion"}},{"name":"extrait_chars","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":20000,"minimum":0},{"type":"null"}],"title":"Extrait Chars"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Passages Recherche V1 Passages Recherche Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/passages/conversation/{memory_id}":{"get":{"summary":"Passages Conversation","description":"Ouvre la conversation d'origine autour d'un passage, bornes à surligner comprises.\n\nLecture seule : ni la base, ni l'index, ni aucun classement ne bougent.","operationId":"passages_conversation_v1_passages_conversation__memory_id__get","parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}},{"name":"passage_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Passage à surligner","title":"Passage Id"},"description":"Passage à surligner"},{"name":"contexte_chars","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":0},{"type":"null"}],"title":"Contexte Chars"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Passages Conversation V1 Passages Conversation  Memory Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/moteur":{"get":{"summary":"Moteur Etat","description":"Quel cerveau répond en ce moment, et de quoi juger avant d'en changer.\n\n`pret_a_basculer` dit si TOUTES les conversations sont déjà découpées : basculer avec\nune couverture incomplète, c'est répondre avec une mémoire trouée.","operationId":"moteur_etat_v1_admin_moteur_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Moteur Etat V1 Admin Moteur Get"}}}}}},"post":{"summary":"Moteur Basculer","description":"Bascule d'un cerveau à l'autre À CHAUD. `moteur=souvenirs` = revenir à l'ancien.\n\nRien n'est effacé : les souvenirs, les catégories et la collection `souvenirs` restent\nen place. Le retour en arrière est donc immédiat et sans perte. Pour que le choix\nsurvive à un redémarrage, écrire `MEMOIRE_MOTEUR` dans le `.env` du serveur\n(`scripts/moteur-memoire.sh`).","operationId":"moteur_basculer_v1_admin_moteur_post","parameters":[{"name":"moteur","in":"query","required":true,"schema":{"type":"string","pattern":"^(souvenirs|passages)$","title":"Moteur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Moteur Basculer V1 Admin Moteur Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/qualite":{"get":{"summary":"Qualite Mesure","description":"Rejoue le jeu de questions figé et chiffre la qualité : taux de retrouvaille,\nrang moyen inverse, temps de réponse (médiane et 95e centile).\n\nLecture seule, aucun appel de moteur de texte — ni à la recherche, ni à la mesure.\n`moteur=souvenirs` mesure l'ANCIEN index dans les mêmes conditions : c'est le point de\ncomparaison avant/après demandé par le plan de bascule.","operationId":"qualite_mesure_v1_admin_qualite_get","parameters":[{"name":"moteur","in":"query","required":false,"schema":{"type":"string","pattern":"^(passages|souvenirs)$","default":"passages","title":"Moteur"}},{"name":"k","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"K"}},{"name":"rerank","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rerank"}},{"name":"limite","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limite"}},{"name":"enregistrer","in":"query","required":false,"schema":{"type":"boolean","description":"Ajouter la mesure à l'historique daté","default":false,"title":"Enregistrer"},"description":"Ajouter la mesure à l'historique daté"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Qualite Mesure V1 Admin Qualite Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/apprendre-competences":{"post":{"summary":"Apprendre Competences","description":"Déclenche À LA DEMANDE l'apprentissage nocturne des compétences : analyse les\ndiscussions récentes et crée/améliore des skills (cf. worker, sinon lancé chaque nuit).","operationId":"apprendre_competences_v1_admin_apprendre_competences_post","parameters":[{"name":"fenetre_heures","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Fenetre Heures"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apprendre Competences V1 Admin Apprendre Competences Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/whatsapp/accounts":{"get":{"summary":"Whatsapp Accounts","operationId":"whatsapp_accounts_v1_whatsapp_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Whatsapp Accounts V1 Whatsapp Accounts Get"}}}}}}},"/v1/whatsapp/accounts/{account_id}/report":{"post":{"summary":"Whatsapp Report","operationId":"whatsapp_report_v1_whatsapp_accounts__account_id__report_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatsappReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Whatsapp Report V1 Whatsapp Accounts  Account Id  Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/vision/describe":{"post":{"summary":"Vision Describe","description":"Décrit une image (vision) → courte légende française, cherchable comme du texte.\nUtilisé par la passerelle WhatsApp pour ne plus réduire une photo à « [image] ».\nN'écrit rien : la description n'est renvoyée que dans la réponse (l'appelant décide).","operationId":"vision_describe_v1_vision_describe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisionDescribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Vision Describe V1 Vision Describe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/whatsapp/interlocuteurs":{"get":{"summary":"Whatsapp Interlocuteurs","description":"Qui parle dans les fils WhatsApp mémorisés : nom, compte, messages reçus/envoyés,\ndernière fois vu. C'est cet index qui rend le canal traversable au rappel quand une\nquestion cite une personne (cf. interlocuteurs).","operationId":"whatsapp_interlocuteurs_v1_whatsapp_interlocuteurs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Whatsapp Interlocuteurs V1 Whatsapp Interlocuteurs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/interlocuteurs-backfill":{"post":{"summary":"Interlocuteurs Backfill","description":"Rejoue l'index des interlocuteurs sur les fils WhatsApp déjà mémorisés (aucun appel\nLLM, aucune ré-indexation vectorielle : simple relecture du brut conservé). Sans lui,\nseuls les fils qui reçoivent un nouveau message deviendraient désignables par nom.","operationId":"interlocuteurs_backfill_v1_admin_interlocuteurs_backfill_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Interlocuteurs Backfill V1 Admin Interlocuteurs Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}}},"components":{"schemas":{"ExchangeRequest":{"properties":{"user_text":{"type":"string","title":"User Text"},"assistant_text":{"type":"string","title":"Assistant Text","default":""},"source":{"type":"string","title":"Source","default":"perso"},"projet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projet"},"discussion_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discussion Id"}},"type":"object","required":["user_text"],"title":"ExchangeRequest","description":"Échange brut soumis au greffier (curation côté Cerveau) : au lieu de stocker le\ntexte brut, le Cerveau distille 0 à 3 faits durables et met à jour la fiche projet."},"FicheRequest":{"properties":{"contenu":{"type":"string","title":"Contenu"}},"type":"object","required":["contenu"],"title":"FicheRequest","description":"Écriture directe d'une fiche projet (dashboard / édition manuelle)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IngestRequest":{"properties":{"texte":{"type":"string","title":"Texte"},"source":{"type":"string","title":"Source","default":"perso"},"projet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projet"},"discussion_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discussion Id"}},"type":"object","required":["texte"],"title":"IngestRequest"},"IngestResponse":{"properties":{"garde":{"type":"boolean","title":"Garde"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"importance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Importance"},"raison":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raison"}},"type":"object","required":["garde"],"title":"IngestResponse"},"RechercheResponse":{"properties":{"resultats":{"items":{"$ref":"#/components/schemas/SouvenirOut"},"type":"array","title":"Resultats","default":[]},"couches_visitees":{"items":{"type":"string"},"type":"array","title":"Couches Visitees","default":[]},"concepts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Concepts","default":[]},"projet_resolu":{"items":{"type":"string"},"type":"array","title":"Projet Resolu","default":[]},"personnes":{"items":{"type":"string"},"type":"array","title":"Personnes","default":[]},"fenetre":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fenetre"},"tentatives":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tentatives","default":[]},"avertissement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avertissement"},"questions":{"items":{"type":"string"},"type":"array","title":"Questions","default":[]},"vide":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vide"},"elargi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elargi"},"sujet_absent":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sujet Absent"},"synthese":{"anyOf":[{"$ref":"#/components/schemas/SyntheseOut"},{"type":"null"}]}},"type":"object","title":"RechercheResponse"},"SkillOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"procedure":{"type":"string","title":"Procedure"},"occurrences":{"type":"integer","title":"Occurrences"},"status":{"type":"string","title":"Status"},"portee":{"type":"string","title":"Portee","default":"global"},"contexte":{"type":"string","title":"Contexte","default":""},"sous_categories":{"items":{"type":"string"},"type":"array","title":"Sous Categories","default":[]},"sujets":{"items":{"type":"string"},"type":"array","title":"Sujets","default":[]},"project":{"type":"string","title":"Project","default":""},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","description","procedure","occurrences","status","created_at"],"title":"SkillOut"},"SourceCitee":{"properties":{"id":{"type":"string","title":"Id"},"extrait":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extrait"},"niveau":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niveau"},"project":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"},"date_origine":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Origine"}},"type":"object","required":["id"],"title":"SourceCitee","description":"Un souvenir réellement invoqué en appui de la réponse.\n\n`extrait` est RELU depuis le souvenir (jamais recopié du modèle) : ce qui est attribué\nà une source est donc exactement ce qu'elle contient, vérifiable par `details_souvenir`."},"SouvenirOut":{"properties":{"id":{"type":"string","title":"Id"},"niveau":{"type":"string","title":"Niveau"},"texte":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Texte"},"contexte":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contexte"},"sous_categories":{"items":{"type":"string"},"type":"array","title":"Sous Categories","default":[]},"sujets":{"items":{"type":"string"},"type":"array","title":"Sujets","default":[]},"statut":{"type":"string","title":"Statut","default":"actif"},"motif":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motif"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"fraicheur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fraicheur"},"date_derniere_confirmation":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Derniere Confirmation"},"date_origine":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Origine"},"hors_fenetre":{"type":"boolean","title":"Hors Fenetre","default":false},"project":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Via"}},"type":"object","required":["id","niveau","texte"],"title":"SouvenirOut"},"SouvenirStatutRequest":{"properties":{"statut":{"type":"string","title":"Statut"},"motif":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motif"}},"type":"object","required":["statut"],"title":"SouvenirStatutRequest","description":"Change de statut d'un souvenir sans le detruire (cf. POST /v1/memories/{id}/statut).\n\n`perime` = oubli doux (dormant, garde), `actif` = reactivation, `rejete` = piste\necartee (avec `motif`)."},"SyntheseOut":{"properties":{"statut":{"type":"string","title":"Statut","default":"insuffisant"},"texte":{"type":"string","title":"Texte","default":""},"questions":{"items":{"type":"string"},"type":"array","title":"Questions","default":[]},"sources":{"items":{"$ref":"#/components/schemas/SourceCitee"},"type":"array","title":"Sources","default":[]},"motif":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motif"},"modele":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modele"},"latence_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latence Ms"}},"type":"object","title":"SyntheseOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VisionDescribeRequest":{"properties":{"image_b64":{"type":"string","title":"Image B64"},"mime":{"type":"string","title":"Mime","default":"image/jpeg"},"legende":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legende"}},"type":"object","required":["image_b64"],"title":"VisionDescribeRequest","description":"Demande de description d'une image (vision). La passerelle WhatsApp envoie la photo\nencodée en base64 ; le Cerveau renvoie une courte légende française (cf. decrire_image)."},"WhatsappReportRequest":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"pairing_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pairing Code"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","title":"WhatsappReportRequest","description":"Remontée de la passerelle Baileys vers le Cerveau (statut/code d'appairage)."}}}}