@aihubmix/ai-sdk-provider 0.0.1 → 0.0.3

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.
package/README.zh.md ADDED
@@ -0,0 +1,301 @@
1
+ # AI SDK - Aihubmix Provider
2
+
3
+ <div align="center">
4
+ <a href="README.md">🇺🇸 English</a> |
5
+ <a href="README.zh.md">🇨🇳 中文</a> |
6
+ <a href="README.ja.md">🇯🇵 日本語</a>
7
+ </div>
8
+
9
+ > **🎉 10% 折扣!**
10
+ 已内置app-code,使用此方式请求所有模型可享受 10% 折扣。
11
+
12
+ **[Aihubmix 官方网站](https://aihubmix.com/)** | **[模型广场](https://aihubmix.com/models)**
13
+
14
+ **[Aihubmix provider](https://v5.ai-sdk.dev/providers/community-providers/aihubmix)** 适用于 [AI SDK](https://ai-sdk.dev/docs)
15
+ 一个网关,无限模型;一站式请求:OpenAI、Claude、Gemini、DeepSeek、Qwen 以及超过 500 个 AI 模型。
16
+
17
+ ## 支持的功能
18
+
19
+ Aihubmix provider 支持以下 AI 功能:
20
+
21
+ - **文本生成**:使用各种模型进行聊天完成
22
+ - **流式文本**:实时文本流式传输
23
+ - **图像生成**:从文本提示创建图像
24
+ - **嵌入**:单个和批量文本嵌入
25
+ - **对象生成**:使用模式的结构化数据生成
26
+ - **流式对象**:实时结构化数据流式传输
27
+ - **语音合成**:文本转语音转换
28
+ - **转录**:语音转文本转换
29
+ - **工具**:网络搜索和其他工具
30
+
31
+ ## 安装
32
+
33
+ Aihubmix 在 `@aihubmix/ai-sdk-provider` 模块中可用。您可以通过 [@aihubmix/ai-sdk-provider](https://www.npmjs.com/package/@aihubmix/ai-sdk-provider) 安装它
34
+
35
+ ```bash
36
+ npm i @aihubmix/ai-sdk-provider
37
+ ```
38
+
39
+ ## Provider 实例
40
+
41
+ 您可以从 `@aihubmix/ai-sdk-provider` 导入默认的 provider 实例 `aihubmix`:
42
+
43
+ ```ts
44
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
45
+ ```
46
+
47
+ ## 配置
48
+
49
+ 将您的 Aihubmix API 密钥设置为环境变量:
50
+
51
+ ```bash
52
+ export AIHUBMIX_API_KEY="your-api-key-here"
53
+ ```
54
+
55
+ 或直接传递给 provider:
56
+
57
+ ```ts
58
+ import { createAihubmix } from '@aihubmix/ai-sdk-provider';
59
+
60
+ const aihubmix = createAihubmix({
61
+ apiKey: 'your-api-key-here',
62
+ });
63
+ ```
64
+
65
+ ## 使用
66
+
67
+ 首先,导入必要的函数:
68
+
69
+ ```ts
70
+ import { createAihubmix } from '@aihubmix/ai-sdk-provider';
71
+ import {
72
+ generateText,
73
+ streamText,
74
+ generateImage,
75
+ embed,
76
+ embedMany,
77
+ generateObject,
78
+ streamObject,
79
+ generateSpeech,
80
+ transcribe
81
+ } from 'ai';
82
+ import { z } from 'zod';
83
+ ```
84
+
85
+ ### 生成文本
86
+
87
+ ```ts
88
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
89
+ import { generateText } from 'ai';
90
+
91
+ const { text } = await generateText({
92
+ model: aihubmix('o4-mini'),
93
+ prompt: '为4个人写一个素食千层面食谱。',
94
+ });
95
+ ```
96
+
97
+ ### Claude 模型
98
+
99
+ ```ts
100
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
101
+ import { generateText } from 'ai';
102
+
103
+ const { text } = await generateText({
104
+ model: aihubmix('claude-3-7-sonnet-20250219'),
105
+ prompt: '用简单的术语解释量子计算。',
106
+ });
107
+ ```
108
+
109
+ ### Gemini 模型
110
+
111
+ ```ts
112
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
113
+ import { generateText } from 'ai';
114
+
115
+ const { text } = await generateText({
116
+ model: aihubmix('gemini-2.5-flash'),
117
+ prompt: '创建一个Python脚本来对数字列表进行排序。',
118
+ });
119
+ ```
120
+
121
+ ### 图像生成
122
+
123
+ ```ts
124
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
125
+ import { generateImage } from 'ai';
126
+
127
+ const { image } = await generateImage({
128
+ model: aihubmix.image('gpt-image-1'),
129
+ prompt: '山间美丽的日落',
130
+ });
131
+ ```
132
+
133
+ ### 嵌入
134
+
135
+ ```ts
136
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
137
+ import { embed } from 'ai';
138
+
139
+ const { embedding } = await embed({
140
+ model: aihubmix.embedding('text-embedding-ada-002'),
141
+ value: '你好,世界!',
142
+ });
143
+ ```
144
+
145
+ ### 转录
146
+
147
+ ```ts
148
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
149
+ import { transcribe } from 'ai';
150
+
151
+ const { text } = await transcribe({
152
+ model: aihubmix.transcription('whisper-1'),
153
+ audio: audioFile,
154
+ });
155
+ ```
156
+
157
+ ### 流式文本
158
+
159
+ ```ts
160
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
161
+ import { streamText } from 'ai';
162
+
163
+ const result = streamText({
164
+ model: aihubmix('gpt-3.5-turbo'),
165
+ prompt: '写一个关于机器人学习绘画的短故事。',
166
+ maxOutputTokens: 256,
167
+ temperature: 0.3,
168
+ maxRetries: 3,
169
+ });
170
+
171
+ let fullText = '';
172
+ for await (const textPart of result.textStream) {
173
+ fullText += textPart;
174
+ process.stdout.write(textPart);
175
+ }
176
+
177
+ console.log('\n使用情况:', await result.usage);
178
+ console.log('完成原因:', await result.finishReason);
179
+ ```
180
+
181
+ ### 生成对象
182
+
183
+ ```ts
184
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
185
+ import { generateObject } from 'ai';
186
+ import { z } from 'zod';
187
+
188
+ const result = await generateObject({
189
+ model: aihubmix('gpt-4o-mini'),
190
+ schema: z.object({
191
+ recipe: z.object({
192
+ name: z.string(),
193
+ ingredients: z.array(
194
+ z.object({
195
+ name: z.string(),
196
+ amount: z.string(),
197
+ }),
198
+ ),
199
+ steps: z.array(z.string()),
200
+ }),
201
+ }),
202
+ prompt: '生成一个千层面食谱。',
203
+ });
204
+
205
+ console.log(JSON.stringify(result.object.recipe, null, 2));
206
+ console.log('Token使用情况:', result.usage);
207
+ console.log('完成原因:', result.finishReason);
208
+ ```
209
+
210
+ ### 流式对象
211
+
212
+ ```ts
213
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
214
+ import { streamObject } from 'ai';
215
+ import { z } from 'zod';
216
+
217
+ const result = await streamObject({
218
+ model: aihubmix('gpt-4o-mini'),
219
+ schema: z.object({
220
+ recipe: z.object({
221
+ name: z.string(),
222
+ ingredients: z.array(
223
+ z.object({
224
+ name: z.string(),
225
+ amount: z.string(),
226
+ }),
227
+ ),
228
+ steps: z.array(z.string()),
229
+ }),
230
+ }),
231
+ prompt: '生成一个千层面食谱。',
232
+ });
233
+
234
+ for await (const objectPart of result.partialObjectStream) {
235
+ console.log(objectPart);
236
+ }
237
+
238
+ console.log('Token使用情况:', result.usage);
239
+ console.log('最终对象:', result.object);
240
+ ```
241
+
242
+ ### 批量嵌入
243
+
244
+ ```ts
245
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
246
+ import { embedMany } from 'ai';
247
+
248
+ const { embeddings, usage } = await embedMany({
249
+ model: aihubmix.embedding('text-embedding-3-small'),
250
+ values: [
251
+ '海滩上的晴天',
252
+ '城市里的雨天下午',
253
+ '山间的雪夜',
254
+ ],
255
+ });
256
+
257
+ console.log('嵌入向量:', embeddings);
258
+ console.log('使用情况:', usage);
259
+ ```
260
+
261
+ ### 语音合成
262
+
263
+ ```ts
264
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
265
+ import { generateSpeech } from 'ai';
266
+
267
+ const { audio } = await generateSpeech({
268
+ model: aihubmix.speech('tts-1'),
269
+ text: '你好,这是语音合成的测试。',
270
+ });
271
+
272
+ // 保存音频文件
273
+ await saveAudioFile(audio);
274
+ console.log('音频生成成功:', audio);
275
+ ```
276
+
277
+ ### 工具
278
+
279
+ Aihubmix provider 支持各种工具,包括网络搜索:
280
+
281
+ ```ts
282
+ import { aihubmix } from '@aihubmix/ai-sdk-provider';
283
+ import { generateText } from 'ai';
284
+
285
+ const { text } = await generateText({
286
+ model: aihubmix('gpt-4'),
287
+ prompt: 'AI的最新发展是什么?',
288
+ tools: {
289
+ webSearchPreview: aihubmix.tools.webSearchPreview({
290
+ searchContextSize: 'high',
291
+ }),
292
+ },
293
+ });
294
+ ```
295
+
296
+ ## 附加资源
297
+
298
+ - [Aihubmix Provider 仓库](https://github.com/inferera/aihubmix)
299
+ - [Aihubmix 文档](https://docs.aihubmix.com/en)
300
+ - [Aihubmix 控制台](https://aihubmix.com)
301
+ - [Aihubmix 商务合作](mailto:business@aihubmix.com)
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { OpenAIChatSettings, OpenAICompletionSettings, OpenAIEmbeddingSettings, OpenAIImageSettings } from '@ai-sdk/openai/internal';
2
- import { ProviderV1, LanguageModelV1, EmbeddingModelV1, ImageModelV1, TranscriptionModelV1, SpeechModelV1 } from '@ai-sdk/provider';
1
+ import { ProviderV2, LanguageModelV2, EmbeddingModelV2, ImageModelV2, TranscriptionModelV2, SpeechModelV2 } from '@ai-sdk/provider';
3
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
4
3
  import { z } from 'zod';
4
+ import { OpenAIProviderSettings } from '@ai-sdk/openai';
5
5
 
6
6
  declare const WebSearchPreviewParameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
7
7
  declare function webSearchPreviewTool({ searchContextSize, userLocation, }?: {
@@ -14,30 +14,32 @@ declare function webSearchPreviewTool({ searchContextSize, userLocation, }?: {
14
14
  timezone?: string;
15
15
  };
16
16
  }): {
17
- type: 'provider-defined';
18
- id: 'openai.web_search_preview';
19
- args: {};
20
- parameters: typeof WebSearchPreviewParameters;
17
+ type: 'function';
18
+ function: {
19
+ name: string;
20
+ description: string;
21
+ parameters: typeof WebSearchPreviewParameters;
22
+ };
21
23
  };
22
- declare const openaiTools: {
24
+ declare const aihubmixTools: {
23
25
  webSearchPreview: typeof webSearchPreviewTool;
24
26
  };
25
27
 
26
- interface AihubmixProvider extends ProviderV1 {
27
- (deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;
28
- languageModel(deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;
29
- chat(deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;
30
- responses(deploymentId: string): LanguageModelV1;
31
- completion(deploymentId: string, settings?: OpenAICompletionSettings): LanguageModelV1;
32
- embedding(deploymentId: string, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
33
- image(deploymentId: string, settings?: OpenAIImageSettings): ImageModelV1;
34
- imageModel(deploymentId: string, settings?: OpenAIImageSettings): ImageModelV1;
35
- textEmbedding(deploymentId: string, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
36
- textEmbeddingModel(deploymentId: string, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
37
- transcription(deploymentId: string): TranscriptionModelV1;
38
- speech(deploymentId: string): SpeechModelV1;
39
- speechModel(deploymentId: string): SpeechModelV1;
40
- tools: typeof openaiTools;
28
+ interface AihubmixProvider extends ProviderV2 {
29
+ (deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
30
+ languageModel(deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
31
+ chat(deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
32
+ responses(deploymentId: string): LanguageModelV2;
33
+ completion(deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
34
+ embedding(deploymentId: string, settings?: OpenAIProviderSettings): EmbeddingModelV2<string>;
35
+ image(deploymentId: string, settings?: OpenAIProviderSettings): ImageModelV2;
36
+ imageModel(deploymentId: string, settings?: OpenAIProviderSettings): ImageModelV2;
37
+ textEmbedding(deploymentId: string, settings?: OpenAIProviderSettings): EmbeddingModelV2<string>;
38
+ textEmbeddingModel(deploymentId: string, settings?: OpenAIProviderSettings): EmbeddingModelV2<string>;
39
+ transcription(deploymentId: string): TranscriptionModelV2;
40
+ speech(deploymentId: string): SpeechModelV2;
41
+ speechModel(deploymentId: string): SpeechModelV2;
42
+ tools: typeof aihubmixTools;
41
43
  }
42
44
  interface AihubmixProviderSettings {
43
45
  apiKey?: string;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { OpenAIChatSettings, OpenAICompletionSettings, OpenAIEmbeddingSettings, OpenAIImageSettings } from '@ai-sdk/openai/internal';
2
- import { ProviderV1, LanguageModelV1, EmbeddingModelV1, ImageModelV1, TranscriptionModelV1, SpeechModelV1 } from '@ai-sdk/provider';
1
+ import { ProviderV2, LanguageModelV2, EmbeddingModelV2, ImageModelV2, TranscriptionModelV2, SpeechModelV2 } from '@ai-sdk/provider';
3
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
4
3
  import { z } from 'zod';
4
+ import { OpenAIProviderSettings } from '@ai-sdk/openai';
5
5
 
6
6
  declare const WebSearchPreviewParameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
7
7
  declare function webSearchPreviewTool({ searchContextSize, userLocation, }?: {
@@ -14,30 +14,32 @@ declare function webSearchPreviewTool({ searchContextSize, userLocation, }?: {
14
14
  timezone?: string;
15
15
  };
16
16
  }): {
17
- type: 'provider-defined';
18
- id: 'openai.web_search_preview';
19
- args: {};
20
- parameters: typeof WebSearchPreviewParameters;
17
+ type: 'function';
18
+ function: {
19
+ name: string;
20
+ description: string;
21
+ parameters: typeof WebSearchPreviewParameters;
22
+ };
21
23
  };
22
- declare const openaiTools: {
24
+ declare const aihubmixTools: {
23
25
  webSearchPreview: typeof webSearchPreviewTool;
24
26
  };
25
27
 
26
- interface AihubmixProvider extends ProviderV1 {
27
- (deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;
28
- languageModel(deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;
29
- chat(deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;
30
- responses(deploymentId: string): LanguageModelV1;
31
- completion(deploymentId: string, settings?: OpenAICompletionSettings): LanguageModelV1;
32
- embedding(deploymentId: string, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
33
- image(deploymentId: string, settings?: OpenAIImageSettings): ImageModelV1;
34
- imageModel(deploymentId: string, settings?: OpenAIImageSettings): ImageModelV1;
35
- textEmbedding(deploymentId: string, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
36
- textEmbeddingModel(deploymentId: string, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
37
- transcription(deploymentId: string): TranscriptionModelV1;
38
- speech(deploymentId: string): SpeechModelV1;
39
- speechModel(deploymentId: string): SpeechModelV1;
40
- tools: typeof openaiTools;
28
+ interface AihubmixProvider extends ProviderV2 {
29
+ (deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
30
+ languageModel(deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
31
+ chat(deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
32
+ responses(deploymentId: string): LanguageModelV2;
33
+ completion(deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;
34
+ embedding(deploymentId: string, settings?: OpenAIProviderSettings): EmbeddingModelV2<string>;
35
+ image(deploymentId: string, settings?: OpenAIProviderSettings): ImageModelV2;
36
+ imageModel(deploymentId: string, settings?: OpenAIProviderSettings): ImageModelV2;
37
+ textEmbedding(deploymentId: string, settings?: OpenAIProviderSettings): EmbeddingModelV2<string>;
38
+ textEmbeddingModel(deploymentId: string, settings?: OpenAIProviderSettings): EmbeddingModelV2<string>;
39
+ transcription(deploymentId: string): TranscriptionModelV2;
40
+ speech(deploymentId: string): SpeechModelV2;
41
+ speechModel(deploymentId: string): SpeechModelV2;
42
+ tools: typeof aihubmixTools;
41
43
  }
42
44
  interface AihubmixProviderSettings {
43
45
  apiKey?: string;
package/dist/index.js CHANGED
@@ -39,16 +39,15 @@ function webSearchPreviewTool({
39
39
  userLocation
40
40
  } = {}) {
41
41
  return {
42
- type: "provider-defined",
43
- id: "openai.web_search_preview",
44
- args: {
45
- searchContextSize,
46
- userLocation
47
- },
48
- parameters: WebSearchPreviewParameters
42
+ type: "function",
43
+ function: {
44
+ name: "aihubmix.web_search_preview",
45
+ description: "Search the web for current information and preview results",
46
+ parameters: WebSearchPreviewParameters
47
+ }
49
48
  };
50
49
  }
51
- var openaiTools = {
50
+ var aihubmixTools = {
52
51
  webSearchPreview: webSearchPreviewTool
53
52
  };
54
53
 
@@ -70,38 +69,42 @@ var AihubmixTranscriptionModel = class extends import_internal.OpenAITranscripti
70
69
  };
71
70
  const extension = mimeTypeMap[options.mediaType];
72
71
  if (extension) {
73
- const modifiedOptions = {
74
- ...options,
75
- mediaType: options.mediaType
76
- };
77
72
  const originalGetArgs = this.getArgs;
78
- this.getArgs = function(args) {
79
- const result = originalGetArgs.call(this, args);
73
+ this.getArgs = async function(args) {
74
+ const result = await originalGetArgs.call(this, args);
80
75
  if (result.formData) {
81
76
  const fileEntry = result.formData.get("file");
82
77
  if (fileEntry && typeof fileEntry === "object" && "name" in fileEntry) {
83
78
  try {
84
- const newFile = new globalThis.File([fileEntry], `audio.${extension}`, {
79
+ const newFile = new File([fileEntry], `audio.${extension}`, {
85
80
  type: options.mediaType
86
81
  });
87
82
  result.formData.set("file", newFile);
88
83
  } catch (error) {
89
- if (fileEntry && typeof fileEntry === "object") {
90
- fileEntry.name = `audio.${extension}`;
84
+ console.log("Failed to create new File object:", error);
85
+ if (fileEntry && typeof fileEntry === "object" && "arrayBuffer" in fileEntry) {
86
+ try {
87
+ const arrayBuffer = await fileEntry.arrayBuffer();
88
+ const newFile = new File([arrayBuffer], `audio.${extension}`, {
89
+ type: options.mediaType
90
+ });
91
+ result.formData.set("file", newFile);
92
+ console.log("Created new file from arrayBuffer with name:", `audio.${extension}`);
93
+ } catch (bufferError) {
94
+ console.log("Failed to create file from arrayBuffer:", bufferError);
95
+ }
91
96
  }
92
97
  }
93
98
  }
94
99
  }
95
100
  return result;
96
101
  };
97
- return super.doGenerate(modifiedOptions);
98
102
  }
99
103
  }
100
104
  return super.doGenerate(options);
101
105
  }
102
106
  };
103
107
  function createAihubmix(options = {}) {
104
- const compatibility = options.compatibility ?? "compatible";
105
108
  const getHeaders = () => ({
106
109
  Authorization: `Bearer ${(0, import_provider_utils.loadApiKey)({
107
110
  apiKey: options.apiKey,
@@ -126,24 +129,21 @@ function createAihubmix(options = {}) {
126
129
  const createChatModel = (deploymentName, settings = {}) => {
127
130
  const headers = getHeaders();
128
131
  if (deploymentName.startsWith("claude-")) {
129
- return new import_internal2.AnthropicMessagesLanguageModel(
130
- deploymentName,
131
- settings,
132
- {
133
- provider: "aihubmix.chat",
134
- baseURL: url({ path: "", modelId: deploymentName }),
135
- headers: {
136
- ...headers,
137
- "x-api-key": headers["Authorization"].split(" ")[1]
138
- },
139
- supportsImageUrls: true
140
- }
141
- );
132
+ return new import_internal2.AnthropicMessagesLanguageModel(deploymentName, {
133
+ provider: "aihubmix.chat",
134
+ baseURL: url({ path: "", modelId: deploymentName }),
135
+ headers: {
136
+ ...headers,
137
+ "x-api-key": headers["Authorization"].split(" ")[1]
138
+ },
139
+ supportedUrls: () => ({
140
+ "image/*": [/^https?:\/\/.*$/]
141
+ })
142
+ });
142
143
  }
143
144
  if ((deploymentName.startsWith("gemini") || deploymentName.startsWith("imagen")) && !deploymentName.endsWith("-nothink") && !deploymentName.endsWith("-search")) {
144
145
  return new import_internal3.GoogleGenerativeAILanguageModel(
145
146
  deploymentName,
146
- settings,
147
147
  {
148
148
  provider: "aihubmix.chat",
149
149
  baseURL: "https://aihubmix.com/gemini/v1beta",
@@ -152,27 +152,25 @@ function createAihubmix(options = {}) {
152
152
  "x-goog-api-key": headers["Authorization"].split(" ")[1]
153
153
  },
154
154
  generateId: () => `aihubmix-${Date.now()}`,
155
- isSupportedUrl: () => true
155
+ supportedUrls: () => ({})
156
156
  }
157
157
  );
158
158
  }
159
- return new import_internal.OpenAIChatLanguageModel(deploymentName, settings, {
159
+ return new import_internal.OpenAIChatLanguageModel(deploymentName, {
160
160
  provider: "aihubmix.chat",
161
161
  url,
162
162
  headers: getHeaders,
163
- compatibility,
164
163
  fetch: options.fetch
165
164
  });
166
165
  };
167
- const createCompletionModel = (modelId, settings = {}) => new import_internal.OpenAICompletionLanguageModel(modelId, settings, {
166
+ const createCompletionModel = (modelId, settings = {}) => new import_internal.OpenAICompletionLanguageModel(modelId, {
168
167
  provider: "aihubmix.completion",
169
168
  url,
170
- compatibility,
171
169
  headers: getHeaders,
172
170
  fetch: options.fetch
173
171
  });
174
172
  const createEmbeddingModel = (modelId, settings = {}) => {
175
- return new import_internal.OpenAIEmbeddingModel(modelId, settings, {
173
+ return new import_internal.OpenAIEmbeddingModel(modelId, {
176
174
  provider: "aihubmix.embeddings",
177
175
  headers: getHeaders,
178
176
  url,
@@ -185,7 +183,7 @@ function createAihubmix(options = {}) {
185
183
  headers: getHeaders
186
184
  });
187
185
  const createImageModel = (modelId, settings = {}) => {
188
- return new import_internal.OpenAIImageModel(modelId, settings, {
186
+ return new import_internal.OpenAIImageModel(modelId, {
189
187
  provider: "aihubmix.image",
190
188
  url,
191
189
  headers: getHeaders,
@@ -225,7 +223,7 @@ function createAihubmix(options = {}) {
225
223
  provider.transcriptionModel = createTranscriptionModel;
226
224
  provider.speech = createSpeechModel;
227
225
  provider.speechModel = createSpeechModel;
228
- provider.tools = openaiTools;
226
+ provider.tools = aihubmixTools;
229
227
  return provider;
230
228
  }
231
229
  var aihubmix = createAihubmix();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/aihubmix-provider.ts","../src/aihubmix-tools.ts"],"sourcesContent":["export { aihubmix, createAihubmix } from './aihubmix-provider';\nexport type {\n AihubmixProvider,\n AihubmixProviderSettings,\n} from './aihubmix-provider';\n","import {\n OpenAIChatLanguageModel,\n OpenAIChatSettings,\n OpenAICompletionLanguageModel,\n OpenAICompletionSettings,\n OpenAIEmbeddingModel,\n OpenAIEmbeddingSettings,\n OpenAIImageModel,\n OpenAIImageSettings,\n OpenAIResponsesLanguageModel,\n OpenAITranscriptionModel,\n OpenAISpeechModel,\n} from '@ai-sdk/openai/internal';\nimport {\n AnthropicMessagesLanguageModel,\n AnthropicMessagesSettings,\n} from '@ai-sdk/anthropic/internal';\nimport {\n InternalGoogleGenerativeAISettings,\n GoogleGenerativeAILanguageModel,\n} from '@ai-sdk/google/internal';\nimport {\n EmbeddingModelV1,\n LanguageModelV1,\n ProviderV1,\n ImageModelV1,\n TranscriptionModelV1,\n SpeechModelV1,\n TranscriptionModelV1CallOptions,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey } from '@ai-sdk/provider-utils';\nimport { openaiTools } from './aihubmix-tools';\n\nexport interface AihubmixProvider extends ProviderV1 {\n (deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;\n\n languageModel(\n deploymentId: string,\n settings?: OpenAIChatSettings,\n ): LanguageModelV1;\n\n chat(deploymentId: string, settings?: OpenAIChatSettings): LanguageModelV1;\n\n responses(deploymentId: string): LanguageModelV1;\n\n completion(\n deploymentId: string,\n settings?: OpenAICompletionSettings,\n ): LanguageModelV1;\n\n embedding(\n deploymentId: string,\n settings?: OpenAIEmbeddingSettings,\n ): EmbeddingModelV1<string>;\n\n image(deploymentId: string, settings?: OpenAIImageSettings): ImageModelV1;\n\n imageModel(\n deploymentId: string,\n settings?: OpenAIImageSettings,\n ): ImageModelV1;\n\n textEmbedding(\n deploymentId: string,\n settings?: OpenAIEmbeddingSettings,\n ): EmbeddingModelV1<string>;\n\n textEmbeddingModel(\n deploymentId: string,\n settings?: OpenAIEmbeddingSettings,\n ): EmbeddingModelV1<string>;\n\n transcription(deploymentId: string): TranscriptionModelV1;\n\n speech(deploymentId: string): SpeechModelV1;\n\n speechModel(deploymentId: string): SpeechModelV1;\n\n tools: typeof openaiTools;\n}\n\nclass AihubmixTranscriptionModel extends OpenAITranscriptionModel {\n async doGenerate(options: TranscriptionModelV1CallOptions) {\n // 根据MIME类型设置正确的文件扩展名\n if (options.mediaType) {\n const mimeTypeMap: Record<string, string> = {\n 'audio/mpeg': 'mp3',\n 'audio/mp3': 'mp3',\n 'audio/wav': 'wav',\n 'audio/flac': 'flac',\n 'audio/m4a': 'm4a',\n 'audio/mp4': 'mp4',\n 'audio/ogg': 'ogg',\n 'audio/webm': 'webm',\n 'audio/oga': 'oga',\n 'audio/mpga': 'mpga',\n };\n \n const extension = mimeTypeMap[options.mediaType];\n if (extension) {\n // 修改options,确保文件名有正确的扩展名\n const modifiedOptions = {\n ...options,\n mediaType: options.mediaType,\n };\n \n // 重写getArgs方法来设置正确的文件名\n const originalGetArgs = (this as any).getArgs;\n (this as any).getArgs = function(args: any) {\n const result = originalGetArgs.call(this, args);\n if (result.formData) {\n // 找到file字段并修改文件名\n const fileEntry = result.formData.get('file');\n if (fileEntry && typeof fileEntry === 'object' && 'name' in fileEntry) {\n // 在 Node.js 环境中,我们可能需要创建一个新的文件对象\n // 或者直接修改现有的对象\n try {\n const newFile = new (globalThis as any).File([fileEntry], `audio.${extension}`, { \n type: options.mediaType \n });\n result.formData.set('file', newFile);\n } catch (error) {\n // 如果 File 构造函数不可用,尝试修改现有对象的名称\n if (fileEntry && typeof fileEntry === 'object') {\n (fileEntry as any).name = `audio.${extension}`;\n }\n }\n }\n }\n return result;\n };\n \n return super.doGenerate(modifiedOptions);\n }\n }\n \n return super.doGenerate(options);\n }\n}\n\nexport interface AihubmixProviderSettings {\n apiKey?: string;\n fetch?: FetchFunction;\n compatibility?: 'strict' | 'compatible';\n}\n\nexport function createAihubmix(\n options: AihubmixProviderSettings = {},\n): AihubmixProvider {\n const compatibility = options.compatibility ?? 'compatible';\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AIHUBMIX_API_KEY',\n description: 'Aihubmix',\n })}`,\n 'APP-Code': 'WHVL9885',\n 'Content-Type': 'application/json',\n });\n\n const getTranscriptionHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AIHUBMIX_API_KEY',\n description: 'Aihubmix',\n })}`,\n 'APP-Code': 'WHVL9885',\n });\n\n const url = ({ path, modelId }: { path: string; modelId: string }) => {\n const baseURL = 'https://aihubmix.com/v1';\n return `${baseURL}${path}`;\n };\n\n const createChatModel = (\n deploymentName: string,\n settings: OpenAIChatSettings = {},\n ) => {\n const headers = getHeaders();\n if (deploymentName.startsWith('claude-')) {\n return new AnthropicMessagesLanguageModel(\n deploymentName,\n settings as AnthropicMessagesSettings,\n {\n provider: 'aihubmix.chat',\n baseURL: url({ path: '', modelId: deploymentName }),\n headers: {\n ...headers,\n 'x-api-key': headers['Authorization'].split(' ')[1],\n },\n supportsImageUrls: true,\n },\n );\n }\n if (\n (deploymentName.startsWith('gemini') ||\n deploymentName.startsWith('imagen')) &&\n !deploymentName.endsWith('-nothink') &&\n !deploymentName.endsWith('-search')\n ) {\n return new GoogleGenerativeAILanguageModel(\n deploymentName,\n settings as InternalGoogleGenerativeAISettings,\n {\n provider: 'aihubmix.chat',\n baseURL: 'https://aihubmix.com/gemini/v1beta',\n headers: {\n ...headers,\n 'x-goog-api-key': headers['Authorization'].split(' ')[1],\n },\n generateId: () => `aihubmix-${Date.now()}`,\n isSupportedUrl: () => true,\n },\n );\n }\n\n return new OpenAIChatLanguageModel(deploymentName, settings, {\n provider: 'aihubmix.chat',\n url,\n headers: getHeaders,\n compatibility,\n fetch: options.fetch,\n });\n };\n\n const createCompletionModel = (\n modelId: string,\n settings: OpenAICompletionSettings = {},\n ) =>\n new OpenAICompletionLanguageModel(modelId, settings, {\n provider: 'aihubmix.completion',\n url,\n compatibility,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createEmbeddingModel = (\n modelId: string,\n settings: OpenAIEmbeddingSettings = {},\n ) => {\n return new OpenAIEmbeddingModel(modelId, settings, {\n provider: 'aihubmix.embeddings',\n headers: getHeaders,\n url,\n fetch: options.fetch,\n });\n };\n\n const createResponsesModel = (modelId: string) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'aihubmix.responses',\n url,\n headers: getHeaders,\n });\n\n const createImageModel = (\n modelId: string,\n settings: OpenAIImageSettings = {},\n ) => {\n return new OpenAIImageModel(modelId, settings, {\n provider: 'aihubmix.image',\n url,\n headers: getHeaders,\n fetch: options.fetch,\n });\n };\n\n const createTranscriptionModel = (modelId: string) =>\n new AihubmixTranscriptionModel(modelId, {\n provider: 'aihubmix.transcription',\n url,\n headers: getTranscriptionHeaders,\n fetch: options.fetch,\n });\n const createSpeechModel = (modelId: string) =>\n new OpenAISpeechModel(modelId, {\n provider: 'aihubmix.speech',\n url,\n headers: getHeaders,\n fetch: options.fetch,\n });\n const provider = function (\n deploymentId: string,\n settings?: OpenAIChatSettings | OpenAICompletionSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Aihubmix model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(deploymentId, settings as OpenAIChatSettings);\n };\n\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.completion = createCompletionModel;\n provider.responses = createResponsesModel;\n provider.embedding = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n\n provider.tools = openaiTools;\n\n return provider as AihubmixProvider;\n}\n\nexport const aihubmix = createAihubmix();\n","import { z } from 'zod';\n\nconst WebSearchPreviewParameters = z.object({});\n\nfunction webSearchPreviewTool({\n searchContextSize,\n userLocation,\n}: {\n searchContextSize?: 'low' | 'medium' | 'high';\n userLocation?: {\n type?: 'approximate';\n city?: string;\n region?: string;\n country?: string;\n timezone?: string;\n };\n} = {}): {\n type: 'provider-defined';\n id: 'openai.web_search_preview';\n args: {};\n parameters: typeof WebSearchPreviewParameters;\n} {\n return {\n type: 'provider-defined',\n id: 'openai.web_search_preview',\n args: {\n searchContextSize,\n userLocation,\n },\n parameters: WebSearchPreviewParameters,\n };\n}\n\nexport const openaiTools = {\n webSearchPreview: webSearchPreviewTool,\n};\n"],"mappings":"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","names":["import_internal"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/aihubmix-provider.ts","../src/aihubmix-tools.ts"],"sourcesContent":["export { aihubmix, createAihubmix } from './aihubmix-provider';\nexport type {\n AihubmixProvider,\n AihubmixProviderSettings,\n} from './aihubmix-provider';\n","import {\n OpenAIChatLanguageModel,\n OpenAICompletionLanguageModel,\n OpenAIEmbeddingModel,\n OpenAIImageModel,\n OpenAIResponsesLanguageModel,\n OpenAITranscriptionModel,\n OpenAISpeechModel,\n} from '@ai-sdk/openai/internal';\nimport { AnthropicMessagesLanguageModel } from '@ai-sdk/anthropic/internal';\nimport { GoogleGenerativeAILanguageModel } from '@ai-sdk/google/internal';\nimport {\n EmbeddingModelV2,\n LanguageModelV2,\n ProviderV2,\n ImageModelV2,\n TranscriptionModelV2,\n SpeechModelV2,\n TranscriptionModelV2CallOptions,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey } from '@ai-sdk/provider-utils';\nimport { aihubmixTools } from './aihubmix-tools';\n\n// 导入设置类型\nimport type { OpenAIProviderSettings } from '@ai-sdk/openai';\n\n\nexport interface AihubmixProvider extends ProviderV2 {\n (deploymentId: string, settings?: OpenAIProviderSettings): LanguageModelV2;\n\n languageModel(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): LanguageModelV2;\n\n chat(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): LanguageModelV2;\n\n responses(deploymentId: string): LanguageModelV2;\n\n completion(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): LanguageModelV2;\n\n embedding(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): EmbeddingModelV2<string>;\n\n image(deploymentId: string, settings?: OpenAIProviderSettings): ImageModelV2;\n\n imageModel(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): ImageModelV2;\n\n textEmbedding(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): EmbeddingModelV2<string>;\n\n textEmbeddingModel(\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ): EmbeddingModelV2<string>;\n\n transcription(deploymentId: string): TranscriptionModelV2;\n\n speech(deploymentId: string): SpeechModelV2;\n\n speechModel(deploymentId: string): SpeechModelV2;\n\n tools: typeof aihubmixTools;\n}\n\nexport interface AihubmixProviderSettings {\n apiKey?: string;\n fetch?: FetchFunction;\n compatibility?: 'strict' | 'compatible';\n}\n\nclass AihubmixTranscriptionModel extends OpenAITranscriptionModel {\n async doGenerate(options: TranscriptionModelV2CallOptions) {\n // 根据MIME类型设置正确的文件扩展名\n if (options.mediaType) {\n const mimeTypeMap: Record<string, string> = {\n 'audio/mpeg': 'mp3',\n 'audio/mp3': 'mp3',\n 'audio/wav': 'wav',\n 'audio/flac': 'flac',\n 'audio/m4a': 'm4a',\n 'audio/mp4': 'mp4',\n 'audio/ogg': 'ogg',\n 'audio/webm': 'webm',\n 'audio/oga': 'oga',\n 'audio/mpga': 'mpga',\n };\n \n const extension = mimeTypeMap[options.mediaType];\n if (extension) {\n // 重写getArgs方法来设置正确的文件名\n const originalGetArgs = (this as any).getArgs;\n (this as any).getArgs = async function(args: any) {\n const result = await originalGetArgs.call(this, args);\n if (result.formData) {\n // 找到file字段并修改文件名\n const fileEntry = result.formData.get('file');\n if (fileEntry && typeof fileEntry === 'object' && 'name' in fileEntry) {\n // 创建新的 File 对象,设置正确的文件名\n try {\n const newFile = new File([fileEntry], `audio.${extension}`, { \n type: options.mediaType \n });\n result.formData.set('file', newFile);\n } catch (error) {\n console.log('Failed to create new File object:', error);\n // 如果创建新 File 对象失败,尝试其他方法\n // 在 Node.js 环境中,可能需要使用 Buffer 或其他方式\n if (fileEntry && typeof fileEntry === 'object' && 'arrayBuffer' in fileEntry) {\n try {\n const arrayBuffer = await (fileEntry as any).arrayBuffer();\n const newFile = new File([arrayBuffer], `audio.${extension}`, { \n type: options.mediaType \n });\n result.formData.set('file', newFile);\n console.log('Created new file from arrayBuffer with name:', `audio.${extension}`);\n } catch (bufferError) {\n console.log('Failed to create file from arrayBuffer:', bufferError);\n }\n }\n }\n }\n }\n return result;\n };\n }\n }\n \n return super.doGenerate(options);\n }\n}\n\nexport function createAihubmix(\n options: AihubmixProviderSettings = {},\n): AihubmixProvider {\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AIHUBMIX_API_KEY',\n description: 'Aihubmix',\n })}`,\n 'APP-Code': 'WHVL9885',\n 'Content-Type': 'application/json',\n });\n\n const getTranscriptionHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AIHUBMIX_API_KEY',\n description: 'Aihubmix',\n })}`,\n 'APP-Code': 'WHVL9885',\n });\n\n const url = ({ path, modelId }: { path: string; modelId: string }) => {\n const baseURL = 'https://aihubmix.com/v1';\n return `${baseURL}${path}`;\n };\n\n const createChatModel = (\n deploymentName: string,\n settings: OpenAIProviderSettings = {},\n ) => {\n const headers = getHeaders();\n if (deploymentName.startsWith('claude-')) {\n return new AnthropicMessagesLanguageModel(deploymentName, {\n provider: 'aihubmix.chat',\n baseURL: url({ path: '', modelId: deploymentName }),\n headers: {\n ...headers,\n 'x-api-key': headers['Authorization'].split(' ')[1],\n },\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\/.*$/],\n }),\n });\n }\n if (\n (deploymentName.startsWith('gemini') ||\n deploymentName.startsWith('imagen')) &&\n !deploymentName.endsWith('-nothink') &&\n !deploymentName.endsWith('-search')\n ) {\n return new GoogleGenerativeAILanguageModel(\n deploymentName,\n {\n provider: 'aihubmix.chat',\n baseURL: 'https://aihubmix.com/gemini/v1beta',\n headers: {\n ...headers,\n 'x-goog-api-key': headers['Authorization'].split(' ')[1],\n },\n generateId: () => `aihubmix-${Date.now()}`,\n supportedUrls: () => ({}),\n },\n );\n }\n\n return new OpenAIChatLanguageModel(deploymentName, {\n provider: 'aihubmix.chat',\n url,\n headers: getHeaders,\n fetch: options.fetch,\n });\n };\n\n const createCompletionModel = (\n modelId: string,\n settings: any = {},\n ) =>\n new OpenAICompletionLanguageModel(modelId, {\n provider: 'aihubmix.completion',\n url,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createEmbeddingModel = (\n modelId: string,\n settings: any = {},\n ) => {\n return new OpenAIEmbeddingModel(modelId, {\n provider: 'aihubmix.embeddings',\n headers: getHeaders,\n url,\n fetch: options.fetch,\n });\n };\n\n const createResponsesModel = (modelId: string) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'aihubmix.responses',\n url,\n headers: getHeaders,\n });\n\n const createImageModel = (\n modelId: string,\n settings: any = {},\n ) => {\n return new OpenAIImageModel(modelId, {\n provider: 'aihubmix.image',\n url,\n headers: getHeaders,\n fetch: options.fetch,\n });\n };\n\n const createTranscriptionModel = (modelId: string) =>\n new AihubmixTranscriptionModel(modelId, {\n provider: 'aihubmix.transcription',\n url,\n headers: getTranscriptionHeaders,\n fetch: options.fetch,\n });\n const createSpeechModel = (modelId: string) =>\n new OpenAISpeechModel(modelId, {\n provider: 'aihubmix.speech',\n url,\n headers: getHeaders,\n fetch: options.fetch,\n });\n const provider = function (\n deploymentId: string,\n settings?: OpenAIProviderSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Aihubmix model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(deploymentId, settings);\n };\n\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.completion = createCompletionModel;\n provider.responses = createResponsesModel;\n provider.embedding = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n\n provider.tools = aihubmixTools;\n\n return provider as AihubmixProvider;\n}\n\nexport const aihubmix = createAihubmix();\n","import { z } from 'zod';\n\nconst WebSearchPreviewParameters = z.object({});\n\nfunction webSearchPreviewTool({\n searchContextSize,\n userLocation,\n}: {\n searchContextSize?: 'low' | 'medium' | 'high';\n userLocation?: {\n type?: 'approximate';\n city?: string;\n region?: string;\n country?: string;\n timezone?: string;\n };\n} = {}): {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: typeof WebSearchPreviewParameters;\n };\n} {\n return {\n type: 'function',\n function: {\n name: 'aihubmix.web_search_preview',\n description: 'Search the web for current information and preview results',\n parameters: WebSearchPreviewParameters,\n },\n };\n}\n\nexport const aihubmixTools = {\n webSearchPreview: webSearchPreviewTool,\n};\n"],"mappings":"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","names":["import_internal"]}