1实现原理 · 为什么它能做到
本 skill 的执行体是一个 Bun/TypeScript CLI(scripts/main.ts),agent 按 SKILL.md 用 npx -y bun 启动它;参数解析、配置合并、provider 选择与结果落盘都在这个入口完成。
npx -y bun ${SKILL_DIR}/scripts/main.ts --prompt "A cat" --image cat.png
provider 自动选择:显式 --provider 优先;带 --ref 时按 Google→OpenAI→Canghe 顺序;无 --ref 则按环境里存在的 key 取第一个(多 key 时 Google 优先生效)。
const hasGoogle = !!(process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY);
四家后端各自成模块、统一 ProviderModule 接口(getDefaultModel / generateImage),协议各不相同:OpenAI 走 images/generations 与 edits,Google 走 Gemini generateContent 或 Imagen predict,DashScope 走通义万象端点,Canghe 走 OpenAI 兼容的 chat/completions。
const res = await fetch(`${getBaseUrl()}/chat/completions`, {
参考图支持因后端而异:Google 多模态把参考图读成 base64 放进 inlineData,OpenAI 走 /images/edits 表单,Canghe 以 image_url 传(本地文件转 data URI、http URL 直传);DashScope 与 Imagen 明确报错不支持。
const { data, mimeType } = await readImageAsBase64(refPath);
配置分层优先级固定为 CLI args > EXTEND.md > 环境变量 > cwd/.canghe-skills/.env > ~/.canghe-skills/.env,main.ts 自行解析 EXTEND.md 的 YAML front matter 与 .env 键值,不依赖 dotenv。
**Load Priority**: CLI args > EXTEND.md > env vars > `<cwd>/.canghe-skills/.env` > `~/.canghe-skills/.env`
生成结果以二进制写到用户指定的 --image 路径(无扩展名自动补 .png),写前递归建目录;生成失败只自动重试一次,且对「引用图不支持/缺 key」等错误不重试。
await writeFile(outputPath, imageData);
批量/并行是两种模式:默认顺序逐张生成;并行只在用户明确要求时启用,靠宿主的多后台子代理跑(建议 4、上限 8),脚本本身不含并行逻辑。
**Parallel Generation**: Only use when user explicitly requests parallel/concurrent generation.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | bun(经 npx -y bun 运行 TS 入口,会联网获取包) |
| api | OpenAI Images API |
| api | Google Generative Language API(Gemini / Imagen) |
| api | DashScope(阿里通义万象) |
| api | Canghe 第三方网关 |
| package | Node 内建模块 node:fs/promises、node:path、node:os(经 Bun 运行) |
4风险提醒 风险提醒:橙色 · 评估后使用
- 默认把 Canghe 第三方网关(https://api.canghe.ai/v1)列为可选后端之一,选择它时请求与素材会经过该第三方服务。
- prompt 与参考图会被上传到所选外部生成服务(OpenAI/Google/DashScope/Canghe),按各家隐私条款处理,涉密或敏感素材不宜使用。
- 需要多个高权限 API key,且明文存放于 .canghe-skills/.env,存在文件权限与泄露风险。
- 经 npx -y bun 启动,会联网拉取并执行远程 bun 包,属远程包执行面(与档位无关,仅提示)。
5第二遍独立确认
- [ok] 执行入口是否唯一且真实存在 — SKILL.md 的调用示例与 main.ts 的 printUsage 一致(npx -y bun scripts/main.ts --prompt ... --image ...),main.ts 末尾 main().catch 会 process.exit(1),证明它是 CLI;目录仅 8 个档(SKILL.md + preferences-schema.md + main.ts + 4 个 provider + types.ts),无其它可执行文件。
- [ok] 四家 provider 端点与凭证读取点 — openai.ts→api.openai.com/v1 + OPENAI_API_KEY;google.ts→generativelanguage.googleapis.com + GOOGLE_API_KEY/GEMINI_API_KEY;dashscope.ts→dashscope.aliyuncs.com + DASHSCOPE_API_KEY;canghe.ts→api.canghe.ai/v1 + CANGHE_API_KEY。均可用对应 *_BASE_URL 覆盖。
- [ok] 是否漏掉网络外发 — 全目录除 providers/*.ts 的 fetch 外无网络能力:main.ts 只做 IO 与编排,types.ts / preferences-schema.md 无网络代码;未见 socket/child_process/exec/urllib。
- [ok] TLS 是否被降级 — 四家后端都用 Node/Bun 原生 fetch(默认校验证书),未见 ssl.CERT_NONE / rejectUnauthorized=false / --no-verify,因此不触发红档。
- [discrepancy] 「并行生成」宣称是否有代码支撑 — SKILL.md 的 Parallel Generation 段描述用宿主 Task 子代理 run_in_background=true 并发并给并发建议,但 scripts/main.ts 只有单次 --n 的串行生成,未实现任何并发;该能力完全依赖 agent 编排层,脚本不提供。
- [ok] 默认 provider 与质量口径 — SKILL.md 写 default provider google、quality 2k;detectProvider 多 key 时返回 available[0](google 排第一),main.ts 对空 quality 置 '2k',与文档一致。
- [ok] 参考图 provider 限制 — SKILL.md 称 --ref 受 Google 多模态 / OpenAI edits / Canghe 支持;google.ts 对 Imagen、openai.ts 对 dall-e、main.ts 对 dashscope+ref 均抛错,与文档相符。
6结论
6d47e36b6c02f891…dd0bf35595