Toutes les pages
Sur cette page

Les turns et la queue

Un turn est un cycle de travail : vous envoyez un prompt, l’agent y travaille, puis il répond. Une conversation est une suite de turns, l’un après l’autre. Quand vous envoyez un message alors qu’un turn tourne encore, OAR le garde dans une queue jusqu’à la fin du turn. Quand un turn cesse de progresser, OAR s’en aperçoit, le remet dans la queue ou le termine avec une note, et ne le laisse pas tourner dans le vide.

Piloter un turn en cours et le bouton Stop (Arrêter) sont décrits dans Pendant qu’un turn tourne. Les redémarrages sont décrits dans Redémarrages et reprise.

Les états d’un turn #

État Ce que vous voyez
En file Votre message est dans le fil de la conversation avec un bouton Cancel (Annuler) en dessous.
En cours La bulle de réponse se remplit à mesure que l’agent travaille, avec son activité d’outils et un bouton Stop. La conversation apparaît comme occupée dans la liste.
En attente d’une question Une carte de question indique Waiting for your answer (En attente de votre réponse). Le turn continue quand vous répondez.
Terminé La réponse est complète.
Échoué La réponse est une courte note système qui dit ce qui s’est passé. Voir Quand un turn échoue.
Arrêté Vous avez appuyé sur Stop.

Un turn qui attend sur une carte de question n’est jamais considéré comme bloqué. Voir ask_user pour la carte elle-même.

Envoyer pendant qu’un turn tourne #

Ce qu’affiche le bouton d’envoi pendant un turn vous dit ce qu’il adviendra du message :

  • Steer (Piloter) : le message entre dans le turn en cours. C’est disponible sur Claude, DeepSeek et le moteur SDK de Copilot.
  • Queue (Mettre en file) : le message attend derrière le turn et démarre comme le suivant. Le bouton affiche Queue sur tous les autres fournisseurs, ainsi que sur Claude, DeepSeek et le moteur SDK pendant que le turn attend sur une carte de question ou une approbation de plan, ou pendant qu’il est en compactage, et sur le moteur SDK pendant qu’un appel d’outil tourne. Le message attend alors comme message en file et entre dans le turn une fois la carte répondue, le compactage terminé ou l’appel d’outil fini.

Les messages en file s’exécutent dans l’ordre d’envoi, du plus ancien au plus récent.

Si votre appareil est hors ligne quand vous appuyez sur envoyer, le navigateur garde le message et affiche You are offline. Message queued — it will send when the connection returns. C’est une autre queue : elle se trouve sur votre appareil et se vide d’elle-même quand la connexion revient.

Annuler un message en file #

Un message en file a un bouton Cancel jusqu’à ce que l’agent le prenne. Appuyer dessus retire le message de la queue et affiche Queued message cancelled. Si l’agent a commencé à traiter le message entre-temps, le relais indique Message is already being processed. Use Stop on the thinking bubble instead.

Empty queue (Vider la file) #

Le menu ⋯ d’une conversation a une ligne Queue. Elle affiche les compteurs de tout le relais, pas de cette conversation :

pending=1, processing=1, parked=0

Les messages Pending (En attente) attendent leur tour. Les messages Processing (En cours) sont en train de tourner. Les messages Parked (Mis de côté) sont retenus, par exemple pendant que le relais redémarre.

🚮 Empty queue à côté les supprime tous, dans toutes les conversations, y compris le message d’un turn en train de tourner. Une confirmation demande d’abord :

Drop all queue rows in pending, processing, and parked states?
This is a local maintenance action and cannot be undone.

Ensuite, une notification indique Queue emptied: dropped 3 rows. (Queue vidée : 3 lignes supprimées.), ou Queue is already empty. (La queue est déjà vide.) quand il n’y avait rien à supprimer. Ajouté en 0.9.11 N’importe quel navigateur connecté peut l’utiliser : il lui faut le token d’accès et rien d’autre (voir Les points d’accès que seule la machine du relais peut utiliser). Si le relais refuse, Failed to empty queue (Impossible de vider la queue) en donne la raison. L’action ne fait que retirer les messages de la queue. Elle ne demande pas à un agent en cours de s’arrêter ; utilisez Stop pour cela. Pour vous débarrasser d’un seul message, utilisez plutôt Cancel dessus.

Remise en file #

Un turn qui a mal tourné n’est pas toujours perdu. Le relais le remet dans la queue et réessaie quand :

  • le turn était bloqué (voir plus bas),
  • le processus worker de la session est mort pendant qu’il tournait,
  • le worker a signalé un échec qui vaut une nouvelle tentative.

Chaque remise en file compte comme une tentative. La limite est de 5 tentatives par message (maxRequeueRetries dans le fichier de config, lu au démarrage), donc le cinquième échec est définitif. L’attente avant la tentative suivante dépend de la cause :

Cause Attente
Un turn qui était bloqué 30 secondes (2 secondes tant que le relais considère la connexion de son agent comme hors ligne)
Le processus worker de la session est mort 2 secondes
Le worker a signalé un échec 1, 2, 4, puis 8 minutes après le premier, deuxième, troisième et quatrième échec
Le worker a signalé un échec dans les 15 secondes suivant le démarrage, avant toute activité ou tout texte de réponse 10, 20, 40, puis 80 secondes

À la limite, le message échoue définitivement, avec une note (voir plus bas).

Deux sortes de turns ne sont pas rejouées. Un message déjà intégré à un turn en cours recevrait deux réponses, donc il échoue avec une note à la place. La réponse de suite propre à une tâche de fond n’a pas de prompt à renvoyer, donc elle est abandonnée.

Quand un turn est bloqué #

Un turn peut être lent, ou il peut être bloqué. OAR ne peut pas le savoir en regardant la réponse, donc il guette des signes de vie. Il y a trois sortes de surveillance : le relais surveille le worker, chaque worker surveille son agent, et deux limites encadrent le travail de fond et les cartes de question.

Minuteur Par défaut Où le changer Ce que vous voyez quand il se déclenche
Inactivité : aucun signe de vie du worker de la session 10 min (45 s tant que le relais considère la connexion de son agent comme hors ligne) processingTimeoutMs dans le fichier de config, en millisecondes ; redémarrez le relais après modification Le turn retourne dans la queue et redémarre après 30 secondes.
Max turn duration (Durée maximale d’un turn) : durée totale d’un turn 60 min, de 0 à 10 h par pas de 5 minutes ; 0 signifie sans limite Settings → General → Max turn duration (Réglages → Général → Durée maximale d’un turn) Pareil : retour dans la queue. Sur Grok, le turn échoue avec une note à la place.
Silence d’une runtime Copilot (moteur SDK), Cursor ou Grok : rien en cours 120 s OAR_TURN_STALL_IDLE_MS dans l’environnement du relais ; 0 désactive la surveillance Le turn échoue avec une note système.
Pareil, pendant qu’une requête au modèle tourne 300 s OAR_TURN_STALL_MODEL_MS ; 0 signifie sans limite Le turn échoue avec une note système.
Pareil, pendant qu’un appel d’outil tourne 30 min OAR_TURN_STALL_TOOL_MS ; 0 signifie sans limite Le turn échoue avec une note système.
Background task timeout (Délai des tâches de fond) : le travail de fond seul garde une session active après sa réponse 4 h, de 0 à 10 h par pas de 5 minutes ; 0 signifie sans limite Settings → General → Background task timeout (Réglages → Général → Délai des tâches de fond) Le relais arrête les tâches. Sur Claude Cloud, c’est le turn qui se termine à la place. Voir Par fournisseur.
Attente d’une carte de question 8 h ; 2 h sur le moteur d’extension de Copilot Non réglable L’agent apprend que personne n’a répondu et continue selon le mode de la conversation.

Les trois variables OAR_TURN_STALL_* sous Linux et macOS

Là où les sessions tournent sous tmux, une variable définie pour le relais n’est pas transmise aux processus des agents, et ces trois variables peuvent alors rester sans effet. Voir quelles variables atteignent les agents.

Comment elles fonctionnent ensemble :

  • Le relais surveille le worker. Le worker indique toutes les 10 secondes sur quel message il travaille. Tant qu’il le fait, le turn est vivant, quelle que soit sa durée. Si les signalements s’arrêtent pendant la fenêtre d’inactivité, le relais remet le turn dans la queue. Il vérifie toutes les 15 secondes.
  • Max turn duration est l’arrêt ferme. Il rattrape un worker qui se bloque mais continue de se signaler. Un turn dépasse la limite quand le plus récent de deux moments est plus ancien que le réglage : le début du turn, et la dernière carte de question à laquelle vous avez répondu. Ainsi, un entretien qui a attendu vos réponses pendant des heures n’est pas coupé juste après la dernière réponse. Il y a un piège. Quand la vérification remet un turn en file, elle remet en file tous les turns en cours dont le début est plus ancien que la limite, sans regarder vos réponses pour ceux-là. Un turn dans lequel vous avez répondu récemment à une carte peut donc retourner dans la queue en même temps qu’un autre turn qui a atteint une limite lors de la même vérification (toutes les 15 secondes). Si un long turn est remis en file sans raison apparente, augmentez ce réglage ou mettez-le à 0.
  • Chaque worker surveille aussi son agent. Pour le moteur SDK de Copilot, Cursor et Grok, un turn sans aucun événement de la runtime pendant plus que sa fenêtre échoue. La fenêtre dépend de ce que fait la runtime : une commande qui n’affiche rien peut rester silencieuse longtemps, un modèle en train d’écrire non. C’est pourquoi les trois fenêtres diffèrent. Quand seule la fenêtre d’inactivité est définie, les deux autres s’ajustent en proportion.
  • Un turn en attente n’est jamais bloqué. Un turn qui attend sur une carte de question suspend les deux gardes du relais et la surveillance du silence du worker. (Le plafond de Grok et la limite de 2 heures du moteur d’extension ne s’interrompent pas pour autant.) Un compactage et un appel relay_tool suspendent aussi la surveillance du silence. Max turn duration ne sait rien d’une longue attente relay_tool : une attente proche de son maximum peut donc être écourtée par lui avec la valeur par défaut de 60 minutes.
  • Les tâches de fond sont à part. Le délai des tâches ne compte qu’après la réponse, quand seules les tâches de fond font tourner la session. Il ne limite pas un turn. Claude Cloud est l’exception, voir plus bas.

Une remise en file n’est pas affichée comme une erreur. Le message repasse à queued (en file) et tourne de nouveau. Ce n’est que lorsque les tentatives sont épuisées que le turn échoue.

Quand un turn échoue #

Un turn échoué se termine par une réponse du relais, en texte brut. Elle dit ce qui s’est passé, se termine par un code d’erreur et vous dit quoi faire ensuite. Un turn que la surveillance du silence a terminé affiche par exemple :

System note: the Copilot runtime sent nothing for 300s while a model request was running, so the relay ended the turn.

Quand c’est l’outil qui tournait, la note le nomme : while a tool was running (build). Une runtime qui ne répond plus quand le relais l’interroge donne the Copilot runtime stopped answering … (nothing for 120s, no reply when asked), so the relay ended the turn.

Un message qui a épuisé ses tentatives échoue avec l’un de ces messages :

Relay timeout after 5 attempts. Message was skipped to keep the queue moving. Retry the message.
Relay recovery limit reached after 5 attempts (stale-recovery). The worker kept dying before completing this turn, so the message was failed to keep the queue moving. Send it again to retry.

La plupart des échecs se terminent par le conseil de renvoyer le message. Deux choses aident :

  • Renvoyez-le. Collez ou retapez le message, ou appuyez sur Resend (Renvoyer) là où le fil de la conversation le propose. Resend apparaît sur un message qui a été envoyé par pilotage dans un turn qui a ensuite échoué ou a été arrêté. Son marqueur indique Steered into the turn above, which failed — not answered. ou Stopped with the turn — not answered. Une fois que vous avez appuyé dessus, le bouton affiche Resent (Renvoyé) sur tous les appareils.
  • Utilisez le bouton de la réponse. Certains échecs nomment une correction que le relais peut faire pour vous, et la réponse en échec porte un bouton pour cela. Un problème de compte Claude affiche Claude settings (Réglages Claude). Ajouté en 0.9.17 Un turn DeepSeek refusé parce que le solde est épuisé affiche Top up DeepSeek (Recharger DeepSeek) et DeepSeek settings (Réglages DeepSeek) ; un turn refusé à cause de la clé d’API affiche DeepSeek settings (voir Erreurs DeepSeek). Un turn Grok qui n’a pas pu démarrer affiche Install Grok CLI (Installer Grok CLI) et Grok settings (Réglages Grok), ou Sign in to Grok (Se connecter à Grok) et Grok settings quand il n’était pas connecté.

Une conversation dont le worker de session s’est arrêté à cause d’un problème de lancement affiche un bouton Retry (Réessayer) sur la note, qui redémarre le worker.

Une conversation qui semble coincée peut être libérée avec ☠️ Kill session (Tuer la session) dans le menu ⋯, qui arrête son worker. Renvoyez ensuite le message.

Par fournisseur #

La queue, Cancel, Empty queue, la fenêtre d’inactivité et Max turn duration sont les mêmes chez tous les fournisseurs. Ce qui diffère, c’est la surveillance de l’agent lui-même.

Fournisseur Surveillance du silence Steer ou Queue
GitHub Copilot et OpenAI, moteur SDK Oui : 120 s, 300 s et 30 min. Une fois par fenêtre d’inactivité, le worker demande à la runtime si elle est toujours là, avec 5 secondes pour répondre ; une runtime qui ne répond pas termine le turn aussitôt. Steer
GitHub Copilot, moteur d’extension Pas de surveillance du silence. Un turn est limité à 2 heures au total ; quand ce délai est écoulé, le turn retourne dans la queue et compte comme une tentative échouée, avec les attentes ci-dessus. Avec les 60 minutes par défaut, Max turn duration agit normalement en premier. Une carte de question attend 2 heures. Queue
Claude Observe seulement. Un turn dans lequel la CLI ne s’est pas exprimée depuis 10 minutes (30 avec un outil ouvert) est consigné dans le journal du worker et laissé en cours, car le terminer tuerait la CLI et ses tâches de fond. Steer
DeepSeek Ajouté en 0.9.17 Comme Claude : un chat DeepSeek fait tourner Claude Code, avec la même surveillance en simple observation. Steer
Claude Cloud Pas de surveillance du silence sur l’agent. Le worker surveille sa connexion : un flux sans données pendant 120 s est rouvert, et un flux absent pendant 5 minutes rend le message à la queue, où la tentative suivante suit le même turn au lieu de le renvoyer. Un turn cloud silencieux dont la connexion est vivante continue de tourner. Quand l’agent termine son turn alors que du travail de fond tourne encore, le turn reste ouvert pendant le Background task timeout (60 minutes s’il vaut 0). Il se termine ensuite par une ligne d’activité qui vous invite à envoyer un message pour savoir comment le travail s’est passé. Queue
Cursor Oui, avec les mêmes trois fenêtres. Il n’y a pas de phase d’inactivité pendant qu’une exécution est en cours : elle compte comme une requête au modèle, sauf si un appel d’outil est ouvert. Queue
Grok Oui, avec les mêmes trois fenêtres ; un appel relay_tool en attente est interrogé d’abord. Un OAR_TURN_STALL_IDLE_MS à 0 ne la désactive pas ici. Le turn est aussi plafonné à Max turn duration, compté depuis le début du turn sans remise à zéro pour les questions répondues, et une carte que vous laissez sans réponse compte aussi. Un turn Grok qui atteint le plafond échoue avec System note: the Grok turn stalled and was stopped (grok turn exceeded the 60-minute turn ceiling). Send a new message to retry. (Note système : le turn Grok était bloqué et a été arrêté : grok turn exceeded the 60-minute turn ceiling. Envoyez un nouveau message pour réessayer.) (ou le nombre que vous avez réglé). Queue

Background task timeout s’applique à Claude, Claude API, DeepSeek, au moteur SDK de Copilot et à Claude Cloud. Sur Claude, Claude API et DeepSeek, il arrête les tâches de fond. Sur le moteur SDK de Copilot, le relais les annule. Sur Claude Cloud, il fixe seulement combien de temps le turn les attend. Il ne s’applique pas aux autres fournisseurs.