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éthode | Chemin | Droit |
|---|---|---|
| POST | /v1/ai/app/create | app:write |
| GET | /v1/ai/app/list | app: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
| Champ | Type | Description |
|---|---|---|
id | chaîne | L'identifiant de l'application, préfixé mapp_. |
object | chaîne | Toujours app. |
name | chaîne | Le nom de l'application. |
description | chaîne | Ce que fait l'application. |
catalog_category | chaîne | Le métier sous lequel l'application est classée, par son identifiant (préfixé acci_), ou une chaîne vide. |
type | chaîne | private ou public. |
status | chaîne | draft ou activated. Seule une application activée peut être exécutée. |
logo | chaîne | L'identifiant du fichier logo de l'application, ou une chaîne vide. |
model | chaîne | Le modèle utilisé par l'application, préfixé modi_. |
model_library | chaîne | La version exacte du modèle retenue pour cette application, préfixée mlyi_. |
data | tableau | Les champs d'entrée. Un objet par champ que l'appelant remplit. |
instruction | tableau | Les instructions envoyées au modèle. null si l'application ne vous appartient pas. |
runs | objet | Compteurs d'exécutions, private (exécutions du projet propriétaire) et public (exécutions des autres projets). |
tokens | objet | Les jetons dépensés par votre projet sur l'application, input, output et total, ou null. |
created_at | entier | Date de création, en secondes Unix. |
updated_at | entier | Dernière modification, en secondes Unix. |
Chaque entrée de data décrit un champ d'entrée :
| Champ | Type | Description |
|---|---|---|
id | chaîne | L'identifiant du champ, préfixé madi_. |
name | chaîne | Le nom du champ. C'est la clé que vous envoyez pour lancer une exécution. |
type | chaîne | Le type du champ, par son identifiant (préfixé mdti_). Voir Types de champ. |
placeholder | chaîne | L'indication affichée à la personne qui remplit le champ. |
required | booléen | Si 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
name | chaîne | Oui | Le nom de l'application. |
description | chaîne | Oui | Ce que fait l'application. |
data | tableau | Oui | Les 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. |
instruction | tableau | Oui | Chaque objet demande un type non vide et une instruction (acceptée aussi sous prompt). Voir Types d'instruction. |
category | chaîne | Non | La 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. |
model | chaîne | Non | Un modèle, par identifiant ou par nom (par exemple qwen3). La meilleure version que permet votre forfait est utilisée. |
model_library | chaîne | Non | Une version exacte de modèle, par identifiant. |
catalog_category | chaîne | Non | Le métier sous lequel classer l'application, par identifiant ou par nom anglais (par exemple Customer Support & Call Centres). |
status | chaîne | Non | draft ou activated. activated par défaut. |
type | chaîne | Non | private 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 -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." }
]
}' {
"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
200et non201, et sesdataetinstructionsont des objets indexés par les nouveaux identifiants, et non les tableaux que renvoient les lectures. Relisez l'application avecGET /v1/ai/app/detail/<app_id>si vous avez besoin de la forme habituelle.
| Code | Message | Cause |
|---|---|---|
| 400 | Missing required field: name. | Aucun nom n'a été envoyé. Le même message nomme description. |
| 422 | Each 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. |
| 422 | Each instruction object must contain non-empty 'type' and 'instruction' properties. | instruction est absent, ou l'une de ses entrées est incomplète. |
| 422 | At least one data field must be required. | Tous les champs ont été envoyés avec "required": false. |
| 404 | The selected data type does not exist. | Un type de champ ne fait pas partie des types de champ. |
| 404 | The selected instruction type does not exist. | Un type d'instruction ne fait pas partie des types d'instruction. |
| 404 | The selected model does not exist. | model ne désigne aucun modèle. |
| 422 | No 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. |
| 422 | The selected catalog_category does not exist. | catalog_category ne désigne aucun métier. |
| 402 | The current billing plan does not allow custom app creation for this project. | Votre forfait n'inclut aucune application. |
| 402 | The 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.
type | Identifiant | Ce que le champ recueille |
|---|---|---|
input | mdti_c2a39a7ad82bc017dccd | Une ligne de texte. |
text area | mdti_fdd932b23e1fa82aa942 | Un bloc de texte. |
number | mdti_0bf56e96d417b823b7e8 | Un nombre. |
email | mdti_52f84207d0f8a95ed43d | Une adresse e-mail. |
document | mdti_5017cf8657e1df4df809 | Un fichier PDF, DOCX, XLSX, CSV ou TXT. Le modèle en lit le texte. |
image | mdti_1777f1beedfbd5cde030 | Une 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 :
type | Identifiant |
|---|---|
text | aiti_d0c8a5e7b2f3a6c4e9d1 |
nombre | aiti_d7a3c1f9e2b4d8a6c0f5 |
element | aiti_4a8e1d6b9c3f0a52c7e5 |
notation | aiti_8d6c3b1a9e0f7c24a5e8 |
percent | aiti_7f0a3b5d9c2e1a648c7e |
image | aiti_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 "https://api.ultineo.com/v1/ai/app/list?limit=2" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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 https://api.ultineo.com/v1/ai/app/detail/mapp_0ceacb46e5b3a99e91b6 \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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ètre | Type | Description |
|---|---|---|
name | chaîne | Un nouveau nom. Une valeur vide est refusée. |
description | chaîne | Une nouvelle description. Une valeur vide est refusée. |
catalog_category | chaîne | Un métier, par identifiant ou nom anglais. Une chaîne vide le retire. |
model | chaîne | Un autre modèle, par identifiant ou par nom. La meilleure version que permet votre forfait est utilisée. |
model_library | chaîne | Une version exacte de modèle, par identifiant. |
logo | chaîne | Un fichier de la bibliothèque de logos de votre projet, par identifiant. Une chaîne vide retire le logo. |
type | chaîne | public pour publier l'application, private pour la retirer. |
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)" }' {
"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.
| Code | Message | Cause |
|---|---|---|
| 404 | App not found. | L'application ne fait pas partie des applications de votre projet. |
| 422 | The app must be activated before it can be published. | Vous avez envoyé "type": "public" pour une application en brouillon. |
| 422 | The app needs an image logo before it can be published. | Vous avez envoyé "type": "public" pour une application sans logo. |
| 422 | type must be 'public' or 'private'. | type ne vaut aucune des deux valeurs. |
| 422 | The 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. |
| 402 | The selected model library is not available for the current billing plan. | La version du modèle dépasse votre forfait. |
| 422 | Nothing to update. Provide name, description, catalog_category, logo, model and/or type. | Aucun champ reconnu n'a été envoyé. |