Merge remote-tracking branch 'origin/codex/wooden-fish-template'
@@ -16,20 +16,47 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2026-05-20 汪汪声浪 v1 公开闭环计划
|
## 2026-05-22 敲木鱼图片创作采用双图 image2 链路
|
||||||
|
|
||||||
- 背景:Bark Battle v1 需要把创作、生成、结果、发布、详情和正式运行态收成一条闭环,避免把草稿试玩、公开广场和正式成绩混在一起。
|
- 背景:敲木鱼自定义题材只生成中央敲击物时,运行态缺少与新主题匹配的竖屏背景;若直接让背景 prompt 自由发挥,又容易把敲击物或木槌画进背景里。
|
||||||
- 决策:`bark-battle` 入口改为 6 字段表单(作品标题、简介、主题 / 竞技背景描述 `themeDescription`、玩家形象描述、对手形象描述、难度);提交后进入 `bark-battle-generating` 独立生成页,自动生成玩家形象、对手形象和竞技背景三图,部分失败也继续进入结果页。旧“角色设定 / 狗狗皮肤预设 / themePreset”统一退场,配置和文档只使用“形象描述 / themeDescription”。结果页只保留单槽重试、重新生成和上传,不再保留一次生成按钮、音频配置入口、皮肤预设入口或排名配置。发布后先跳统一作品详情页 `/works/detail?work=BB-xxxxxxxx`,再由详情页进入正式 `published` runtime;正式 runtime 必须真实麦克风,`draft` 可试玩、可 mock 且不写正式统计。公开广场统一读取 `bark_battle_gallery_view` read model。
|
- 决策:敲木鱼 `compile-draft` / `regenerate-hit-object` 图片链路固定为两步 image2 edits。第一步调用 VectorEngine `/v1/images/edits` + `gpt-image-2`,以默认木鱼图作为结构和画风参考,用户上传参考图只作为同次请求的新主题参考,结合用户题材关键词或参考图主题生成 `1:1` 透明底新敲击物并写回 `hitObjectAsset`;第二步以新敲击物图作为主题和画风参考,结合用户原始题材生成 `9:16` 背景环境图并写回 `backgroundAsset`。两步 prompt 使用 PRD 中固定隐藏关键词,不追加额外 negative prompt;背景图不得包含敲击物本体或木槌互动物品。
|
||||||
- 影响范围:`BarkBattleConfigEditor`、`BarkBattleGeneratingView`、`BarkBattleResultView`、`BarkBattleRuntimeShell`、`PlatformEntryFlowShellImpl`、`appPageRoutes`、Bark Battle creation/runtime client、公开广场聚合与相关交互测试。
|
- 影响范围:`api-server` 木鱼图片生成编排、`wooden_fish_work_profile.background_asset_json`、shared contracts、前端结果页 / 运行态背景展示、敲木鱼 PRD 和平台链路文档。
|
||||||
- 验证方式:提交表单后先进入生成页;生成页部分失败仍能落到结果页;结果页只出现单槽重试 / 重新生成 / 上传;发布后先到 `/works/detail?work=BB-xxxxxxxx` 再进正式 runtime;正式 runtime 会要求麦克风并写基础统计,草稿试玩可 mock 且不写正式 run;公开广场读取 `bark_battle_gallery_view`。
|
- 验证方式:执行 `cargo test -p api-server wooden_fish --manifest-path server-rs/Cargo.toml`、`cargo test -p spacetime-client wooden_fish --manifest-path server-rs/Cargo.toml`、`npm run spacetime:generate`、`npm run check:spacetime-schema`、`npm run typecheck`。
|
||||||
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|
||||||
## 2026-05-22 汪汪声浪运行态与作品外显信息收口
|
## 2026-05-21 外部 API 失败必须 OTLP 上报并落库
|
||||||
|
|
||||||
- 背景:Bark Battle v1 在正式运行态、图片生成提示词和作品外部卡片上仍存在体验漂移:能量条推满后还要等计时结束、进入正式 runtime 后还要二次点击声控、角色形象 prompt 会默认注入狗主体、草稿 / 已发布卡片外部看不到创作者。
|
- 背景:图片生成等外部供应商调用失败时,仅返回 502/504 或普通日志无法支持后续按 provider、阶段和重试属性聚合排障。
|
||||||
- 决策:能量条到玩家或对手边界即结算;正式 `published` runtime 从作品详情启动后立即申请真实麦克风权限,授权成功后立刻进入倒计时,并使用 start run 返回的 `runtimeConfig` 作为本局前端规则参数;结束后弹出独立结算弹窗,运行态固定提供返回按钮。玩家 / 对手形象图提示词保持用户填写的形象描述,只要求单个完整形象、正面和透明背景,不把非狗描述改写成狗;草稿架、已发布作品架、统一作品详情和公开广场列表都展示后端返回的 `authorDisplayName`。Bark Battle 卡片封面按竞技背景、玩家形象、对手形象、入口参考图兜底;works summary 优先读取 `publishedSnapshotJson` 的最终发布素材。拟声词进入配置 JSON,未手动编辑时随主题 / 形象描述重算,手动编辑后保持创作者自定义;触发阈值降到 `0.35`、冷却降到 `150ms`,后端 `BarkBattleRuleset.min_bark_gap_ms` 同步为 `150`,局内有效触发后快速随机展示高能词池。
|
- 决策:外部 API 调用未成功时,`api-server` 必须同时发送 OTLP 失败观测并写入 `tracking_event`。当前通用 VectorEngine `gpt-image-2` 图片生成 / 编辑适配器记录 `external_api_call_failure`,`scope_kind = module`、`scope_id = provider`、`module_key = external-api`,metadata 包含 endpoint、operation、failureStage、statusCode、statusClass、timeout、retryable、errorMessage、latencyMs、promptChars、referenceImageCount、imageModel 和 rawExcerpt。
|
||||||
- 影响范围:`BarkBattleSession`、`BarkBattleRuntimeShell`、`BarkBattleConfigEditor`、`BarkBattleConfig`、Bark Battle 生图 prompt、Bark Battle works/gallery summary、创作中心作品架卡片、公开作品码、`module-bark-battle` ruleset 和玩法链路文档。
|
- 落库方式:优先复用 tracking outbox 异步批量写入;outbox 不可写或因保护阈值拒绝时回退同步直写 SpacetimeDB。不新增 SpacetimeDB 表,不让 reducer 做外部 I/O。
|
||||||
- 验证方式:能量条推到 `100/-100` 的领域测试应提前 finished;发布态 runtime mount 后应自动调用麦克风 sampler、登记正式 run 并使用服务端 runtimeConfig;prompt 单测应覆盖透明背景、正面和非狗描述不强注入狗;作品架测试应覆盖草稿与已发布卡片作者展示和封面兜底;拟声词测试应覆盖主题自动重算、自定义保持和随机展示。
|
- 影响范围:`server-rs/crates/api-server/src/external_api_audit.rs`、`server-rs/crates/api-server/src/openai_image_generation.rs`、`server-rs/crates/api-server/src/telemetry.rs`、tracking outbox、后端架构文档和开发运维文档。
|
||||||
|
- 验证方式:执行 `cargo test -p api-server external_api_audit --manifest-path server-rs/Cargo.toml -- --nocapture`、`cargo test -p api-server openai_image_generation --manifest-path server-rs/Cargo.toml -- --nocapture`、`cargo check -p api-server --manifest-path server-rs/Cargo.toml`、`npm run check:encoding`。
|
||||||
|
- 关联文档:`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-21 拼图参考图主链改为 OSS assetObjectId 与只读签名 URL
|
||||||
|
|
||||||
|
- 背景:release 上拼图图生图生成草稿时,旧链路把上传图转成 Data URL/base64 放进创作 action JSON body,容易先触发 Nginx `413 Request Entity Too Large`,也让外部模型调用前的 HTTP body 过大。
|
||||||
|
- 决策:浏览器参考图先通过资产直传票据上传 OSS,并确认 `asset_object`;拼图 action 主链只提交 `referenceImageAssetObjectId(s)`。`api-server` 按当前登录用户校验 asset owner、bucket、kind、图片 MIME 和大小后签发 OSS 只读 URL,传给 VectorEngine 的 generation fallback 使用;需要 edits multipart 时由后端用该签名 URL 拉取字节,不再让前端把图片塞进 JSON body。
|
||||||
|
- 兼容边界:旧 `referenceImageSrc(s)` Data URL 与历史 `/generated-*` 路径仅保留给旧草稿、旧入口和迁移期请求;调大 Nginx `client_max_body_size` 只作为兼容兜底,不是长期创作主链。
|
||||||
|
- 影响范围:拼图创作前端、`packages/shared` / `shared-contracts` action DTO、`api-server` 拼图 VectorEngine 编排、资产确认和 `spacetime-client` 资产读取 facade。
|
||||||
|
- 验证方式:前端 payload 中 AI 重绘优先出现 `referenceImageAssetObjectId(s)` 且 `referenceImageSrc(s)` 不再携带 Data URL;后端 `puzzle_vector_engine_generation_prefers_signed_reference_url`、`puzzle_reference_image_sources_prefer_asset_object_ids`、`puzzle_asset_object_reference_requires_matching_owner` 通过。
|
||||||
|
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-21 Nginx 通用 API 入口放行创作参考图请求体
|
||||||
|
|
||||||
|
- 背景:release 上拼图结果页重绘动作携带参考图 Data URL 时,Nginx access log 出现 `413`、`request_time=0.000`、`upstream_status=-`,说明请求被反代层默认 1 MiB 上限拦截,未进入 `api-server`。
|
||||||
|
- 决策:发布、开发服和容器 Nginx 模板的通用 `location ~ ^/api(?:/|$)` 统一设置 `client_max_body_size 64m`。该值只作为反代放行和旧 Data URL 请求兼容兜底,具体业务请求体和图片字节上限继续由 `api-server` 路由 `DefaultBodyLimit`、OSS asset 确认和业务校验控制,不能替代接口级限制;拼图参考图长期主链见同日 `OSS assetObjectId` 决策。
|
||||||
|
- 影响范围:`deploy/nginx/genarrative.conf`、`deploy/nginx/genarrative-dev-http.conf`、`deploy/container/nginx.conf`、Nginx README、生产运维文档和 release 排障口径。
|
||||||
|
- 验证方式:目标机 `nginx -T 2>/dev/null | grep client_max_body_size` 应看到 `client_max_body_size 64m;`;大于 1 MiB 的参考图请求不再在 Nginx 层直接 413,access log 应出现有效 `upstream_status`。
|
||||||
|
- 关联文档:`deploy/nginx/README.md`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-22 抓大鹅素材生成改为关卡整图派生三图
|
||||||
|
|
||||||
|
- 背景:旧抓大鹅素材链路按物品 5x5 sheet、纯背景和独立容器图分开生产,难以保证背景、UI、容器和物品风格一致,也让结果页继续暴露背景 / 容器重生成入口。
|
||||||
|
- 决策:抓大鹅草稿生成先用 `gpt-image-2` 无参考图生成竖屏 `9:16` 完整关卡画面;关卡画面完成后,以它作为参考并发生成三张可运行资产:`1K 1:1` UI spritesheet、`1K 9:16` 关卡背景图、`2K 1:1` 物品 spritesheet。UI 与物品 spritesheet 都固定要求纯绿色绿幕背景,后端上传 OSS 前扣成真实透明 PNG。物品 spritesheet 固定 `10*10`,每行两种物品、每种五个形态。运行态和编辑器都按 alpha 连通域矩形检测解析 UI 和物品图集,不按固定像素坐标切图。
|
||||||
|
- 兼容:新增字段继续存入现有 `generatedItemAssets[].backgroundAsset` / `generatedBackgroundAsset` JSON,不新增 SpacetimeDB schema 字段。历史 `containerImage*` 字段只作兼容;如果它与 `uiSpritesheetImage*` 同源,不得再作为运行态中心容器图。
|
||||||
|
- 影响范围:`server-rs/crates/api-server/src/match3d/*`、`server-rs/crates/shared-contracts/src/match3d_*`、`packages/shared/src/contracts/match3dWorks.ts`、`src/components/match3d-result/Match3DResultView.tsx`、`src/components/match3d-runtime/Match3DRuntimeShell.tsx`、`src/services/match3dSpritesheetParser.ts`。
|
||||||
|
- 验证方式:执行 `cargo test -p api-server match3d --manifest-path server-rs\Cargo.toml`、`npm run test -- src/components/match3d-result/Match3DResultView.test.tsx src/components/match3d-runtime/Match3DRuntimeShell.test.tsx src/services/match3dSpritesheetParser.test.ts src/services/match3dGeneratedModelCache.test.ts`、`npm run typecheck`、`npm run check:encoding`。
|
||||||
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|
||||||
## 2026-05-18 Rust 手写模块入口统一不用 mod.rs
|
## 2026-05-18 Rust 手写模块入口统一不用 mod.rs
|
||||||
@@ -130,6 +157,30 @@
|
|||||||
- 验证方式:新增玩法 PRD 必须显式声明单图资产槽位和系列素材槽位;新增工作台测试确认没有默认聊天式 Agent 输入;skill 通过 `quick_validate.py`。
|
- 验证方式:新增玩法 PRD 必须显式声明单图资产槽位和系列素材槽位;新增工作台测试确认没有默认聊天式 Agent 输入;skill 通过 `quick_validate.py`。
|
||||||
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`.codex/skills/genarrative-play-type-integration/SKILL.md`、`.hermes/skills/genarrative-play-type-integration/SKILL.md`。
|
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`.codex/skills/genarrative-play-type-integration/SKILL.md`、`.hermes/skills/genarrative-play-type-integration/SKILL.md`。
|
||||||
|
|
||||||
|
## 2026-05-20 敲木鱼玩法按完整平台纵切接入
|
||||||
|
|
||||||
|
- 背景:敲木鱼玩法需要对齐拼图 / 跳一跳的创作闭环,不能做成孤立 demo 或前端本地计数工具。
|
||||||
|
- 决策:新增 `wooden-fish` 玩法,采用表单 / 图片输入工作台、单图敲击物资产槽位、敲击音效资产槽位和最多 8 条飘字配置;公开作品号前缀为 `WF-*`;运行态只在单次 run 内累计总敲击次数和词条计数。后端新增独立 `module-wooden-fish`、shared contracts、SpacetimeDB `wooden_fish_*` 表 / public views、`spacetime-client` facade 和 `/api/creation/wooden-fish/*`、`/api/runtime/wooden-fish/*` 路由,前端接入平台入口、生成页、结果页、运行态、公开详情和推荐试玩。
|
||||||
|
- 影响范围:`CONTEXT.md`、`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`、`packages/shared/src/contracts/woodenFish.ts`、`server-rs/crates/shared-contracts/src/wooden_fish.rs`、`server-rs/crates/module-wooden-fish/`、`server-rs/crates/spacetime-module/src/wooden_fish*`、`server-rs/crates/spacetime-client/src/wooden_fish.rs`、`src/components/wooden-fish-*`。
|
||||||
|
- 验证方式:执行敲木鱼契约 / module / facade / runtime model / platform entry 定向测试、`npm run typecheck`、`npm run check:encoding`、`npm run check:spacetime-schema`、`cargo check -p api-server --manifest-path server-rs\Cargo.toml`,本地 smoke 使用 mock 短信配置后检查 `/healthz`。
|
||||||
|
- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-21 敲木鱼敲击音效复用通用 Vidu 音效链路
|
||||||
|
|
||||||
|
- 背景:敲木鱼创作需要通过“敲击音效”描述生成真实短音频,不能继续由 `spacetime-client` 合成 `/generated-wooden-fish-assets/...` 假路径;同时拼图和抓大鹅音频生成入口仍需保持关闭。
|
||||||
|
- 决策:通用 `/api/creation/audio/sound-effect` 提交 Vidu 音效任务;`/api/creation/audio/sound-effect/{task_id}/asset` 只对木鱼 `hit_sound` 目标开放,完成查询、下载、OSS 私有对象、`asset_object` 和 entity binding 写入。木鱼 `compile-draft` / `generate-hit-sound` 在 `api-server` 内复用同一 helper 生成并注入 `hitSoundAsset`,`spacetime-client` 缺少真实 `hitSoundAsset` 时拒绝编译。拼图和抓大鹅相关目标继续返回 `410 Gone`。
|
||||||
|
- 影响范围:`server-rs/crates/api-server/src/vector_engine_audio_generation.rs`、`server-rs/crates/api-server/src/wooden_fish.rs`、`server-rs/crates/spacetime-client/src/wooden_fish.rs`、`shared-contracts` / `packages/shared` 的 `creationAudio` 契约、敲木鱼 PRD 与平台链路文档。
|
||||||
|
- 验证方式:执行 `cargo test -p shared-contracts creation_audio --manifest-path server-rs\Cargo.toml`、`cargo test -p spacetime-client wooden_fish --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server wooden_fish --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server disabled_creation_audio_targets_return_gone_except_wooden_fish_sound_effects --manifest-path server-rs\Cargo.toml`、`npm run typecheck`、`npm run check:encoding`,本地 smoke 检查 `/healthz`;真实生成需同时配置 VectorEngine 与 OSS AccessKey。
|
||||||
|
- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-21 敲木鱼默认敲击物使用内置透明 PNG
|
||||||
|
|
||||||
|
- 背景:默认敲木鱼图案若继续用“木鱼”关键词临时生成,image2 容易语义化重画并改变用户认可的原始造型。
|
||||||
|
- 决策:默认模板使用内置资源 `/wooden-fish/default-hit-object.png` 写回 `bundled-default` 敲击物资产;仅当用户输入自定义关键词、上传参考图或主动重生成敲击物时,才走 image2 -> OSS -> asset object -> entity binding 链路。创作入口卡片、结果页、运行态和公开列表兜底统一使用该 PNG。
|
||||||
|
- 影响范围:敲木鱼工作台默认提示词、api-server 木鱼默认资产编排、创作入口种子与迁移、平台公开卡片兜底、PRD 与平台链路文档。
|
||||||
|
- 验证方式:默认 `compile-draft` 返回的 `hitObjectAsset.generationProvider` 应为 `bundled-default` 且 `imageSrc=/wooden-fish/default-hit-object.png`;自定义关键词或参考图仍走 image2;前端静态资源可通过 Vite 直接访问。
|
||||||
|
- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|
||||||
## 2026-05-21 RPG publish_world 设定文本以后端草稿真相派生
|
## 2026-05-21 RPG publish_world 设定文本以后端草稿真相派生
|
||||||
|
|
||||||
- 背景:RPG 结果页发布动作只保证提交 `{ action: 'publish_world' }`;旧 agent 会话可能没有 `seed_text`,但 `draft_profile_json` 已经通过 `publish_gate` 并可发布。
|
- 背景:RPG 结果页发布动作只保证提交 `{ action: 'publish_world' }`;旧 agent 会话可能没有 `seed_text`,但 `draft_profile_json` 已经通过 `publish_gate` 并可发布。
|
||||||
@@ -407,6 +458,12 @@
|
|||||||
- 决策:热身关全流程直接接入 `useMocapInput`,通过本地 mocap WebSocket `/stream` 消费 `general.body.center_norm` 身体中心、`actions/action/gesture/gestures/event/name/type` 动作名,以及 `hands[]`、`leftHand/rightHand`、`left_hand/right_hand` 手部坐标;位置步骤由身体中心推进,`wave_greeting`、`wave_left_hand`、`wave_right_hand` 和 `jump_once` 由 mocap 手势/轨迹推进。浏览器摄像头只作为背景层,动作数据源状态优先展示,键鼠仍作为本地调试兜底。
|
- 决策:热身关全流程直接接入 `useMocapInput`,通过本地 mocap WebSocket `/stream` 消费 `general.body.center_norm` 身体中心、`actions/action/gesture/gestures/event/name/type` 动作名,以及 `hands[]`、`leftHand/rightHand`、`left_hand/right_hand` 手部坐标;位置步骤由身体中心推进,`wave_greeting`、`wave_left_hand`、`wave_right_hand` 和 `jump_once` 由 mocap 手势/轨迹推进。浏览器摄像头只作为背景层,动作数据源状态优先展示,键鼠仍作为本地调试兜底。
|
||||||
- 影响范围:`src/services/useMocapInput.ts`、`src/components/child-motion-demo/ChildMotionWarmupDemo.tsx`、对应单测与热身关技术文档。
|
- 影响范围:`src/services/useMocapInput.ts`、`src/components/child-motion-demo/ChildMotionWarmupDemo.tsx`、对应单测与热身关技术文档。
|
||||||
- 验证方式:执行 `npx vitest run src/services/useMocapInput.test.ts src/components/child-motion-demo/ChildMotionWarmupDemo.test.tsx src/components/child-motion-demo/childMotionWarmupModel.test.ts src/services/child-motion-demo/childMotionDebugInput.test.ts src/routing/appRoutes.test.ts`、`npx eslint ...`、`npm run typecheck`、`npm run check:encoding`,并确认 `http://127.0.0.1:8876/stream` WebSocket 可握手、`http://127.0.0.1:3000/child-motion-demo` 可访问。
|
- 验证方式:执行 `npx vitest run src/services/useMocapInput.test.ts src/components/child-motion-demo/ChildMotionWarmupDemo.test.tsx src/components/child-motion-demo/childMotionWarmupModel.test.ts src/services/child-motion-demo/childMotionDebugInput.test.ts src/routing/appRoutes.test.ts`、`npx eslint ...`、`npm run typecheck`、`npm run check:encoding`,并确认 `http://127.0.0.1:8876/stream` WebSocket 可握手、`http://127.0.0.1:3000/child-motion-demo` 可访问。
|
||||||
|
|
||||||
|
## 2026-05-18 寓教于乐频道补充热身关入口
|
||||||
|
- 背景:用户希望在发现页的寓教于乐板块里直接看到热身关入口,而不是只依赖独立直达路由。
|
||||||
|
- 决策:`child-motion-demo` 作为寓教于乐频道的独立卡片展示,点击后直接进入 `/child-motion-demo`;该入口与 `宝贝爱画` 并列,仍复用现有独立热身关路由,不新增新的创作模板或运行态壳层。
|
||||||
|
- 影响范围:`src/components/rpg-entry/RpgEntryHomeView.tsx`、`src/components/platform-entry/PlatformEntryFlowShellImpl.tsx`、`src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
- 验证方式:执行入口回归测试、`npm run typecheck`、`npm run check:encoding`,并在发现页的寓教于乐频道确认热身关卡卡片可点击进入 `/child-motion-demo`。
|
||||||
- 关联文档:`docs/technical/CHILD_MOTION_DEMO_WARMUP_IMPLEMENTATION_SPEC_2026-05-09.md`。
|
- 关联文档:`docs/technical/CHILD_MOTION_DEMO_WARMUP_IMPLEMENTATION_SPEC_2026-05-09.md`。
|
||||||
|
|
||||||
## 2026-05-09 GPT-image-2 图片生成统一迁移到 VectorEngine
|
## 2026-05-09 GPT-image-2 图片生成统一迁移到 VectorEngine
|
||||||
@@ -659,6 +716,14 @@
|
|||||||
- 验证方式:开发前优先阅读 `CURRENT_BACKEND_IMPLEMENTATION_BASELINE_2026-04-25.md`;旧 `server-node`、Express、PostgreSQL、Go 方向只允许作为迁移参考。
|
- 验证方式:开发前优先阅读 `CURRENT_BACKEND_IMPLEMENTATION_BASELINE_2026-04-25.md`;旧 `server-node`、Express、PostgreSQL、Go 方向只允许作为迁移参考。
|
||||||
- 关联文档:`docs/technical/CURRENT_BACKEND_IMPLEMENTATION_BASELINE_2026-04-25.md`、`AGENTS.md`。
|
- 关联文档:`docs/technical/CURRENT_BACKEND_IMPLEMENTATION_BASELINE_2026-04-25.md`、`AGENTS.md`。
|
||||||
|
|
||||||
|
## 2026-05-18 寓教于乐电视端入口概念图采用横屏乐园地图方案
|
||||||
|
|
||||||
|
- 背景:寓教于乐板块需要面向电视端 / 横屏大屏的一组图形化入口概念图,既要像儿童乐园地图,又要和现有绘本插画风一致。
|
||||||
|
- 决策:概念探索优先采用横屏乐园地图结构,推荐顺序为环形乐园岛、展开绘本地图、云朵空中岛、草地舞台地图;生成时优先复用 `public/child-motion-demo/picture-book-grass-stage.png` 作为风格参考,输出仅保留在 `output/imagegen/` 概念目录中,不直接进入正式资源目录。
|
||||||
|
- 影响范围:寓教于乐板块视觉探索、后续前端入口设计、`scripts/generate-edutainment-tv-map-concepts.mjs`、相关设计文档。
|
||||||
|
- 验证方式:概念图需保持无文字、无真实品牌 IP、无暗色科技风,并与现有草地绘本资源在配色和笔触上保持一致。
|
||||||
|
- 关联文档:`docs/design/【前端体验】寓教于乐电视端乐园地图入口概念图-2026-05-18.md`。
|
||||||
|
|
||||||
## 2026-04-28/29 server-rs DDD 分层与契约矩阵冻结
|
## 2026-04-28/29 server-rs DDD 分层与契约矩阵冻结
|
||||||
|
|
||||||
- 背景:server-rs 模块多、上下文多,需防止领域规则、SpacetimeDB 表、HTTP BFF、前端临时逻辑互相污染。
|
- 背景:server-rs 模块多、上下文多,需防止领域规则、SpacetimeDB 表、HTTP BFF、前端临时逻辑互相污染。
|
||||||
@@ -715,6 +780,38 @@
|
|||||||
- 影响范围:`api-server` tracking 中间件、SpacetimeDB tracking procedure、部署数据目录、OTLP 指标和运维排障。
|
- 影响范围:`api-server` tracking 中间件、SpacetimeDB tracking procedure、部署数据目录、OTLP 指标和运维排障。
|
||||||
- 验证方式:数据库不可用时公开 route 请求不失败且 outbox 文件保留;恢复后批量写入成功并删除本地 sealed 文件;关键事件仍立即影响任务 / 统计。
|
- 验证方式:数据库不可用时公开 route 请求不失败且 outbox 文件保留;恢复后批量写入成功并删除本地 sealed 文件;关键事件仍立即影响任务 / 统计。
|
||||||
|
|
||||||
|
## 2026-05-19 跳一跳平台公开链路采用独立玩法路由
|
||||||
|
|
||||||
|
- 背景:跳一跳玩法已接入平台入口、推荐、公开详情、试玩和运行态,后续继续扩展公开广场或推荐流时需要避免把它当成拼图兼容分支。
|
||||||
|
- 决策:跳一跳公开路由统一依赖 `sourceType='jump-hop'` 和 `JH-*` public code;平台首页、推荐、公开作品列表/详情、试玩和运行态都按 `jump-hop` 独立玩法分发。后端仍是作品、运行和发布状态的业务真相,前端只做展示、交互和临时 UI 状态,不在页面层补业务规则或权限判断。
|
||||||
|
- 影响范围:平台入口、推荐流、公开详情、试玩启动、跳一跳运行态、`api-server` / SpacetimeDB 公开投影和 shared contracts。
|
||||||
|
- 验证方式:从平台推荐或公开详情进入跳一跳作品时,路由 source type 为 `jump-hop`、public code 为 `JH-*`,运行态启动消费后端返回的完整 profile / run 数据;后端 smoke 统一使用 `npm run dev:api-server` 启动并检查 `/healthz`。
|
||||||
|
- 关联文档:`docs/prd/【玩法创作】跳一跳俯视角玩法模板PRD-2026-05-19.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
# 2026-05-20 陶泥儿主视觉配色回收为暖白/陶土橙
|
||||||
|
|
||||||
|
- 背景:用户要求只替换产品各界面的 UI 颜色,不改布局,并以两张陶泥儿主视觉图作为配色依据。
|
||||||
|
- 决策:平台亮色主题的主色回收到暖白 / 米杏底、陶土橙主按钮、深棕正文与浅杏边框;后台管理也同步切换到同一暖橙体系。主题变量优先通过 `src/index.css` 的 `--platform-*` token 统一控制,零散组件只做必要的局部替换。
|
||||||
|
- 影响范围:主站平台壳层、常用表单 / 按钮 / 卡片 / 背景、后台管理 UI、业务进度条和小游戏结果条的通用强调色。
|
||||||
|
- 验证方式:优先检查 `src/index.css` 与 `apps/admin-web/src/styles/admin.css` 是否还存在旧粉色主色;再用编码检查和可执行的本地 typecheck / build 验证。
|
||||||
|
- 关联文档:`docs/【项目基线】当前产品与工程约束-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-20 汪汪声浪 v1 公开闭环计划
|
||||||
|
|
||||||
|
- 背景:Bark Battle v1 需要把创作、生成、结果、发布、详情和正式运行态收成一条闭环,避免把草稿试玩、公开广场和正式成绩混在一起。
|
||||||
|
- 决策:`bark-battle` 入口改为 6 字段表单(作品标题、简介、主题 / 竞技背景描述 `themeDescription`、玩家形象描述、对手形象描述、难度);提交后进入 `bark-battle-generating` 独立生成页,自动生成玩家形象、对手形象和竞技背景三图,部分失败也继续进入结果页。旧“角色设定 / 狗狗皮肤预设 / themePreset”统一退场,配置和文档只使用“形象描述 / themeDescription”。结果页只保留单槽重试、重新生成和上传,不再保留一次生成按钮、音频配置入口、皮肤预设入口或排名配置。发布后先跳统一作品详情页 `/works/detail?work=BB-xxxxxxxx`,再由详情页进入正式 `published` runtime;正式 runtime 必须真实麦克风,`draft` 可试玩、可 mock 且不写正式统计。公开广场统一读取 `bark_battle_gallery_view` read model。
|
||||||
|
- 影响范围:`BarkBattleConfigEditor`、`BarkBattleGeneratingView`、`BarkBattleResultView`、`BarkBattleRuntimeShell`、`PlatformEntryFlowShellImpl`、`appPageRoutes`、Bark Battle creation/runtime client、公开广场聚合与相关交互测试。
|
||||||
|
- 验证方式:提交表单后先进入生成页;生成页部分失败仍能落到结果页;结果页只出现单槽重试 / 重新生成 / 上传;发布后先到 `/works/detail?work=BB-xxxxxxxx` 再进正式 runtime;正式 runtime 会要求麦克风并写基础统计,草稿试玩可 mock 且不写正式 run;公开广场读取 `bark_battle_gallery_view`。
|
||||||
|
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 2026-05-22 汪汪声浪运行态与作品外显信息收口
|
||||||
|
|
||||||
|
- 背景:Bark Battle v1 在正式运行态、图片生成提示词和作品外部卡片上仍存在体验漂移:能量条推满后还要等计时结束、进入正式 runtime 后还要二次点击声控、角色形象 prompt 会默认注入狗主体、草稿 / 已发布卡片外部看不到创作者。
|
||||||
|
- 决策:能量条到玩家或对手边界即结算;正式 `published` runtime 从作品详情启动后立即申请真实麦克风权限,授权成功后立刻进入倒计时,并使用 start run 返回的 `runtimeConfig` 作为本局前端规则参数;结束后弹出独立结算弹窗,运行态固定提供返回按钮。玩家 / 对手形象图提示词保持用户填写的形象描述,只要求单个完整形象、正面和透明背景,不把非狗描述改写成狗;草稿架、已发布作品架、统一作品详情和公开广场列表都展示后端返回的 `authorDisplayName`。Bark Battle 卡片封面按竞技背景、玩家形象、对手形象、入口参考图兜底;works summary 优先读取 `publishedSnapshotJson` 的最终发布素材。拟声词进入配置 JSON,未手动编辑时随主题 / 形象描述重算,手动编辑后保持创作者自定义;触发阈值降到 `0.35`、冷却降到 `150ms`,后端 `BarkBattleRuleset.min_bark_gap_ms` 同步为 `150`,局内有效触发后快速随机展示高能词池。
|
||||||
|
- 影响范围:`BarkBattleSession`、`BarkBattleRuntimeShell`、`BarkBattleConfigEditor`、`BarkBattleConfig`、Bark Battle 生图 prompt、Bark Battle works/gallery summary、创作中心作品架卡片、公开作品码、`module-bark-battle` ruleset 和玩法链路文档。
|
||||||
|
- 验证方式:能量条推到 `100/-100` 的领域测试应提前 finished;发布态 runtime mount 后应自动调用麦克风 sampler、登记正式 run 并使用服务端 runtimeConfig;prompt 单测应覆盖透明背景、正面和非狗描述不强注入狗;作品架测试应覆盖草稿与已发布卡片作者展示和封面兜底;拟声词测试应覆盖主题自动重算、自定义保持和随机展示。
|
||||||
|
- 关联文档:`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|
||||||
## 2026-05-19 汪汪声浪默认开放并区分草稿试玩与正式运行态
|
## 2026-05-19 汪汪声浪默认开放并区分草稿试玩与正式运行态
|
||||||
|
|
||||||
- 背景:`bark-battle` 已具备草稿结果页、发布链路与运行态 API,继续在入口层标记“敬请期待”会阻断创作闭环;同时草稿试玩不应污染正式成绩统计。
|
- 背景:`bark-battle` 已具备草稿结果页、发布链路与运行态 API,继续在入口层标记“敬请期待”会阻断创作闭环;同时草稿试玩不应污染正式成绩统计。
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
## 记录格式
|
## 记录格式
|
||||||
|
|
||||||
```md
|
```md
|
||||||
|
|
||||||
## 问题标题
|
## 问题标题
|
||||||
|
|
||||||
- 现象:看到什么错误或异常行为
|
- 现象:看到什么错误或异常行为
|
||||||
@@ -1289,3 +1290,51 @@
|
|||||||
- 处理:`platformEntryTypes.ts` 必须注册 `jump-hop-workspace/generating/result/runtime/gallery-detail`;`appPageRoutes.ts` 必须补 `/creation/jump-hop/workspace`、`/creation/jump-hop/generating`、`/creation/jump-hop/result`、`/gallery/jump-hop/detail`、`/runtime/jump-hop`;`PlatformEntryFlowShellImpl.tsx` 必须持有 JumpHop session/work/run/gallery/runtimeReturnStage/generationState/error/busy,并提供 `mapJumpHopWorkToPublicWorkDetail`;`RpgEntryHomeView.tsx` 的公开卡片类型描述要给 JumpHop 单独返回 `跳一跳`。
|
- 处理:`platformEntryTypes.ts` 必须注册 `jump-hop-workspace/generating/result/runtime/gallery-detail`;`appPageRoutes.ts` 必须补 `/creation/jump-hop/workspace`、`/creation/jump-hop/generating`、`/creation/jump-hop/result`、`/gallery/jump-hop/detail`、`/runtime/jump-hop`;`PlatformEntryFlowShellImpl.tsx` 必须持有 JumpHop session/work/run/gallery/runtimeReturnStage/generationState/error/busy,并提供 `mapJumpHopWorkToPublicWorkDetail`;`RpgEntryHomeView.tsx` 的公开卡片类型描述要给 JumpHop 单独返回 `跳一跳`。
|
||||||
- 验证:`npm run typecheck`,并跑 `npm test -- src/routing/appPageRoutes.test.ts` 覆盖 JumpHop 阶段路径。
|
- 验证:`npm run typecheck`,并跑 `npm test -- src/routing/appPageRoutes.test.ts` 覆盖 JumpHop 阶段路径。
|
||||||
- 关联:`src/components/platform-entry/platformEntryTypes.ts`、`src/routing/appPageRoutes.ts`、`src/components/platform-entry/PlatformEntryFlowShellImpl.tsx`、`src/components/rpg-entry/RpgEntryHomeView.tsx`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
- 关联:`src/components/platform-entry/platformEntryTypes.ts`、`src/routing/appPageRoutes.ts`、`src/components/platform-entry/PlatformEntryFlowShellImpl.tsx`、`src/components/rpg-entry/RpgEntryHomeView.tsx`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|
||||||
|
## image2 dry-run 带参考图时不要直接打印 data URL
|
||||||
|
|
||||||
|
- 现象:使用 VectorEngine `gpt-image-2-all` 生成带参考图的概念图时,如果 dry-run 直接打印完整请求体,参考图会被转成超长 `data:image/png;base64,...`,终端日志会被数百万字符淹没。
|
||||||
|
- 原因:生成请求支持 `image` 数组传入 data URL 参考图;dry-run 如果复用 live 请求体输出,就会把参考图内容完整打印。
|
||||||
|
- 处理:dry-run 输出摘要,只保留 `imageReferenceCount`、尺寸、模型和 prompt,不输出完整 base64。live 请求仍按实际需要传 `image` 数组。
|
||||||
|
- 验证:执行 `node scripts/generate-edutainment-tv-map-concepts.mjs --dry-run`,输出应只显示 `imageReferenceCount: 1`,不出现完整 base64。
|
||||||
|
- 关联:`scripts/generate-edutainment-tv-map-concepts.mjs`、`docs/design/【前端体验】寓教于乐电视端乐园地图入口概念图-2026-05-18.md`。
|
||||||
|
|
||||||
|
## 生成图资产不能只拼 generated legacy path
|
||||||
|
|
||||||
|
- 现象:结果页或运行态拿到 `/generated-*-assets/.../image.png` 后图片不显示;前端 `ResolvedAssetImage` 会先调用 `/api/assets/read-url?legacyPublicPath=...`,但换签后的 OSS URL 仍指向不存在对象。
|
||||||
|
- 原因:后端只写了看起来像生成图的 legacy path,没有真正调用 image2、上传 OSS、登记 `asset_object` 并绑定实体。`/api/assets/read-url` 只负责签名读取,不会凭空生成或补写对象。
|
||||||
|
- 处理:玩法生成链路必须在 `api-server` 完成外部副作用:调用 VectorEngine `gpt-image-2-all`,用 `GeneratedImageAssetAdapter` 准备 `PutObject`,上传 OSS 私有对象,调用 `confirm_asset_object` 和 `bind_asset_object_to_entity`,再把返回的 `legacyPublicPath` 写入玩法 profile。
|
||||||
|
- 验证:`cargo check -p api-server --manifest-path server-rs/Cargo.toml`;契约测试应断言前端 JSON 自带的 `hitObjectAsset` 会被忽略,spacetime-client 定向测试应断言缺少服务端注入的真实 `hitObjectAsset` 时不能编译;浏览器 Network 中 generated 图片应先换签,签名 URL 指向已存在对象。
|
||||||
|
- 关联:`server-rs/crates/api-server/src/wooden_fish.rs`、`server-rs/crates/spacetime-client/src/wooden_fish.rs`、`src/components/ResolvedAssetImage.tsx`、`src/services/assetReadUrlService.ts`。
|
||||||
|
|
||||||
|
## `dev:spacetime` 启动后 3101 又断开先查 publish 是否被 spacetime.json 干扰
|
||||||
|
|
||||||
|
- 现象:浏览器报 `Failed to initiate WebSocket connection`,目标为 `ws://127.0.0.1:3101/v1/database/<db>/subscribe`,端口检查发现 `3101` 没有长期监听;手动运行 `npm run dev:spacetime` 可看到 standalone 短暂启动后退出,发布阶段报 `No database target matches '<db>'`。
|
||||||
|
- 原因:SpacetimeDB CLI 会读取仓库根目录 `spacetime.json`。如果本地发布命令没有显式 `--no-config`,CLI 可能按配置文件里的 target 解析数据库,覆盖脚本已传入的 `.env.local` 数据库名和 `--server`,导致 publish 失败;`dev.mjs` 捕获错误后会清理刚启动的 standalone,于是浏览器看到 3101 被拒绝连接。
|
||||||
|
- 处理:`scripts/dev.mjs` 的本地 publish 固定追加 `--no-config`,只使用脚本解析出的数据库名、module path 和实际 SpacetimeDB server。排查时前台运行 `npm run dev:spacetime -- --no-interactive`,若看到该错误,先确认脚本是否仍带 `--no-config`,再查 `.env.local` / `spacetime.local.json` 的数据库名。
|
||||||
|
- 验证:`npm run test -- scripts/dev.test.ts` 覆盖 publish 参数包含 `--no-config`;`npm run dev:spacetime -- --no-interactive` 后 `http://127.0.0.1:3101/v1/ping` 应保持 200。
|
||||||
|
- 关联:`scripts/dev.mjs`、`scripts/dev.test.ts`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 本地 api-server 启动订阅 401 先查 Web identity token 注入
|
||||||
|
|
||||||
|
- 现象:`npm run dev` 启动到 api-server 恢复认证快照时,日志出现 `Failed to initiate WebSocket connection ... /v1/database/<db>/subscribe?compression=Brotli: HTTP error: 401 Unauthorized`。
|
||||||
|
- 原因:SpacetimeDB SDK 订阅需要 Web API identity token;本地 `.env.local` 常把 `GENARRATIVE_SPACETIME_TOKEN` 留空,只靠 CLI 登录态 publish 成功并不能让 api-server 的 WebSocket subscribe 获得权限。
|
||||||
|
- 处理:`scripts/dev.mjs` 在 SpacetimeDB 就绪后调用 `/v1/identity` 创建当前进程专用 Web API identity token,并只注入本次 `api-server` 环境;不要把临时 token 写进 `.env.local` 或日志。若仍报 401,先确认是否使用了项目脚本启动、日志是否出现 `已创建本地 Web identity`,以及 `GENARRATIVE_SPACETIME_SERVER_URL` / 数据库名是否指向本次启动的实例。
|
||||||
|
- 验证:`npm run test -- scripts/dev.test.ts`;重新运行 `npm run dev` 后 api-server 启动日志不再出现上述 subscribe 401,`/healthz` 返回 200。
|
||||||
|
- 关联:`scripts/dev.mjs`、`scripts/dev.test.ts`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 创作作品架消失先查入口配置 procedure 与本地库权限
|
||||||
|
|
||||||
|
- 现象:寓教于乐或创作中心下草稿 / 已发布作品突然整块消失,`GET /api/creation-entry/config` 返回 `502`,details 中为 `No such procedure`。
|
||||||
|
- 原因:本地 `.env.local` 或 `spacetime.local.json` 指向的 SpacetimeDB 库没有发布当前 `spacetime-module`,或当前 CLI 身份无权发布该库;例如旧 `xushi-p4wfr` 库缺 `get_creation_entry_config` 时,前端拿不到入口配置就不会渲染作品架。
|
||||||
|
- 处理:优先切换到拥有目标库权限的 SpacetimeDB 身份后重新运行 `npm run dev` 完成发布;若只是本地验证,可用 gitignored 的 `spacetime.local.json` 指向可发布的本地库。debug 构建的 `api-server` 对入口配置缺 procedure 会使用后端默认入口配置兜底,避免作品架因本地库漂移整块空白。
|
||||||
|
- 验证:`curl.exe -i http://127.0.0.1:8082/api/creation-entry/config` 返回 `200` 且包含 `baby-object-match`;前端草稿页作品架重新渲染。
|
||||||
|
- 关联:`server-rs/crates/api-server/src/state.rs`、`server-rs/crates/api-server/src/creation_entry_config.rs`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。
|
||||||
|
|
||||||
|
## 存档选择入口不要只藏在“玩过”弹窗里
|
||||||
|
|
||||||
|
- 现象:用户有 RPG / 拼图运行态存档,但平台底部 `草稿` Tab 只展示作品架,个人中心只有点击 `玩过` 后才可能看到“可继续”,导致看起来没有存档选择入口。
|
||||||
|
- 原因:`/api/profile/save-archives` 已在入口 bootstrap 加载,但前端只把 `saveEntries` 注入 `ProfilePlayedWorksModal`;没有独立的存档入口。
|
||||||
|
- 处理:个人中心 `常用功能` 必须保留 `存档` 快捷入口,点击后打开独立存档选择弹窗并复用 `SaveArchiveCard`;恢复仍走 `/api/profile/save-archives/{worldKey}`,拼图存档继续走拼图 resume 分支,RPG 走 `handleContinueGame(snapshot)`。
|
||||||
|
- 验证:`npm run test -- src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx -t "profile page exposes save archive picker"`。
|
||||||
|
- 关联:`src/components/rpg-entry/RpgEntryHomeView.tsx`、`src/components/platform-entry/PlatformEntryFlowShellImpl.tsx`、`src/components/rpg-entry/useRpgEntryBootstrap.ts`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ Genarrative / 陶泥儿是一个 AI 原生互动内容与小游戏平台,把 A
|
|||||||
|
|
||||||
- RPG / 自定义世界创作与运行时。
|
- RPG / 自定义世界创作与运行时。
|
||||||
- 拼图玩法创作、草稿、发布、运行态和排行榜。
|
- 拼图玩法创作、草稿、发布、运行态和排行榜。
|
||||||
|
- 敲木鱼玩法创作、草稿、发布、运行态、公开详情和分享码。
|
||||||
- 抓大鹅 Match3D 创作、2D 多视角素材生成、发布和运行态。
|
- 抓大鹅 Match3D 创作、2D 多视角素材生成、发布和运行态。
|
||||||
- 大鱼吃小鱼、方洞挑战、视觉小说、汪汪声浪和儿童向寓教于乐玩法。
|
- 大鱼吃小鱼、方洞挑战、视觉小说、汪汪声浪和儿童向寓教于乐玩法。
|
||||||
- 账号、短信 / 密码 / 微信登录、个人资料、任务、钱包、邀请码、充值、反馈、法律信息和后台管理。
|
- 账号、短信 / 密码 / 微信登录、个人资料、任务、钱包、邀请码、充值、反馈、法律信息和后台管理。
|
||||||
|
|||||||
26
CONTEXT.md
@@ -18,6 +18,32 @@ _Avoid_: 为每个玩法单独发明素材流水线、把系列素材建模成
|
|||||||
|
|
||||||
## Language
|
## Language
|
||||||
|
|
||||||
|
### Wooden Fish
|
||||||
|
|
||||||
|
**敲木鱼**:
|
||||||
|
轻量点击型互动玩法,玩家在单次运行中点击非功能区敲击中央物品,触发敲击音效、敲击动画、随机飘字和本次运行内的词条计数。
|
||||||
|
_Avoid_: 长期功德账本、排行榜玩法、全局账户累计
|
||||||
|
|
||||||
|
**敲击物图案**:
|
||||||
|
敲木鱼作品中被玩家点击敲击的单张物品图案;默认模板使用内置透明 PNG `/wooden-fish/default-hit-object.png`,用户自定义关键词或上传图时再使用 image2 生成最终资产,上传图只作为 image2 参考。
|
||||||
|
_Avoid_: 直接把上传图作为运行态素材、系列素材图集
|
||||||
|
|
||||||
|
**敲木鱼背景环境图**:
|
||||||
|
敲木鱼作品中的竖屏 9:16 背景资产;由后端在敲击物图案生成后,以新敲击物图案作为主题和画风参考,再结合用户原始题材关键词或参考图主题调用 image2 生成。背景只适配敲击物主题和画风,不包含敲击物本体或木槌互动物品。
|
||||||
|
_Avoid_: 把背景当封面图、在背景里重复绘制敲击物、让前端临时拼背景
|
||||||
|
|
||||||
|
**敲击音效**:
|
||||||
|
敲木鱼作品中每次有效敲击播放的短音频资产,可由描述生成、文件上传或麦克风录制产生,最终统一写回作品的敲击音效资产槽位。
|
||||||
|
_Avoid_: 背景音乐、长音频轨道、运行态实时录音
|
||||||
|
|
||||||
|
**飘字**:
|
||||||
|
每次有效敲击后从作品配置中等概率抽取词条,并在敲击物上方以“词条+1”短暂漂浮显示的文本;配置里只保存幸运、健康、财富、姻缘、幸福、事业、成功、功德等词条名本身。
|
||||||
|
_Avoid_: 带权重奖励、账户属性、可结算货币
|
||||||
|
|
||||||
|
**单次 run 计数**:
|
||||||
|
敲木鱼运行态只在当前 run 内累计总敲击次数和已出现飘字词条计数,run 结束后作为摘要保存,不形成账号级长期账本。
|
||||||
|
_Avoid_: 用户永久功德值、跨作品累计值、排行榜积分
|
||||||
|
|
||||||
### Bark Battle
|
### Bark Battle
|
||||||
|
|
||||||
**汪汪声浪大作战**:
|
**汪汪声浪大作战**:
|
||||||
|
|||||||
36
docs/design/【前端体验】寓教于乐电视端乐园地图入口概念图-2026-05-18.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# 寓教于乐电视端乐园地图入口概念图
|
||||||
|
|
||||||
|
更新时间:`2026-05-18`
|
||||||
|
|
||||||
|
## 背景
|
||||||
|
|
||||||
|
寓教于乐板块需要一个面向电视端 / 横屏大屏的图形化入口,整体感觉接近主题乐园地图,但必须保留 Genarrative 现有的明亮卡通绘本插画风,不借用任何真实品牌乐园或版权角色。
|
||||||
|
|
||||||
|
## 目标
|
||||||
|
|
||||||
|
- 远看像一个完整乐园地图,近看能分辨每个玩法入口。
|
||||||
|
- 入口区域清晰分区,后续可以叠加焦点框、按钮和中文标题。
|
||||||
|
- 中心和下方保留足够留白,适合遥控器焦点、儿童角色或主推荐位。
|
||||||
|
- 风格保持和寓教于乐现有草地舞台资源一致。
|
||||||
|
|
||||||
|
## 本次概念方向
|
||||||
|
|
||||||
|
1. 环形乐园岛:中央草地广场 + 外圈入口环路。
|
||||||
|
2. 展开绘本地图:横向展开的大绘本页,左右页自然衔接。
|
||||||
|
3. 云朵空中岛:多个浮岛通过彩虹桥和云朵步道连接。
|
||||||
|
4. 草地舞台地图:更接近实际运行态的横屏草地入口首屏。
|
||||||
|
|
||||||
|
## 推荐方向
|
||||||
|
|
||||||
|
优先推荐 `草地舞台地图` 作为后续落地主方向,因为它与现有寓教于乐草地舞台最接近,且中央下方留白最适合后续叠加交互焦点。
|
||||||
|
|
||||||
|
## 生图脚本
|
||||||
|
|
||||||
|
- 生成脚本:`scripts/generate-edutainment-tv-map-concepts.mjs`
|
||||||
|
- 默认尺寸:`2048x1152`
|
||||||
|
- 风格参考:`public/child-motion-demo/picture-book-grass-stage.png`
|
||||||
|
- 输出目录:`output/imagegen/edutainment-tv-map-entry-concepts-20260518/`
|
||||||
|
|
||||||
|
## 说明
|
||||||
|
|
||||||
|
本次结果是设计概念稿,不直接进入 `public/` 正式资源目录。后续若要继续细化,可在同一脚本里增加新的横屏变体,并保持“不写文字、不露品牌 IP、绘本插画风”这三条底线。
|
||||||
384
docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md
Normal file
@@ -0,0 +1,384 @@
|
|||||||
|
# 敲木鱼玩法模板 PRD 2026-05-20
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
新增一个可创作、可试玩、可发布的轻量休闲玩法模板:
|
||||||
|
|
||||||
|
```text
|
||||||
|
敲木鱼
|
||||||
|
```
|
||||||
|
|
||||||
|
模板按平台新增玩法 SOP 接入完整闭环:
|
||||||
|
|
||||||
|
```text
|
||||||
|
创作入口 -> 工作台 -> 生成页 -> 结果页 -> 试玩 -> 发布 -> 运行态 -> 公开详情/分享
|
||||||
|
```
|
||||||
|
|
||||||
|
首版默认屏幕中央展示内置卡通透明敲击物图案 `/wooden-fish/default-hit-object.png`。玩家点击运行态非功能区时触发一次敲击:播放敲击音效、敲击物图案执行被敲击动画,并在敲击物上方随机飘出一条祝福词。顶部计数器只在某条祝福词首次出现时创建,之后该词每次出现都累加。计数仅属于当前单次 run,不进入账号长期账本。
|
||||||
|
|
||||||
|
## 2. 模板定位
|
||||||
|
|
||||||
|
模板 ID:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wooden-fish
|
||||||
|
```
|
||||||
|
|
||||||
|
用户展示名:
|
||||||
|
|
||||||
|
```text
|
||||||
|
敲木鱼
|
||||||
|
```
|
||||||
|
|
||||||
|
公开作品号前缀:
|
||||||
|
|
||||||
|
```text
|
||||||
|
WF-*
|
||||||
|
```
|
||||||
|
|
||||||
|
体验关键词:
|
||||||
|
|
||||||
|
1. 单屏点击;
|
||||||
|
2. 轻量解压;
|
||||||
|
3. 飘字反馈;
|
||||||
|
4. 单局累计;
|
||||||
|
5. 可自定义敲击物、敲击音效和祝福词。
|
||||||
|
|
||||||
|
## 3. 与拼图创作流程的复用边界
|
||||||
|
|
||||||
|
可以复用:
|
||||||
|
|
||||||
|
1. 创作入口配置、入口开关和作品架;
|
||||||
|
2. 表单/图片输入工作台;
|
||||||
|
3. 生成过程页和生成中恢复;
|
||||||
|
4. 结果页的返回编辑、局部重生成、试玩、发布;
|
||||||
|
5. 公开列表、公开详情、分享码和推荐流分发;
|
||||||
|
6. 平台资产对象、OSS 私有读取换签和音频资产持久化能力。
|
||||||
|
|
||||||
|
不复用:
|
||||||
|
|
||||||
|
1. 拼图关卡、棋盘、拼块、排行榜和关卡推进语义;
|
||||||
|
2. 跳一跳地块图集和蓄力判定语义;
|
||||||
|
3. 抓大鹅物品消除、五视角图集和容器语义;
|
||||||
|
4. 任何长期功德账本、账号维度排行榜或全局累计。
|
||||||
|
|
||||||
|
## 4. 创作工具平台接入声明
|
||||||
|
|
||||||
|
- 工作台模式:表单/图片输入创作工作台
|
||||||
|
- 创作链路:入口 -> 工作台 -> 生成页 -> 结果页 -> 试玩 -> 发布 -> 运行态
|
||||||
|
- 单图资产槽位:
|
||||||
|
- `slotId=hit-object`
|
||||||
|
- `slotType=hit-object-image`
|
||||||
|
- `slotName=敲击物图案`
|
||||||
|
- 提示词来源:`hitObjectPrompt` 与可选 `hitObjectReferenceImageSrc`
|
||||||
|
- 写回字段:`hitObjectAsset`
|
||||||
|
- 是否允许历史图:允许
|
||||||
|
- 是否允许 AI 重绘:允许;上传图只作为 image2 参考,最终运行态只消费 image2 生成图
|
||||||
|
- `slotId=background`
|
||||||
|
- `slotType=background-image`
|
||||||
|
- `slotName=背景环境图`
|
||||||
|
- 提示词来源:第一步生成的敲击物图案与用户原始题材关键词 / 参考图主题
|
||||||
|
- 写回字段:`backgroundAsset`
|
||||||
|
- 是否允许历史图:不单独选择;由敲击物图案生成链路派生
|
||||||
|
- 是否允许 AI 重绘:允许;随敲击物图案一起重生成
|
||||||
|
- 系列素材槽位:无;首版只有敲击物图案与背景环境图两个单图资产,不生成图集
|
||||||
|
- 音频资产槽位:
|
||||||
|
- `slotId=hit-sound`
|
||||||
|
- `slotType=hit-sound-audio`
|
||||||
|
- `slotName=敲击音效`
|
||||||
|
- 来源:`hitSoundPrompt` 生成,或上传/麦克风录制音频
|
||||||
|
- 写回字段:`hitSoundAsset`
|
||||||
|
- 描述生成能力:复用通用创作音频接口 `/api/creation/audio/sound-effect` 的 VectorEngine Vidu 音效生成与 OSS 持久化链路
|
||||||
|
- API 命名空间:
|
||||||
|
- `/api/creation/wooden-fish/...`
|
||||||
|
- `/api/runtime/wooden-fish/...`
|
||||||
|
- 业务真相:
|
||||||
|
- 后端裁决并持久化 session、work profile、发布状态、run 摘要和公开投影;
|
||||||
|
- 前端只负责点击低延迟表现、音频播放、动画、飘字渲染和定期 checkpoint。
|
||||||
|
- 创作工具模式例外:无
|
||||||
|
- 验证命令:
|
||||||
|
- `npm run check:encoding`
|
||||||
|
- `npm run typecheck`
|
||||||
|
- `cargo test -p shared-contracts wooden_fish --manifest-path server-rs/Cargo.toml`
|
||||||
|
- `cargo test -p module-wooden-fish --manifest-path server-rs/Cargo.toml`
|
||||||
|
- `cargo check -p api-server --manifest-path server-rs/Cargo.toml`
|
||||||
|
- `npm run spacetime:generate`
|
||||||
|
- `npm run check:spacetime-schema`
|
||||||
|
- `npm run dev:api-server` 后检查 `/healthz`
|
||||||
|
|
||||||
|
## 5. 创作输入
|
||||||
|
|
||||||
|
工作台提交结构化 payload,不提交聊天消息。
|
||||||
|
|
||||||
|
必填字段:
|
||||||
|
|
||||||
|
1. `templateId = "wooden-fish"`;
|
||||||
|
2. `workTitle`:作品标题;
|
||||||
|
3. `hitObjectPrompt`:用户想敲的对象关键词或描述,默认“默认敲击物图案,圆润木质质感,透明背景”;
|
||||||
|
4. `floatingWords[]`:祝福词,最多 8 条,不填或清空时使用默认祝福词。
|
||||||
|
|
||||||
|
可选字段:
|
||||||
|
|
||||||
|
1. `workDescription`:作品简介;
|
||||||
|
2. `themeTags[]`:最多 6 个标签;
|
||||||
|
3. `hitObjectReferenceImageSrc`:上传或历史图引用,只能作为 image2 参考,不可直接进入运行态;
|
||||||
|
4. `hitSoundPrompt`:生成音效描述;
|
||||||
|
5. `hitSoundAsset`:用户上传或录音产生的音频资产。
|
||||||
|
|
||||||
|
默认祝福词:
|
||||||
|
|
||||||
|
```text
|
||||||
|
幸运
|
||||||
|
健康
|
||||||
|
财富
|
||||||
|
姻缘
|
||||||
|
幸福
|
||||||
|
事业
|
||||||
|
成功
|
||||||
|
功德
|
||||||
|
```
|
||||||
|
|
||||||
|
`floatingWords[]` 保存词条名本身,不保存 `+1` 后缀;运行态每次敲击时再把飘字展示为“词条+1”。
|
||||||
|
|
||||||
|
## 6. 生成规则
|
||||||
|
|
||||||
|
### 6.1 敲击物图案与背景环境图
|
||||||
|
|
||||||
|
默认模板在用户未自定义关键词且未上传参考图时,`compile-draft` 使用内置透明 PNG `/wooden-fish/default-hit-object.png` 写回 `hitObjectAsset`,`generationProvider="bundled-default"`。这张图来自 image2 对原始参考图的卡通风格化重绘,固定为模板默认资源,避免默认关键词在每次生成时改变造型。即使使用内置默认敲击物,首版仍需要生成 `backgroundAsset`,背景环境图使用默认敲击物作为主题和画风参考。
|
||||||
|
|
||||||
|
用户输入自定义关键词、上传参考图,或在结果页主动重生成敲击物时,`compile-draft` 与 `regenerate-hit-object` 必须先为敲击物图案生成 image2 单图资产,再基于新敲击物图案生成背景环境图,并由 `api-server` 注入写回 `hitObjectAsset` 与 `backgroundAsset`。前端 action 请求不得自带 `hitObjectAsset` 或 `backgroundAsset` 短路生成。如果用户上传参考图,后端只能把该图作为 image2 参考图或主题参考;运行态不得直接使用上传图。
|
||||||
|
|
||||||
|
敲击物图案生成流程固定为:
|
||||||
|
|
||||||
|
1. 调用 VectorEngine `/v1/images/edits`,模型固定为 `gpt-image-2`;
|
||||||
|
2. multipart 参考图固定包含默认木鱼图 `/wooden-fish/default-hit-object.png`,作为基础结构和画风参考;
|
||||||
|
3. 若用户上传参考图,该图只作为新主题参考追加到同一次 image2 edits 请求,不直接进入运行态;
|
||||||
|
4. 尺寸固定 `1:1`,透明底;
|
||||||
|
5. 提示词严格使用:
|
||||||
|
|
||||||
|
```text
|
||||||
|
生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。
|
||||||
|
新主题为:(用户提供参考图或用户输入关键词)
|
||||||
|
```
|
||||||
|
|
||||||
|
背景环境图生成流程固定为:
|
||||||
|
|
||||||
|
1. 调用 VectorEngine `/v1/images/edits`,模型固定为 `gpt-image-2`;
|
||||||
|
2. multipart 参考图固定为第一步新生成的敲击物图案;默认未生成新敲击物时使用内置默认敲击物图案;
|
||||||
|
3. 尺寸固定竖屏 `9:16`;
|
||||||
|
4. 背景环境图只适配新敲击物主题和画风,背景中不得包含新敲击物本体,也不得增加木槌互动物品;
|
||||||
|
5. 提示词严格使用:
|
||||||
|
|
||||||
|
```text
|
||||||
|
生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。
|
||||||
|
主题为:(用户提供参考图或用户输入关键词)
|
||||||
|
```
|
||||||
|
|
||||||
|
落库链路固定为:`api-server` 调用 VectorEngine `/v1/images/edits` -> 服务端上传 OSS 私有对象 -> `confirm_asset_object` 登记资产对象 -> `bind_asset_object_to_entity` 绑定到 `entityKind='wooden_fish_work'`。敲击物绑定 `slot='hit_object'`、`assetKind='wooden_fish_hit_object'`,背景绑定 `slot='background'`、`assetKind='wooden_fish_background'`。写回时把 `legacyPublicPath` 分别写入 `hitObjectAsset.imageSrc` 与 `backgroundAsset.imageSrc`。不得只拼 `/generated-wooden-fish-assets/...` 占位路径;前端会对 generated legacy path 走 `/api/assets/read-url` 换签,OSS 中没有真实对象时图片无法显示。
|
||||||
|
|
||||||
|
默认图案要求:
|
||||||
|
|
||||||
|
1. 中央主体使用 `/wooden-fish/default-hit-object.png`;
|
||||||
|
2. 透明背景;
|
||||||
|
3. 适合移动端居中展示;
|
||||||
|
4. 不包含 UI、按钮、说明文字、水印或品牌标识;
|
||||||
|
5. 图片主体需留出敲击动画缩放空间。
|
||||||
|
|
||||||
|
### 6.2 敲击音效
|
||||||
|
|
||||||
|
音效统一写回 `hitSoundAsset`。
|
||||||
|
|
||||||
|
生成或写回规则:
|
||||||
|
|
||||||
|
1. 若 payload 已包含上传/录音音频资产,`compile-draft` 跳过音效生成,直接持久化该资产;
|
||||||
|
2. 若 payload 只包含 `hitSoundPrompt`,`api-server` 复用通用创作音频能力提交 VectorEngine Vidu `sound_effect` 任务,轮询生成结果,下载音频,写入 OSS 私有对象,登记 `asset_object`,并绑定到 `entityKind='wooden_fish_work'`、`slot='hit_sound'`、`assetKind='wooden_fish_hit_sound'`,最后注入 `hitSoundAsset`;
|
||||||
|
3. 若两者都没有,后端生成默认“清脆短促木鱼敲击声”;
|
||||||
|
4. 音效资产必须包含可播放地址、对象键、asset object id、来源和可选时长;
|
||||||
|
5. 通用创作音频接口对 `wooden_fish` 的 `hit_sound` 目标不得返回 `410 Gone`,对应 `storagePrefix='wooden_fish_assets'`;
|
||||||
|
6. `spacetime-client` 不得自行合成 `/generated-wooden-fish-assets/...` 音效占位路径,缺少真实 `hitSoundAsset` 时必须拒绝编译。
|
||||||
|
|
||||||
|
### 6.3 封面
|
||||||
|
|
||||||
|
首版封面使用 `hitObjectAsset.imageSrc` 作为 `coverImageSrc`。背景环境图不作为封面图,不单独新增第三次图片生成。
|
||||||
|
|
||||||
|
## 7. 契约草案
|
||||||
|
|
||||||
|
`WoodenFishDraft` 至少包含:
|
||||||
|
|
||||||
|
1. `templateId = "wooden-fish"`;
|
||||||
|
2. `templateName = "敲木鱼"`;
|
||||||
|
3. `profileId`;
|
||||||
|
4. `workTitle`;
|
||||||
|
5. `workDescription`;
|
||||||
|
6. `themeTags[]`;
|
||||||
|
7. `hitObjectPrompt`;
|
||||||
|
8. `hitObjectReferenceImageSrc`;
|
||||||
|
9. `hitSoundPrompt`;
|
||||||
|
10. `floatingWords[]`;
|
||||||
|
11. `hitObjectAsset`;
|
||||||
|
12. `backgroundAsset`;
|
||||||
|
13. `hitSoundAsset`;
|
||||||
|
14. `coverImageSrc`;
|
||||||
|
15. `generationStatus`。
|
||||||
|
|
||||||
|
`WoodenFishImageAsset` 至少包含:
|
||||||
|
|
||||||
|
1. `assetId`;
|
||||||
|
2. `imageSrc`;
|
||||||
|
3. `imageObjectKey`;
|
||||||
|
4. `assetObjectId`;
|
||||||
|
5. `generationProvider`;
|
||||||
|
6. `prompt`;
|
||||||
|
7. `width`;
|
||||||
|
8. `height`。
|
||||||
|
|
||||||
|
`WoodenFishAudioAsset` 至少包含:
|
||||||
|
|
||||||
|
1. `assetId`;
|
||||||
|
2. `audioSrc`;
|
||||||
|
3. `audioObjectKey`;
|
||||||
|
4. `assetObjectId`;
|
||||||
|
5. `source = generated | uploaded | recorded | placeholder`;
|
||||||
|
6. `prompt`;
|
||||||
|
7. `durationMs`。
|
||||||
|
|
||||||
|
`WoodenFishRunSnapshot` 至少包含:
|
||||||
|
|
||||||
|
1. `runId`;
|
||||||
|
2. `profileId`;
|
||||||
|
3. `ownerUserId`;
|
||||||
|
4. `status = playing | finished`;
|
||||||
|
5. `totalTapCount`;
|
||||||
|
6. `wordCounters[]`;
|
||||||
|
7. `startedAtMs`;
|
||||||
|
8. `updatedAtMs`;
|
||||||
|
9. `finishedAtMs`。
|
||||||
|
|
||||||
|
## 8. API 草案
|
||||||
|
|
||||||
|
HTTP 路由:
|
||||||
|
|
||||||
|
```text
|
||||||
|
POST /api/creation/wooden-fish/sessions
|
||||||
|
GET /api/creation/wooden-fish/sessions/{sessionId}
|
||||||
|
POST /api/creation/wooden-fish/sessions/{sessionId}/actions
|
||||||
|
GET /api/creation/wooden-fish/works/{profileId}
|
||||||
|
POST /api/creation/wooden-fish/works/{profileId}/publish
|
||||||
|
GET /api/runtime/wooden-fish/works/{profileId}
|
||||||
|
POST /api/runtime/wooden-fish/runs
|
||||||
|
POST /api/runtime/wooden-fish/runs/{runId}/checkpoint
|
||||||
|
POST /api/runtime/wooden-fish/runs/{runId}/finish
|
||||||
|
GET /api/runtime/wooden-fish/gallery
|
||||||
|
GET /api/runtime/wooden-fish/gallery/{publicWorkCode}
|
||||||
|
```
|
||||||
|
|
||||||
|
动作类型:
|
||||||
|
|
||||||
|
```text
|
||||||
|
compile-draft
|
||||||
|
regenerate-hit-object
|
||||||
|
generate-hit-sound
|
||||||
|
replace-hit-sound
|
||||||
|
update-work-meta
|
||||||
|
update-floating-words
|
||||||
|
publish
|
||||||
|
start-run
|
||||||
|
checkpoint
|
||||||
|
finish
|
||||||
|
```
|
||||||
|
|
||||||
|
`compile-draft` 是长耗时动作。前端进入生成页后应展示可恢复进度;如果请求失败,标记失败前必须复读 session,确认后端是否已经生成并写回草稿。
|
||||||
|
|
||||||
|
## 9. SpacetimeDB 表和 view
|
||||||
|
|
||||||
|
新增表:
|
||||||
|
|
||||||
|
1. `wooden_fish_agent_session`;
|
||||||
|
2. `wooden_fish_work_profile`,其中 `background_asset_json` 保存背景环境图资产快照;
|
||||||
|
3. `wooden_fish_runtime_run`;
|
||||||
|
4. `wooden_fish_event`。
|
||||||
|
|
||||||
|
新增 view:
|
||||||
|
|
||||||
|
1. `wooden_fish_gallery_card_view`:公开列表卡片投影,只暴露已发布作品;
|
||||||
|
2. `wooden_fish_gallery_view`:公开详情兼容投影,包含图案、音效和祝福词配置。
|
||||||
|
|
||||||
|
新增或调整表、procedure、view 后必须同步 `migration.rs`、后端表目录、生成 bindings,并执行 `npm run check:spacetime-schema`。
|
||||||
|
|
||||||
|
## 10. 结果页能力
|
||||||
|
|
||||||
|
结果页必须展示:
|
||||||
|
|
||||||
|
1. 作品标题和简介;
|
||||||
|
2. 竖屏背景环境图预览;
|
||||||
|
3. 敲击物图案;
|
||||||
|
4. 敲击音效试听;
|
||||||
|
5. 祝福词配置;
|
||||||
|
6. 标签;
|
||||||
|
7. 试玩;
|
||||||
|
8. 发布;
|
||||||
|
9. 返回编辑。
|
||||||
|
|
||||||
|
结果页必须支持:
|
||||||
|
|
||||||
|
1. 重生成敲击物图案;
|
||||||
|
2. 生成、上传或替换敲击音效;
|
||||||
|
3. 修改标题、简介和标签;
|
||||||
|
4. 修改祝福词,最多 8 条。
|
||||||
|
|
||||||
|
图案重生成和音效生成是独立局部生成态,不得把已有可查看结果重新变成不可打开的全局生成中。
|
||||||
|
|
||||||
|
## 11. 运行态规则
|
||||||
|
|
||||||
|
运行态采用全屏单击模型。
|
||||||
|
|
||||||
|
功能区:
|
||||||
|
|
||||||
|
1. 顶部计数器;
|
||||||
|
2. 设置、暂停、返回、发布分享等按钮;
|
||||||
|
3. 结果弹层和音频授权提示。
|
||||||
|
|
||||||
|
点击规则:
|
||||||
|
|
||||||
|
1. 点击非功能区才算一次敲击;
|
||||||
|
2. 每次敲击立即本地累加 `totalTapCount`;
|
||||||
|
3. 随机等概率从 `floatingWords[]` 中取一个词条;
|
||||||
|
4. 若词条首次出现,顶部创建对应计数器;
|
||||||
|
5. 后续同词条出现时对应计数器 +1;
|
||||||
|
6. 播放敲击音效;
|
||||||
|
7. 敲击物图案执行压缩、回弹或轻微震动动画;
|
||||||
|
8. 木鱼上方飘出“词条+1”并淡出。
|
||||||
|
|
||||||
|
音频播放:
|
||||||
|
|
||||||
|
1. 前端使用小复音池;
|
||||||
|
2. 设置最小播放间隔,避免极端连点导致浏览器抖动;
|
||||||
|
3. 点击计数不能因为音频节流而丢失;
|
||||||
|
4. 签名 URL 未就绪时先静音表现,不请求裸 generated 私有路径。
|
||||||
|
|
||||||
|
后端只保存 run 摘要,不保存每次点击的完整明细;`checkpoint` 和 `finish` 都写入总敲击次数与词条计数快照。
|
||||||
|
|
||||||
|
## 12. 公开链路
|
||||||
|
|
||||||
|
平台首页推荐、发现、公开详情、搜索、已玩作品和公开试玩统一按 `sourceType='wooden-fish'` 与 `WF-*` 公开作品号识别敲木鱼作品。
|
||||||
|
|
||||||
|
公开列表优先消费 `wooden_fish_gallery_card_view` 订阅缓存。公开详情如果卡片摘要不足以进入运行态,必须补读完整 work profile。
|
||||||
|
|
||||||
|
## 13. 验收
|
||||||
|
|
||||||
|
1. 创作入口能看到 `敲木鱼` 模板;
|
||||||
|
2. 工作台可以填写敲击物描述、上传参考图、配置音效和祝福词;
|
||||||
|
3. 提交后按默认木鱼参考图生成 image2 敲击物图案;
|
||||||
|
4. 提交后按新敲击物图案参考图生成 9:16 背景环境图;
|
||||||
|
5. 上传图不会直接进入运行态;
|
||||||
|
6. 用户上传或录制音效时跳过音效生成并持久化该资产;
|
||||||
|
7. 结果页能看到背景、图案、试听音效、编辑祝福词并试玩;
|
||||||
|
8. 运行态功能区点击不触发敲击;
|
||||||
|
9. 非功能区点击会计数、播放音效、播放敲击动画并飘字;
|
||||||
|
10. 顶部计数器只在词条首次出现时创建;
|
||||||
|
11. 连点不丢计数;
|
||||||
|
12. `checkpoint` 和 `finish` 只保存单次 run 摘要;
|
||||||
|
13. 作品可以发布、进入公开列表和公开详情;
|
||||||
|
14. `WF-*` 公开作品号能进入分享和运行态;
|
||||||
|
15. `npm run check:encoding` 通过;
|
||||||
|
16. schema 变更后 `npm run check:spacetime-schema` 通过。
|
||||||
@@ -49,6 +49,8 @@
|
|||||||
|
|
||||||
热身结束后展示“开始游戏”按钮,用户点击后进入宝贝识物首关本地 Demo。该入口只用于热身关后的本地体验验证;正式平台体验仍必须通过“宝贝识物”创作模板发布后,在寓教于乐板块进入。
|
热身结束后展示“开始游戏”按钮,用户点击后进入宝贝识物首关本地 Demo。该入口只用于热身关后的本地体验验证;正式平台体验仍必须通过“宝贝识物”创作模板发布后,在寓教于乐板块进入。
|
||||||
|
|
||||||
|
发现页的寓教于乐频道同时提供独立热身关入口,用户可直接进入 `/child-motion-demo`。
|
||||||
|
|
||||||
### 3.3 固定流程顺序
|
### 3.3 固定流程顺序
|
||||||
|
|
||||||
热身关必须按照以下顺序执行:
|
热身关必须按照以下顺序执行:
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ npm run check:server-rs-ddd
|
|||||||
|
|
||||||
`server-rs/crates/spacetime-client/src/mapper.rs` 只作为聚合入口,负责声明 `src/mapper/` 下的领域子模块并 re-export 原有 record / mapper 能力;不要在该文件继续堆叠大段映射实现。
|
`server-rs/crates/spacetime-client/src/mapper.rs` 只作为聚合入口,负责声明 `src/mapper/` 下的领域子模块并 re-export 原有 record / mapper 能力;不要在该文件继续堆叠大段映射实现。
|
||||||
|
|
||||||
当前子模块按调用领域拆分:`assets.rs`、`auth.rs`、`runtime.rs`、`runtime_profile.rs`、`custom_world.rs`、`puzzle.rs`、`match3d.rs`、`square_hole.rs`、`visual_novel.rs`、`big_fish.rs`、`story.rs`、`ai.rs`、`bark_battle.rs`、`combat.rs`、`inventory.rs`、`npc.rs`,跨领域轻量 helper 和共享 record 统一放在 `common.rs`。该拆分只改变 `spacetime-client` 文件组织,不改变 SpacetimeDB schema、生成绑定、procedure result 契约或外部 DTO;后续新增 mapper 时优先落到对应领域子模块,不得重新引入跨层 JSON 字符串兼容结构。
|
当前子模块按调用领域拆分:`assets.rs`、`auth.rs`、`runtime.rs`、`runtime_profile.rs`、`custom_world.rs`、`puzzle.rs`、`match3d.rs`、`jump_hop.rs`、`wooden_fish.rs`、`square_hole.rs`、`visual_novel.rs`、`big_fish.rs`、`story.rs`、`ai.rs`、`bark_battle.rs`、`combat.rs`、`inventory.rs`、`npc.rs`,跨领域轻量 helper 和共享 record 统一放在 `common.rs`。该拆分只改变 `spacetime-client` 文件组织,不改变 SpacetimeDB schema、生成绑定、procedure result 契约或外部 DTO;后续新增 mapper 时优先落到对应领域子模块,不得重新引入跨层 JSON 字符串兼容结构。
|
||||||
|
|
||||||
## API 路由分组
|
## API 路由分组
|
||||||
|
|
||||||
@@ -60,6 +60,7 @@ npm run check:server-rs-ddd
|
|||||||
- 自定义世界 / RPG:`/api/runtime/custom-world*`、`/api/story/*`、`/api/runtime/chat/*`。
|
- 自定义世界 / RPG:`/api/runtime/custom-world*`、`/api/story/*`、`/api/runtime/chat/*`。
|
||||||
- 拼图:`/api/runtime/puzzle/*`。
|
- 拼图:`/api/runtime/puzzle/*`。
|
||||||
- 抓大鹅 Match3D:`/api/creation/match3d/*`、`/api/runtime/match3d/*`。
|
- 抓大鹅 Match3D:`/api/creation/match3d/*`、`/api/runtime/match3d/*`。
|
||||||
|
- 敲木鱼:`/api/creation/wooden-fish/*`、`/api/runtime/wooden-fish/*`。
|
||||||
- 方洞挑战:`/api/creation/square-hole/*`、`/api/runtime/square-hole/*`。
|
- 方洞挑战:`/api/creation/square-hole/*`、`/api/runtime/square-hole/*`。
|
||||||
- 视觉小说:`/api/creation/visual-novel/*`、`/api/runtime/visual-novel/*`。
|
- 视觉小说:`/api/creation/visual-novel/*`、`/api/runtime/visual-novel/*`。
|
||||||
- 大鱼吃小鱼:`/api/runtime/big-fish/*`。
|
- 大鱼吃小鱼:`/api/runtime/big-fish/*`。
|
||||||
@@ -158,8 +159,10 @@ npm run check:server-rs-ddd
|
|||||||
- 图片生成:VectorEngine / APIMart / DashScope,密钥只在后端环境变量中。
|
- 图片生成:VectorEngine / APIMart / DashScope,密钥只在后端环境变量中。
|
||||||
- Match3D 物品 sheet:关卡整图完成后走 VectorEngine `/v1/images/edits` multipart `image`,模型为 `gpt-image-2`,`2K 1:1` 输出 `10*10` spritesheet;物品 sheet prompt 固定要求纯绿色绿幕背景,后端上传 OSS 前必须把绿幕扣成透明 PNG,并把透明整图写入 `itemSpritesheetImageSrc/itemSpritesheetImageObjectKey`。后端固定从该 sheet 解析并持久化 20 个物品、每个 5 个形态;通用系列素材图集的行列索引按每行 2 个物品计算,必须落在 `1..=10`,难度只决定运行态加载 3 / 9 / 15 / 20 种。
|
- Match3D 物品 sheet:关卡整图完成后走 VectorEngine `/v1/images/edits` multipart `image`,模型为 `gpt-image-2`,`2K 1:1` 输出 `10*10` spritesheet;物品 sheet prompt 固定要求纯绿色绿幕背景,后端上传 OSS 前必须把绿幕扣成透明 PNG,并把透明整图写入 `itemSpritesheetImageSrc/itemSpritesheetImageObjectKey`。后端固定从该 sheet 解析并持久化 20 个物品、每个 5 个形态;通用系列素材图集的行列索引按每行 2 个物品计算,必须落在 `1..=10`,难度只决定运行态加载 3 / 9 / 15 / 20 种。
|
||||||
- Match3D UI spritesheet 和背景派生图:关卡整图作为参考图并发生成 `1K 1:1` UI spritesheet 与 `1K 9:16` 背景图,模型均为 `gpt-image-2`。UI spritesheet prompt 固定要求纯绿色绿幕背景,后端上传 OSS 前必须把绿幕扣成透明 PNG;背景图必须合成为全画幅不透明 PNG。
|
- Match3D UI spritesheet 和背景派生图:关卡整图作为参考图并发生成 `1K 1:1` UI spritesheet 与 `1K 9:16` 背景图,模型均为 `gpt-image-2`。UI spritesheet prompt 固定要求纯绿色绿幕背景,后端上传 OSS 前必须把绿幕扣成透明 PNG;背景图必须合成为全画幅不透明 PNG。
|
||||||
|
- Match3D 1:1 容器 UI:VectorEngine `/v1/images/edits` multipart 参考图。该容器参考图是后端生图协议输入,必须通过 `include_bytes!` 随 `api-server` 编译进二进制,避免 API 单独发布或运行目录缺少 `public/` 时生成失败。
|
||||||
|
- 敲木鱼敲击物和背景环境图:VectorEngine `/v1/images/edits`,模型固定 `gpt-image-2`。敲击物支持 multipart 多参考图,第一张固定为后端内嵌默认木鱼图,用户上传图只作为新主题参考;背景环境图只使用新敲击物图作为参考。
|
||||||
- Hyper3D / Rodin:只保留后端安全代理和旧数据兼容;新 Match3D 草稿和批量新增不再生成 GLB。
|
- Hyper3D / Rodin:只保留后端安全代理和旧数据兼容;新 Match3D 草稿和批量新增不再生成 GLB。
|
||||||
- 音频:视觉小说专用音频路由保留;拼图和抓大鹅生成入口暂时关闭,通用 `/api/creation/audio/*` 对相关目标返回 `410 Gone`。
|
- 音频:视觉小说专用音频路由保留;拼图和抓大鹅生成入口暂时关闭,通用 `/api/creation/audio/*` 对相关目标返回 `410 Gone`;敲木鱼 `hit_sound` 目标例外开放,复用 VectorEngine Vidu 音效生成、OSS 私有对象、`asset_object` 和 entity binding 链路,目标字段固定为 `entityKind='wooden_fish_work'`、`slot='hit_sound'`、`assetKind='wooden_fish_hit_sound'`、`storagePrefix='wooden_fish_assets'`。
|
||||||
- OSS:私有 generated legacy path 进入浏览器前必须通过 `/api/assets/read-url` 换签;不要裸请求 `/generated-*`。
|
- OSS:私有 generated legacy path 进入浏览器前必须通过 `/api/assets/read-url` 换签;不要裸请求 `/generated-*`。
|
||||||
- 外部 API 失败审计:外部供应商调用未成功时,`api-server` 必须发送 OTLP 失败事件并写入 `tracking_event`。当前通用 VectorEngine `gpt-image-2-all` 图片生成 / 编辑适配器在 `request_send`、`response_body`、`upstream_status`、`response_parse`、`missing_image` 和 `image_download` 阶段失败时记录 `external_api_call_failure`,`scope_kind = module`、`scope_id = provider`、`module_key = external-api`;metadata 固定包含 provider、endpoint、operation、failureStage、statusCode、statusClass、timeout、retryable、errorMessage、latencyMs、promptChars、referenceImageCount 和 imageModel。入库优先复用 tracking outbox,outbox 不可写或保护阈值拒绝时回退同步写 SpacetimeDB;不得新增前端兜底或在 SpacetimeDB reducer 内做外部 I/O。
|
- 外部 API 失败审计:外部供应商调用未成功时,`api-server` 必须发送 OTLP 失败事件并写入 `tracking_event`。当前通用 VectorEngine `gpt-image-2-all` 图片生成 / 编辑适配器在 `request_send`、`response_body`、`upstream_status`、`response_parse`、`missing_image` 和 `image_download` 阶段失败时记录 `external_api_call_failure`,`scope_kind = module`、`scope_id = provider`、`module_key = external-api`;metadata 固定包含 provider、endpoint、operation、failureStage、statusCode、statusClass、timeout、retryable、errorMessage、latencyMs、promptChars、referenceImageCount 和 imageModel。入库优先复用 tracking outbox,outbox 不可写或保护阈值拒绝时回退同步写 SpacetimeDB;不得新增前端兜底或在 SpacetimeDB reducer 内做外部 I/O。
|
||||||
|
|
||||||
@@ -401,6 +404,41 @@ npm run check:server-rs-ddd
|
|||||||
- 源码:`server-rs/crates/spacetime-module/src/jump_hop.rs`
|
- 源码:`server-rs/crates/spacetime-module/src/jump_hop.rs`
|
||||||
- 说明:跳一跳公开详情兼容投影,包含作品、路径和素材字段;公开列表主路径优先使用 `jump_hop_gallery_card_view`。
|
- 说明:跳一跳公开详情兼容投影,包含作品、路径和素材字段;公开列表主路径优先使用 `jump_hop_gallery_card_view`。
|
||||||
|
|
||||||
|
### `wooden_fish_agent_session`
|
||||||
|
|
||||||
|
- Rust 结构体:`WoodenFishAgentSessionRow`
|
||||||
|
- 源码:`server-rs/crates/spacetime-module/src/wooden_fish/tables.rs`
|
||||||
|
|
||||||
|
### `wooden_fish_event`
|
||||||
|
|
||||||
|
- Rust 结构体:`WoodenFishEventRow`
|
||||||
|
- 源码:`server-rs/crates/spacetime-module/src/wooden_fish/tables.rs`
|
||||||
|
|
||||||
|
### `wooden_fish_runtime_run`
|
||||||
|
|
||||||
|
- Rust 结构体:`WoodenFishRuntimeRunRow`
|
||||||
|
- 源码:`server-rs/crates/spacetime-module/src/wooden_fish/tables.rs`
|
||||||
|
|
||||||
|
### `wooden_fish_work_profile`
|
||||||
|
|
||||||
|
- Rust 结构体:`WoodenFishWorkProfileRow`
|
||||||
|
- 源码:`server-rs/crates/spacetime-module/src/wooden_fish/tables.rs`
|
||||||
|
- 说明:敲木鱼作品 profile 真相,包含敲击物图案、背景环境图、敲击音效、飘字配置、发布状态和公开计数;`background_asset_json` 是后加入字段,保存 image2 生成的 9:16 背景环境图资产快照,旧迁移数据按 `None` 兼容。
|
||||||
|
|
||||||
|
### SpacetimeDB view:`wooden_fish_gallery_card_view`
|
||||||
|
|
||||||
|
- Rust view:`wooden_fish_gallery_card_view`
|
||||||
|
- 返回类型:`Vec<WoodenFishGalleryCardViewRow>`
|
||||||
|
- 源码:`server-rs/crates/spacetime-module/src/wooden_fish.rs`
|
||||||
|
- 说明:敲木鱼公开广场列表卡片投影,只暴露 `publication_status = published` 的作品卡片字段;`api-server` 的 `spacetime-client` 长期订阅 `SELECT * FROM wooden_fish_gallery_card_view` 后,从本地 cache 构造敲木鱼公开列表响应。个人作品列表、详情、发布和运行态仍按 procedure 路径处理。
|
||||||
|
|
||||||
|
### SpacetimeDB view:`wooden_fish_gallery_view`
|
||||||
|
|
||||||
|
- Rust view:`wooden_fish_gallery_view`
|
||||||
|
- 返回类型:`Vec<WoodenFishGalleryViewRow>`
|
||||||
|
- 源码:`server-rs/crates/spacetime-module/src/wooden_fish.rs`
|
||||||
|
- 说明:敲木鱼公开详情兼容投影,包含敲击物图案、敲击音效和飘字配置;公开列表主路径优先使用 `wooden_fish_gallery_card_view`。
|
||||||
|
|
||||||
### `match3d_agent_message`
|
### `match3d_agent_message`
|
||||||
|
|
||||||
- Rust 结构体:`Match3DAgentMessageRow`
|
- Rust 结构体:`Match3DAgentMessageRow`
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ npm run dev:api-server
|
|||||||
|
|
||||||
后端日志默认写入 `logs/api-server/`。后端 API smoke 使用 `npm run dev:api-server` 并检查 `/healthz`;不要使用旧 `api-server:maincloud` 或任何 `GENARRATIVE_SPACETIME_MAINCLOUD_*` 口径。
|
后端日志默认写入 `logs/api-server/`。后端 API smoke 使用 `npm run dev:api-server` 并检查 `/healthz`;不要使用旧 `api-server:maincloud` 或任何 `GENARRATIVE_SPACETIME_MAINCLOUD_*` 口径。
|
||||||
|
|
||||||
|
如果本地 `GET /api/creation-entry/config` 返回 `No such procedure`,通常是 `.env.local` 指向的 SpacetimeDB 库还没有发布当前 `spacetime-module`,或当前 CLI 身份无权发布该库。debug 构建的 `api-server` 会临时使用后端默认入口配置兜底,避免创作作品架整块消失;正式修复仍应切换到拥有目标库权限的 SpacetimeDB 身份后重新运行 `npm run dev` 完成发布,或用 gitignored 的 `spacetime.local.json` 指向可发布的本地库。
|
||||||
|
|
||||||
|
本地 `npm run dev:spacetime` 发布模块时必须显式忽略仓库根目录的 `spacetime.json`,由脚本固定追加 `--no-config` 并使用命令参数里传入的数据库名和 `--server http://127.0.0.1:3101`。否则 CLI 可能把发布目标改写到配置文件里的其他数据库,导致 `dev:spacetime` 启动后又因发布失败自动退出,浏览器随后会在 `ws://127.0.0.1:3101/v1/database/.../subscribe` 看到连接拒绝。
|
||||||
|
|
||||||
本地 `.env`、`.env.local` 或 `.env.secrets.local` 修改后必须重启 `api-server` 才会生效;若已经通过 `npm run dev` 启动完整联调,可在该终端输入 `rs api-server`。排查 RPG / 拼图 / 抓大鹅等 VectorEngine 生图链路时,确认 `VECTOR_ENGINE_BASE_URL`、`VECTOR_ENGINE_API_KEY` 和 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS` 只在本地或服务器密钥文件中配置,不能写入 Git。开局 CG 故事板、首图、背景和图集都属于长耗时图片请求;后端默认会把 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS` 下限收口到 `1000000`,旧进程仍可能沿用重启前的短超时。若开局 CG 故事板在 `send()` 阶段失败且日志显示 `SendRequest`,先看同一 request_id 的 `request_body_bytes`、`reference_data_url_bytes`、`sourceChain` 和 `rootSource`;当前开局 CG 会把角色图与首幕背景图压到单边 768 的 JPEG 后再作为 generations `image` 数组发送,`/v1/images/generations` 使用默认 HTTP 协商,只有 multipart `/v1/images/edits` 单独强制 HTTP/1.1。
|
本地 `.env`、`.env.local` 或 `.env.secrets.local` 修改后必须重启 `api-server` 才会生效;若已经通过 `npm run dev` 启动完整联调,可在该终端输入 `rs api-server`。排查 RPG / 拼图 / 抓大鹅等 VectorEngine 生图链路时,确认 `VECTOR_ENGINE_BASE_URL`、`VECTOR_ENGINE_API_KEY` 和 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS` 只在本地或服务器密钥文件中配置,不能写入 Git。开局 CG 故事板、首图、背景和图集都属于长耗时图片请求;后端默认会把 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS` 下限收口到 `1000000`,旧进程仍可能沿用重启前的短超时。若开局 CG 故事板在 `send()` 阶段失败且日志显示 `SendRequest`,先看同一 request_id 的 `request_body_bytes`、`reference_data_url_bytes`、`sourceChain` 和 `rootSource`;当前开局 CG 会把角色图与首幕背景图压到单边 768 的 JPEG 后再作为 generations `image` 数组发送,`/v1/images/generations` 使用默认 HTTP 协商,只有 multipart `/v1/images/edits` 单独强制 HTTP/1.1。
|
||||||
|
|
||||||
查看本地 Rust / SpacetimeDB 日志:
|
查看本地 Rust / SpacetimeDB 日志:
|
||||||
@@ -167,6 +171,7 @@ UI 相关修改要重点验证:
|
|||||||
4. 身份问题先查 `spacetime login show`、`spacetime server list` 和目标库权限,不通过切回旧 Node / PostgreSQL 绕过。
|
4. 身份问题先查 `spacetime login show`、`spacetime server list` 和目标库权限,不通过切回旧 Node / PostgreSQL 绕过。
|
||||||
5. 旧库迁移或 private 表数据保留走 `migration.rs` 的 JSON 导入导出和分片导入思路。
|
5. 旧库迁移或 private 表数据保留走 `migration.rs` 的 JSON 导入导出和分片导入思路。
|
||||||
6. Jenkins 数据库导入 / 导出流水线会先加载 `scripts/jenkins-prepare-toolchain-env.sh`,显式补齐 Jenkins 用户的 Node、Cargo、SpacetimeDB 工具链目录;如果目标机器安装路径不同,用 `GENARRATIVE_JENKINS_TOOL_PATHS` 传入额外 `bin` 目录。
|
6. Jenkins 数据库导入 / 导出流水线会先加载 `scripts/jenkins-prepare-toolchain-env.sh`,显式补齐 Jenkins 用户的 Node、Cargo、SpacetimeDB 工具链目录;如果目标机器安装路径不同,用 `GENARRATIVE_JENKINS_TOOL_PATHS` 传入额外 `bin` 目录。
|
||||||
|
7. 本地 `npm run dev` / `npm run dev:api-server` 若没有显式 `GENARRATIVE_SPACETIME_TOKEN`,会在 SpacetimeDB 就绪后调用 `/v1/identity` 创建当前进程专用 Web API identity token,并只注入本次 `api-server` 环境,不写回 `.env.local`。启动日志只打印 identity 前缀,禁止打印 token 明文;若仍出现 `subscribe ... 401 Unauthorized`,先确认是否绕过了项目 dev 脚本或是否连接到非本次启动的 SpacetimeDB server。
|
||||||
|
|
||||||
## 生产运维
|
## 生产运维
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,28 @@ RPG / 拼图等运行态存档选择入口统一在个人中心 `常用功能 >
|
|||||||
|
|
||||||
平台首页推荐、精选、最新、公开详情、搜索、已玩作品和公开试玩统一按 `sourceType='jump-hop'` 与 `JH-*` 公开作品号识别跳一跳作品;从公开详情或推荐流启动运行态时,若卡片摘要不足以携带角色图、地块图集和路径配置,必须先补读完整 work profile 再传入运行态。平台壳层必须同步注册 `jump-hop-workspace`、`jump-hop-generating`、`jump-hop-result`、`jump-hop-runtime`、`jump-hop-gallery-detail` 阶段,并在 `appPageRoutes.ts` 映射 `/creation/jump-hop/workspace`、`/creation/jump-hop/generating`、`/creation/jump-hop/result`、`/gallery/jump-hop/detail`、`/runtime/jump-hop`,同时持有 session、work、run、gallery、busy/error 与生成进度状态,避免只合入渲染分支但遗漏状态源或分享路径导致 typecheck 失败、刷新回首页。
|
平台首页推荐、精选、最新、公开详情、搜索、已玩作品和公开试玩统一按 `sourceType='jump-hop'` 与 `JH-*` 公开作品号识别跳一跳作品;从公开详情或推荐流启动运行态时,若卡片摘要不足以携带角色图、地块图集和路径配置,必须先补读完整 work profile 再传入运行态。平台壳层必须同步注册 `jump-hop-workspace`、`jump-hop-generating`、`jump-hop-result`、`jump-hop-runtime`、`jump-hop-gallery-detail` 阶段,并在 `appPageRoutes.ts` 映射 `/creation/jump-hop/workspace`、`/creation/jump-hop/generating`、`/creation/jump-hop/result`、`/gallery/jump-hop/detail`、`/runtime/jump-hop`,同时持有 session、work、run、gallery、busy/error 与生成进度状态,避免只合入渲染分支但遗漏状态源或分享路径导致 typecheck 失败、刷新回首页。
|
||||||
|
|
||||||
|
## 敲木鱼
|
||||||
|
|
||||||
|
对外名称:`敲木鱼`。工程域:`wooden-fish`。PRD 见 `docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`。
|
||||||
|
|
||||||
|
首版定位为单屏点击解压模板,链路对齐拼图的创作闭环:
|
||||||
|
|
||||||
|
```text
|
||||||
|
创作入口 -> 工作台 -> 生成过程页 -> 结果页 -> 试玩 -> 发布 -> 运行态
|
||||||
|
```
|
||||||
|
|
||||||
|
创作输入固定为:
|
||||||
|
|
||||||
|
1. `敲什么`:敲击物单图资产槽位。默认模板使用内置透明 PNG `/wooden-fish/default-hit-object.png` 作为 `bundled-default` 敲击物资产,避免默认关键词被重新语义化改形;用户输入自定义关键词或上传参考图时,后端必须以默认木鱼图作为基础结构和画风参考,使用 image2 生成最终敲击物图案,上传图只作为新主题参考,不直接进入运行态。自定义 `compile-draft` / `regenerate-hit-object` 必须完成 image2 -> OSS 私有对象 -> asset object 登记和绑定后,再由 `api-server` 注入真实 `hitObjectAsset.imageSrc`,不能只写 `/generated-wooden-fish-assets/...` 占位路径,也不能接受前端请求自带的 `hitObjectAsset` 短路生成。
|
||||||
|
2. `敲击音效`:音频资产槽位,支持描述生成、上传和麦克风录制,统一写回 `hitSoundAsset`。描述生成复用通用 `/api/creation/audio/sound-effect` 的 VectorEngine Vidu 音效生成、下载、OSS 私有对象、asset object 登记和 entity binding 链路;木鱼目标固定为 `entityKind='wooden_fish_work'`、`slot='hit_sound'`、`assetKind='wooden_fish_hit_sound'`、`storagePrefix='wooden_fish_assets'`,不得再返回 `410 Gone`,也不得由 `spacetime-client` 合成假音频路径。
|
||||||
|
3. `功德有什么`:最多 8 条飘字,默认 `幸运、健康、财富、姻缘、幸福、事业、成功、功德`;创作态只保存词条名,运行态飘字展示时再追加 `+1`。
|
||||||
|
|
||||||
|
图片生成链路固定为双图 image2 流程:第一步用默认木鱼图作为结构和画风参考,按用户题材关键词或参考图主题生成 `1:1` 透明底新敲击物;第二步用新敲击物作为主题和画风参考生成 `9:16` 背景环境图,背景图只适配主题和画风,不能包含新敲击物本体,也不能增加木槌互动物品。两个资产分别写回 `hitObjectAsset` 与 `backgroundAsset`,并绑定到 `wooden_fish_work` 的 `hit_object` / `background` 槽位。运行态和结果页消费 `backgroundAsset` 做竖屏背景,中央再叠加 `hitObjectAsset`。
|
||||||
|
|
||||||
|
运行态规则真相以后端 run 摘要为准,前端只做点击低延迟表现、敲击动画、音频播放和飘字渲染。每次非功能区点击在当前 run 内累计 `totalTapCount` 和 `wordCounters`;计数不进入账号长期账本,不做排行榜。顶部计数器仅在词条首次出现时创建,后续同词条继续累加。
|
||||||
|
|
||||||
|
平台首页推荐、精选、最新、公开详情、搜索、已玩作品和公开试玩统一按 `sourceType='wooden-fish'` 与 `WF-*` 公开作品号识别敲木鱼作品;公开列表应走 `wooden_fish_gallery_card_view` 订阅缓存,公开详情或运行态启动时卡片摘要不足则补读完整 work profile。
|
||||||
|
|
||||||
## 抓大鹅 Match3D
|
## 抓大鹅 Match3D
|
||||||
|
|
||||||
对外名称:`抓大鹅`。工程域:`match3d`。
|
对外名称:`抓大鹅`。工程域:`match3d`。
|
||||||
@@ -249,9 +271,9 @@ RPG / 拼图等运行态存档选择入口统一在个人中心 `常用功能 >
|
|||||||
|
|
||||||
当前包含:
|
当前包含:
|
||||||
|
|
||||||
- `baby-object-match`:宝贝识物当前入口状态为 `visible=true`、`open=false`,创作 Tab 展示为“敬请期待”,不进入创作与发布链路;历史资产接口为 `/api/creation/edutainment/baby-object-match/assets`,后续重新开放时继续复用该资产链路。
|
- `baby-object-match`:宝贝识物当前入口状态为 `visible=true`、`open=true`,创作 Tab 展示为“可创建”,进入宝贝识物创作、生成、结果页、试玩和发布链路;资产生成接口为 `/api/creation/edutainment/baby-object-match/assets`。入口关闭只允许通过 SpacetimeDB / 后台入口配置显式调整,默认种子和 debug 兜底都必须保持可创建。
|
||||||
- `baby-love-drawing`:宝贝爱画本地 demo,魔法生成接口为 `/api/creation/edutainment/baby-love-drawing/magic`。
|
- `baby-love-drawing`:宝贝爱画本地 demo,魔法生成接口为 `/api/creation/edutainment/baby-love-drawing/magic`。
|
||||||
- `child-motion-demo`:儿童动作识别热身关。真实动作数据来自 mocap WebSocket,不要把浏览器摄像头视频流当作主动作数据源。
|
- `child-motion-demo`:儿童动作识别热身关。真实动作数据来自 mocap WebSocket,不要把浏览器摄像头视频流当作主动作数据源;发现页的寓教于乐频道同时提供独立热身关入口,点击后进入 `/child-motion-demo`。
|
||||||
|
|
||||||
## 创意互动 Agent
|
## 创意互动 Agent
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,12 @@ export interface PublishGeneratedAudioAssetRequest {
|
|||||||
slot: string;
|
slot: string;
|
||||||
assetKind: string;
|
assetKind: string;
|
||||||
profileId?: string | null;
|
profileId?: string | null;
|
||||||
storagePrefix?: 'puzzle_assets' | 'match3d_assets' | 'custom_world_scenes' | null;
|
storagePrefix?:
|
||||||
|
| 'puzzle_assets'
|
||||||
|
| 'match3d_assets'
|
||||||
|
| 'wooden_fish_assets'
|
||||||
|
| 'custom_world_scenes'
|
||||||
|
| null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface GeneratedAudioAssetResponse {
|
export interface GeneratedAudioAssetResponse {
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ export type * from './jumpHop';
|
|||||||
export type * from './puzzleCreativeTemplate';
|
export type * from './puzzleCreativeTemplate';
|
||||||
export type * from './visualNovel';
|
export type * from './visualNovel';
|
||||||
export type * from './barkBattle';
|
export type * from './barkBattle';
|
||||||
|
export type * from './woodenFish';
|
||||||
|
|||||||
199
packages/shared/src/contracts/woodenFish.ts
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
export type WoodenFishGenerationStatus =
|
||||||
|
| 'draft'
|
||||||
|
| 'generating'
|
||||||
|
| 'ready'
|
||||||
|
| 'failed';
|
||||||
|
|
||||||
|
export type WoodenFishActionType =
|
||||||
|
| 'compile-draft'
|
||||||
|
| 'regenerate-hit-object'
|
||||||
|
| 'generate-hit-sound'
|
||||||
|
| 'replace-hit-sound'
|
||||||
|
| 'update-work-meta'
|
||||||
|
| 'update-floating-words';
|
||||||
|
|
||||||
|
export type WoodenFishRunStatus = 'playing' | 'finished';
|
||||||
|
|
||||||
|
export interface WoodenFishImageAsset {
|
||||||
|
assetId: string;
|
||||||
|
imageSrc: string;
|
||||||
|
imageObjectKey: string;
|
||||||
|
assetObjectId: string;
|
||||||
|
generationProvider: string;
|
||||||
|
prompt: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishAudioAsset {
|
||||||
|
assetId: string;
|
||||||
|
audioSrc: string;
|
||||||
|
audioObjectKey: string;
|
||||||
|
assetObjectId: string;
|
||||||
|
source: string;
|
||||||
|
prompt?: string | null;
|
||||||
|
durationMs?: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishWorkspaceCreateRequest {
|
||||||
|
templateId: string;
|
||||||
|
workTitle: string;
|
||||||
|
workDescription: string;
|
||||||
|
themeTags: string[];
|
||||||
|
hitObjectPrompt: string;
|
||||||
|
hitObjectReferenceImageSrc?: string | null;
|
||||||
|
hitSoundPrompt?: string | null;
|
||||||
|
hitSoundAsset?: WoodenFishAudioAsset | null;
|
||||||
|
floatingWords: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishActionRequest {
|
||||||
|
actionType: WoodenFishActionType;
|
||||||
|
profileId?: string | null;
|
||||||
|
workTitle?: string | null;
|
||||||
|
workDescription?: string | null;
|
||||||
|
themeTags?: string[] | null;
|
||||||
|
hitObjectPrompt?: string | null;
|
||||||
|
hitObjectReferenceImageSrc?: string | null;
|
||||||
|
hitObjectAsset?: WoodenFishImageAsset | null;
|
||||||
|
backgroundAsset?: WoodenFishImageAsset | null;
|
||||||
|
hitSoundPrompt?: string | null;
|
||||||
|
hitSoundAsset?: WoodenFishAudioAsset | null;
|
||||||
|
floatingWords?: string[] | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishWordCounter {
|
||||||
|
text: string;
|
||||||
|
count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishDraftResponse {
|
||||||
|
templateId: string;
|
||||||
|
templateName: string;
|
||||||
|
profileId: string | null;
|
||||||
|
workTitle: string;
|
||||||
|
workDescription: string;
|
||||||
|
themeTags: string[];
|
||||||
|
hitObjectPrompt: string;
|
||||||
|
hitObjectReferenceImageSrc: string | null;
|
||||||
|
hitSoundPrompt: string | null;
|
||||||
|
floatingWords: string[];
|
||||||
|
hitObjectAsset: WoodenFishImageAsset | null;
|
||||||
|
backgroundAsset: WoodenFishImageAsset | null;
|
||||||
|
hitSoundAsset: WoodenFishAudioAsset | null;
|
||||||
|
coverImageSrc: string | null;
|
||||||
|
generationStatus: WoodenFishGenerationStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishSessionSnapshotResponse {
|
||||||
|
sessionId: string;
|
||||||
|
ownerUserId: string;
|
||||||
|
status: WoodenFishGenerationStatus;
|
||||||
|
draft: WoodenFishDraftResponse | null;
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishSessionResponse {
|
||||||
|
session: WoodenFishSessionSnapshotResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishActionResponse {
|
||||||
|
actionType: WoodenFishActionType;
|
||||||
|
session: WoodenFishSessionSnapshotResponse;
|
||||||
|
work: WoodenFishWorkProfileResponse | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishWorkSummaryResponse {
|
||||||
|
runtimeKind: 'wooden-fish';
|
||||||
|
workId: string;
|
||||||
|
profileId: string;
|
||||||
|
ownerUserId: string;
|
||||||
|
sourceSessionId: string | null;
|
||||||
|
workTitle: string;
|
||||||
|
workDescription: string;
|
||||||
|
themeTags: string[];
|
||||||
|
coverImageSrc: string | null;
|
||||||
|
publicationStatus: string;
|
||||||
|
playCount: number;
|
||||||
|
updatedAt: string;
|
||||||
|
publishedAt: string | null;
|
||||||
|
publishReady: boolean;
|
||||||
|
generationStatus: WoodenFishGenerationStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishWorkProfileResponse {
|
||||||
|
summary: WoodenFishWorkSummaryResponse;
|
||||||
|
draft: WoodenFishDraftResponse;
|
||||||
|
hitObjectAsset: WoodenFishImageAsset;
|
||||||
|
backgroundAsset: WoodenFishImageAsset | null;
|
||||||
|
hitSoundAsset: WoodenFishAudioAsset;
|
||||||
|
floatingWords: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishWorkDetailResponse {
|
||||||
|
item: WoodenFishWorkProfileResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishWorkMutationResponse {
|
||||||
|
item: WoodenFishWorkProfileResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishGalleryCardResponse {
|
||||||
|
publicWorkCode: string;
|
||||||
|
workId: string;
|
||||||
|
profileId: string;
|
||||||
|
ownerUserId: string;
|
||||||
|
authorDisplayName: string;
|
||||||
|
workTitle: string;
|
||||||
|
workDescription: string;
|
||||||
|
coverImageSrc: string | null;
|
||||||
|
themeTags: string[];
|
||||||
|
publicationStatus: string;
|
||||||
|
playCount: number;
|
||||||
|
updatedAt: string;
|
||||||
|
publishedAt: string | null;
|
||||||
|
generationStatus: WoodenFishGenerationStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishGalleryResponse {
|
||||||
|
items: WoodenFishGalleryCardResponse[];
|
||||||
|
hasMore: boolean;
|
||||||
|
nextCursor: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishGalleryDetailResponse {
|
||||||
|
item: WoodenFishWorkProfileResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishRuntimeRunSnapshotResponse {
|
||||||
|
runId: string;
|
||||||
|
profileId: string;
|
||||||
|
ownerUserId: string;
|
||||||
|
status: WoodenFishRunStatus;
|
||||||
|
totalTapCount: number;
|
||||||
|
wordCounters: WoodenFishWordCounter[];
|
||||||
|
startedAtMs: number;
|
||||||
|
updatedAtMs: number;
|
||||||
|
finishedAtMs: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishRunResponse {
|
||||||
|
run: WoodenFishRuntimeRunSnapshotResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishStartRunRequest {
|
||||||
|
profileId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishCheckpointRunRequest {
|
||||||
|
totalTapCount: number;
|
||||||
|
wordCounters: WoodenFishWordCounter[];
|
||||||
|
clientEventId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WoodenFishFinishRunRequest {
|
||||||
|
totalTapCount: number;
|
||||||
|
wordCounters: WoodenFishWordCounter[];
|
||||||
|
clientEventId: string;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101010"/>
|
||||||
|
<rect x="270" y="214" width="484" height="606" rx="228" fill="#fff5df"/>
|
||||||
|
<circle cx="650" cy="330" r="112" fill="#d77750"/>
|
||||||
|
<circle cx="676" cy="354" r="86" fill="#fff5df"/>
|
||||||
|
<circle cx="430" cy="470" r="34" fill="#121212"/>
|
||||||
|
<circle cx="590" cy="470" r="34" fill="#121212"/>
|
||||||
|
<path d="M512 552L540 590L578 618L540 646L512 684L484 646L446 618L484 590Z" fill="#ffd25d"/>
|
||||||
|
<rect x="360" y="742" width="304" height="48" rx="24" fill="#d77750"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 652 B |
|
After Width: | Height: | Size: 46 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101418"/>
|
||||||
|
<path d="M236 504C236 294 382 176 512 176C676 176 788 322 788 504C788 702 648 832 512 832C372 832 236 702 236 504Z" fill="#fff5df"/>
|
||||||
|
<circle cx="618" cy="326" r="72" fill="#101418"/>
|
||||||
|
<circle cx="618" cy="326" r="34" fill="#ffd25d"/>
|
||||||
|
<circle cx="438" cy="488" r="30" fill="#101418"/>
|
||||||
|
<rect x="506" y="548" width="126" height="46" rx="23" fill="#d77750"/>
|
||||||
|
<path d="M512 624L536 658L570 682L536 706L512 740L488 706L454 682L488 658Z" fill="#ffd25d"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 659 B |
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#17110e"/>
|
||||||
|
<rect x="254" y="254" width="516" height="516" rx="190" fill="#d77750"/>
|
||||||
|
<rect x="330" y="320" width="364" height="386" rx="140" fill="#fff5df"/>
|
||||||
|
<circle cx="440" cy="478" r="30" fill="#17110e"/>
|
||||||
|
<circle cx="584" cy="478" r="30" fill="#17110e"/>
|
||||||
|
<rect x="458" y="594" width="108" height="44" rx="22" fill="#d77750"/>
|
||||||
|
<circle cx="512" cy="254" r="54" fill="#ffd25d"/>
|
||||||
|
<circle cx="512" cy="254" r="24" fill="#17110e"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 631 B |
|
After Width: | Height: | Size: 31 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101418"/>
|
||||||
|
<path d="M628 217L759 272L814 402L759 724L628 779H396L265 724L210 402L265 272L396 217Z" fill="#fff5df"/>
|
||||||
|
<circle cx="512" cy="398" r="126" fill="#101418"/>
|
||||||
|
<circle cx="512" cy="398" r="62" fill="#ffd25d"/>
|
||||||
|
<circle cx="390" cy="570" r="30" fill="#101418"/>
|
||||||
|
<circle cx="634" cy="570" r="30" fill="#101418"/>
|
||||||
|
<rect x="380" y="704" width="264" height="54" rx="27" fill="#31c7a9"/>
|
||||||
|
<rect x="318" y="268" width="142" height="58" rx="29" fill="#ff6a5f"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 662 B |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#111111"/>
|
||||||
|
<rect x="340" y="188" width="344" height="648" rx="172" fill="#fff5df"/>
|
||||||
|
<circle cx="512" cy="336" r="112" fill="#d77750"/>
|
||||||
|
<rect x="390" y="442" width="244" height="280" rx="122" fill="#111111"/>
|
||||||
|
<circle cx="512" cy="582" r="58" fill="#ffd25d"/>
|
||||||
|
<circle cx="432" cy="332" r="24" fill="#121212"/>
|
||||||
|
<circle cx="592" cy="332" r="24" fill="#121212"/>
|
||||||
|
<rect x="404" y="782" width="216" height="60" rx="30" fill="#fff5df"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 632 B |
|
After Width: | Height: | Size: 42 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101010"/>
|
||||||
|
<rect x="286" y="300" width="452" height="456" rx="150" fill="#fff5df"/>
|
||||||
|
<circle cx="286" cy="530" r="88" fill="#101010"/>
|
||||||
|
<circle cx="738" cy="530" r="88" fill="#101010"/>
|
||||||
|
<circle cx="512" cy="300" r="76" fill="#ffd25d"/>
|
||||||
|
<circle cx="430" cy="474" r="24" fill="#101010"/>
|
||||||
|
<circle cx="594" cy="474" r="24" fill="#101010"/>
|
||||||
|
<path d="M512 536L540 576L580 604L540 632L512 672L484 632L444 604L484 576Z" fill="#101010"/>
|
||||||
|
<path d="M512 570L526 590L546 604L526 618L512 638L498 618L478 604L498 590Z" fill="#ffd25d"/>
|
||||||
|
<rect x="360" y="744" width="304" height="54" rx="27" fill="#d77750"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 798 B |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 762 KiB |
|
After Width: | Height: | Size: 801 KiB |
|
After Width: | Height: | Size: 807 KiB |
|
After Width: | Height: | Size: 793 KiB |
|
After Width: | Height: | Size: 822 KiB |
|
After Width: | Height: | Size: 750 KiB |
|
After Width: | Height: | Size: 530 KiB |
|
After Width: | Height: | Size: 362 KiB |
|
After Width: | Height: | Size: 990 KiB |
|
After Width: | Height: | Size: 805 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 798 KiB |
|
After Width: | Height: | Size: 54 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101418"/>
|
||||||
|
<circle cx="512" cy="512" r="274" fill="#fff3d7"/>
|
||||||
|
<circle cx="512" cy="512" r="142" fill="#101418"/>
|
||||||
|
<path d="M512 442L538 486L582 512L538 538L512 582L486 538L442 512L486 486Z" fill="#ffd35f"/>
|
||||||
|
<circle cx="648" cy="340" r="64" fill="#df7650"/>
|
||||||
|
<circle cx="666" cy="360" r="40" fill="#101418"/>
|
||||||
|
<circle cx="374" cy="650" r="46" fill="#2ec5ad"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 557 B |
|
After Width: | Height: | Size: 34 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101010"/>
|
||||||
|
<rect x="308" y="210" width="400" height="600" rx="198" fill="#fff3d7"/>
|
||||||
|
<circle cx="672" cy="302" r="82" fill="#df7650"/>
|
||||||
|
<circle cx="716" cy="336" r="74" fill="#101010"/>
|
||||||
|
<circle cx="402" cy="458" r="34" fill="#111111"/>
|
||||||
|
<path d="M548 520L572 560L612 584L572 608L548 648L524 608L484 584L524 560Z" fill="#ffd35f"/>
|
||||||
|
<rect x="362" y="742" width="298" height="50" rx="25" fill="#df7650"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 599 B |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101418"/>
|
||||||
|
<circle cx="512" cy="512" r="276" fill="#fff3d7"/>
|
||||||
|
<circle cx="724" cy="394" r="94" fill="#101418"/>
|
||||||
|
<circle cx="692" cy="412" r="38" fill="#ffd35f"/>
|
||||||
|
<circle cx="314" cy="512" r="76" fill="#101418"/>
|
||||||
|
<rect x="442" y="642" width="152" height="48" rx="24" fill="#df7650"/>
|
||||||
|
<circle cx="438" cy="448" r="32" fill="#111111"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 534 B |
|
After Width: | Height: | Size: 31 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#17110e"/>
|
||||||
|
<path d="M630 228L796 394V630L630 796H394L228 630V394L394 228Z" fill="#fff3d7"/>
|
||||||
|
<circle cx="512" cy="282" r="76" fill="#ffd35f"/>
|
||||||
|
<rect x="376" y="356" width="272" height="370" rx="136" fill="#df7650"/>
|
||||||
|
<circle cx="430" cy="528" r="28" fill="#17110e"/>
|
||||||
|
<circle cx="594" cy="528" r="28" fill="#17110e"/>
|
||||||
|
<path d="M512 576L534 612L570 634L534 656L512 692L490 656L454 634L490 612Z" fill="#fff3d7"/>
|
||||||
|
<rect x="386" y="764" width="252" height="54" rx="27" fill="#2ec5ad"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 682 B |
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101010"/>
|
||||||
|
<rect x="270" y="300" width="484" height="440" rx="148" fill="#fff3d7"/>
|
||||||
|
<circle cx="270" cy="520" r="84" fill="#101010"/>
|
||||||
|
<circle cx="754" cy="520" r="84" fill="#101010"/>
|
||||||
|
<rect x="390" y="404" width="244" height="246" rx="110" fill="#df7650"/>
|
||||||
|
<circle cx="512" cy="526" r="62" fill="#ffd35f"/>
|
||||||
|
<circle cx="512" cy="526" r="28" fill="#101010"/>
|
||||||
|
<rect x="356" y="728" width="312" height="54" rx="27" fill="#bd5b3d"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 631 B |
|
After Width: | Height: | Size: 47 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#17110e"/>
|
||||||
|
<rect x="340" y="184" width="344" height="648" rx="172" fill="#fff3d7"/>
|
||||||
|
<circle cx="512" cy="348" r="124" fill="#df7650"/>
|
||||||
|
<circle cx="512" cy="348" r="56" fill="#17110e"/>
|
||||||
|
<path d="M512 306L527 333L554 348L527 363L512 390L497 363L470 348L497 333Z" fill="#ffd35f"/>
|
||||||
|
<rect x="412" y="492" width="200" height="198" rx="98" fill="#17110e"/>
|
||||||
|
<circle cx="512" cy="592" r="50" fill="#ffd35f"/>
|
||||||
|
<rect x="404" y="764" width="216" height="60" rx="30" fill="#fff3d7"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 674 B |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 43 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#101418"/>
|
||||||
|
|
||||||
|
<path d="M244 548 L512 430 L780 548 L512 674 Z" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#fffaf0" stroke-width="66"/>
|
||||||
|
<path d="M292 656 L468 734 Q512 752 556 734 L732 656" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#fffaf0" stroke-width="52"/>
|
||||||
|
<circle cx="337" cy="548" r="15" fill="#ffd45d"/>
|
||||||
|
<path d="M512 326 L512 514" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#fffaf0" stroke-width="70"/>
|
||||||
|
<circle cx="512" cy="208" r="62" fill="#ffd45d"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 728 B |
|
After Width: | Height: | Size: 35 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#151515"/>
|
||||||
|
|
||||||
|
<path d="M252 548 L512 436 L772 548 L512 666 Z" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="62"/>
|
||||||
|
<path d="M304 642 L474 718 Q512 736 550 718 L720 642" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="50"/>
|
||||||
|
<circle cx="346" cy="548" r="16" fill="#ffffff"/>
|
||||||
|
<circle cx="512" cy="556" r="12" fill="#f5c95d"/>
|
||||||
|
<path d="M512 334 L512 504" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="64"/>
|
||||||
|
<circle cx="512" cy="204" r="62" fill="#f5c95d"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 780 B |
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#151515"/>
|
||||||
|
|
||||||
|
<path d="M244 548 L512 430 L780 548 L512 674 Z" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="66"/>
|
||||||
|
<path d="M292 656 L468 734 Q512 752 556 734 L732 656" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="52"/>
|
||||||
|
<circle cx="337" cy="548" r="17" fill="#ffffff"/>
|
||||||
|
<path d="M512 326 L512 514" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="68"/>
|
||||||
|
<circle cx="512" cy="214" r="62" fill="#ffffff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 728 B |
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#121212"/>
|
||||||
|
|
||||||
|
<path d="M276 522 L512 420 L748 522" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="54"/>
|
||||||
|
<path d="M236 586 L512 708 L788 586" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="60"/>
|
||||||
|
<path d="M292 676 L478 756 Q512 770 546 756 L732 676" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="42"/>
|
||||||
|
<circle cx="355" cy="544" r="13" fill="#ffffff"/>
|
||||||
|
<path d="M512 304 L512 494" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="58"/>
|
||||||
|
<circle cx="512" cy="202" r="55" fill="#ffffff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 852 B |
|
After Width: | Height: | Size: 42 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#111111"/>
|
||||||
|
|
||||||
|
<path d="M232 560 Q512 410 792 560 Q816 576 792 592 Q610 648 552 692 Q512 716 472 692 Q414 648 232 592 Q208 576 232 560 Z" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#fffdf4" stroke-width="56"/>
|
||||||
|
<path d="M278 642 L470 728 Q512 748 554 728 L746 642" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#fffdf4" stroke-width="46"/>
|
||||||
|
<circle cx="342" cy="554" r="15" fill="#fffdf4"/>
|
||||||
|
<path d="M512 316 L512 518" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#fffdf4" stroke-width="72"/>
|
||||||
|
<circle cx="512" cy="205" r="58" fill="#fffdf4"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 803 B |
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="1024" height="1024" rx="160" fill="#171717"/>
|
||||||
|
|
||||||
|
<path d="M246 532 L512 420 L778 532 L512 650 Z" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="58"/>
|
||||||
|
<path d="M286 628 L472 710 Q512 728 552 710 L738 628" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="48"/>
|
||||||
|
<path d="M330 708 L478 774 Q512 790 546 774 L694 708" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="38"/>
|
||||||
|
<circle cx="348" cy="535" r="14" fill="#ffffff"/>
|
||||||
|
<path d="M512 310 L512 504" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#ffffff" stroke-width="64"/>
|
||||||
|
<circle cx="512" cy="205" r="56" fill="#ffffff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 880 B |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 768 KiB |
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"model": "gpt-image-2-all",
|
||||||
|
"size": "1024x1024",
|
||||||
|
"generatedAt": "2026-05-14T18:03:02.694Z",
|
||||||
|
"creativeDirection": {
|
||||||
|
"name": "陶泥儿反糖果化脑洞泥印图形标",
|
||||||
|
"textPolicy": "no Chinese, no English, no wordmark",
|
||||||
|
"palette": "灰米白、陶土白、陶土褐、深泥灰、少量暗金土黄",
|
||||||
|
"motif": "哑光软方圆陶泥印章 + 星核凹印/负形 + 极少量刻点",
|
||||||
|
"antiCandyRules": "no glossy highlight, no cream filling, no jelly, no cookie, no chocolate, no candy star"
|
||||||
|
},
|
||||||
|
"variants": [
|
||||||
|
{
|
||||||
|
"id": "01-matte-clay-stamp",
|
||||||
|
"title": "哑光陶泥印章",
|
||||||
|
"file": "taonier-anti-candy-01-matte-clay-stamp.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:最克制的陶泥印章。灰米白软方圆主体,中间是压进去的暗陶土星核凹印,只有 2 个微小刻点。几乎无高光。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "02-kiln-mark-core",
|
||||||
|
"title": "窑印星核",
|
||||||
|
"file": "taonier-anti-candy-02-kiln-mark-core.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:窑印感。中间星核像烧陶后的浅浮雕窑印,用深泥灰边缘和陶土褐阴影表现,不要任何金属或糖果光泽。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "03-cutout-negative-star",
|
||||||
|
"title": "负形星核",
|
||||||
|
"file": "taonier-anti-candy-03-cutout-negative-star.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:负形。星核用干净的镂空负形或深泥灰内孔表达,主体是单块哑光陶泥,整体更像可注册商标图形。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "04-dry-clay-grain",
|
||||||
|
"title": "干陶颗粒",
|
||||||
|
"file": "taonier-anti-candy-04-dry-clay-grain.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:干陶质感。加入非常细微的陶土颗粒和粉陶纹理,但保持扁平图标,不要照片写实,不要脏乱。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "05-hand-pressed-token",
|
||||||
|
"title": "手压泥币",
|
||||||
|
"file": "taonier-anti-candy-05-hand-pressed-token.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:手压泥币。像一枚被手工压平的陶泥代币,边缘不完全对称,中间星核为凹刻符号,但不要出现手或工具。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "06-digital-clay-glyph",
|
||||||
|
"title": "数字泥符",
|
||||||
|
"file": "taonier-anti-candy-06-digital-clay-glyph.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:AI 与 UGC 暗示更强。用 3 个极小方形刻点围绕星核,像生成节点,但必须像刻在陶泥上的小孔。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "07-premium-flat-mark",
|
||||||
|
"title": "精品扁平标",
|
||||||
|
"file": "taonier-anti-candy-07-premium-flat-mark.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:更互联网精品。减少纹理,强化几何平衡和负形,灰米白主体、深泥灰星核、陶土褐小刻痕,适合 App 图标。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "08-monochrome-proof",
|
||||||
|
"title": "单色验证版",
|
||||||
|
"file": "taonier-anti-candy-08-monochrome-proof.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:黑白商标验证。尽量用单色深浅关系表达软方圆和星核凹印,减少装饰,确保黑白化后轮廓仍成立。"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 659 KiB |
|
After Width: | Height: | Size: 900 KiB |
|
After Width: | Height: | Size: 738 KiB |
|
After Width: | Height: | Size: 844 KiB |
|
After Width: | Height: | Size: 802 KiB |
|
After Width: | Height: | Size: 776 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 680 KiB |
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"model": "gpt-image-2-all",
|
||||||
|
"size": "1024x1024",
|
||||||
|
"generatedAt": "2026-05-14T17:45:55.245Z",
|
||||||
|
"creativeDirection": {
|
||||||
|
"name": "陶泥儿脑洞星核图形标",
|
||||||
|
"textPolicy": "no Chinese, no English, no wordmark",
|
||||||
|
"palette": "奶白、米白、暖棕、陶土棕、少量暖金",
|
||||||
|
"motif": "不规则软方圆陶泥团 + 脑洞星核 + 极少量星点"
|
||||||
|
},
|
||||||
|
"variants": [
|
||||||
|
{
|
||||||
|
"id": "01-minimal-braincore",
|
||||||
|
"title": "极简脑洞星核",
|
||||||
|
"file": "taonier-braincore-01-minimal-braincore.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:极简。只保留一个奶白不规则软方圆陶泥主体、一个居中的暖金四角星核、2 个极小暖金星点。不要额外装饰。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "02-soft-square-clay-seal",
|
||||||
|
"title": "软方圆陶泥印记",
|
||||||
|
"file": "taonier-braincore-02-soft-square-clay-seal.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:陶泥印记。主体像被轻轻按压成型的软方圆印章,边缘有自然手捏起伏,但不能像儿童玩具。星核略微偏心。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "03-warm-brown-embedded-core",
|
||||||
|
"title": "暖棕星核嵌入",
|
||||||
|
"file": "taonier-braincore-03-warm-brown-embedded-core.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:嵌入感。用暖棕内凹形或陶土棕阴影承托暖金星核,像灵感被嵌进陶泥里,仍保持扁平商标质感。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "04-subtle-pinch-marks",
|
||||||
|
"title": "轻微捏痕版本",
|
||||||
|
"file": "taonier-braincore-04-subtle-pinch-marks.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:捏痕。在陶泥主体边缘加入 2 到 3 个极轻微暖棕捏痕或凹口,表现可塑性;捏痕必须抽象、克制、可矢量化。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "05-premium-geometric-balance",
|
||||||
|
"title": "精品几何比例",
|
||||||
|
"file": "taonier-braincore-05-premium-geometric-balance.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:精品比例。整体更接近高级互联网 App 图标,几何平衡、负形干净、软方圆轮廓稳定,陶泥质感只保留一点点。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "06-soft-clay-texture",
|
||||||
|
"title": "柔软陶泥质感",
|
||||||
|
"file": "taonier-braincore-06-soft-clay-texture.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:柔软质感。在不破坏扁平矢量感的前提下,加入细腻奶油陶泥的微妙高光和暖棕渐层,不能变成 3D 玩具。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "07-app-icon-ready",
|
||||||
|
"title": "App 图标优先",
|
||||||
|
"file": "taonier-braincore-07-app-icon-ready.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:App 图标。图形占画面约 72%,轮廓饱满有记忆点,星核清晰醒目,适合放入圆角方形 App icon。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "08-trademark-monochrome-ready",
|
||||||
|
"title": "商标黑白提炼",
|
||||||
|
"file": "taonier-braincore-08-trademark-monochrome-ready.png",
|
||||||
|
"prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:商标注册。优先保证黑白化后仍清楚,减少渐变和细节,用奶白主体、暖棕负形和暖金星核形成强轮廓。"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 587 KiB |
|
After Width: | Height: | Size: 626 KiB |
|
After Width: | Height: | Size: 623 KiB |
|
After Width: | Height: | Size: 630 KiB |
|
After Width: | Height: | Size: 633 KiB |
|
After Width: | Height: | Size: 611 KiB |
|
After Width: | Height: | Size: 590 KiB |
|
After Width: | Height: | Size: 629 KiB |
|
After Width: | Height: | Size: 589 KiB |
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"model": "gpt-image-2-all",
|
||||||
|
"size": "1024x1024",
|
||||||
|
"generatedAt": "2026-05-14T20:18:49.419Z",
|
||||||
|
"logoSkillSummary": {
|
||||||
|
"requiredReview": "visual inspection, 32px readability, black-white viability",
|
||||||
|
"outputStatus": "AI concept only; final logo needs vector cleanup"
|
||||||
|
},
|
||||||
|
"brief": {
|
||||||
|
"brand": "陶泥儿",
|
||||||
|
"logoType": "symbol/icon-only mark, no wordmark",
|
||||||
|
"product": "AI UGC 轻休闲小游戏创作与传播平台,用户像捏陶泥一样把脑洞、梗和灵感塑造成作品",
|
||||||
|
"personality": [
|
||||||
|
"亲和",
|
||||||
|
"精品",
|
||||||
|
"创作感",
|
||||||
|
"轻松",
|
||||||
|
"年轻",
|
||||||
|
"有传播记忆点"
|
||||||
|
],
|
||||||
|
"mustHave": [
|
||||||
|
"闭合不规则几何底盘",
|
||||||
|
"外轮廓由流畅曲线组成",
|
||||||
|
"整体是一个完整符号而不是自由飘带",
|
||||||
|
"32px 仍能识别",
|
||||||
|
"黑白化后仍成立",
|
||||||
|
"无中文、无英文、无字标"
|
||||||
|
],
|
||||||
|
"avoid": [
|
||||||
|
"整体方形或圆角方块",
|
||||||
|
"中心星星或任何星形",
|
||||||
|
"自由飘带、旋涡、S/G 字母感",
|
||||||
|
"巧克力面包、甜点、饼干、糖果等食物感",
|
||||||
|
"砖块、土块、泥饼、陶片、考古印章",
|
||||||
|
"脸、表情、吉祥物、手、工具"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"variants": [
|
||||||
|
{
|
||||||
|
"id": "01-closed-curve-mark",
|
||||||
|
"title": "闭合曲线标",
|
||||||
|
"file": "taonier-logo-brief-01-closed-curve-mark.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: the cleanest closed irregular curve mark. Use two large color areas separated by one smooth internal curve. Maximize 32px readability."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "02-friendly-geo-seed",
|
||||||
|
"title": "亲和几何种",
|
||||||
|
"file": "taonier-logo-brief-02-friendly-geo-seed.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: a friendly seed-like closed geometric base, but not a literal seed, not food. Rounded and approachable with one teal accent curve."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "03-premium-soft-contour",
|
||||||
|
"title": "精品软轮廓",
|
||||||
|
"file": "taonier-logo-brief-03-premium-soft-contour.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: premium, calm, fewer colors. Strong outer contour with a dark mud-gray internal negative curve. Very logo-like, not illustrative."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "04-playful-closed-tile",
|
||||||
|
"title": "轻玩闭合片",
|
||||||
|
"file": "taonier-logo-brief-04-playful-closed-tile.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: a more playful closed irregular tile with warm terracotta and ceramic white. The internal curve should suggest creation flow, not filling."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "05-monochrome-first",
|
||||||
|
"title": "黑白优先",
|
||||||
|
"file": "taonier-logo-brief-05-monochrome-first.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: design as if it will be converted to black and white. Use bold positive and negative shapes; color only supports the structure."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "06-digital-clay-accent",
|
||||||
|
"title": "数字陶泥点",
|
||||||
|
"file": "taonier-logo-brief-06-digital-clay-accent.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: include at most two tiny geometric accent dots or notches that imply AI/UGC, but they must not look like candy sprinkles or decorative confetti."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "07-compact-avatar-symbol",
|
||||||
|
"title": "头像紧凑标",
|
||||||
|
"file": "taonier-logo-brief-07-compact-avatar-symbol.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: compact social-avatar readability. The closed contour should be slightly fuller and more iconic, but not a rounded-square app background."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "08-designer-vector-ready",
|
||||||
|
"title": "矢量定稿感",
|
||||||
|
"file": "taonier-logo-brief-08-designer-vector-ready.png",
|
||||||
|
"prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: make it look like a designer-ready vector concept: 2-3 flat shapes, crisp boundaries, distinctive closed outer contour, minimal material texture."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 821 KiB |
|
After Width: | Height: | Size: 959 KiB |
|
After Width: | Height: | Size: 839 KiB |
|
After Width: | Height: | Size: 749 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 390 KiB |