curl --request POST \
--url https://api.zelinqa.ai/v1/sessions/{session_id}/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"state_version": 2,
"client_updates": {
"data": [
{
"id": "company_size",
"value": 120
}
]
}
}
'{
"request_id": "<string>",
"session_id": "<string>",
"client_reference": "<string>",
"status": "active",
"turn_count": 1,
"max_turns": 2,
"turns_remaining": 1,
"question_state": {
"outcomes": [
{
"question_id": "<string>",
"decision_id": "<string>",
"outcome": "asked_answered",
"source": "client",
"message_id": "<string>",
"occurred_at": "2023-11-07T05:31:56Z"
}
]
},
"targets": {},
"progress": {
"objective": {
"computed_status": "not_started",
"progress": 0.5,
"client_override": {
"status": "achieved",
"updated_at": "2023-11-07T05:31:56Z"
},
"effective_status": "not_started"
},
"dimensions": [
{
"id": "<string>",
"order_position": 1,
"completion_role": "blocking",
"computed_status": "not_started",
"progress": 0.5,
"client_override": {
"status": "achieved",
"updated_at": "2023-11-07T05:31:56Z"
},
"effective_status": "not_started"
}
]
},
"pending_decision": {
"decision_id": "<string>",
"candidates": [
{
"rank": 5,
"question_id": "<string>",
"text": "<string>",
"type": "open",
"choices": [
{
"choice_id": "<string>",
"label": "<string>"
}
],
"target_ids": [
"<string>"
],
"selection_mode": "single"
}
]
},
"degraded": true,
"versions": {
"state_version": 1,
"engine_version": "<string>",
"api_version": "1.0"
}
}Appliquer un contexte ou une mise à jour sans consommer de tour
Même réducteur que /next, sans consommer de tour. Sert à rattraper des
messages qui n’ont pas transité par Zelinqa, synchroniser une donnée déjà connue
du système appelant, corriger une valeur, ou piloter une dimension.
Le contexte fourni peut résoudre la décision en attente lorsqu’il y répond sans
ambiguïté ; pending_decision vaut alors null et le prochain /next propose
la suite. Sinon, la décision en attente est recalculée sur l’état mis à jour,
avec les contraintes selection du /next qui l’a proposée, sans appel à un
modèle :
- même liste de candidates : la décision et son
decision_idsont conservés ; - liste différente :
pending_decisionporte une nouvelle décision, avec un nouveaudecision_id. C’est elle que l’agent hôte doit poser. Par exemple, une donnée confirmée parclient_updatespour la question en attente retire cette question ; - plus aucune question disponible : la session s’arrête (
status: stopped), comme un/nextqui répondraitstop_reason: no_question_available. Si seules les contraintesselectiond’origine ne laissent plus de question,pending_decisionvautnull, la session reste active et le prochain/nextchoisit avec ses propres contraintes.
Lorsque la limite max_turns est atteinte, la session s’arrête et
pending_decision vaut null.
Une réponse à une décision ainsi remplacée reste acceptée par /next : voir
previous_turn.decision_id.
curl --request POST \
--url https://api.zelinqa.ai/v1/sessions/{session_id}/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"state_version": 2,
"client_updates": {
"data": [
{
"id": "company_size",
"value": 120
}
]
}
}
'{
"request_id": "<string>",
"session_id": "<string>",
"client_reference": "<string>",
"status": "active",
"turn_count": 1,
"max_turns": 2,
"turns_remaining": 1,
"question_state": {
"outcomes": [
{
"question_id": "<string>",
"decision_id": "<string>",
"outcome": "asked_answered",
"source": "client",
"message_id": "<string>",
"occurred_at": "2023-11-07T05:31:56Z"
}
]
},
"targets": {},
"progress": {
"objective": {
"computed_status": "not_started",
"progress": 0.5,
"client_override": {
"status": "achieved",
"updated_at": "2023-11-07T05:31:56Z"
},
"effective_status": "not_started"
},
"dimensions": [
{
"id": "<string>",
"order_position": 1,
"completion_role": "blocking",
"computed_status": "not_started",
"progress": 0.5,
"client_override": {
"status": "achieved",
"updated_at": "2023-11-07T05:31:56Z"
},
"effective_status": "not_started"
}
]
},
"pending_decision": {
"decision_id": "<string>",
"candidates": [
{
"rank": 5,
"question_id": "<string>",
"text": "<string>",
"type": "open",
"choices": [
{
"choice_id": "<string>",
"label": "<string>"
}
],
"target_ids": [
"<string>"
],
"selection_mode": "single"
}
]
},
"degraded": true,
"versions": {
"state_version": 1,
"engine_version": "<string>",
"api_version": "1.0"
}
}Autorisations
En-têtes
Clé unique par mutation logique, choisie par l'appelant.
Même clé et même corps renvoient exactement la réponse d'origine, sans
rejouer l'effet : aucun retry ne double turn_count, un outcome, un
événement, un feedback ou une publication. Même clé avec un corps différent
produit 409 idempotency_key_reused.
Les enregistrements sont isolés par tenant et par opération, et sont purgés après 24 heures. Passé ce délai, la même clé est traitée comme neuve.
8 - 128Paramètres de chemin
Corps
- Option 1
- Option 2
Réponse
État public après application des mises à jour, avec la décision en attente conservée, remplacée ou retirée.