research(规划 → 多源网络搜索 → 综合)和 video(模型生成)以后台任务的形式运行:你先将其入队,立即获得一个 job_id,然后轮询直到任务完成。
生命周期
- 入队 —
POST /api/v1/research或/api/v1/video会返回202,并带有{ id, job_id, status: "queued", poll_url }。 - 轮询 —
GET /api/v1/jobs/{job_id}返回当前status:queued→active→completed(或failed)。 - 读取结果 — 当
status === "completed"时,result中保存着类型化的负载数据。
SDK 用法
waitForJob() 会为你执行轮询循环,并支持可选的 onProgress 回调和 AbortSignal。
theo.video() + waitForJob<VideoJobResult>()。
轮询间隔与限制
- 默认轮询间隔为 2 秒;
waitForJob默认在 5 分钟后放弃(maxWaitMs),并抛出TheoTimeoutError。对于较长的视频渲染,可以调高maxWaitMs。 - 不要以快于约 1 秒的频率轮询——这只会消耗速率限制额度,并不会让任务更快完成。
取消
传入一个AbortSignal。当它触发时,waitForJob 会停止轮询,并以 TheoCancelledError 拒绝(它不会取消服务器端的任务——只是让你的客户端停止等待)。
结果模式
result 通过 job<T>() / waitForJob<T>() 上的泛型进行类型化。这些结构与 REST 负载一致(参见获取任务状态):
ResearchJobResult—{ report, sources: { title, url }[], queries, sourceCount }VideoJobResult—{ videoUrl, model, engine, durationMs }ImageJobResult—{ imageUrl, model, engine }DocumentJobResult—{ title, format, downloadUrl, sizeBytes }任何model/engine字段都会以 Theo 品牌呈现——原始的上游标识符永远不会出现。
成本与用量
任务结果目前尚不携带按任务计算的cost_cents 字段。要归因 research/video 任务的支出,请查看聚合的用量报告(theo.usage()),其中包含覆盖 research 和 video 的 by_mode 明细。
失败
当status === "failed" 时,result 为 null,error 中保存着失败原因字符串。入队调用本身也可能在任务队列暂时不可用时返回 503 queue_unavailable——请稍后重试。