本文引用的文件
本文件面向LangGraph工作流设计,聚焦“基于Annotation的状态定义机制”,系统阐述:
LangGraph相关代码主要位于后端模块的book-generator目录中,采用“状态定义 + 节点实现 + 控制器路由”的分层组织方式。
graph TB
subgraph "状态定义"
G["graph.ts<br/>GraphState与reducer"]
T["langgraph-types.ts<br/>类型参考"]
U["utils.ts<br/>进度常量"]
end
subgraph "节点实现"
P["plan.node.ts<br/>书籍规划"]
O["outline.node.ts<br/>大纲生成"]
C["content.node.ts<br/>内容生成串行/并行"]
S["stage-manager.ts<br/>线性阶段管理"]
F["fault-tolerance.ts<br/>容错层"]
end
subgraph "控制器与类型"
L["langgraph-controller.ts<br/>API路由"]
B["book-generator.types.ts<br/>业务类型"]
K["book-type-config.ts<br/>规模配置"]
end
G --> P
G --> O
G --> C
P --> L
O --> L
C --> L
S --> C
F --> P
F --> O
F --> C
K --> P
K --> O
K --> C
B --> L
U --> C
图表来源
章节来源
章节来源
LangGraph工作流以GraphState为核心,通过多个节点串联执行,每个节点负责特定阶段的工作,并通过reducer更新状态。控制器负责对外暴露API,协调生成流程。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "langgraph-controller.ts"
participant Plan as "plan.node.ts"
participant Outline as "outline.node.ts"
participant Content as "content.node.ts"
participant Stage as "stage-manager.ts"
participant FT as "fault-tolerance.ts"
Client->>Ctrl : POST /api/book-generator/langgraph/books
Ctrl->>Ctrl : 创建书籍并设置初始状态
Ctrl->>Plan : 调用 planBookNode
Plan-->>Ctrl : 返回 bookPlan 与 genLevel
Ctrl->>Outline : 调用 generateOutlineNode
Outline-->>Ctrl : 返回大纲与进度
Ctrl->>Content : 调用 writeChaptersParallelNode
Content->>Stage : advanceChapter/ regenerateChapter
Content-->>Ctrl : 返回进度/错误
Ctrl-->>Client : 返回生成状态
Note over Plan,FT : 容错包装器贯穿各节点
图表来源
字段默认值与覆盖策略
reducer为undefined时保持原值,避免意外清空
flowchart TD
Start(["状态更新入口"]) --> CheckPrev["检查prev与update"]
CheckPrev --> IsUndefined{"update为undefined?"}
IsUndefined --> |是| KeepPrev["保持原值"]
IsUndefined --> |否| ApplyReducer["应用对应reducer"]
ApplyReducer --> Progress["progress/maxReducer"]
ApplyReducer --> Completed["completedChapters/appendReducer"]
ApplyReducer --> Other["其他字段/覆盖式更新"]
KeepPrev --> End(["返回新状态"])
Progress --> End
Completed --> End
Other --> End
图表来源
章节来源
章节来源
容错:解析失败时降级,不影响后续流程
sequenceDiagram
participant Plan as "plan.node.ts"
participant LLM as "LLM服务"
participant DB as "bookStore"
Plan->>LLM : 发送规划提示词
LLM-->>Plan : 返回规划JSON
Plan->>Plan : 解析并验证genLevel
Plan->>DB : 更新bookAnalysis
Plan-->>Plan : 返回 {progress, genLevel, bookPlan}
图表来源
章节来源
容错:超时与重试包装,失败时标记书籍失败
sequenceDiagram
participant Outline as "outline.node.ts"
participant FT as "fault-tolerance.ts"
participant LLM as "LLM服务"
participant DB as "bookStore"
Outline->>FT : executeNodeWithTimeout
FT->>LLM : 调用LLM带重试
LLM-->>FT : 返回大纲文本
FT-->>Outline : 返回解析后的大纲
Outline->>Outline : 校验章节数范围
Outline->>DB : 写入outlineJson与章节
Outline-->>Outline : 返回 {progress}
图表来源
章节来源
容错:失败章节收集至failedChapters,返回错误信息
flowchart TD
A["查找叶节点"] --> B["构建父节点映射"]
B --> C["构造消息与工具"]
C --> D["AsyncPool并发执行"]
D --> E{"安全防护"}
E --> |预算超限| F["截断内容"]
E --> |字数超限| G["中断并标记"]
F --> H["保存内容并推进阶段"]
G --> H
H --> I["触发音频生成"]
I --> J["更新进度与错误"]
图表来源
章节来源
数据持久化
失败场景下清理下游资源(如音频/视频URL)
stateDiagram-v2
[*] --> idle
idle --> outline_completed : "outline完成"
outline_completed --> content_generating : "开始内容生成"
content_generating --> content_completed : "内容完成"
content_generating --> failed : "失败"
content_completed --> audio_generating : "开始音频生成"
audio_generating --> audio_completed : "音频完成"
audio_generating --> content_completed : "回退到内容"
audio_completed --> video_generating : "开始视频生成"
video_generating --> video_completed : "视频完成"
video_generating --> audio_completed : "回退到音频"
failed --> content_generating : "重新生成"
failed --> audio_generating : "失败重试"
failed --> video_generating : "失败重试"
图表来源
章节来源
自动恢复:在限定次数内重启生成流程
flowchart TD
Start(["节点执行"]) --> Timeout{"是否超时?"}
Timeout --> |是| TimeoutAction["通知超时并降级"]
Timeout --> |否| Retry{"是否AI调用失败?"}
Retry --> |是| RetryLoop["指数退避重试"]
Retry --> |否| Monitor["进度监控"]
Monitor --> Idle{"长时间无响应?"}
Idle --> |是| Recovery["自动恢复"]
Idle --> |否| Done(["完成"])
TimeoutAction --> Done
RetryLoop --> Done
Recovery --> Done
图表来源
章节来源
章节来源
章节来源
外部依赖
容错层:统一的重试、超时、监控与恢复机制
graph LR
GS["GraphState<br/>graph.ts"] --> PN["plan.node.ts"]
GS --> ON["outline.node.ts"]
GS --> CN["content.node.ts"]
PN --> FT["fault-tolerance.ts"]
ON --> FT
CN --> FT
CN --> SM["stage-manager.ts"]
CN --> BTC["book-type-config.ts"]
ON --> BTC
PN --> BTC
LC["langgraph-controller.ts"] --> GS
LC --> PN
LC --> ON
LC --> CN
图表来源
章节来源
章节来源
本设计以Annotation为核心,通过精心设计的reducer与严格的阶段管理,实现了稳定、可观测、可扩展的LangGraph工作流。容错层与安全防护确保了在复杂业务场景下的鲁棒性;并行生成与配额机制提升了性能与资源利用率。通过清晰的API与状态流转,开发者可以便捷地扩展新节点与优化流程。