@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/CHANGELOG.md +7 -0
- package/README.ja.md +301 -0
- package/README.md +170 -29
- package/README.zh.md +301 -0
- package/dist/index.d.mts +24 -22
- package/dist/index.d.ts +24 -22
- package/dist/index.js +39 -41
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -47
- package/dist/index.mjs.map +1 -1
- package/package.json +20 -20
- package/LICENSE +0 -201
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 {
|
|
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: '
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
type: 'function';
|
|
18
|
+
function: {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
parameters: typeof WebSearchPreviewParameters;
|
|
22
|
+
};
|
|
21
23
|
};
|
|
22
|
-
declare const
|
|
24
|
+
declare const aihubmixTools: {
|
|
23
25
|
webSearchPreview: typeof webSearchPreviewTool;
|
|
24
26
|
};
|
|
25
27
|
|
|
26
|
-
interface AihubmixProvider extends
|
|
27
|
-
(deploymentId: string, settings?:
|
|
28
|
-
languageModel(deploymentId: string, settings?:
|
|
29
|
-
chat(deploymentId: string, settings?:
|
|
30
|
-
responses(deploymentId: string):
|
|
31
|
-
completion(deploymentId: string, settings?:
|
|
32
|
-
embedding(deploymentId: string, settings?:
|
|
33
|
-
image(deploymentId: string, settings?:
|
|
34
|
-
imageModel(deploymentId: string, settings?:
|
|
35
|
-
textEmbedding(deploymentId: string, settings?:
|
|
36
|
-
textEmbeddingModel(deploymentId: string, settings?:
|
|
37
|
-
transcription(deploymentId: string):
|
|
38
|
-
speech(deploymentId: string):
|
|
39
|
-
speechModel(deploymentId: string):
|
|
40
|
-
tools: typeof
|
|
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 {
|
|
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: '
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
type: 'function';
|
|
18
|
+
function: {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
parameters: typeof WebSearchPreviewParameters;
|
|
22
|
+
};
|
|
21
23
|
};
|
|
22
|
-
declare const
|
|
24
|
+
declare const aihubmixTools: {
|
|
23
25
|
webSearchPreview: typeof webSearchPreviewTool;
|
|
24
26
|
};
|
|
25
27
|
|
|
26
|
-
interface AihubmixProvider extends
|
|
27
|
-
(deploymentId: string, settings?:
|
|
28
|
-
languageModel(deploymentId: string, settings?:
|
|
29
|
-
chat(deploymentId: string, settings?:
|
|
30
|
-
responses(deploymentId: string):
|
|
31
|
-
completion(deploymentId: string, settings?:
|
|
32
|
-
embedding(deploymentId: string, settings?:
|
|
33
|
-
image(deploymentId: string, settings?:
|
|
34
|
-
imageModel(deploymentId: string, settings?:
|
|
35
|
-
textEmbedding(deploymentId: string, settings?:
|
|
36
|
-
textEmbeddingModel(deploymentId: string, settings?:
|
|
37
|
-
transcription(deploymentId: string):
|
|
38
|
-
speech(deploymentId: string):
|
|
39
|
-
speechModel(deploymentId: string):
|
|
40
|
-
tools: typeof
|
|
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: "
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
90
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
{
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
155
|
+
supportedUrls: () => ({})
|
|
156
156
|
}
|
|
157
157
|
);
|
|
158
158
|
}
|
|
159
|
-
return new import_internal.OpenAIChatLanguageModel(deploymentName,
|
|
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,
|
|
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,
|
|
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,
|
|
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 =
|
|
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"]}
|