{"openapi":"3.1.0","info":{"title":"SecuAI Gateway","description":"API compatible OpenAI de SecuAAS : inférence (conversation, embeddings, audio), anonymisation de données personnelles et consultation des correspondances d'anonymisation. Authentification par clé API transmise en Bearer.","version":"0.286.19"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}},"security":[]}},"/v1/models":{"get":{"tags":["models"],"summary":"List models","operationId":"get_models_v1_models_get","responses":{"200":{"description":"Modèles accessibles à la clé appelante.","content":{"application/json":{"schema":{"properties":{"object":{"type":"string","title":"Object","default":"list"},"data":{"items":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","title":"Object","default":"model"},"created":{"type":"integer","title":"Created"},"owned_by":{"type":"string","title":"Owned By"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Descriptif du modèle (contenu variable)."}},"additionalProperties":true,"type":"object","required":["id","created","owned_by"],"title":"ModelObject"},"type":"array","title":"Data"}},"additionalProperties":true,"type":"object","required":["data"],"title":"ModelList"}}}},"401":{"description":"Clé absente ou invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}}},"x-secuhub-permission":"ai_model:read"}},"/v1/chat/completions":{"post":{"tags":["chat"],"summary":"Chat completions","operationId":"chat_completions_v1_chat_completions_post","requestBody":{"description":"Requête de complétion de conversation.","content":{"application/json":{"schema":{"properties":{"model":{"type":"string","minLength":1,"title":"Model","description":"Identifiant du modèle (``GET /v1/models``)."},"messages":{"items":{"properties":{"role":{"type":"string","title":"Role","description":"``system``, ``user``, ``assistant`` ou ``tool``."},"content":{"anyOf":[{"type":"string"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Content","description":"Texte, ou liste de parties (texte, image...)."}},"additionalProperties":true,"type":"object","required":["role"],"title":"ChatMessage"},"type":"array","title":"Messages","description":"Conversation, dans l'ordre."},"stream":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stream","description":"``true`` : réponse en flux ``text/event-stream``."},"stream_options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stream Options"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"top_p":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top P"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens","description":"Refusé (400) au-delà du plafond de sortie du modèle."},"stop":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stop"},"tools":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tools"},"tool_choice":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Choice"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"additionalProperties":true,"type":"object","required":["model","messages"],"title":"ChatCompletionRequest"}}},"required":true},"responses":{"200":{"description":"Complétion JSON, ou flux SSE de fragments terminé par `data: [DONE]`.","content":{"application/json":{"schema":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"object":{"type":"string","title":"Object","default":"chat.completion"},"created":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created"},"model":{"type":"string","title":"Model"},"choices":{"items":{"properties":{"index":{"type":"integer","title":"Index"},"message":{"properties":{"role":{"type":"string","title":"Role","description":"``system``, ``user``, ``assistant`` ou ``tool``."},"content":{"anyOf":[{"type":"string"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Content","description":"Texte, ou liste de parties (texte, image...)."}},"additionalProperties":true,"type":"object","required":["role"],"title":"ChatMessage"},"finish_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finish Reason"}},"additionalProperties":true,"type":"object","required":["index","message"],"title":"ChatChoice"},"type":"array","title":"Choices"},"usage":{"anyOf":[{"properties":{"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Tokens"},"completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completion Tokens"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens"}},"additionalProperties":true,"type":"object","title":"Usage"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["model","choices"],"title":"ChatCompletionResponse"}},"text/event-stream":{"schema":{"type":"string","description":"Lignes `data: {json}` (fragments), puis `data: [DONE]`."}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"401":{"description":"Clé absente ou invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"403":{"description":"Accès refusé (modèle hors périmètre de la clé, politique du tenant).","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"429":{"description":"Limite de débit atteinte.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"502":{"description":"Erreur du fournisseur amont.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"503":{"description":"Service momentanément indisponible.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/messages":{"post":{"summary":"Messages (format Anthropic)","operationId":"anthropic_messages_v1_messages_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/messages/count_tokens":{"post":{"summary":"Comptage de jetons (format Anthropic)","operationId":"anthropic_count_tokens_v1_messages_count_tokens_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/audio/transcriptions":{"post":{"tags":["audio"],"summary":"Audio transcriptions","operationId":"transcribe_audio_v1_audio_transcriptions_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcribe_audio_v1_audio_transcriptions_post"}}},"required":true},"responses":{"200":{"description":"Transcription : JSON, ou texte brut si `response_format=text`.","content":{"application/json":{"schema":{"properties":{"text":{"type":"string","title":"Text"}},"additionalProperties":true,"type":"object","required":["text"],"title":"TranscriptionResponse"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"401":{"description":"Clé absente ou invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"403":{"description":"Accès refusé (modèle hors périmètre de la clé, politique du tenant).","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"413":{"description":"Fichier trop volumineux.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"429":{"description":"Limite de débit atteinte.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"502":{"description":"Erreur du fournisseur amont.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"503":{"description":"Service momentanément indisponible.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/embeddings":{"post":{"tags":["embeddings"],"summary":"Embeddings","operationId":"create_embeddings_v1_embeddings_post","requestBody":{"description":"Requête d'embeddings.","content":{"application/json":{"schema":{"properties":{"model":{"type":"string","minLength":1,"title":"Model","description":"Identifiant d'un modèle d'embeddings."},"input":{"anyOf":[{"type":"string"},{"items":{},"type":"array"}],"title":"Input","description":"Un texte, ou une liste de textes."},"encoding_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Encoding Format"},"dimensions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimensions"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}},"additionalProperties":true,"type":"object","required":["model","input"],"title":"EmbeddingRequest"}}},"required":true},"responses":{"200":{"description":"Vecteurs d'embeddings.","content":{"application/json":{"schema":{"properties":{"object":{"type":"string","title":"Object","default":"list"},"data":{"items":{"properties":{"object":{"type":"string","title":"Object","default":"embedding"},"index":{"type":"integer","title":"Index"},"embedding":{"items":{"type":"number"},"type":"array","title":"Embedding"}},"additionalProperties":true,"type":"object","required":["index","embedding"],"title":"EmbeddingItem"},"type":"array","title":"Data"},"model":{"type":"string","title":"Model"},"usage":{"anyOf":[{"properties":{"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Tokens"},"completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completion Tokens"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens"}},"additionalProperties":true,"type":"object","title":"Usage"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["data","model"],"title":"EmbeddingResponse"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"401":{"description":"Clé absente ou invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"403":{"description":"Accès refusé (modèle hors périmètre de la clé, politique du tenant).","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"429":{"description":"Limite de débit atteinte.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"502":{"description":"Erreur du fournisseur amont.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"503":{"description":"Service momentanément indisponible.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/audio/speech":{"post":{"tags":["audio"],"summary":"Text to speech","operationId":"synthesize_speech_v1_audio_speech_post","requestBody":{"description":"Requête de synthèse vocale.","content":{"application/json":{"schema":{"properties":{"model":{"type":"string","minLength":1,"title":"Model","description":"Identifiant d'un modèle de synthèse vocale."},"input":{"type":"string","maxLength":4096,"title":"Input","description":"Texte à synthétiser (4096 caractères max)."},"voice":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},{"type":"null"}],"title":"Voice"},"language":{"anyOf":[{"type":"string","pattern":"^[A-Za-z][A-Za-z _-]{0,63}$"},{"type":"null"}],"title":"Language","description":"NOM de langue (``French``, ``auto``), pas un code ISO-639-1."},"response_format":{"anyOf":[{"type":"string","pattern":"^[a-z0-9][a-z0-9_.-]{0,15}$"},{"type":"null"}],"title":"Response Format"},"instruct":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Instruct","description":"Consigne de style (1024 caractères max)."}},"additionalProperties":true,"type":"object","required":["model","input"],"title":"SpeechRequest","description":"Corps de ``POST /v1/audio/speech``. ``speed`` n'est pas servi (400)."}}},"required":true},"responses":{"200":{"description":"Audio synthétisé (corps binaire).","content":{"application/json":{"schema":{}},"audio/*":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"401":{"description":"Clé absente ou invalide.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"403":{"description":"Accès refusé (modèle hors périmètre de la clé, politique du tenant).","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"429":{"description":"Limite de débit atteinte.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"502":{"description":"Erreur du fournisseur amont.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}},"503":{"description":"Service momentanément indisponible.","content":{"application/json":{"schema":{"properties":{"error":{"properties":{"message":{"type":"string","title":"Message","description":"Message lisible."},"type":{"type":"string","title":"Type","description":"Catégorie d'erreur, ex. ``invalid_request_error``."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Champ en cause, s'il y en a un."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Code machine stable."}},"additionalProperties":true,"type":"object","required":["message","type"],"title":"OpenAIErrorBody"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","description":"Identifiant de corrélation, présent sur certains refus."}},"additionalProperties":true,"type":"object","required":["error"],"title":"OpenAIErrorResponse"}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/ocr":{"post":{"tags":["ocr"],"summary":"OCR","operationId":"ocr_document_v1_ocr_post","requestBody":{"content":{"application/json":{"schema":{"properties":{"model":{"type":"string"},"document":{"properties":{"type":{"type":"string","enum":["document_url","image_url"]},"document_url":{"type":"string"},"image_url":{"type":"string"}},"type":"object","required":["type"]},"pages":{"items":{"type":"integer","minimum":0.0},"type":"array"},"include_image_base64":{"type":"boolean","enum":[false]}},"additionalProperties":false,"type":"object","required":["model","document"]}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-secuhub-permission":"ai_gateway:call"}},"/v1/anonymize":{"post":{"tags":["anonymize"],"summary":"Anonymize","operationId":"anonymize_v1_anonymize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/anonymize/reverse":{"post":{"tags":["anonymize"],"summary":"Anonymize Reverse","operationId":"anonymize_reverse_v1_anonymize_reverse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mappings":{"get":{"tags":["mappings"],"summary":"List Mappings","operationId":"list_mappings_v1_mappings_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(active|revoked|expired|all)$","default":"active","title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Category"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MappingListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mappings/{mapping_id}":{"get":{"tags":["mappings"],"summary":"Get Mapping Metadata","operationId":"get_mapping_metadata_v1_mappings__mapping_id__get","parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","minLength":32,"maxLength":36,"title":"Mapping Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MappingMetadata"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mappings"],"summary":"Delete Mapping","operationId":"delete_mapping_v1_mappings__mapping_id__delete","parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","minLength":32,"maxLength":36,"title":"Mapping Id"}}],"responses":{"204":{"description":"Mapping purged"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mappings/{mapping_id}/pairs":{"get":{"tags":["mappings"],"summary":"Get Mapping Pairs","operationId":"get_mapping_pairs_v1_mappings__mapping_id__pairs_get","parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","minLength":32,"maxLength":36,"title":"Mapping Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-Access-Reason","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Access-Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AnonymizePairView":{"properties":{"category":{"type":"string","title":"Category"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"source_layer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Layer"},"recognizer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recognizer"},"original_masked":{"type":"string","title":"Original Masked"},"pseudo_masked":{"type":"string","title":"Pseudo Masked"}},"additionalProperties":false,"type":"object","required":["category","score","source_layer","recognizer","original_masked","pseudo_masked"],"title":"AnonymizePairView"},"AnonymizeRequest":{"properties":{"text":{"type":"string","maxLength":64000,"minLength":1,"title":"Text"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories"},"persist":{"type":"boolean","title":"Persist","default":true},"ttl_seconds":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":60.0},{"type":"null"}],"title":"Ttl Seconds"},"allow_tenant_wide":{"type":"boolean","title":"Allow Tenant Wide","default":false},"session_id":{"anyOf":[{"type":"string","pattern":"^[0-9a-fA-F]{32}$|^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},{"type":"null"}],"title":"Session Id"},"layer_trace":{"type":"boolean","title":"Layer Trace","default":false}},"additionalProperties":false,"type":"object","required":["text"],"title":"AnonymizeRequest"},"AnonymizeResponse":{"properties":{"anonymized_text":{"type":"string","title":"Anonymized Text"},"mapping_id":{"type":"string","title":"Mapping Id"},"ttl_sec":{"type":"integer","title":"Ttl Sec"},"categories_detected":{"items":{"type":"string"},"type":"array","title":"Categories Detected"},"matches_count":{"type":"integer","title":"Matches Count"},"storage":{"type":"string","title":"Storage","default":"redis"},"unique_pii_count":{"type":"integer","title":"Unique Pii Count","default":0},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"reversible":{"type":"boolean","title":"Reversible","default":false},"mapping_scope":{"type":"string","title":"Mapping Scope","default":"none"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"detection_layers_active":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Detection Layers Active"},"detection_degraded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Detection Degraded"},"low_confidence_dropped":{"anyOf":[{"items":{"$ref":"#/components/schemas/DroppedSpanView"},"type":"array"},{"type":"null"}],"title":"Low Confidence Dropped"},"leak_self_check":{"anyOf":[{"$ref":"#/components/schemas/LeakSelfCheck"},{"type":"null"}]},"pairs":{"anyOf":[{"items":{"$ref":"#/components/schemas/AnonymizePairView"},"type":"array"},{"type":"null"}],"title":"Pairs"},"detection_degraded_layers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Detection Degraded Layers"},"output_witness":{"anyOf":[{"$ref":"#/components/schemas/OutputWitnessView"},{"type":"null"}]},"unmasked_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unmasked Count"},"unmasked_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Unmasked Categories"},"unmasked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unmasked Reason"},"layer_trace":{"anyOf":[{"$ref":"#/components/schemas/LayerTraceView"},{"type":"null"}]},"layer_trace_status":{"type":"string","title":"Layer Trace Status","default":"not_requested"}},"type":"object","required":["anonymized_text","mapping_id","ttl_sec","categories_detected","matches_count"],"title":"AnonymizeResponse"},"Body_transcribe_audio_v1_audio_transcriptions_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"model":{"type":"string","title":"Model","default":"secuai-whisper"},"response_format":{"type":"string","title":"Response Format","default":"json"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","required":["file"],"title":"Body_transcribe_audio_v1_audio_transcriptions_post"},"DroppedSpanView":{"properties":{"category":{"type":"string","title":"Category"},"score":{"type":"number","title":"Score"},"threshold":{"type":"number","title":"Threshold"},"format_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Format Valid"},"survives_in_output":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Survives In Output"},"identifier_shaped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Identifier Shaped"}},"additionalProperties":false,"type":"object","required":["category","score","threshold"],"title":"DroppedSpanView"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LayerTraceEntityView":{"properties":{"category":{"type":"string","title":"Category"},"start":{"type":"integer","title":"Start"},"end":{"type":"integer","title":"End"},"value":{"type":"string","title":"Value"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"recognizer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recognizer"}},"type":"object","required":["category","start","end","value"],"title":"LayerTraceEntityView"},"LayerTraceInputView":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"received_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Received At"},"normalized_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Text"}},"type":"object","title":"LayerTraceInputView"},"LayerTraceStepView":{"properties":{"layer":{"type":"string","title":"Layer"},"status":{"type":"string","title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"},"duration_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Ms"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"text_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Error"},"entities":{"items":{"$ref":"#/components/schemas/LayerTraceEntityView"},"type":"array","title":"Entities"},"entities_removed":{"items":{"$ref":"#/components/schemas/LayerTraceEntityView"},"type":"array","title":"Entities Removed"},"facts":{"additionalProperties":true,"type":"object","title":"Facts"}},"type":"object","required":["layer","status"],"title":"LayerTraceStepView"},"LayerTraceView":{"properties":{"schema":{"type":"string","title":"Schema"},"input":{"$ref":"#/components/schemas/LayerTraceInputView"},"steps":{"items":{"$ref":"#/components/schemas/LayerTraceStepView"},"type":"array","title":"Steps"}},"type":"object","required":["schema","input"],"title":"LayerTraceView"},"LeakSelfCheck":{"properties":{"original_pii_found_in_provider_request":{"type":"boolean","title":"Original Pii Found In Provider Request"},"count":{"type":"integer","title":"Count"},"count_l4_unmasked":{"type":"integer","title":"Count L4 Unmasked","default":0}},"additionalProperties":false,"type":"object","required":["original_pii_found_in_provider_request","count"],"title":"LeakSelfCheck"},"MappingListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MappingMetadata"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"additionalProperties":false,"type":"object","required":["items","next_cursor"],"title":"MappingListResponse"},"MappingMetadata":{"properties":{"mapping_id":{"type":"string","title":"Mapping Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"virtual_key_id":{"type":"string","title":"Virtual Key Id"},"ttl_policy":{"type":"string","title":"Ttl Policy"},"categories_detected":{"items":{"type":"string"},"type":"array","title":"Categories Detected"},"matches_count":{"type":"integer","title":"Matches Count"},"unique_pii_count":{"type":"integer","title":"Unique Pii Count"},"reverse_count":{"type":"integer","title":"Reverse Count"},"raw_access_count":{"type":"integer","title":"Raw Access Count"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"type":"string","title":"Expires At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"last_reverse_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Reverse At"},"last_raw_access_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Raw Access At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"}},"additionalProperties":false,"type":"object","required":["mapping_id","tenant_id","virtual_key_id","ttl_policy","categories_detected","matches_count","unique_pii_count","reverse_count","raw_access_count","status","created_at","expires_at","last_used_at","last_reverse_at","last_raw_access_at","revoked_at"],"title":"MappingMetadata"},"OutputWitnessView":{"properties":{"status":{"type":"string","title":"Status"},"count":{"type":"integer","title":"Count"},"families":{"items":{"type":"string"},"type":"array","title":"Families"}},"additionalProperties":false,"type":"object","required":["status","count","families"],"title":"OutputWitnessView"},"PairItem":{"properties":{"category":{"type":"string","title":"Category"},"pseudo":{"type":"string","title":"Pseudo"},"original":{"type":"string","title":"Original"},"occurrences":{"type":"integer","title":"Occurrences"},"positions_in_original_text":{"items":{"items":{"type":"integer"},"type":"array"},"type":"array","title":"Positions In Original Text"},"format_match":{"type":"boolean","title":"Format Match"}},"additionalProperties":false,"type":"object","required":["category","pseudo","original","occurrences","positions_in_original_text","format_match"],"title":"PairItem"},"PairsResponse":{"properties":{"mapping_id":{"type":"string","title":"Mapping Id"},"pairs":{"items":{"$ref":"#/components/schemas/PairItem"},"type":"array","title":"Pairs"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"total_pairs":{"type":"integer","title":"Total Pairs"}},"additionalProperties":false,"type":"object","required":["mapping_id","pairs","next_cursor","total_pairs"],"title":"PairsResponse"},"ReverseRequest":{"properties":{"text":{"type":"string","maxLength":64000,"minLength":1,"title":"Text"},"mapping_id":{"anyOf":[{"type":"string","pattern":"^[0-9a-fA-F]{32}$|^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},{"type":"null"}],"title":"Mapping Id"},"session_id":{"anyOf":[{"type":"string","pattern":"^[0-9a-fA-F]{32}$|^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},{"type":"null"}],"title":"Session Id"},"strict":{"type":"boolean","title":"Strict","default":false}},"additionalProperties":false,"type":"object","required":["text"],"title":"ReverseRequest"},"ReverseResponse":{"properties":{"reverted_text":{"type":"string","title":"Reverted Text"},"mapping_id":{"type":"string","title":"Mapping Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"mappings_used":{"type":"integer","title":"Mappings Used","default":1},"substitutions_applied":{"type":"integer","title":"Substitutions Applied"},"partial_substitutions":{"type":"integer","title":"Partial Substitutions"},"input_pseudo_tokens":{"type":"integer","title":"Input Pseudo Tokens","default":0},"unresolved_tokens":{"type":"integer","title":"Unresolved Tokens","default":0},"reverse_complete":{"type":"boolean","title":"Reverse Complete","default":true},"conflicting_tokens":{"type":"integer","title":"Conflicting Tokens","default":0},"mapping_status":{"type":"string","title":"Mapping Status"}},"type":"object","required":["reverted_text","mapping_id","substitutions_applied","partial_substitutions","mapping_status"],"title":"ReverseResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API transmise en-tête `Authorization: Bearer <clé>` : la clé API SecuAI. Selon activation de cette fonction sur la passerelle, la clé de workspace émise par SecuHub est aussi acceptée. Une clé de workspace agit dans SON workspace et SON tenant, et exige une permission SecuHub par opération, indiquée par `x-secuhub-permission` : `ai_gateway:call` pour l'inférence (conversation, embeddings, audio), `ai_model:read` pour la liste des modèles. La comparaison est exacte : une permission voisine n'ouvre rien. Les opérations sans `x-secuhub-permission` n'acceptent pas les clés de workspace. Un en-tête `X-SecuHub-Workspace-Id` ou `X-SecuAI-Tenant` qui contredit la clé est refusé (403)."}}},"security":[{"bearerAuth":[]}]}