ai-chatbot/instrumentation.ts
134 0907aaff67 fix(agent): make detail replacement results survive page and server restarts
详情替换原来把整批生图挂在浏览器保持的对话流上,切换标签页、断网或连接中断后
结果就再也回不来,前端还会继续播放按时间推算的 96% 假进度。

现在改为服务器端后台批次:提交时先落任务,再按参考图逐张生成并把每张结果写进
项目,页面刷新、切页或服务重启后都能按任务状态恢复,不再依赖前端连接。

- 新增 /api/agents/detail-replacement/batches(提交/查询、幂等去重、重试上限)
- 前端只在服务端确认批次后显示处理中,卡片显示排队/生成/完成/失败真实状态
- 去掉假进度动画;没有产品输入图时提交前直接拦截
- 服务重启后自动恢复未完成批次,长批次不再被通用 30 分钟清理误判
- 单张失败只落到该卡片并继续后续图片,已完成的图片不重复生成和扣费
- 详情替换默认模型由持续 404 的 gpt-image-2.5-flare 改回 gpt-image-2.5
2026-09-26 02:39:11 +08:00

19 lines
744 B
TypeScript

import { registerOTel } from "@vercel/otel";
export function register() {
registerOTel({ serviceName: "ai-chatbot" });
if (process.env.NEXT_RUNTIME !== "nodejs") return;
const globalState = globalThis as typeof globalThis & { detailReplacementRecoveryStarted?: boolean };
if (globalState.detailReplacementRecoveryStarted) return;
globalState.detailReplacementRecoveryStarted = true;
const recover = () => {
void import("@/lib/canvas/image-task-queue")
.then(({ resumeDetailReplacementBatchTasks }) => resumeDetailReplacementBatchTasks())
.catch((error) => console.error("[Detail Replacement Batch] Recovery failed", error));
};
setTimeout(recover, 5000).unref?.();
setInterval(recover, 60_000).unref?.();
}