[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X6WB75TZJ9SWSCN5JM17CY":3,"skill-same:01M6X6WB75TZJ9SWSCN5JM17CY":95},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":70,"repositoryHtmlUrl":71,"repositoryHomepageUrl":72,"ownerHtmlUrl":73,"ownerBlogUrl":72,"ownerDescription":74,"updatedAt":75,"install":76,"resources":88},"01M6X6WB75TZJ9SWSCN5JM17CY","image-provider-routing",null,"Pick the image provider from job shape — text-in-image to Ideogram, photoreal to Flux, illustrative vector to Recraft, general to Gemini\u002FGPT.","event4u-app\u002Fagent-config","event4u-app","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F199339632?v=4","01M6X5TWBNCQCE1VDKT4E9KF7N","event4u.app","01M6X5TWF4HRM266RG2Q5VVH1X",19,"MIT","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fimage-provider-routing\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"provider routing","routing","image provider routing","image","provider","never","handler","true","recraft","manual","scope","flux","general","write","command","pick","text","execution","vector","product","gemini","2026-11-10 10:12:30",false,"---\nmodel_tier: inherit\nname: image-provider-routing\ndescription: \"Pick the image provider from job shape — text-in-image to Ideogram, photoreal to Flux, illustrative vector to Recraft, general to Gemini\u002FGPT.\"\ndomain: product\npersonas: []\nworkspaces:\n  - small-business\npacks:\n  - ai-image\ntrust:\n  level: experimental\ninstall:\n  removable: true\nscope:\n  write: []\n  verification_reason: \"execution declares no handler, so this skill runs nothing of its own — every write is the calling agent's, under the rules that govern it. No command can prove a scope the skill never executes.\"\nexecution:\n  type: manual\n---\n\n# image-provider-routing\n\nRoute an image generation job to the right provider based on job shape. Adapters\nare scaffold-tier (dry-run only) — selection produces a plan; execution waits on\npromotion per `provider-lifecycle-discipline`.\n\n## When to use\n\n- Choosing which image model fits a brief (logo, banner, photo, icon, general art).\n- Before calling any `node_modules\u002F@event4u\u002Fagent-config\u002Fsrc\u002Fscripts\u002Fai-image\u002Fadapters\u002F*.sh` adapter.\n- When the user asks \"which image model should I use?\" or \"route this image job.\"\n\n## Provider decision table\n\n| Job shape | Provider | Why |\n|---|---|---|\n| Text-in-image (logo, banner, typographic art) | **Ideogram** | Best glyph rendering; raster models garble text |\n| Photoreal (product shot, portrait, scene) | **Flux** | Photorealism specialist; routed via fal\u002FReplicate |\n| Icon the set lacks | `iconography` first, then [`svg-authoring`](..\u002Fsvg-authoring\u002FSKILL.md) | The incumbent set wins; a missing glyph is hand-authored against its grid and checked — no provider involved |\n| Simple geometric mark | [`svg-authoring`](..\u002Fsvg-authoring\u002FSKILL.md) | A `rect`\u002F`circle`\u002F`path` mark is cheaper and more editable hand-authored than generated, and it ends in a file rather than a plan |\n| Complex illustrative vector art | **Recraft** | The only job shape left for a vector provider. State the adapter's lifecycle in the answer: `experimental — scaffold tier, dry-run plumbing only`, so the caller knows no asset is produced |\n| General art \u002F edit \u002F multimodal | **Gemini-image** or **GPT Image 2** | Broad capability; natural-language prompts |\n| Budget-conscious 4K upscale | Flux via Replicate | Cost-competitive at high resolution |\n\nDecision order: an icon → the incumbent set, then `svg-authoring` for a missing\nglyph; a simple geometric mark → `svg-authoring`; text-in-image → Ideogram;\ncomplex illustrative vector art → Recraft, with its scaffold-tier lifecycle\nstated; photoreal → Flux; everything else → Gemini-image (default) or GPT\nImage 2 (when an OpenAI key is available and an existing image is being edited).\n\nThe split exists because the single \"Vector \u002F SVG logo or icon\" row sent every\nicon and every geometric mark to an adapter whose header reads `experimental —\nscaffold tier. dry-run plumbing only` and whose live calls exit at\nthe adapter's own live-call guard. The routed path ended in a plan;\nthe icon floor meanwhile sent icons to the set. Neither produced an asset for\nthe one case that needs one — a glyph the set does not have.\n\n## Procedure\n\n1. **Extract job shape** from the brief: does it need embedded text? vector output?\n   photorealistic rendering? or general illustration?\n2. **Apply table** — match the dominant shape to the provider row above.\n3. **Check lifecycle tier** — all adapters are `experimental` (scaffold). Surface\n   this before any live invocation.\n4. **Confirm with the user** when shape is ambiguous (e.g., logo that could be\n   vector OR raster typographic art → ask once).\n5. **Emit the routing decision** in the Output format below.\n\n## Output format\n\n1. **Chosen provider** — name + one-line rationale citing the job-shape match.\n2. **Lifecycle-tier caveat** — \"adapter is experimental (scaffold tier); dry-run\n   only until a smoke trace is captured per `provider-lifecycle-discipline`.\"\n3. **Fallback** — if the primary adapter is unavailable or the smoke trace is\n   missing, name the next best provider and what changes.\n4. **Provenance surface** — whether the chosen provider writes native provenance\n   (C2PA or an equivalent) or the delivery needs the `.provenance.json` sidecar\n   fallback, per the media [transparency policy](..\u002F..\u002F..\u002Fagents\u002Fsettings\u002Fpolicies\u002Fmedia\u002Ftransparency.md).\n\n## Gotcha\n\n- **Routing a text-in-image job to a photoreal model is the #1 failure** — send a\n  logo\u002Fbanner with embedded text to Flux and the text renders as garbled glyphs;\n  it must go to Ideogram. Likewise a vector logo sent to Ideogram\u002FFlux returns a\n  raster PNG, not the editable `\u003Cpath>` SVG a brand mark needs (→ Recraft).\n- All four adapters (`ideogram.sh`, `flux.sh`, `recraft.sh`, `gemini-image.sh`) are\n  **scaffold-tier** — dry-run plumbing only, no live generation yet. Routing\n  produces a selection + plan; actual API calls require promotion to `stable`\n  first (maintainer-captured smoke trace under `agents\u002Freference\u002Fai-image\u002Fsmoke-traces\u002F`).\n  Surfacing a provider without its `experimental` tier caveat misleads the caller\n  into expecting a rendered asset that won't come.\n\n**Good example:** \"Text logo for a bakery → Ideogram (text-in-image); lifecycle:\nexperimental — dry-run plan only.\"\n\n**Bad example:** \"Use Recraft for the product photo\" — Recraft is the vector path;\nphotoreal jobs go to Flux.\n\n## Do NOT\n\n- Do NOT invoke an adapter without surfacing its lifecycle tier (all are `experimental`).\n- Do NOT route a text-in-image job to Flux — Flux has no glyph renderer; text garbles.\n- Do NOT route a vector\u002FSVG job to Ideogram or Flux — neither outputs genuine `\u003Cpath>` SVG.\n- Do NOT skip `image-likeness-and-rights` when the brief names a real person or brand mark.\n- Do NOT promote an adapter from `experimental` to `stable` — that is maintainer-only via smoke trace.\n\n## See also\n\n- [`prompt-engineering-image`](..\u002Fprompt-engineering-image\u002FSKILL.md) — translate the brief into provider-specific prompt grammar.\n- [`provider-lifecycle-discipline`](..\u002F..\u002Frules\u002Fprovider-lifecycle-discipline.md) — read lifecycle tier before any run.\n- `node_modules\u002F@event4u\u002Fagent-config\u002Fsrc\u002Fscripts\u002Fai-image\u002Fadapters\u002F` — the four adapter files and their header comments.\n- [`media-governance-routing`](..\u002F..\u002Frules\u002Fmedia-governance-routing.md) — rights \u002F likeness policies before generation.\n- [Media transparency policy](..\u002F..\u002F..\u002Fagents\u002Fsettings\u002Fpolicies\u002Fmedia\u002Ftransparency.md) — the provenance each provider's output must carry, and the sidecar fallback when it carries none.\n","# image-provider-routing\n\nRoute an image generation job to the right provider based on job shape. Adapters\nare scaffold-tier (dry-run only) — selection produces a plan; execution waits on\npromotion per `provider-lifecycle-discipline`.\n\n## When to use\n\n- Choosing which image model fits a brief (logo, banner, photo, icon, general art).\n- Before calling any `node_modules\u002F@event4u\u002Fagent-config\u002Fsrc\u002Fscripts\u002Fai-image\u002Fadapters\u002F*.sh` adapter.\n- When the user asks \"which image model should I use?\" or \"route this image job.\"\n\n## Provider decision table\n\n| Job shape | Provider | Why |\n|---|---|---|\n| Text-in-image (logo, banner, typographic art) | **Ideogram** | Best glyph rendering; raster models garble text |\n| Photoreal (product shot, portrait, scene) | **Flux** | Photorealism specialist; routed via fal\u002FReplicate |\n| Icon the set lacks | `iconography` first, then [`svg-authoring`](..\u002Fsvg-authoring\u002FSKILL.md) | The incumbent set wins; a missing glyph is hand-authored against its grid and checked — no provider involved |\n| Simple geometric mark | [`svg-authoring`](..\u002Fsvg-authoring\u002FSKILL.md) | A `rect`\u002F`circle`\u002F`path` mark is cheaper and more editable hand-authored than generated, and it ends in a file rather than a plan |\n| Complex illustrative vector art | **Recraft** | The only job shape left for a vector provider. State the adapter's lifecycle in the answer: `experimental — scaffold tier, dry-run plumbing only`, so the caller knows no asset is produced |\n| General art \u002F edit \u002F multimodal | **Gemini-image** or **GPT Image 2** | Broad capability; natural-language prompts |\n| Budget-conscious 4K upscale | Flux via Replicate | Cost-competitive at high resolution |\n\nDecision order: an icon → the incumbent set, then `svg-authoring` for a missing\nglyph; a simple geometric mark → `svg-authoring`; text-in-image → Ideogram;\ncomplex illustrative vector art → Recraft, with its scaffold-tier lifecycle\nstated; photoreal → Flux; everything else → Gemini-image (default) or GPT\nImage 2 (when an OpenAI key is available and an existing image is being edited).\n\nThe split exists because the single \"Vector \u002F SVG logo or icon\" row sent every\nicon and every geometric mark to an adapter whose header reads `experimental —\nscaffold tier. dry-run plumbing only` and whose live calls exit at\nthe adapter's own live-call guard. The routed path ended in a plan;\nthe icon floor meanwhile sent icons to the set. Neither produced an asset for\nthe one case that needs one — a glyph the set does not have.\n\n## Procedure\n\n1. **Extract job shape** from the brief: does it need embedded text? vector output?\n   photorealistic rendering? or general illustration?\n2. **Apply table** — match the dominant shape to the provider row above.\n3. **Check lifecycle tier** — all adapters are `experimental` (scaffold). Surface\n   this before any live invocation.\n4. **Confirm with the user** when shape is ambiguous (e.g., logo that could be\n   vector OR raster typographic art → ask once).\n5. **Emit the routing decision** in the Output format below.\n\n## Output format\n\n1. **Chosen provider** — name + one-line rationale citing the job-shape match.\n2. **Lifecycle-tier caveat** — \"adapter is experimental (scaffold tier); dry-run\n   only until a smoke trace is captured per `provider-lifecycle-discipline`.\"\n3. **Fallback** — if the primary adapter is unavailable or the smoke trace is\n   missing, name the next best provider and what changes.\n4. **Provenance surface** — whether the chosen provider writes native provenance\n   (C2PA or an equivalent) or the delivery needs the `.provenance.json` sidecar\n   fallback, per the media [transparency policy](..\u002F..\u002F..\u002Fagents\u002Fsettings\u002Fpolicies\u002Fmedia\u002Ftransparency.md).\n\n## Gotcha\n\n- **Routing a text-in-image job to a photoreal model is the #1 failure** — send a\n  logo\u002Fbanner with embedded text to Flux and the text renders as garbled glyphs;\n  it must go to Ideogram. Likewise a vector logo sent to Ideogram\u002FFlux returns a\n  raster PNG, not the editable `\u003Cpath>` SVG a brand mark needs (→ Recraft).\n- All four adapters (`ideogram.sh`, `flux.sh`, `recraft.sh`, `gemini-image.sh`) are\n  **scaffold-tier** — dry-run plumbing only, no live generation yet. Routing\n  produces a selection + plan; actual API calls require promotion to `stable`\n  first (maintainer-captured smoke trace under `agents\u002Freference\u002Fai-image\u002Fsmoke-traces\u002F`).\n  Surfacing a provider without its `experimental` tier caveat misleads the caller\n  into expecting a rendered asset that won't come.\n\n**Good example:** \"Text logo for a bakery → Ideogram (text-in-image); lifecycle:\nexperimental — dry-run plan only.\"\n\n**Bad example:** \"Use Recraft for the product photo\" — Recraft is the vector path;\nphotoreal jobs go to Flux.\n\n## Do NOT\n\n- Do NOT invoke an adapter without surfacing its lifecycle tier (all are `experimental`).\n- Do NOT route a text-in-image job to Flux — Flux has no glyph renderer; text garbles.\n- Do NOT route a vector\u002FSVG job to Ideogram or Flux — neither outputs genuine `\u003Cpath>` SVG.\n- Do NOT skip `image-likeness-and-rights` when the brief names a real person or brand mark.\n- Do NOT promote an adapter from `experimental` to `stable` — that is maintainer-only via smoke trace.\n\n## See also\n\n- [`prompt-engineering-image`](..\u002Fprompt-engineering-image\u002FSKILL.md) — translate the brief into provider-specific prompt grammar.\n- [`provider-lifecycle-discipline`](..\u002F..\u002Frules\u002Fprovider-lifecycle-discipline.md) — read lifecycle tier before any run.\n- `node_modules\u002F@event4u\u002Fagent-config\u002Fsrc\u002Fscripts\u002Fai-image\u002Fadapters\u002F` — the four adapter files and their header comments.\n- [`media-governance-routing`](..\u002F..\u002Frules\u002Fmedia-governance-routing.md) — rights \u002F likeness policies before generation.\n- [Media transparency policy](..\u002F..\u002F..\u002Fagents\u002Fsettings\u002Fpolicies\u002Fmedia\u002Ftransparency.md) — the provenance each provider's output must carry, and the sidecar fallback when it carries none.\n",{"name":5,"packs":53,"scope":55,"trust":58,"domain":46,"install":60,"personas":62,"execution":63,"model_tier":64,"workspaces":65,"description":7},[54],"ai-image",{"write":56,"verification_reason":57},[],"execution declares no handler, so this skill runs nothing of its own — every write is the calling agent's, under the rules that govern it. No command can prove a scope the skill never executes.",{"level":59},"experimental",{"removable":61},true,[],{"type":36},"inherit",[66],"small-business","main","12bd765ce1d800501d45dfb8232102793af01290","src\u002Fskills\u002Fimage-provider-routing",1,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config","https:\u002F\u002Fevent4u.app","https:\u002F\u002Fgithub.com\u002Fevent4u-app","Your events in your hand","2026-11-13 03:25:49",{"source":8,"skillName":5,"commands":77,"prompt":87,"zipAvailable":61},[78,81,84],{"tool":79,"command":80},"npx","npx skills add event4u-app\u002Fagent-config --skill image-provider-routing",{"tool":82,"command":83},"bunx","bunx skills add event4u-app\u002Fagent-config --skill image-provider-routing",{"tool":85,"command":86},"pnpm","pnpm dlx skills add event4u-app\u002Fagent-config --skill image-provider-routing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fimage-provider-routing\u002FSKILL.md",[89],{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"evals\u002Ftriggers.json","REFERENCE","参考文档",3847,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fimage-provider-routing\u002Fevals\u002Ftriggers.json",[96,110,123,135,147,157],{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":103,"publishedAt":48},"01M6X84PK96XBPENXH66JCTSD1","unknown-key-fixture","Declares a key the schema does not know.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Funknown-key\u002FSKILL.md",[102],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[104,105,106,107,108,109],"unknown key fixture","Unknown key","fixture","unknown","schema","package",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":117,"publishedAt":48},"01M6X84HW7NAHZ7GZMQ9RXK1XJ","portable-fixture","Declares only semantics the MCP-lite carrier transports whole.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fportable\u002FSKILL.md",[116],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[106,118,119,120,121,109,122],"portable","portable fixture","engineer","only","MCP",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":130,"publishedAt":48},"01M6X84F29FE0RGGZ1ZTFGZTX2","non-portable-fixture","Declares a runtime semantic the carrier drops.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fnon-portable\u002FSKILL.md",[129],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[119,131,118,106,132,133,134,109],"non portable fixture","semantic","high","runtime",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":48},"01M6X848F706PT9MDCX75JKJ6B","candidate-zero-width","A candidate whose prose carries an invisible joiner.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fzero-width-injection\u002FSKILL.md",[141],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[143,144,145,146],"candidate zero width","candidate","ZeRO","prose",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":154,"publishedAt":48},"01M6X841SSC2T31VDF41SA6DG1","candidate-disclosure-suppression","A candidate whose prose tells the agent to withhold from the user.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdisclosure-suppression\u002FSKILL.md",[153],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[155,144,146,156],"candidate disclosure suppression","user",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":48},"01M6X83TFS5AGPBPVTQNWP0BB3","candidate-dangerous-frontmatter","A candidate claiming an unscoped tool grant and a permission bypass.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdangerous-frontmatter\u002FSKILL.md",[163],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[165,144,166,167,168,169],"candidate dangerous frontmatter","frontmatter","shell","permission","tool"]