Exécutions IA
Une exécution fait tourner une application : vous fournissez les champs d'entrée de l'application, l'API met le travail en file d'attente et le modèle produit la réponse. Les exécutions sont asynchrones : en créer une répond aussitôt avec le statut new, et vous relisez le résultat une fois l'exécution terminée.
Points d'accès
| Méthode | Chemin | Droit |
|---|---|---|
| POST | /v1/ai/run/create | reasoning:write |
| GET | /v1/ai/run/list | reasoning:read |
| GET | /v1/ai/run/detail/<run_id> | reasoning:read |
<run_id> est un identifiant d'exécution, préfixé runi_.
Remarque — Le segment de chemin est
run, mais les droits sontreasoning:readetreasoning:write, et l'objet est unreasoning. Une clé limitée àrun:*ne peut pas appeler ces points d'accès. Utilisezreasoning:*, ou*.
L'objet reasoning
| Champ | Type | Description |
|---|---|---|
id | chaîne | L'identifiant de l'exécution, préfixé runi_. |
object | chaîne | Toujours reasoning. |
app_id | chaîne | L'application exécutée. |
model | objet | Le modèle utilisé par l'exécution, ou null. |
data | objet | Les entrées avec lesquelles l'exécution a été lancée, par nom de champ. |
instruction | objet | Les instructions envoyées, par identifiant d'instruction. |
response | objet | La réponse du modèle, par identifiant d'instruction. Vide tant que l'exécution n'est pas terminée. |
tokens | objet | Les nombres de jetons input, output et total, ou null s'ils ne sont pas mesurés. |
status | chaîne | Voir les statuts ci-dessous. |
duration | nombre | La durée de l'exécution, en secondes à deux décimales, ou null. |
started_at | entier | Le moment où l'exécution a été prise en charge, ou null. |
finished_at | entier | Le moment où l'exécution s'est terminée, ou null. |
created_at | entier | Le moment de la mise en file d'attente, en secondes Unix. |
updated_at | entier | Dernière modification, en secondes Unix. |
L'objet model nomme le modèle et sa version exacte :
| Champ | Type | Description |
|---|---|---|
id | chaîne | Le modèle, préfixé modi_. |
model_library | chaîne | La version exacte utilisée par l'exécution, préfixée mlyi_. |
name | chaîne | Le nom de la version, par exemple qwen3:4b. |
parameter | entier | La taille de la version, en milliards de paramètres. |
Statuts
| Statut | Signification |
|---|---|
new | En file d'attente, pas encore prise en charge. |
pull | En préparation. |
processing | En cours d'exécution sur le modèle. |
finished | Terminée. response est rempli. |
failed | Terminée sur une erreur. |
Interrogez GET /v1/ai/run/detail/<run_id> jusqu'à ce que le statut soit finished ou failed. Ces deux statuts sont définitifs ; tous les autres évoluent d'eux-mêmes.
Lancer une exécution
POST /v1/ai/run/create désigne une application et fournit ses entrées.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
app_id | chaîne | Oui | L'application à exécuter. Accepté aussi sous app ou app_ident. |
data | objet | Oui | Une entrée par champ d'entrée, indexée par le name du champ tel que le renvoie Applications IA. |
curl -X POST https://api.ultineo.com/v1/ai/run/create \
-H "Authorization: Bearer sk-project-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"app_id": "mapp_0ceacb46e5b3a99e91b6",
"data": { "message": "My parcel has not arrived and the tracking has not moved for a week." }
}' {
"code": 200,
"title": "OK",
"response": {
"id": "runi_1b7f4e0c96a2d8531fca",
"object": "reasoning",
"data": { "message": "My parcel has not arrived and the tracking has not moved for a week." },
"instruction": { "1": "Classify the message as low, normal or urgent." },
"status": "new",
"created_at": 1789210200
}
} Gardez l'id renvoyé et interrogez-le. La réponse de création ne contient pas de champ response : rien n'a encore été exécuté.
Vous pouvez exécuter vos propres applications, ainsi que toute application publique activée d'un autre projet dont vous connaissez l'identifiant. Une application non activée, sans modèle utilisable ou privée à un autre projet est refusée avec 422 et le message général.
| Code | Message | Cause |
|---|---|---|
| 402 | Your reasoning quota is exhausted. Please wait until it resets or upgrade your plan. | L'allocation de jetons du cycle est épuisée. |
| 400 | Missing required field: app_id. | Aucune application n'a été désignée. |
| 404 | App not found. | L'application n'existe pas ou a été supprimée. |
| 422 | Missing required field: <name>. | Un champ d'entrée obligatoire était absent ou vide. |
| 422 | The parameter '<key>' is not recognized. | data contient une clé qui n'est pas un champ de l'application. |
Le quota est vérifié avant tout le reste : un projet sans allocation restante ne peut rien mettre en file d'attente. Lisez l'allocation restante dans Quota et consommation de jetons IA.
Astuce — Un champ peut aussi être indexé par son identifiant
madi_ou par sa position, à partir de1. L'indexation parnameest la plus claire, et c'est celle que donne le schéma de l'application.
Envoyer un document ou une image
Un champ de type document ou image (voir Applications IA) ne prend pas de texte : il prend un fichier déjà présent dans la bibliothèque de fichiers de votre projet. Envoyez l'identifiant du fichier, préfixé file_, ou son URL de diffusion. L'API ne téléverse pas de fichiers elle-même.
| Code | Message | Cause |
|---|---|---|
| 422 | Field '<name>' expects an uploaded file: send its cdn file id (file_<20 hex>) or its delivery URL. | La valeur était un texte ordinaire. |
| 422 | This project has no CDN scope, so no file can be attached to a reasoning. | Votre projet n'a pas de bibliothèque de fichiers. |
| 422 | The file sent for '<name>' is not in this project's reasoning image library. | Le fichier appartient à un autre projet, a été supprimé ou se trouve dans une autre bibliothèque. Le message indique reasoning document library pour un champ document. |
| 422 | The file sent for '<name>' cannot be read: accepted document formats are pdf, docx, xlsx, csv, txt. | Le document est dans un format que le modèle ne sait pas lire. |
| 422 | The model resolved for this app cannot read images. Choose a model that accepts image input. | L'application a un champ image mais son modèle ne lit pas les images. |
Lancer plusieurs exécutions à la fois
Envoyez une liste runs au lieu d'une exécution unique pour mettre jusqu'à 100 exécutions en file d'attente en un seul appel. Chaque élément a la même forme qu'une exécution unique.
curl -X POST https://api.ultineo.com/v1/ai/run/create \
-H "Authorization: Bearer sk-project-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"runs": [
{ "app_id": "mapp_0ceacb46e5b3a99e91b6", "data": { "message": "Where is my order?" } },
{ "app_id": "mapp_0ceacb46e5b3a99e91b6", "data": {} }
]
}' {
"code": 200,
"title": "OK",
"response": {
"object": "list",
"data": [
{
"id": "runi_8d20c5e4a91f7b3a6c05",
"object": "reasoning",
"data": { "message": "Where is my order?" },
"instruction": { "1": "Classify the message as low, normal or urgent." },
"status": "new",
"created_at": 1789210260
}
],
"created": 1,
"failed": 1,
"errors": [
{
"index": 1,
"code": 422,
"title": "Unprocessable entity",
"response": "Missing required field: message."
}
],
"total": 2
}
} Un élément refusé ne bloque jamais les autres : chaque refus est indiqué dans errors avec sa position dans votre liste runs, à partir de 0. L'appel répond 200 dès qu'une exécution a été mise en file d'attente, et 422 seulement quand tous les éléments ont été refusés. Une valeur runs qui n'est pas une liste, qui est vide ou qui contient plus de 100 éléments est refusée en bloc avec 422.
Lire une exécution
GET /v1/ai/run/detail/<run_id> renvoie l'exécution complète, y compris la réponse dès qu'elle existe.
curl https://api.ultineo.com/v1/ai/run/detail/runi_1b7f4e0c96a2d8531fca \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"code": 200,
"title": "OK",
"response": {
"id": "runi_1b7f4e0c96a2d8531fca",
"object": "reasoning",
"app_id": "mapp_0ceacb46e5b3a99e91b6",
"model": {
"id": "modi_c2b7e9a1d3f0a8645c8e",
"model_library": "mlyi_c2a1e7d9b4f30685c3a3",
"name": "qwen3:4b",
"parameter": 4
},
"data": { "message": "My parcel has not arrived and the tracking has not moved for a week." },
"instruction": {
"miid_9a4c07e5b312df8641ca": "Classify the message as low, normal or urgent."
},
"response": {
"miid_9a4c07e5b312df8641ca": "urgent"
},
"tokens": { "input": 412, "output": 3, "total": 415 },
"status": "finished",
"duration": 1.84,
"started_at": 1789210202,
"finished_at": 1789210204,
"created_at": 1789210200,
"updated_at": 1789210204
}
} instruction et response partagent leurs clés : vous pouvez associer chaque réponse à l'instruction qui l'a produite. Une exécution d'un autre projet renvoie 404 et Reasoning not found.
Lister les exécutions
GET /v1/ai/run/list renvoie les exécutions de votre projet, de la plus récente à la plus ancienne.
| Paramètre | Type | Description |
|---|---|---|
app_id | chaîne | Ne renvoyer que les exécutions d'une application. Accepté aussi sous app ou app_ident. |
limit | entier | Nombre de lignes à renvoyer, de 1 à 100. 50 par défaut. |
offset | entier | Nombre de lignes à sauter. 0 par défaut. |
curl "https://api.ultineo.com/v1/ai/run/list?app_id=mapp_0ceacb46e5b3a99e91b6&limit=2" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"code": 200,
"title": "OK",
"response": {
"object": "list",
"data": [
{
"id": "runi_1b7f4e0c96a2d8531fca",
"object": "reasoning",
"app_id": "mapp_0ceacb46e5b3a99e91b6",
"status": "finished",
"duration": 1.84,
"started_at": 1789210202,
"finished_at": 1789210204,
"created_at": 1789210200,
"updated_at": 1789210204,
"tokens": { "input": 412, "output": 3, "total": 415 }
}
],
"total": 1
}
} La liste omet data, instruction, response et model : lisez une exécution pour les obtenir. Lister n'entame jamais votre quota, vous pouvez donc consulter l'historique librement.