6.5 KiB
6.5 KiB
拼图 APIMart 图片模型路由接入 2026-05-01
背景
拼图创作已收口为填表式流程,首图生成和结果页关卡重新生成都由 server-rs/crates/api-server/src/puzzle.rs 执行外部图片 I/O,再把正式图写入 OSS 与 SpacetimeDB。新的模型选择只影响图片生成上游,不改变 SpacetimeDB 表结构、拼图草稿结构或前端运行时规则。
本轮参考 APIMart 文档:
https://docs.apimart.ai/cn/api-reference/images/gpt-image-2/generationhttps://docs.apimart.ai/cn/api-reference/images/gemini-3.1-flash/generation
两条文档均指向 OpenAI 兼容风格的图片生成入口:POST https://api.apimart.ai/v1/images/generations,头部使用 Authorization: Bearer {APIMART_API_KEY}。请求体至少包含 model、prompt、n、size。返回体按 OpenAI images 兼容格式优先读取 data[].url,若供应商返回异步任务结构,则继续按 task_id / tasks/{task_id} 轮询并提取图片 URL。
模型选项
拼图图片生成支持两个选项:
| 前端显示 | 请求值 | 上游 |
|---|---|---|
gpt-image-2 |
gpt-image-2 |
APIMart /v1/images/generations |
nanobanana2 |
gemini-3.1-flash-image-preview |
APIMart /v1/images/generations |
默认值为 gpt-image-2。前端只负责展示和传递所选模型,不能把模型路由逻辑、上游请求体拼装或 API Key 暴露到浏览器。历史草稿或旧请求中的空值、original、未知值统一按 gpt-image-2 处理,不再把拼图生图路由回 DashScope 原模型。
前端交互
- 拼图创作表单的“画面描述”输入框左下角显示当前调用模型。
- 拼图结果页关卡详情的“画面描述”输入框左下角同样显示当前调用模型。
- 点击模型标识弹出轻量选择菜单,只支持
gpt-image-2、nanobanana2两项。 - 菜单只是模型选择控件,不写入说明性规则文案。
- 参考图入口继续在画面描述输入框右下角,模型选择在左下角,两者不得遮挡文本。
- 表单创建 session、自动保存表单草稿、首图生成失败重试时都要保留当前模型选择。
- 结果页关卡重新生成时将当前模型随
generate_puzzle_imagesaction 传给后端。 - “生成草稿”和关卡详情“生成画面 / 重新生成画面”按钮文本右侧展示
消耗2光点。 - 关卡详情点击“生成画面 / 重新生成画面”后先弹出确认消耗光点弹窗,确认后开始请求;按钮区域切换为 30 秒倒计时进度条,并展示预计剩余生成完成时间。
后端路由
CreatePuzzleAgentSessionRequest与ExecutePuzzleAgentActionRequest增加可选imageModel字段;该字段不进入 SpacetimeDB reducer 输入结构。compile_puzzle_draft_with_initial_cover与generate_puzzle_image_candidates增加图片模型参数。imageModel归一化规则:- 空值、
original或未知值统一回落为gpt-image-2; gpt-image-2走 APIMart;gemini-3.1-flash-image-preview走 APIMart,前端显示名为nanobanana2。
- 空值、
- APIMart 文生图和图生图共用
POST /v1/images/generations。有参考图时,后端将参考图 Data URL 作为image_urls数组传入;若上游不接受该字段,错误按上游失败返回,不在前端降级伪造结果。 - APIMart 尺寸使用文档要求的比例写法
1:1。gemini-3.1-flash-image-preview额外带resolution = "1K",对齐约 1024px 的拼图正方形素材。 - APIMart 生成成功后仍下载远程图片,沿用现有 OSS 私有对象、
asset_object和asset_entity_binding写入流程。若图片已成功上传 OSS,但 Maincloud / SpacetimeDB 短暂返回503 Service Unavailable,资产索引写入允许降级跳过,并返回本次生成图片;日志必须记录拼图图片资产索引写入因 SpacetimeDB 连接不可用而降级跳过。 save_puzzle_generated_images写回草稿时若遇到 Maincloud 连接级503或断线,API 层基于本次生成结果合成 session 快照返回给前端,避免 APIMart 已成功出图却被后置持久化误报成服务不可用。余额不足、参数错误、上游生图失败仍按原错误返回,不做伪成功。- 结果页
generate_puzzle_images会携带当前作品信息和levelsJson。当 Maincloud / SpacetimeDB 在读取 session 阶段就返回连接级503或断线时,后端必须先用这份结果页快照构造最小内存 session,再继续调用 APIMart;外部图片已经生成后仍按第 6、7 条处理持久化降级。余额不足、参数错误、缺少草稿快照、关卡不存在等业务错误不走此降级。 - APIMart 异步任务轮询按文档口径在提交后先等待
10s,再调用GET /v1/tasks/{task_id};图片地址提取同时支持url: "..."与url: ["..."]两种结构。 - APIMart 错误统一映射为
502 UPSTREAM_ERROR,details.provider = "apimart",保留上游状态码、业务 message 和截断后的 raw excerpt。 - 拼图首图生成
compile_puzzle_draft与关卡图片生成generate_puzzle_images每次预扣2光点;余额不足仍返回409 CONFLICT,Maincloud 连接级 503 仍按既有降级策略处理。
环境变量
新增服务端环境变量:
APIMART_BASE_URL="https://api.apimart.ai/v1"
APIMART_API_KEY="YOUR_APIMART_API_KEY"
APIMART_IMAGE_REQUEST_TIMEOUT_MS=180000
APIMART_API_KEY 只能存在于本地或部署环境,不写入 Git 跟踪文件。若选择 APIMart 模型但缺少 key,后端返回服务不可用错误,前端展示现有错误面板。
验收
- 创作表单和关卡详情的画面描述框左下角能切换
gpt-image-2、nanobanana2,默认显示gpt-image-2。 - 点击“生成草稿”时,后端首图生成使用当前表单选择的模型。
- 点击“生成画面 / 重新生成画面”时,后端当前关卡图片生成使用关卡详情选择的模型。
- 历史
original或空模型值不会再触发 DashScope,统一按gpt-image-2请求 APIMart。 - 选择 APIMart 模型时,请求
POST {APIMART_BASE_URL}/images/generations,使用Authorization: Bearer {APIMART_API_KEY},model等于请求值,size = 1:1。 - “生成草稿”和关卡详情生图按钮展示
消耗2光点;关卡详情确认后展示 30 秒预计剩余进度条。 - 不改 SpacetimeDB 表结构,因此无需更新
migration.rs或重新生成 bindings。 - 后端改动后运行对应 Rust 测试,并按项目约束用
npm run api-server重启验证。