@xiaobuyu/nodesign 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +140 -0
  3. package/bin/nodesign.js +176 -0
  4. package/package.json +104 -0
  5. package/server/api/README.md +45 -0
  6. package/server/api/_guard.js +75 -0
  7. package/server/api/admin.js +187 -0
  8. package/server/api/assets/docx-page.js +103 -0
  9. package/server/api/assets/helpers.js +22 -0
  10. package/server/api/assets/notes.js +144 -0
  11. package/server/api/assets.js +896 -0
  12. package/server/api/board.js +57 -0
  13. package/server/api/browse.js +138 -0
  14. package/server/api/canvas.js +444 -0
  15. package/server/api/chatai.js +324 -0
  16. package/server/api/exports/build-standalone.js +980 -0
  17. package/server/api/exports/cards.js +118 -0
  18. package/server/api/exports/docx-pdf.js +46 -0
  19. package/server/api/exports/export-page.js +142 -0
  20. package/server/api/exports/handoff.js +147 -0
  21. package/server/api/exports.js +690 -0
  22. package/server/api/instruction.js +75 -0
  23. package/server/api/local.js +115 -0
  24. package/server/api/me.js +116 -0
  25. package/server/api/memory.js +185 -0
  26. package/server/api/pending-changes.js +366 -0
  27. package/server/api/plugins.js +164 -0
  28. package/server/api/projects.js +220 -0
  29. package/server/api/publish.js +64 -0
  30. package/server/api/recent.js +73 -0
  31. package/server/api/sessions.js +589 -0
  32. package/server/api/skills.js +77 -0
  33. package/server/api/standalone-fit.js +168 -0
  34. package/server/api/turn-compose.js +180 -0
  35. package/server/api/turn-inflight.js +44 -0
  36. package/server/api/turn.js +669 -0
  37. package/server/auth/README.md +17 -0
  38. package/server/auth/middleware.js +138 -0
  39. package/server/auth/origin-guard.js +71 -0
  40. package/server/auth/session.js +108 -0
  41. package/server/auth/tier.js +113 -0
  42. package/server/auth/users-store.js +348 -0
  43. package/server/edit/README.md +29 -0
  44. package/server/engine/README.md +113 -0
  45. package/server/engine/agent/agent-shared.js +550 -0
  46. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -0
  47. package/server/engine/agent/auto-mode-rules.js +78 -0
  48. package/server/engine/agent/context.js +418 -0
  49. package/server/engine/agent/events.js +464 -0
  50. package/server/engine/agent/hooks/canvas-validate.js +199 -0
  51. package/server/engine/agent/hooks/failure.js +120 -0
  52. package/server/engine/agent/hooks/file-events.js +75 -0
  53. package/server/engine/agent/hooks/lifecycle.js +233 -0
  54. package/server/engine/agent/hooks/post-canvas-focus.js +80 -0
  55. package/server/engine/agent/hooks/post-guidance.js +206 -0
  56. package/server/engine/agent/hooks/post-subagent-report.js +104 -0
  57. package/server/engine/agent/hooks/post-trim.js +58 -0
  58. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -0
  59. package/server/engine/agent/hooks/pre-defaults.js +84 -0
  60. package/server/engine/agent/hooks/pre-injectors.js +277 -0
  61. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -0
  62. package/server/engine/agent/hooks/pre-starter-files.js +61 -0
  63. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -0
  64. package/server/engine/agent/hooks/site-validate.js +94 -0
  65. package/server/engine/agent/hooks/tool-prompts.js +31 -0
  66. package/server/engine/agent/hooks/turn-state-memory.js +56 -0
  67. package/server/engine/agent/hooks/user-prompt-submit.js +215 -0
  68. package/server/engine/agent/hooks.js +354 -0
  69. package/server/engine/agent/init-contract.js +69 -0
  70. package/server/engine/agent/isolation.js +159 -0
  71. package/server/engine/agent/model-context.js +359 -0
  72. package/server/engine/agent/model-table.js +292 -0
  73. package/server/engine/agent/plugin-loader.js +266 -0
  74. package/server/engine/agent/prompts/nodesign-prelude.md +336 -0
  75. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -0
  76. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -0
  77. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -0
  78. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -0
  79. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -0
  80. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -0
  81. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -0
  82. package/server/engine/agent/prompts/tools/site-reference.md +106 -0
  83. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -0
  84. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -0
  85. package/server/engine/agent/session-loop.js +1024 -0
  86. package/server/engine/agent/session-model.js +164 -0
  87. package/server/engine/agent/skill.js +204 -0
  88. package/server/engine/agent/system-prompts.js +86 -0
  89. package/server/engine/agent/task-events.js +78 -0
  90. package/server/engine/agents/ds-extractor.md +132 -0
  91. package/server/engine/agents/explorer.md +190 -0
  92. package/server/engine/agents/index.js +230 -0
  93. package/server/engine/agents/schemas/design-system.json +156 -0
  94. package/server/engine/agents/schemas/tweak-schema.json +113 -0
  95. package/server/engine/agents/tweak-proposer.md +127 -0
  96. package/server/engine/agents/vision-checker.md +254 -0
  97. package/server/engine/browse/capture.js +422 -0
  98. package/server/engine/browse/card.js +137 -0
  99. package/server/engine/browse/handover.js +59 -0
  100. package/server/engine/browse/page-digest.js +119 -0
  101. package/server/engine/browse/refs.js +196 -0
  102. package/server/engine/browse/registry.js +307 -0
  103. package/server/engine/browse/screencast.js +170 -0
  104. package/server/engine/browse/state.js +121 -0
  105. package/server/engine/chatai/chat-log.js +79 -0
  106. package/server/engine/chatai/index.js +193 -0
  107. package/server/engine/chatai/openai-compat.js +152 -0
  108. package/server/engine/chatai/orchestrate.js +309 -0
  109. package/server/engine/chatai/perform.js +40 -0
  110. package/server/engine/chatai/summarize.js +79 -0
  111. package/server/engine/mcp/capability-gate.js +52 -0
  112. package/server/engine/mcp/index.js +339 -0
  113. package/server/engine/mcp/param-sanitizer.js +142 -0
  114. package/server/engine/mcp/tools/arrange-on-board.js +124 -0
  115. package/server/engine/mcp/tools/artifact-session.js +278 -0
  116. package/server/engine/mcp/tools/browse-computer.js +421 -0
  117. package/server/engine/mcp/tools/browse-find-batch.js +183 -0
  118. package/server/engine/mcp/tools/browse-screenshot.js +157 -0
  119. package/server/engine/mcp/tools/browse.js +480 -0
  120. package/server/engine/mcp/tools/build-docx.js +101 -0
  121. package/server/engine/mcp/tools/clear-pending-changes.js +99 -0
  122. package/server/engine/mcp/tools/create-on-board.js +155 -0
  123. package/server/engine/mcp/tools/crystallize-skill.js +168 -0
  124. package/server/engine/mcp/tools/deliver-files.js +0 -0
  125. package/server/engine/mcp/tools/explain-style.js +237 -0
  126. package/server/engine/mcp/tools/export-handoff.js +133 -0
  127. package/server/engine/mcp/tools/expose-tweaks.js +149 -0
  128. package/server/engine/mcp/tools/generate-image.js +842 -0
  129. package/server/engine/mcp/tools/get-computed-styles.js +164 -0
  130. package/server/engine/mcp/tools/get-pending-changes.js +205 -0
  131. package/server/engine/mcp/tools/h3box-ssh.js +84 -0
  132. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -0
  133. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -0
  134. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -0
  135. package/server/engine/mcp/tools/helpers/perception-page.js +215 -0
  136. package/server/engine/mcp/tools/helpers/reference-download.js +103 -0
  137. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -0
  138. package/server/engine/mcp/tools/helpers/rembg.js +273 -0
  139. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -0
  140. package/server/engine/mcp/tools/highlight.js +68 -0
  141. package/server/engine/mcp/tools/list-pages.js +222 -0
  142. package/server/engine/mcp/tools/lookup-tags.js +59 -0
  143. package/server/engine/mcp/tools/navigate-to-page.js +60 -0
  144. package/server/engine/mcp/tools/organize-board.js +64 -0
  145. package/server/engine/mcp/tools/paint-still.js +434 -0
  146. package/server/engine/mcp/tools/pin-to-board.js +130 -0
  147. package/server/engine/mcp/tools/preview-deck.js +130 -0
  148. package/server/engine/mcp/tools/profile-scroll.js +305 -0
  149. package/server/engine/mcp/tools/publish-site.js +102 -0
  150. package/server/engine/mcp/tools/query-elements.js +195 -0
  151. package/server/engine/mcp/tools/read-board.js +103 -0
  152. package/server/engine/mcp/tools/read-document.js +93 -0
  153. package/server/engine/mcp/tools/read-page.js +264 -0
  154. package/server/engine/mcp/tools/read-tavern-json.js +143 -0
  155. package/server/engine/mcp/tools/record-decision.js +140 -0
  156. package/server/engine/mcp/tools/relate-on-board.js +110 -0
  157. package/server/engine/mcp/tools/remove-background.js +391 -0
  158. package/server/engine/mcp/tools/report-issue.js +115 -0
  159. package/server/engine/mcp/tools/roll-film.js +266 -0
  160. package/server/engine/mcp/tools/screenshot-docx.js +138 -0
  161. package/server/engine/mcp/tools/screenshot-url.js +195 -0
  162. package/server/engine/mcp/tools/screenshot.js +583 -0
  163. package/server/engine/mcp/tools/tier-gate.js +96 -0
  164. package/server/engine/mcp/tools/trace-motion.js +215 -0
  165. package/server/engine/mcp/tools/web-search.js +548 -0
  166. package/server/engine/motion/inventory.js +349 -0
  167. package/server/engine/perception/session.js +235 -0
  168. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -0
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -0
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -0
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -0
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -0
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -0
  174. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -0
  175. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -0
  176. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -0
  177. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -0
  178. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -0
  179. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -0
  180. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -0
  181. package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +78 -0
  182. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -0
  183. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -0
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -0
  185. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -0
  186. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -0
  187. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -0
  188. package/server/engine/runs/active-runs.js +698 -0
  189. package/server/engine/runs/live-turn.js +252 -0
  190. package/server/engine/runs/store.js +364 -0
  191. package/server/engine/runs/turn-relay.js +217 -0
  192. package/server/engine/runtime/workspace.js +164 -0
  193. package/server/index.js +235 -0
  194. package/server/lib/artifact-file-path.js +80 -0
  195. package/server/lib/artifact-target.js +284 -0
  196. package/server/lib/asset-refs.js +239 -0
  197. package/server/lib/async-queue.js +104 -0
  198. package/server/lib/auto-relations.js +130 -0
  199. package/server/lib/binding-types.js +60 -0
  200. package/server/lib/board-kind-sizes.js +62 -0
  201. package/server/lib/board-relations.js +133 -0
  202. package/server/lib/browse-proxy.js +180 -0
  203. package/server/lib/canvas-id.js +36 -0
  204. package/server/lib/cover.js +227 -0
  205. package/server/lib/danbooru-tags.js +291 -0
  206. package/server/lib/doc-extract.js +156 -0
  207. package/server/lib/docx/build-from-source.js +260 -0
  208. package/server/lib/docx/build.js +490 -0
  209. package/server/lib/docx/dump-styles.js +287 -0
  210. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -0
  211. package/server/lib/docx/merge-runs.js +129 -0
  212. package/server/lib/docx/numbering.js +218 -0
  213. package/server/lib/docx/order.js +152 -0
  214. package/server/lib/docx/rawzip.js +172 -0
  215. package/server/lib/docx/render.js +92 -0
  216. package/server/lib/docx/text-lint.js +225 -0
  217. package/server/lib/docx/tokens.js +335 -0
  218. package/server/lib/docx/units.js +29 -0
  219. package/server/lib/docx/xml.js +291 -0
  220. package/server/lib/docx-pages.js +187 -0
  221. package/server/lib/export-collect.js +289 -0
  222. package/server/lib/export-package.js +210 -0
  223. package/server/lib/html-srcset.js +145 -0
  224. package/server/lib/image-variant.js +460 -0
  225. package/server/lib/ingress/forward-openai-chat.js +305 -0
  226. package/server/lib/ingress/openai-chat.js +491 -0
  227. package/server/lib/ingress/session-notice.js +66 -0
  228. package/server/lib/ingress/session-routes.js +68 -0
  229. package/server/lib/ingress/slot-probe.js +130 -0
  230. package/server/lib/ingress/upstream-billing.js +52 -0
  231. package/server/lib/ingress/upstream-fail-streak.js +72 -0
  232. package/server/lib/ingress/upstream-truncation.js +48 -0
  233. package/server/lib/issues-store.js +182 -0
  234. package/server/lib/kinds/deck.js +72 -0
  235. package/server/lib/kinds/docx.js +283 -0
  236. package/server/lib/kinds/file-kinds.js +113 -0
  237. package/server/lib/kinds/index.js +202 -0
  238. package/server/lib/kinds/site.js +161 -0
  239. package/server/lib/model-ingress.js +543 -0
  240. package/server/lib/moderation.js +255 -0
  241. package/server/lib/notice-store.js +103 -0
  242. package/server/lib/plugin-install.js +104 -0
  243. package/server/lib/plugin-validator.js +721 -0
  244. package/server/lib/publish-store.js +115 -0
  245. package/server/lib/quick-summary.js +52 -0
  246. package/server/lib/quota.js +270 -0
  247. package/server/lib/rate-window.js +29 -0
  248. package/server/lib/reference-assets.js +92 -0
  249. package/server/lib/region-shot.js +135 -0
  250. package/server/lib/safe-path.js +73 -0
  251. package/server/lib/sdk-session.js +33 -0
  252. package/server/lib/showcase-store.js +92 -0
  253. package/server/lib/site-publish.js +465 -0
  254. package/server/lib/ssrf-guard.js +432 -0
  255. package/server/lib/task-scan.js +158 -0
  256. package/server/lib/tavern-json.js +154 -0
  257. package/server/lib/video-variant.js +237 -0
  258. package/server/lib/workspace-path.js +33 -0
  259. package/server/ops/fix-sdk-musl.mjs +40 -0
  260. package/server/ops/install-macos-fonts.sh +114 -0
  261. package/server/ops/macos-fonts.conf +336 -0
  262. package/server/ops/sandbox-shim/bwrap +57 -0
  263. package/server/projects/assets-summary.js +119 -0
  264. package/server/projects/auto-name.js +53 -0
  265. package/server/projects/board-store.js +640 -0
  266. package/server/projects/move-entry.js +103 -0
  267. package/server/projects/store.js +270 -0
  268. package/server/projects/ui-config.js +54 -0
  269. package/server/projects/workspace-templates.js +53 -0
  270. package/server/projects/workspace.js +1025 -0
  271. package/server/runtime/capabilities.js +153 -0
  272. package/server/runtime/local-config.js +177 -0
  273. package/server/runtime/local-env.js +88 -0
  274. package/server/runtime/platform.js +342 -0
  275. package/server/runtime/profile.js +72 -0
  276. package/server/services/rembg-launcher.js +313 -0
  277. package/server/services/rembg-service.py +334 -0
  278. package/server/shared/README.md +25 -0
  279. package/server/shared/deck.js +54 -0
  280. package/server/shared/time.js +49 -0
  281. package/server/style-pipeline/README.md +53 -0
  282. package/server/ws/broker.js +36 -0
  283. package/server/ws/browse-channel.js +177 -0
  284. package/server/ws/index.js +386 -0
  285. package/web/README.md +89 -0
  286. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +11 -0
  287. package/web/dist/assets/DeckWindow-4G0xX7P3.js +16 -0
  288. package/web/dist/assets/DocxWindow-BXQsoPkh.js +16 -0
  289. package/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/web/dist/assets/SiteWindow-D6eS-2gM.js +18 -0
  349. package/web/dist/assets/again-D8tfgKKO.webp +0 -0
  350. package/web/dist/assets/caveat-nd-CP6HlsNg.woff2 +0 -0
  351. package/web/dist/assets/clock-xJhvfYpS.webp +0 -0
  352. package/web/dist/assets/film-cut-BBKMwH7q.webp +0 -0
  353. package/web/dist/assets/film-still-BZ_DL9Tt.webp +0 -0
  354. package/web/dist/assets/index-C0KUf6Wd.css +1 -0
  355. package/web/dist/assets/index-Cbl3ATvp.js +2125 -0
  356. package/web/dist/assets/ink-desk-BRbxeDsR.webp +0 -0
  357. package/web/dist/assets/ink-night-Bz4BT3XH.webp +0 -0
  358. package/web/dist/assets/ink-portrait-C0DM4V8Q.webp +0 -0
  359. package/web/dist/assets/longcang-regular-C0uvTuKa.woff2 +0 -0
  360. package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
  361. package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
  362. package/web/dist/assets/pending-edit-apply-DTjo2geW.js +31 -0
  363. package/web/dist/assets/question-8H4HSqxh.webp +0 -0
  364. package/web/dist/assets/reject-BaPJqElj.webp +0 -0
  365. package/web/dist/assets/rotate-cw-LMT3x1Zj.js +11 -0
  366. package/web/dist/assets/rp-portrait-CbrGpew2.webp +0 -0
  367. package/web/dist/assets/rp-street-C4jVKjxx.webp +0 -0
  368. package/web/dist/assets/square-dashed-mouse-pointer-CBoAkfhi.js +11 -0
  369. package/web/dist/assets/tangle-DIxHVNuT.webp +0 -0
  370. package/web/dist/assets/thisone-BylZKglV.webp +0 -0
  371. package/web/dist/assets/thumb-DO1wfK1I.webp +0 -0
  372. package/web/dist/index.html +18 -0
@@ -0,0 +1,583 @@
1
+ # generate_image cookbook(Gemini gateway 版 · 已停用,不注入)
2
+
3
+ > ⛔ **这份文件不再被注入**。2026-08-17 起 cookbook 换成了写给 codex + gpt-image-2 的
4
+ > 版本(同目录 `generate-image-cookbook.md`),因为默认后端 2026-07-27 就已经换成 codex
5
+ > 订阅生图,而本文大量篇幅在教 Gemini/Nano-Banana-2 专属旋钮:`imageSize` /
6
+ > `thinkingLevel` / `model` 的 flash-pro 路由 / Image Search Grounding / PDF 文档输入 /
7
+ > NB2 model card 失败模式。这些参数在 codex 后端上**传了不报错也没有任何效果**,
8
+ > 留着只会让 agent 花心思去拨一个不存在的开关(还不会收到报错)。
9
+ >
10
+ > 本文原样保留,供 `NODESIGN_IMAGE_PROVIDER=gateway` 重新启用时取回。注入是按文件名
11
+ > 精确加载的(`loadToolPrompt('generate-image-cookbook')`),所以这个别名文件不会被读到。
12
+ >
13
+ > 以下为停用前原文。
14
+
15
+ ---
16
+
17
+ # generate_image 完整 cookbook
18
+
19
+ > 此文件由 PreToolUse(mcp__nodesign__generate_image) hook 在 agent 首次调用工具时
20
+ > 注入。SKILL.md 已含精简版核心要点,本文是深度参考——agent 看完后可拿出更稳的 prompt。
21
+
22
+ **后端(2026-07-27 起)**:默认走 codex 订阅生图。你的 prompt 会被逐字下传给图像
23
+ 模型;生效参数只有 prompt + aspectRatio + referenceImages(PDF reference 不支持,
24
+ imageSize / thinkingLevel / useGrounding / model 静默忽略——本文提到这些 Gemini
25
+ 参数的段落只在 gateway 模式下适用)。单张 ~45-60s,别挥霍:一张对齐好的 anchor
26
+ 胜过一堆试探性变体。prompt 写作方法论(5 元素公式 / 渲文字 / 反例)全部照旧适用。
27
+ 落档 `assets/generated/<name>.png`,HTML 里引 `<img src="assets/generated/<name>.png">`
28
+ (softlink 透明)。
29
+
30
+ ## 0. Reference 来源策略(生图前先决定从哪儿拿 reference)
31
+
32
+ | 主体 | 来源 | 触发动作 |
33
+ |---|---|---|
34
+ | 用户上传素材(`assets/*.png\|jpg`)| 直接用 | 把路径喂 `referenceImages[]` |
35
+ | Knowledge cutoff 内的著名实体(Apple Park / Wong Kar-wai 风 / 艺术流派)| 模型脑里有 | prompt 直接点名,不必 reference |
36
+ | **真实存在但模型不熟**(最新发布产品 / 小众品牌 / 用户自有 IP / 特定型号设备)| **`web_search { include_images:true }`** | 工具自动翻英文 + 下载到 `assets/references/`;选 1-2 张最切题的 `local_path` 喂 `referenceImages[]` |
37
+ | 抽象概念 / 装饰 / 隐喻 | 不需要 reference | 直接 prompt(流派 + 5 元素公式)|
38
+
39
+ ### `include_images=true` 用法
40
+
41
+ **使用时机**:用户主题确定后、`generate_image` 之前,当生图主体是**真实存在的物体/品牌/场景**(产品照、地标、明星、设备、车型、食物、自然风光等)。Knowledge cutoff 之前的东西模型脑里有不必搜;**最近发布的产品 / 小众品牌 / 用户自有 IP** 必搜。
42
+
43
+ **Provider 路由(auto)**:
44
+ - CJK query → **baidu**(母语图搜,不翻英;image 条目 + web 条目附图都收)
45
+ - 英文 query → **tavily**(描述质量最高,几乎条条有详细 caption)
46
+ - exa fallback(页面代表图 `results[].image` + 页面内 `extras.imageLinks`)
47
+ - ⚠️ zhipu **不支持**图搜,include_images 模式下被拒
48
+
49
+ **输入 / 输出契约**:
50
+ ```
51
+ mcp__nodesign__web_search { query: "新能源汽车 充电桩 产品", include_images: true, count: 5 }
52
+ ↓ 内部:auto-route → baidu (CJK 不翻) / tavily (CJK→en 翻译) / exa
53
+ ↓ 下载 top-N 到 <workspace>/assets/references/ref-<hash>.<ext>
54
+ ↓ 返回值:
55
+ • 1 个 text block:markdown,含 hits + "## Reference images (downloaded, N)"
56
+ 每条带 description / local_path / size / source / url
57
+ • N 个 image content block:每张下载到的 reference 图按 markdown 编号
58
+ 顺序内嵌,**当 turn 你直接 vision-check 即可,不必再调 Read**
59
+ ```
60
+
61
+ **vision-check → 选图 → 喂 generate_image**:拿到结果后扫一眼内嵌的 N 张图,按视觉切题度选 1-2 张最好的(光线/构图/主体清晰度),把对应 markdown 条目里的 `local_path` 字段塞进 `referenceImages[]`。靠 description 文字盲选会踩坑(描述准确度参差,特别是 baidu 用 parent title 兜底的条目)。
62
+
63
+ **关键页例外 — 让用户挑而不是 agent 默选**:cover / 跨页 anchor / portrait 这种**会被当 referenceImages 跨页种子**复用的页型,agent 默选错一张全 deck 漂。这些页的 reference 选择**主动调 AskUserQuestion + image preview**:每个 option 贴一张候选图(用 `local_path` 转 base64 或用 markdown image url),让用户视觉对比挑哪张当种子。装饰 / 普通页 agent 自选即可不必问。
64
+
65
+ **衔接 generate_image**:从 `local_path` 直接喂 `referenceImages[]`:
66
+ ```
67
+ mcp__nodesign__generate_image {
68
+ prompt: "...",
69
+ referenceImages: ["assets/references/ref-a3f2b1.png"],
70
+ ...
71
+ }
72
+ ```
73
+ - ⚠️ **referenceImages 只接 workspace 相对路径** —— 喂 http url 会被拒
74
+ - ⚠️ **选 1-2 张最切题的** —— 全 5 张全喂反而稀释 anchor,模型不知道该锚哪张
75
+
76
+ **何时不该用 `include_images`**:
77
+ - 抽象 / 装饰类(icon, decoration, pattern, texture)—— 模型自己脑补就行
78
+ - 概念图(流程、拼贴、隐喻)—— 没有"真实参考"的语义
79
+ - knowledge cutoff 内的著名实体("Apple Park"、"Wong Kar-wai cinematography")—— 直接 prompt 就够准
80
+
81
+ ## A. 模型本质 —— 用之前先看一眼
82
+
83
+ | 事实 | 你能利用什么 |
84
+ |---|---|
85
+ | **knowledge cutoff 2025-01** | brand / 名人 / 地标 / 艺术家 / 流派 / 影视 / 摄影器材 / film stock 全在脑里 |
86
+ | **131K input token** | 跨页讲故事 + 多 reference 拼合不会爆 |
87
+ | **reference cap:4 character + 10 object(共 14)** | 超过 4 char ref 模型会 blur 角色 identity;按角色/物体细分预算更稳 |
88
+ | **听得懂 conversational editing** | "Keep composition, change lighting to golden hour" 比重生整张准 |
89
+ | **多变体单 prompt** | "Create THREE distinct variations" 一次出 3 张,省 60% token |
90
+ | **角色命名锚定** | 给角色起名("Maya"),下个 turn 它脑里就锚定了 |
91
+ | **不擅长 negation** | "no cars" 改写成 "empty pedestrianized street" |
92
+ | **多语言文字渲染 + in-image localization** | 不止翻文字,还能换 props / 文化语境(详见 § D)|
93
+ | **Thinking 永远在跑** | `thinkingLevel: minimal\|high` 是预算不是开关;thinking tokens 永远计费即便不返回 |
94
+ | **Aspect ratio 严格遵守(NB2 改进)** | 传啥比例就出啥,prompt 里不必再"in 16:9 widescreen format"重复 |
95
+
96
+ **直接点名**——别犹豫:
97
+ - ✅ "Wong Kar-wai cinematography" ✅ "Apple Park building" ✅ "Van Gogh-style oil painting"
98
+ - ✅ "Beatles' Abbey Road photo composition" ✅ "Fujifilm color science" ✅ "Bauhaus poster aesthetic"
99
+ - ✅ "Saul Bass minimalist title sequence" ✅ "ukiyo-e woodblock print style" ✅ "1980s VHS aesthetic"
100
+
101
+ **别让 NB2 干这些(不是它的活)**:
102
+
103
+ | 想做的事 | 别叫 NB2 干,改叫 |
104
+ |---|---|
105
+ | 调工具 / function calling | 主 agent 自己(NB2 不支持 tool use)|
106
+ | 返结构化 JSON | 主 agent + AskUserQuestion 或自己解析 |
107
+ | 执行代码 / 算公式 | 主 agent 用 Bash 跑 Python |
108
+ | 抓 URL / 浏览网页 | `mcp__nodesign__web_search` |
109
+ | 用 file search / 读文档 | 主 agent Read,重要文档用 `referenceImages` 喂 PDF(见 § K)|
110
+ | Maps grounding | 不支持 |
111
+ | 持久 context caching | 不支持,每次请求自带需要的 reference |
112
+ | 语音 / 视频输入输出 | NB2 仅吃 text + image + PDF,输出仅 image + text |
113
+
114
+ ## B. 5 元素叙述公式(强约束 prompt 结构)
115
+
116
+ ```
117
+ [Subject] + [Action] + [Location/context] + [Composition] + [Style]
118
+ ```
119
+
120
+ 3-5 句自然段比关键词列表准 10×。每段给 1-2 个具体属性。
121
+
122
+ **反例 vs 正例**:
123
+ - ❌ `"a woman on a street, blue dress, day"`
124
+ - ✅ `"[Subject] A young woman in a light blue linen shirt and tailored beige slacks, [Action] standing at a zebra crosswalk waiting for the light to change, [Location] in central Lisbon's Chiado district, midday overcast light filtered by tall pastel buildings, [Composition] medium shot at street level, slightly low angle, [Style] documentary photography style, 85mm shallow depth of field f/2.0, natural skin tones, Fujifilm color science"`
125
+
126
+ ## C. 词汇库(按场景分类)
127
+
128
+ | 类型 | 推荐词 |
129
+ |---|---|
130
+ | 镜头 | f/1.8 / f/2.8 / f/8 portrait, 35mm wide, 85mm portrait, 200mm telephoto, macro lens, fisheye, low-angle drone, top-down isometric, dutch angle |
131
+ | 相机 / film stock | GoPro (immersive distortion), Fujifilm (color science), Kodak Portra 400 (warm skin), Cinestill 800T (tungsten green halation), Ilford HP5 (B&W documentary), Hasselblad medium format, disposable camera (raw flash nostalgic), 1980s VHS |
132
+ | 灯光 | three-point softbox, Chiaroscuro high contrast, golden hour backlighting, blue hour, neon city night, candlelit interior, overcast diffuse, harsh midday sun, studio rim light |
133
+ | 色调 / 氛围 | cinematic muted teal and orange, bleach bypass, sepia toned, pastel washed, high saturation editorial, monochrome noir |
134
+ | 材质 | navy blue tweed, etched silver leaf, matte ceramic, brushed steel, raw linen, hand-blown glass, weathered concrete, lacquered wood, brushed velvet |
135
+ | 艺术流派 / 海报 | Bauhaus, Wabi-sabi, Memphis design, brutalist concrete, art nouveau lithograph, ukiyo-e, Mucha poster, Mondrian primary, Saul Bass minimalist, Swiss International typographic |
136
+
137
+ ## D. 渲文字 4 条铁律(Nano Banana 2 杀手级能力)
138
+
139
+ 1. **目标文字必带引号**:`render the words 'Annual Report 2026' on the cover`
140
+ 2. **指定字体风格 OR 字体名**:`in flowing Brush Script font` / `in Century Gothic 12pt` / `in heavy blocky Impact font`
141
+ 3. **多语言**:用一种语言写 prompt + 指定输出语言(`output the text in Japanese using a brush calligraphy style`)
142
+ 4. **复杂排版先对话再生图**:> 3 行字 / 多种字体混排时,先用 chat 跟模型对齐文字内容,再要求生图
143
+
144
+ **典型 prompt(cover 多字段并存)**:
145
+ > "A high-end glossy magazine cover, deep cherry red background. Render three lines of text with the following exact styling: top line 'GLOW' in flowing elegant Brush Script font; middle line '10% OFF' in heavy blocky Impact font; bottom line 'Your First Order' in thin minimalist Century Gothic font. Translate the text into Korean and Arabic for the bottom-right corner."
146
+
147
+ **进阶玩法 — typographic poster**(cover / section-divider 必看):
148
+ > "A typographic poster with a solid black background, bold letters spell 'NEW YORK', filling the center of the frame. The text acts as a cut-out window. A photograph of New York skyline is visible ONLY inside the letterforms."
149
+
150
+ ### In-image localization(已有图本地化,不只是翻文字)
151
+
152
+ NB2 会本地化**整个视觉文化语境**——文字翻译只是其中一项,还能换 props / 货币 / 着装 / 食物 / 场景文化语境。规则:保留品牌身份 + 主体构图,调整其他即可:
153
+
154
+ > "Localize this ad for the Japanese market.
155
+ > Translate the headline exactly to Japanese: '〜こだわりの一杯〜'.
156
+ > Adapt background props, packaging context, and lifestyle cues for Tokyo consumers.
157
+ > Keep the product, logo, composition, and brand colors unchanged."
158
+
159
+ 适合:跨地区营销素材 / 多语言 deck 版本 / 品牌 global → local 适配。
160
+
161
+ ## E. Reference image 4 大模式(max 14 张:≤4 character ref + ≤10 object ref)
162
+
163
+ **multi-modal formula**:
164
+
165
+ ```
166
+ [Reference images] + [Relationship instruction] + [New scenario]
167
+
168
+ 例: "Using the napkin sketch (Reference 1) as the structure
169
+ and the fabric sample (Reference 2) as the texture,
170
+ transform this into a high-fidelity 3D armchair render.
171
+ Place it in a sun-drenched, minimalist living room."
172
+ ```
173
+
174
+ | 模式 | 怎么用 |
175
+ |---|---|
176
+ | **风格一致(cross-page anchor)** | 第 1 张 cover 当 referenceImages 种子,所有后续 hero/section-divider 都引它 → 整 deck 像同一张片子 |
177
+ | **角色一致(多页叙事)** | portrait 跨页引 + 给角色起名("Maya, the woman in Reference 1")→ 同一个角色穿越不同场景 |
178
+ | **logo / brand 嵌入** | 用户上传 logo 进 `assets/`,每张 product mockup 把 logo 当 reference + prompt"Place the logo from Reference 1 etched into the bottle in Reference 2" → 真实嵌融 |
179
+ | **In-painting(精修而非重画)** | 调 `screenshot_canvas` 截当前页 → 把截图当 reference + 用 conversational editing 语言(详见 § G semantic masking)|
180
+ | **真实主体锚定(web 搜来的 reference)** | 模型不熟的产品/品牌/最新事件 → 先 `web_search { include_images: true }` 拿真实图,再把 `assets/references/ref-xxx.<ext>` 喂 `referenceImages` + prompt"Use the product in Reference 1 as the subject; render it in [your scene]" |
181
+
182
+ ### 进阶 edit modes(reference 工作流的高级用法)
183
+
184
+ #### Multi-image composition(product-on-model / element-transfer)
185
+
186
+ NB2 高保真合成的官方杀手能力。模板:
187
+
188
+ ```
189
+ Image 1 = [object/product/garment/logo]
190
+ Image 2 = [person/environment/surface]
191
+ Instruction: "Take [element from Image 1] and place it on/with [element from Image 2].
192
+ Preserve [protected details] exactly.
193
+ Adjust lighting, shadows, perspective, and material interaction naturally."
194
+ ```
195
+
196
+ 具体例:
197
+ > "Take the blue floral dress from Image 1 and put it on the woman in Image 2.
198
+ > Preserve her face, hair, pose, and the cafe background exactly.
199
+ > Match lighting and shadow direction to the cafe scene; render fabric drape naturally."
200
+
201
+ 适合:服装上身 mockup / 产品上场景 / logo 烙印物体 / 标牌嵌建筑。
202
+
203
+ #### Style transfer(保构图,只换 style)
204
+
205
+ 不只是"梵高风"——关键是 **preserve composition / placement / silhouette**,只换 rendering style:
206
+
207
+ > "Transform this product photo into a Bauhaus poster illustration.
208
+ > Preserve the product shape, orientation, and composition.
209
+ > Change only the rendering style: flat geometric forms, primary color blocks,
210
+ > clean vector edges, 1920s Bauhaus poster design."
211
+
212
+ #### Sketch-to-final(线稿/wireframe → polished)
213
+
214
+ 用户给草图 / 线稿 / wireframe → 你输出 polished 视觉,**保留几何结构**:
215
+
216
+ > "Turn this rough wireframe into a polished 16:9 SaaS product hero visual.
217
+ > Keep the layout, card hierarchy, and main dashboard geometry from Reference 1.
218
+ > Add premium glassmorphism UI, soft blue studio lighting, and realistic depth.
219
+ > Leave top-right negative space for HTML title overlay."
220
+
221
+ 适合:用户上传草图想要 hero / 产品 mockup / 概念图。
222
+
223
+ #### Character bible(多视角 + 跨页一致)
224
+
225
+ 对于跨多页出现的角色 / mascot / 关键产品,先建 identity sheet:
226
+
227
+ ```
228
+ Step 1: 生成"identity sheet"(front view + 关键服装/装备特写)
229
+ Step 2: 后续每个角度(3/4 / profile / back / action pose)都把 identity sheet 当 reference
230
+ Step 3: 给角色起名锚定("Maya, character from Reference 1")
231
+ outfit / hairstyle / silhouette / 关键材质锚点 不允许跨页变
232
+ ```
233
+
234
+ 适合:deck 主角跨多页出现 / 品牌 mascot / 产品多视图说明。
235
+
236
+ ## F. 多变体单 prompt(省 token 大杀器)
237
+
238
+ ```
239
+ 单 prompt 出 3 候选 →
240
+ "Create THREE distinct variations of this cover hero,
241
+ vary the lighting and atmosphere (golden hour / blue hour / overcast)
242
+ but keep the subject and composition consistent"
243
+
244
+ → 1 次 generate_image 出 3 张候选,紧跟 AskUserQuestion(每个 option 用 preview 字段贴对应图)让用户并排选
245
+ → 比连调 3 次省 60% token,且变体间风格更统一
246
+ ```
247
+
248
+ 适用场景:cover 候选 / portrait 朝向候选 / palette 候选 / 标题排版候选。
249
+
250
+ ## G. Semantic masking & Conversational editing(精修 ≫ 重画)
251
+
252
+ NB2 不需要用户画 mask——你用**自然语言定义编辑区域**,模型自己分割(semantic masking)。万能模板:
253
+
254
+ ```
255
+ "Change only [semantic target].
256
+ Keep [everything else: subject / composition / lighting / palette] unchanged."
257
+ ```
258
+
259
+ 具体例:
260
+ > "Change only the blue sofa to a vintage brown leather chesterfield sofa.
261
+ > Keep the pillows, lighting, floor, wall art, and camera angle unchanged."
262
+
263
+ 这是 regenerate / tweak 的**默认模板**——比"重画一张差不多的"准 10×。
264
+
265
+ | 想做的 | ❌ 重生整张(浪费) | ✅ semantic masking |
266
+ |---|---|---|
267
+ | 改光线 | 重生整张 | "Keep composition, change only lighting to golden hour" |
268
+ | 换背景 | 重生整张 | "Replace only the background with a neon-lit city street; keep subject and pose" |
269
+ | 删元素 | 重生整张 | "Remove only the person on the left, extend the sidewalk; keep everything else" |
270
+ | 换字体 | 重生整张 | "Keep layout, change only headline font to a bold serif; body text unchanged" |
271
+ | 局部精修 | 重生整张 | screenshot_canvas + "Soften only the headline color in top-left corner; everything else identical" |
272
+ | 换主体材质 | 重生整张 | "Change only the table material from wood to brushed steel; keep shape, position, scene" |
273
+
274
+ 配合 `screenshot_canvas` 截当前页当 reference → 上面这种 prompt = 精修而非重画,token / latency / 一致性全赢。
275
+
276
+ ## H. 工具签名 + Aspect ratio / image size 详解
277
+
278
+ ### 工具签名
279
+
280
+ ```js
281
+ mcp__nodesign__generate_image({
282
+ prompt: "<3-5 句自然段,5 元素公式>",
283
+ model: "flash", // 'flash'(default NB2) | 'pro'(锚点图升档,见下方 model 路由)
284
+ aspectRatio: "16:9", // 14 种官方比例,见下表
285
+ imageSize: "1K", // '512' | '1K' | '2K' | '4K'
286
+ assetRole: "cover", // 必传 — emit + record_decision 都靠它定位
287
+ outputName: "deck-cover-v1",
288
+ referenceImages: [ // 可选, max 14(≤4 character + ≤10 object)
289
+ "assets/user-uploaded-logo.png",
290
+ "assets/generated/cover-anchor.jpg", // 用作 cross-page 风格种子
291
+ // 也可以是 .pdf —— 见 § K Document-to-visual
292
+ ],
293
+ thinkingLevel: "minimal", // 'minimal'(default) | 'high';预算不是开关,永远在跑且永远计费
294
+ useGrounding: false, // opt-in;真实地标/产品/场景开 ✅,人物/装饰/抽象不开 ❌(详见 § L)
295
+ })
296
+ ```
297
+
298
+ ### Aspect ratio × imageSize 映射(14 比例 + 4 size)
299
+
300
+ NB2 不出"标准 1920×1080"——实际像素见下表(部分常用组合):
301
+
302
+ | 比例 | 用例 | 1K 实际像素 | 2K | 4K |
303
+ |---|---|---:|---:|---:|
304
+ | 16:9 | deck cover / hero / 视频缩略图 | 1376×768 | 2752×1536 | 5504×3072 |
305
+ | 9:16 | mobile story / 竖屏宣传 | 768×1376 | 1536×2752 | 3072×5504 |
306
+ | 21:9 | 网站超宽 hero / 影院遮幅 | 1584×672 | 3168×1344 | 6336×2688 |
307
+ | 4:5 / 5:4 | portrait / Instagram 图 | ~1144×1432 | ~2288×2864 | ~4576×5728 |
308
+ | 3:2 / 2:3 | 横/竖摄影标准 | 1248×832 | 2496×1664 | 4992×3328 |
309
+ | 4:3 / 3:4 | 老 deck / 印刷 | 1184×888 | 2368×1776 | 4736×3552 |
310
+ | 1:1 | icon / pattern / 头像 | 1024×1024 | 2048×2048 | 4096×4096 |
311
+ | **8:1 / 1:8** | 顶部公告条 / 侧边装饰带 | 3072×384 / 384×3072 | 6144×768 | 12288×1536 |
312
+ | **4:1 / 1:4** | hero strip / 长卷海报 | ~2192×548 | ~4384×1096 | ~8768×2192 |
313
+
314
+ **512 (0.5K) tier**:长边 ~512px。专给 icon / sticker / decoration / UI 元素用——latency 和成本各降 ~50%,对小尺寸用例效果跟 1K 看不出差。**别用 1K 出 32px icon**。
315
+
316
+ ### Size 决策表
317
+
318
+ | 用例 | 推荐 size | 理由 |
319
+ |---|---|---|
320
+ | icon / sticker / 装饰 / UI 元素 | **512** | 渲染目标本来就小,更高分辨率纯浪费 |
321
+ | draft / 候选 / approval gate 预览 | 1K | default,approval 通过再升档 |
322
+ | deck cover / hero / 关键页 final | 2K | 渲染清晰、token 还可控 |
323
+ | 印刷 / 大屏展示 / 商用素材 | 4K | token 翻倍,approval 后再升 |
324
+
325
+ ### 反规则:尺寸/比例只走 API 参数
326
+
327
+ ❌ 别在 prompt 里写 "in 4K resolution" / "16:9 widescreen format" / "high resolution image" —— NB2 看 API 参数(`aspectRatio` / `imageSize`),prompt 里写这些是噪音
328
+ ✅ prompt 只描述场景内容,size/ratio 全靠工具参数控制
329
+
330
+ ### Thinking 透明度
331
+
332
+ | 字段 | 值 | 含义 |
333
+ |---|---|---|
334
+ | `thinkingLevel` | `minimal` (default) | NB2 用最少 thinking budget 出图,latency 优先 |
335
+ | `thinkingLevel` | `high` | 复杂 composition / 多 reference / 嵌大段文字 / 关键 final 时升 |
336
+ | 内部 `includeThoughts` | wrapper 默认 `false` | 不返回 interim thought images(只返 final 那张)|
337
+
338
+ **注意**:thinking tokens 永远计费——不是"关 thinking 省钱"的开关,而是"用多少 thinking 思考"的预算。`high` 比 `minimal` 慢 + 贵,但对 plan compliance / 文字精度 / 多 reference 一致性的提升常常值得。
339
+
340
+ ### Model 路由:flash (default) vs pro
341
+
342
+ NB2 有两档:
343
+
344
+ | `model` | id | 用 | 不用 |
345
+ |---|---|---|---|
346
+ | `'flash'` (default) | gemini-3.1-flash-image-preview | 几乎所有图——装饰 / 场景 / portrait / icon / 单页用 hero / 多变体探索 / 草稿 | — |
347
+ | `'pro'` | gemini-3-pro-image-preview | **会成为 referenceImages 种子的 anchor 图**:cover hero / character bible identity sheet / brand mockup hero / 标志性数据可视化 final | 装饰 / 单页用图 / 草稿 / 探索阶段 / 多变体候选 |
348
+
349
+ **判断规则**(一句话):**这张图会被后续 ≥3 张图引用为 reference?** 是 → `pro`,否 → `flash`。
350
+
351
+ **为啥锚点图升 pro 值得**:
352
+ - pro 比 flash 慢 ~2-3× + 贵 ~2-3×(单图成本几分钱差距)
353
+ - 但锚点图错了,downstream 引它的所有图全漂、整个 deck 视觉散——返工成本远超 pro 单图溢价
354
+ - 锚点图通常 1 个 deck 只有 2-5 张(cover / 主角 portrait / brand mockup),总额外成本可控
355
+
356
+ **反例**(这些场景**别**升 pro,纯浪费):
357
+ - 多变体单 prompt(`"Create THREE distinct variations"` 出 3 张候选选哪张当锚)—— 探索阶段用 flash 出候选,**只对最终选中的那张** rerun 一次 pro
358
+ - 装饰元素 / 单页用图 / icon / sticker —— 用不上的优化
359
+ - 草稿 / approval gate 之前的预览 —— 用 flash + 1K 看方向,approval 后再决定 pro 升档
360
+
361
+ ## I. Prompt 质量自检 6 维度(输出不理想时对照看)
362
+
363
+ - **结构** — 关键词堆砌(`"woman blue dress sunny"`)vs 自然段落描述。后者通常输出更稳,见 § B 5 元素公式
364
+ - **逻辑** — 否定描述(`"no cars"` / `"without people"`)模型容易理解反;改用肯定场景(`"empty pedestrianized street"`)更可控
365
+ - **修饰词** — `"nice"` / `"pretty"` / `"cool"` / `"高级感"` 过度抽象;用具体视觉词(灯光 / 材质 / 色温 / 字号)替代效果更可控
366
+ - **风格锚** — 没指定艺术流派 / 摄影风格 → 输出容易游移;点名一两个参考(`"Saul Bass minimalist"` / `"Fujifilm color science"`)会定向
367
+ - **文字精度** — 渲文字不带引号 + 不指定字体 → 容易跑样;明确 `render the text "XXX" in [Font Name]` 更稳
368
+ - **跨页一致** — 多页角色故事缺 referenceImages anchor → 每页独立生成时角色 / 调性容易漂;第 1 张定好后用 referenceImages 跨页复用
369
+
370
+ **额外注意**:
371
+ - icon / sticker 默认会出灰底(NB2 不支持 transparent)— 明确 `"white background"` 可消除
372
+ - 同 outputName 反复 reroll(≥3 次同 prompt)收益递减;改 prompt 关键参数或询问用户新方向通常更有效
373
+
374
+ ### NB2 已知失败模式(model card 列出的常见坑)
375
+
376
+ NB2 不是万能的——以下是 final 接受前**必扫**的 checklist:
377
+
378
+ | 维度 | 坑 | 检查 |
379
+ |---|---|---|
380
+ | **小字** | 1K 下 < 12px 等效字号容易模糊 | 关键文字单独大字 + 升 2K,或用 HTML overlay 覆盖文字别让 NB2 渲 |
381
+ | **长段落 / page-length text** | 模型在 > 1 段正文时容易跑样 | > 3 行字 / 整段 paragraph 让 HTML 渲,NB2 只渲 headline / 标语 |
382
+ | **角色漂** | 跨页生成同角色容易微变(脸型 / 发色 / 服装细节)| 跨页用 § E character bible 工作流(identity sheet + reference 链)|
383
+ | **左右 / 空间定位** | "left of"/"right of"/"behind" 偶尔反 | 关键定位用绝对短语("in the foreground"/"in the bottom-right corner")|
384
+ | **数量** | "exactly 5 cards" 不一定真出 5 张 | 数字关键时让 HTML 复制 N 份,NB2 只出 1 张 template |
385
+ | **Mask / sketch 残墨** | reference 是带涂鸦/标注的截图时 NB2 偶尔把标注当主体复制 | 截图前清干净 reference 上的标注 / 红框 / 箭头 |
386
+ | **Paste-artifact** | 多 reference 合成时偶尔把 reference 的局部 1:1 paste 进来 | 检查输出图有没有突兀的"贴片"边缘;有就改 prompt 强调 "naturally blend" / "reinterpret" |
387
+ | **factuality** | reference 没给的信息 NB2 可能编(datestamp / sources / 数字)| 数据 / 事实类内容用 HTML 渲,别让 NB2 自己写 |
388
+ | **transparent bg** | NB2 模型本身不支持,永远填某色背景 | **server 端独立工具兜底**:调 `mcp__nodesign__remove_background({ inputPath })` 抠任意 workspace 图片(rembg isnet + alpha matting),输出 RGBA PNG。warm ~8s。默认档已开 alpha matting,飘发 / 烟雾这类软边留得住;硬边主体(产品 / 图标 / UI 截图)主动降到 quality:'fast' 拿更利落的切口。SVG 图标仍优先 lucide-react。详见 § M |
389
+ | **SynthID watermark** | 所有 NB2 生图自带不可见 watermark | 知道即可;商用素材用户该知情 |
390
+
391
+ ## J. 调完必做
392
+
393
+ 1. **`record_decision`** —— 把 prompt + role + path + 用户评价记进任务便利贴(`notes/决策.md`),重生时能查回,用户在画布上也看得到
394
+ 2. **关键节点的反馈循环**:cover / 第一个 portrait / logo 嵌入这种页面级 anchor(会被当 referenceImages 种子用于 downstream),生完图后在自然回话里邀请用户反馈一下方向(例如:"这个 cover 当全 deck 视觉锚 OK 吗?想换风格告诉我")。这些是 downstream 的种子,早定早收益;用户下一轮 chat 反馈就是 conversational gate(generate_image 的 image content block 已自动渲染在 chat,用户能直接看到)。
395
+ 3. **落档后 read_page / list_pages 看到的是 thumbnail 快照**(`/api/canvas` GET 时把 `assets/generated/<n>.<ext>` 透明重写到 `.thumbnails/<n>.thumb.jpg`),真实 HTML / 文件系统中的 `<img src>` 不变。如果你 Read canvas.html 想确认 src 已写进去——直接看 Read 结果(不经 thumbnail 重写);如果想知道 preview iframe 加载哪张图——查 `.thumbnails/` 目录。重生原图 N 秒内 thumbnail 自动更新,preview 刷新即见最新。
396
+
397
+ ## K. Document-to-visual(PDF 输入 → 信息可视化)
398
+
399
+ NB2 把 `.pdf` 当 reference 喂进去会**真读 PDF 文本 + 表格**,然后按你的 prompt 生成 accurate 信息可视化。spike 实测一份 745 字节的 Q3 sales report PDF,模型把 "$4.2M / +18% / APAC / 42% / 8,500 / +25% YoY" 全部精准还原进 4 stat card 信息图。
400
+
401
+ **用法**:直接把 PDF 路径放 `referenceImages`,跟 image reference 同接口:
402
+
403
+ ```js
404
+ mcp__nodesign__generate_image({
405
+ prompt: "<想要的可视化 — 见下方 4 类场景>",
406
+ aspectRatio: "16:9",
407
+ imageSize: "2K",
408
+ assetRole: "infographic",
409
+ referenceImages: ["assets/uploads/q3-sales-report.pdf"],
410
+ })
411
+ ```
412
+
413
+ ### 4 类高 ROI 场景
414
+
415
+ | 场景 | 用户行为 | prompt 模板 |
416
+ |---|---|---|
417
+ | **研究报告 → infographic** | 用户上传白皮书 / 行业报告 PDF | `"Use the provided PDF as the factual source. Extract the [N] most important [data points / findings / metrics] for [audience]. Create a [aspect] [infographic / dashboard / chart] with [N zones / cards / sections]. Use [visual style: minimal / corporate / editorial]. Do not invent facts not present in the PDF."` |
418
+ | **brand guideline → 风格锚** | 用户上传 brand book / VI 手册 PDF | `"Use the provided brand guideline PDF as the visual reference. Generate a [hero / cover / mood board] that strictly follows the brand's primary palette, typography spirit, and tonal system from the PDF. Apply to a [deck cover / product mockup / scene]."` —— 后续每张图都引同一个 PDF 让整 deck 锁品牌 |
419
+ | **outline / meeting notes → deck 视觉骨架** | 用户上传 outline / 纪要 PDF | `"Read the document outline in the PDF. For each section, generate a thumbnail-style visual representing its core idea. Layout as a [N×M grid] storyboard for a [deck] structure."` |
420
+ | **竞品 deck → 模仿+创新** | 用户上传竞品 deck PDF | `"Reference the layout, color, and visual hierarchy of the provided competitor deck PDF. Create a similar visual style for [your topic]. Adapt their best layout patterns but use [your brand palette]."` |
421
+
422
+ ### Prompt 写作要点
423
+
424
+ - **明确"用 PDF 作为 factual source"** —— 防止 NB2 把 PDF 当装饰参考随便发挥;要它**真读内容**
425
+ - **明确"don't invent facts not in the PDF"** —— 信息可视化场景幻觉成本极高(编一个数字 = 整张图作废)
426
+ - **指定数据维度** —— "extract the 5 most important metrics" 比 "summarize the report" 准
427
+ - **指定视觉风格** —— editorial / corporate / minimal / dashboard 等具体词,别留 "good design"
428
+
429
+ ### 已知限制
430
+
431
+ - **PDF 单文件 ≤ 50MB**(gateway 限制);超大 PDF 拆成多个分别喂
432
+ - **PDF 只读文本 + 表格** —— PDF 里的图片、复杂图表、扫描页 NB2 不一定准确还原;纯图片 PDF 应当成 image reference 处理
433
+ - **PDF 算 reference budget** —— 1 个 PDF = 占 1 个 reference 槽位(共 14 槽)
434
+ - **PDF 不能做 character ref** —— PDF 算 object,不占 4 char ref 槽位
435
+
436
+ ## L. Image Search Grounding(NB2 调 Google Image Search 锚真实场景)
437
+
438
+ NB2 独有能力:传 `useGrounding: true`,模型在生图前可调 Google Image Search 拿真实参考,渲染出来的视觉**锚到现实实体**——不是模型脑里"通用印象"。
439
+
440
+ spike 实测:地标场景(Cape Coast Castle)开 grounding 出来的图能看到加纳国旗 + 真实建筑细节;不开 grounding 是模型脑里"通用非洲殖民堡垒"。
441
+
442
+ ### 用 vs 不用决策表
443
+
444
+ | 场景 | 用 grounding? | 理由 |
445
+ |---|:---:|---|
446
+ | 真实地标 / 建筑 / 城市风貌 | ✅ | 模型对最近发布 / 小众建筑不熟,grounding 救场 |
447
+ | 真实产品 / 设备(特别是新发布)| ✅ | knowledge cutoff 之后的产品脑里没参考 |
448
+ | 自然风光 / 特定地理位置 | ✅ | 季节 / 气候 / 时段细节模型容易脑补错 |
449
+ | 特定品牌门店 / 工厂 / 办公场景 | ✅ | 品牌识别度强的场景 |
450
+ | 历史事件场景 / 新闻图风格 | ⚠️ 慎用 | 新闻图敏感,attribution 必须显,cookbook agent 不直接做 |
451
+ | **真实人物 / 名人 / 角色 / 二次元 IP** | ❌ 没用 | model 自己拒触发(Google guardrail "no Image Search for people"),传了也是 vanilla 行为 |
452
+ | 抽象 / 装饰 / 纹样 / 图标 | ❌ 没用 | 没有"真实参考"语义,浪费 60-90s |
453
+ | 概念图 / 隐喻 / 象征 | ❌ 没用 | 同上 |
454
+ | 草稿 / 探索阶段 | ❌ 别用 | 慢 + 后期不一定用,纯浪费 |
455
+
456
+ ### 调用
457
+
458
+ ```js
459
+ mcp__nodesign__generate_image({
460
+ prompt: "A photorealistic image of Cape Coast Castle in Ghana as it looks today, midday tropical sun, aerial shot showing the white fortress walls and Atlantic Ocean.",
461
+ useGrounding: true, // ← opt-in
462
+ aspectRatio: "16:9",
463
+ imageSize: "2K",
464
+ assetRole: "section-divider",
465
+ })
466
+ ```
467
+
468
+ ### 工作流约束
469
+
470
+ | 项 | 说明 |
471
+ |---|---|
472
+ | **Latency** | 真触发 grounding 时 ~60-90s(vs 普通生图 ~15-30s)。draft 阶段别开 |
473
+ | **成本** | gateway 可能按 search query 额外计费,但单图溢价不大;锚点图值得 |
474
+ | **人物自动跳** | 模型对 portrait / character / "specific person" 类 prompt 不会真触发 grounding,wrapper 返回 caption 会带上 "(grounding requested but model didn't fire — likely person/character query)" 让你知道 |
475
+ | **Attribution** | wrapper 把完整 attribution metadata 落到 `assets/generated/<name>.grounding.json` sidecar;CallToolResult 里第二个 text block 显示 queries + top sources URL 让你简短报给用户("已用 Google Image Search 锚 5 个 source")|
476
+ | **Reference 互补** | 跟 `referenceImages` 不冲突——grounding 是模型动态拉,referenceImages 是你显式喂;同时用得到,模型会综合两边 |
477
+
478
+ ### 反例:别凡事都开
479
+
480
+ 错误用法 → 浪费 60-90s + 出图也没区别:
481
+ - ❌ 装饰背景 / pattern / 抽象艺术 → 不开 grounding
482
+ - ❌ 角色 / portrait → 不开(模型自己拒)
483
+ - ❌ 多变体探索 → 用 vanilla 出 3 个候选选一个,**只对最终选中的那张** rerun + grounding
484
+ - ❌ 同 prompt 反复 reroll —— grounding 不是质量万能药,prompt 不准 grounding 也救不回
485
+
486
+ ## M. remove_background —— 独立 MCP 工具抠透明背景
487
+
488
+ NB2 模型本身不支持 transparent bg(永远填某色背景),canvas bg 跟 NB2 默认色冲突时(agent 写黄底 deck,NB2 出灰底图直接糊)。**独立工具** `mcp__nodesign__remove_background({ inputPath })` 调 server 端 rembg 抠掉背景,输出 RGBA PNG 给你叠在任何 canvas 上。
489
+
490
+ **默认 quality = `balanced`(isnet-general-use + alpha matting)**,warm ~8s。alpha matting 是消 halo 的关键:不开的话抠完会剩大约 34% 的半透明杂散像素,开了降到 10%,飘发这类细节也留得住。
491
+
492
+ **为什么独立工具不绑 generate_image flag**:实际场景比"刚生的图想透明"更广——用户上传的产品照、之前生过的图、截图都该能抠。生图后想抠就再调一次本工具,0 重复 token。
493
+
494
+ ### quality 三档
495
+
496
+ | quality | 组成 | warm 时间 | 什么时候用 |
497
+ |---|---|---|---|
498
+ | `balanced` (default) | isnet + alpha matting | ~8s | **默认就用它**。人物 / 毛发 / 皮草 / 烟雾 / 织物 / 任何软边 |
499
+ | `fast` | isnet,不开 AM | ~7s | **主动降档**:硬边主体,软边会被看成糊——产品图 / 图标 / logo / UI 截图 / 平涂图形。大批量时也用它 |
500
+ | `best` | birefnet-general-lite + AM | 视机器 | 峰值内存 2.4GB+,**当前机器上被禁用**。只有 balanced 把主体形状本身分割错时才值得试 |
501
+
502
+ **别为了提速预先缩图**:alpha matting 限死在 1024 长边算完再把 alpha 放大回原尺寸,耗时不随输入像素数增长。缩了只会白丢分辨率。
503
+
504
+ **超上限会被显式拒绝**,不会静默降档。拿到拒绝信息就按它说的改档重试,别反复试同一档。
505
+
506
+ **warm vs cold**:server 启动时已 spawn 常驻 `rembg-service` python 进程(onnxruntime session 在内存),一般情况都走这条 warm 路径。service 不可用时 fallback 到 per-call cold spawn,每次多付 20-40s 模型 load,结果一样只是慢。
507
+
508
+ deck 里要抠 N 张串行调即可。**别并行**:这台机器 1 核,并行只会一起变慢还把内存峰值叠起来。
509
+
510
+ ### 何时调
511
+
512
+ | 场景 | 调 remove_background? |
513
+ |---|---|
514
+ | 角色 / portrait 叠到自定 bg 上(lifestyle photo + 品牌色背景) | ✅ |
515
+ | 产品 / 物体(咖啡杯 / 鞋 / 瓶子)做 hero 主图 | ✅ |
516
+ | 复杂带形状的 logo / 徽章 NB2 出底色冲突 | ✅ |
517
+ | 用户上传的参考图带白底 / 复杂背景,要叠到 deck | ✅ |
518
+ | 装饰性 pattern / texture / gradient 背景 | ❌(这些就是要带 bg) |
519
+ | 整页 cover / hero(背景就是整页主调) | ❌ |
520
+ | 简单线性图标(孤立图形,无渐变 / 阴影) | ❌——直接 `import { Heart } from 'lucide-react'` 走 SVG,免成本天然透明 |
521
+
522
+ ### 调用
523
+
524
+ ```js
525
+ // Case 1: 给刚生的图抠(生图 → 抠 两步)
526
+ const gen = mcp__nodesign__generate_image({
527
+ prompt: "A glossy ceramic coffee mug with steaming hot drink, photorealistic, top-down view, 85mm macro, soft natural light",
528
+ aspectRatio: "1:1",
529
+ imageSize: "1K",
530
+ assetRole: "decoration",
531
+ outputName: "coffee-mug",
532
+ });
533
+ // agent 看完图觉得想要透明叠到黄底上 →
534
+ mcp__nodesign__remove_background({
535
+ inputPath: "assets/generated/coffee-mug.png",
536
+ });
537
+ // 落 assets/generated/coffee-mug-nobg.png(RGBA)
538
+
539
+ // Case 2: 给用户上传的图抠
540
+ mcp__nodesign__remove_background({
541
+ inputPath: "assets/user-uploaded-product.jpg",
542
+ outputName: "product-isolated", // 可选,default 是 <inputBaseName>-nobg
543
+ });
544
+
545
+ // Case 3: 已存在 outputName 时,default 加 timestamp 后缀防误覆盖;想覆盖:
546
+ mcp__nodesign__remove_background({
547
+ inputPath: "assets/photo.png",
548
+ outputName: "photo-clean",
549
+ overwrite: true,
550
+ });
551
+
552
+ // Case 4: 关键 hero shot 要 SOTA 边缘 → quality:'best'
553
+ mcp__nodesign__remove_background({
554
+ inputPath: "assets/generated/cover-portrait.png",
555
+ outputName: "cover-portrait-clean",
556
+ quality: "best", // 首次会下 880MB birefnet-general 模型,~3-5min
557
+ });
558
+
559
+ // Case 5: 批量抠 N 张装饰图 → quality:'fast' 省时间
560
+ for (const img of decorations) {
561
+ mcp__nodesign__remove_background({ inputPath: img, quality: "fast" });
562
+ }
563
+ ```
564
+
565
+ agent 拿到的 caption 形如 `Removed background from assets/photo.png → assets/generated/photo-nobg.png (RGBA PNG, 245.3 KB, 3120ms, quality=balanced)` + image content block 直接 vision 看到效果。HTML 直接 `<img src="assets/generated/photo-nobg.png" style="...">` 叠在任何 bg 色上。
566
+
567
+ ### 工作流约束
568
+
569
+ | 项 | 说明 |
570
+ |---|---|
571
+ | **Latency** | server 常驻 service 路径(warm):fast ~5-10s / balanced ~10-20s / best ~20-40s。service down 时 fallback per-call spawn(cold):fast ~30-60s / balanced ~60-180s / best ~120-300s |
572
+ | **首次模型下载** | balanced(birefnet-general-lite)214MB;best(birefnet-general)880MB——首次调用会现场下载到 `~/.u2net/`,下完缓存跨 session 复用 |
573
+ | **输出格式** | 强制 .png(RGBA 必须 PNG)。input 支持 png/jpg/jpeg/webp/gif/bmp/tiff |
574
+ | **边缘质量** | balanced + alpha matting 已能消除大部分 halo / 色边伪影;薄透元素(玻璃 / 烟雾 / 飘发 / 半透明披纱)即便 best 也可能边缘软或抠不全 |
575
+ | **依赖前提** | server 端 `.venv-rembg/` 装了 rembg + onnxruntime(部署一次),跨 session 共享。不可用时工具返 isError + 提示 setup 命令 |
576
+ | **路径安全** | inputPath 必须 workspace-relative,不允许绝对路径 / .. traversal。候选路径解析顺序:cwd → sharedRoot |
577
+
578
+ ### 反例
579
+
580
+ - ❌ 给每张生图都自动 follow-up 抠 —— 5-10s × N 累计很快;只对**真要叠合**的图按需调
581
+ - ❌ 给整页 cover / hero 抠 —— cover 本身的 bg 就是设计的一部分,抠掉等于自废武功
582
+ - ❌ 期望 SVG 级精度抠图 —— ML 抠图永远是 raster + 边缘软化,要硬边走 SVG / Figma 切图
583
+ - ❌ 复杂遮挡(人在树后) —— 模型可能抠掉树或抠掉手,预期管理