ChatDev 2.0 如何上传文件附件、在执行中引用并下载 Session 产物?
【免费下载链接】ChatDevChatDev 2.0: Dev All through LLM-powered Multi-Agent Collaboration项目地址: https://gitcode.com/GitHub_Trending/ch/ChatDev
在 ChatDev 2.0(DevAll)中运行工作流时,常见的任务链路是:把数据文件、图片、需求文档等作为**附件(Attachment)上传,让 Agent 节点在执行中引用它们;运行结束后,把节点生成的工件(Artifact)**或整个 Session 产物下载回来。界面操作由 Web UI 完成,自动化场景则走 REST/WS 接口。本文基于仓库内的附件与工件 API 指南与Web UI 快速入门指南,给出这两条路径的完整操作方式和验证方法。
前提条件:前后端服务已启动,后端为uv run python server_main.py,前端为npm run dev,浏览器访问http://localhost:5173进入 Web UI(以上启动方式来自 Web UI 指南的故障排查表)。
在 Web UI 中上传附件并启动工作流
主操作在Launch View(启动页):
- 选择工作流:从左侧列表选择
yaml_instance/目录下的 YAML 文件。 - 上传附件(可选):点击输入框旁的上传按钮添加文件(文档示例为 CSV 数据、图片等)。也可以直接把文件拖拽进输入区或在输入框中粘贴文件(前端 LaunchView.vue 实现了按钮、拖拽、粘贴三种入口)。上传成功后按钮旁会显示已上传数量,悬停可见文件列表,单个文件可点
×移除。 - 输入任务提示(Task Prompt):在文本框中输入指导工作流执行的提示词。
- 点击 Launch:启动执行。
两个界面约束需要注意(见 LaunchView.vue 的实现):
- 上传按钮要求 WebSocket 已连接且 Session 已创建,否则按钮处于禁用态;
- 工作流正在执行时,只有在状态为
Waiting for input...(即human节点等待人工输入)时才允许上传附件;其余执行阶段上传入口不可用。
点击 Launch 后,前端把已上传文件的attachmentId列表放入执行请求的attachments字段。对应后端接口为POST /api/workflow/execute,请求体包含yaml_file、task_prompt、session_id、attachments(见 models.py 的WorkflowRequest与 execute.py)。根据 API 文档,attachments与task_prompt需要同时提供——即便你只是想上传文件,也要带一个非空的task_prompt。
在 human 节点交互中追加附件
当工作流执行到human节点时,界面会暂停并显示输入提示。此时输入框旁的上传按钮同样可用:填写审阅意见或操作指令、上传附件后提交,即可继续执行。前端提交的是 WebSockethuman_input消息,其中data.attachments为附件 ID 数组,消息内容中会列出附件名称以便核对(LaunchView.vue)。这与 REST 路径的规则一致:human_input中引用附件时也必须带task_prompt文本。
附件在执行中如何被引用
上传不是“存个文件”就结束。按附件 API 文档与运行服务实现,文件的生命周期是:
- 上传落盘:文件写入
WareHouse/<session>/code_workspace/attachments/,并在attachments_manifest.json中记录source、workspace_path、storage等字段(code_workspace即 Python 节点共享目录)。 - 注入任务输入:启动执行时,WorkflowRunService 用
build_attachment_blocks把attachment_id解析为消息块(按 MIME 推断 image/audio/video/file 类型),与task_prompt一起构建为初始任务输入交给图执行器。 - 运行期注册新文件:Python 节点或工具可调用
AttachmentStore.register_file()把 workspace 中新生成的文件注册为附件;WorkspaceArtifactHook会将其同步到工件事件流,前端输出面板实时可见。 - 保留策略:默认保留所有附件,便于运行结束后下载。若希望自动清理,设置环境变量
MAC_AUTO_CLEAN_ATTACHMENTS=1,它只在 Session 完成后删除attachments/目录。
下载 Session 产物:界面按钮与 API
方式一:Web UI 的 Download 按钮
执行完成后,点击右侧输出面板的Download按钮,下载完整的 Session 压缩包,包含context.json、附件、日志等。输出面板在执行期间也会实时展示节点生成的工件(与执行日志、节点输出共用同一面板)。
方式二:REST 接口逐项获取
适合 CLI 或自动化脚本,接口见 artifacts.py 与 sessions.py:
1. 实时获取工件事件(长轮询):
# wait_seconds、after、include_mime、include_ext、max_size、limit 均为可选 Query 参数 # 例如只关心 json/png 文件: curl "http://localhost:8000/api/sessions/<session_id>/artifact-events?include_ext=png,json&limit=10"响应含events[]、next_cursor、has_more、timed_out。每条事件带artifact_id、attachment_id、node_id、path、size、mime、hash、timestamp(文档示例):
{ "artifact_id": "art_123", "attachment_id": "att_456", "node_id": "python_runner", "path": "code_workspace/result.json", "size": 2048, "mime": "application/json", "hash": "sha256:...", "timestamp": 1732699900 }WebSocket 会镜像该事件(类型artifact_created),前端即靠它刷新附件列表。
2. 下载单个工件:
# meta:仅元数据;stream:返回文件内容,download=true 时附带 Content-Disposition curl "http://localhost:8000/api/sessions/<session_id>/artifacts/<artifact_id>?mode=stream&download=true"3. 打包下载整个 Session:
curl -OJ "http://localhost:8000/api/sessions/<session_id>/download"该接口把WareHouse/<session>/打包为 zip 一次性下载,不会删除服务器上的原文件;如需归档或清空,需要部署者另行用 cron/job 策略处理。
验证与故障排查
- 上传是否成功:
POST /api/uploads/{session_id}成功时返回attachment_id、文件名、MIME 与大小(文档示例响应含att_bxabcd,实际值每次不同)。拿到 ID 后可用GET /api/uploads/{session_id}列举该 Session 的全部附件元数据核对。 - 工件事件是否到达:确认 WebSocket 已连接;若断开,可在 REST 事件接口中用
after游标重拉。 - 下载链接 404:检查
session_id拼写(仅允许字母、数字、-、_),并确认 Session 目录未被清理。
附件 API 文档给出的常见问题表:
| 问题 | 排查步骤 |
|---|---|
| 上传 413 Payload Too Large | 调整反向代理或 FastAPIclient_max_size,确认磁盘配额 |
| 下载链接 404 | 确认session_id拼写(仅允许字母/数字/_-),检查 Session 是否已被清理 |
| 工件事件缺失 | 确认 WebSocket 是否连接,或在 REST 事件接口中使用after游标重拉 |
| 附件未在 Python 节点可见 | 检查code_workspace/attachments/是否被清理、或_context['python_workspace_root']是否正确 |
关于大小限制:后端未硬编码附件大小上限,需要在反向代理设置client_max_body_size、max_request_body_size,或在自定义分支的AttachmentService.save_upload_file中添加校验。文件类型基于 MIME 推断消息块类型,可结合事件接口的include_mime过滤。生产部署还应在校验层确认调用者身份,避免越权下载——附件 API 的权限边界依赖 Session ID。
两条路径怎么选
界面路径适合日常使用:上传、Launch、human 节点追加、Download 按钮都已完成接口对接,你不需要记忆任何 URL。API 路径适合两类场景:一是脚本化批量运行,运行结束后调用/download拉取 zip,或结合artifact-events的include_ext只取特定文件;二是自定义前端,按文档建议用artifact-events长轮询或 WebSocket 实时刷新附件列表,并在节点成功后提供“下载全部”入口。文档同时说明,一般场景下前端会自行处理附件/工件交互,直接调用 API 属于高级用法。
【免费下载链接】ChatDevChatDev 2.0: Dev All through LLM-powered Multi-Agent Collaboration项目地址: https://gitcode.com/GitHub_Trending/ch/ChatDev
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考