Aller au contenu
English

Envoyer des consignes pendant une tâche

Donnez une nouvelle consigne à un agent en cours d’exécution et suivez sa transmission.

Créez un contrôleur de réorientation et passez-le à la tâche. Pendant l’exécution, send() envoie une nouvelle consigne et se termine lorsqu’Outpost peut indiquer comment elle a été transmise.

import { reportValue } from "./reporter.ts";
import { createSteering, dispatch } from "@elie-laloum/outpost";
import { coder, repository, sandboxProvider } from "./outpost.config.ts";

const steering = createSteering();
const running = dispatch({
  repository,
  sandboxProvider,
  agent: coder,
  branch: { mode: "named", name: "outpost/auth-refactor" },
  brief: { text: "Refactor the auth module." },
  steering,
});
const delivery = await steering.send("Leave the legacy/ folder untouched.");
reportValue(delivery.mode);
// Example output: "injected" ou "resumed"
const result = await running;

send() se résout quand l’agent reçoit le texte, pas quand il l’a appliqué. L’agent le lit comme un message utilisateur de plus ; le brief reste valable.

AgentmodeCe qui se passe
Harness intégréinjectedAjoutée à la requête suivante au modèle, après les résultats d’outils en cours. Un modèle qui allait terminer continue.
Claude CodeinjectedÉcrite sur son entrée stream-json. Elle rejoint le tour en cours, ou passe ensuite dans le même processus si Claude répondait déjà.
CodexinjectedUn dispatch avec steering lance codex app-server. turn/steer ajoute le texte au tour actif, ou démarre le suivant.
Copilot CLI, Kimi Code, AntigravityresumedOutpost arrête le processus dès que sa conversation est connue, puis la reprend avec le texte dans la même sandbox.

Avec resumed, l’action en cours est interrompue, mais les fichiers déjà modifiés restent dans le workspace. Tous les fournisseurs de sandbox transmettent l’entrée en direct ; sur Vercel et Daytona, chaque consigne coûte une commande du fournisseur et arrive avec un léger délai.

Vous l’envoyezCe qui se passemode
Avant le démarrage de l’agentAjoutée au prompt.injected
Pendant le tourRemise comme dans le tableau ci-dessus.injected / resumed
Après la réponse de l’agentOutpost reprend la conversation dans un nouveau tour : le résultat en tient compte.resumed
Quand aucun dispatch n’utilise le contrôleurAttend le prochain dispatch qui reçoit le contrôleur.―

Une consigne que le dispatch ne peut pas remettre, par exemple parce que l’agent n’a jamais signalé de conversation, est rejetée à la fin du dispatch. Le rejet est une OutpostError de code steering, avec le texte dans details.text.

Chaque exécution d’un sous-agent intégré a un identifiant, fourni par son événement subagent. Passez-le dans subagent pour ne viser que cette exécution.

import { createSteering, type DispatchOptions } from "@elie-laloum/outpost";

const steering = createSteering();
const request: DispatchOptions = {
  brief: { text: "Review the repository." },
  steering,
  observe(event) {
    if (event.kind !== "subagent" || event.status !== "started") return;
    if (event.name === "inspect")
      void steering.send("Only inspect src/.", { subagent: event.id });
  },
};

Référence API : SteeringSendOptions.

Une consigne encore en attente quand son exécution se termine est rejetée avec le code steering et l’identifiant dans details.subagent.

Un contrôleur sert un dispatch à la fois, sur toutes ses passes ; l’attacher à un second dispatch concurrent échoue. Une fois un dispatch terminé, le suivant peut l’utiliser. close() rejette les consignes en attente et tout send() ultérieur.

result.resume() et result.fork() n’en héritent pas : repassez steering dans leurs options.

Dans un workflow, renvoyez steering depuis la request d’un defineAgentTask() ou d’un defineIsolatedTask(). Avec un agent de secours, la réorientation suit le candidat en cours d’exécution.

Chaque remise émet un événement d’agent steer avec text, mode, pass, et subagentId quand un sous-agent l’a reçue. Le reporter de terminal l’affiche, et la conversation l’enregistre comme message utilisateur.

Une remise resumed termine le tour interrompu par un événement stopped de raison steered ; ce tour figure dans result.turns avec interrupted: "steering". Une passe émet toujours un seul summary, et result.usage inclut les tours interrompus. Un rejeu reproduit les exécutions réorientées tour par tour.

  • Les consignes vivent en mémoire. Pour des questions et réponses qui doivent survivre à un redémarrage, utilisez les tâches interactives.
  • Un dispatch avec steering refuse les agents qui ne peuvent ni recevoir d’entrée en direct ni reprendre une conversation, dont les agents de rejeu.
  • La réorientation de Codex utilise le protocole app-server, que Codex marque comme expérimental.
  • Les sous-agents des agents CLI ne sont pas adressables : une consigne avec subagent est rejetée dès qu’un tour CLI la voit.

API : createSteering · Steering · SteeringSendOptions · SteeringDelivery · DispatchOptions.