版本日期:2026-09-09。适用范围:当前仓库 API 实现。
本文中的响应为按实现整理的示例,时间、错误场景和业务 ID 均为示意,不是对任务 b429d8ddce344f2fadac91195aa56d97 的线上查询结果。服务地址请替换为实际部署地址。
| 项目 | 说明 |
|---|---|
| 用途 | 查询投标文件生成任务的 Step1–6 步骤进度 |
| 方法 | GET |
| 路径 | /api/v1/jobs/{request_id}/progress |
| 本次任务路径 | /api/v1/jobs/b429d8ddce344f2fadac91195aa56d97/progress |
| 路径参数 | request_id:提交任务后返回的任务 ID,字符串,必填;不是 txbId |
| Query / Body | 无 |
| 响应格式 | application/json,直接返回对象,没有 code / data 外层包装 |
| 鉴权 | 当前应用代码未要求 token;若部署网关设置鉴权,按网关要求提供 |
请求示例(将 https://api.example.com 替换为实际地址):
curl "https://api.example.com/api/v1/jobs/b429d8ddce344f2fadac91195aa56d97/progress" -H "Accept: application/json"
对接核心规则:/progress 是步骤快照,最终成功或失败必须查询 GET /api/v1/jobs/{request_id} 的 status。HTTP 200 仅表示查询成功,不表示生成成功。
有步骤快照时返回以下字段;无快照时仅返回 status、message,其余字段缺省。
| 字段 | 类型 | 含义 |
|---|---|---|
updated_at |
string | 快照最后更新时间,ISO 8601,UTC,如 2026-09-09T02:30:00+00:00;北京时间需加 8 小时 |
current_step |
integer | 当前或最近完成的步骤编号,1–6 |
total_steps |
integer | 总步骤数,当前固定为 6 |
current_step_name |
string | 步骤名称 |
status |
string | 有快照时为 running 或 completed;无快照时回退为任务状态,见后文 |
message |
string | 展示提示语,不应作为程序判断条件 |
completed_steps |
integer[] | 已执行完成的步骤编号;正在执行的步骤不包含在其中 |
此接口不返回 request_id、txbId、error、resultPath、下载地址或 progress_url。调用方需保存提交时获得的任务 ID。
| 步骤 | current_step_name |
|---|---|
| 1 | Step 1 文档解析及表/函/表格提取 |
| 2 | Step 2 招标需求、评分项、废标项分析 |
| 3 | Step 3 投书大纲生成 |
| 4 | Step 4 章节内容生成与模板填充 |
| 5 | Step 5 覆盖性、风险与完整性审核修复 |
| 6 | Step 6 最终 DOCX 聚合装配 |
HTTP 200,排队时可能返回:
{
"status": "queued",
"message": "任务已排队或尚未开始"
}
后台已启动但尚未写入有效快照时:
{
"status": "processing",
"message": "任务已排队或尚未开始"
}
调用方显示“排队中”或“处理中”并继续轮询;不要强制读取此时不存在的 current_step、completed_steps。
HTTP 200,例如正在执行 Step3:
{
"updated_at": "2026-09-09T02:30:00+00:00",
"current_step": 3,
"total_steps": 6,
"current_step_name": "Step 3 投书大纲生成",
"status": "running",
"message": "Step 3 投书大纲生成 正在处理",
"completed_steps": [1, 2]
}
含义:Step1、Step2 已完成,Step3 正在执行。仍需查询任务状态确认任务没有失败,原因见第 4 节。
HTTP 200,例如 Step3 刚完成、Step4 尚未更新快照:
{
"updated_at": "2026-09-09T02:35:00+00:00",
"current_step": 3,
"total_steps": 6,
"current_step_name": "Step 3 投书大纲生成",
"status": "completed",
"message": "Step 3 投书大纲生成 处理完成",
"completed_steps": [1, 2, 3]
}
这里的 completed 仅表示 Step3 完成,不能停止轮询或提示整个任务完成。
当前实现失败时不会把步骤快照改写为 failed。例如 Step4 执行失败,/progress 仍可能返回 HTTP 200 和以下最后快照:
{
"updated_at": "2026-09-09T02:40:00+00:00",
"current_step": 4,
"total_steps": 6,
"current_step_name": "Step 4 章节内容生成与模板填充",
"status": "running",
"message": "Step 4 章节内容生成与模板填充 正在处理",
"completed_steps": [1, 2, 3]
}
此时查询任务状态接口:
curl "https://api.example.com/api/v1/jobs/b429d8ddce344f2fadac91195aa56d97"
该接口 HTTP 200 响应中的关键字段如下(仅摘录字段,不是完整响应):
{
"request_id": "b429d8ddce344f2fadac91195aa56d97",
"txbId": "TEST-TXB-001",
"status": "failed",
"error": "Step1-6 处理进程异常退出(退出码 1)",
"callback_delivered": true
}
调用方以任务 status=failed 判定失败,停止轮询,展示 error,隐藏下载入口。失败原因可能是“处理超时”、进程异常退出或其他错误文本,不能仅匹配某个固定错误字符串。
callback_delivered=true 只说明结果回调已按 HTTP 状态成功投递,不表示生成成功。回调失败也不改变生成结果;可查看任务的 callback_error。
/progress 可返回 HTTP 200:
{
"status": "failed",
"message": "任务已排队或尚未开始"
}
此处 message 是统一兜底文案,并非真实失败原因。仍需从任务状态接口读取 error。
此时 /progress 甚至可能仍是 Step6 的 completed 快照,而任务状态接口返回 failed。最终结果仍以任务状态为准。
注意:失败回调里的 resultPath="error: ..." 属于回调协议;/progress 不返回该字段,任务状态查询也不自动构造该字段。任务查询中如有 output_path,它只是预定输出路径,不能据此判成功。
步骤全部执行完成后,/progress 返回 HTTP 200:
{
"updated_at": "2026-09-09T03:20:00+00:00",
"current_step": 6,
"total_steps": 6,
"current_step_name": "Step 6 最终 DOCX 聚合装配",
"status": "completed",
"message": "Step 6 最终 DOCX 聚合装配 处理完成",
"completed_steps": [1, 2, 3, 4, 5, 6]
}
再查询任务状态接口,成功时关键字段如下(仅摘录字段,不是完整响应;文件名及路径为虚构示例):
{
"request_id": "b429d8ddce344f2fadac91195aa56d97",
"txbId": "TEST-TXB-001",
"status": "completed",
"output_path": "/srv/proposa/output/api_jobs/b429d8ddce344f2fadac91195aa56d97/示例招标文件.docx",
"final_review_path": "/srv/proposa/output/api_jobs/b429d8ddce344f2fadac91195aa56d97/示例招标文件.docx",
"final_review_url": "https://api.example.com/api/v1/jobs/b429d8ddce344f2fadac91195aa56d97/file",
"callback_delivered": true,
"callback_error": ""
}
只有任务 status=completed 才展示“生成完成”和下载按钮。final_review_path / output_path 是服务器路径,浏览器不能直接打开;通过下载接口获取文件:
curl "https://api.example.com/api/v1/jobs/b429d8ddce344f2fadac91195aa56d97/file" --output "投标文件.docx"
下载成功:HTTP 200,响应为 DOCX 二进制,Content-Type 为 application/vnd.openxmlformats-officedocument.wordprocessingml.document,不是 JSON。
Step6 完成后还有文件检查、发布和回调投递过程;当前实现等回调尝试结束才更新任务终态。因此短暂出现“进度 Step6 completed、任务 processing”时,应继续等待。回调最终失败仍可得到任务 completed,但 callback_delivered=false。
| 请求 | HTTP 状态 | 含义与处理 |
|---|---|---|
/progress、任务查询、下载 |
404 | 任务不存在;核对任务 ID 和服务实例,不应当作生成失败原因 |
下载 /file |
409 | 任务未完成,或最终文件不存在;不可按 DOCX 保存响应 |
| 查询 | 网络异常 / 5xx | 本次查询失败,不等于任务生成失败;提示重试,避免直接把业务任务改为 failed |
404 响应:
{
"detail": "任务不存在"
}
下载 409 响应:
{
"detail": "任务尚未生成可下载文件"
}
任务记录当前保存在 API 进程内存中,服务重启后旧 ID 可能返回 404,即使磁盘文件还在。多实例部署需确保查询访问持有该任务记录的实例。
默认清理中间文件时,会先将末次步骤快照保存在任务内存记录中,再清理中间目录。因此同一进程内,处理中间文件清理后仍可查询末次快照;该快照不会因清理自动变成成功或失败状态。
request_id,与自己的业务 txbId 关联。queued 或 processing 时,同时查询 /progress 更新步骤展示。这是调用建议,服务端没有强制该轮询间隔。failed:停止轮询,展示 error,不提供下载。completed:停止轮询,提供 /file 下载;下载仍需检查 HTTP 状态。判定逻辑示意:
job = GET /api/v1/jobs/{request_id}
如果查询失败:处理 HTTP/网络异常
否则如果 job.status == failed:展示 job.error,结束轮询
否则如果 job.status == completed:展示完成及下载按钮,结束轮询
否则:
progress = GET /api/v1/jobs/{request_id}/progress
若有步骤字段:显示当前步骤和已完成步骤
否则:显示排队中或处理中
等待后继续查询 job
接口没有提供百分比或预计剩余时间。可显示“已完成 2/6 步”;各步骤耗时不同,不宜将步骤比例当作实际耗时百分比。updated_at 仅在步骤开始或结束时更新,长时间不变化本身不能证明失败。
对接验收至少覆盖:排队无步骤字段、步骤 running、中间步骤 completed、失败但进度仍 running、Step6 completed 但任务仍 processing、任务 completed 后下载,以及 404/409。