# Questions en direct Pendant l'appel, l'interlocuteur peut demander une information que la mission ne contient pas (« Le 20 h est complet, 19 h 45 vous irait ? »). L'agent vocal ne décide jamais à ta place : il dit « un instant, je vérifie » et te pose la question, à toi ou à ton agent. Dans toutes les offres. ## Le déroulé 1. L'agent vocal pose la question : webhook `appel.question`, champ `question` dans `GET /v1/missions/{id}` et `/direct`, `pending_question` dans l'outil MCP `get_call`. 2. Tu as **45 secondes** pour répondre. Pendant ce temps, l'agent garde la conversation : il fait patienter l'interlocuteur avec des phrases courtes, sans rien accepter. 3. Tu réponds : `POST /v1/missions/{id}/answer` (MCP : `answer_call_question`). L'agent transmet ta réponse et continue. 4. Tu as besoin d'un peu plus de temps ? Demande une **prolongation de 60 secondes** (voir plus bas). L'agent demande à l'interlocuteur s'il veut bien patienter ; **seulement s'il accepte**, le délai est prolongé, une seule fois. 5. Pas de réponse à temps, ou l'interlocuteur préfère ne pas attendre : l'agent lui propose d'être rappelé dès qu'il aura la réponse. **S'il le souhaite**, l'appel se termine en `rappel_demande` et la question reste ouverte : ta réponse sera donnée au rappel. S'il ne le souhaite pas, l'appel se termine en `echec` et le résumé cite la question restée sans réponse. Une réponse qui arrive en retard, alors que l'appel est encore en cours, est quand même transmise. ## Le délai, visible partout La question porte son échéance, pour que ton agent sache combien de temps il lui reste : ```json "question": { "id": "q_1a2b3c4d", "texte": "Le 20 h est complet, 19 h 45 convient-il ?", "delai_s": 45, "expires_at": "2026-11-06T18:42:31Z", "seconds_left": 38, "prolongation": null, "prolongation_possible": true } ``` | Champ | Sens | |---|---| | `delai_s` | Délai accordé au départ pour cette question (45 s) | | `expires_at` | Échéance (ISO 8601, UTC), reculée de 60 s si une prolongation est acceptée ; fie-toi à elle plutôt qu'à ton horloge | | `seconds_left` | Secondes restantes au moment de la réponse du serveur | | `prolongation` | `null`, `demandee`, `acceptee`, `refusee` ou `impossible` | | `prolongation_possible` | `true` tant qu'aucune prolongation n'a été demandée pour cette question et que le délai court encore | Le webhook `appel.question` contient `question_id`, `question`, `expires_at`, `seconds_left`, `delai_s` et `prolongation_possible`. En MCP, `pending_question` contient `expires_at`, `seconds_left` et `can_hold`. ## Demander 60 secondes de plus ```bash curl -s -X POST $TEL_API/v1/missions/mis_3f2a9c0d1b7e4a55/question/prolonger \ -H "Authorization: Bearer $TEL_KEY" ``` Corps facultatif : `{"question_id": "q_…"}` (pour être sûr de prolonger la bonne question). Réponse immédiate : `{"ok": true, "question_id": "q_…", "prolongation": "demandee", "secondes": 60, "expires_at": "…", "seconds_left": 21}`. La décision de l'interlocuteur arrive ensuite (webhook ou `/direct`). MCP : `hold_call_question(call_id, question_id?)`. - L'agent vocal demande à l'interlocuteur : « Je vérifie auprès de la personne, ça peut prendre une minute : vous pouvez patienter ? » - **Il accepte** : `prolongation` passe à `acceptee`, `expires_at` recule de 60 s. - **Il refuse**, ou préfère être rappelé : `prolongation` = `refusee`. L'agent propose le rappel s'il le souhaite. - Le webhook `appel.question_prolongation` donne le résultat : `{question_id, etat, expires_at, seconds_left}` avec `etat` = `acceptee`, `refusee` ou `impossible`. - Une seule prolongation par question, et jamais plus de 2 minutes d'attente au total pour l'interlocuteur. - Erreurs (409) : `aucune_question` (pas de question en attente, ou autre `question_id`), `question_expiree` (le délai est déjà passé : envoie quand même ta réponse, elle sera donnée pendant l'appel ou au rappel), `prolongation_deja_utilisee`. 502 `prolongation_impossible` si l'agent vocal n'a pas pu être joint. En MCP : `no_pending_question`, `question_expired`, `hold_already_used`. ## Conseils pour ton agent - **Tu connais la réponse ?** Réponds tout de suite, en moins de 10 secondes. - **Tu dois demander à ton humain ?** Demande la prolongation **d'abord**, puis pose-lui la question. Les gens mettent souvent plus d'une minute à voir un message : si l'échéance passe, laisse le rappel se faire et envoie quand même ta réponse, elle sera dite au début du rappel. - **Mets dans la mission tout ce qu'on pourra te demander** (nom, téléphone de rappel, créneaux acceptables, limites) : c'est la meilleure façon d'éviter les questions. - Avec n8n, Hermes ou un serveur : préfère le webhook `appel.question` au sondage, tu gagnes plusieurs secondes. - N'invente jamais une réponse. Un code, un mot de passe ou un numéro de carte : c'est ton humain qui décide (écris la valeur `[secret: …]` pour qu'elle soit masquée dans ce que nous gardons). ## Après l'appel : la question reste ouverte Si l'appel s'est terminé pendant l'attente, la mission garde `question` avec `apres_appel: true`. Tu peux encore répondre avec `/answer` : la réponse est gardée et l'agent la donne dès le début du rappel. Renvoyer la même réponse est sans effet (`deja_recue: true`) ; une réponse différente renvoie 409. > **Le rappel aujourd'hui** : notre ligne fonctionne sans rappel automatique (`RAPPELS_MODE=notification`). Quand > l'interlocuteur souhaite être rappelé, tu reçois l'événement `rappel_suggere` (webhook `appel.rappel_suggere`, avec > `question_ouverte` et, s'il a donné une heure, `suggere_le`) et tu relances d'un clic : `POST /v1/missions/{id}/rappeler`. > L'agent reprend avec le contexte de l'appel précédent. Le rappel automatique (`appel.rappel`, relance planifiée) > n'existe qu'en mode `auto`, qui n'est pas activé.