fix: 放开 extra_body 的 resolution 并配置文生图尺寸 #64

Closed
opened 2026-08-26 08:55:42 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷(Provider 配置 + 核心域校验)
  • 所属 Epic:#3
  • 所属 MVP / 版本:#35 / MVP-2
  • 阶段:待实施

依赖与并行

  • 前置工单:#62(已验收关闭)
  • 是否允许与前置工单并行:是
  • 原因:本工单不修改任何超时值。与 #63(待验收)也无冲突,两者改动文件不重叠。

子项目影响

  • 仅影响的子项目 / 交付单元:internal/core(provider 校验)、admin(表单校验)、provider_models 配置数据
  • 是否跨子项目:是(核心域与管理端各有一份同样的白名单,必须同步修改)
  • 是否修改共享接口或契约:否;不改表结构、不改请求协议,只放开一个厂商参数键
  • 各子项目需要执行的验证:go test ./internal/core/provider/... ./admin/...,以及一次真实文生图

原始需求

  • 来源:用户对话
  • 提出时间:2026-08-26
  • 关键原话或脱敏摘要:用户询问"为什么文生图时间这么久",追问 cmhub 的下载方式,比对源码后确认差异;随后要求"只填 resolution"。首次实施因白名单拒绝而失败,用户选择方案 A——回滚后改为需要改代码的工单。

要解决什么

现状

chorus 对 /v1/images/generations 不发送任何尺寸参数,输出尺寸完全由上游默认值决定(实测均为 1536×1024),chorus 对此没有控制权。上游若改默认值,chorus 的输出会无声跟着变。

cmhub 对同一端点发送 resolution 与 aspect_ratio(apps/ai/providers/openai_compatible.py:337)。经对照请求验证,该中转站接受 resolution / aspect_ratio,不认 size——之前"忽略 size"的现象是参数名不对,不是上游忽略。

首次实施失败:extra_body 白名单拒绝 resolution

2026-08-26 09:35 把 provider_models.id=4 的 extra_body 设为 {"resolution": "1K"} 后,generation 18 立即失败:

error_code: upstream_unknown   retryable: false   latency_ms: 2

2 毫秒,没有发出任何网络请求。 原因是 internal/core/provider/openai.go:349 的白名单不含 resolution:

allowed := map[string]bool{"temperature": true, "max_tokens": true, "size": true, "quality": true}

parseExtraBody 返回 ErrInvalidConfig → NewOpenAI 失败 → worker 的 factoryErr 分支 → 终态 upstream_unknown。

原工单"无需改代码"的判断是错的:当时只看了 mergeExtra 的覆盖行为,没看它上游的 parseExtraBody 校验。白名单按 OpenAI 官方参数命名(size / quality),与该中转站的 resolution / aspect_ratio 体系对不上。

配置已于同日回滚为 {},文生图恢复正常。

附带确认

generation 18 的 attempts 记录中 error_code=upstream_unknown、retryable=false、latency_ms=2 三者自洽,未被终态码覆盖,证明 #63 的修复在真实运行中生效。

做什么 / 不做什么

  • 做:把 resolution 加入 extra_body 白名单(核心域与管理端两处),补测试,然后配置 provider_models.id=4 并验证。
  • 不做:
    • 不放开 aspect_ratio。沿用先前决定:上游默认的 3:2 横构图对现有地图类提示词可能更合适,强制 1:1 有变差风险。将来需要时用同一机制追加。
    • 不放开任何协议或凭据字段。model / messages / n / response_format / authorization 必须继续被拒绝,这是白名单存在的理由。
    • 不改白名单的结构(不做按 provider 配置的动态白名单),只增加一个键。
    • 不修改 provider_models.id=5(其 size 对 edits 端点正确)。
    • 不修改超时值、response_format 或任何 Go 协议实现。

已确认方案

代码改动

白名单在两处重复定义,必须同步修改,否则管理端能存进去、运行时却拒绝(正是本次失败的形态):

位置 作用
internal/core/provider/openai.go:349 parseExtraBody 运行时校验,失败导致生成秒失败
admin/app/chorus/service.go:1247 validateExtraBody 管理端表单校验,失败返回字段错误

两处的 allowed 均改为:

allowed := map[string]bool{"temperature": true, "max_tokens": true, "size": true, "quality": true, "resolution": true}

配置改动

代码上线后,管理端把 provider_models.id=4 的 extra_body 设为:

{"resolution": "1K"}

收益边界

唯一确定的收益是拿回尺寸控制权。以下都不是收益:"和 cmhub 一致"本身;提速(未证实,同一提示词的成功样本在 244–465 秒间大幅波动);响应体变小加快传输(已证伪,20 KB/s 是中转站边生成边吐数据,不是带宽限制)。

已知的语义落差

cmhub 中 resolution 是每次请求的参数,调用方可按场景变化;chorus 的 extra_body 是 provider_model 级全局常量,填入后所有文生图请求共用同一值。chorus 目前没有请求级参数通道(provider.Request 只有 Kind / APIType / ModelID / RenderedPrompt / Inputs,用户端也无尺寸选项)。若将来要让用户自选尺寸,需另立工单打通该通道,届时本工单的配置应改为其默认值来源。

预计修改文件:

  • internal/core/provider/openai.go
  • admin/app/chorus/service.go
  • internal/core/provider/openai_test.go
  • admin/app/chorus/service_test.go(若存在对应校验测试)

需求变化记录

日期 变化内容 原因 用户确认
2026-08-26 范围从 {"resolution":"1K","aspect_ratio":"1:1"} 缩小为只填 {"resolution":"1K"} 原方案照抄 cmhub 的函数默认值,未针对本项目场景评估;强制 1:1 对地图类横构图可能变差 是
2026-08-26 补充"收益边界"与"已知的语义落差" 澄清"向 cmhub 靠拢"不构成收益,extra_body 是全局常量而非请求级参数 是
2026-08-26 从"无需改代码的配置变更"改为"核心域 + 管理端白名单代码变更" 首次实施后 generation 18 在 2 毫秒内失败,parseExtraBody 白名单不含 resolution。原判断遗漏了该校验 是(用户选择方案 A)

设计与原型门禁

  • 修改类型:非 UI
  • 所需设计证据:架构、API、数据、状态或流程设计
  • 可编辑设计源链接、版本或事实来源:cmhub 源码 apps/ai/providers/openai_compatible.py:337;本工单"要解决什么"中的对照请求与 generation 18 记录
  • 本地 HTML 审核快照路径和版本(不适用时说明原因):不适用,不改变任何界面结构
  • 本地浏览方式和资源完整性检查:不适用
  • 版本、revision 或确认日期:2026-08-26
  • 状态:已确认
  • 确认人、确认时间和覆盖范围:ila,2026-08-26,覆盖白名单增加 resolution 与随后的配置变更
  • 无需 UI 原型或无需任何原型的原因:只放开一个厂商请求参数,界面无变化

文档影响

  • 更新业务规则与术语

需要记录两条长期事实:

  1. 该 Provider 的两个图片端点使用不同的尺寸参数体系——/images/generations 用 resolution,/images/edits 用 size;
  2. extra_body 白名单在核心域与管理端各有一份,新增键必须同步修改,否则会出现"管理端能存、运行时秒失败"。

交付文档影响

  • 无交付文档影响,原因:内部 Provider 配置能力调整,无外部受众。

验收标准

  • internal/core/provider/openai.go 与 admin/app/chorus/service.go 两处白名单均包含 resolution,且两处内容一致。
  • 新增测试:{"resolution":"1K"} 被接受,且该值出现在实际请求体中。
  • 既有拒绝用例仍然通过:{"model":...}、{"messages":[]}、{"n":2}、{"response_format":"url"}、{"authorization":...}、{"unknown":true} 全部继续被拒绝。
  • aspect_ratio 仍被拒绝(本次未放开,需有测试锁定)。
  • go build ./...、go vet ./...、go test ./... 全部通过。
  • provider_models.id=4 的 extra_body 为 {"resolution": "1K"};id=5 保持 {"size": "1024x1024"} 未变。
  • 提交一次真实文生图并成功,输出尺寸不再是上游默认的 1536×1024。
  • 记录实际输出的宽高与宽高比,作为"上游在只给 resolution 时如何决定构图"的事实依据。
  • 没有凭据、上游响应正文或生成图片进入工单、Wiki、Git 和日志。

验证方式

go build ./...
go vet ./...
go test ./internal/core/provider/... ./admin/... -v
go test ./...

# 重新编译部署 portal 后,管理端修改 extra_body,再提交一次文生图
# SELECT id, api_type, extra_body FROM provider_models WHERE id IN (4,5);
# SELECT g.id, g.status, g.provider_attempt_count, o.size_bytes
#   FROM generations g JOIN generation_outputs o ON o.generation_id = g.id
#  ORDER BY g.id DESC LIMIT 1;

注:generation_outputs.width / height 目前不落库(见"遗留"),尺寸需从落盘 PNG 文件头确认。

完成证据

  • 最终差异:
  • 测试结果:
  • 未验证部分:
  • 提交哈希:
  • 长期 Wiki 页面与 revision(无长期文档影响时填"无"):

风险和回退

  • 白名单是安全边界:它限制管理员能往上游请求里塞什么。本次只增加一个厂商尺寸参数,不涉及协议或凭据字段,风险可控;但每次放开都必须有对应的拒绝用例锁定边界。
  • 只给 resolution 不给 aspect_ratio 时上游如何决定构图未经验证。对照请求两个参数都给了,得到 1254×1254。若上游在缺少 aspect_ratio 时报错或退回 1536×1024,本方案不成立,应停止并重新评估。
  • 输出尺寸变小可能影响后续用途。若 1K 不够可改 "2K",但需重新评估耗时与响应体大小。
  • 回退:extra_body 改回 {}(立即生效,无需重启);代码回退直接 revert 提交,无数据迁移。

实施顺序提醒

必须先上线代码、再改配置。反过来会重现 generation 18 的秒失败。

遗留(需另建工单)

generation_outputs.width 与 height 不落库。generation 14 / 15 的实际输出为 1536×1024,但两列均为 NULL,导致尺寸只能靠读 PNG 文件头确认。

## 基本信息 - 类型:缺陷(Provider 配置 + 核心域校验) - 所属 Epic:#3 - 所属 MVP / 版本:#35 / MVP-2 - 阶段:待实施 ## 依赖与并行 - 前置工单:#62(已验收关闭) - 是否允许与前置工单并行:是 - 原因:本工单不修改任何超时值。与 #63(待验收)也无冲突,两者改动文件不重叠。 ## 子项目影响 - 仅影响的子项目 / 交付单元:`internal/core`(provider 校验)、`admin`(表单校验)、`provider_models` 配置数据 - 是否跨子项目:**是**(核心域与管理端各有一份同样的白名单,必须同步修改) - 是否修改共享接口或契约:否;不改表结构、不改请求协议,只放开一个厂商参数键 - 各子项目需要执行的验证:`go test ./internal/core/provider/... ./admin/...`,以及一次真实文生图 ## 原始需求 - 来源:用户对话 - 提出时间:2026-08-26 - 关键原话或脱敏摘要:用户询问"为什么文生图时间这么久",追问 cmhub 的下载方式,比对源码后确认差异;随后要求"只填 resolution"。首次实施因白名单拒绝而失败,用户选择方案 A——回滚后改为需要改代码的工单。 ## 要解决什么 ### 现状 chorus 对 `/v1/images/generations` 不发送任何尺寸参数,输出尺寸完全由上游默认值决定(实测均为 1536×1024),chorus 对此没有控制权。上游若改默认值,chorus 的输出会无声跟着变。 cmhub 对同一端点发送 `resolution` 与 `aspect_ratio`(`apps/ai/providers/openai_compatible.py:337`)。经对照请求验证,该中转站**接受 `resolution` / `aspect_ratio`,不认 `size`**——之前"忽略 `size`"的现象是参数名不对,不是上游忽略。 ### 首次实施失败:`extra_body` 白名单拒绝 `resolution` 2026-08-26 09:35 把 `provider_models.id=4` 的 `extra_body` 设为 `{"resolution": "1K"}` 后,generation 18 立即失败: ``` error_code: upstream_unknown retryable: false latency_ms: 2 ``` **2 毫秒,没有发出任何网络请求。** 原因是 `internal/core/provider/openai.go:349` 的白名单不含 `resolution`: ```go allowed := map[string]bool{"temperature": true, "max_tokens": true, "size": true, "quality": true} ``` `parseExtraBody` 返回 `ErrInvalidConfig` → `NewOpenAI` 失败 → worker 的 `factoryErr` 分支 → 终态 `upstream_unknown`。 **原工单"无需改代码"的判断是错的**:当时只看了 `mergeExtra` 的覆盖行为,没看它上游的 `parseExtraBody` 校验。白名单按 OpenAI 官方参数命名(`size` / `quality`),与该中转站的 `resolution` / `aspect_ratio` 体系对不上。 配置已于同日回滚为 `{}`,文生图恢复正常。 ### 附带确认 generation 18 的 attempts 记录中 `error_code=upstream_unknown`、`retryable=false`、`latency_ms=2` 三者自洽,未被终态码覆盖,证明 #63 的修复在真实运行中生效。 ## 做什么 / 不做什么 - 做:把 `resolution` 加入 `extra_body` 白名单(核心域与管理端两处),补测试,然后配置 `provider_models.id=4` 并验证。 - 不做: - **不放开 `aspect_ratio`**。沿用先前决定:上游默认的 3:2 横构图对现有地图类提示词可能更合适,强制 1:1 有变差风险。将来需要时用同一机制追加。 - **不放开任何协议或凭据字段**。`model` / `messages` / `n` / `response_format` / `authorization` 必须继续被拒绝,这是白名单存在的理由。 - 不改白名单的结构(不做按 provider 配置的动态白名单),只增加一个键。 - 不修改 `provider_models.id=5`(其 `size` 对 edits 端点正确)。 - 不修改超时值、`response_format` 或任何 Go 协议实现。 ## 已确认方案 ### 代码改动 白名单在**两处**重复定义,必须同步修改,否则管理端能存进去、运行时却拒绝(正是本次失败的形态): | 位置 | 作用 | |---|---| | `internal/core/provider/openai.go:349` `parseExtraBody` | 运行时校验,失败导致生成秒失败 | | `admin/app/chorus/service.go:1247` `validateExtraBody` | 管理端表单校验,失败返回字段错误 | 两处的 `allowed` 均改为: ```go allowed := map[string]bool{"temperature": true, "max_tokens": true, "size": true, "quality": true, "resolution": true} ``` ### 配置改动 代码上线后,管理端把 `provider_models.id=4` 的 `extra_body` 设为: ```json {"resolution": "1K"} ``` ### 收益边界 唯一确定的收益是**拿回尺寸控制权**。以下都不是收益:"和 cmhub 一致"本身;提速(未证实,同一提示词的成功样本在 244–465 秒间大幅波动);响应体变小加快传输(已证伪,20 KB/s 是中转站边生成边吐数据,不是带宽限制)。 ### 已知的语义落差 cmhub 中 `resolution` 是每次请求的参数,调用方可按场景变化;chorus 的 `extra_body` 是 provider_model 级全局常量,填入后所有文生图请求共用同一值。chorus 目前没有请求级参数通道(`provider.Request` 只有 `Kind` / `APIType` / `ModelID` / `RenderedPrompt` / `Inputs`,用户端也无尺寸选项)。若将来要让用户自选尺寸,需另立工单打通该通道,届时本工单的配置应改为其默认值来源。 预计修改文件: - `internal/core/provider/openai.go` - `admin/app/chorus/service.go` - `internal/core/provider/openai_test.go` - `admin/app/chorus/service_test.go`(若存在对应校验测试) ## 需求变化记录 | 日期 | 变化内容 | 原因 | 用户确认 | |---|---|---|---| | 2026-08-26 | 范围从 `{"resolution":"1K","aspect_ratio":"1:1"}` 缩小为只填 `{"resolution":"1K"}` | 原方案照抄 cmhub 的函数默认值,未针对本项目场景评估;强制 1:1 对地图类横构图可能变差 | 是 | | 2026-08-26 | 补充"收益边界"与"已知的语义落差" | 澄清"向 cmhub 靠拢"不构成收益,`extra_body` 是全局常量而非请求级参数 | 是 | | 2026-08-26 | **从"无需改代码的配置变更"改为"核心域 + 管理端白名单代码变更"** | 首次实施后 generation 18 在 2 毫秒内失败,`parseExtraBody` 白名单不含 `resolution`。原判断遗漏了该校验 | 是(用户选择方案 A) | ## 设计与原型门禁 - 修改类型:非 UI - 所需设计证据:架构、API、数据、状态或流程设计 - 可编辑设计源链接、版本或事实来源:cmhub 源码 `apps/ai/providers/openai_compatible.py:337`;本工单"要解决什么"中的对照请求与 generation 18 记录 - 本地 HTML 审核快照路径和版本(不适用时说明原因):不适用,不改变任何界面结构 - 本地浏览方式和资源完整性检查:不适用 - 版本、revision 或确认日期:2026-08-26 - 状态:已确认 - 确认人、确认时间和覆盖范围:ila,2026-08-26,覆盖白名单增加 `resolution` 与随后的配置变更 - 无需 UI 原型或无需任何原型的原因:只放开一个厂商请求参数,界面无变化 ## 文档影响 - [x] 更新业务规则与术语 需要记录两条长期事实: 1. 该 Provider 的两个图片端点使用不同的尺寸参数体系——`/images/generations` 用 `resolution`,`/images/edits` 用 `size`; 2. `extra_body` 白名单在核心域与管理端各有一份,新增键必须同步修改,否则会出现"管理端能存、运行时秒失败"。 ## 交付文档影响 - [x] 无交付文档影响,原因:内部 Provider 配置能力调整,无外部受众。 ## 验收标准 - [ ] `internal/core/provider/openai.go` 与 `admin/app/chorus/service.go` 两处白名单均包含 `resolution`,且两处内容一致。 - [ ] 新增测试:`{"resolution":"1K"}` 被接受,且该值出现在实际请求体中。 - [ ] 既有拒绝用例仍然通过:`{"model":...}`、`{"messages":[]}`、`{"n":2}`、`{"response_format":"url"}`、`{"authorization":...}`、`{"unknown":true}` 全部继续被拒绝。 - [ ] `aspect_ratio` 仍被拒绝(本次未放开,需有测试锁定)。 - [ ] `go build ./...`、`go vet ./...`、`go test ./...` 全部通过。 - [ ] `provider_models.id=4` 的 `extra_body` 为 `{"resolution": "1K"}`;`id=5` 保持 `{"size": "1024x1024"}` 未变。 - [ ] 提交一次真实文生图并成功,输出尺寸不再是上游默认的 1536×1024。 - [ ] 记录实际输出的宽高与宽高比,作为"上游在只给 resolution 时如何决定构图"的事实依据。 - [ ] 没有凭据、上游响应正文或生成图片进入工单、Wiki、Git 和日志。 ## 验证方式 ```powershell go build ./... go vet ./... go test ./internal/core/provider/... ./admin/... -v go test ./... # 重新编译部署 portal 后,管理端修改 extra_body,再提交一次文生图 # SELECT id, api_type, extra_body FROM provider_models WHERE id IN (4,5); # SELECT g.id, g.status, g.provider_attempt_count, o.size_bytes # FROM generations g JOIN generation_outputs o ON o.generation_id = g.id # ORDER BY g.id DESC LIMIT 1; ``` 注:`generation_outputs.width` / `height` 目前不落库(见"遗留"),尺寸需从落盘 PNG 文件头确认。 ## 完成证据 - 最终差异: - 测试结果: - 未验证部分: - 提交哈希: - 长期 Wiki 页面与 revision(无长期文档影响时填"无"): ## 风险和回退 - 白名单是安全边界:它限制管理员能往上游请求里塞什么。本次只增加一个厂商尺寸参数,不涉及协议或凭据字段,风险可控;但每次放开都必须有对应的拒绝用例锁定边界。 - 只给 `resolution` 不给 `aspect_ratio` 时上游如何决定构图**未经验证**。对照请求两个参数都给了,得到 1254×1254。若上游在缺少 `aspect_ratio` 时报错或退回 1536×1024,本方案不成立,应停止并重新评估。 - 输出尺寸变小可能影响后续用途。若 1K 不够可改 `"2K"`,但需重新评估耗时与响应体大小。 - 回退:`extra_body` 改回 `{}`(立即生效,无需重启);代码回退直接 revert 提交,无数据迁移。 ## 实施顺序提醒 必须**先上线代码、再改配置**。反过来会重现 generation 18 的秒失败。 ## 遗留(需另建工单) `generation_outputs.width` 与 `height` 不落库。generation 14 / 15 的实际输出为 1536×1024,但两列均为 NULL,导致尺寸只能靠读 PNG 文件头确认。
Author
Owner

开始实施(2026-08-26)

阶段:待实施 → 进行中。

前置 #62 已验收关闭,依赖满足。工作区检查:config/local-services.yml 既存改动、未跟踪的 admin/config/settings.yml 与一张截图均为用户已有内容,与本任务无关,保持原样不提交。

实施方式

与 #62 相同的两点偏差:extra_body 是数据库配置数据,不进版本库,因此本工单无代码提交;修改通过 SQL 执行(本会话无法驱动管理端页面),config_audit_logs 表在当前库中不存在,未绕过任何已实现的审计机制。

顺带处理:部署二进制过期

在跑的 chorus-portal.exe 编译于 2026-08-25 16:43,早于 #63 的提交 52ebca2(08-26 09:07)。本次一并重新编译部署,使 #63 的错误码修复生效。这不改变 #64 的范围——extra_body 由 GORMCatalog.Resolve 每次现查数据库,本身不需要重启即可生效;重新编译是为了 #63,在工单中记录以免混淆两者的证据。

## 开始实施(2026-08-26) 阶段:待实施 → 进行中。 前置 #62 已验收关闭,依赖满足。工作区检查:`config/local-services.yml` 既存改动、未跟踪的 `admin/config/settings.yml` 与一张截图均为用户已有内容,与本任务无关,保持原样不提交。 ### 实施方式 与 #62 相同的两点偏差:`extra_body` 是数据库配置数据,不进版本库,因此本工单**无代码提交**;修改通过 SQL 执行(本会话无法驱动管理端页面),`config_audit_logs` 表在当前库中不存在,未绕过任何已实现的审计机制。 ### 顺带处理:部署二进制过期 在跑的 `chorus-portal.exe` 编译于 2026-08-25 16:43,早于 #63 的提交 `52ebca2`(08-26 09:07)。本次一并重新编译部署,使 #63 的错误码修复生效。这不改变 #64 的范围——`extra_body` 由 `GORMCatalog.Resolve` 每次现查数据库,本身不需要重启即可生效;重新编译是为了 #63,在工单中记录以免混淆两者的证据。
ila changed title from fix: 对齐 cmhub 的 images 生成尺寸参数 to fix: 放开 extra_body 的 resolution 并配置文生图尺寸 2026-08-26 09:40:54 +08:00
Author
Owner

已停止:前提被实测推翻(2026-08-26)

阶段:进行中 → 已停止。不是"已完成"——本工单想做的事在当前 Provider 上做不到。

判别实验

代码上线后依次配置并各做一次真实生成,其余条件不变:

generation extra_body 输出尺寸 像素数 耗时
14 {} 1536×1024 1,572,864 465 秒
15 {} 1536×1024 1,572,864 244 秒
19 {"resolution":"1K"} 1536×1024 1,572,864 184 秒
20 {"resolution":"2K"} 1536×1024 1,572,864 150 秒

1K 与 2K 产出完全相同的尺寸,因此不是"参数生效但值撞上默认值",而是该端点忽略 resolution。

耗时 150–465 秒是上游负载波动,与参数无关:generation 20 的输出(3.49 MB)甚至小于 19(3.72 MB)。

结论:该 Provider 上不存在"分辨率"这个可调项

综合此前的受控请求(resolution:1K + aspect_ratio:1:1 → 1254×1254,1,572,516 px):

  • 输出像素总量固定在约 157 万,size 与 resolution 都被忽略;
  • 唯一能改变输出的是 aspect_ratio,它只改构图比例,不改像素总量。

因此本工单的目标"拿回尺寸控制权"在这个上游无法达成。上游只提供构图选项,不提供分辨率选项。

一个被推翻的中间判断

此前把受控请求的 1254×1254 归因于 resolution,据此缩小范围为"只填 resolution、排除 aspect_ratio"。现在看,起作用的恰恰是被排除的 aspect_ratio。缩小范围的方向搞反了。

但排除 aspect_ratio 的理由依然成立:上游默认的 3:2 横构图适合现有地图类提示词,像素总量既然固定,改比例只是换形状、不会更清晰。所以即便改用 aspect_ratio,也没有值得配置的东西。

已回退的内容

项 状态
provider_models.id=4 的 extra_body 回到 {}
provider_models.id=5 {"size":"1024x1024"} 全程未动
两处白名单的 resolution 已移除,恢复原状
提交 bd6732f(代码)、3d2dc96(文档) 已撤销,从未推送
portal 二进制 2026-08-26 10:30 重新编译部署,含 #63、不含本工单

回退后 go build / go vet / go test、sync --check、check --strict 均通过。

白名单未保留 resolution:它是安全边界,放开一个上游根本不认的键收益为零;"别的 Provider 也许用得上"不构成现在放宽的理由,将来真有需要时按 Wiki 记录的流程重新验证后再加。

保留的产出

唯一有价值的产出是文档。Wiki Business-Rules-and-Glossary → revision dd1d0ceaddf4b5ba61b46a626a7e0d5135fb965e,镜像提交 03ca11e,记录三条:

  1. extra_body 白名单在核心域与管理端各有一份,新增键必须同步修改;只改管理端会造成"能保存但生成在毫秒内失败"(upstream_unknown、几毫秒、无上游请求)。
  2. 放开新键前必须先用受控请求验证上游真的接受它,不能以"其他实现这么发"为依据。参数名对不上时上游静默忽略,很容易被误读成"参数生效但值不对"——本工单正是这么误判的。
  3. 该 Provider 的已验证行为:忽略 size 与 resolution,像素总量固定约 157 万,只有 aspect_ratio 改变构图。

实施过程中的事故

  1. 首次实施后 generation 16/17/18 连续失败(09:35–09:45 共 10 分钟)。原因是先改配置、后发现白名单不允许——原工单误判为"无需改代码"。已回滚并重写工单。若当初经管理端页面而非 SQL 修改,validateExtraBody 会当场返回字段错误,不会浪费三次提交。
  2. 回退提交时误用 git reset --hard,连带丢弃了工作区中与本任务无关的 config/local-services.yml 用户改动,已按记录的 diff 逐行还原并请用户核对。正确做法是 git revert 或只针对目标提交操作。

遗留(需另建工单)

generation_outputs.width 与 height 不落库。本工单全程只能靠读取落盘 PNG 文件头确认尺寸,SQL 无法直接核对。

## 已停止:前提被实测推翻(2026-08-26) 阶段:进行中 → **已停止**。不是"已完成"——本工单想做的事在当前 Provider 上做不到。 ### 判别实验 代码上线后依次配置并各做一次真实生成,其余条件不变: | generation | `extra_body` | 输出尺寸 | 像素数 | 耗时 | |---|---|---|---|---| | 14 | `{}` | 1536×1024 | 1,572,864 | 465 秒 | | 15 | `{}` | 1536×1024 | 1,572,864 | 244 秒 | | 19 | `{"resolution":"1K"}` | 1536×1024 | 1,572,864 | 184 秒 | | 20 | `{"resolution":"2K"}` | **1536×1024** | 1,572,864 | 150 秒 | **`1K` 与 `2K` 产出完全相同的尺寸**,因此不是"参数生效但值撞上默认值",而是**该端点忽略 `resolution`**。 耗时 150–465 秒是上游负载波动,与参数无关:generation 20 的输出(3.49 MB)甚至小于 19(3.72 MB)。 ### 结论:该 Provider 上不存在"分辨率"这个可调项 综合此前的受控请求(`resolution:1K` + `aspect_ratio:1:1` → 1254×1254,1,572,516 px): - 输出像素总量**固定**在约 157 万,`size` 与 `resolution` 都被忽略; - 唯一能改变输出的是 `aspect_ratio`,它只改构图比例,不改像素总量。 因此本工单的目标"拿回尺寸控制权"在这个上游无法达成。上游只提供构图选项,不提供分辨率选项。 ### 一个被推翻的中间判断 此前把受控请求的 1254×1254 归因于 `resolution`,据此缩小范围为"只填 resolution、排除 aspect_ratio"。现在看,起作用的恰恰是被排除的 `aspect_ratio`。缩小范围的方向搞反了。 但排除 `aspect_ratio` 的**理由**依然成立:上游默认的 3:2 横构图适合现有地图类提示词,像素总量既然固定,改比例只是换形状、不会更清晰。所以即便改用 `aspect_ratio`,也没有值得配置的东西。 ### 已回退的内容 | 项 | 状态 | |---|---| | `provider_models.id=4` 的 `extra_body` | 回到 `{}` | | `provider_models.id=5` | `{"size":"1024x1024"}` 全程未动 | | 两处白名单的 `resolution` | 已移除,恢复原状 | | 提交 `bd6732f`(代码)、`3d2dc96`(文档) | 已撤销,从未推送 | | portal 二进制 | 2026-08-26 10:30 重新编译部署,含 #63、不含本工单 | 回退后 `go build` / `go vet` / `go test`、`sync --check`、`check --strict` 均通过。 **白名单未保留 `resolution`**:它是安全边界,放开一个上游根本不认的键收益为零;"别的 Provider 也许用得上"不构成现在放宽的理由,将来真有需要时按 Wiki 记录的流程重新验证后再加。 ### 保留的产出 唯一有价值的产出是文档。Wiki `Business-Rules-and-Glossary` → revision `dd1d0ceaddf4b5ba61b46a626a7e0d5135fb965e`,镜像提交 `03ca11e`,记录三条: 1. **`extra_body` 白名单在核心域与管理端各有一份**,新增键必须同步修改;只改管理端会造成"能保存但生成在毫秒内失败"(`upstream_unknown`、几毫秒、无上游请求)。 2. **放开新键前必须先用受控请求验证上游真的接受它**,不能以"其他实现这么发"为依据。参数名对不上时上游静默忽略,很容易被误读成"参数生效但值不对"——本工单正是这么误判的。 3. **该 Provider 的已验证行为**:忽略 `size` 与 `resolution`,像素总量固定约 157 万,只有 `aspect_ratio` 改变构图。 ### 实施过程中的事故 1. **首次实施后 generation 16/17/18 连续失败**(09:35–09:45 共 10 分钟)。原因是先改配置、后发现白名单不允许——原工单误判为"无需改代码"。已回滚并重写工单。若当初经管理端页面而非 SQL 修改,`validateExtraBody` 会当场返回字段错误,不会浪费三次提交。 2. **回退提交时误用 `git reset --hard`**,连带丢弃了工作区中与本任务无关的 `config/local-services.yml` 用户改动,已按记录的 diff 逐行还原并请用户核对。正确做法是 `git revert` 或只针对目标提交操作。 ### 遗留(需另建工单) `generation_outputs.width` 与 `height` 不落库。本工单全程只能靠读取落盘 PNG 文件头确认尺寸,SQL 无法直接核对。
ila closed this issue 2026-08-26 10:35:26 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#64