{"title":"Workflow piloté par les tâches","slug":"task-driven-workflow","category":"llm-cookbook","summary":"Utilisez les tâches Synapse pour piloter des workflows LLM multi-étapes qui survivent entre les sessions.","audience":["llm"],"tags":["cookbook","tasks","workflow","persistence"],"difficulty":"intermediate","updated":"2026-06-27","word_count":354,"read_minutes":2,"lang":"fr","translated":true,"requested_lang":"fr","content_markdown":"\n# Workflow piloté par les tâches\n\nLes tâches ne sont pas juste des todos — elles sont l'épine dorsale des workflows LLM\npersistants. En créant des tâches pour le travail multi-étapes, vous garantissez la\ncontinuité entre les sessions et fournissez des pistes d'audit de ce qui a été fait.\n\n## Pourquoi piloté par les tâches ?\n\nSans tâches :\n- Le LLM commence chaque session incertain de ce qu'il faut faire\n- Le travail multi-étapes est oublié en cours d'exécution\n- Aucun enregistrement de ce qui a été fait\n\nAvec des tâches :\n- Le LLM reprend les tâches en cours immédiatement\n- Le travail multi-étapes survit entre les sessions\n- Piste d'audit intégrée de tout le travail\n\n## Le schéma\n\n```\n1. At session start: check in_progress tasks\n2. If tasks exist: resume them\n3. If no tasks: create new tasks for current work\n4. Update task status as you progress\n5. Mark done when complete\n```\n\n## Implémentation\n\n### Étape 1 : créer une tâche pour un travail multi-étapes\n\n```python\ndef start_workflow(title, steps):\n    \"\"\"Create a task for multi-step work.\"\"\"\n    task_id = create_task(\n        title=title,\n        description=f\"Steps:\\n\" + \"\\n\".join(f\"  {i+1}. {s}\" for i, s in enumerate(steps)),\n        priority=\"high\"\n    )\n    return task_id\n\n# Exemple\ntask_id = start_workflow(\"Deploy Synapse v1.6.0\", [\n    \"Bump version in package.json\",\n    \"Update CHANGELOG.md\",\n    \"Commit and push\",\n    \"Wait for CI green\",\n    \"Verify deployment\"\n])\n```\n\n### Étape 2 : suivre la progression dans la description de tâche\n\n```python\ndef update_progress(task_id, current_step, total_steps, status_note):\n    \"\"\"Update task with current progress.\"\"\"\n    description = f\"Progress: {current_step}/{total_steps}\\nStatus: {status_note}\"\n    update_task(task_id, status=\"in_progress\", description=description)\n\n# Exemple\nupdate_progress(task_id, 2, 5, \"CHANGELOG updated, committing now\")\n```\n\n### Étape 3 : reprendre entre les sessions\n\n```python\ndef resume_work():\n    \"\"\"At session start, find and resume in-progress tasks.\"\"\"\n    tasks = list_tasks(status=\"in_progress\")\n    \n    for task in tasks:\n        print(f\"Resuming: {task['title']}\")\n        print(f\"Last status: {task['description']}\")\n        \n        # Analyser la progression depuis la description\n        progress = parse_progress(task['description'])\n        next_step = progress['current_step'] + 1\n        \n        # Continuer depuis l'étape suivante\n        continue_from_step(task['id'], next_step)\n```\n\n### Étape 4 : compléter et archiver\n\n```python\ndef complete_task(task_id, summary):\n    \"\"\"Mark task done with completion summary.\"\"\"\n    update_task(task_id, \n        status=\"done\",\n        description=f\"COMPLETED. Summary: {summary}\"\n    )\n    # Aussi stocker en mémoire pour référence longue durée\n    remember(\n        category=\"project\",\n        key=f\"completed_{task_id}\",\n        content=f\"Task: {task_id}\\nSummary: {summary}\",\n        tags=[\"completed\", \"task\"],\n        priority=\"normal\"\n    )\n```\n\n## Exemple complet : workflow de déploiement\n\n```python\nclass DeployWorkflow:\n    def __init__(self, version):\n        self.version = version\n        self.task_id = None\n        self.steps = [\n            (\"Bump version\", self.bump_version),\n            (\"Update changelog\", self.update_changelog),\n            (\"Commit and push\", self.commit_push),\n            (\"Wait for CI\", self.wait_for_ci),\n            (\"Verify deployment\", self.verify_deployment),\n        ]\n    \n    def run(self):\n        # Vérifier si déjà en cours\n        existing = self.find_existing()\n        if existing:\n            self.task_id = existing['id']\n            start_step = self.parse_progress(existing['description'])\n        else:\n            self.task_id = create_task(\n                title=f\"Deploy Synapse v{self.version}\",\n                description=self.build_description(0),\n                priority=\"high\"\n            )\n            start_step = 0\n        \n        # Exécuter les étapes restantes\n        for i in range(start_step, len(self.steps)):\n            step_name, step_fn = self.steps[i]\n            self.update_progress(i, f\"Running: {step_name}\")\n            try:\n                step_fn()\n            except Exception as e:\n                self.update_progress(i, f\"FAILED at {step_name}: {e}\")\n                raise\n        \n        self.complete()\n    \n    def update_progress(self, step_idx, status):\n        update_task(self.task_id,\n            status=\"in_progress\",\n            description=f\"Step {step_idx+1}/{len(self.steps)}: {status}\"\n        )\n    \n    def complete(self):\n        complete_task(self.task_id, f\"Deployed v{self.version} successfully\")\n```\n\n## Hiérarchie de tâches\n\nPour le travail complexe, utilisez des relations parent-enfant :\n\n```python\n# Tâche parent\nparent_id = create_task(\"v1.6.0 Release\", priority=\"high\")\n\n# Sous-tâches (liées via tags)\ncreate_task(\"Bump version\", \n    description=f\"Parent: {parent_id}\",\n    tags=[\"v1.6.0\", f\"parent-{parent_id}\"],\n    priority=\"high\")\n\ncreate_task(\"Update docs\",\n    description=f\"Parent: {parent_id}\",\n    tags=[\"v1.6.0\", f\"parent-{parent_id}\"],\n    priority=\"normal\")\n```\n\nRecherchez les sous-tâches :\n\n```bash\ncurl -H \"Authorization: Bearer $KEY\" \\\n     \".../memory/search?q=parent-{parent_id}&tag=v1.6.0\"\n```\n\n## Workflow de statut\n\n```\npending → in_progress → done\n                ↘ cancelled\n```\n\n### Pending\n\nTâche créée mais non commencée. À utiliser pour le travail planifié.\n\n### In Progress\n\nEn cours de traitement. **Mettez à jour la description avec la progression.**\n\n### Done\n\nTerminée avec succès. La description devrait inclure un résumé.\n\n### Cancelled\n\nAbandonnée. La description devrait inclure la raison.\n\n## Bonnes pratiques\n\n> [!TIP]\n> - **Créez des tâches pour le travail multi-étapes** — le travail mono-étape n'a pas besoin de tâche\n> - **Mettez à jour la description avec la progression** — permet la reprise\n> - **Utilisez une priorité élevée pour le travail actif** — apparaît dans le rappel\n> - **Complétez les tâches quand elles sont terminées** — ne les laissez pas in_progress\n> - **Stockez les résumés de complétion en mémoire** — référence longue durée\n\n## Schémas courants\n\n### Schéma : workflow de correction de bug\n\n```python\ndef fix_bug(bug_id, description):\n    task_id = create_task(\n        title=f\"Fix bug {bug_id}\",\n        description=description,\n        priority=\"high\"\n    )\n    \n    # Investiguer\n    update_progress(task_id, \"Investigating root cause\")\n    root_cause = investigate()\n    \n    # Corriger\n    update_progress(task_id, f\"Applying fix: {root_cause}\")\n    apply_fix(root_cause)\n    \n    # Tester\n    update_progress(task_id, \"Testing fix\")\n    run_tests()\n    \n    # Déployer\n    update_progress(task_id, \"Deploying fix\")\n    deploy()\n    \n    complete_task(task_id, f\"Fixed: {root_cause}\")\n```\n\n### Schéma : workflow de recherche\n\n```python\ndef research_topic(topic):\n    task_id = create_task(\n        title=f\"Research: {topic}\",\n        priority=\"normal\"\n    )\n    \n    update_progress(task_id, \"Gathering sources\")\n    sources = gather_sources(topic)\n    \n    update_progress(task_id, \"Analyzing\")\n    analysis = analyze(sources)\n    \n    update_progress(task_id, \"Storing findings\")\n    remember(\"fact\", f\"research_{topic}\", analysis,\n             tags=[\"research\", topic], priority=\"normal\")\n    \n    complete_task(task_id, f\"Research complete: {len(sources)} sources\")\n```\n\n## Prochaines étapes\n\n- [Schéma de début de session](/docs/llm-cookbook/session-start-pattern)\n- [Schéma de polling de chat](/docs/llm-cookbook/chat-polling-pattern)\n- [Récupération d'erreurs](/docs/llm-cookbook/error-recovery)\n","content_html":"<h1>Workflow piloté par les tâches</h1>\n<p>Les tâches ne sont pas juste des todos — elles sont l&#39;épine dorsale des workflows LLM\npersistants. En créant des tâches pour le travail multi-étapes, vous garantissez la\ncontinuité entre les sessions et fournissez des pistes d&#39;audit de ce qui a été fait.</p>\n<h2>Pourquoi piloté par les tâches ?</h2>\n<p>Sans tâches :</p>\n<ul>\n<li>Le LLM commence chaque session incertain de ce qu&#39;il faut faire</li>\n<li>Le travail multi-étapes est oublié en cours d&#39;exécution</li>\n<li>Aucun enregistrement de ce qui a été fait</li>\n</ul>\n<p>Avec des tâches :</p>\n<ul>\n<li>Le LLM reprend les tâches en cours immédiatement</li>\n<li>Le travail multi-étapes survit entre les sessions</li>\n<li>Piste d&#39;audit intégrée de tout le travail</li>\n</ul>\n<h2>Le schéma</h2>\n<pre><code class=\"hljs language-plaintext\">1. At session start: check in_progress tasks\n2. If tasks exist: resume them\n3. If no tasks: create new tasks for current work\n4. Update task status as you progress\n5. Mark done when complete</code></pre><h2>Implémentation</h2>\n<h3>Étape 1 : créer une tâche pour un travail multi-étapes</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">start_workflow</span>(<span class=\"hljs-params\">title, steps</span>):\n    <span class=\"hljs-string\">&quot;&quot;&quot;Create a task for multi-step work.&quot;&quot;&quot;</span>\n    task_id = create_task(\n        title=title,\n        description=<span class=\"hljs-string\">f&quot;Steps:\\n&quot;</span> + <span class=\"hljs-string\">&quot;\\n&quot;</span>.join(<span class=\"hljs-string\">f&quot;  <span class=\"hljs-subst\">{i+<span class=\"hljs-number\">1</span>}</span>. <span class=\"hljs-subst\">{s}</span>&quot;</span> <span class=\"hljs-keyword\">for</span> i, s <span class=\"hljs-keyword\">in</span> <span class=\"hljs-built_in\">enumerate</span>(steps)),\n        priority=<span class=\"hljs-string\">&quot;high&quot;</span>\n    )\n    <span class=\"hljs-keyword\">return</span> task_id\n\n<span class=\"hljs-comment\"># Exemple</span>\ntask_id = start_workflow(<span class=\"hljs-string\">&quot;Deploy Synapse v1.6.0&quot;</span>, [\n    <span class=\"hljs-string\">&quot;Bump version in package.json&quot;</span>,\n    <span class=\"hljs-string\">&quot;Update CHANGELOG.md&quot;</span>,\n    <span class=\"hljs-string\">&quot;Commit and push&quot;</span>,\n    <span class=\"hljs-string\">&quot;Wait for CI green&quot;</span>,\n    <span class=\"hljs-string\">&quot;Verify deployment&quot;</span>\n])</code></pre><h3>Étape 2 : suivre la progression dans la description de tâche</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">update_progress</span>(<span class=\"hljs-params\">task_id, current_step, total_steps, status_note</span>):\n    <span class=\"hljs-string\">&quot;&quot;&quot;Update task with current progress.&quot;&quot;&quot;</span>\n    description = <span class=\"hljs-string\">f&quot;Progress: <span class=\"hljs-subst\">{current_step}</span>/<span class=\"hljs-subst\">{total_steps}</span>\\nStatus: <span class=\"hljs-subst\">{status_note}</span>&quot;</span>\n    update_task(task_id, status=<span class=\"hljs-string\">&quot;in_progress&quot;</span>, description=description)\n\n<span class=\"hljs-comment\"># Exemple</span>\nupdate_progress(task_id, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">5</span>, <span class=\"hljs-string\">&quot;CHANGELOG updated, committing now&quot;</span>)</code></pre><h3>Étape 3 : reprendre entre les sessions</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">resume_work</span>():\n    <span class=\"hljs-string\">&quot;&quot;&quot;At session start, find and resume in-progress tasks.&quot;&quot;&quot;</span>\n    tasks = list_tasks(status=<span class=\"hljs-string\">&quot;in_progress&quot;</span>)\n    \n    <span class=\"hljs-keyword\">for</span> task <span class=\"hljs-keyword\">in</span> tasks:\n        <span class=\"hljs-built_in\">print</span>(<span class=\"hljs-string\">f&quot;Resuming: <span class=\"hljs-subst\">{task[<span class=\"hljs-string\">&#x27;title&#x27;</span>]}</span>&quot;</span>)\n        <span class=\"hljs-built_in\">print</span>(<span class=\"hljs-string\">f&quot;Last status: <span class=\"hljs-subst\">{task[<span class=\"hljs-string\">&#x27;description&#x27;</span>]}</span>&quot;</span>)\n        \n        <span class=\"hljs-comment\"># Analyser la progression depuis la description</span>\n        progress = parse_progress(task[<span class=\"hljs-string\">&#x27;description&#x27;</span>])\n        next_step = progress[<span class=\"hljs-string\">&#x27;current_step&#x27;</span>] + <span class=\"hljs-number\">1</span>\n        \n        <span class=\"hljs-comment\"># Continuer depuis l&#x27;étape suivante</span>\n        continue_from_step(task[<span class=\"hljs-string\">&#x27;id&#x27;</span>], next_step)</code></pre><h3>Étape 4 : compléter et archiver</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">complete_task</span>(<span class=\"hljs-params\">task_id, summary</span>):\n    <span class=\"hljs-string\">&quot;&quot;&quot;Mark task done with completion summary.&quot;&quot;&quot;</span>\n    update_task(task_id, \n        status=<span class=\"hljs-string\">&quot;done&quot;</span>,\n        description=<span class=\"hljs-string\">f&quot;COMPLETED. Summary: <span class=\"hljs-subst\">{summary}</span>&quot;</span>\n    )\n    <span class=\"hljs-comment\"># Aussi stocker en mémoire pour référence longue durée</span>\n    remember(\n        category=<span class=\"hljs-string\">&quot;project&quot;</span>,\n        key=<span class=\"hljs-string\">f&quot;completed_<span class=\"hljs-subst\">{task_id}</span>&quot;</span>,\n        content=<span class=\"hljs-string\">f&quot;Task: <span class=\"hljs-subst\">{task_id}</span>\\nSummary: <span class=\"hljs-subst\">{summary}</span>&quot;</span>,\n        tags=[<span class=\"hljs-string\">&quot;completed&quot;</span>, <span class=\"hljs-string\">&quot;task&quot;</span>],\n        priority=<span class=\"hljs-string\">&quot;normal&quot;</span>\n    )</code></pre><h2>Exemple complet : workflow de déploiement</h2>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">DeployWorkflow</span>:\n    <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">__init__</span>(<span class=\"hljs-params\">self, version</span>):\n        <span class=\"hljs-variable language_\">self</span>.version = version\n        <span class=\"hljs-variable language_\">self</span>.task_id = <span class=\"hljs-literal\">None</span>\n        <span class=\"hljs-variable language_\">self</span>.steps = [\n            (<span class=\"hljs-string\">&quot;Bump version&quot;</span>, <span class=\"hljs-variable language_\">self</span>.bump_version),\n            (<span class=\"hljs-string\">&quot;Update changelog&quot;</span>, <span class=\"hljs-variable language_\">self</span>.update_changelog),\n            (<span class=\"hljs-string\">&quot;Commit and push&quot;</span>, <span class=\"hljs-variable language_\">self</span>.commit_push),\n            (<span class=\"hljs-string\">&quot;Wait for CI&quot;</span>, <span class=\"hljs-variable language_\">self</span>.wait_for_ci),\n            (<span class=\"hljs-string\">&quot;Verify deployment&quot;</span>, <span class=\"hljs-variable language_\">self</span>.verify_deployment),\n        ]\n    \n    <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">run</span>(<span class=\"hljs-params\">self</span>):\n        <span class=\"hljs-comment\"># Vérifier si déjà en cours</span>\n        existing = <span class=\"hljs-variable language_\">self</span>.find_existing()\n        <span class=\"hljs-keyword\">if</span> existing:\n            <span class=\"hljs-variable language_\">self</span>.task_id = existing[<span class=\"hljs-string\">&#x27;id&#x27;</span>]\n            start_step = <span class=\"hljs-variable language_\">self</span>.parse_progress(existing[<span class=\"hljs-string\">&#x27;description&#x27;</span>])\n        <span class=\"hljs-keyword\">else</span>:\n            <span class=\"hljs-variable language_\">self</span>.task_id = create_task(\n                title=<span class=\"hljs-string\">f&quot;Deploy Synapse v<span class=\"hljs-subst\">{self.version}</span>&quot;</span>,\n                description=<span class=\"hljs-variable language_\">self</span>.build_description(<span class=\"hljs-number\">0</span>),\n                priority=<span class=\"hljs-string\">&quot;high&quot;</span>\n            )\n            start_step = <span class=\"hljs-number\">0</span>\n        \n        <span class=\"hljs-comment\"># Exécuter les étapes restantes</span>\n        <span class=\"hljs-keyword\">for</span> i <span class=\"hljs-keyword\">in</span> <span class=\"hljs-built_in\">range</span>(start_step, <span class=\"hljs-built_in\">len</span>(<span class=\"hljs-variable language_\">self</span>.steps)):\n            step_name, step_fn = <span class=\"hljs-variable language_\">self</span>.steps[i]\n            <span class=\"hljs-variable language_\">self</span>.update_progress(i, <span class=\"hljs-string\">f&quot;Running: <span class=\"hljs-subst\">{step_name}</span>&quot;</span>)\n            <span class=\"hljs-keyword\">try</span>:\n                step_fn()\n            <span class=\"hljs-keyword\">except</span> Exception <span class=\"hljs-keyword\">as</span> e:\n                <span class=\"hljs-variable language_\">self</span>.update_progress(i, <span class=\"hljs-string\">f&quot;FAILED at <span class=\"hljs-subst\">{step_name}</span>: <span class=\"hljs-subst\">{e}</span>&quot;</span>)\n                <span class=\"hljs-keyword\">raise</span>\n        \n        <span class=\"hljs-variable language_\">self</span>.complete()\n    \n    <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">update_progress</span>(<span class=\"hljs-params\">self, step_idx, status</span>):\n        update_task(<span class=\"hljs-variable language_\">self</span>.task_id,\n            status=<span class=\"hljs-string\">&quot;in_progress&quot;</span>,\n            description=<span class=\"hljs-string\">f&quot;Step <span class=\"hljs-subst\">{step_idx+<span class=\"hljs-number\">1</span>}</span>/<span class=\"hljs-subst\">{<span class=\"hljs-built_in\">len</span>(self.steps)}</span>: <span class=\"hljs-subst\">{status}</span>&quot;</span>\n        )\n    \n    <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">complete</span>(<span class=\"hljs-params\">self</span>):\n        complete_task(<span class=\"hljs-variable language_\">self</span>.task_id, <span class=\"hljs-string\">f&quot;Deployed v<span class=\"hljs-subst\">{self.version}</span> successfully&quot;</span>)</code></pre><h2>Hiérarchie de tâches</h2>\n<p>Pour le travail complexe, utilisez des relations parent-enfant :</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Tâche parent</span>\nparent_id = create_task(<span class=\"hljs-string\">&quot;v1.6.0 Release&quot;</span>, priority=<span class=\"hljs-string\">&quot;high&quot;</span>)\n\n<span class=\"hljs-comment\"># Sous-tâches (liées via tags)</span>\ncreate_task(<span class=\"hljs-string\">&quot;Bump version&quot;</span>, \n    description=<span class=\"hljs-string\">f&quot;Parent: <span class=\"hljs-subst\">{parent_id}</span>&quot;</span>,\n    tags=[<span class=\"hljs-string\">&quot;v1.6.0&quot;</span>, <span class=\"hljs-string\">f&quot;parent-<span class=\"hljs-subst\">{parent_id}</span>&quot;</span>],\n    priority=<span class=\"hljs-string\">&quot;high&quot;</span>)\n\ncreate_task(<span class=\"hljs-string\">&quot;Update docs&quot;</span>,\n    description=<span class=\"hljs-string\">f&quot;Parent: <span class=\"hljs-subst\">{parent_id}</span>&quot;</span>,\n    tags=[<span class=\"hljs-string\">&quot;v1.6.0&quot;</span>, <span class=\"hljs-string\">f&quot;parent-<span class=\"hljs-subst\">{parent_id}</span>&quot;</span>],\n    priority=<span class=\"hljs-string\">&quot;normal&quot;</span>)</code></pre><p>Recherchez les sous-tâches :</p>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> \\\n     <span class=\"hljs-string\">&quot;.../memory/search?q=parent-{parent_id}&amp;tag=v1.6.0&quot;</span></code></pre><h2>Workflow de statut</h2>\n<pre><code class=\"hljs language-plaintext\">pending → in_progress → done\n                ↘ cancelled</code></pre><h3>Pending</h3>\n<p>Tâche créée mais non commencée. À utiliser pour le travail planifié.</p>\n<h3>In Progress</h3>\n<p>En cours de traitement. <strong>Mettez à jour la description avec la progression.</strong></p>\n<h3>Done</h3>\n<p>Terminée avec succès. La description devrait inclure un résumé.</p>\n<h3>Cancelled</h3>\n<p>Abandonnée. La description devrait inclure la raison.</p>\n<h2>Bonnes pratiques</h2>\n<div class=\"callout callout-ok\"></div><h2>Schémas courants</h2>\n<h3>Schéma : workflow de correction de bug</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">fix_bug</span>(<span class=\"hljs-params\">bug_id, description</span>):\n    task_id = create_task(\n        title=<span class=\"hljs-string\">f&quot;Fix bug <span class=\"hljs-subst\">{bug_id}</span>&quot;</span>,\n        description=description,\n        priority=<span class=\"hljs-string\">&quot;high&quot;</span>\n    )\n    \n    <span class=\"hljs-comment\"># Investiguer</span>\n    update_progress(task_id, <span class=\"hljs-string\">&quot;Investigating root cause&quot;</span>)\n    root_cause = investigate()\n    \n    <span class=\"hljs-comment\"># Corriger</span>\n    update_progress(task_id, <span class=\"hljs-string\">f&quot;Applying fix: <span class=\"hljs-subst\">{root_cause}</span>&quot;</span>)\n    apply_fix(root_cause)\n    \n    <span class=\"hljs-comment\"># Tester</span>\n    update_progress(task_id, <span class=\"hljs-string\">&quot;Testing fix&quot;</span>)\n    run_tests()\n    \n    <span class=\"hljs-comment\"># Déployer</span>\n    update_progress(task_id, <span class=\"hljs-string\">&quot;Deploying fix&quot;</span>)\n    deploy()\n    \n    complete_task(task_id, <span class=\"hljs-string\">f&quot;Fixed: <span class=\"hljs-subst\">{root_cause}</span>&quot;</span>)</code></pre><h3>Schéma : workflow de recherche</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">research_topic</span>(<span class=\"hljs-params\">topic</span>):\n    task_id = create_task(\n        title=<span class=\"hljs-string\">f&quot;Research: <span class=\"hljs-subst\">{topic}</span>&quot;</span>,\n        priority=<span class=\"hljs-string\">&quot;normal&quot;</span>\n    )\n    \n    update_progress(task_id, <span class=\"hljs-string\">&quot;Gathering sources&quot;</span>)\n    sources = gather_sources(topic)\n    \n    update_progress(task_id, <span class=\"hljs-string\">&quot;Analyzing&quot;</span>)\n    analysis = analyze(sources)\n    \n    update_progress(task_id, <span class=\"hljs-string\">&quot;Storing findings&quot;</span>)\n    remember(<span class=\"hljs-string\">&quot;fact&quot;</span>, <span class=\"hljs-string\">f&quot;research_<span class=\"hljs-subst\">{topic}</span>&quot;</span>, analysis,\n             tags=[<span class=\"hljs-string\">&quot;research&quot;</span>, topic], priority=<span class=\"hljs-string\">&quot;normal&quot;</span>)\n    \n    complete_task(task_id, <span class=\"hljs-string\">f&quot;Research complete: <span class=\"hljs-subst\">{<span class=\"hljs-built_in\">len</span>(sources)}</span> sources&quot;</span>)</code></pre><h2>Prochaines étapes</h2>\n<ul>\n<li><a href=\"/docs/llm-cookbook/session-start-pattern\">Schéma de début de session</a></li>\n<li><a href=\"/docs/llm-cookbook/chat-polling-pattern\">Schéma de polling de chat</a></li>\n<li><a href=\"/docs/llm-cookbook/error-recovery\">Récupération d&#39;erreurs</a></li>\n</ul>\n","urls":{"html":"/docs/llm-cookbook/task-driven-workflow","text":"/docs/llm-cookbook/task-driven-workflow?format=text","json":"/docs/llm-cookbook/task-driven-workflow?format=json","llm":"/docs/llm-cookbook/task-driven-workflow?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}