docs: add image input type filter task
This commit is contained in:
@@ -40,7 +40,7 @@
|
||||
|
||||
当前项目处于:**Phase 6 增强任务推进期**。Phase 2 计费核心已完成到 T-204;Phase 3 已完成 T-301 API Key 鉴权、T-302 生成标题 / 图片接口、T-303 余额查询接口、T-304 充值回调、T-305 扫码充值下单 + 轮询与 T-306 对外 API 安全加固;Phase 4 已完成 T-501 注册 / 登录(allauth)、T-502 API Key 自助管理页、T-503 个人中心 / 记录页、T-504 充值页与 T-505 用户端审核优化;Phase 5 已完成 T-401 运营后台完善、T-402 MVP 完整验收与 T-403 部署 / 运行文档;Phase 6 已完成 T-601「可用别名发现」、T-602「django-admin 中文化第 1-3 层」、T-603「django-admin 字段级中文化」、T-604「中文敏感词本地过滤」、T-605「免邮箱验证策略落地」、T-606「公开首页 + 客户端下载入口」、T-607「桌面端最新版本检查接口」、T-608「新用户注册赠送试用点数(当前 10 点)」、T-609「桌面端版本检查接口增加强制更新标记」、T-610「首页导入模板下载入口」、T-611「用户端品牌名统一为虾皮圈」、T-612「生图同步接口止血」、T-613「抽生成核心 service」、T-614「生图异步任务化接口」与 T-615「旧同步生图接口遥测 / 弃用口径」。生图慢 / 504 / 客户端超时已拆为 T-612~T-615 并完成:T-612 已做同步接口上游硬截止止血,T-613 已抽共享生成 core,T-614 已新增异步提交 / 轮询接口与 DB worker,T-615 已给旧同步 / 新异步提交路径接入结构化日志并形成旧同步接口退出条件。生产侧仍需补真实支付回调到账闭环;邮件服务仅用于后续密码找回/通知等邮件能力,不阻塞注册登录。
|
||||
|
||||
T-616~T-620 与 T-622 也已完成:生图失败自动重试、客户端版本文件校验元数据、多图理解 `vision` 操作与同步接口、单图 / 多图图生图,以及 django-admin 图片生成任务详情页的输入图 / 结果图缩略预览与双击大图查看。T-620 保持旧单图字段兼容,并固定第一张为主图、后续为参考图;T-622 不改接口或账务。生产启用多图理解前仍需在 admin 配置视觉模型、默认别名和计费规则。
|
||||
T-616~T-620 与 T-622 也已完成:生图失败自动重试、客户端版本文件校验元数据、多图理解 `vision` 操作与同步接口、单图 / 多图图生图,以及 django-admin 图片生成任务详情页的输入图 / 结果图缩略预览与双击大图查看。T-620 保持旧单图字段兼容,并固定第一张为主图、后续为参考图;T-622 不改接口或账务。当前可领取 T-623,仅为图片生成任务后台列表增加单图 / 多图筛选。生产启用多图理解前仍需在 admin 配置视觉模型、默认别名和计费规则。
|
||||
|
||||
优先路径:
|
||||
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
| T-619 | 多张图片理解并返回文字 | T-613, T-601, T-306 | 新增独立的多模态图片理解能力,不复用“生成标题”语义。**操作与别名**:在 `ModelAlias.OperationType`、`CallRecord.OperationType` 和别名解析中新增 `vision`;建议首个数据库别名为 `vision-standard`,但不得在接口中暴露具体供应商模型名。`vision` 别名指向的 `AiModel` 及 Provider 必须同时具备 `vision` 与文字输出能力,图片生成 / 编辑专用 Provider 不得误接。**新增接口**:`POST /api/v1/analyze/images`,继承 `ExternalApiView`、使用 API Key 鉴权和生成限流,同步返回 `{text, alias, model_used, points_cost, points_balance, call_id}`;不改变 `/api/v1/generate/title`、`/api/v1/generate/image` 及异步生图接口。**请求结构**:`prompt` 必填,`model` 可选,`images` 为有序列表且至少 1 张;每项必须且只能提供一个 `image_url` 或 `image_base64`,允许 URL/base64 混合。新增 `VISION_MAX_IMAGES=8`、`VISION_MAX_IMAGE_BYTES=10485760`、`VISION_MAX_TOTAL_BYTES=33554432` 三个可配置上限,分别控制单次图片数量、单图解码后字节数和总字节数;超限、空列表、格式错误或同项双来源返回 `400 bad_request`,不扣点、不调上游。**安全时序**:serializer 后先按 T-604 审核 prompt,再下载 URL / 解码 base64;每个 URL 必须复用 T-306 的协议、公网地址、重定向逐跳校验、超时和响应大小保护,不另写弱化下载器。第一版只审核文字 prompt,不声称已做图片内容审核。**Provider**:复用 `apps/ai/providers` 现有 HTTP 适配层,增加向 Chat Completions / Gemini 发送多张图片并保序的兼容能力;不得复制第二套上游调用实现。现有单图标题 / 生图调用签名与行为保持兼容。**计费与留痕**:复用 T-613 共享生成 core 与 billing 的预扣 / 成功确认 / 幂等退点;第一版按 `operation_type=vision + alias` 的默认 `PricingRule` 对一次请求固定扣点,不按图片张数重复扣费,图片数量上限用于控制成本;上游失败必须退点。`CallRecord` 记录 `vision`、别名、实际模型、点数、耗时和结果摘要,不保存输入图片、base64、provider raw 或完整上游响应。**目录与运营配置**:`GET /api/v1/models` 和 portal 可用模型页按 T-601 既有语义列出 active、能力匹配的 `vision` 别名并显示 `requires_image=true`;有定价时返回 `priced`,缺定价时仍返回 `unpriced`,不得改变现有目录兼容行为。代码部署 / migrate 后由运营在 admin 配置支持视觉理解的 `AiModel`、`vision-standard` 默认别名和计费规则,不通过数据迁移写入真实上游配置或密钥。**范围边界**:本任务只做同步文字结果,不做流式输出、异步 vision task、OCR 专用接口、结构化 JSON schema、图片内容审核,也不为 OCR / 商品识别 / 图片对比各建别名;这些用途先由 prompt 表达,只有底层模型或价格确实不同时再增加别名。**文档**:实现时同步 `02-requirements.md`、`04-architecture.md`、`api.md`、`routes.md`、`env.md`、`current-state.md` 和 `progress.md`。**测试**:覆盖单图 / 多图 / 混合来源及顺序、默认 / 指定别名、模型与 Provider 能力拒绝、图片数量与大小限制、SSRF、敏感词先拦截、成功仅扣一次、上游失败仅退一次、调用记录不保存图片 / raw、模型目录安全字段、旧标题 / 生图接口回归;`makemigrations` / `migrate` / `check` / 目标测试 / `init` 通过并在 `../progress.md` 留证据 | DONE |
|
||||
| T-620 | 图生图支持单图 / 多图主图与参考图 | T-613, T-614, T-616, T-619 | 已完成:同步 / 异步图生图支持有序 `images`,旧单图字段继续兼容且禁止混用;服务端固定注入首图主商品、后续参考图规则。新增 `IMAGE_MAX_INPUT_IMAGES` / `IMAGE_MAX_INPUT_IMAGE_BYTES` / `IMAGE_MAX_INPUT_TOTAL_BYTES`,图片 URL 同时受新单图限制与既有 `IMAGE_URL_MAX_BYTES` 的较小值保护。Provider 已验证 Chat 多段、JSON `image_urls` 与 `images_edits` 重复 multipart `image` 的顺序传递;异步任务新增 `ImageGenerationTaskInput` 有序输入表,旧 `input_image` 读取保持兼容。已通过 `check`、迁移一致性、13 条 Provider 测试、序列化器边界校验与 6 条目标 API 测试(同步多图 / URL+base64 混合 / 互斥输入 / 超限 / 异步恢复 / URL 上限);完整 `GenerateApiTests` 曾跑出 53 条且发现并修复 URL 上限回归,远程 MySQL 测试库后续整类重跑超过 5 分钟未完成。此前已使用真实中转站 `gpt-image-2` 对两张图片重复 multipart `image` 调用获得 HTTP 200 与图片结果,确认上游多文件传输契约。详见 `progress.md`。 | DONE |
|
||||
| T-622 | 图片生成任务后台图片缩略预览 | T-614, T-620 | 已完成:django-admin 的 `ImageGenerationTask` 详情页新增输入图 / 结果图缩略画廊;输入按 `ordinal` 标为主图和参考图,兼容历史 `input_image` 单图;成功任务以 `result_url` 展示生成结果。双击缩略图弹出后台 `<dialog>` 大图预览,支持关闭按钮、遮罩和 `Escape`;图片加载失败显示降级提示。未改 `CallRecord`、对外 API、计费、worker、迁移、媒体访问策略或列表页查询。已通过 4 条目标 admin 测试、`check`、迁移一致性、静态资源发现和 `init.ps1`。 | DONE |
|
||||
| T-623 | 图片生成任务单图 / 多图筛选 | T-614, T-620 | 在 django-admin 的 `ImageGenerationTask` **列表页右侧过滤器**新增“输入图片类型”:`单图生图` 与 `多图生图`。**判定口径**:有且仅有 1 条 `ImageGenerationTaskInput` 为单图;有 2 条及以上为多图;没有子输入但历史 `input_image` 非空也归单图;无输入图的文生图 / 无输入异常任务不归入任一选项。**实现约束**:使用 `SimpleListFilter` 和数据库聚合计数完成筛选,不在 Python 遍历任务,不改模型、迁移、任务状态、计费、API、worker、媒体文件或详情页缩略图;筛选可与既有状态 / 日期等右侧过滤器叠加,结果不得重复。**测试**:覆盖新单图、历史 `input_image` 单图、多图、无输入任务排除、与状态过滤叠加及 admin 未登录 / 非 staff 的既有权限;`check`、目标 admin 测试与 `init` 通过并在 `progress.md` 留证据。 | TODO |
|
||||
|
||||
## 里程碑
|
||||
|
||||
@@ -121,6 +122,7 @@
|
||||
- M15:多张图片理解并返回文字(T-619)。
|
||||
- M16:图生图支持单图 / 多图主图与参考图(T-620)。
|
||||
- M17:图片生成任务后台图片缩略预览(T-622)。
|
||||
- M18:图片生成任务单图 / 多图筛选(T-623)。
|
||||
|
||||
## 待办池(Backlog)
|
||||
|
||||
|
||||
@@ -76,9 +76,9 @@
|
||||
- 已完成:T-001 初始化 Django + DRF 项目骨架;T-002 建立 apps 目录、自定义 User 与配置;T-003 接通 django-admin 与最小测试;T-004 Phase 0 骨架审核修补;T-101 Provider 适配器层 + 移植 cmbot 调用;T-102 AiModel + ModelAlias 模型 + 别名解析;T-103 配置变更审计;T-104 跑通一次录制标题生成;T-105 Phase 1 AI 层审核修补;T-201 User / UserWallet / ApiKey / PointsLedger / CallRecord 模型;T-202 PricingRule / ExchangeRate 模型 + 计费计算;T-203 并发安全扣点 / 退点;T-204 Phase 2 计费核心审核加固;T-301 API Key 鉴权;T-302 生成标题 / 图片接口;T-303 余额查询接口;T-304 充值回调;T-305 扫码充值下单 + 轮询;T-306 Phase 3 对外 API 安全加固;T-501 注册 / 登录(allauth);T-502 API Key 自助管理页;T-503 个人中心 / 记录页;T-504 充值页(扫码 + 轮询到账);T-505 Phase 4 用户端审核优化;T-401 运营后台完善;T-402 完整验收 MVP;T-403 部署 / 运行文档;T-601 可用别名发现;T-602 django-admin 中文化(第 1-3 层);T-603 django-admin 中文化(第 4 层·字段级);T-604 中文敏感词本地过滤;T-605 免邮箱验证策略落地;T-606 公开首页 + 客户端下载入口;T-607 桌面端最新版本检查接口;T-608 新用户注册赠送试用点数(当前 10 点);T-609 桌面端版本检查接口增加强制更新标记;T-610 首页导入模板下载入口;T-611 用户端品牌名统一为虾皮圈;T-612 生图同步接口止血(上游硬截止 + 长请求池校准);T-613 抽生成核心 service(计费+审核+上游共享 core);T-614 生图异步任务化接口(提交+轮询,新增不动旧接口);T-615 旧同步生图接口用量遥测 + 弃用口径;T-616 生图失败自动重试 2 次;T-617 桌面端版本检查接口增加文件大小字段;T-618 客户端发布版本后台必填文件校验元数据。
|
||||
- 已完成补充:T-619 多张图片理解并返回文字;T-620 图生图支持单图 / 多图主图与参考图;T-622 图片生成任务后台图片缩略预览。
|
||||
- 正在进行:无。
|
||||
- 待开始:任务看板当前没有已登记的 TODO;T-621 注册赠点运营后台配置继续留在 Backlog。真实支付回调到账闭环、客户端发布、生产多图理解模型配置和线上旧同步接口用量观察仍可继续拆任务。
|
||||
- 待开始:T-623 图片生成任务单图 / 多图筛选;T-621 注册赠点运营后台配置继续留在 Backlog。真实支付回调到账闭环、客户端发布、生产多图理解模型配置和线上旧同步接口用量观察仍可继续拆任务。
|
||||
- 当前 blocker:支付商户真实密钥/证书与生产 SDK 依赖仍待提供;微信回调到账闭环仍需真实支付验收;真实 AI 标题生成已在线上跑通,图片生成慢 / 504 / 客户端超时风险已拆为 T-612~T-616 并完成工程侧处理。
|
||||
- 下一个可领取任务:暂无;需先将新的工作项登记为任务后再领取。T-621 保留在 Backlog,具体范围见 [`06-tasks.md`](06-tasks.md)。
|
||||
- 下一个可领取任务:T-623 图片生成任务单图 / 多图筛选;具体范围与验收以 [`06-tasks.md`](06-tasks.md) 为准。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
|
||||
@@ -2039,3 +2039,9 @@
|
||||
- 边界:未修改模型、迁移、`CallRecord`、API 契约、计费、worker 或媒体访问策略;任务列表不渲染缩略图。新增静态 CSS / JS 仅由任务详情模板加载。
|
||||
- 验证:`C:/Python312/python.exe manage.py check` 通过;`manage.py test apps.api.tests.ImageGenerationTaskAdminTests --keepdb --noinput --verbosity 2` 通过,4 tests OK(多图+结果、历史单图、无图片任务、非 staff);`makemigrations --check --dry-run` 无待生成迁移;`findstatic` 找到 CSS / JS;`./init.ps1` 通过;`git diff --check` 通过。目标测试仅有既有 allauth MySQL 条件唯一约束 `models.W036` 警告。
|
||||
- 线上部署:当前未提交的 T-622 工作区代码已同步到 `185.216.248.75:/www/wwwroot/cmhub`,同步保留 `.env`、媒体、静态文件与部署配置,并创建部署前配置/静态文件备份。线上 `manage.py check` 通过,`collectstatic --noinput` 新复制 7 个静态文件,`cmhub-web` 重启后为 `active`;`cmhub-generate` 未重启,未影响 66 个生图 worker。已确认任务详情模板及 `staticfiles/api/admin/image-task-gallery.css`、`image-task-gallery.js` 存在。
|
||||
|
||||
## 2026-07-20 文档登记:T-623 图片生成任务单图 / 多图筛选
|
||||
|
||||
- 状态:TODO,仅登记任务,未改代码、数据库、接口、计费、worker 或线上服务。
|
||||
- 范围:在 django-admin 图片生成任务列表右侧增加“输入图片类型”筛选,按已有子输入图数量识别单图 / 多图,并兼容历史 `input_image` 单图任务;无输入图任务不归入这两类。
|
||||
- 边界:使用数据库聚合筛选,不在 Python 遍历任务;不改任务详情缩略图、媒体文件、模型、迁移或对外接口。
|
||||
|
||||
Reference in New Issue
Block a user