Przepływ oparty na zadaniach
Wykorzystanie zadań Synapse do napędzania wieloetapowych przepływów LLM, które przetrwają między sesjami.
Przepływ oparty na zadaniach
Zadania to nie tylko todo — to kręgosłup trwałych przepływów LLM. Tworząc zadania dla wieloetapowej pracy, zapewnia się ciągłość między sesjami i dostarcza ścieżki audytowe tego, co zrobiono.
Dlaczego przepływ oparty na zadaniach?
Bez zadań:
- LLM zaczyna każdą sesję niepewny, co robić
- Wieloetapowa praca jest zapominana w połowie wykonania
- Brak zapisu tego, co zostało zrobione
Z zadaniami:
- LLM natychmiast wznawia zadania w toku
- Wieloetapowa praca przetrwa między sesjami
- Wbudowana ścieżka audytowa całej pracy
Wzorzec
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 completeImplementacja
Krok 1: utworzenie zadania dla wieloetapowej pracy
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
# Przykład
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"
])Krok 2: śledzenie postępu w opisie zadania
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)
# Przykład
update_progress(task_id, 2, 5, "CHANGELOG updated, committing now")Krok 3: wznawianie między sesjami
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']}")
# Parsowanie postępu z opisu
progress = parse_progress(task['description'])
next_step = progress['current_step'] + 1
# Kontynuacja od następnego kroku
continue_from_step(task['id'], next_step)Krok 4: ukończenie i archiwizacja
def complete_task(task_id, summary):
"""Mark task done with completion summary."""
update_task(task_id,
status="done",
description=f"COMPLETED. Summary: {summary}"
)
# Także zapisać jako wspomnienie do długoterminowego odniesienia
remember(
category="project",
key=f"completed_{task_id}",
content=f"Task: {task_id}\nSummary: {summary}",
tags=["completed", "task"],
priority="normal"
)Pełny przykład: przepływ wdrożenia
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):
# Sprawdzenie, czy już w toku
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
# Wykonanie pozostałych kroków
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")Hierarchia zadań
Dla złożonej pracy używać relacji zadań nadrzędnych-podrzędnych:
# Zadanie nadrzędne
parent_id = create_task("v1.6.0 Release", priority="high")
# Podzadania (powiązane przez tagi)
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")Wyszukiwanie podzadań:
curl -H "Authorization: Bearer $KEY" \
".../memory/search?q=parent-{parent_id}&tag=v1.6.0"Przepływ statusu
pending → in_progress → done
↘ cancelledPending
Zadanie utworzone, ale nierozpoczęte. Używać do planowanej pracy.
In Progress
Obecnie realizowane. Aktualizować opis o postęp.
Done
Ukończone pomyślnie. Opis powinien zawierać podsumowanie.
Cancelled
Porzucone. Opis powinien zawierać powód.
Najlepsze praktyki
Typowe wzorce
Wzorzec: przepływ naprawy błędu
def fix_bug(bug_id, description):
task_id = create_task(
title=f"Fix bug {bug_id}",
description=description,
priority="high"
)
# Śledztwo
update_progress(task_id, "Investigating root cause")
root_cause = investigate()
# Naprawa
update_progress(task_id, f"Applying fix: {root_cause}")
apply_fix(root_cause)
# Test
update_progress(task_id, "Testing fix")
run_tests()
# Wdrożenie
update_progress(task_id, "Deploying fix")
deploy()
complete_task(task_id, f"Fixed: {root_cause}")Wzorzec: przepływ badawczy
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")