3.6 KiB
Design Doc: PocketFlow FastAPI Background Job with SSE Progress
Please DON'T remove notes for AI
Requirements
Notes for AI: Keep it simple and clear. If the requirements are abstract, write concrete user stories
User Story: As a user, I want to submit an article topic via a web API and receive real-time progress updates while the article is being generated in the background, so I can see the workflow progress without blocking the UI.
Core Requirements:
- Submit article topic via REST API endpoint
- Start background job for article generation workflow
- Receive real-time progress updates via Server-Sent Events (SSE)
- Get final article result when workflow completes
- Handle multiple concurrent requests
Technical Requirements:
- FastAPI web server with REST endpoints
- Background task processing using asyncio
- Server-Sent Events for progress streaming
- Simple web interface to test the functionality
Flow Design
Notes for AI:
- Consider the design patterns of agent, map-reduce, rag, and workflow. Apply them if they fit.
- Present a concise, high-level description of the workflow.
Applicable Design Pattern:
Workflow Pattern: Sequential processing of article generation steps with progress reporting at each stage.
Flow High-level Design:
- Generate Outline Node: Creates a structured outline for the article topic
- Write Content Node: Writes content for each section in the outline
- Apply Style Node: Applies conversational styling to the final article
Each node puts progress updates into an asyncio.Queue for SSE streaming.
flowchart LR
outline[Generate Outline] --> content[Write Content]
content --> styling[Apply Style]
Utility Functions
Notes for AI:
- Understand the utility function definition thoroughly by reviewing the doc.
- Include only the necessary utility functions, based on nodes in the flow.
- Call LLM (
utils/call_llm.py)- Input: prompt (str)
- Output: response (str)
- Used by all workflow nodes for LLM tasks
Node Design
Shared Store
Notes for AI: Try to minimize data redundancy
The shared store structure is organized as follows:
shared = {
"topic": "user-provided-topic",
"sse_queue": asyncio.Queue(), # For sending SSE updates
"sections": ["section1", "section2", "section3"],
"draft": "combined-section-content",
"final_article": "styled-final-article"
}
Node Steps
Notes for AI: Carefully decide whether to use Batch/Async Node/Flow.
-
Generate Outline Node
- Purpose: Create a structured outline with 3 main sections using YAML output
- Type: Regular Node (synchronous LLM call)
- Steps:
- prep: Read "topic" from shared store
- exec: Call LLM to generate YAML outline, parse and validate structure
- post: Write "sections" to shared store, put progress update in sse_queue
-
Write Content Node
- Purpose: Generate concise content for each outline section
- Type: BatchNode (processes each section independently)
- Steps:
- prep: Read "sections" from shared store (returns list of sections)
- exec: For one section, call LLM to write 100-word content
- post: Combine all section content into "draft", put progress update in sse_queue
-
Apply Style Node
- Purpose: Apply conversational, engaging style to the combined content
- Type: Regular Node (single LLM call for styling)
- Steps:
- prep: Read "draft" from shared store
- exec: Call LLM to rewrite in conversational style
- post: Write "final_article" to shared store, put completion update in sse_queue