Aller au contenu
English

Composer des workflows typés

Reliez les résultats des tâches et choisissez le type de tâche adapté à chaque étape.

Dans cet exemple, une première tâche prépare la liste des fichiers. Une tâche de boucle essaie ensuite de produire un résultat accepté par sa vérification. Les dépendances indiquent dans quel ordre ces tâches peuvent démarrer.

import { defineTask } from "@elie-laloum/outpost";

export const plan = defineTask({
  key: "plan",
  perform: () => ({ files: ["src/parser.ts"] }),
});
import { defineLoopTask } from "@elie-laloum/outpost";
import { plan } from "./plan.ts";

export const fix = defineLoopTask({
  key: "fix",
  after: [plan],
  maxRounds: 3,
  attempt: (context) => ({
    files: context.value(plan).files,
    round: context.round,
  }),
  check: (_, candidate) =>
    candidate.round === 2
      ? { done: true }
      : { done: false, feedback: "Cover the missing edge case." },
});
import { reportValue } from "./reporter.ts";
import { defineWorkflow } from "@elie-laloum/outpost";
import { plan } from "./plan.ts";
import { fix } from "./fix.ts";

export const result = await defineWorkflow("fix-parser", [plan, fix]).start();
result.unwrap();
reportValue(result.value(fix));
// Example output: { files: [ 'src/parser.ts' ], round: 2 }

Rien ne s’exécute avant start(). Le premier tour est rejeté, le second reçoit le retour et passe, et result.value(fix) conserve le type renvoyé par attempt.

TâcheExécuteRenvoie
defineTask()Votre propre fonctionCe qu’elle renvoie
defineAgentTask()Un agent sur le workspace partagéSon texte, ses commits et sa valeur typée
defineIsolatedTask()Un agent dans sa propre sandbox et son worktreeLa même chose, par dépôt
defineLoopTask()Tentative et vérification, jusqu’à acceptationLe candidat accepté
defineApprovalTask()Une approbation donnée par une personneLa décision enregistrée

Pour un workflow avec checkpoint, renvoyez des valeurs qui peuvent être enregistrées et restaurées en JSON sans perdre d’information. Le processus suivant pourra alors reprendre à partir des résultats sauvegardés.

  • context.value() lève une erreur pour une tâche absente de after, même si elle a déjà tourné.
  • Une tâche ne démarre qu’une fois toutes celles de son after terminées ; defineWorkflow() refuse les cycles et les dépendances inconnues avant l’exécution.
  • Un rejet au dernier tour fait échouer la tâche de boucle avec LoopTaskExhausted.
  • Pour enregistrer les résultats dans un checkpoint, utilisez des valeurs qui peuvent être restaurées depuis le JSON sans perte. Les instances de classes, les flux et les descripteurs ne conviennent pas.
  • Un workflow ne pousse, ne fusionne et ne déploie rien de lui-même. Ces étapes restent dans vos tâches.

API : defineTask · defineWorkflow · defineLoopTask · TaskContext · WorkflowResult · WorkflowFailure · defineJsonResponse.