@sweetretry/ai-sdk-volcengine-adapter 0.1.0 → 0.1.2

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 (62) hide show
  1. package/dist/chat/convert-to-volcengine-chat-message.d.ts +3 -0
  2. package/dist/chat/convert-to-volcengine-chat-message.js +189 -0
  3. package/dist/chat/convert-to-volcengine-chat-message.js.map +1 -0
  4. package/dist/chat/convert-volcengine-chat-usage.d.ts +28 -0
  5. package/dist/chat/convert-volcengine-chat-usage.js +51 -0
  6. package/dist/chat/convert-volcengine-chat-usage.js.map +1 -0
  7. package/dist/chat/get-response-metadata.d.ts +9 -0
  8. package/dist/chat/get-response-metadata.js +9 -0
  9. package/dist/chat/get-response-metadata.js.map +1 -0
  10. package/dist/chat/index.d.ts +2 -0
  11. package/dist/chat/index.js +3 -0
  12. package/dist/chat/index.js.map +1 -0
  13. package/dist/chat/map-volcengine-finish-reason.d.ts +2 -0
  14. package/dist/chat/map-volcengine-finish-reason.js +32 -0
  15. package/dist/chat/map-volcengine-finish-reason.js.map +1 -0
  16. package/dist/chat/volcengine-chat-language-model.d.ts +22 -0
  17. package/dist/chat/volcengine-chat-language-model.js +443 -0
  18. package/dist/chat/volcengine-chat-language-model.js.map +1 -0
  19. package/dist/chat/volcengine-chat-options.d.ts +16 -0
  20. package/dist/chat/volcengine-chat-options.js +29 -0
  21. package/dist/chat/volcengine-chat-options.js.map +1 -0
  22. package/dist/chat/volcengine-chat-prompt.d.ts +49 -0
  23. package/dist/chat/volcengine-chat-prompt.js +4 -0
  24. package/dist/chat/volcengine-chat-prompt.js.map +1 -0
  25. package/dist/chat/volcengine-error.d.ts +1 -0
  26. package/dist/chat/volcengine-error.js +16 -0
  27. package/dist/chat/volcengine-error.js.map +1 -0
  28. package/dist/chat/volcengine-prepare-tools.d.ts +30 -0
  29. package/dist/chat/volcengine-prepare-tools.js +96 -0
  30. package/dist/chat/volcengine-prepare-tools.js.map +1 -0
  31. package/dist/convert-to-volcengine-chat-message.js +12 -0
  32. package/dist/convert-to-volcengine-chat-message.js.map +1 -1
  33. package/dist/image/index.d.ts +1 -0
  34. package/dist/image/index.js +3 -0
  35. package/dist/image/index.js.map +1 -0
  36. package/dist/image/volcengine-image-api.d.ts +22 -0
  37. package/dist/image/volcengine-image-api.js +22 -0
  38. package/dist/image/volcengine-image-api.js.map +1 -0
  39. package/dist/image/volcengine-image-model.d.ts +29 -0
  40. package/dist/image/volcengine-image-model.js +99 -0
  41. package/dist/image/volcengine-image-model.js.map +1 -0
  42. package/dist/image/volcengine-image-options.d.ts +24 -0
  43. package/dist/image/volcengine-image-options.js +32 -0
  44. package/dist/image/volcengine-image-options.js.map +1 -0
  45. package/dist/index.d.ts +4 -3
  46. package/dist/index.js +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/tool/image-generation.d.ts +107 -0
  49. package/dist/tool/image-generation.js +79 -0
  50. package/dist/tool/image-generation.js.map +1 -0
  51. package/dist/tool/web-search.d.ts +70 -2
  52. package/dist/tool/web-search.js +42 -29
  53. package/dist/tool/web-search.js.map +1 -1
  54. package/dist/volcengine-chat-prompt.d.ts +3 -0
  55. package/dist/volcengine-chat-prompt.js.map +1 -1
  56. package/dist/volcengine-prepare-tools.js +46 -5
  57. package/dist/volcengine-prepare-tools.js.map +1 -1
  58. package/dist/volcengine-provider.d.ts +12 -2
  59. package/dist/volcengine-provider.js +24 -23
  60. package/dist/volcengine-provider.js.map +1 -1
  61. package/dist/volcengine-tools.d.ts +3 -1
  62. package/package.json +12 -3
@@ -0,0 +1,30 @@
1
+ import { LanguageModelV3CallOptions, SharedV3Warning } from '@ai-sdk/provider';
2
+ export type VolcengineToolChoice = 'auto' | 'none' | 'required' | {
3
+ type: 'function';
4
+ function: {
5
+ name: string;
6
+ };
7
+ };
8
+ export type VolcengineTool = {
9
+ type: 'function';
10
+ function: {
11
+ name: string;
12
+ description: string | undefined;
13
+ parameters: unknown;
14
+ };
15
+ } | {
16
+ type: 'web_search';
17
+ web_search?: {
18
+ max_keyword?: number;
19
+ limit?: number;
20
+ max_tool_calls?: number;
21
+ };
22
+ };
23
+ export declare function prepareTools({ tools, toolChoice, }: {
24
+ tools: LanguageModelV3CallOptions['tools'];
25
+ toolChoice?: LanguageModelV3CallOptions['toolChoice'];
26
+ }): Promise<{
27
+ tools: VolcengineTool[] | undefined;
28
+ toolChoice: VolcengineToolChoice | undefined;
29
+ toolWarnings: SharedV3Warning[];
30
+ }>;
@@ -0,0 +1,96 @@
1
+ import { UnsupportedFunctionalityError } from '@ai-sdk/provider';
2
+ import { validateTypes } from '@ai-sdk/provider-utils';
3
+ import { webSearchArgsSchema } from '../tool/web-search';
4
+ export async function prepareTools({ tools, toolChoice }) {
5
+ // when the tools array is empty, change it to undefined to prevent errors:
6
+ tools = tools?.length ? tools : undefined;
7
+ const toolWarnings = [];
8
+ if (tools == null) {
9
+ return {
10
+ tools: undefined,
11
+ toolChoice: undefined,
12
+ toolWarnings
13
+ };
14
+ }
15
+ const volcengineTools = [];
16
+ for (const tool of tools){
17
+ if (tool.type === 'provider') {
18
+ const toolId = tool.id;
19
+ switch(toolId){
20
+ case 'volcengine.web_search':
21
+ {
22
+ const args = await validateTypes({
23
+ value: tool.args,
24
+ schema: webSearchArgsSchema
25
+ });
26
+ volcengineTools.push({
27
+ type: 'web_search',
28
+ web_search: {
29
+ max_keyword: args.maxKeyword,
30
+ limit: args.limit,
31
+ max_tool_calls: args.maxToolCalls
32
+ }
33
+ });
34
+ break;
35
+ }
36
+ default:
37
+ toolWarnings.push({
38
+ type: 'unsupported',
39
+ feature: `provider-defined tool ${toolId}`
40
+ });
41
+ }
42
+ } else {
43
+ volcengineTools.push({
44
+ type: 'function',
45
+ function: {
46
+ name: tool.name,
47
+ description: tool.description,
48
+ parameters: tool.inputSchema
49
+ }
50
+ });
51
+ }
52
+ }
53
+ if (toolChoice == null) {
54
+ return {
55
+ tools: volcengineTools,
56
+ toolChoice: undefined,
57
+ toolWarnings
58
+ };
59
+ }
60
+ const type = toolChoice.type;
61
+ switch(type){
62
+ case 'auto':
63
+ case 'none':
64
+ return {
65
+ tools: volcengineTools,
66
+ toolChoice: type,
67
+ toolWarnings
68
+ };
69
+ case 'required':
70
+ return {
71
+ tools: volcengineTools,
72
+ toolChoice: 'required',
73
+ toolWarnings
74
+ };
75
+ case 'tool':
76
+ return {
77
+ tools: volcengineTools,
78
+ toolChoice: {
79
+ type: 'function',
80
+ function: {
81
+ name: toolChoice.toolName
82
+ }
83
+ },
84
+ toolWarnings
85
+ };
86
+ default:
87
+ {
88
+ const _exhaustiveCheck = type;
89
+ throw new UnsupportedFunctionalityError({
90
+ functionality: `tool choice type: ${_exhaustiveCheck}`
91
+ });
92
+ }
93
+ }
94
+ }
95
+
96
+ //# sourceMappingURL=volcengine-prepare-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/chat/volcengine-prepare-tools.ts"],"sourcesContent":["import {\n LanguageModelV3CallOptions,\n SharedV3Warning,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { validateTypes } from '@ai-sdk/provider-utils';\nimport { webSearchArgsSchema } from '../tool/web-search';\n\nexport type VolcengineToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\nexport type VolcengineTool =\n | {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }\n | {\n type: 'web_search';\n web_search?: {\n max_keyword?: number;\n limit?: number;\n max_tool_calls?: number;\n };\n };\n\nexport async function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n}): Promise<{\n tools: VolcengineTool[] | undefined;\n toolChoice: VolcengineToolChoice | undefined;\n toolWarnings: SharedV3Warning[];\n}> {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const volcengineTools: VolcengineTool[] = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n const toolId = tool.id;\n\n switch (toolId) {\n case 'volcengine.web_search': {\n const args = await validateTypes({\n value: tool.args,\n schema: webSearchArgsSchema,\n });\n\n volcengineTools.push({\n type: 'web_search',\n web_search: {\n max_keyword: args.maxKeyword,\n limit: args.limit,\n max_tool_calls: args.maxToolCalls,\n },\n });\n break;\n }\n\n default:\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${toolId}`,\n });\n }\n } else {\n volcengineTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: volcengineTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n return { tools: volcengineTools, toolChoice: type, toolWarnings };\n case 'required':\n return { tools: volcengineTools, toolChoice: 'required', toolWarnings };\n case 'tool':\n return {\n tools: volcengineTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n"],"names":["UnsupportedFunctionalityError","validateTypes","webSearchArgsSchema","prepareTools","tools","toolChoice","length","undefined","toolWarnings","volcengineTools","tool","type","toolId","id","args","value","schema","push","web_search","max_keyword","maxKeyword","limit","max_tool_calls","maxToolCalls","feature","function","name","description","parameters","inputSchema","toolName","_exhaustiveCheck","functionality"],"mappings":"AAAA,SAGEA,6BAA6B,QACxB,mBAAmB;AAC1B,SAASC,aAAa,QAAQ,yBAAyB;AACvD,SAASC,mBAAmB,QAAQ,qBAAqB;AA0BzD,OAAO,eAAeC,aAAa,EACjCC,KAAK,EACLC,UAAU,EAIX;IAKC,2EAA2E;IAC3ED,QAAQA,OAAOE,SAASF,QAAQG;IAEhC,MAAMC,eAAkC,EAAE;IAE1C,IAAIJ,SAAS,MAAM;QACjB,OAAO;YAAEA,OAAOG;YAAWF,YAAYE;YAAWC;QAAa;IACjE;IAEA,MAAMC,kBAAoC,EAAE;IAE5C,KAAK,MAAMC,QAAQN,MAAO;QACxB,IAAIM,KAAKC,IAAI,KAAK,YAAY;YAC5B,MAAMC,SAASF,KAAKG,EAAE;YAEtB,OAAQD;gBACN,KAAK;oBAAyB;wBAC5B,MAAME,OAAO,MAAMb,cAAc;4BAC/Bc,OAAOL,KAAKI,IAAI;4BAChBE,QAAQd;wBACV;wBAEAO,gBAAgBQ,IAAI,CAAC;4BACnBN,MAAM;4BACNO,YAAY;gCACVC,aAAaL,KAAKM,UAAU;gCAC5BC,OAAOP,KAAKO,KAAK;gCACjBC,gBAAgBR,KAAKS,YAAY;4BACnC;wBACF;wBACA;oBACF;gBAEA;oBACEf,aAAaS,IAAI,CAAC;wBAChBN,MAAM;wBACNa,SAAS,CAAC,sBAAsB,EAAEZ,QAAQ;oBAC5C;YACJ;QACF,OAAO;YACLH,gBAAgBQ,IAAI,CAAC;gBACnBN,MAAM;gBACNc,UAAU;oBACRC,MAAMhB,KAAKgB,IAAI;oBACfC,aAAajB,KAAKiB,WAAW;oBAC7BC,YAAYlB,KAAKmB,WAAW;gBAC9B;YACF;QACF;IACF;IAEA,IAAIxB,cAAc,MAAM;QACtB,OAAO;YAAED,OAAOK;YAAiBJ,YAAYE;YAAWC;QAAa;IACvE;IAEA,MAAMG,OAAON,WAAWM,IAAI;IAE5B,OAAQA;QACN,KAAK;QACL,KAAK;YACH,OAAO;gBAAEP,OAAOK;gBAAiBJ,YAAYM;gBAAMH;YAAa;QAClE,KAAK;YACH,OAAO;gBAAEJ,OAAOK;gBAAiBJ,YAAY;gBAAYG;YAAa;QACxE,KAAK;YACH,OAAO;gBACLJ,OAAOK;gBACPJ,YAAY;oBACVM,MAAM;oBACNc,UAAU;wBAAEC,MAAMrB,WAAWyB,QAAQ;oBAAC;gBACxC;gBACAtB;YACF;QACF;YAAS;gBACP,MAAMuB,mBAA0BpB;gBAChC,MAAM,IAAIX,8BAA8B;oBACtCgC,eAAe,CAAC,kBAAkB,EAAED,kBAAkB;gBACxD;YACF;IACF;AACF"}
@@ -51,6 +51,18 @@ export function convertToVolcengineChatMessages(prompt) {
51
51
  }
52
52
  };
53
53
  }
54
+ if (mediaType === "application/pdf") {
55
+ if (!(data instanceof URL) && typeof data !== "string") {
56
+ throw new UnsupportedFunctionalityError({
57
+ functionality: "PDF file from binary data (only URL is supported)"
58
+ });
59
+ }
60
+ const fileUrl = data instanceof URL ? data.toString() : data;
61
+ return {
62
+ type: "input_file",
63
+ file_url: fileUrl
64
+ };
65
+ }
54
66
  throw new UnsupportedFunctionalityError({
55
67
  functionality: `File type: ${mediaType}`
56
68
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convert-to-volcengine-chat-message.ts"],"sourcesContent":["import {\n LanguageModelV3DataContent,\n LanguageModelV3Prompt,\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\nimport { convertToBase64 } from \"@ai-sdk/provider-utils\";\nimport {\n VolcengineChatAssistantMessage,\n VolcengineChatPrompt,\n VolcengineChatUserMessageContent\n} from \"./volcengine-chat-prompt\";\n\nfunction formatDataUrl(data: LanguageModelV3DataContent, mediaType: string): string {\n if (data instanceof URL) {\n return data.toString();\n }\n if (typeof data === \"string\") {\n return data.startsWith(\"data:\") ? data : `data:${mediaType};base64,${data}`;\n }\n return `data:${mediaType};base64,${convertToBase64(data)}`;\n}\n\n\nexport function convertToVolcengineChatMessages(\n prompt: LanguageModelV3Prompt\n): VolcengineChatPrompt {\n const messages: VolcengineChatPrompt = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\": {\n messages.push({\n role: \"system\",\n content: message.content\n });\n break;\n }\n\n case \"user\": {\n messages.push({\n role: \"user\",\n content: message.content.map((part): VolcengineChatUserMessageContent => {\n switch (part.type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"file\": {\n const { mediaType, data } = part;\n\n if (mediaType.startsWith(\"image/\")) {\n return {\n type: \"image_url\",\n image_url: { url: formatDataUrl(data, mediaType) }\n };\n }\n if (mediaType.startsWith(\"video/\")) {\n return {\n type: \"video_url\",\n video_url: { url: formatDataUrl(data, mediaType) }\n };\n }\n throw new UnsupportedFunctionalityError({\n functionality: `File type: ${mediaType}`\n });\n }\n\n default: {\n const _exhaustiveCheck: never = part;\n throw new UnsupportedFunctionalityError({\n functionality: `User message part type: ${(_exhaustiveCheck as { type: string }).type}`\n });\n }\n }\n })\n });\n break;\n }\n\n case \"assistant\": {\n let text = \"\";\n let reasoningContent: string | undefined;\n const toolCalls: VolcengineChatAssistantMessage[\"tool_calls\"] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n text += part.text;\n break;\n case \"reasoning\":\n reasoningContent = (reasoningContent ?? \"\") + part.text;\n break;\n case \"tool-call\":\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments:\n typeof part.input === \"string\"\n ? part.input\n : JSON.stringify(part.input)\n }\n });\n break;\n case \"file\":\n case \"tool-result\":\n // Skip file and tool-result in assistant messages\n break;\n default: {\n const _exhaustiveCheck: never = part;\n throw new UnsupportedFunctionalityError({\n functionality: `Assistant message part type: ${(_exhaustiveCheck as { type: string }).type}`\n });\n }\n }\n }\n\n messages.push({\n role: \"assistant\",\n content: text,\n reasoning_content: reasoningContent,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined\n });\n break;\n }\n\n case \"tool\": {\n for (const toolResponse of message.content) {\n if (toolResponse.type === \"tool-approval-response\") {\n continue;\n }\n\n const { output } = toolResponse;\n let content: string;\n\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n content = output.value;\n break;\n case \"json\":\n case \"error-json\":\n content = JSON.stringify(output.value);\n break;\n case \"execution-denied\":\n content = output.reason ?? \"Tool execution denied.\";\n break;\n case \"content\":\n content = output.value\n .map((v) => (v.type === \"text\" ? v.text : JSON.stringify(v)))\n .join(\"\\n\");\n break;\n }\n\n messages.push({\n role: \"tool\",\n tool_call_id: toolResponse.toolCallId,\n content\n });\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message;\n throw new UnsupportedFunctionalityError({\n functionality: `Message role: ${(_exhaustiveCheck as { role: string }).role}`\n });\n }\n }\n }\n\n return messages;\n}\n"],"names":["UnsupportedFunctionalityError","convertToBase64","formatDataUrl","data","mediaType","URL","toString","startsWith","convertToVolcengineChatMessages","prompt","messages","message","role","push","content","map","part","type","text","image_url","url","video_url","functionality","_exhaustiveCheck","reasoningContent","toolCalls","id","toolCallId","function","name","toolName","arguments","input","JSON","stringify","reasoning_content","tool_calls","length","undefined","toolResponse","output","value","reason","v","join","tool_call_id"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/convert-to-volcengine-chat-message.ts"],"sourcesContent":["import {\n LanguageModelV3DataContent,\n LanguageModelV3Prompt,\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\nimport { convertToBase64 } from \"@ai-sdk/provider-utils\";\nimport {\n VolcengineChatAssistantMessage,\n VolcengineChatPrompt,\n VolcengineChatUserMessageContent\n} from \"./volcengine-chat-prompt\";\n\nfunction formatDataUrl(data: LanguageModelV3DataContent, mediaType: string): string {\n if (data instanceof URL) {\n return data.toString();\n }\n if (typeof data === \"string\") {\n return data.startsWith(\"data:\") ? data : `data:${mediaType};base64,${data}`;\n }\n return `data:${mediaType};base64,${convertToBase64(data)}`;\n}\n\n\nexport function convertToVolcengineChatMessages(\n prompt: LanguageModelV3Prompt\n): VolcengineChatPrompt {\n const messages: VolcengineChatPrompt = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\": {\n messages.push({\n role: \"system\",\n content: message.content\n });\n break;\n }\n\n case \"user\": {\n messages.push({\n role: \"user\",\n content: message.content.map((part): VolcengineChatUserMessageContent => {\n switch (part.type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"file\": {\n const { mediaType, data } = part;\n\n if (mediaType.startsWith(\"image/\")) {\n return {\n type: \"image_url\",\n image_url: { url: formatDataUrl(data, mediaType) }\n };\n }\n if (mediaType.startsWith(\"video/\")) {\n return {\n type: \"video_url\",\n video_url: { url: formatDataUrl(data, mediaType) }\n };\n }\n if (mediaType === \"application/pdf\") {\n if (!(data instanceof URL) && typeof data !== \"string\") {\n throw new UnsupportedFunctionalityError({\n functionality: \"PDF file from binary data (only URL is supported)\"\n });\n }\n const fileUrl = data instanceof URL ? data.toString() : data;\n return {\n type: \"input_file\",\n file_url: fileUrl\n };\n }\n throw new UnsupportedFunctionalityError({\n functionality: `File type: ${mediaType}`\n });\n }\n\n default: {\n const _exhaustiveCheck: never = part;\n throw new UnsupportedFunctionalityError({\n functionality: `User message part type: ${(_exhaustiveCheck as { type: string }).type}`\n });\n }\n }\n })\n });\n break;\n }\n\n case \"assistant\": {\n let text = \"\";\n let reasoningContent: string | undefined;\n const toolCalls: VolcengineChatAssistantMessage[\"tool_calls\"] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n text += part.text;\n break;\n case \"reasoning\":\n reasoningContent = (reasoningContent ?? \"\") + part.text;\n break;\n case \"tool-call\":\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments:\n typeof part.input === \"string\"\n ? part.input\n : JSON.stringify(part.input)\n }\n });\n break;\n case \"file\":\n case \"tool-result\":\n // Skip file and tool-result in assistant messages\n break;\n default: {\n const _exhaustiveCheck: never = part;\n throw new UnsupportedFunctionalityError({\n functionality: `Assistant message part type: ${(_exhaustiveCheck as { type: string }).type}`\n });\n }\n }\n }\n\n messages.push({\n role: \"assistant\",\n content: text,\n reasoning_content: reasoningContent,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined\n });\n break;\n }\n\n case \"tool\": {\n for (const toolResponse of message.content) {\n if (toolResponse.type === \"tool-approval-response\") {\n continue;\n }\n\n const { output } = toolResponse;\n let content: string;\n\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n content = output.value;\n break;\n case \"json\":\n case \"error-json\":\n content = JSON.stringify(output.value);\n break;\n case \"execution-denied\":\n content = output.reason ?? \"Tool execution denied.\";\n break;\n case \"content\":\n content = output.value\n .map((v) => (v.type === \"text\" ? v.text : JSON.stringify(v)))\n .join(\"\\n\");\n break;\n }\n\n messages.push({\n role: \"tool\",\n tool_call_id: toolResponse.toolCallId,\n content\n });\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message;\n throw new UnsupportedFunctionalityError({\n functionality: `Message role: ${(_exhaustiveCheck as { role: string }).role}`\n });\n }\n }\n }\n\n return messages;\n}\n"],"names":["UnsupportedFunctionalityError","convertToBase64","formatDataUrl","data","mediaType","URL","toString","startsWith","convertToVolcengineChatMessages","prompt","messages","message","role","push","content","map","part","type","text","image_url","url","video_url","functionality","fileUrl","file_url","_exhaustiveCheck","reasoningContent","toolCalls","id","toolCallId","function","name","toolName","arguments","input","JSON","stringify","reasoning_content","tool_calls","length","undefined","toolResponse","output","value","reason","v","join","tool_call_id"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { VolcengineImageModel, type VolcengineImageModelId, type VolcengineImageConfig, } from "./volcengine-image-model";
@@ -0,0 +1,3 @@
1
+ export { VolcengineImageModel } from "./volcengine-image-model";
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/image/index.ts"],"sourcesContent":["export {\n VolcengineImageModel,\n type VolcengineImageModelId,\n\n type VolcengineImageConfig,\n} from \"./volcengine-image-model\";\n"],"names":["VolcengineImageModel"],"mappings":"AAAA,SACEA,oBAAoB,QAIf,2BAA2B"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Response schema for Volcengine image generation API.
4
+ *
5
+ * Uses a minimal schema to limit breakages when the API changes
6
+ * and increases efficiency.
7
+ */
8
+ export declare const volcengineImageResponseSchema: z.ZodObject<{
9
+ model: z.ZodOptional<z.ZodString>;
10
+ created: z.ZodOptional<z.ZodNumber>;
11
+ data: z.ZodArray<z.ZodObject<{
12
+ url: z.ZodOptional<z.ZodString>;
13
+ b64_json: z.ZodOptional<z.ZodString>;
14
+ size: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>>;
16
+ usage: z.ZodOptional<z.ZodObject<{
17
+ generated_images: z.ZodOptional<z.ZodNumber>;
18
+ output_tokens: z.ZodOptional<z.ZodNumber>;
19
+ total_tokens: z.ZodOptional<z.ZodNumber>;
20
+ }, z.core.$strip>>;
21
+ }, z.core.$strip>;
22
+ export type VolcengineImageResponse = z.infer<typeof volcengineImageResponseSchema>;
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Response schema for Volcengine image generation API.
4
+ *
5
+ * Uses a minimal schema to limit breakages when the API changes
6
+ * and increases efficiency.
7
+ */ export const volcengineImageResponseSchema = z.object({
8
+ model: z.string().optional(),
9
+ created: z.number().optional(),
10
+ data: z.array(z.object({
11
+ url: z.string().optional(),
12
+ b64_json: z.string().optional(),
13
+ size: z.string().optional()
14
+ })),
15
+ usage: z.object({
16
+ generated_images: z.number().optional(),
17
+ output_tokens: z.number().optional(),
18
+ total_tokens: z.number().optional()
19
+ }).optional()
20
+ });
21
+
22
+ //# sourceMappingURL=volcengine-image-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/image/volcengine-image-api.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Response schema for Volcengine image generation API.\n *\n * Uses a minimal schema to limit breakages when the API changes\n * and increases efficiency.\n */\nexport const volcengineImageResponseSchema = z.object({\n model: z.string().optional(),\n created: z.number().optional(),\n data: z.array(\n z.object({\n url: z.string().optional(),\n b64_json: z.string().optional(),\n size: z.string().optional(),\n })\n ),\n usage: z\n .object({\n generated_images: z.number().optional(),\n output_tokens: z.number().optional(),\n total_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type VolcengineImageResponse = z.infer<typeof volcengineImageResponseSchema>;\n"],"names":["z","volcengineImageResponseSchema","object","model","string","optional","created","number","data","array","url","b64_json","size","usage","generated_images","output_tokens","total_tokens"],"mappings":"AAAA,SAASA,CAAC,QAAQ,MAAM;AAExB;;;;;CAKC,GACD,OAAO,MAAMC,gCAAgCD,EAAEE,MAAM,CAAC;IACpDC,OAAOH,EAAEI,MAAM,GAAGC,QAAQ;IAC1BC,SAASN,EAAEO,MAAM,GAAGF,QAAQ;IAC5BG,MAAMR,EAAES,KAAK,CACXT,EAAEE,MAAM,CAAC;QACPQ,KAAKV,EAAEI,MAAM,GAAGC,QAAQ;QACxBM,UAAUX,EAAEI,MAAM,GAAGC,QAAQ;QAC7BO,MAAMZ,EAAEI,MAAM,GAAGC,QAAQ;IAC3B;IAEFQ,OAAOb,EACJE,MAAM,CAAC;QACNY,kBAAkBd,EAAEO,MAAM,GAAGF,QAAQ;QACrCU,eAAef,EAAEO,MAAM,GAAGF,QAAQ;QAClCW,cAAchB,EAAEO,MAAM,GAAGF,QAAQ;IACnC,GACCA,QAAQ;AACb,GAAG"}
@@ -0,0 +1,29 @@
1
+ import { ImageModelV3, ImageModelV3CallOptions, ImageModelV3ProviderMetadata, ImageModelV3Usage, SharedV3Warning } from "@ai-sdk/provider";
2
+ import { FetchFunction } from "@ai-sdk/provider-utils";
3
+ export type VolcengineImageModelId = "doubao-seedream-4-5-251128" | "doubao-seedream-4-0-250828" | (string & {});
4
+ export interface VolcengineImageConfig {
5
+ provider: string;
6
+ baseURL: string;
7
+ headers: () => Record<string, string>;
8
+ fetch?: FetchFunction;
9
+ }
10
+ export declare class VolcengineImageModel implements ImageModelV3 {
11
+ readonly modelId: VolcengineImageModelId;
12
+ private readonly config;
13
+ readonly specificationVersion: "v3";
14
+ get maxImagesPerCall(): number;
15
+ get provider(): string;
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
+ }>;
28
+ private convertFileToDataUrl;
29
+ }
@@ -0,0 +1,99 @@
1
+ import { combineHeaders, createJsonResponseHandler, postJsonToApi } from "@ai-sdk/provider-utils";
2
+ import { volcengineFailedResponseHandler } from "../chat/volcengine-error";
3
+ import { volcengineImageResponseSchema } from "./volcengine-image-api";
4
+ export class VolcengineImageModel {
5
+ modelId;
6
+ config;
7
+ specificationVersion = "v3";
8
+ get maxImagesPerCall() {
9
+ return 1;
10
+ }
11
+ get provider() {
12
+ return this.config.provider;
13
+ }
14
+ constructor(modelId, config){
15
+ this.modelId = modelId;
16
+ this.config = config;
17
+ }
18
+ async doGenerate({ prompt, files, size, aspectRatio, seed, providerOptions, headers, abortSignal }) {
19
+ const warnings = [];
20
+ // Handle unsupported options
21
+ if (aspectRatio != null) {
22
+ warnings.push({
23
+ type: "unsupported",
24
+ feature: "aspectRatio"
25
+ });
26
+ }
27
+ if (seed != null) {
28
+ warnings.push({
29
+ type: "unsupported",
30
+ feature: "seed"
31
+ });
32
+ }
33
+ // Build request body
34
+ const body = {
35
+ model: this.modelId,
36
+ prompt,
37
+ size: size ?? "1024x1024",
38
+ response_format: "b64_json",
39
+ ...providerOptions.volcengine ?? {}
40
+ };
41
+ // Handle reference images for image-to-image generation
42
+ if (files && files.length > 0) {
43
+ const imageUrls = files.map((file)=>this.convertFileToDataUrl(file));
44
+ if (imageUrls.length === 1) {
45
+ body.image = imageUrls[0];
46
+ } else {
47
+ body.image = imageUrls;
48
+ }
49
+ }
50
+ const { value: response, responseHeaders } = await postJsonToApi({
51
+ url: `${this.config.baseURL}/images/generations`,
52
+ headers: combineHeaders(this.config.headers(), headers),
53
+ body,
54
+ failedResponseHandler: volcengineFailedResponseHandler,
55
+ successfulResponseHandler: createJsonResponseHandler(volcengineImageResponseSchema),
56
+ abortSignal,
57
+ fetch: this.config.fetch
58
+ });
59
+ // Extract images from response
60
+ const images = response.data.map((item)=>{
61
+ if (item.b64_json) {
62
+ return item.b64_json;
63
+ }
64
+ if (item.url) {
65
+ return item.url;
66
+ }
67
+ throw new Error("No image data in response");
68
+ });
69
+ return {
70
+ images,
71
+ warnings,
72
+ response: {
73
+ timestamp: new Date(),
74
+ modelId: response.model ?? this.modelId,
75
+ headers: responseHeaders
76
+ },
77
+ usage: response.usage ? {
78
+ inputTokens: undefined,
79
+ outputTokens: response.usage.output_tokens,
80
+ totalTokens: response.usage.total_tokens
81
+ } : undefined
82
+ };
83
+ }
84
+ convertFileToDataUrl(file) {
85
+ if (file.type === "url") {
86
+ return file.url;
87
+ }
88
+ // file.type === "file"
89
+ if (typeof file.data === "string") {
90
+ // base64 string - convert to data URL
91
+ return `data:${file.mediaType};base64,${file.data}`;
92
+ }
93
+ // Uint8Array - convert to base64 data URL
94
+ const base64 = btoa(String.fromCharCode(...file.data));
95
+ return `data:${file.mediaType};base64,${base64}`;
96
+ }
97
+ }
98
+
99
+ //# sourceMappingURL=volcengine-image-model.js.map
@@ -0,0 +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\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\n\n get maxImagesPerCall(): number {\n return 1;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n\n\n\n constructor(\n readonly modelId: VolcengineImageModelId,\n private readonly config: VolcengineImageConfig,\n ) { }\n\n\n async doGenerate({ 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) =>\n this.convertFileToDataUrl(file)\n );\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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"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ export type VolcengineImageModelId = "doubao-seedream-4-5-251128" | "doubao-seedream-4-0-250828" | (string & {});
3
+ export declare const modelMaxImagesPerCall: Record<string, number>;
4
+ export interface VolcengineImageSettings {
5
+ /**
6
+ * Override the maximum number of images per call.
7
+ */
8
+ maxImagesPerCall?: number;
9
+ }
10
+ export declare const volcengineImageProviderOptions: z.ZodObject<{
11
+ watermark: z.ZodOptional<z.ZodBoolean>;
12
+ responseFormat: z.ZodOptional<z.ZodEnum<{
13
+ url: "url";
14
+ b64_json: "b64_json";
15
+ }>>;
16
+ logoInfo: z.ZodOptional<z.ZodObject<{
17
+ addLogo: z.ZodOptional<z.ZodBoolean>;
18
+ position: z.ZodOptional<z.ZodNumber>;
19
+ language: z.ZodOptional<z.ZodNumber>;
20
+ opacity: z.ZodOptional<z.ZodNumber>;
21
+ }, z.core.$strip>>;
22
+ imageStrength: z.ZodOptional<z.ZodNumber>;
23
+ }, z.core.$strip>;
24
+ export type VolcengineImageProviderOptions = z.infer<typeof volcengineImageProviderOptions>;
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export const modelMaxImagesPerCall = {
3
+ "doubao-seedream-4-5-251128": 1,
4
+ "doubao-seedream-4-0-250828": 1
5
+ };
6
+ export const volcengineImageProviderOptions = z.object({
7
+ /**
8
+ * Whether to add watermark to the generated image.
9
+ * @default false
10
+ */ watermark: z.boolean().optional(),
11
+ /**
12
+ * The format of the response.
13
+ * @default "b64_json"
14
+ */ responseFormat: z.enum([
15
+ "url",
16
+ "b64_json"
17
+ ]).optional(),
18
+ /**
19
+ * Logo information to embed in the image.
20
+ */ logoInfo: z.object({
21
+ addLogo: z.boolean().optional(),
22
+ position: z.number().optional(),
23
+ language: z.number().optional(),
24
+ opacity: z.number().optional()
25
+ }).optional(),
26
+ /**
27
+ * Reference image strength for image-to-image generation.
28
+ * Value between 0 and 1.
29
+ */ imageStrength: z.number().min(0).max(1).optional()
30
+ });
31
+
32
+ //# sourceMappingURL=volcengine-image-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/image/volcengine-image-options.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type VolcengineImageModelId =\n | \"doubao-seedream-4-5-251128\"\n | \"doubao-seedream-4-0-250828\"\n | (string & {});\n\nexport const modelMaxImagesPerCall: Record<string, number> = {\n \"doubao-seedream-4-5-251128\": 1,\n \"doubao-seedream-4-0-250828\": 1,\n};\n\nexport interface VolcengineImageSettings {\n /**\n * Override the maximum number of images per call.\n */\n maxImagesPerCall?: number;\n}\n\nexport const volcengineImageProviderOptions = z.object({\n /**\n * Whether to add watermark to the generated image.\n * @default false\n */\n watermark: z.boolean().optional(),\n\n /**\n * The format of the response.\n * @default \"b64_json\"\n */\n responseFormat: z.enum([\"url\", \"b64_json\"]).optional(),\n\n /**\n * Logo information to embed in the image.\n */\n logoInfo: z\n .object({\n addLogo: z.boolean().optional(),\n position: z.number().optional(),\n language: z.number().optional(),\n opacity: z.number().optional(),\n })\n .optional(),\n\n /**\n * Reference image strength for image-to-image generation.\n * Value between 0 and 1.\n */\n imageStrength: z.number().min(0).max(1).optional(),\n});\n\nexport type VolcengineImageProviderOptions = z.infer<\n typeof volcengineImageProviderOptions\n>;\n"],"names":["z","modelMaxImagesPerCall","volcengineImageProviderOptions","object","watermark","boolean","optional","responseFormat","enum","logoInfo","addLogo","position","number","language","opacity","imageStrength","min","max"],"mappings":"AAAA,SAASA,CAAC,QAAQ,MAAM;AAOxB,OAAO,MAAMC,wBAAgD;IAC3D,8BAA8B;IAC9B,8BAA8B;AAChC,EAAE;AASF,OAAO,MAAMC,iCAAiCF,EAAEG,MAAM,CAAC;IACrD;;;GAGC,GACDC,WAAWJ,EAAEK,OAAO,GAAGC,QAAQ;IAE/B;;;GAGC,GACDC,gBAAgBP,EAAEQ,IAAI,CAAC;QAAC;QAAO;KAAW,EAAEF,QAAQ;IAEpD;;GAEC,GACDG,UAAUT,EACPG,MAAM,CAAC;QACNO,SAASV,EAAEK,OAAO,GAAGC,QAAQ;QAC7BK,UAAUX,EAAEY,MAAM,GAAGN,QAAQ;QAC7BO,UAAUb,EAAEY,MAAM,GAAGN,QAAQ;QAC7BQ,SAASd,EAAEY,MAAM,GAAGN,QAAQ;IAC9B,GACCA,QAAQ;IAEX;;;GAGC,GACDS,eAAef,EAAEY,MAAM,GAAGI,GAAG,CAAC,GAAGC,GAAG,CAAC,GAAGX,QAAQ;AAClD,GAAG"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export { createVolcengine, volcengine } from "./volcengine-provider";
2
2
  export type { VolcengineProvider, VolcengineProviderSettings } from "./volcengine-provider";
3
- export type { VolcengineChatOptions } from './volcengine-chat-options';
4
- export { convertVolcengineUsage } from './convert-volcengine-usage';
5
- export type { VolcengineUsage } from './convert-volcengine-usage';
3
+ export type { VolcengineChatOptions } from './chat';
4
+ export type { VolcengineImageModelId, } from './image';
6
5
  export { volcengineTools } from './volcengine-tools';
6
+ export { convertVolcengineUsage } from './chat/convert-volcengine-chat-usage';
7
+ export type { VolcengineUsage } from './chat/convert-volcengine-chat-usage';
7
8
  export { VERSION } from './version';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { createVolcengine, volcengine } from "./volcengine-provider";
2
- export { convertVolcengineUsage } from './convert-volcengine-usage';
3
2
  export { volcengineTools } from './volcengine-tools';
3
+ export { convertVolcengineUsage } from './chat/convert-volcengine-chat-usage';
4
4
  export { VERSION } from './version';
5
5
 
6
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { createVolcengine, volcengine } from \"./volcengine-provider\";\nexport type {\n VolcengineProvider,\n VolcengineProviderSettings\n} from \"./volcengine-provider\";\nexport type { VolcengineChatOptions } from './volcengine-chat-options';\nexport { convertVolcengineUsage } from './convert-volcengine-usage';\nexport type { VolcengineUsage } from './convert-volcengine-usage';\nexport { volcengineTools } from './volcengine-tools';\nexport { VERSION } from './version';"],"names":["createVolcengine","volcengine","convertVolcengineUsage","volcengineTools","VERSION"],"mappings":"AAAA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,wBAAwB;AAMrE,SAASC,sBAAsB,QAAQ,6BAA6B;AAEpE,SAASC,eAAe,QAAQ,qBAAqB;AACrD,SAASC,OAAO,QAAQ,YAAY"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { createVolcengine, volcengine } from \"./volcengine-provider\";\nexport type {\n VolcengineProvider,\n VolcengineProviderSettings\n} from \"./volcengine-provider\";\nexport type { VolcengineChatOptions } from './chat';\nexport type {\n VolcengineImageModelId,\n\n} from './image';\nexport { volcengineTools } from './volcengine-tools';\nexport { convertVolcengineUsage } from './chat/convert-volcengine-chat-usage';\nexport type { VolcengineUsage } from './chat/convert-volcengine-chat-usage';\nexport { VERSION } from './version';"],"names":["createVolcengine","volcengine","volcengineTools","convertVolcengineUsage","VERSION"],"mappings":"AAAA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,wBAAwB;AAUrE,SAASC,eAAe,QAAQ,qBAAqB;AACrD,SAASC,sBAAsB,QAAQ,uCAAuC;AAE9E,SAASC,OAAO,QAAQ,YAAY"}
@@ -0,0 +1,107 @@
1
+ export declare const imageGenerationArgsSchema: import("@ai-sdk/provider-utils").LazySchema<{
2
+ model?: string | undefined;
3
+ size?: "2K" | "4K" | undefined;
4
+ responseFormat?: "url" | "b64_json" | undefined;
5
+ image?: string | string[] | undefined;
6
+ }>;
7
+ export declare const imageGenerationOutputSchema: import("@ai-sdk/provider-utils").LazySchema<{
8
+ model: string;
9
+ created: number;
10
+ data: {
11
+ size: string;
12
+ url?: string | undefined;
13
+ b64_json?: string | undefined;
14
+ }[];
15
+ usage: {
16
+ generated_images: number;
17
+ output_tokens: number;
18
+ total_tokens: number;
19
+ };
20
+ }>;
21
+ /**
22
+ * Image generation input options.
23
+ */
24
+ export interface ImageGenerationArgs {
25
+ /**
26
+ * Model ID for image generation.
27
+ * @default "doubao-seedream-4-5-251128"
28
+ */
29
+ model?: string;
30
+ /**
31
+ * Image resolution.
32
+ * @default "2K"
33
+ */
34
+ size?: "2K" | "4K";
35
+ /**
36
+ * Response format for the generated image.
37
+ * - "url": Returns image download URL (valid for 24 hours)
38
+ * - "b64_json": Returns Base64 encoded image data
39
+ * @default "url"
40
+ */
41
+ responseFormat?: "url" | "b64_json";
42
+ /**
43
+ * Reference image URL(s) for image-to-image generation.
44
+ * - Single URL string for single image reference
45
+ * - Array of URLs for multi-image reference
46
+ */
47
+ image?: string | string[];
48
+ }
49
+ /**
50
+ * Image generation output.
51
+ */
52
+ export interface ImageGenerationOutput {
53
+ model: string;
54
+ created: number;
55
+ data: Array<{
56
+ /** Image URL, returned when response_format is url */
57
+ url?: string;
58
+ /** Base64 encoded image, returned when response_format is b64_json */
59
+ b64_json?: string;
60
+ /** Image dimensions (e.g., "3104x1312") */
61
+ size: string;
62
+ }>;
63
+ usage: {
64
+ generated_images: number;
65
+ output_tokens: number;
66
+ total_tokens: number;
67
+ };
68
+ }
69
+ /**
70
+ * Volcengine Image Generation Tool
71
+ *
72
+ * Enables the model to generate images from text prompts or reference images.
73
+ *
74
+ * Supports three modes:
75
+ * - Text-to-Image: Generate images from text prompts only
76
+ * - Image-to-Image: Generate images using a single reference image
77
+ * - Multi-Image-to-Image: Generate images using multiple reference images
78
+ *
79
+ * @see https://www.volcengine.com/docs/82379/1824121
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * // Text-to-Image
84
+ * volcengineTools.imageGeneration({
85
+ * size: "2K",
86
+ * })
87
+ *
88
+ * // Image-to-Image
89
+ * volcengineTools.imageGeneration({
90
+ * size: "2K",
91
+ * image: "https://example.com/reference.png",
92
+ * })
93
+ *
94
+ * // Multi-Image-to-Image
95
+ * volcengineTools.imageGeneration({
96
+ * size: "2K",
97
+ * image: ["https://example.com/img1.png", "https://example.com/img2.png"],
98
+ * })
99
+ *
100
+ * // Get Base64 encoded image
101
+ * volcengineTools.imageGeneration({
102
+ * size: "2K",
103
+ * responseFormat: "b64_json",
104
+ * })
105
+ * ```
106
+ */
107
+ export declare const imageGeneration: (args?: ImageGenerationArgs) => import("@ai-sdk/provider-utils").Tool<{}, ImageGenerationOutput>;