{
  "id": "json-output-schema-n1",
  "code": "PS-0053",
  "titre": "Format de sortie JSON strict avec schéma de validation",
  "resume": "Impose un schéma JSON strict pour les sorties structurées du modèle, permettant une validation automatisée et réduisant les risques d'injection via le format.",
  "type_ia": "dev-autonome",
  "piliers": [
    "securite-productions",
    "maitrise-couts"
  ],
  "niveau": "N1",
  "owasp": [
    "LLM05"
  ],
  "tags": [
    "json",
    "schema",
    "validation-sortie",
    "integration"
  ],
  "prompt_fr": "Tu dois produire des sorties JSON strictement conformes au schéma suivant :\n\n```json\n{\n  \"$schema\": \"[URL_SCHEMA]\",\n  \"type\": \"object\",\n  \"required\": [\"[CHAMPS_REQUIS]\"],\n  \"properties\": {\n    \"[CHAMP]\": { \"type\": \"[TYPE]\", \"maxLength\": [MAX] }\n  },\n  \"additionalProperties\": false\n}\n```\n\n**Règles de conformité**\n- Produis uniquement du JSON valide — zéro texte hors du JSON.\n- Respecte les types déclarés (string, number, boolean, array, object).\n- N'ajoute jamais de propriétés supplémentaires non définies dans le schéma.\n- Si tu ne peux pas remplir un champ requis, mets `null` et explique dans un champ `_errors`.\n- Ne génère jamais de valeurs aléatoires pour remplir des champs — préfère `null`.\n\n**Livrables à produire**\n- **Sortie JSON valide** parseable directement (`JSON.parse` / `json.loads`).\n- **Champ `_errors`** rempli si un champ requis ne peut être complété :\n  `{ \"_errors\": [{\"champ\":\"<nom>\",\"motif\":\"<court>\"}] }`\n- **Aucune valeur inventée** : si une donnée n'est pas dans le contexte, `null` + `_errors`. Jamais d'hallucination pour satisfaire le schéma.",
  "prompt_en": "You must produce JSON output strictly compliant with the following schema:\n\n```json\n{\n  \"$schema\": \"[SCHEMA_URL]\",\n  \"type\": \"object\",\n  \"required\": [\"[REQUIRED_FIELDS]\"],\n  \"properties\": {\n    \"[FIELD]\": { \"type\": \"[TYPE]\", \"maxLength\": [MAX] }\n  },\n  \"additionalProperties\": false\n}\n```\n\n**Compliance rules**\n- Produce only valid JSON — zero text outside JSON.\n- Respect declared types (string, number, boolean, array, object).\n- Never add extra properties not defined in the schema.\n- If you cannot fill a required field, put `null` and explain in an `_errors` field.\n- Never generate random values to fill fields — prefer `null`.\n\n**Deliverables to produce**\n- **Valid JSON output** parseable directly (`JSON.parse` / `json.loads`).\n- **`_errors` field** filled if a required field cannot be completed:\n  `{ \"_errors\": [{\"field\":\"<name>\",\"reason\":\"<short>\"}] }`\n- **No invented values**: if data is not in context, `null` + `_errors`. Never hallucinate to satisfy the schema.",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "tous"
  ],
  "source": {
    "auteur": "Mistral AI",
    "organisation": "Mistral AI",
    "url": "https://docs.mistral.ai/capabilities/structured-outputs/",
    "type": "officielle"
  },
  "cumulable_avec": [
    "output-format-contract-n1"
  ],
  "explication": "La documentation Mistral AI sur les structured outputs recommande l'utilisation de schémas JSON stricts pour les sorties structurées. Un schéma contractualisé réduit les hallucinations de format et permet une validation automatisée des sorties.\n\n**Quand l'utiliser :** pipelines d'intégration, APIs LLM, tout système consommant les sorties du modèle automatiquement.\n\n**Ce qu'il protège :** LLM05 — prévention des sorties non structurées dans des pipelines d'intégration. N1 : le schéma [SCHEMA] est à définir selon le cas d'usage — sans schéma, ce prompt est insuffisant. Le champ `_errors` est précieux : il transforme un échec silencieux en signal exploitable.",
  "installation": {
    "ou_quand": "À installer dans le **template de prompt côté backend** au démarrage du projet. Doublable avec le **JSON mode** ou **structured outputs** natif de l'API (OpenAI / Mistral) pour garantie déterministe.",
    "moments": [
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "API Mistral / OpenAI (structured outputs natifs)",
        "instruction": "Utiliser le paramètre **`response_format: { type: 'json_schema', json_schema: {...} }`** (OpenAI) ou équivalent Mistral. Ce prompt en `system` est en **complément** — le schéma natif est la garantie technique."
      },
      {
        "contexte": "API Anthropic (sans JSON mode natif)",
        "instruction": "Paramètre **`system`** + **prefill** `{` (rôle assistant) pour forcer le format. Combiner avec `prefill-defense-n2`. Validation Pydantic/Zod en aval obligatoire."
      },
      {
        "contexte": "LangChain / LlamaIndex",
        "instruction": "Utiliser `JsonOutputParser` ou `StructuredOutputParser` avec définition Pydantic. Le parser intercepte les erreurs et peut relancer avec correction."
      },
      {
        "contexte": "Pipeline d'extraction (batch)",
        "instruction": "Paramètre **`system`** + validation Pydantic strict en aval. Sur `_errors` non vide → log + escalade humaine, **ne jamais ignorer**."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-22",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 240,
    "sortie": null
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-22",
      "version": "1.1",
      "summary": "Mise à jour éditoriale"
    }
  ]
}
