{"_id":"@ai-media/sdk","_rev":"6-c0726e46874ccac3b4804d925600abae","name":"@ai-media/sdk","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@ai-media/sdk","version":"0.1.0","license":"MIT","_id":"@ai-media/sdk@0.1.0","maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"dist":{"shasum":"0c5ace069fb8a7749c43c0a92c1bf41d8fa3e358","tarball":"https://registry.npmjs.org/@ai-media/sdk/-/sdk-0.1.0.tgz","fileCount":5,"integrity":"sha512-O1ynEevcLHirwxzFpzLILvX8Epd3ELZqTftsR+gDzFi7ddPF2NwSaBqC1iYAomHNC8KTkTSKuR42+3ZzNhkCEg==","signatures":[{"sig":"MEQCIBVf3KjcXPfBaeA5r5PPmRj1lPUPl/11eKjsTiFAk1MAAiBhEhrBXIzYxPT7F5LN2UyNL1Xp98ahcC8W68xZBu/9MA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50165},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"554268b9348db1e0795cc2e407fe175b654e025c","scripts":{"lint":"eslint","test":"bun test","build":"tsup src/index.ts --format esm --dts --out-dir dist --clean","format":"prettier --write \"**/*.{ts,tsx}\"","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit","typecheck:release":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"windzb","email":"windzb@qq.com"},"_npmVersion":"11.13.0","description":"Provider-independent AI image and video media SDK","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","@types/bun":"^1.2.0","typescript":"^5","@types/node":"^20","@workspace/eslint-config":"workspace:*","@workspace/typescript-config":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1786090718508_0.5827839723100259","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ai-media/sdk","version":"0.1.1","license":"MIT","_id":"@ai-media/sdk@0.1.1","maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"dist":{"shasum":"f3576ec203dd6440b1e0527c6985b97e95e3ccbf","tarball":"https://registry.npmjs.org/@ai-media/sdk/-/sdk-0.1.1.tgz","fileCount":31,"integrity":"sha512-At3H7fyFe6p/cErbsUd9Kf182c+jqLR6IfzXX5GYrybDS5OHLK9surbKGqLIQSi8WQDXsSAh3qTW3nEmYS3w+g==","signatures":[{"sig":"MEUCIEmAuF6kSsOeLhlP1gWfw0VnsNYqZFVJZxn7a4CgUhPWAiEAhqBIpXeF5rYDvlmTRIQYE0btaWHInRmfQP20Ykbl6NM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67492},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2424f1f89827219fc8467a3752f06b84bef86807","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm --out-dir dist --clean && tsc -p tsconfig.emit-dts.json","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit","typecheck:release":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"windzb","email":"windzb@qq.com"},"_npmVersion":"11.13.0","description":"Provider-independent AI image and video media SDK","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.0","typescript":"^7.0.2","@types/node":"^20","@workspace/typescript-config":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1786609202541_0.6617598956351529","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@ai-media/sdk","version":"0.1.2","license":"MIT","_id":"@ai-media/sdk@0.1.2","maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"dist":{"shasum":"f8a95c97b895ed48ce2d965756d7edc4acbe3b2b","tarball":"https://registry.npmjs.org/@ai-media/sdk/-/sdk-0.1.2.tgz","fileCount":31,"integrity":"sha512-xaeuoD+SW/sMWOnxfZ4ETQDNQV81GUALVSAUj9SZl7c//RlMnOK4qi1srbE0qC7uNogOD2bIYYIXd3uQoE/7EA==","signatures":[{"sig":"MEUCIQDASMuRM7SNKrt2PFGu0ZPeNHfvckmRjxOY6mpIxeZ6vQIgB5tKab1nSSNbLUDTG8FRiX4NxGdHhFHHnOyPyEYILuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67492},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ea34b4d9d1140bae548933472771a6dd44d7865b","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm --out-dir dist --clean && tsc -p tsconfig.emit-dts.json","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit","typecheck:release":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"windzb","email":"windzb@qq.com"},"_npmVersion":"11.13.0","description":"Provider-independent AI image and video media SDK","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.0","typescript":"^7.0.2","@types/node":"^20","@workspace/typescript-config":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1786617036742_0.0780557009049867","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@ai-media/sdk","version":"0.1.3","license":"MIT","_id":"@ai-media/sdk@0.1.3","maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"dist":{"shasum":"3eb800449fc43fe5e77e76a029b35b0bfe9a923a","tarball":"https://registry.npmjs.org/@ai-media/sdk/-/sdk-0.1.3.tgz","fileCount":38,"integrity":"sha512-LNcNfHA76S4c6cyA3+KuPZf6rSUXmhm8pf3OmN9U01hEdQbhQp9RNyX2qwv8VhkICStSN8NT24IeSIGc+YqHwQ==","signatures":[{"sig":"MEUCIQCRAL0qkBRXpG0St9n/TAkQq8tHBIB8L+G/Us3+XKRsiAIgM9veeGq4VZY62okOuHhDcqYQCrGSOj0/7Rxhag0/PaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77324},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"6c3b3f554fde04c18b01ab1db1a640c686a1b627","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm --out-dir dist --clean && tsc -p tsconfig.emit-dts.json","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit","typecheck:release":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"windzb","email":"windzb@qq.com"},"_npmVersion":"11.13.0","description":"Provider-independent AI image and video media SDK","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.0","typescript":"^7.0.2","@types/node":"^20","@workspace/typescript-config":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.3_1788338209762_0.8597982767222301","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@ai-media/sdk","version":"0.1.4","license":"MIT","_id":"@ai-media/sdk@0.1.4","maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"dist":{"shasum":"cd24f3a4998471604b9d80b422ee14a16c6adb3c","tarball":"https://registry.npmjs.org/@ai-media/sdk/-/sdk-0.1.4.tgz","fileCount":38,"integrity":"sha512-aCBUxXN+s3xqgLAf653zNkJRR8yabA0J0MQlTqZ3BavF+oshJGqtGFi5HviwxqepM/cEQjs5OnWg3uMxs0VsEg==","signatures":[{"sig":"MEUCIDY0hS1AUXPumNvq7A991Elb1ZiNfXMBT7jHvB2cwY2EAiEA7DeG8/ALbusav3dgwOxm7Q5Q0ZqTo0RsbRKd8GKEjG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77324},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5c8cd107a8ccb6238e595123b53eff87d2da7f26","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm --out-dir dist --clean && tsc -p tsconfig.emit-dts.json","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit","typecheck:release":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"windzb","email":"windzb@qq.com"},"_npmVersion":"10.9.3","description":"Provider-independent AI image and video media SDK","directories":{},"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.0","typescript":"^7.0.2","@types/node":"^20","@workspace/typescript-config":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.4_1788873404283_0.6951885635503572","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@ai-media/sdk","version":"0.1.5","type":"module","description":"Provider-independent AI image and video media SDK","license":"MIT","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsup src/index.ts --format esm --out-dir dist --clean && tsc -p tsconfig.emit-dts.json","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit","typecheck:release":"tsc -p tsconfig.json --noEmit","test":"bun test"},"devDependencies":{"@types/bun":"^1.2.0","@types/node":"^20","@workspace/typescript-config":"workspace:*","typescript":"^7.0.2"},"_id":"@ai-media/sdk@0.1.5","gitHead":"ca953c8881ebb066181712b134a2e559b827aa9f","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-HgwlUAuxgef4pi8CCmASTDG6KL9kb82mFdMZihqr21wZT5YTMQj4gN0o6qb639PBp3Px4DOD64EqnOnG8JVlcQ==","shasum":"27705fb495db90a5316b85866052ec4b719f1f71","tarball":"https://registry.npmjs.org/@ai-media/sdk/-/sdk-0.1.5.tgz","fileCount":38,"unpackedSize":78357,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDbYRYHqb/hHXAFN5Q1Iqnel4y+Ui8uOdDRHIvELtbZiwIgPbVIraw7Sx1msfjgemVjSARKLwOv+ryAGyWL2BLD7RE="}]},"_npmUser":{"name":"windzb","email":"windzb@qq.com"},"directories":{},"maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.5_1789053215275_0.21419505304337894"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-07T08:18:38.344Z","modified":"2026-09-10T15:13:35.665Z","0.1.0":"2026-08-07T08:18:38.651Z","0.1.1":"2026-08-13T08:20:02.687Z","0.1.2":"2026-08-13T10:30:36.894Z","0.1.3":"2026-09-02T08:36:49.889Z","0.1.4":"2026-09-08T13:16:44.411Z","0.1.5":"2026-09-10T15:13:35.430Z"},"license":"MIT","description":"Provider-independent AI image and video media SDK","maintainers":[{"name":"windzb","email":"windzb@qq.com"}],"readme":"# @ai-media/sdk\n\n[![npm version](https://img.shields.io/npm/v/@ai-media/sdk.svg)](https://www.npmjs.com/package/@ai-media/sdk)\n[![npm downloads](https://img.shields.io/npm/dm/@ai-media/sdk.svg)](https://www.npmjs.com/package/@ai-media/sdk)\n[![License](https://img.shields.io/npm/l/@ai-media/sdk.svg)](https://github.com/ecafe8/ai-media-sdk/blob/main/packages/ai-media-sdk/LICENSE)\n\nProvider 无关的核心契约与任务抽象，面向 AI 图像与视频生成。\n\n本包定义统一的调用模型（Provider 工厂 → 模型实例 → 生成函数）、同步/异步任务生命周期、结果结构与错误分类，**本身不访问任何 Provider API**，需要与具体的 Provider 包搭配使用：\n\n- `@ai-media/provider-azure-openai`\n- `@ai-media/provider-aliyun-bailian`\n- `@ai-media/provider-volcengine`\n- `@ai-media/provider-minimax`\n\n> **注意**：本项目处于快速迭代期间，API 可能随时变更，生产使用请锁定版本。\n\n## 安装\n\n```bash\nnpm install @ai-media/sdk @ai-media/provider-azure-openai\n```\n\n运行时要求：Node.js >= 20（或 Bun），ESM-only。所有配置均以参数对象传入。\n\n## 快速开始\n\n```ts\nimport { createAzureOpenAIProvider } from \"@ai-media/provider-azure-openai\";\nimport { generateImage } from \"@ai-media/sdk\";\n\nconst provider = createAzureOpenAIProvider({\n  apiKey: \"<your-api-key>\",\n  endpoint: \"https://<resource>.cognitiveservices.azure.com\",\n  apiVersion: \"2024-02-01\",\n});\n\nconst result = await generateImage({\n  model: provider.image(\"gpt-image-2\"),\n  prompt: \"A quiet riverside town at sunrise\",\n  n: 1,\n  size: \"1024x1024\",\n});\n\nfor (const image of result.content) {\n  console.log(image.url ?? \"(base64)\");\n}\n```\n\n`result` 是 `GenerationResult<ImageContent[]>`，除 `content` 外还携带 `provider`、`model`、`requestId`、`createdAt` 等元数据。\n\n## 同步生成与编辑\n\n### generateImage\n\n文生图。公共参数只有 `prompt`、`n`、`size`，其余一律走 `providerOptions`（见下文）。参数会先按模型能力做预检（如 `size` 是否在支持列表/分辨率上限内、`n` 是否超过上限），不合法时在任何网络请求之前抛出 `INVALID_REQUEST`。\n\n```ts\nconst result = await generateImage({\n  model: provider.image(\"<model-id>\"),\n  prompt: \"江南小镇的清晨，水彩画风格\",\n  n: 1,\n  size: \"1024x1024\",\n  providerOptions: {\n    // provider 专属字段，键名为 provider 命名空间\n  },\n});\n```\n\n### editImage\n\n基于 1 至多张参考图（URL 或 base64）做图像编辑，上限由模型能力的 `maxEditImages` 决定（未声明时为 3）。要求模型具备 `edit` 能力。\n\n```ts\nconst result = await editImage({\n  model: provider.image(\"<model-id>\"),\n  prompt: \"把画面改成雪天\",\n  images: [{ url: \"https://example.com/input.png\" }],\n});\n```\n\n## 异步任务\n\n异步模型（能力声明含 `async`）使用 `submitImageTask` / `submitVideoTask` 提交，返回统一的 `TaskHandle`：\n\n```ts\nimport { submitImageTask, submitVideoTask } from \"@ai-media/sdk\";\n\n// 异步图像任务\nconst imageTask = await submitImageTask({\n  model: provider.image(\"<async-image-model>\"),\n  prompt: \"江南小镇的清晨，水彩画风格\",\n  n: 1,\n  size: \"1K\",\n});\nconst imageResult = await imageTask.wait();\n\n// 视频任务\nconst videoTask = await submitVideoTask({\n  model: provider.video(\"<video-model>\"),\n  prompt: \"镜头缓缓推进\",\n  providerOptions: {\n    // provider 专属视频参数\n  },\n});\nconst videoResult = await videoTask.wait({\n  pollIntervalMs: 15_000, // 默认 15s\n  timeoutMs: 600_000, // 默认 600s\n  signal: abortController.signal, // 可选，轮询间隙响应中止\n});\n```\n\n`TaskHandle` 字段：\n\n| 字段/方法          | 说明                                                              |\n| ------------------ | ----------------------------------------------------------------- |\n| `taskId`           | Provider 侧任务 ID                                                |\n| `status`           | `pending` / `running` / `succeeded` / `failed` / `cancelled`      |\n| `result` / `error` | 到达终态后分别携带最终结果或错误                                  |\n| `wait(options?)`   | 轮询至终态：成功返回 `GenerationResult`，失败/取消抛出 `SdkError` |\n\n视频输入按模式携带媒体字段：`firstFrame`（首帧图生视频）、`referenceImages`（有序参考图）、`inputVideo`（源视频公开 URL）。具体允许哪些输入由模型与 Provider 决定。\n\n## 公共参数与 providerOptions\n\n公共契约只包含三个参数：\n\n- `prompt`：必填，非空。\n- `n`：输出数量，正整数，受模型 `maxN` 约束。\n- `size`：两种形态——像素形式 `WxH`（如 `\"1024x1024\"`，也接受 `X`/`*` 分隔）与档位形式（如 `\"1K\"`、`\"2K\"`），以各模型声明为准。\n\n其他一切 provider 专属字段必须放在 `providerOptions.<provider>` 命名空间下，由各 Provider 包定义类型（如 `providerOptions.azure`、`providerOptions.aliyun`）。传入未知公共字段会被预检拒绝。\n\n辅助函数：\n\n- `pixelSize(width, height)` — 构造像素形式 `size`。\n- `tierSize(tier)` — 构造档位形式 `size`。\n- `toImageUrl(image)` — 将 `ImageContent` 归一化为可渲染 URL（base64 自动转 data URL）。\n\n选择字面量模型 id 时（如 `provider.image(\"gpt-image-2\")`），请求参数会在编译期收窄为该模型接受的 `size`/`n`/`providerOptions` 形状；动态 id 走宽松重载。\n\n## 结果结构\n\n```ts\ninterface GenerationResult<TContent> {\n  content: TContent; // 图像为 ImageContent[]，视频为 VideoContent[]\n  provider: string;\n  model: string;\n  requestId?: string;\n  createdAt?: string;\n  raw?: unknown;\n}\n\ninterface ImageContent {\n  url?: string;\n  base64?: string;\n  mimeType?: string;\n  width?: number;\n  height?: number;\n}\n\ninterface VideoContent {\n  url?: string; // 下载链接，默认 MP4\n  base64?: string;\n  mimeType?: string;\n  duration?: number; // 秒\n  width?: number;\n  height?: number;\n}\n```\n\n> Provider 返回的结果 URL 通常是**临时的**，请及时下载并自行持久化。\n\n## 错误处理\n\n所有失败统一抛出 `SdkError`，携带稳定的 `code` 与 `retryable` 标记：\n\n| code              | 含义                                    | 默认可重试 |\n| ----------------- | --------------------------------------- | ---------- |\n| `NOT_IMPLEMENTED` | 能力尚未实现                            | 否         |\n| `AUTH_ERROR`      | 认证失败（HTTP 401/403）                | 否         |\n| `RATE_LIMITED`    | 触发限流（HTTP 429）                    | 是         |\n| `INVALID_REQUEST` | 请求非法（预检失败或 HTTP 400/413/422） | 否         |\n| `UNKNOWN_MODEL`   | 模型 id 不在 Provider 注册表            | 否         |\n| `PROVIDER_ERROR`  | Provider 服务端错误（HTTP 5xx）         | 否         |\n| `TIMEOUT`         | 请求超时                                | 是         |\n| `NETWORK_ERROR`   | 网络错误                                | 是         |\n| `UNKNOWN`         | 未分类错误                              | 否         |\n\n```ts\nimport { SdkError } from \"@ai-media/sdk\";\n\ntry {\n  await generateImage({ model, prompt });\n} catch (error) {\n  if (error instanceof SdkError && error.retryable) {\n    // 按退避策略重试\n  }\n}\n```\n\n错误信息不包含凭据与 Provider 原始响应。\n\n## 相关包\n\n- `@ai-media/provider-azure-openai` — Azure OpenAI 图像生成\n- `@ai-media/provider-aliyun-bailian` — 阿里云百炼图像 + 视频\n- `@ai-media/provider-volcengine` — 火山方舟 Doubao-Seedream 图像生成\n- `@ai-media/uploader` — Provider 输入文件的临时上传辅助\n\n## License\n\nMIT\n","readmeFilename":"README.md"}