MG-04-017 API调用日志接口
2026-10-16 用户确认生成记录与 API 记录分开;随后要求 API 记录承接旧 new-api-new-oceanway 常规日志内容,保持简单。来源与适配见任务,不移植旧客户/令牌/Quota/钱包、路由数据库或亲和度。
记录语义
/records为生成记录:同一逻辑请求一行,视频/图片与同步/异步可筛选;Attempt、采购费用、阶段和结果只在生成详情解释。/logs为 API 记录:每次提交或失败调用一行。服务接口/v1/*、ModelArk 和管理员/admin/v1/video-tests纳入采集;成功的查询/下载、后台配置读取、健康检查和日志查询不刷入记录。- HTTP 200/202 只表示本次接口响应;异步最终生成结果查看关联生成。失败可无生成任务。幂等重放可有多条调用记录,但关联同一生成,不重复创建生成/收费。
- 记录时间、方法、路由模板、状态码、耗时、安全错误码、服务器调用追踪 ID 及可核实的生成关联。不存在匹配路由时只记录安全模板或
[unmatched];不记录原始 URL/query/body/header、提示词、凭据、IP、素材或签名链接。 - 详细错误走现有安全错误码;旧手写响应没有显式安全码时按 HTTP 状态回退(401 为 UNAUTHORIZED、403 为 FORBIDDEN、其他 HTTP_NNN),不读取/复制正文。
- 基于持久任务身份关联后,列表补充当前模型/渠道、最后上游 ID 与关联生成的执行记录采购金额。采购按币种用数据库定点汇总;任一 Attempt 实际金额缺失则该币种待核对;不以预计值填充,不跨币种相加。执行金额不是已核账 Provider 扣费,也不是客户费用;历史改名显示当前渠道名称。
- 采集自升级开始,无旧 HTTP 历史回填。永久保留,新增 migration 42;回滚代码保留表/数据,不执行删除式 down。历史旧库迁移另行按既有迁移方案,不因复用页面内容自动连接旧库。
管理接口
GET /admin/v1/api-logs(兼容尾斜线)受现有独立管理员会话/管理 Bearer 保护;服务 Key 或未认证调用不得读取。浏览器桥接 GET /backend/api-logs,沿用独立 Cookie 会话与同源检查,不透出管理凭据。
过滤:
| 参数 | 语义 |
|---|---|
| model | 标准调用名精确匹配,最长200字符 |
| channel_id | 曾执行渠道 UUID,匹配任一 Attempt |
| status | success(HTTP <400)或 error(HTTP >=400) |
| query | 调用追踪/生成/上游 ID 或安全错误码精确匹配,最长200字符 |
| generation_id | 生成详情跳转的精确关联条件 |
| created_after / created_before | RFC3339,起始包含、结束不包含 |
| limit | 1–200,默认50 |
| cursor | 不透明稳定游标,与过滤条件绑定;更改筛选清空 |
未知/重复过滤项、非法类型、错误时间区间和跨筛选游标返回400。返回 {data: [...], next_cursor?: string},按 (started_at,id) 倒序,服务端过滤与有界分页。每条含 id/trace_id/started_at/method/route/scope/status_code/duration_ms/error_code?/generation_id?/media_type?/execution_mode?/model?/channels?/upstream_request_id?/costs。costs 为 {amount: string|null,currency:string}[]。没有可信关联的字段保持空,不猜测模型、费用或生成。
HTTP 执行完成后单独限时1秒写入 PostgreSQL,不进入生成事务;取消的请求也尝试写入。写入失败只输出含追踪 ID 的安全错误信号,不改原 HTTP/生成结果、不再提交 Provider;该情况下可能缺日志。进程强制中止、无法获得服务器追踪 ID 的极早失败也不保证留痕,此功能不是付费执行正确性的事实源。
旧项目只读迁入(MG-HISTORY-01)
用户明确授权将旧生成和 API 历史迁入。旧记录和新记录共用列表及稳定时间游标,但只写入 migration 43 的 historical_records/historical_outputs/historical_imports;与可执行 Request/Task/Attempt/Outbox、凭据和账务表没有写入关系。历史未完成、提交未知和失败状态也不恢复执行,UI 不轮询、不提供复制后重提入口。
旧任务映射为异步生成;只有来源明确标为图片的消费/错误日志映射为同步生成,纯文本消费只保留 API 日志。所有 API 日志类型(含退款、管理、登录)保留原类型。关联按来源用户与原 request/task/upstream ID 的唯一匹配建立,存在歧义则不猜测。新稳定 UUID 与来源表/主键永久对应。
历史 API 记录标记 history:true,包含 log_type_name/legacy_error/history_cost/legacy/original_content;HTTP 状态未提供时为 0,UI 明示未知,不能伪造 200。历史错误筛选取旧错误类型。费用为字符串原始 quota 和计价字段,退款独立保留,禁止换算成本网关采购金额或重新结算。历史渠道快照经受保护的 GET /admin/v1/history/channels(浏览器 /backend/history/channels)提供,不创建可调度渠道。
生成详情保留原始秒级创建/提交/开始/结束时间、费用、状态与 ID。结果引用只存受限对象键/大小/校验和,不向浏览器返回旧签名链接;沿用管理员 /admin/v1/content/out_<UUID> 的 GET/HEAD/Range 代理。原生成状态与当前对象可读性分开;403/缺失/大小不符不会重提生成。原项目早已缺少的同步输出不猜测补齐。
操作入口为 scripts/history-curate.py 与 cmd/historyimport,先只读 repeatable-read 加密备份,再白名单投影、显式目标库演练/备份与事务导入;稳定来源键 UPSERT 可重复运行。完整原始快照保存在源码外加密存储,展示投影移除凭据、签名 URL、二进制素材,并标识截断。媒体检查只执行源对象 HEAD;程序无 Provider 创建接口。操作记录、来源版本、数量、hash、验收与回滚见 任务。回退程序保留三张历史表和原始备份,不删除式 down、不重放历史调用。
仍可读取的原结果通过 historyimport -preserve-media 原样下载至源码外 GATEWAY_HISTORY_RESULT_DIR(0700/0600),按稳定输出UUID命名,大小/源SHA(提供时)及本地SHA256验证后原子发布文件与清单,状态为 preserved。管理员内容入口优先提供本地保全结果,保持HEAD/Range;无需旧存储在线。再次运行只核对已有保全文件,不重复下载/生成。复制失败与源缺失分别报告,文件和来源记录均不自动删除。
2026-10-16 用户确认生成记录就是任务记录。UI统一使用“任务 ID”,优先已有任务ID,旧同步历史无任务ID时显示原请求ID;稳定归档UUID仍用于内部查询路径,不再作为另一项并列业务身份展示。API记录提供“查看任务详情”,调用追踪ID只解释单次HTTP调用。原始ID与现行wire字段保留兼容,不改执行身份或历史关联。
同一来源身份+原request_id的同步图片多次调用只形成一个任务,完整API/错误/扣费/退款事件保留;首个消费事件的原额度在任务页展示,不以归并重算账单。旧内部索引作为只读别名保留并定位唯一任务,不能删除原调用或跨来源身份合并。scripts/history-consolidate.py消费同一快照的私有来源身份哈希投影,重复导入仍保留全部原始行与别名。