Workflow piloté par les tâches
Utilisez les tâches Synapse pour piloter des workflows LLM multi-étapes qui survivent entre les sessions.
Workflow piloté par les tâches
Les tâches ne sont pas juste des todos — elles sont l'épine dorsale des workflows LLM persistants. En créant des tâches pour le travail multi-étapes, vous garantissez la continuité entre les sessions et fournissez des pistes d'audit de ce qui a été fait.
Pourquoi piloté par les tâches ?
Sans tâches :
- Le LLM commence chaque session incertain de ce qu'il faut faire
- Le travail multi-étapes est oublié en cours d'exécution
- Aucun enregistrement de ce qui a été fait
Avec des tâches :
- Le LLM reprend les tâches en cours immédiatement
- Le travail multi-étapes survit entre les sessions
- Piste d'audit intégrée de tout le travail
Le schéma
1. At session start: check in_progress tasks
2. If tasks exist: resume them
3. If no tasks: create new tasks for current work
4. Update task status as you progress
5. Mark done when completeImplémentation
Étape 1 : créer une tâche pour un travail multi-étapes
def start_workflow(title, steps):
"""Create a task for multi-step work."""
task_id = create_task(
title=title,
description=f"Steps:\n" + "\n".join(f" {i+1}. {s}" for i, s in enumerate(steps)),
priority="high"
)
return task_id
# Exemple
task_id = start_workflow("Deploy Synapse v1.6.0", [
"Bump version in package.json",
"Update CHANGELOG.md",
"Commit and push",
"Wait for CI green",
"Verify deployment"
])Étape 2 : suivre la progression dans la description de tâche
def update_progress(task_id, current_step, total_steps, status_note):
"""Update task with current progress."""
description = f"Progress: {current_step}/{total_steps}\nStatus: {status_note}"
update_task(task_id, status="in_progress", description=description)
# Exemple
update_progress(task_id, 2, 5, "CHANGELOG updated, committing now")Étape 3 : reprendre entre les sessions
def resume_work():
"""At session start, find and resume in-progress tasks."""
tasks = list_tasks(status="in_progress")
for task in tasks:
print(f"Resuming: {task['title']}")
print(f"Last status: {task['description']}")
# Analyser la progression depuis la description
progress = parse_progress(task['description'])
next_step = progress['current_step'] + 1
# Continuer depuis l'étape suivante
continue_from_step(task['id'], next_step)Étape 4 : compléter et archiver
def complete_task(task_id, summary):
"""Mark task done with completion summary."""
update_task(task_id,
status="done",
description=f"COMPLETED. Summary: {summary}"
)
# Aussi stocker en mémoire pour référence longue durée
remember(
category="project",
key=f"completed_{task_id}",
content=f"Task: {task_id}\nSummary: {summary}",
tags=["completed", "task"],
priority="normal"
)Exemple complet : workflow de déploiement
class DeployWorkflow:
def __init__(self, version):
self.version = version
self.task_id = None
self.steps = [
("Bump version", self.bump_version),
("Update changelog", self.update_changelog),
("Commit and push", self.commit_push),
("Wait for CI", self.wait_for_ci),
("Verify deployment", self.verify_deployment),
]
def run(self):
# Vérifier si déjà en cours
existing = self.find_existing()
if existing:
self.task_id = existing['id']
start_step = self.parse_progress(existing['description'])
else:
self.task_id = create_task(
title=f"Deploy Synapse v{self.version}",
description=self.build_description(0),
priority="high"
)
start_step = 0
# Exécuter les étapes restantes
for i in range(start_step, len(self.steps)):
step_name, step_fn = self.steps[i]
self.update_progress(i, f"Running: {step_name}")
try:
step_fn()
except Exception as e:
self.update_progress(i, f"FAILED at {step_name}: {e}")
raise
self.complete()
def update_progress(self, step_idx, status):
update_task(self.task_id,
status="in_progress",
description=f"Step {step_idx+1}/{len(self.steps)}: {status}"
)
def complete(self):
complete_task(self.task_id, f"Deployed v{self.version} successfully")Hiérarchie de tâches
Pour le travail complexe, utilisez des relations parent-enfant :
# Tâche parent
parent_id = create_task("v1.6.0 Release", priority="high")
# Sous-tâches (liées via tags)
create_task("Bump version",
description=f"Parent: {parent_id}",
tags=["v1.6.0", f"parent-{parent_id}"],
priority="high")
create_task("Update docs",
description=f"Parent: {parent_id}",
tags=["v1.6.0", f"parent-{parent_id}"],
priority="normal")Recherchez les sous-tâches :
curl -H "Authorization: Bearer $KEY" \
".../memory/search?q=parent-{parent_id}&tag=v1.6.0"Workflow de statut
pending → in_progress → done
↘ cancelledPending
Tâche créée mais non commencée. À utiliser pour le travail planifié.
In Progress
En cours de traitement. Mettez à jour la description avec la progression.
Done
Terminée avec succès. La description devrait inclure un résumé.
Cancelled
Abandonnée. La description devrait inclure la raison.
Bonnes pratiques
Schémas courants
Schéma : workflow de correction de bug
def fix_bug(bug_id, description):
task_id = create_task(
title=f"Fix bug {bug_id}",
description=description,
priority="high"
)
# Investiguer
update_progress(task_id, "Investigating root cause")
root_cause = investigate()
# Corriger
update_progress(task_id, f"Applying fix: {root_cause}")
apply_fix(root_cause)
# Tester
update_progress(task_id, "Testing fix")
run_tests()
# Déployer
update_progress(task_id, "Deploying fix")
deploy()
complete_task(task_id, f"Fixed: {root_cause}")Schéma : workflow de recherche
def research_topic(topic):
task_id = create_task(
title=f"Research: {topic}",
priority="normal"
)
update_progress(task_id, "Gathering sources")
sources = gather_sources(topic)
update_progress(task_id, "Analyzing")
analysis = analyze(sources)
update_progress(task_id, "Storing findings")
remember("fact", f"research_{topic}", analysis,
tags=["research", topic], priority="normal")
complete_task(task_id, f"Research complete: {len(sources)} sources")