@sweetretry/ai-sdk-volcengine-adapter 0.1.4 → 0.1.5

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.
@@ -1,4 +1,4 @@
1
- import { ImageModelV3, ImageModelV3CallOptions, ImageModelV3ProviderMetadata, ImageModelV3Usage, SharedV3Warning } from '@ai-sdk/provider';
1
+ import { ImageModelV3 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
3
  export type VolcengineImageModelId = 'doubao-seedream-4-5-251128' | 'doubao-seedream-4-0-250828' | (string & {});
4
4
  export interface VolcengineImageConfig {
@@ -14,16 +14,6 @@ export declare class VolcengineImageModel implements ImageModelV3 {
14
14
  get maxImagesPerCall(): number;
15
15
  get provider(): string;
16
16
  constructor(modelId: VolcengineImageModelId, config: VolcengineImageConfig);
17
- doGenerate({ prompt, files, size, aspectRatio, seed, providerOptions, headers, abortSignal, }: ImageModelV3CallOptions): Promise<{
18
- images: Array<string> | Array<Uint8Array>;
19
- warnings: Array<SharedV3Warning>;
20
- providerMetadata?: ImageModelV3ProviderMetadata;
21
- response: {
22
- timestamp: Date;
23
- modelId: string;
24
- headers: Record<string, string> | undefined;
25
- };
26
- usage?: ImageModelV3Usage;
27
- }>;
17
+ doGenerate({ prompt, files, size, aspectRatio, seed, providerOptions, headers, abortSignal, }: Parameters<ImageModelV3['doGenerate']>[0]): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>>;
28
18
  private convertFileToDataUrl;
29
19
  }
@@ -30,13 +30,14 @@ export class VolcengineImageModel {
30
30
  feature: 'seed'
31
31
  });
32
32
  }
33
- // Build request body
33
+ // Build request body - always use b64_json as AI SDK requires base64 data
34
+ const { response_format: _, ...volcengineOptions } = providerOptions.volcengine ?? {};
34
35
  const body = {
35
36
  model: this.modelId,
36
37
  prompt,
37
- size: size ?? '1024x1024',
38
- response_format: 'b64_json',
39
- ...providerOptions.volcengine ?? {}
38
+ size: size ?? '2048x2048',
39
+ ...volcengineOptions,
40
+ response_format: 'b64_json'
40
41
  };
41
42
  // Handle reference images for image-to-image generation
42
43
  if (files && files.length > 0) {
@@ -56,15 +57,12 @@ export class VolcengineImageModel {
56
57
  abortSignal,
57
58
  fetch: this.config.fetch
58
59
  });
59
- // Extract images from response
60
+ // Extract base64 images from response
60
61
  const images = response.data.map((item)=>{
61
- if (item.b64_json) {
62
- return item.b64_json;
62
+ if (!item.b64_json) {
63
+ throw new Error('No base64 image data in response');
63
64
  }
64
- if (item.url) {
65
- return item.url;
66
- }
67
- throw new Error('No image data in response');
65
+ return item.b64_json;
68
66
  });
69
67
  return {
70
68
  images,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/image/volcengine-image-model.ts"],"sourcesContent":["import {\n ImageModelV3,\n ImageModelV3CallOptions,\n ImageModelV3File,\n ImageModelV3ProviderMetadata,\n ImageModelV3Usage,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n combineHeaders,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { volcengineFailedResponseHandler } from '../chat/volcengine-error';\nimport { volcengineImageResponseSchema } from './volcengine-image-api';\n\nexport type VolcengineImageModelId =\n | 'doubao-seedream-4-5-251128'\n | 'doubao-seedream-4-0-250828'\n | (string & {});\n\nexport interface VolcengineImageConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n}\n\nexport class VolcengineImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3' as const;\n\n get maxImagesPerCall(): number {\n return 1;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: VolcengineImageModelId,\n private readonly config: VolcengineImageConfig,\n ) {}\n\n async doGenerate({\n prompt,\n files,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: ImageModelV3CallOptions): Promise<{\n images: Array<string> | Array<Uint8Array>;\n warnings: Array<SharedV3Warning>;\n providerMetadata?: ImageModelV3ProviderMetadata;\n response: {\n timestamp: Date;\n modelId: string;\n headers: Record<string, string> | undefined;\n };\n usage?: ImageModelV3Usage;\n }> {\n const warnings: SharedV3Warning[] = [];\n\n // Handle unsupported options\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n });\n }\n\n // Build request body\n const body: Record<string, unknown> = {\n model: this.modelId,\n prompt,\n size: size ?? '1024x1024',\n response_format: 'b64_json',\n ...(providerOptions.volcengine ?? {}),\n };\n\n // Handle reference images for image-to-image generation\n if (files && files.length > 0) {\n const imageUrls = files.map(file => this.convertFileToDataUrl(file));\n\n if (imageUrls.length === 1) {\n body.image = imageUrls[0];\n } else {\n body.image = imageUrls;\n }\n }\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/images/generations`,\n headers: combineHeaders(this.config.headers(), headers),\n body,\n failedResponseHandler: volcengineFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n volcengineImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n // Extract images from response\n const images: string[] = response.data.map(item => {\n if (item.b64_json) {\n return item.b64_json;\n }\n if (item.url) {\n return item.url;\n }\n throw new Error('No image data in response');\n });\n\n return {\n images,\n warnings,\n response: {\n timestamp: new Date(),\n modelId: response.model ?? this.modelId,\n headers: responseHeaders,\n },\n usage: response.usage\n ? {\n inputTokens: undefined,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n private convertFileToDataUrl(file: ImageModelV3File): string {\n if (file.type === 'url') {\n return file.url;\n }\n\n // file.type === \"file\"\n if (typeof file.data === 'string') {\n // base64 string - convert to data URL\n return `data:${file.mediaType};base64,${file.data}`;\n }\n\n // Uint8Array - convert to base64 data URL\n const base64 = btoa(String.fromCharCode(...file.data));\n return `data:${file.mediaType};base64,${base64}`;\n }\n}\n"],"names":["combineHeaders","createJsonResponseHandler","postJsonToApi","volcengineFailedResponseHandler","volcengineImageResponseSchema","VolcengineImageModel","specificationVersion","maxImagesPerCall","provider","config","modelId","doGenerate","prompt","files","size","aspectRatio","seed","providerOptions","headers","abortSignal","warnings","push","type","feature","body","model","response_format","volcengine","length","imageUrls","map","file","convertFileToDataUrl","image","value","response","responseHeaders","url","baseURL","failedResponseHandler","successfulResponseHandler","fetch","images","data","item","b64_json","Error","timestamp","Date","usage","inputTokens","undefined","outputTokens","output_tokens","totalTokens","total_tokens","mediaType","base64","btoa","String","fromCharCode"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/image/volcengine-image-model.ts"],"sourcesContent":["import {\n ImageModelV3,\n ImageModelV3File,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n combineHeaders,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { volcengineFailedResponseHandler } from '../chat/volcengine-error';\nimport { volcengineImageResponseSchema } from './volcengine-image-api';\n\nexport type VolcengineImageModelId =\n | 'doubao-seedream-4-5-251128'\n | 'doubao-seedream-4-0-250828'\n | (string & {});\n\nexport interface VolcengineImageConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n}\n\nexport class VolcengineImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3' as const;\n\n get maxImagesPerCall(): number {\n return 1;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: VolcengineImageModelId,\n private readonly config: VolcengineImageConfig,\n ) {}\n\n async doGenerate({\n prompt,\n files,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV3['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV3['doGenerate']>>\n > {\n const warnings: SharedV3Warning[] = [];\n\n // Handle unsupported options\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n });\n }\n\n // Build request body - always use b64_json as AI SDK requires base64 data\n const { response_format: _, ...volcengineOptions } =\n (providerOptions.volcengine as Record<string, unknown>) ?? {};\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n prompt,\n size: size ?? '2048x2048',\n ...volcengineOptions,\n response_format: 'b64_json',\n };\n\n // Handle reference images for image-to-image generation\n if (files && files.length > 0) {\n const imageUrls = files.map(file => this.convertFileToDataUrl(file));\n\n if (imageUrls.length === 1) {\n body.image = imageUrls[0];\n } else {\n body.image = imageUrls;\n }\n }\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/images/generations`,\n headers: combineHeaders(this.config.headers(), headers),\n body,\n failedResponseHandler: volcengineFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n volcengineImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n // Extract base64 images from response\n const images: string[] = response.data.map(item => {\n if (!item.b64_json) {\n throw new Error('No base64 image data in response');\n }\n return item.b64_json;\n });\n\n return {\n images,\n warnings,\n response: {\n timestamp: new Date(),\n modelId: response.model ?? this.modelId,\n headers: responseHeaders,\n },\n usage: response.usage\n ? {\n inputTokens: undefined,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n private convertFileToDataUrl(file: ImageModelV3File): string {\n if (file.type === 'url') {\n return file.url;\n }\n\n // file.type === \"file\"\n if (typeof file.data === 'string') {\n // base64 string - convert to data URL\n return `data:${file.mediaType};base64,${file.data}`;\n }\n\n // Uint8Array - convert to base64 data URL\n const base64 = btoa(String.fromCharCode(...file.data));\n return `data:${file.mediaType};base64,${base64}`;\n }\n}\n"],"names":["combineHeaders","createJsonResponseHandler","postJsonToApi","volcengineFailedResponseHandler","volcengineImageResponseSchema","VolcengineImageModel","specificationVersion","maxImagesPerCall","provider","config","modelId","doGenerate","prompt","files","size","aspectRatio","seed","providerOptions","headers","abortSignal","warnings","push","type","feature","response_format","_","volcengineOptions","volcengine","body","model","length","imageUrls","map","file","convertFileToDataUrl","image","value","response","responseHeaders","url","baseURL","failedResponseHandler","successfulResponseHandler","fetch","images","data","item","b64_json","Error","timestamp","Date","usage","inputTokens","undefined","outputTokens","output_tokens","totalTokens","total_tokens","mediaType","base64","btoa","String","fromCharCode"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sweetretry/ai-sdk-volcengine-adapter",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Volcengine adapter for AI SDK",
5
5
  "license": "MIT",
6
6
  "author": "SweetRetry <zimin.zhang2000@gmail.com>",