ULTINEO

Applications IA

Une application est une application d'IA réutilisable : un modèle, des champs d'entrée que votre appelant remplit, et les instructions envoyées au modèle. Vous créez les applications avec cette ressource, puis vous les exécutez avec Exécutions IA. Une application reste privée à votre projet tant que vous ne la publiez pas.

Points d'accès

MéthodeCheminDroit
POST/v1/ai/app/createapp:write
GET/v1/ai/app/listapp:read
GET/v1/ai/app/detail/<app_id>app:read
PATCH/v1/ai/app/detail/<app_id>app:write

<app_id> est un identifiant d'application, préfixé mapp_. La modification se fait sur le chemin detail ; il n'y a pas de chemin de mise à jour distinct. L'API ne supprime pas d'application.

L'objet app

ChampTypeDescription
idchaîneL'identifiant de l'application, préfixé mapp_.
objectchaîneToujours app.
namechaîneLe nom de l'application.
descriptionchaîneCe que fait l'application.
catalog_categorychaîneLe métier sous lequel l'application est classée, par son identifiant (préfixé acci_), ou une chaîne vide.
typechaîneprivate ou public.
statuschaînedraft ou activated. Seule une application activée peut être exécutée.
logochaîneL'identifiant du fichier logo de l'application, ou une chaîne vide.
modelchaîneLe modèle utilisé par l'application, préfixé modi_.
model_librarychaîneLa version exacte du modèle retenue pour cette application, préfixée mlyi_.
datatableauLes champs d'entrée. Un objet par champ que l'appelant remplit.
instructiontableauLes instructions envoyées au modèle. null si l'application ne vous appartient pas.
runsobjetCompteurs d'exécutions, private (exécutions du projet propriétaire) et public (exécutions des autres projets).
tokensobjetLes jetons dépensés par votre projet sur l'application, input, output et total, ou null.
created_atentierDate de création, en secondes Unix.
updated_atentierDernière modification, en secondes Unix.

Chaque entrée de data décrit un champ d'entrée :

ChampTypeDescription
idchaîneL'identifiant du champ, préfixé madi_.
namechaîneLe nom du champ. C'est la clé que vous envoyez pour lancer une exécution.
typechaîneLe type du champ, par son identifiant (préfixé mdti_). Voir Types de champ.
placeholderchaîneL'indication affichée à la personne qui remplit le champ.
requiredbooléenSi une exécution doit fournir une valeur.

tokens couvre toute la vie de l'application, et non le cycle de facturation en cours, et ne compte que les exécutions de votre propre projet. Les exécutions terminées sur une erreur sont exclues. Voir Quota et consommation de jetons IA pour les chiffres du cycle en cours.

Créer une application

POST /v1/ai/app/create demande un nom, une description, au moins un champ d'entrée et au moins une instruction.

ParamètreTypeObligatoireDescription
namechaîneOuiLe nom de l'application.
descriptionchaîneOuiCe que fait l'application.
datatableauOuiLes champs d'entrée. Chaque objet demande un type et un name non vides, et peut préciser placeholder et required (true par défaut). Voir Types de champ.
instructiontableauOuiChaque objet demande un type non vide et une instruction (acceptée aussi sous prompt). Voir Types d'instruction.
categorychaîneNonLa tâche que réalise l'application, utilisée pour choisir un modèle. Voir Catégories de tâche. Acceptée aussi sous task_type ou model_task_type.
modelchaîneNonUn modèle, par identifiant ou par nom (par exemple qwen3). La meilleure version que permet votre forfait est utilisée.
model_librarychaîneNonUne version exacte de modèle, par identifiant.
catalog_categorychaîneNonLe métier sous lequel classer l'application, par identifiant ou par nom anglais (par exemple Customer Support & Call Centres).
statuschaîneNondraft ou activated. activated par défaut.
typechaîneNonprivate ou public. private par défaut.

Envoyez category, model ou model_library pour que l'API puisse choisir un modèle ; model_library l'emporte sur model, qui l'emporte sur category.

curl
curl -X POST https://api.ultineo.com/v1/ai/app/create \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Support triage",
    "description": "Sorts an inbound support message by urgency.",
    "category": "classify",
    "data": [
      { "type": "text area", "name": "message", "placeholder": "Paste the message", "required": true }
    ],
    "instruction": [
      { "type": "text", "instruction": "Classify the message as low, normal or urgent." }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "mapp_0ceacb46e5b3a99e91b6",
    "object": "app",
    "name": "Support triage",
    "description": "Sorts an inbound support message by urgency.",
    "category": "classify",
    "catalog_category": "",
    "model": "modi_c2b7e9a1d3f0a8645c8e",
    "model_library": "mlyi_c2a1e7d9b4f30685c3a3",
    "data": {
      "madi_5d8b21c74e0af96b3d15": {
        "type": "text area",
        "value": "message",
        "placeholder": "Paste the message",
        "required": true
      }
    },
    "instruction": {
      "miid_9a4c07e5b312df8641ca": {
        "type": "text",
        "instruction": "Classify the message as low, normal or urgent."
      }
    },
    "status": "activated",
    "created_at": 1789206600
  }
}

Remarque — La création répond 200 et non 201, et ses data et instruction sont des objets indexés par les nouveaux identifiants, et non les tableaux que renvoient les lectures. Relisez l'application avec GET /v1/ai/app/detail/<app_id> si vous avez besoin de la forme habituelle.

CodeMessageCause
400Missing required field: name.Aucun nom n'a été envoyé. Le même message nomme description.
422Each data object must contain non-empty 'type' and 'name' properties.data est absent, ou l'un de ses champs n'a ni type ni nom.
422Each instruction object must contain non-empty 'type' and 'instruction' properties.instruction est absent, ou l'une de ses entrées est incomplète.
422At least one data field must be required.Tous les champs ont été envoyés avec "required": false.
404The selected data type does not exist.Un type de champ ne fait pas partie des types de champ.
404The selected instruction type does not exist.Un type d'instruction ne fait pas partie des types d'instruction.
404The selected model does not exist.model ne désigne aucun modèle.
422No available model was found for the selected category or current billing plan.Aucun modèle ne correspond à la catégorie dans votre forfait, ou rien n'a été envoyé pour en choisir un.
422The selected catalog_category does not exist.catalog_category ne désigne aucun métier.
402The current billing plan does not allow custom app creation for this project.Votre forfait n'inclut aucune application.
402The current billing plan app limit has been reached for this project.Votre projet a déjà autant d'applications que votre forfait le permet.

Types de champ

Le type que vous envoyez dans data est l'un des noms ci-dessous. Son identifiant est aussi accepté, et c'est l'identifiant que renvoient les lectures.

typeIdentifiantCe que le champ recueille
inputmdti_c2a39a7ad82bc017dccdUne ligne de texte.
text areamdti_fdd932b23e1fa82aa942Un bloc de texte.
numbermdti_0bf56e96d417b823b7e8Un nombre.
emailmdti_52f84207d0f8a95ed43dUne adresse e-mail.
documentmdti_5017cf8657e1df4df809Un fichier PDF, DOCX, XLSX, CSV ou TXT. Le modèle en lit le texte.
imagemdti_1777f1beedfbd5cde030Une image. Seul un modèle qui lit les images peut l'utiliser.

Les champs document et image ne prennent pas de texte saisi : une exécution fournit un fichier déjà présent dans la bibliothèque de fichiers de votre projet. Voir Exécutions IA.

Types d'instruction

Le type de chaque instruction indique le genre de réponse attendu :

typeIdentifiant
textaiti_d0c8a5e7b2f3a6c4e9d1
nombreaiti_d7a3c1f9e2b4d8a6c0f5
elementaiti_4a8e1d6b9c3f0a52c7e5
notationaiti_8d6c3b1a9e0f7c24a5e8
percentaiti_7f0a3b5d9c2e1a648c7e
imageaiti_8c4e9d2a0b6f1c73a5e1

Catégories de tâche

category prend l'un de ces noms (ou son identifiant) : general, summarizing, writing, analyze, solving, decision, excracting, coding, translation, classify, chatting, scoring, embedding. Envoyez les noms exactement tels qu'ils sont écrits ici.

Lister vos applications

GET /v1/ai/app/list renvoie les applications de votre projet, de la plus récente à la plus ancienne, sans les applications supprimées. Il accepte limit et offset.

curl
curl "https://api.ultineo.com/v1/ai/app/list?limit=2" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "data": [
      {
        "id": "mapp_0ceacb46e5b3a99e91b6",
        "object": "app",
        "name": "Support triage",
        "description": "Sorts an inbound support message by urgency.",
        "catalog_category": "",
        "type": "private",
        "status": "activated",
        "model": "modi_c2b7e9a1d3f0a8645c8e",
        "model_library": "mlyi_c2a1e7d9b4f30685c3a3",
        "runs": { "private": 12, "public": 0 },
        "tokens": { "input": 8420, "output": 3115, "total": 11535 },
        "created_at": 1789206600,
        "updated_at": 1789206600
      }
    ],
    "total": 1
  }
}

La liste omet data, instruction et logo : lisez une application pour les obtenir.

Lire une application

GET /v1/ai/app/detail/<app_id> renvoie l'objet complet, y compris les champs d'entrée nécessaires pour lancer une exécution.

curl
curl https://api.ultineo.com/v1/ai/app/detail/mapp_0ceacb46e5b3a99e91b6 \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "mapp_0ceacb46e5b3a99e91b6",
    "object": "app",
    "name": "Support triage",
    "description": "Sorts an inbound support message by urgency.",
    "catalog_category": "",
    "type": "private",
    "status": "activated",
    "logo": "",
    "model": "modi_c2b7e9a1d3f0a8645c8e",
    "model_library": "mlyi_c2a1e7d9b4f30685c3a3",
    "data": [
      {
        "id": "madi_5d8b21c74e0af96b3d15",
        "name": "message",
        "type": "mdti_fdd932b23e1fa82aa942",
        "placeholder": "Paste the message",
        "required": true
      }
    ],
    "instruction": [
      {
        "id": "miid_9a4c07e5b312df8641ca",
        "type": "aiti_d0c8a5e7b2f3a6c4e9d1",
        "instruction": "Classify the message as low, normal or urgent."
      }
    ],
    "runs": { "private": 12, "public": 0 },
    "tokens": { "input": 8420, "output": 3115, "total": 11535 },
    "created_at": 1789206600,
    "updated_at": 1789206600
  }
}

Vous pouvez lire vos propres applications quel que soit leur statut, ainsi que toute application publique activée d'un autre projet. La lecture de l'application publique d'un autre projet masque ce qui appartient à son propriétaire : instruction vaut null et runs.private vaut 0, et tokens indique ce que votre propre projet y a dépensé. Une application qui n'existe pas ou a été supprimée renvoie 404 et App not found. ; l'application privée d'un autre projet renvoie 422 et le message général.

Modifier une application

PATCH /v1/ai/app/detail/<app_id> modifie un ou plusieurs de ces champs de l'une de vos applications. Envoyez-en au moins un.

ParamètreTypeDescription
namechaîneUn nouveau nom. Une valeur vide est refusée.
descriptionchaîneUne nouvelle description. Une valeur vide est refusée.
catalog_categorychaîneUn métier, par identifiant ou nom anglais. Une chaîne vide le retire.
modelchaîneUn autre modèle, par identifiant ou par nom. La meilleure version que permet votre forfait est utilisée.
model_librarychaîneUne version exacte de modèle, par identifiant.
logochaîneUn fichier de la bibliothèque de logos de votre projet, par identifiant. Une chaîne vide retire le logo.
typechaînepublic pour publier l'application, private pour la retirer.
curl
curl -X PATCH https://api.ultineo.com/v1/ai/app/detail/mapp_0ceacb46e5b3a99e91b6 \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Support triage (EN)" }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "mapp_0ceacb46e5b3a99e91b6",
    "object": "app",
    "name": "Support triage (EN)",
    "description": "Sorts an inbound support message by urgency.",
    "catalog_category": "",
    "type": "private",
    "status": "activated",
    "model": "modi_c2b7e9a1d3f0a8645c8e",
    "model_library": "mlyi_c2a1e7d9b4f30685c3a3",
    "created_at": 1789206600,
    "updated_at": 1789210200
  }
}

La publication a deux conditions : l'application doit déjà être activée, et elle doit avoir un logo. Retirer une application réussit toujours.

CodeMessageCause
404App not found.L'application ne fait pas partie des applications de votre projet.
422The app must be activated before it can be published.Vous avez envoyé "type": "public" pour une application en brouillon.
422The app needs an image logo before it can be published.Vous avez envoyé "type": "public" pour une application sans logo.
422type must be 'public' or 'private'.type ne vaut aucune des deux valeurs.
422The selected logo does not exist in this project's CDN library.logo n'est pas un fichier de la bibliothèque de logos de votre projet.
402The selected model library is not available for the current billing plan.La version du modèle dépasse votre forfait.
422Nothing to update. Provide name, description, catalog_category, logo, model and/or type.Aucun champ reconnu n'a été envoyé.