Skip to main content

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 complete

Implementacja

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
                ↘ cancelled

Pending

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")

Następne kroki