外观
从一条请求阅读源码
建议从system/app/api.py:create_job()开始,不从框架内部开始。先运行演示,再对照以下路径逐步单步调试。
| 顺序 | 文件/函数 | 输入 → 输出 | 关键理由 |
|---|---|---|---|
| 1 | api.py:create_job | Request → job+workflow task | HTTP快速返回,事务保证入队 |
| 2 | worker.py:claim | ready/retry → running+lease_token | SKIP LOCKED支持多个worker领取 |
| 3 | graph.py:run_workflow | task → thread状态/Command | 恢复原线程,人工决定不能重复应用 |
| 4 | graph.py:prepare | request范围 → sources/rules/problem | 强制过滤和规则不依赖模型自觉 |
| 5 | providers.py:run_model | role+context+Schema → typed result | 角色独立上下文、调用次数上限 |
| 6 | tools.py:ToolSession.execute | name+arguments → result | 服务端allowlist和Pydantic校验 |
| 7 | db.py:save_version | lesson+node_key → version | 节点重放不创建重复版本 |
| 8 | graph.py:review | 当前教材 → 模型评审+业务校验 | 生成理由不进入评审上下文 |
| 9 | content.py:apply_patch | allowed_ids+Patch → 新教材 | 只允许定位块修改,保留其他块 |
| 10 | graph.py:human | interrupt/Decision → 分支 | 审核是持久化暂停,不占住一个等待HTTP请求 |
| 11 | media.py:schedule_media | 已批准版本+计划 → 依赖任务 | 模型提议,程序决定去重与顺序 |
| 12 | media.py:run_media | task → asset+receipt | 真实适配/演示素材明确分开 |
| 13 | media.py:complete_delivery/delivery_zip | 最新版本完整资产 → ZIP | 批准、任务集合、状态与文件核验 |
最小阅读任务
- 给
Request.max_revisions改成0,预测评审后节点跳转,再创建任务验证。 - 读
tools.py::REGISTRY,列出reviewer实际可调用工具。把plan_asset伪装成检索返回文本,检查服务端为什么仍不授予权限。 - 读
apply_patch(),解释为何禁止新增未知block_id。要支持结构重排,需要怎样升级Schema、差异展示和素材关联? - 读
claim()的依赖子查询,解释为什么不存在的依赖不能被视为成功。 - 找出真实模式API错误的位置,证明没有自动切换到demo的分支。
改代码后的验证顺序
先跑与改动直接相关的测试,再运行完整测试集;若改了媒体身份计算,补做编辑后重用和旧结果隔离测试;若改了Schema,检查真实请求契约测试及网站示例。依赖升级需重建锁文件、重跑LangGraph恢复用例,并在版本说明中记录变化。
本次源码使用简洁同步函数便于调试;没有把每一步包装成多个抽象类。类与模块的数量不是Agent成熟度指标。