Accepter ou refuser une proposition
Faire faire, ou non, une action que l'assistant propose — un email, un parcours envoyé, une suppression —, puis lire la suite.
Ce qui part vers l'extérieur ou ne se défait pas, l'assistant ne le fait pas seul : il le propose. La proposition arrive dans la
conversation, en carte de genre 2 :
{
"Id": "00000000-0000-4000-8000-000000000704",
"Origin": 3,
"BodyText": "Envoyer à Camille Martin l'email « Votre devis D-2026-0042 » depuis votre compte email.",
"Card": {
"Kind": 2,
"Html": "<p>Envoyer à Camille Martin l'email « Votre devis D-2026-0042 » depuis votre compte email.</p>",
"ProposalId": "00000000-0000-4000-8000-000000000705",
"ProposalStatus": 0,
"Family": 2
}
}Le texte dit ce que l'action fera ; Family en est la famille (1 un message de chat, 2 un email, 3 un SMS, 5 l'envoi d'un
parcours, 9 une suppression…). Les propositions qui attendent se lisent aussi, sans parcourir la conversation, dans
PendingProposalIds du traitement de la demande (GET https://staging-api.docage.com/Assistant/Messages/{id}/Run, voir
Confier une demande et lire la réponse).
L'accepter
POST https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Accept
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl -X POST "https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Accept" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Accept");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Accept", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;L'action est faite aussitôt, une fois, au nom de l'utilisateur, et la réponse dit son résultat :
{ "Id": "00000000-0000-4000-8000-000000000705", "Status": 2, "ResultStatusCode": 200, "ResultSummary": "Fait." }Status : 2 faite — ResultSummary vaut « Fait. », ou « Fait — fiche … » avec l'identifiant de la fiche créée ; 5 en échec : l'action a
été refusée par le serveur, ResultSummary dit pourquoi, et la réponse reste 200.
La refuser
POST https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Refuse
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl -X POST "https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Refuse" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Refuse");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Assistant/Proposals/00000000-0000-4000-8000-000000000705/Refuse", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Rien n'est fait : Status vaut 3.
Ensuite
La carte de la proposition se met à jour : son ProposalStatus, et Outcome, le résultat de l'action en une phrase. Si l'assistant n'attend plus d'autre décision, il reprend la demande
et écrit la suite dans la conversation — une réponse dont le Receipt dit « proposition « … » acceptée et faite ». Son traitement
repart (Working redevient vrai) : interrogez-le par le message de la demande jusqu'à ce qu'il rende la main, puis lisez la suite,
comme dans Confier une demande et lire la réponse.
Les refus
409 : « Cette proposition n'existe pas, ou elle a déjà été décidée. » — elle n'est pas celle de l'utilisateur, elle a déjà été
acceptée ou refusée, ou elle a expiré.
Les pièges
- Une proposition vaut sept jours ; au-delà, elle ne se décide plus.
- Une proposition peut être remplacée par une plus récente, qui dit la même chose autrement : son
ProposalStatuspasse à6, et seule la nouvelle se décide. - Décider revient à l'utilisateur : montrez-lui la proposition avant d'appeler
Accept. L'assistant, lui, ne peut jamais accepter ses propres propositions. - Écrire un nouveau message plutôt que de décider fait reprendre la demande : l'assistant le lit comme une réponse, et la proposition reste en attente.
- Une question (carte de genre
3) ne se décide pas : on y répond par un message, la réponse choisie parmiChoicesou en texte libre.