{"openapi":"3.1.0","info":{"title":"API ROMEO — conformité documentaire","summary":"Contrôle de conformité des modèles et génération de documents réglementaires.","description":"\nAPI de conformité documentaire de Figen pour ROMEO.\n\n- **Modèles** : le groupe dépose ses modèles de base ; chaque CIF peut déposer sa version adaptée, qui\n  est contrôlée contre le modèle de base. Les mentions obligatoires sont délimitées par des marques\n  `<!-- clause: identifiant -->` … `<!-- /clause -->`.\n- **Contrôle** : les clauses sont comparées mot à mot ; l'IA ne juge que les passages modifiés, et chaque\n  avis est justifié. L'API alerte et dit l'état, ROMEO décide de bloquer.\n- **Documents** : un modèle et des données donnent un document en Markdown et en HTML. Aucun document ni\n  aucune donnée de client n'est conservé.\n\n**Authentification** : en-tête `Authorization: Bearer <clé>` sur toutes les routes, sauf `/v1/sante`.\n\n**Erreurs** : toujours `{\"erreur\": {\"code\": \"…\", \"message\": \"…\", \"details\": […]}}`. `code` est fait pour\nvotre programme, `message` pour un humain. Chaque réponse porte un en-tête `X-Request-Id` (le vôtre s'il est\nenvoyé), à nous transmettre en cas de question.\n\n| HTTP | `code` | Quand |\n|---|---|---|\n| 400 | `requete_invalide` | corps ou paramètres mal formés, clé inconnue, donnée dont la forme contredit le catalogue de variables ; `details` liste les champs en cause |\n| 400 | `gabarit_invalide` | modèle refusé pour sa forme ; `details` liste les anomalies |\n| 400 | `format_incoherent` | le `format` annoncé contredit le contenu |\n| 401 | `cle_absente`, `cle_invalide` | clé manquante ou refusée |\n| 404 | `introuvable` | route, modèle, version, modèle de CIF ou contrôle inconnu ; `details` dit lequel |\n| 405 | `methode_non_permise` | méthode HTTP non prévue sur cette route |\n| 409 | `modele_non_personnalisable`, `revalidation_impossible` | voir les routes des modèles de CIF |\n| 409 | `depots_simultanes` | le même modèle est modifié par plusieurs appels en même temps : réessayez |\n| 413 | `corps_trop_grand` | corps de plus de 2 Mo, ou texte de modèle de plus de 500 000 caractères |\n| 422 | `modele_non_valide`, `generation_impossible` | voir `POST /v1/documents` |\n| 500 | `erreur_interne` | défaut du service ; `details` porte l'identifiant de requête |\n| 503 | `service_degrade` | `/v1/sante` quand la base de données ne répond pas |\n\n**Durées** : un contrôle qui sollicite l'IA ou une rédaction de commentaires peut durer plusieurs dizaines\nde secondes. Le relais placé devant le service coupe tout appel à 100 secondes (erreur 524, hors du format\nci-dessus) : réglez votre délai d'attente à 95 secondes au plus. Pour un document avec commentaires, faites\nd'abord rédiger les commentaires (`POST /v1/documents/blocs`), puis générez en les fournissant : la\ngénération répond alors sans appel à l'IA.\n\n**Appels de serveur à serveur** : l'API n'ouvre pas le partage entre origines (CORS).\n","version":"0.1.0"},"servers":[{"url":"https://romeo-test.figenai.com","description":"Environnement « recette »"}],"paths":{"/v1/sante":{"get":{"tags":["Service"],"summary":"État du service","description":"Sans clé. Rend `503`, `statut: \"degrade\"` et `erreur.code: \"service_degrade\"` si la base de données ne répond pas. Répond aussi à `HEAD` (mêmes codes, sans corps), pour les sondes de surveillance.","operationId":"sante","responses":{"200":{"description":"État du service.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sante"}}}},"503":{"description":"La base de données ne répond pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sante"}}}}}}},"/v1/moi":{"get":{"tags":["Service"],"summary":"À qui appartient la clé","description":"Pour vérifier une clé et l'environnement auquel elle donne accès.","operationId":"moi","responses":{"200":{"description":"La clé présentée et son environnement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Moi"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"CleApi":[]}]}},"/v1/catalogue-variables":{"get":{"tags":["Service"],"summary":"Variables et blocs IA","description":"Les variables qu'un modèle peut employer et les commentaires que l'IA sait rédiger. Avec `code`, s'ajoute ce que ce modèle de base utilise.","operationId":"catalogue_variables","security":[{"CleApi":[]}],"parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$"},{"type":"null"}],"description":"Code d'un modèle de base."},"description":"Code d'un modèle de base."}],"responses":{"200":{"description":"Le catalogue, et le modèle demandé s'il y en a un.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueVariables"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/modeles-de-base":{"get":{"tags":["Modèles de base"],"summary":"Lister les modèles de base","description":"Chaque modèle avec sa version courante et le nombre de modèles de CIF par état.","operationId":"lister_modeles_de_base","responses":{"200":{"description":"Les modèles de base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListeModelesDeBase"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"CleApi":[]}]}},"/v1/modeles-de-base/{code}":{"put":{"tags":["Modèles de base"],"summary":"Déposer une version d'un modèle de base","description":"Analyse le modèle (clauses, variables, blocs IA, anomalies de forme) et dit son impact sur les modèles des CIF.\n\n- Une anomalie de gravité `erreur` : `400 gabarit_invalide`, rien n'est stocké.\n- Contenu identique à la dernière version : `200`, `inchange: true`, aucune version n'est créée. `type`, `profil`, `libelle` et `personnalisable` suivent quand même ce dépôt, et un brouillon redéposé avec `publier: true` est publié : la réponse montre l'état d'après l'appel.\n- `personnalisable` omis : `true` à la création, puis la valeur enregistrée. `false` suspend les modèles de CIF déjà déposés (gardés, mais le modèle de base sert à générer).\n- `simulation: true` : tout est calculé, rien n'est stocké (`200`).\n- `publier: false` : la version reste un brouillon ; l'impact est alors une projection.\n\nPublier une version fait passer `derivant` les modèles de CIF valides et les recontrôle aussitôt ; avec `revalidation_automatique: true`, ceux qui n'ont aucune alerte bloquante redeviennent `valide`. Avec un `format: \"html\"`, vérifiez `contenu_markdown` : c'est le texte tel qu'il a été compris.","operationId":"deposer_modele_de_base","security":[{"CleApi":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["der-conseiller"]},"description":"Code du modèle de base."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepotModeleDeBase"}}}},"responses":{"201":{"description":"Nouvelle version créée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleDeBaseDepose"}}}},"200":{"description":"Version déjà déposée, ou simulation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleDeBaseDepose"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"L'état actuel ne permet pas l'opération, ou plusieurs appels se sont croisés (à rejouer).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"413":{"description":"Corps de plus de 2 Mo, ou texte de plus de 500 000 caractères (`corps_trop_grand`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}},"get":{"tags":["Modèles de base"],"summary":"Détail d'une version d'un modèle de base","description":"Sans `version` : la version publiée courante (à défaut, le dernier brouillon).","operationId":"detail_modele_de_base","security":[{"CleApi":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["der-conseiller"]},"description":"Code du modèle de base."},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Numéro de la version voulue."},"description":"Numéro de la version voulue."}],"responses":{"200":{"description":"La version demandée et la liste des versions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleDeBaseDetail"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/cifs/{cif_id}/modeles":{"get":{"tags":["Modèles des CIF"],"summary":"État des modèles d'un CIF","description":"Tous les modèles de base publiés, avec l'état du modèle du CIF s'il en a déposé un, et lequel des deux servirait à générer (`utilise`). `suspendu: true` : le modèle de base n'est pas personnalisable, le modèle du CIF est gardé mais ne sert pas.","operationId":"etat_modeles_cif","security":[{"CleApi":[]}],"parameters":[{"name":"cif_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`).","examples":["CIF-0042"]},"description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`)."}],"responses":{"200":{"description":"L'état de chaque modèle pour ce CIF.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EtatModelesCif"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/cifs/{cif_id}/modeles/{code}":{"put":{"tags":["Modèles des CIF"],"summary":"Déposer le modèle d'un CIF","description":"Le modèle est contrôlé contre la version publiée courante de son modèle de base ; la réponse contient le contrôle. Statut `valide` (aucune alerte bloquante) ou `alertes`.\n\nUn dépôt identique au dernier rend `200` et `inchange: true`, avec le dernier contrôle si la base n'a pas bougé depuis ; sinon le modèle est recontrôlé.","operationId":"deposer_modele_cif","security":[{"CleApi":[]}],"parameters":[{"name":"cif_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`).","examples":["CIF-0042"]},"description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`)."},{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["der-conseiller"]},"description":"Code du modèle de base."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepotModeleCif"}}}},"responses":{"201":{"description":"Nouvelle version du modèle du CIF, et son contrôle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleCifDepose"}}}},"200":{"description":"Contenu identique au dernier dépôt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleCifDepose"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"L'état actuel ne permet pas l'opération, ou plusieurs appels se sont croisés (à rejouer).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"413":{"description":"Corps de plus de 2 Mo, ou texte de plus de 500 000 caractères (`corps_trop_grand`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}},"get":{"tags":["Modèles des CIF"],"summary":"Détail du modèle d'un CIF","description":"Le modèle déposé, son état, son dernier contrôle, et s'il est suspendu (modèle de base non personnalisable).","operationId":"detail_modele_cif","security":[{"CleApi":[]}],"parameters":[{"name":"cif_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`).","examples":["CIF-0042"]},"description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`)."},{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["der-conseiller"]},"description":"Code du modèle de base."}],"responses":{"200":{"description":"Le modèle du CIF et son dernier contrôle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleCifDetail"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}},"delete":{"tags":["Modèles des CIF"],"summary":"Revenir au modèle de base","description":"Supprime le modèle du CIF, ses versions et ses contrôles.","operationId":"supprimer_modele_cif","security":[{"CleApi":[]}],"parameters":[{"name":"cif_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`).","examples":["CIF-0042"]},"description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`)."},{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["der-conseiller"]},"description":"Code du modèle de base."}],"responses":{"200":{"description":"Le modèle du CIF est supprimé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionModeleCif"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/cifs/{cif_id}/modeles/{code}/revalider":{"post":{"tags":["Modèles des CIF"],"summary":"Revalider un modèle dérivant","description":"Lève la dérive si le dernier contrôle est sans alerte bloquante : le modèle redevient `valide`. Sinon `409 revalidation_impossible`, avec le contrôle en cause.","operationId":"revalider_modele_cif","security":[{"CleApi":[]}],"parameters":[{"name":"cif_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$","description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`).","examples":["CIF-0042"]},"description":"Identifiant du CIF, choisi par ROMEO (lettres, chiffres, `-`, `_`, `.`)."},{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["der-conseiller"]},"description":"Code du modèle de base."}],"responses":{"200":{"description":"Le modèle, redevenu valide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleCifDetail"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"L'état actuel ne permet pas l'opération, ou plusieurs appels se sont croisés (à rejouer).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/controles":{"post":{"tags":["Contrôles"],"summary":"Contrôler un texte à blanc","description":"Contrôle n'importe quel texte contre un modèle de base (`reference.code`) ou contre un texte fourni (`reference.contenu`). Rien n'est stocké : la réponse a `id: null` et `enregistre: false`.\n\nAvec `reference.donnees`, la référence est d'abord rendue avec ces données : c'est le contrôle d'un document final que le conseiller a retouché.","operationId":"controler_a_blanc","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeControle"}}},"required":true},"responses":{"200":{"description":"Le contrôle, non stocké.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Controle"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"413":{"description":"Corps de plus de 2 Mo, ou texte de plus de 500 000 caractères (`corps_trop_grand`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"422":{"description":"La demande est comprise mais ne peut pas être satisfaite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"CleApi":[]}]}},"/v1/controles/{id}":{"get":{"tags":["Contrôles"],"summary":"Relire un contrôle stocké","operationId":"lire_controle","security":[{"CleApi":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_]{1,64}$","description":"Identifiant `ctl_…` du contrôle."},"description":"Identifiant `ctl_…` du contrôle."}],"responses":{"200":{"description":"Le contrôle stocké.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Controle"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/documents":{"post":{"tags":["Documents"],"summary":"Générer un document","description":"Rend le document en Markdown et en HTML, avec le contrôle du rendu (`conformite`). Le modèle du CIF sert s'il est `valide` ; sinon `options.si_modele_non_valide` décide. Si le modèle de base n'est pas personnalisable, il sert toujours (`modele.repli_sur_base: true` quand le CIF a un modèle).\n\n`blocs` porte les commentaires déjà relus dans ROMEO : ils sont insérés sans être réécrits, et la réponse vient alors sans appel à l'IA, donc vite. Un commentaire renvoyé vide reste à rédiger : l'IA ne l'écrit pas à sa place. Il ne reste du document qu'une ligne de journal sans contenu.","operationId":"generer_document","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeDocument"}}},"required":true},"responses":{"200":{"description":"Le document et le contrôle de son rendu.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"422":{"description":"La demande est comprise mais ne peut pas être satisfaite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"CleApi":[]}]}},"/v1/documents/blocs":{"post":{"tags":["Documents"],"summary":"Rédiger les commentaires libres","description":"Rédige seulement les commentaires libres du document (blocs IA), pour relecture dans ROMEO. Même corps que `POST /v1/documents` : `blocs` et les options que la rédaction ne lit pas sont admis et ignorés, toute autre clé est refusée (`400 requete_invalide`). Rien n'est stocké. ROMEO affiche ces textes au conseiller, puis les renvoie corrigés dans `blocs` de `POST /v1/documents`.","operationId":"rediger_blocs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeBlocs"}}},"required":true},"responses":{"200":{"description":"Les commentaires rédigés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlocsRediges"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"422":{"description":"La demande est comprise mais ne peut pas être satisfaite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"CleApi":[]}]}},"/v1/documents/verifier-donnees":{"post":{"tags":["Documents"],"summary":"Vérifier les données d'un document","description":"Dit ce qui manque dans les données, sans générer : une génération à blanc, sans IA. `complet: true` : générer maintenant avec ce corps ne lèvera aucune alerte bloquante due aux données. `alertes` liste ce que la génération relèverait, hors commentaires à rédiger.","operationId":"verifier_donnees","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeVerificationDonnees"}}},"required":true},"responses":{"200":{"description":"Ce qui manque dans les données.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationDonnees"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"Modèle, version, contrôle ou modèle de CIF introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"422":{"description":"La demande est comprise mais ne peut pas être satisfaite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"CleApi":[]}]}},"/v1/journal":{"get":{"tags":["Suivi"],"summary":"Journal des générations","description":"Une ligne par document généré, sans aucun contenu, de la plus récente à la plus ancienne.","operationId":"lire_journal","security":[{"CleApi":[]}],"parameters":[{"name":"cif_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}]}},{"name":"conseiller_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}]}},{"name":"depuis","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"description":"Date ou date et heure ISO 8601 (UTC par défaut)."},"description":"Date ou date et heure ISO 8601 (UTC par défaut)."},{"name":"limite","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":1},{"type":"null"}],"description":"Nombre maximal de lignes (100 par défaut)."},"description":"Nombre maximal de lignes (100 par défaut)."}],"responses":{"200":{"description":"Les lignes du journal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Journal"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/evenements":{"get":{"tags":["Suivi"],"summary":"Fil des changements d'état","description":"Événements postérieurs au curseur `depuis`, du plus ancien au plus récent. Conservez `suivant` et repassez-le dans `depuis` : sans nouveauté, la liste est vide et le curseur inchangé.","operationId":"lire_evenements","security":[{"CleApi":[]}],"parameters":[{"name":"depuis","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Champ `suivant` de l'appel précédent."},"description":"Champ `suivant` de l'appel précédent."},{"name":"limite","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":1},{"type":"null"}],"description":"Nombre maximal de lignes (100 par défaut)."},"description":"Nombre maximal de lignes (100 par défaut)."}],"responses":{"200":{"description":"Les événements et le curseur suivant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evenements"}}}},"401":{"description":"Clé d'API absente (`cle_absente`) ou invalide (`cle_invalide`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Requête invalide : champ refusé, format incohérent ou modèle mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}}},"components":{"schemas":{"Alerte":{"properties":{"code":{"type":"string","description":"Contrôle d'un modèle, alertes bloquantes : `clause_supprimee`, `clause_alteree`, `clause_non_identique`, `clause_a_juger`, `variable_retiree`, `jinja_invalide`, `condition_modifiee`, `ajout_contradictoire`, `ajout_a_juger`, `jinja_ajoute`, `mise_en_forme_masquante`, `rendu_divergent`, `bloc_ia_modifie`. Informations : `clause_reformulee`, `clause_facultative_retiree`, `marque_absente`, `clause_deplacee`, `clause_inconnue`, `zone_libre_modifiee`, `marques_abimees`. Génération : `variable_non_resolue` (bloquante dans une clause), `clause_vide_au_rendu` (bloquante), `condition_non_renseignee`, `bloc_ia_indisponible` ; avec `verifier_blocs`, `ajout_contradictoire` et `ajout_a_juger` (bloquantes). La liste peut s'allonger : fiez-vous à `gravite` pour décider, et traitez un code inconnu comme une alerte ordinaire.","examples":["clause_alteree"]},"gravite":{"type":"string","enum":["bloquante","information"],"description":"Seule une alerte bloquante retire la validité."},"niveau":{"type":"string","description":"Ce que l'alerte désigne : `clause`, `paragraphe`, `variable`, `zone_libre` ou `document`.","examples":["paragraphe"]},"message":{"type":"string","description":"Explication en français, affichable telle quelle."},"clause_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Clause en cause.","examples":["mediation"]},"titre":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Titre de la clause, s'il y en a un."},"attendu":{"anyOf":[{"$ref":"#/components/schemas/Extrait"},{"type":"null"}],"description":"Ce que dit la référence."},"constate":{"anyOf":[{"$ref":"#/components/schemas/Extrait"},{"type":"null"}],"description":"Ce que dit le texte contrôlé."},"diff":{"anyOf":[{"items":{"$ref":"#/components/schemas/OperationDiff"},"type":"array"},{"type":"null"}],"description":"Différence mot à mot entre les deux."},"variable":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variable en cause."},"jugement":{"anyOf":[{"$ref":"#/components/schemas/Jugement"},{"type":"null"}],"description":"Avis de l'IA, quand le passage lui a été soumis."}},"type":"object","required":["code","gravite","niveau","message"],"title":"Alerte"},"AnomalieDeForme":{"properties":{"code":{"type":"string","description":"Nature de l'anomalie.","examples":["variable_inconnue"]},"message":{"type":"string","description":"Explication en français."},"ligne":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Ligne en cause, quand elle est connue."},"gravite":{"type":"string","enum":["erreur","avertissement"],"description":"Une `erreur` fait refuser le dépôt (`400 gabarit_invalide`)."}},"type":"object","required":["code","message","gravite"],"title":"AnomalieDeForme"},"BlocIACatalogue":{"properties":{"cle":{"type":"string","description":"Clé à écrire dans `<!-- ia: cle -->`.","examples":["justification_recommandation"]},"libelle":{"type":"string","description":"Libellé lisible."},"description":{"type":"string","description":"Ce que l'IA rédige pour ce bloc."}},"type":"object","required":["cle","libelle","description"],"title":"BlocIACatalogue"},"BlocIADuModele":{"properties":{"cle":{"type":"string","description":"Clé du bloc.","examples":["justification_recommandation"]},"consigne":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Consigne posée dans le modèle, sinon celle du catalogue."},"ligne":{"type":"integer","description":"Ligne de la marque."}},"type":"object","required":["cle","ligne"],"title":"BlocIADuModele"},"BlocPourRelecture":{"properties":{"cle":{"type":"string","description":"Clé du bloc, à reprendre dans `blocs`.","examples":["justification_recommandation"]},"libelle":{"type":"string","description":"Libellé lisible du bloc."},"statut":{"type":"string","enum":["redige","fourni","indisponible"],"description":"`redige`, ou `indisponible` si l'IA n'a pas pu rédiger."},"texte":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Le texte à faire relire au conseiller."},"modele_ia":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Modèle qui a rédigé le texte."}},"type":"object","required":["cle","libelle","statut"],"title":"BlocPourRelecture"},"BlocRedige":{"properties":{"cle":{"type":"string","description":"Clé du bloc.","examples":["justification_recommandation"]},"statut":{"type":"string","enum":["redige","fourni","indisponible"],"description":"`redige` par l'IA, `fourni` par ROMEO, ou `indisponible` (le document porte un marqueur)."},"modele_ia":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Modèle qui a rédigé le texte."},"texte":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Le texte inséré dans le document."}},"type":"object","required":["cle","statut"],"title":"BlocRedige"},"BlocsRediges":{"properties":{"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"blocs":{"items":{"$ref":"#/components/schemas/BlocPourRelecture"},"type":"array","description":"Les commentaires rédigés, dans l'ordre du texte."},"duree_ms":{"type":"integer","description":"Durée du traitement par l'API, en millisecondes.","examples":[2140]}},"type":"object","required":["code","blocs","duree_ms"],"title":"BlocsRediges"},"CatalogueVariables":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/VariableCatalogue"},"type":"array","description":"Variables connues."},"groupes":{"items":{"$ref":"#/components/schemas/GroupeVariables"},"type":"array","description":"Groupes de variables, pour les présenter."},"drapeaux":{"items":{"type":"string"},"type":"array","description":"Données lues par les conditions des modèles.","examples":[["org_status_cif","personType"]]},"blocs_ia":{"items":{"$ref":"#/components/schemas/BlocIACatalogue"},"type":"array","description":"Commentaires que l'IA sait rédiger."},"modele":{"anyOf":[{"$ref":"#/components/schemas/VariablesDuModele"},{"type":"null"}],"description":"Présent seulement avec le paramètre `code`."}},"type":"object","required":["variables","groupes","drapeaux","blocs_ia"],"title":"CatalogueVariables"},"ClauseDuModele":{"properties":{"id":{"type":"string","description":"Identifiant de la clause.","examples":["mediation"]},"titre":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Libellé lisible, s'il est posé dans la marque.","examples":["Médiation"]},"exigence":{"type":"string","description":"`sens` : la clause peut être reformulée si son sens est conservé ; `identique` : mot pour mot.","examples":["sens"]},"facultative":{"type":"boolean","description":"`true` (marque `| presence: facultative`) : le CIF peut retirer la clause, pas la dénaturer.","default":false},"lignes":{"items":{"type":"integer"},"type":"array","description":"Lignes de la marque ouvrante et de la marque fermante.","examples":[[5,7]]},"variables":{"items":{"type":"string"},"type":"array","description":"Variables lues dans la clause.","examples":[["org_mediator_name"]]}},"type":"object","required":["id","exigence","lignes","variables"],"title":"ClauseDuModele"},"CleCourante":{"properties":{"nom":{"type":"string","description":"À qui la clé a été remise.","examples":["ROMEO recette"]},"prefixe":{"type":"string","description":"Début de la clé, qui sert à la désigner.","examples":["romeo_rec_ab12cd"]},"creee_le":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Date de création de la clé, UTC."},"derniere_utilisation":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Tenue à jour à la minute près."}},"type":"object","required":["nom","prefixe"],"title":"CleCourante"},"ComptesModelesCif":{"properties":{"valide":{"type":"integer","description":"Modèles de CIF valides.","default":0},"alertes":{"type":"integer","description":"Modèles de CIF avec au moins une alerte bloquante.","default":0},"derivant":{"type":"integer","description":"Modèles de CIF en attente de revalidation.","default":0}},"type":"object","title":"ComptesModelesCif"},"Conformite":{"properties":{"statut":{"type":"string","enum":["conforme","alertes"],"description":"`conforme` si aucune alerte n'est bloquante."},"alertes":{"items":{"$ref":"#/components/schemas/Alerte"},"type":"array","description":"Bloquantes d'abord, puis informations."},"variables_non_resolues":{"items":{"type":"string"},"type":"array","description":"Variables sans valeur, marquées « À compléter »."},"conditions_non_renseignees":{"items":{"type":"string"},"type":"array","description":"Données de condition absentes, tenues pour fausses."},"clauses_presentes":{"items":{"type":"string"},"type":"array","description":"Clauses obligatoires présentes dans le document."},"clauses_non_applicables":{"items":{"type":"string"},"type":"array","description":"Clauses écartées par une condition du modèle."}},"type":"object","required":["statut","alertes","variables_non_resolues","conditions_non_renseignees","clauses_presentes","clauses_non_applicables"],"title":"Conformite"},"Controle":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`ctl_…` ; `null` pour un contrôle à blanc.","examples":["ctl_01jc8w4n6q7x2m5k9d3f0h1a2b"]},"enregistre":{"type":"boolean","description":"`false` pour un contrôle à blanc."},"cree_le":{"type":"string","format":"date-time","description":"Date du contrôle, UTC."},"statut":{"type":"string","enum":["valide","alertes"],"description":"`valide` si aucune alerte n'est bloquante."},"resume":{"$ref":"#/components/schemas/ResumeControle"},"alertes":{"items":{"$ref":"#/components/schemas/Alerte"},"type":"array","description":"Bloquantes d'abord, puis informations, dans l'ordre du texte."},"rapport_markdown":{"type":"string","description":"Rapport en français, lisible tel quel par un conseiller."},"rapport_html":{"type":"string","description":"Le même rapport, en HTML sûr."},"modele_annote":{"type":"string","description":"Le texte contrôlé, avec `<!-- alerte: code | clause: id -->…<!-- /alerte -->` autour des passages en cause."}},"type":"object","required":["enregistre","cree_le","statut","resume","alertes","rapport_markdown","rapport_html","modele_annote"],"title":"Controle"},"ControleEnBref":{"properties":{"id":{"type":"string","description":"Identifiant du contrôle, à relire par `GET /v1/controles/{id}`."},"statut":{"type":"string","enum":["valide","alertes"],"description":"`valide` si aucune alerte n'est bloquante."},"resume":{"$ref":"#/components/schemas/ResumeControle"},"cree_le":{"type":"string","format":"date-time","description":"Date du contrôle, UTC."}},"type":"object","required":["id","statut","resume","cree_le"],"title":"ControleEnBref"},"DemandeBlocs":{"properties":{"code":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base."},"cif_id":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}],"description":"Facultatif : un consultant n'a pas de modèle propre."},"conseiller_id":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}],"description":"Qui demande la rédaction."},"donnees":{"additionalProperties":true,"type":"object","description":"Les données du document. Une valeur dont la forme contredit le catalogue est refusée (`400 requete_invalide`, `details[].champ` donne son chemin, par exemple `donnees.products.0.name`) : `products` qui n'est pas une liste d'objets, `totals` ou `remuneration` qui n'est pas un objet, une liste ou un objet pour une valeur simple, un booléen pour autre chose qu'un oui/non. Un nombre pour un texte, une clé hors catalogue et `null` (qui vaut absent) sont admis."},"blocs":{"patternProperties":{"^[a-z][a-z0-9_]{0,63}$":{"anyOf":[{"type":"string"},{"type":"null"}]}},"type":"object","description":"Admis pour que le corps de `POST /v1/documents` serve tel quel ; ignoré : tous les commentaires du document sont rédigés."},"options":{"$ref":"#/components/schemas/OptionsDocument","description":"Les options de `POST /v1/documents`. Lues ici : `si_modele_non_valide` et `enrichir_produits` ; les autres sont admises et ignorées."}},"additionalProperties":false,"type":"object","required":["code"],"title":"DemandeBlocs","description":"Le corps de `POST /v1/documents`, tel quel : ROMEO envoie le même aux deux routes.\n\nSeuls `code`, `cif_id`, `donnees`, `options.si_modele_non_valide` et `options.enrichir_produits` sont\nlus ; `blocs` et les autres options sont admis et ignorés. Toute autre clé est refusée.","example":{"cif_id":"CIF-0042","code":"rapport-conseil","conseiller_id":"u-1234","donnees":{"org_mediator_name":"Médiateur fictif du patrimoine","org_name":"Cabinet Dupont Patrimoine"}}},"DemandeControle":{"properties":{"reference":{"$ref":"#/components/schemas/ReferenceControle","description":"À quoi comparer le texte."},"contenu":{"type":"string","minLength":1,"description":"Le texte à contrôler (500 000 caractères au plus)."},"format":{"type":"string","enum":["markdown","html"],"description":"Format de `contenu`.","default":"markdown"},"mode":{"type":"string","enum":["modele","document"],"description":"`document` : les deux textes sont des documents rendus (forcé avec `reference.donnees`).","default":"modele"},"type_document":{"anyOf":[{"type":"string","enum":["der","lettre_mission","mandat_courtage","rapport_conseil","declaration_adequation","mandat_rto","autre"]},{"type":"null"}],"description":"Par défaut, le type du modèle de base de référence."}},"additionalProperties":false,"type":"object","required":["reference","contenu"],"title":"DemandeControle","example":{"contenu":"# Fiche d'information du cabinet\n\nCabinet Dupont Patrimoine, société de conseil patrimonial.\n\n<!-- clause: mediation | titre: Médiation -->\nEn cas de désaccord, le médiateur {{ org_mediator_name }} pourra être saisi sans frais.\n<!-- /clause -->\n","format":"markdown","mode":"modele","reference":{"code":"der-conseiller"},"type_document":"der"}},"DemandeDocument":{"properties":{"code":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base.","examples":["rapport-conseil"]},"cif_id":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}],"description":"Facultatif : un consultant n'a pas de modèle propre."},"conseiller_id":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}],"description":"Qui génère, pour le journal.","examples":["u-1234"]},"donnees":{"additionalProperties":true,"type":"object","description":"Les données du document (voir le catalogue de variables) : 200 produits au plus, 32 niveaux d'imbrication au plus. Une valeur dont la forme contredit le catalogue est refusée (`400 requete_invalide`, `details[].champ` donne son chemin, par exemple `donnees.products.0.name`) : `products` qui n'est pas une liste d'objets, `totals` ou `remuneration` qui n'est pas un objet, une liste ou un objet pour une valeur simple, un booléen pour autre chose qu'un oui/non. Un nombre pour un texte, une clé hors catalogue et `null` (qui vaut absent) sont admis."},"blocs":{"patternProperties":{"^[a-z][a-z0-9_]{0,63}$":{"anyOf":[{"type":"string"},{"type":"null"}]}},"type":"object","description":"Commentaires déjà validés dans ROMEO, insérés sans appel à l'IA. Le texte est assaini (un titre devient un paragraphe en gras, une image son texte de remplacement, le HTML reste du texte) : `blocs_ia[].texte` le rend tel qu'il est dans le document. Un texte vide ou fait de blancs : le commentaire reste à rédiger (`indisponible`), l'IA ne l'écrit pas à sa place. `null` : comme si la clé n'était pas envoyée."},"options":{"$ref":"#/components/schemas/OptionsDocument","description":"Options de la génération."}},"additionalProperties":false,"type":"object","required":["code"],"title":"DemandeDocument","example":{"blocs":{"justification_recommandation":"Texte relu et validé par le conseiller."},"cif_id":"CIF-0042","code":"rapport-conseil","conseiller_id":"u-1234","donnees":{"org_mediator_name":"Médiateur fictif du patrimoine","org_name":"Cabinet Dupont Patrimoine"},"options":{"blocs_ia":true,"conserver_marques":true,"enrichir_produits":true,"formats":["markdown","html"],"reference_romeo":"DOC-1","si_modele_non_valide":"modele_de_base","verifier_blocs":false}}},"DemandeVerificationDonnees":{"properties":{"code":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$","description":"Code du modèle de base."},"cif_id":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},{"type":"null"}],"description":"Pour vérifier contre le modèle du CIF s'il est valide."},"donnees":{"additionalProperties":true,"type":"object","description":"Les données à vérifier. Une valeur dont la forme contredit le catalogue est refusée (`400 requete_invalide`, `details[].champ` donne son chemin, par exemple `donnees.products.0.name`) : `products` qui n'est pas une liste d'objets, `totals` ou `remuneration` qui n'est pas un objet, une liste ou un objet pour une valeur simple, un booléen pour autre chose qu'un oui/non. Un nombre pour un texte, une clé hors catalogue et `null` (qui vaut absent) sont admis."}},"additionalProperties":false,"type":"object","required":["code"],"title":"DemandeVerificationDonnees","example":{"code":"der-conseiller","donnees":{"org_mediator_name":"Médiateur fictif du patrimoine","org_name":"Cabinet Dupont Patrimoine"}}},"DepotModeleCif":{"properties":{"contenu":{"type":"string","minLength":1,"description":"Texte du modèle du CIF (500 000 caractères au plus)."},"format":{"type":"string","enum":["markdown","html"],"description":"Un contenu `html` est converti en Markdown.","default":"markdown"}},"additionalProperties":false,"type":"object","required":["contenu"],"title":"DepotModeleCif","example":{"contenu":"# Fiche d'information du cabinet\n\nCabinet Dupont Patrimoine, société de conseil patrimonial.\n\n<!-- clause: mediation | titre: Médiation -->\nEn cas de désaccord, le médiateur {{ org_mediator_name }} peut être saisi sans frais.\n<!-- /clause -->\n","format":"markdown"}},"DepotModeleDeBase":{"properties":{"type":{"type":"string","enum":["der","lettre_mission","mandat_courtage","rapport_conseil","declaration_adequation","mandat_rto","autre"],"description":"Type de document."},"profil":{"type":"string","enum":["conseiller","consultant","tous"],"description":"À qui le modèle s'adresse."},"libelle":{"type":"string","maxLength":300,"minLength":1,"description":"Nom lisible du modèle.","examples":["DER Conseiller"]},"contenu":{"type":"string","minLength":1,"description":"Texte du modèle, avec ses marques de clause (500 000 caractères au plus)."},"format":{"type":"string","enum":["markdown","html"],"description":"Un contenu `html` est converti en Markdown.","default":"markdown"},"notes_version":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Ce qui change dans cette version."},"personnalisable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Les CIF peuvent-ils déposer leur propre version ? Omis : `true` à la création du modèle, puis la valeur enregistrée (un redépôt qui ne le dit pas ne la change pas). `false` suspend les modèles de CIF déjà déposés : ils sont gardés, mais c'est le modèle de base qui sert à générer."},"publier":{"type":"boolean","description":"`false` : la version reste un brouillon, sans effet sur les CIF.","default":true},"simulation":{"type":"boolean","description":"`true` : analyse, anomalies et impact sont calculés, rien n'est stocké.","default":false},"revalidation_automatique":{"type":"boolean","description":"`true` : à la publication, les modèles de CIF sans alerte bloquante redeviennent `valide` d'eux-mêmes au lieu d'attendre une revalidation.","default":false}},"additionalProperties":false,"type":"object","required":["type","profil","libelle","contenu"],"title":"DepotModeleDeBase","example":{"contenu":"# Fiche d'information du cabinet\n\nCabinet Dupont Patrimoine, société de conseil patrimonial.\n\n<!-- clause: mediation | titre: Médiation -->\nEn cas de désaccord, le médiateur {{ org_mediator_name }} peut être saisi sans frais.\n<!-- /clause -->\n","format":"markdown","libelle":"DER Conseiller","notes_version":"Mention de médiation mise à jour.","personnalisable":true,"profil":"conseiller","publier":true,"revalidation_automatique":false,"simulation":false,"type":"der"}},"DetailErreur":{"properties":{"code":{"type":"string","description":"Identifiant stable de l'erreur, à tester dans le code appelant."},"message":{"type":"string","description":"Explication en français, affichable telle quelle."},"details":{"items":{},"type":"array","description":"Précisions selon l'erreur : champs refusés, anomalies du modèle, contrôle en cause…"}},"type":"object","required":["code","message"],"title":"DetailErreur"},"Document":{"properties":{"id":{"type":"string","description":"Identifiant de la ligne de journal.","examples":["doc_01jc8w4n6q7x2m5k9d3f0h1a2b"]},"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Le document en Markdown ; `null` si le format n'est pas demandé."},"html":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Le document en HTML sûr ; `null` si le format n'est pas demandé."},"modele":{"$ref":"#/components/schemas/OrigineDuModele"},"conformite":{"$ref":"#/components/schemas/Conformite"},"blocs_ia":{"items":{"$ref":"#/components/schemas/BlocRedige"},"type":"array","description":"Les commentaires du document, dans l'ordre du texte."},"produits_enrichis":{"items":{"type":"string"},"type":"array","description":"ISIN complétés depuis le référentiel.","examples":[["FR0000000001"]]},"duree_ms":{"type":"integer","description":"Durée du traitement par l'API, en millisecondes.","examples":[2140]}},"type":"object","required":["id","code","modele","conformite","blocs_ia","produits_enrichis","duree_ms"],"title":"Document"},"DonneeManquante":{"properties":{"cle":{"type":"string","description":"Variable sans valeur.","examples":["org_orias"]},"libelle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Libellé du catalogue, s'il la connaît."},"dans_clauses":{"items":{"type":"string"},"type":"array","description":"Clauses obligatoires que cette donnée laisse incomplètes."},"bloquante":{"type":"boolean","description":"`true` : elle manque dans une clause obligatoire."}},"type":"object","required":["cle","dans_clauses","bloquante"],"title":"DonneeManquante"},"Erreur":{"properties":{"erreur":{"$ref":"#/components/schemas/DetailErreur"}},"type":"object","required":["erreur"],"title":"Erreur","description":"Forme de toutes les erreurs de l'API.","example":{"erreur":{"code":"requete_invalide","details":[{"champ":"contenu","emplacement":"corps","message":"champ obligatoire"}],"message":"La requête est invalide : 1 champ refusé."}}},"EtatModeleCif":{"properties":{"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"type":{"type":"string","enum":["der","lettre_mission","mandat_courtage","rapport_conseil","declaration_adequation","mandat_rto","autre"],"description":"Type de document."},"libelle":{"type":"string","description":"Nom lisible du modèle de base."},"utilise":{"type":"string","enum":["modele_cif","modele_de_base"],"description":"Le modèle qui servirait à générer : `modele_cif` s'il est `valide` et que le modèle de base est personnalisable, sinon `modele_de_base`."},"suspendu":{"type":"boolean","description":"`true` : le modèle de base n'est pas personnalisable. Le modèle du CIF est gardé avec son état, mais c'est le modèle de base qui sert à générer ; il resservira si la base redevient personnalisable. `false` si le CIF n'a rien déposé."},"statut":{"anyOf":[{"type":"string","enum":["valide","alertes","derivant"]},{"type":"null"}],"description":"`null` : le CIF n'a rien déposé pour ce modèle."},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Version du modèle du CIF, s'il en a un."},"base":{"$ref":"#/components/schemas/VersionsDeBase"},"dernier_controle":{"anyOf":[{"$ref":"#/components/schemas/ControleEnBref"},{"type":"null"}],"description":"Dernier contrôle du modèle du CIF."},"maj_le":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Dernier changement du modèle du CIF, UTC."}},"type":"object","required":["code","type","libelle","utilise","suspendu","base"],"title":"EtatModeleCif"},"EtatModelesCif":{"properties":{"cif_id":{"type":"string","description":"Identifiant du CIF, tel que ROMEO l'a choisi.","examples":["CIF-0042"]},"modeles":{"items":{"$ref":"#/components/schemas/EtatModeleCif"},"type":"array","description":"Tous les modèles de base publiés y figurent."}},"type":"object","required":["cif_id","modeles"],"title":"EtatModelesCif"},"Evenement":{"properties":{"id":{"type":"integer","description":"Numéro croissant ; le dernier reçu sert de curseur."},"cree_le":{"type":"string","format":"date-time","description":"Date et heure UTC, ISO 8601."},"type":{"type":"string","enum":["base_publiee","modele_cif_valide","modele_cif_alertes","modele_cif_derivant","modele_cif_revalide","modele_cif_supprime"],"description":"Ce qui s'est passé."},"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"cif_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CIF concerné ; `null` pour `base_publiee`."},"details":{"additionalProperties":true,"type":"object","description":"Selon le type : version, contrôle, nombre d'alertes bloquantes…"}},"type":"object","required":["id","cree_le","type","code","details"],"title":"Evenement"},"Evenements":{"properties":{"evenements":{"items":{"$ref":"#/components/schemas/Evenement"},"type":"array","description":"Du plus ancien au plus récent."},"suivant":{"type":"string","description":"Curseur à passer dans `depuis` au prochain appel.","examples":["12"]}},"type":"object","required":["evenements","suivant"],"title":"Evenements"},"Extrait":{"properties":{"texte":{"type":"string","description":"Le passage, sans ses marques."},"lignes":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"description":"Première et dernière ligne du passage.","examples":[[40,46]]}},"type":"object","required":["texte"],"title":"Extrait"},"GroupeVariables":{"properties":{"id":{"type":"string","description":"Identifiant du groupe.","examples":["cabinet"]},"libelle":{"type":"string","description":"Libellé lisible.","examples":["Cabinet"]}},"type":"object","required":["id","libelle"],"title":"GroupeVariables"},"Impact":{"properties":{"modeles_cif":{"type":"integer","description":"Modèles de CIF rattachés à ce modèle de base."},"restent_valides":{"type":"integer","description":"Modèles de CIF sans alerte bloquante contre cette version."},"a_corriger":{"items":{"$ref":"#/components/schemas/ModeleCifACorriger"},"type":"array","description":"Modèles de CIF qui ont au moins une alerte bloquante."}},"type":"object","required":["modeles_cif","restent_valides","a_corriger"],"title":"Impact","description":"Effet de cette version sur les modèles des CIF. Projection sans effet pour une simulation ou un brouillon."},"Journal":{"properties":{"generations":{"items":{"$ref":"#/components/schemas/LigneJournal"},"type":"array","description":"De la plus récente à la plus ancienne. Aucun contenu."}},"type":"object","required":["generations"],"title":"Journal"},"Jugement":{"properties":{"verdict":{"type":"string","description":"Clause : `sens_conserve` ou `sens_altere`. Passage libre : `neutre` ou `contradictoire`. `indisponible` : l'IA n'a pas pu se prononcer.","examples":["sens_altere"]},"justification":{"type":"string","description":"Une ou deux phrases qui motivent le verdict."},"modele_ia":{"type":"string","description":"Modèle qui a rendu l'avis ; `factice` quand l'IA n'est pas branchée."},"depuis_cache":{"type":"boolean","description":"`true` : avis déjà rendu pour ce même passage, relu en mémoire.","default":false}},"type":"object","required":["verdict","justification","modele_ia"],"title":"Jugement"},"LigneJournal":{"properties":{"id":{"type":"string","description":"Identifiant `doc_…` rendu par la génération."},"cree_le":{"type":"string","format":"date-time","description":"Date et heure UTC, ISO 8601."},"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"cif_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CIF pour lequel le document a été généré."},"conseiller_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Conseiller qui a généré le document."},"modele":{"$ref":"#/components/schemas/OrigineDuModele"},"statut":{"type":"string","enum":["conforme","alertes"],"description":"Conformité du rendu."},"nb_alertes":{"type":"integer","description":"Nombre d'alertes, bloquantes et informations."},"reference_romeo":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Votre référence, si elle a été fournie."},"duree_ms":{"type":"integer","description":"Durée du traitement par l'API, en millisecondes.","examples":[2140]}},"type":"object","required":["id","cree_le","code","modele","statut","nb_alertes","duree_ms"],"title":"LigneJournal"},"ListeModelesDeBase":{"properties":{"modeles":{"items":{"$ref":"#/components/schemas/ResumeModeleDeBase"},"type":"array","description":"Les modèles de base, par code."}},"type":"object","required":["modeles"],"title":"ListeModelesDeBase"},"ModeIA":{"properties":{"mode":{"type":"string","enum":["bedrock","factice"],"description":"`factice` : jugements et rédactions simulés, signés `modele_ia: \"factice\"`."},"modele":{"type":"string","description":"Modèle d'IA utilisé.","examples":["claude-opus-5-5"]}},"type":"object","required":["mode","modele"],"title":"ModeIA"},"ModeleCifACorriger":{"properties":{"cif_id":{"type":"string","description":"Identifiant du CIF, tel que ROMEO l'a choisi.","examples":["CIF-0042"]},"bloquantes":{"type":"integer","description":"Alertes bloquantes contre cette version."},"controle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Contrôle stocké ; `null` en simulation ou pour un brouillon."}},"type":"object","required":["cif_id","bloquantes"],"title":"ModeleCifACorriger"},"ModeleCifDepose":{"properties":{"cif_id":{"type":"string","description":"Identifiant du CIF, tel que ROMEO l'a choisi.","examples":["CIF-0042"]},"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"version":{"type":"integer","description":"Numéro de la version du modèle du CIF."},"statut":{"type":"string","enum":["valide","alertes","derivant"],"description":"`valide` : sans alerte bloquante contre la version courante de la base. `alertes` : au moins une alerte bloquante. `derivant` : il était valide, la base a été republiée, il attend une revalidation."},"inchange":{"type":"boolean","description":"`true` : ce contenu était déjà la dernière version déposée."},"base":{"$ref":"#/components/schemas/VersionsDeBase"},"controle":{"anyOf":[{"$ref":"#/components/schemas/Controle"},{"type":"null"}],"description":"Le dernier contrôle du modèle."}},"type":"object","required":["cif_id","code","version","statut","inchange","base","controle"],"title":"ModeleCifDepose"},"ModeleCifDetail":{"properties":{"cif_id":{"type":"string","description":"Identifiant du CIF, tel que ROMEO l'a choisi.","examples":["CIF-0042"]},"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"version":{"type":"integer","description":"Numéro de la version du modèle du CIF."},"statut":{"type":"string","enum":["valide","alertes","derivant"],"description":"`valide` : sans alerte bloquante contre la version courante de la base. `alertes` : au moins une alerte bloquante. `derivant` : il était valide, la base a été republiée, il attend une revalidation."},"inchange":{"type":"boolean","description":"`true` : ce contenu était déjà la dernière version déposée."},"base":{"$ref":"#/components/schemas/VersionsDeBase"},"controle":{"anyOf":[{"$ref":"#/components/schemas/Controle"},{"type":"null"}],"description":"Le dernier contrôle du modèle."},"contenu_markdown":{"type":"string","description":"Le modèle du CIF, en Markdown."},"suspendu":{"type":"boolean","description":"`true` : le modèle de base n'est pas personnalisable. Le modèle du CIF est gardé avec son état, mais c'est le modèle de base qui sert à générer ; il resservira si la base redevient personnalisable."},"maj_le":{"type":"string","format":"date-time","description":"Dernier changement du modèle ou de son état, UTC."}},"type":"object","required":["cif_id","code","version","statut","inchange","base","controle","contenu_markdown","suspendu","maj_le"],"title":"ModeleCifDetail"},"ModeleDeBaseDepose":{"properties":{"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"type":{"type":"string","enum":["der","lettre_mission","mandat_courtage","rapport_conseil","declaration_adequation","mandat_rto","autre"],"description":"Type de document."},"profil":{"type":"string","enum":["conseiller","consultant","tous"],"description":"À qui le modèle s'adresse."},"libelle":{"type":"string","description":"Nom lisible du modèle."},"personnalisable":{"type":"boolean","description":"Les CIF peuvent-ils déposer leur propre version ?"},"version":{"type":"integer","description":"Numéro de la version (en simulation : celui qu'elle recevrait)."},"statut":{"type":"string","enum":["brouillon","publiee"],"description":"`publiee` : c'est la référence des contrôles et des générations."},"inchange":{"type":"boolean","description":"`true` : aucune nouvelle version n'a été créée, le contenu déposé est celui de la dernière version. Ne dit rien du reste : `type`, `profil`, `libelle`, `personnalisable` et `statut` (un brouillon redéposé avec `publier: true` est publié) sont ceux d'après l'appel."},"simulation":{"type":"boolean","description":"`true` : rien n'a été stocké."},"contenu_markdown":{"type":"string","description":"Le modèle tel qu'il a été compris, en Markdown."},"clauses":{"items":{"$ref":"#/components/schemas/ClauseDuModele"},"type":"array","description":"Clauses obligatoires, dans l'ordre du texte."},"variables":{"items":{"type":"string"},"type":"array","description":"Variables que le modèle lit, dans l'ordre du texte."},"variables_inconnues":{"items":{"type":"string"},"type":"array","description":"Variables absentes du catalogue : signalées, pas refusées."},"blocs_ia":{"items":{"$ref":"#/components/schemas/BlocIADuModele"},"type":"array","description":"Commentaires que l'IA rédigera à la génération."},"notes":{"items":{"$ref":"#/components/schemas/NoteDuModele"},"type":"array","description":"Notes au conseiller."},"anomalies":{"items":{"$ref":"#/components/schemas/AnomalieDeForme"},"type":"array","description":"Avertissements de forme (une erreur ferait refuser le dépôt)."},"impact":{"$ref":"#/components/schemas/Impact"}},"type":"object","required":["code","type","profil","libelle","personnalisable","version","statut","inchange","simulation","contenu_markdown","clauses","variables","variables_inconnues","blocs_ia","notes","anomalies","impact"],"title":"ModeleDeBaseDepose"},"ModeleDeBaseDetail":{"properties":{"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"type":{"type":"string","enum":["der","lettre_mission","mandat_courtage","rapport_conseil","declaration_adequation","mandat_rto","autre"],"description":"Type de document."},"profil":{"type":"string","enum":["conseiller","consultant","tous"],"description":"À qui le modèle s'adresse."},"libelle":{"type":"string","description":"Nom lisible du modèle."},"personnalisable":{"type":"boolean","description":"Les CIF peuvent-ils déposer leur propre version ?"},"version":{"type":"integer","description":"Numéro de la version (en simulation : celui qu'elle recevrait)."},"statut":{"type":"string","enum":["brouillon","publiee"],"description":"`publiee` : c'est la référence des contrôles et des générations."},"inchange":{"type":"boolean","description":"`true` : aucune nouvelle version n'a été créée, le contenu déposé est celui de la dernière version. Ne dit rien du reste : `type`, `profil`, `libelle`, `personnalisable` et `statut` (un brouillon redéposé avec `publier: true` est publié) sont ceux d'après l'appel."},"simulation":{"type":"boolean","description":"`true` : rien n'a été stocké."},"contenu_markdown":{"type":"string","description":"Le modèle tel qu'il a été compris, en Markdown."},"clauses":{"items":{"$ref":"#/components/schemas/ClauseDuModele"},"type":"array","description":"Clauses obligatoires, dans l'ordre du texte."},"variables":{"items":{"type":"string"},"type":"array","description":"Variables que le modèle lit, dans l'ordre du texte."},"variables_inconnues":{"items":{"type":"string"},"type":"array","description":"Variables absentes du catalogue : signalées, pas refusées."},"blocs_ia":{"items":{"$ref":"#/components/schemas/BlocIADuModele"},"type":"array","description":"Commentaires que l'IA rédigera à la génération."},"notes":{"items":{"$ref":"#/components/schemas/NoteDuModele"},"type":"array","description":"Notes au conseiller."},"anomalies":{"items":{"$ref":"#/components/schemas/AnomalieDeForme"},"type":"array","description":"Avertissements de forme (une erreur ferait refuser le dépôt)."},"versions":{"items":{"$ref":"#/components/schemas/VersionDeBase"},"type":"array","description":"Toutes les versions, de la plus ancienne à la plus récente."}},"type":"object","required":["code","type","profil","libelle","personnalisable","version","statut","inchange","simulation","contenu_markdown","clauses","variables","variables_inconnues","blocs_ia","notes","anomalies","versions"],"title":"ModeleDeBaseDetail"},"Moi":{"properties":{"cle":{"$ref":"#/components/schemas/CleCourante"},"environnement":{"type":"string","enum":["dev","recette","prod"],"description":"Environnement auquel la clé donne accès."},"ia":{"$ref":"#/components/schemas/ModeIA"}},"type":"object","required":["cle","environnement","ia"],"title":"Moi"},"NoteDuModele":{"properties":{"texte":{"type":"string","description":"Consigne au conseiller, retirée à la génération."},"ligne":{"type":"integer","description":"Ligne de la note."}},"type":"object","required":["texte","ligne"],"title":"NoteDuModele"},"OperationDiff":{"properties":{"op":{"type":"string","enum":["egal","supprime","ajoute"],"description":"Ce qu'il advient de ce morceau de texte."},"texte":{"type":"string","description":"Le morceau de texte."}},"type":"object","required":["op","texte"],"title":"OperationDiff"},"OptionsDocument":{"properties":{"formats":{"items":{"type":"string","enum":["markdown","html"]},"type":"array","minItems":1,"description":"Formats voulus dans la réponse. Par défaut le Markdown seul : demandez `html` pour l'affichage."},"si_modele_non_valide":{"type":"string","enum":["modele_de_base","generer","refuser"],"description":"Que faire si le modèle du CIF n'est pas `valide` : `modele_de_base` (on génère avec le modèle de base et on le dit), `generer` (avec le modèle du CIF malgré ses alertes) ou `refuser` (`422 modele_non_valide`). Sans effet si le modèle de base n'est pas personnalisable : il sert toujours, sans refus.","default":"modele_de_base"},"conserver_marques":{"type":"boolean","description":"Garde les marques de clause, invisibles, pour pouvoir contrôler le document retouché.","default":true},"blocs_ia":{"type":"boolean","description":"`false` : les commentaires non fournis restent à rédiger.","default":true},"verifier_blocs":{"type":"boolean","description":"Soumet les commentaires fournis au juge : contradiction avec une clause obligatoire.","default":false},"enrichir_produits":{"type":"boolean","description":"Complète les produits qui portent un `isin`.","default":true},"reference_romeo":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Votre référence, reportée au journal."}},"additionalProperties":false,"type":"object","title":"OptionsDocument"},"OrigineDuModele":{"properties":{"origine":{"type":"string","enum":["modele_cif","modele_de_base"],"description":"Le modèle qui a servi à générer."},"version_base":{"type":"integer","description":"Version du modèle de base (pour un modèle de CIF : celle de son contrôle)."},"version_cif":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Version du modèle du CIF, s'il a servi."},"etat_modele_cif":{"anyOf":[{"type":"string","enum":["valide","alertes","derivant"]},{"type":"null"}],"description":"État du modèle du CIF, s'il en a un."},"repli_sur_base":{"type":"boolean","description":"`true` : le CIF a un modèle, mais c'est le modèle de base qui a servi, parce que le sien n'était pas valide ou parce que le modèle de base n'est pas personnalisable (modèle du CIF suspendu, quel que soit `etat_modele_cif`)."}},"type":"object","required":["origine","version_base","repli_sur_base"],"title":"OrigineDuModele"},"ReferenceControle":{"properties":{"code":{"anyOf":[{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}$"},{"type":"null"}],"description":"Code d'un modèle de base.","examples":["der-conseiller"]},"version":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"description":"Version voulue ; par défaut, la version publiée courante."},"contenu":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Texte de référence, à la place de `code` (500 000 caractères au plus)."},"format":{"type":"string","enum":["markdown","html"],"description":"Format de `contenu`.","default":"markdown"},"donnees":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"Si elles sont fournies, la référence est d'abord rendue avec ces données et le contrôle compare deux documents (contrôle d'un document final retouché)."}},"additionalProperties":false,"type":"object","title":"ReferenceControle","description":"La référence : un modèle de base désigné par son `code`, ou un texte fourni dans `contenu`."},"ResumeControle":{"properties":{"bloquantes":{"type":"integer","description":"Alertes bloquantes.","default":0},"informations":{"type":"integer","description":"Alertes d'information.","default":0},"clauses_attendues":{"type":"integer","description":"Clauses obligatoires de la référence.","default":0},"clauses_intactes":{"type":"integer","description":"Clauses retrouvées à l'identique, à la typographie près.","default":0},"clauses_reformulees":{"type":"integer","description":"Clauses reformulées dont le sens est conservé.","default":0}},"type":"object","title":"ResumeControle"},"ResumeModeleDeBase":{"properties":{"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"type":{"type":"string","enum":["der","lettre_mission","mandat_courtage","rapport_conseil","declaration_adequation","mandat_rto","autre"],"description":"Type de document."},"profil":{"type":"string","enum":["conseiller","consultant","tous"],"description":"À qui le modèle s'adresse."},"libelle":{"type":"string","description":"Nom lisible du modèle."},"personnalisable":{"type":"boolean","description":"Les CIF peuvent-ils déposer leur propre version ?"},"version":{"type":"integer","description":"Version publiée courante ; à défaut, dernier brouillon."},"statut":{"type":"string","enum":["brouillon","publiee"],"description":"Statut de cette version."},"publiee_le":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Date de publication, UTC."},"nb_clauses":{"type":"integer","description":"Nombre de clauses obligatoires."},"modeles_cif":{"$ref":"#/components/schemas/ComptesModelesCif","description":"Nombre de modèles de CIF par état."}},"type":"object","required":["code","type","profil","libelle","personnalisable","version","statut","nb_clauses","modeles_cif"],"title":"ResumeModeleDeBase"},"Sante":{"properties":{"statut":{"type":"string","enum":["ok","degrade"],"description":"`degrade` (avec le code 503) si la base ne répond pas."},"service":{"type":"string","description":"Nom du service.","examples":["inovea-romeo"]},"version":{"type":"string","description":"Version du service.","examples":["0.1.0"]},"revision":{"type":"string","description":"Révision du code servie : l'identifiant du commit, ou `inconnue` hors d'une image construite par le déploiement.","default":"inconnue","examples":["a653dd83277e562295e158df51fd88bae0c38a17"]},"environnement":{"type":"string","enum":["dev","recette","prod"],"description":"Environnement servi."},"base_de_donnees":{"type":"string","enum":["ok","indisponible"],"description":"État de la base de données."},"ia":{"$ref":"#/components/schemas/ModeIA"},"heure":{"type":"string","format":"date-time","description":"Heure du serveur, UTC."},"erreur":{"anyOf":[{"$ref":"#/components/schemas/DetailErreur"},{"type":"null"}],"description":"Présent seulement avec le code 503 : `code` vaut `service_degrade`."}},"type":"object","required":["statut","service","version","environnement","base_de_donnees","ia","heure"],"title":"Sante"},"SuppressionModeleCif":{"properties":{"cif_id":{"type":"string","description":"Identifiant du CIF, tel que ROMEO l'a choisi.","examples":["CIF-0042"]},"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"supprime":{"type":"boolean","description":"`true` : le CIF est revenu au modèle de base."}},"type":"object","required":["cif_id","code","supprime"],"title":"SuppressionModeleCif"},"VariableCatalogue":{"properties":{"cle":{"type":"string","description":"Nom de la variable dans les modèles et les données.","examples":["org_orias"]},"libelle":{"type":"string","description":"Libellé lisible.","examples":["N° ORIAS de l'organisation"]},"type":{"type":"string","description":"`text`, `number`, `money`, `date`, `enum`, `bool`…","examples":["text"]},"groupe":{"type":"string","description":"Identifiant d'un groupe de `groupes`.","examples":["cabinet"]},"source":{"type":"string","enum":["figen","inovea"],"description":"Catalogue Figen, ou extension propre à Inovéa."}},"type":"object","required":["cle","libelle","type","groupe","source"],"title":"VariableCatalogue"},"VariablesDuModele":{"properties":{"code":{"type":"string","description":"Code du modèle de base.","examples":["der-conseiller"]},"version":{"type":"integer","description":"Version décrite : la version publiée courante."},"variables":{"items":{"type":"string"},"type":"array","description":"Variables que le modèle lit, dans l'ordre du texte."},"par_clause":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","description":"Variables de chaque clause obligatoire."},"variables_inconnues":{"items":{"type":"string"},"type":"array","description":"Variables du modèle absentes du catalogue."},"blocs_ia":{"items":{"type":"string"},"type":"array","description":"Clés des commentaires rédigés par l'IA."}},"type":"object","required":["code","version","variables","par_clause","variables_inconnues","blocs_ia"],"title":"VariablesDuModele"},"VerificationDonnees":{"properties":{"complet":{"type":"boolean","description":"`true` : générer maintenant avec ce corps ne lèvera aucune alerte bloquante due aux données. Il ne manque aucune variable (`manquantes` est vide) et aucune alerte de `alertes` n'est bloquante."},"manquantes":{"items":{"$ref":"#/components/schemas/DonneeManquante"},"type":"array","description":"Données sans valeur, dans l'ordre du texte."},"alertes":{"items":{"$ref":"#/components/schemas/Alerte"},"type":"array","description":"Ce que la génération à blanc a relevé, sous la forme de `conformite.alertes` de `POST /v1/documents`, bloquantes d'abord : `variable_non_resolue`, `clause_vide_au_rendu` (une mention obligatoire sort vide avec ces données), `condition_non_renseignee`. Les alertes qui tiennent aux commentaires à rédiger (`bloc_ia_indisponible`) n'y sont pas."},"conditions_non_renseignees":{"items":{"type":"string"},"type":"array","description":"Tenues pour fausses à la génération."},"inconnues":{"items":{"type":"string"},"type":"array","description":"Clés envoyées que ni le catalogue ni le modèle ne connaissent."}},"type":"object","required":["complet","manquantes","alertes","conditions_non_renseignees","inconnues"],"title":"VerificationDonnees"},"VersionDeBase":{"properties":{"version":{"type":"integer","description":"Numéro de la version."},"statut":{"type":"string","enum":["brouillon","publiee"],"description":"Brouillon ou publiée."},"cree_le":{"type":"string","format":"date-time","description":"Date du dépôt, UTC."},"notes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Ce qui change dans cette version."}},"type":"object","required":["version","statut","cree_le"],"title":"VersionDeBase"},"VersionsDeBase":{"properties":{"version_controlee":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Version de la base contre laquelle le dernier contrôle a tourné."},"version_validee":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Dernière version de la base sur laquelle le modèle a été valide ; `null` s'il ne l'a jamais été."},"version_courante":{"type":"integer","description":"Version publiée courante de la base."}},"type":"object","required":["version_courante"],"title":"VersionsDeBase","description":"Où en est le modèle d'un CIF par rapport à son modèle de base."}},"securitySchemes":{"CleApi":{"type":"http","description":"Clé d'API remise par Figen, à envoyer dans l'en-tête `Authorization: Bearer <clé>`.","scheme":"bearer","bearerFormat":"romeo_<env>_<aléa>"}}},"tags":[{"name":"Service","description":"État du service, identité de la clé, catalogue des variables et des blocs rédigés par l'IA."},{"name":"Modèles de base","description":"Les modèles de référence du groupe. Chaque dépôt crée une version immuable ; publier une version recontrôle aussitôt les modèles des CIF qui en dérivent."},{"name":"Modèles des CIF","description":"Le modèle qu'un CIF adapte à partir d'un modèle de base. Chaque dépôt est contrôlé : `valide`, `alertes` ou `derivant`. Seul un modèle `valide` sert à générer."},{"name":"Contrôles","description":"Contrôle de conformité d'un texte par rapport à sa référence : les clauses obligatoires sont comparées mot à mot, l'IA ne juge que ce qui a changé."},{"name":"Documents","description":"Génération d'un document à partir d'un modèle et de données. Aucun document ni aucune donnée de client n'est conservé."},{"name":"Suivi","description":"Journal des générations (sans contenu) et fil des changements d'état à interroger."}]}