@apertis/ai-sdk-provider 0.1.0 → 1.0.0
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.md +26 -1
- package/dist/index.cjs +124 -49
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +124 -49
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Apertis AI provider for the [Vercel AI SDK](https://sdk.vercel.ai/).
|
|
4
4
|
|
|
5
|
+
## Compatibility
|
|
6
|
+
|
|
7
|
+
- **Requires AI SDK 6.0+** - This package implements the `LanguageModelV3` specification
|
|
8
|
+
- **Node.js 18+** - Minimum supported Node.js version
|
|
9
|
+
|
|
5
10
|
## Installation
|
|
6
11
|
|
|
7
12
|
```bash
|
|
8
|
-
npm install @apertis/ai-sdk-provider
|
|
13
|
+
npm install @apertis/ai-sdk-provider ai
|
|
9
14
|
```
|
|
10
15
|
|
|
11
16
|
## Setup
|
|
@@ -83,6 +88,26 @@ Any model available on Apertis AI, including:
|
|
|
83
88
|
- `gemini-3-pro-preview`, `gemini-3-flash-preview`, `gemini-2.5-flash-preview`
|
|
84
89
|
- And 470+ more models
|
|
85
90
|
|
|
91
|
+
## Provider Configuration
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { createApertis } from '@apertis/ai-sdk-provider';
|
|
95
|
+
|
|
96
|
+
const apertis = createApertis({
|
|
97
|
+
apiKey: 'sk-your-api-key', // Optional if APERTIS_API_KEY is set
|
|
98
|
+
baseURL: 'https://api.apertis.ai/v1', // Custom API endpoint
|
|
99
|
+
headers: { 'X-Custom': 'value' }, // Custom headers
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Breaking Changes (v1.0.0)
|
|
104
|
+
|
|
105
|
+
- **Requires AI SDK 6+** - No longer compatible with AI SDK 5.x
|
|
106
|
+
- **V3 Specification** - Implements `LanguageModelV3` interface
|
|
107
|
+
- **Content format** - Output uses `content` array instead of separate `text`/`toolCalls`
|
|
108
|
+
- **Usage format** - Token tracking uses new `inputTokens`/`outputTokens` structure
|
|
109
|
+
- **Supported URLs** - New `supportedUrls` property for image URL support
|
|
110
|
+
|
|
86
111
|
## License
|
|
87
112
|
|
|
88
113
|
Apache-2.0
|
package/dist/index.cjs
CHANGED
|
@@ -115,17 +115,18 @@ var openAIChatChunkSchema = import_zod2.z.object({
|
|
|
115
115
|
|
|
116
116
|
// src/utils/map-finish-reason.ts
|
|
117
117
|
function mapApertisFinishReason(finishReason) {
|
|
118
|
+
const raw = finishReason ?? void 0;
|
|
118
119
|
switch (finishReason) {
|
|
119
120
|
case "stop":
|
|
120
|
-
return "stop";
|
|
121
|
+
return { unified: "stop", raw };
|
|
121
122
|
case "length":
|
|
122
|
-
return "length";
|
|
123
|
+
return { unified: "length", raw };
|
|
123
124
|
case "tool_calls":
|
|
124
|
-
return "tool-calls";
|
|
125
|
+
return { unified: "tool-calls", raw };
|
|
125
126
|
case "content_filter":
|
|
126
|
-
return "content-filter";
|
|
127
|
+
return { unified: "content-filter", raw };
|
|
127
128
|
default:
|
|
128
|
-
return "
|
|
129
|
+
return { unified: "other", raw };
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
132
|
|
|
@@ -144,13 +145,29 @@ function convertToOpenAIMessages(prompt) {
|
|
|
144
145
|
switch (part.type) {
|
|
145
146
|
case "text":
|
|
146
147
|
return { type: "text", text: part.text };
|
|
147
|
-
case "
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
url
|
|
148
|
+
case "file": {
|
|
149
|
+
if (part.mediaType?.startsWith("image/")) {
|
|
150
|
+
let url;
|
|
151
|
+
if (part.data instanceof URL) {
|
|
152
|
+
url = part.data.toString();
|
|
153
|
+
} else if (typeof part.data === "string") {
|
|
154
|
+
if (part.data.startsWith("http://") || part.data.startsWith("https://")) {
|
|
155
|
+
url = part.data;
|
|
156
|
+
} else {
|
|
157
|
+
url = `data:${part.mediaType};base64,${part.data}`;
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
url = `data:${part.mediaType};base64,${Buffer.from(part.data).toString("base64")}`;
|
|
152
161
|
}
|
|
153
|
-
|
|
162
|
+
return {
|
|
163
|
+
type: "image_url",
|
|
164
|
+
image_url: { url }
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
throw new Error(
|
|
168
|
+
`Unsupported file type: ${part.mediaType}. Only image/* is supported.`
|
|
169
|
+
);
|
|
170
|
+
}
|
|
154
171
|
default:
|
|
155
172
|
throw new Error(
|
|
156
173
|
`Unsupported user content part type: ${part.type}`
|
|
@@ -161,12 +178,10 @@ function convertToOpenAIMessages(prompt) {
|
|
|
161
178
|
break;
|
|
162
179
|
case "assistant": {
|
|
163
180
|
const textContent = message.content.filter((p) => p.type === "text").map((p) => p.text).join("");
|
|
164
|
-
const toolCalls = message.content.filter(
|
|
165
|
-
(p) => p.type === "tool-call"
|
|
166
|
-
).map((tc) => {
|
|
181
|
+
const toolCalls = message.content.filter((p) => p.type === "tool-call").map((tc) => {
|
|
167
182
|
let arguments_str = "{}";
|
|
168
183
|
try {
|
|
169
|
-
arguments_str = JSON.stringify(tc.
|
|
184
|
+
arguments_str = typeof tc.input === "string" ? tc.input : JSON.stringify(tc.input);
|
|
170
185
|
} catch {
|
|
171
186
|
arguments_str = "{}";
|
|
172
187
|
}
|
|
@@ -185,12 +200,17 @@ function convertToOpenAIMessages(prompt) {
|
|
|
185
200
|
}
|
|
186
201
|
case "tool":
|
|
187
202
|
for (const result of message.content) {
|
|
203
|
+
if (result.type !== "tool-result") continue;
|
|
188
204
|
let content = "{}";
|
|
189
|
-
|
|
190
|
-
|
|
205
|
+
const output = result.output;
|
|
206
|
+
if (typeof output === "string") {
|
|
207
|
+
content = output;
|
|
208
|
+
} else if (Array.isArray(output)) {
|
|
209
|
+
const textParts = output.filter((p) => p.type === "text").map((p) => p.text);
|
|
210
|
+
content = textParts.join("");
|
|
191
211
|
} else {
|
|
192
212
|
try {
|
|
193
|
-
content = JSON.stringify(
|
|
213
|
+
content = JSON.stringify(output);
|
|
194
214
|
} catch {
|
|
195
215
|
content = "{}";
|
|
196
216
|
}
|
|
@@ -215,7 +235,7 @@ function convertToOpenAITools(tools) {
|
|
|
215
235
|
function: {
|
|
216
236
|
name: tool.name,
|
|
217
237
|
description: tool.description,
|
|
218
|
-
parameters: tool.
|
|
238
|
+
parameters: tool.inputSchema
|
|
219
239
|
}
|
|
220
240
|
}));
|
|
221
241
|
}
|
|
@@ -229,7 +249,11 @@ function convertToOpenAIToolChoice(toolChoice) {
|
|
|
229
249
|
case "required":
|
|
230
250
|
return "required";
|
|
231
251
|
case "tool":
|
|
232
|
-
|
|
252
|
+
if (!toolChoice.toolName) return void 0;
|
|
253
|
+
return {
|
|
254
|
+
type: "function",
|
|
255
|
+
function: { name: toolChoice.toolName }
|
|
256
|
+
};
|
|
233
257
|
default:
|
|
234
258
|
return void 0;
|
|
235
259
|
}
|
|
@@ -242,15 +266,17 @@ var ApertisChatLanguageModel = class {
|
|
|
242
266
|
this.settings = settings;
|
|
243
267
|
this.config = config;
|
|
244
268
|
}
|
|
245
|
-
specificationVersion = "
|
|
246
|
-
|
|
247
|
-
|
|
269
|
+
specificationVersion = "v3";
|
|
270
|
+
/**
|
|
271
|
+
* Supported URL patterns for different media types.
|
|
272
|
+
* Supports HTTP(S) image URLs for direct URL passing.
|
|
273
|
+
*/
|
|
274
|
+
supportedUrls = {
|
|
275
|
+
"image/*": [/^https?:\/\/.+$/]
|
|
276
|
+
};
|
|
248
277
|
get provider() {
|
|
249
278
|
return this.config.provider;
|
|
250
279
|
}
|
|
251
|
-
get supportsStructuredOutputs() {
|
|
252
|
-
return true;
|
|
253
|
-
}
|
|
254
280
|
async doGenerate(options) {
|
|
255
281
|
const body = this.buildRequestBody(options, false);
|
|
256
282
|
const { value: response } = await (0, import_provider_utils2.postJsonToApi)({
|
|
@@ -265,20 +291,41 @@ var ApertisChatLanguageModel = class {
|
|
|
265
291
|
abortSignal: options.abortSignal
|
|
266
292
|
});
|
|
267
293
|
const choice = response.choices[0];
|
|
294
|
+
const content = [];
|
|
295
|
+
if (choice.message.content) {
|
|
296
|
+
content.push({
|
|
297
|
+
type: "text",
|
|
298
|
+
text: choice.message.content
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
if (choice.message.tool_calls) {
|
|
302
|
+
for (const tc of choice.message.tool_calls) {
|
|
303
|
+
content.push({
|
|
304
|
+
type: "tool-call",
|
|
305
|
+
toolCallId: tc.id,
|
|
306
|
+
toolName: tc.function.name,
|
|
307
|
+
input: tc.function.arguments
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
268
311
|
return {
|
|
269
|
-
|
|
270
|
-
toolCalls: choice.message.tool_calls?.map((tc) => ({
|
|
271
|
-
toolCallType: "function",
|
|
272
|
-
toolCallId: tc.id,
|
|
273
|
-
toolName: tc.function.name,
|
|
274
|
-
args: tc.function.arguments
|
|
275
|
-
})),
|
|
312
|
+
content,
|
|
276
313
|
finishReason: mapApertisFinishReason(choice.finish_reason),
|
|
277
314
|
usage: {
|
|
278
|
-
|
|
279
|
-
|
|
315
|
+
inputTokens: {
|
|
316
|
+
total: response.usage?.prompt_tokens ?? 0,
|
|
317
|
+
noCache: void 0,
|
|
318
|
+
cacheRead: void 0,
|
|
319
|
+
cacheWrite: void 0
|
|
320
|
+
},
|
|
321
|
+
outputTokens: {
|
|
322
|
+
total: response.usage?.completion_tokens ?? 0,
|
|
323
|
+
text: void 0,
|
|
324
|
+
reasoning: void 0
|
|
325
|
+
}
|
|
280
326
|
},
|
|
281
|
-
|
|
327
|
+
warnings: [],
|
|
328
|
+
request: { body }
|
|
282
329
|
};
|
|
283
330
|
}
|
|
284
331
|
async doStream(options) {
|
|
@@ -295,6 +342,7 @@ var ApertisChatLanguageModel = class {
|
|
|
295
342
|
abortSignal: options.abortSignal
|
|
296
343
|
});
|
|
297
344
|
const toolCallBuffers = /* @__PURE__ */ new Map();
|
|
345
|
+
let textId = null;
|
|
298
346
|
const transformStream = new TransformStream({
|
|
299
347
|
transform(parseResult, controller) {
|
|
300
348
|
if (!parseResult.success) {
|
|
@@ -304,9 +352,17 @@ var ApertisChatLanguageModel = class {
|
|
|
304
352
|
const choice = chunk.choices[0];
|
|
305
353
|
if (!choice) return;
|
|
306
354
|
if (choice.delta.content) {
|
|
355
|
+
if (!textId) {
|
|
356
|
+
textId = (0, import_provider_utils2.generateId)();
|
|
357
|
+
controller.enqueue({
|
|
358
|
+
type: "text-start",
|
|
359
|
+
id: textId
|
|
360
|
+
});
|
|
361
|
+
}
|
|
307
362
|
controller.enqueue({
|
|
308
363
|
type: "text-delta",
|
|
309
|
-
|
|
364
|
+
id: textId,
|
|
365
|
+
delta: choice.delta.content
|
|
310
366
|
});
|
|
311
367
|
}
|
|
312
368
|
if (choice.delta.tool_calls) {
|
|
@@ -323,14 +379,19 @@ var ApertisChatLanguageModel = class {
|
|
|
323
379
|
}
|
|
324
380
|
}
|
|
325
381
|
if (choice.finish_reason) {
|
|
382
|
+
if (textId) {
|
|
383
|
+
controller.enqueue({
|
|
384
|
+
type: "text-end",
|
|
385
|
+
id: textId
|
|
386
|
+
});
|
|
387
|
+
}
|
|
326
388
|
for (const [, buffer] of toolCallBuffers) {
|
|
327
389
|
if (buffer.name) {
|
|
328
390
|
controller.enqueue({
|
|
329
391
|
type: "tool-call",
|
|
330
|
-
toolCallType: "function",
|
|
331
392
|
toolCallId: buffer.id,
|
|
332
393
|
toolName: buffer.name,
|
|
333
|
-
|
|
394
|
+
input: buffer.arguments
|
|
334
395
|
});
|
|
335
396
|
}
|
|
336
397
|
}
|
|
@@ -339,21 +400,35 @@ var ApertisChatLanguageModel = class {
|
|
|
339
400
|
type: "finish",
|
|
340
401
|
finishReason: mapApertisFinishReason(choice.finish_reason),
|
|
341
402
|
usage: {
|
|
342
|
-
|
|
343
|
-
|
|
403
|
+
inputTokens: {
|
|
404
|
+
total: chunk.usage?.prompt_tokens ?? 0,
|
|
405
|
+
noCache: void 0,
|
|
406
|
+
cacheRead: void 0,
|
|
407
|
+
cacheWrite: void 0
|
|
408
|
+
},
|
|
409
|
+
outputTokens: {
|
|
410
|
+
total: chunk.usage?.completion_tokens ?? 0,
|
|
411
|
+
text: void 0,
|
|
412
|
+
reasoning: void 0
|
|
413
|
+
}
|
|
344
414
|
}
|
|
345
415
|
});
|
|
346
416
|
}
|
|
347
417
|
},
|
|
348
418
|
flush(controller) {
|
|
419
|
+
if (textId) {
|
|
420
|
+
controller.enqueue({
|
|
421
|
+
type: "text-end",
|
|
422
|
+
id: textId
|
|
423
|
+
});
|
|
424
|
+
}
|
|
349
425
|
for (const [, buffer] of toolCallBuffers) {
|
|
350
426
|
if (buffer.name) {
|
|
351
427
|
controller.enqueue({
|
|
352
428
|
type: "tool-call",
|
|
353
|
-
toolCallType: "function",
|
|
354
429
|
toolCallId: buffer.id,
|
|
355
430
|
toolName: buffer.name,
|
|
356
|
-
|
|
431
|
+
input: buffer.arguments
|
|
357
432
|
});
|
|
358
433
|
}
|
|
359
434
|
}
|
|
@@ -361,13 +436,12 @@ var ApertisChatLanguageModel = class {
|
|
|
361
436
|
});
|
|
362
437
|
return {
|
|
363
438
|
stream: response.pipeThrough(transformStream),
|
|
364
|
-
|
|
439
|
+
request: { body }
|
|
365
440
|
};
|
|
366
441
|
}
|
|
367
442
|
buildRequestBody(options, stream) {
|
|
368
|
-
const tools =
|
|
369
|
-
const
|
|
370
|
-
const responseFormat = options.mode.type === "object-json" ? { type: "json_object" } : void 0;
|
|
443
|
+
const tools = this.filterFunctionTools(options.tools);
|
|
444
|
+
const responseFormat = options.responseFormat?.type === "json" ? { type: "json_object" } : void 0;
|
|
371
445
|
const body = {
|
|
372
446
|
model: this.modelId,
|
|
373
447
|
messages: convertToOpenAIMessages(options.prompt),
|
|
@@ -376,7 +450,8 @@ var ApertisChatLanguageModel = class {
|
|
|
376
450
|
if (stream) body.stream_options = { include_usage: true };
|
|
377
451
|
if (options.temperature !== void 0)
|
|
378
452
|
body.temperature = options.temperature;
|
|
379
|
-
if (options.
|
|
453
|
+
if (options.maxOutputTokens !== void 0)
|
|
454
|
+
body.max_tokens = options.maxOutputTokens;
|
|
380
455
|
if (options.topP !== void 0) body.top_p = options.topP;
|
|
381
456
|
if (options.frequencyPenalty !== void 0)
|
|
382
457
|
body.frequency_penalty = options.frequencyPenalty;
|
|
@@ -386,7 +461,7 @@ var ApertisChatLanguageModel = class {
|
|
|
386
461
|
if (options.seed !== void 0) body.seed = options.seed;
|
|
387
462
|
const convertedTools = convertToOpenAITools(tools);
|
|
388
463
|
if (convertedTools !== void 0) body.tools = convertedTools;
|
|
389
|
-
const convertedToolChoice = convertToOpenAIToolChoice(toolChoice);
|
|
464
|
+
const convertedToolChoice = convertToOpenAIToolChoice(options.toolChoice);
|
|
390
465
|
if (convertedToolChoice !== void 0)
|
|
391
466
|
body.tool_choice = convertedToolChoice;
|
|
392
467
|
if (responseFormat !== void 0) body.response_format = responseFormat;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/apertis-provider.ts","../src/apertis-chat-language-model.ts","../src/apertis-error.ts","../src/schemas/chat-response.ts","../src/utils/map-finish-reason.ts","../src/utils/convert-to-openai-messages.ts","../src/utils/convert-to-openai-tools.ts"],"sourcesContent":["export {\n createApertis,\n apertis,\n type ApertisProvider,\n} from \"./apertis-provider\";\nexport type {\n ApertisProviderSettings,\n ApertisChatSettings,\n ApertisModelId,\n} from \"./apertis-chat-settings\";\n","import type { LanguageModelV1 } from \"@ai-sdk/provider\";\nimport { loadApiKey, withoutTrailingSlash } from \"@ai-sdk/provider-utils\";\nimport { ApertisChatLanguageModel } from \"./apertis-chat-language-model\";\nimport type {\n ApertisChatSettings,\n ApertisModelId,\n ApertisProviderSettings,\n} from \"./apertis-chat-settings\";\n\nexport interface ApertisProvider {\n /**\n * Creates a chat model for text generation.\n */\n (modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV1;\n\n /**\n * Creates a chat model for text generation.\n */\n chat(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV1;\n\n /**\n * Creates a chat model for text generation (alias for languageModel).\n */\n languageModel(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV1;\n}\n\nexport function createApertis(\n options: ApertisProviderSettings = {},\n): ApertisProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? \"https://api.apertis.ai/v1\";\n\n const getHeaders = () => ({\n ...options.headers,\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: \"APERTIS_API_KEY\",\n description: \"Apertis API key\",\n })}`,\n \"Content-Type\": \"application/json\",\n });\n\n const createChatModel = (\n modelId: ApertisModelId,\n settings: ApertisChatSettings = {},\n ): LanguageModelV1 =>\n new ApertisChatLanguageModel(modelId, settings, {\n provider: \"apertis.chat\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider: ApertisProvider = Object.assign(\n (modelId: ApertisModelId, settings?: ApertisChatSettings) =>\n createChatModel(modelId, settings),\n {\n chat: createChatModel,\n languageModel: createChatModel,\n },\n );\n\n return provider;\n}\n\n/**\n * Default Apertis provider instance.\n */\nexport const apertis = createApertis();\n","import type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1FunctionTool,\n LanguageModelV1StreamPart,\n} from \"@ai-sdk/provider\";\nimport {\n type ParseResult,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\";\nimport type { ApertisChatSettings } from \"./apertis-chat-settings\";\nimport { apertisFailedResponseHandler } from \"./apertis-error\";\nimport {\n type OpenAIChatChunk,\n openAIChatChunkSchema,\n openAIChatResponseSchema,\n} from \"./schemas/chat-response\";\nimport {\n convertToOpenAIMessages,\n convertToOpenAIToolChoice,\n convertToOpenAITools,\n mapApertisFinishReason,\n} from \"./utils\";\n\nexport interface ApertisChatConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport class ApertisChatLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = \"v1\";\n readonly defaultObjectGenerationMode = \"json\";\n readonly supportsImageUrls = true;\n\n constructor(\n readonly modelId: string,\n private readonly settings: ApertisChatSettings,\n private readonly config: ApertisChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportsStructuredOutputs(): boolean {\n return true;\n }\n\n async doGenerate(options: LanguageModelV1CallOptions): Promise<{\n text?: string;\n toolCalls?: Array<{\n toolCallType: \"function\";\n toolCallId: string;\n toolName: string;\n args: string;\n }>;\n finishReason: LanguageModelV1FinishReason;\n usage: { promptTokens: number; completionTokens: number };\n rawCall: { rawPrompt: unknown; rawSettings: Record<string, unknown> };\n warnings?: LanguageModelV1CallWarning[];\n }> {\n const body = this.buildRequestBody(options, false);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n openAIChatResponseSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const choice = response.choices[0];\n\n return {\n text: choice.message.content ?? undefined,\n toolCalls: choice.message.tool_calls?.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: tc.function.arguments,\n })),\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? 0,\n completionTokens: response.usage?.completion_tokens ?? 0,\n },\n rawCall: { rawPrompt: options.prompt, rawSettings: body },\n };\n }\n\n async doStream(options: LanguageModelV1CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV1StreamPart>;\n rawCall: { rawPrompt: unknown; rawSettings: Record<string, unknown> };\n warnings?: LanguageModelV1CallWarning[];\n }> {\n const body = this.buildRequestBody(options, true);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n openAIChatChunkSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const toolCallBuffers: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n const transformStream = new TransformStream<\n ParseResult<OpenAIChatChunk>,\n LanguageModelV1StreamPart\n >({\n transform(parseResult, controller) {\n // Skip failed parse results\n if (!parseResult.success) {\n return;\n }\n\n const chunk = parseResult.value;\n const choice = chunk.choices[0];\n\n if (!choice) return;\n\n // Handle text delta\n if (choice.delta.content) {\n controller.enqueue({\n type: \"text-delta\",\n textDelta: choice.delta.content,\n });\n }\n\n // Handle tool calls\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n let buffer = toolCallBuffers.get(tc.index);\n\n if (!buffer) {\n buffer = { id: tc.id ?? generateId(), name: \"\", arguments: \"\" };\n toolCallBuffers.set(tc.index, buffer);\n }\n\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name += tc.function.name;\n if (tc.function?.arguments)\n buffer.arguments += tc.function.arguments;\n }\n }\n\n // Handle finish\n if (choice.finish_reason) {\n // Emit completed tool calls (only those with valid names)\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.arguments,\n });\n }\n }\n // Clear buffers after emitting\n toolCallBuffers.clear();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n promptTokens: chunk.usage?.prompt_tokens ?? 0,\n completionTokens: chunk.usage?.completion_tokens ?? 0,\n },\n });\n }\n },\n flush(controller) {\n // Emit any remaining buffered tool calls when stream closes early\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.arguments,\n });\n }\n }\n },\n });\n\n return {\n stream: response.pipeThrough(transformStream),\n rawCall: { rawPrompt: options.prompt, rawSettings: body },\n };\n }\n\n private buildRequestBody(\n options: LanguageModelV1CallOptions,\n stream: boolean,\n ) {\n // Extract tools and toolChoice from mode if available\n const tools =\n options.mode.type === \"regular\"\n ? this.filterFunctionTools(options.mode.tools)\n : undefined;\n const toolChoice =\n options.mode.type === \"regular\" ? options.mode.toolChoice : undefined;\n\n // Determine response format based on mode\n const responseFormat =\n options.mode.type === \"object-json\"\n ? { type: \"json_object\" as const }\n : undefined;\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: convertToOpenAIMessages(options.prompt),\n stream,\n };\n\n // Only add defined optional fields to avoid sending undefined to API\n if (stream) body.stream_options = { include_usage: true };\n if (options.temperature !== undefined)\n body.temperature = options.temperature;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.frequencyPenalty !== undefined)\n body.frequency_penalty = options.frequencyPenalty;\n if (options.presencePenalty !== undefined)\n body.presence_penalty = options.presencePenalty;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\n\n const convertedTools = convertToOpenAITools(tools);\n if (convertedTools !== undefined) body.tools = convertedTools;\n\n const convertedToolChoice = convertToOpenAIToolChoice(toolChoice);\n if (convertedToolChoice !== undefined)\n body.tool_choice = convertedToolChoice;\n\n if (responseFormat !== undefined) body.response_format = responseFormat;\n if (this.settings.user !== undefined) body.user = this.settings.user;\n if (this.settings.logprobs !== undefined)\n body.logprobs = this.settings.logprobs;\n if (this.settings.topLogprobs !== undefined)\n body.top_logprobs = this.settings.topLogprobs;\n\n return body;\n }\n\n private filterFunctionTools(\n tools: Array<LanguageModelV1FunctionTool | { type: string }> | undefined,\n ): LanguageModelV1FunctionTool[] | undefined {\n if (!tools) return undefined;\n return tools.filter(\n (tool): tool is LanguageModelV1FunctionTool => tool.type === \"function\",\n );\n }\n}\n","import { createJsonErrorResponseHandler } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nconst apertisErrorSchema = z.object({\n error: z.object({\n message: z.string(),\n type: z.string().optional(),\n code: z.string().nullable().optional(),\n param: z.string().nullable().optional(),\n }),\n});\n\nexport type ApertisErrorData = z.infer<typeof apertisErrorSchema>;\n\nexport const apertisFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: apertisErrorSchema,\n errorToMessage: (error) => error.error.message,\n});\n","import { z } from \"zod\";\n\nexport const openAIChatResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable(),\n logprobs: z.any().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type OpenAIChatResponse = z.infer<typeof openAIChatResponseSchema>;\n\nexport const openAIChatChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.literal(\"assistant\").optional(),\n content: z.string().nullable().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n })\n .nullish(),\n});\n\nexport type OpenAIChatChunk = z.infer<typeof openAIChatChunkSchema>;\n","import type { LanguageModelV1FinishReason } from \"@ai-sdk/provider\";\n\nexport function mapApertisFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV1FinishReason {\n switch (finishReason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n","import type { LanguageModelV1Prompt } from \"@ai-sdk/provider\";\n\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentPart[] }\n | { role: \"assistant\"; content: string | null; tool_calls?: OpenAIToolCall[] }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\nexport type OpenAIContentPart =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: { url: string; detail?: \"auto\" | \"low\" | \"high\" };\n };\n\nexport type OpenAIToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport function convertToOpenAIMessages(\n prompt: LanguageModelV1Prompt,\n): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n messages.push({ role: \"system\", content: message.content });\n break;\n\n case \"user\":\n messages.push({\n role: \"user\",\n content: message.content.map((part): OpenAIContentPart => {\n switch (part.type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"image\":\n return {\n type: \"image_url\",\n image_url: {\n url:\n part.image instanceof URL\n ? part.image.toString()\n : `data:${part.mimeType ?? \"image/png\"};base64,${Buffer.from(part.image).toString(\"base64\")}`,\n },\n };\n default:\n throw new Error(\n `Unsupported user content part type: ${(part as { type: string }).type}`,\n );\n }\n }),\n });\n break;\n\n case \"assistant\": {\n const textContent = message.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n\n const toolCalls = message.content\n .filter(\n (\n p,\n ): p is {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n } => p.type === \"tool-call\",\n )\n .map((tc) => {\n let arguments_str = \"{}\";\n try {\n arguments_str = JSON.stringify(tc.args);\n } catch {\n arguments_str = \"{}\";\n }\n return {\n id: tc.toolCallId,\n type: \"function\" as const,\n function: { name: tc.toolName, arguments: arguments_str },\n };\n });\n\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n });\n break;\n }\n\n case \"tool\":\n for (const result of message.content) {\n let content = \"{}\";\n if (typeof result.result === \"string\") {\n content = result.result;\n } else {\n try {\n content = JSON.stringify(result.result);\n } catch {\n content = \"{}\";\n }\n }\n messages.push({\n role: \"tool\",\n tool_call_id: result.toolCallId,\n content,\n });\n }\n break;\n }\n }\n\n return messages;\n}\n","import type {\n LanguageModelV1FunctionTool,\n LanguageModelV1ToolChoice,\n} from \"@ai-sdk/provider\";\n\nexport type OpenAITool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport type OpenAIToolChoice =\n | \"none\"\n | \"auto\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport function convertToOpenAITools(\n tools: LanguageModelV1FunctionTool[] | undefined,\n): OpenAITool[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as Record<string, unknown>,\n },\n }));\n}\n\nexport function convertToOpenAIToolChoice(\n toolChoice: LanguageModelV1ToolChoice | undefined,\n): OpenAIToolChoice | undefined {\n if (!toolChoice) return undefined;\n\n switch (toolChoice.type) {\n case \"none\":\n return \"none\";\n case \"auto\":\n return \"auto\";\n case \"required\":\n return \"required\";\n case \"tool\":\n return { type: \"function\", function: { name: toolChoice.toolName } };\n default:\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAAA,yBAAiD;;;ACOjD,IAAAC,yBAMO;;;ACdP,4BAA+C;AAC/C,iBAAkB;AAElB,IAAM,qBAAqB,aAAE,OAAO;AAAA,EAClC,OAAO,aAAE,OAAO;AAAA,IACd,SAAS,aAAE,OAAO;AAAA,IAClB,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IACrC,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACxC,CAAC;AACH,CAAC;AAIM,IAAM,mCAA+B,sDAA+B;AAAA,EACzE,aAAa;AAAA,EACb,gBAAgB,CAAC,UAAU,MAAM,MAAM;AACzC,CAAC;;;ACjBD,IAAAC,cAAkB;AAEX,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,IAAI,cAAE,OAAO;AAAA,EACb,QAAQ,cAAE,QAAQ,iBAAiB,EAAE,SAAS;AAAA,EAC9C,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,cAAE;AAAA,IACT,cAAE,OAAO;AAAA,MACP,OAAO,cAAE,OAAO;AAAA,MAChB,SAAS,cAAE,OAAO;AAAA,QAChB,MAAM,cAAE,QAAQ,WAAW;AAAA,QAC3B,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,YAAY,cACT;AAAA,UACC,cAAE,OAAO;AAAA,YACP,IAAI,cAAE,OAAO;AAAA,YACb,MAAM,cAAE,QAAQ,UAAU;AAAA,YAC1B,UAAU,cAAE,OAAO;AAAA,cACjB,MAAM,cAAE,OAAO;AAAA,cACf,WAAW,cAAE,OAAO;AAAA,YACtB,CAAC;AAAA,UACH,CAAC;AAAA,QACH,EACC,SAAS;AAAA,MACd,CAAC;AAAA,MACD,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,MACnC,UAAU,cAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EACA,OAAO,cACJ,OAAO;AAAA,IACN,eAAe,cAAE,OAAO;AAAA,IACxB,mBAAmB,cAAE,OAAO;AAAA,IAC5B,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,CAAC,EACA,SAAS;AACd,CAAC;AAIM,IAAM,wBAAwB,cAAE,OAAO;AAAA,EAC5C,IAAI,cAAE,OAAO;AAAA,EACb,QAAQ,cAAE,QAAQ,uBAAuB,EAAE,SAAS;AAAA,EACpD,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,cAAE;AAAA,IACT,cAAE,OAAO;AAAA,MACP,OAAO,cAAE,OAAO;AAAA,MAChB,OAAO,cAAE,OAAO;AAAA,QACd,MAAM,cAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,QACtC,SAAS,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,QACxC,YAAY,cACT;AAAA,UACC,cAAE,OAAO;AAAA,YACP,OAAO,cAAE,OAAO;AAAA,YAChB,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,YACxB,MAAM,cAAE,QAAQ,UAAU,EAAE,SAAS;AAAA,YACrC,UAAU,cACP,OAAO;AAAA,cACN,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,cAC1B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,YACjC,CAAC,EACA,SAAS;AAAA,UACd,CAAC;AAAA,QACH,EACC,SAAS;AAAA,MACd,CAAC;AAAA,MACD,eAAe,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EACA,OAAO,cACJ,OAAO;AAAA,IACN,eAAe,cAAE,OAAO;AAAA,IACxB,mBAAmB,cAAE,OAAO;AAAA,EAC9B,CAAC,EACA,QAAQ;AACb,CAAC;;;AC3EM,SAAS,uBACd,cAC6B;AAC7B,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACIO,SAAS,wBACd,QACiB;AACjB,QAAM,WAA4B,CAAC;AAEnC,aAAW,WAAW,QAAQ;AAC5B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,iBAAS,KAAK,EAAE,MAAM,UAAU,SAAS,QAAQ,QAAQ,CAAC;AAC1D;AAAA,MAEF,KAAK;AACH,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,QAAQ,QAAQ,IAAI,CAAC,SAA4B;AACxD,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK;AACH,uBAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,cACzC,KAAK;AACH,uBAAO;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,oBACT,KACE,KAAK,iBAAiB,MAClB,KAAK,MAAM,SAAS,IACpB,QAAQ,KAAK,YAAY,WAAW,WAAW,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,QAAQ,CAAC;AAAA,kBACjG;AAAA,gBACF;AAAA,cACF;AACE,sBAAM,IAAI;AAAA,kBACR,uCAAwC,KAA0B,IAAI;AAAA,gBACxE;AAAA,YACJ;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AACD;AAAA,MAEF,KAAK,aAAa;AAChB,cAAM,cAAc,QAAQ,QACzB,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAEV,cAAM,YAAY,QAAQ,QACvB;AAAA,UACC,CACE,MAMG,EAAE,SAAS;AAAA,QAClB,EACC,IAAI,CAAC,OAAO;AACX,cAAI,gBAAgB;AACpB,cAAI;AACF,4BAAgB,KAAK,UAAU,GAAG,IAAI;AAAA,UACxC,QAAQ;AACN,4BAAgB;AAAA,UAClB;AACA,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,MAAM;AAAA,YACN,UAAU,EAAE,MAAM,GAAG,UAAU,WAAW,cAAc;AAAA,UAC1D;AAAA,QACF,CAAC;AAEH,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,eAAe;AAAA,UACxB,GAAI,UAAU,SAAS,IAAI,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,QAC1D,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK;AACH,mBAAW,UAAU,QAAQ,SAAS;AACpC,cAAI,UAAU;AACd,cAAI,OAAO,OAAO,WAAW,UAAU;AACrC,sBAAU,OAAO;AAAA,UACnB,OAAO;AACL,gBAAI;AACF,wBAAU,KAAK,UAAU,OAAO,MAAM;AAAA,YACxC,QAAQ;AACN,wBAAU;AAAA,YACZ;AAAA,UACF;AACA,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,cAAc,OAAO;AAAA,YACrB;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACpGO,SAAS,qBACd,OAC0B;AAC1B,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AAEzC,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IACnB;AAAA,EACF,EAAE;AACJ;AAEO,SAAS,0BACd,YAC8B;AAC9B,MAAI,CAAC,WAAY,QAAO;AAExB,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,EAAE,MAAM,YAAY,UAAU,EAAE,MAAM,WAAW,SAAS,EAAE;AAAA,IACrE;AACE,aAAO;AAAA,EACX;AACF;;;ALhBO,IAAM,2BAAN,MAA0D;AAAA,EAK/D,YACW,SACQ,UACA,QACjB;AAHS;AACQ;AACA;AAAA,EAChB;AAAA,EARM,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,oBAAoB;AAAA,EAQ7B,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,4BAAqC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,SAYd;AACD,UAAM,OAAO,KAAK,iBAAiB,SAAS,KAAK;AAEjD,UAAM,EAAE,OAAO,SAAS,IAAI,UAAM,sCAAc;AAAA,MAC9C,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,KAAK,OAAO,QAAQ;AAAA,MAC7B;AAAA,MACA,uBAAuB;AAAA,MACvB,+BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,aAAa,QAAQ;AAAA,IACvB,CAAC;AAED,UAAM,SAAS,SAAS,QAAQ,CAAC;AAEjC,WAAO;AAAA,MACL,MAAM,OAAO,QAAQ,WAAW;AAAA,MAChC,WAAW,OAAO,QAAQ,YAAY,IAAI,CAAC,QAAQ;AAAA,QACjD,cAAc;AAAA,QACd,YAAY,GAAG;AAAA,QACf,UAAU,GAAG,SAAS;AAAA,QACtB,MAAM,GAAG,SAAS;AAAA,MACpB,EAAE;AAAA,MACF,cAAc,uBAAuB,OAAO,aAAa;AAAA,MACzD,OAAO;AAAA,QACL,cAAc,SAAS,OAAO,iBAAiB;AAAA,QAC/C,kBAAkB,SAAS,OAAO,qBAAqB;AAAA,MACzD;AAAA,MACA,SAAS,EAAE,WAAW,QAAQ,QAAQ,aAAa,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAIZ;AACD,UAAM,OAAO,KAAK,iBAAiB,SAAS,IAAI;AAEhD,UAAM,EAAE,OAAO,SAAS,IAAI,UAAM,sCAAc;AAAA,MAC9C,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,KAAK,OAAO,QAAQ;AAAA,MAC7B;AAAA,MACA,uBAAuB;AAAA,MACvB,+BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,aAAa,QAAQ;AAAA,IACvB,CAAC;AAED,UAAM,kBAGF,oBAAI,IAAI;AAEZ,UAAM,kBAAkB,IAAI,gBAG1B;AAAA,MACA,UAAU,aAAa,YAAY;AAEjC,YAAI,CAAC,YAAY,SAAS;AACxB;AAAA,QACF;AAEA,cAAM,QAAQ,YAAY;AAC1B,cAAM,SAAS,MAAM,QAAQ,CAAC;AAE9B,YAAI,CAAC,OAAQ;AAGb,YAAI,OAAO,MAAM,SAAS;AACxB,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,WAAW,OAAO,MAAM;AAAA,UAC1B,CAAC;AAAA,QACH;AAGA,YAAI,OAAO,MAAM,YAAY;AAC3B,qBAAW,MAAM,OAAO,MAAM,YAAY;AACxC,gBAAI,SAAS,gBAAgB,IAAI,GAAG,KAAK;AAEzC,gBAAI,CAAC,QAAQ;AACX,uBAAS,EAAE,IAAI,GAAG,UAAM,mCAAW,GAAG,MAAM,IAAI,WAAW,GAAG;AAC9D,8BAAgB,IAAI,GAAG,OAAO,MAAM;AAAA,YACtC;AAEA,gBAAI,GAAG,GAAI,QAAO,KAAK,GAAG;AAC1B,gBAAI,GAAG,UAAU,KAAM,QAAO,QAAQ,GAAG,SAAS;AAClD,gBAAI,GAAG,UAAU;AACf,qBAAO,aAAa,GAAG,SAAS;AAAA,UACpC;AAAA,QACF;AAGA,YAAI,OAAO,eAAe;AAExB,qBAAW,CAAC,EAAE,MAAM,KAAK,iBAAiB;AACxC,gBAAI,OAAO,MAAM;AACf,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,cAAc;AAAA,gBACd,YAAY,OAAO;AAAA,gBACnB,UAAU,OAAO;AAAA,gBACjB,MAAM,OAAO;AAAA,cACf,CAAC;AAAA,YACH;AAAA,UACF;AAEA,0BAAgB,MAAM;AAEtB,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,cAAc,uBAAuB,OAAO,aAAa;AAAA,YACzD,OAAO;AAAA,cACL,cAAc,MAAM,OAAO,iBAAiB;AAAA,cAC5C,kBAAkB,MAAM,OAAO,qBAAqB;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,MAAM,YAAY;AAEhB,mBAAW,CAAC,EAAE,MAAM,KAAK,iBAAiB;AACxC,cAAI,OAAO,MAAM;AACf,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,cAAc;AAAA,cACd,YAAY,OAAO;AAAA,cACnB,UAAU,OAAO;AAAA,cACjB,MAAM,OAAO;AAAA,YACf,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,QAAQ,SAAS,YAAY,eAAe;AAAA,MAC5C,SAAS,EAAE,WAAW,QAAQ,QAAQ,aAAa,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,iBACN,SACA,QACA;AAEA,UAAM,QACJ,QAAQ,KAAK,SAAS,YAClB,KAAK,oBAAoB,QAAQ,KAAK,KAAK,IAC3C;AACN,UAAM,aACJ,QAAQ,KAAK,SAAS,YAAY,QAAQ,KAAK,aAAa;AAG9D,UAAM,iBACJ,QAAQ,KAAK,SAAS,gBAClB,EAAE,MAAM,cAAuB,IAC/B;AAEN,UAAM,OAAgC;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ,UAAU,wBAAwB,QAAQ,MAAM;AAAA,MAChD;AAAA,IACF;AAGA,QAAI,OAAQ,MAAK,iBAAiB,EAAE,eAAe,KAAK;AACxD,QAAI,QAAQ,gBAAgB;AAC1B,WAAK,cAAc,QAAQ;AAC7B,QAAI,QAAQ,cAAc,OAAW,MAAK,aAAa,QAAQ;AAC/D,QAAI,QAAQ,SAAS,OAAW,MAAK,QAAQ,QAAQ;AACrD,QAAI,QAAQ,qBAAqB;AAC/B,WAAK,oBAAoB,QAAQ;AACnC,QAAI,QAAQ,oBAAoB;AAC9B,WAAK,mBAAmB,QAAQ;AAClC,QAAI,QAAQ,kBAAkB,OAAW,MAAK,OAAO,QAAQ;AAC7D,QAAI,QAAQ,SAAS,OAAW,MAAK,OAAO,QAAQ;AAEpD,UAAM,iBAAiB,qBAAqB,KAAK;AACjD,QAAI,mBAAmB,OAAW,MAAK,QAAQ;AAE/C,UAAM,sBAAsB,0BAA0B,UAAU;AAChE,QAAI,wBAAwB;AAC1B,WAAK,cAAc;AAErB,QAAI,mBAAmB,OAAW,MAAK,kBAAkB;AACzD,QAAI,KAAK,SAAS,SAAS,OAAW,MAAK,OAAO,KAAK,SAAS;AAChE,QAAI,KAAK,SAAS,aAAa;AAC7B,WAAK,WAAW,KAAK,SAAS;AAChC,QAAI,KAAK,SAAS,gBAAgB;AAChC,WAAK,eAAe,KAAK,SAAS;AAEpC,WAAO;AAAA,EACT;AAAA,EAEQ,oBACN,OAC2C;AAC3C,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM;AAAA,MACX,CAAC,SAA8C,KAAK,SAAS;AAAA,IAC/D;AAAA,EACF;AACF;;;ADpPO,SAAS,cACd,UAAmC,CAAC,GACnB;AACjB,QAAM,cACJ,6CAAqB,QAAQ,OAAO,KAAK;AAE3C,QAAM,aAAa,OAAO;AAAA,IACxB,GAAG,QAAQ;AAAA,IACX,eAAe,cAAU,mCAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,gBAAgB;AAAA,EAClB;AAEA,QAAM,kBAAkB,CACtB,SACA,WAAgC,CAAC,MAEjC,IAAI,yBAAyB,SAAS,UAAU;AAAA,IAC9C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,WAA4B,OAAO;AAAA,IACvC,CAAC,SAAyB,aACxB,gBAAgB,SAAS,QAAQ;AAAA,IACnC;AAAA,MACE,MAAM;AAAA,MACN,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,IAAM,UAAU,cAAc;","names":["import_provider_utils","import_provider_utils","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/apertis-provider.ts","../src/apertis-chat-language-model.ts","../src/apertis-error.ts","../src/schemas/chat-response.ts","../src/utils/map-finish-reason.ts","../src/utils/convert-to-openai-messages.ts","../src/utils/convert-to-openai-tools.ts"],"sourcesContent":["export {\n createApertis,\n apertis,\n type ApertisProvider,\n} from \"./apertis-provider\";\nexport type {\n ApertisProviderSettings,\n ApertisChatSettings,\n ApertisModelId,\n} from \"./apertis-chat-settings\";\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport { loadApiKey, withoutTrailingSlash } from \"@ai-sdk/provider-utils\";\nimport { ApertisChatLanguageModel } from \"./apertis-chat-language-model\";\nimport type {\n ApertisChatSettings,\n ApertisModelId,\n ApertisProviderSettings,\n} from \"./apertis-chat-settings\";\n\nexport interface ApertisProvider {\n /**\n * Creates a chat model for text generation.\n */\n (modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;\n\n /**\n * Creates a chat model for text generation.\n */\n chat(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV3;\n\n /**\n * Creates a chat model for text generation (alias for languageModel).\n */\n languageModel(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV3;\n}\n\nexport function createApertis(\n options: ApertisProviderSettings = {},\n): ApertisProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? \"https://api.apertis.ai/v1\";\n\n const getHeaders = () => ({\n ...options.headers,\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: \"APERTIS_API_KEY\",\n description: \"Apertis API key\",\n })}`,\n \"Content-Type\": \"application/json\",\n });\n\n const createChatModel = (\n modelId: ApertisModelId,\n settings: ApertisChatSettings = {},\n ): LanguageModelV3 =>\n new ApertisChatLanguageModel(modelId, settings, {\n provider: \"apertis.chat\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider: ApertisProvider = Object.assign(\n (modelId: ApertisModelId, settings?: ApertisChatSettings) =>\n createChatModel(modelId, settings),\n {\n chat: createChatModel,\n languageModel: createChatModel,\n },\n );\n\n return provider;\n}\n\n/**\n * Default Apertis provider instance.\n */\nexport const apertis = createApertis();\n","import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport {\n type ParseResult,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\";\nimport type { ApertisChatSettings } from \"./apertis-chat-settings\";\nimport { apertisFailedResponseHandler } from \"./apertis-error\";\nimport {\n type OpenAIChatChunk,\n openAIChatChunkSchema,\n openAIChatResponseSchema,\n} from \"./schemas/chat-response\";\nimport {\n convertToOpenAIMessages,\n convertToOpenAIToolChoice,\n convertToOpenAITools,\n mapApertisFinishReason,\n} from \"./utils\";\n\nexport interface ApertisChatConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport class ApertisChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n\n /**\n * Supported URL patterns for different media types.\n * Supports HTTP(S) image URLs for direct URL passing.\n */\n readonly supportedUrls: Record<string, RegExp[]> = {\n \"image/*\": [/^https?:\\/\\/.+$/],\n };\n\n constructor(\n readonly modelId: string,\n private readonly settings: ApertisChatSettings,\n private readonly config: ApertisChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const body = this.buildRequestBody(options, false);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n openAIChatResponseSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const choice = response.choices[0];\n\n // Build V3 content array\n const content: LanguageModelV3Content[] = [];\n\n // Add text content if present\n if (choice.message.content) {\n content.push({\n type: \"text\",\n text: choice.message.content,\n });\n }\n\n // Add tool calls if present\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n });\n }\n }\n\n return {\n content,\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens ?? 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens ?? 0,\n text: undefined,\n reasoning: undefined,\n },\n },\n warnings: [],\n request: { body },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const body = this.buildRequestBody(options, true);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n openAIChatChunkSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const toolCallBuffers: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n let textId: string | null = null;\n\n const transformStream = new TransformStream<\n ParseResult<OpenAIChatChunk>,\n LanguageModelV3StreamPart\n >({\n transform(parseResult, controller) {\n // Skip failed parse results\n if (!parseResult.success) {\n return;\n }\n\n const chunk = parseResult.value;\n const choice = chunk.choices[0];\n\n if (!choice) return;\n\n // Handle text delta with start/delta/end pattern\n if (choice.delta.content) {\n if (!textId) {\n textId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: textId,\n });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta: choice.delta.content,\n });\n }\n\n // Handle tool calls\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n let buffer = toolCallBuffers.get(tc.index);\n\n if (!buffer) {\n buffer = { id: tc.id ?? generateId(), name: \"\", arguments: \"\" };\n toolCallBuffers.set(tc.index, buffer);\n }\n\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name += tc.function.name;\n if (tc.function?.arguments)\n buffer.arguments += tc.function.arguments;\n }\n }\n\n // Handle finish\n if (choice.finish_reason) {\n // End text stream if started\n if (textId) {\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n }\n\n // Emit completed tool calls (only those with valid names)\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n input: buffer.arguments,\n });\n }\n }\n // Clear buffers after emitting\n toolCallBuffers.clear();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n inputTokens: {\n total: chunk.usage?.prompt_tokens ?? 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: chunk.usage?.completion_tokens ?? 0,\n text: undefined,\n reasoning: undefined,\n },\n },\n });\n }\n },\n flush(controller) {\n // End text stream if started but not ended\n if (textId) {\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n }\n\n // Emit any remaining buffered tool calls when stream closes early\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n input: buffer.arguments,\n });\n }\n }\n },\n });\n\n return {\n stream: response.pipeThrough(transformStream),\n request: { body },\n };\n }\n\n private buildRequestBody(\n options: LanguageModelV3CallOptions,\n stream: boolean,\n ) {\n // Extract function tools from options.tools\n const tools = this.filterFunctionTools(options.tools);\n\n // Determine response format\n const responseFormat =\n options.responseFormat?.type === \"json\"\n ? { type: \"json_object\" as const }\n : undefined;\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: convertToOpenAIMessages(options.prompt),\n stream,\n };\n\n // Only add defined optional fields to avoid sending undefined to API\n if (stream) body.stream_options = { include_usage: true };\n if (options.temperature !== undefined)\n body.temperature = options.temperature;\n if (options.maxOutputTokens !== undefined)\n body.max_tokens = options.maxOutputTokens;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.frequencyPenalty !== undefined)\n body.frequency_penalty = options.frequencyPenalty;\n if (options.presencePenalty !== undefined)\n body.presence_penalty = options.presencePenalty;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\n\n const convertedTools = convertToOpenAITools(tools);\n if (convertedTools !== undefined) body.tools = convertedTools;\n\n const convertedToolChoice = convertToOpenAIToolChoice(options.toolChoice);\n if (convertedToolChoice !== undefined)\n body.tool_choice = convertedToolChoice;\n\n if (responseFormat !== undefined) body.response_format = responseFormat;\n if (this.settings.user !== undefined) body.user = this.settings.user;\n if (this.settings.logprobs !== undefined)\n body.logprobs = this.settings.logprobs;\n if (this.settings.topLogprobs !== undefined)\n body.top_logprobs = this.settings.topLogprobs;\n\n return body;\n }\n\n private filterFunctionTools(\n tools: LanguageModelV3CallOptions[\"tools\"],\n ): LanguageModelV3FunctionTool[] | undefined {\n if (!tools) return undefined;\n return tools.filter(\n (tool): tool is LanguageModelV3FunctionTool => tool.type === \"function\",\n );\n }\n}\n","import { createJsonErrorResponseHandler } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nconst apertisErrorSchema = z.object({\n error: z.object({\n message: z.string(),\n type: z.string().optional(),\n code: z.string().nullable().optional(),\n param: z.string().nullable().optional(),\n }),\n});\n\nexport type ApertisErrorData = z.infer<typeof apertisErrorSchema>;\n\nexport const apertisFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: apertisErrorSchema,\n errorToMessage: (error) => error.error.message,\n});\n","import { z } from \"zod\";\n\nexport const openAIChatResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable(),\n logprobs: z.any().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type OpenAIChatResponse = z.infer<typeof openAIChatResponseSchema>;\n\nexport const openAIChatChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.literal(\"assistant\").optional(),\n content: z.string().nullable().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n })\n .nullish(),\n});\n\nexport type OpenAIChatChunk = z.infer<typeof openAIChatChunkSchema>;\n","import type { LanguageModelV3FinishReason } from \"@ai-sdk/provider\";\n\nexport function mapApertisFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV3FinishReason {\n const raw = finishReason ?? undefined;\n\n switch (finishReason) {\n case \"stop\":\n return { unified: \"stop\", raw };\n case \"length\":\n return { unified: \"length\", raw };\n case \"tool_calls\":\n return { unified: \"tool-calls\", raw };\n case \"content_filter\":\n return { unified: \"content-filter\", raw };\n default:\n return { unified: \"other\", raw };\n }\n}\n","import type { LanguageModelV3Prompt } from \"@ai-sdk/provider\";\n\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentPart[] }\n | { role: \"assistant\"; content: string | null; tool_calls?: OpenAIToolCall[] }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\nexport type OpenAIContentPart =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: { url: string; detail?: \"auto\" | \"low\" | \"high\" };\n };\n\nexport type OpenAIToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport function convertToOpenAIMessages(\n prompt: LanguageModelV3Prompt,\n): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n // V3 system messages have content as string directly\n messages.push({ role: \"system\", content: message.content });\n break;\n\n case \"user\":\n messages.push({\n role: \"user\",\n content: message.content.map((part): OpenAIContentPart => {\n switch (part.type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"file\": {\n // V3 uses 'file' type with mediaType for images\n if (part.mediaType?.startsWith(\"image/\")) {\n let url: string;\n if (part.data instanceof URL) {\n url = part.data.toString();\n } else if (typeof part.data === \"string\") {\n // Assume it's a URL string or base64\n if (\n part.data.startsWith(\"http://\") ||\n part.data.startsWith(\"https://\")\n ) {\n url = part.data;\n } else {\n // Base64 encoded string\n url = `data:${part.mediaType};base64,${part.data}`;\n }\n } else {\n // Uint8Array\n url = `data:${part.mediaType};base64,${Buffer.from(part.data).toString(\"base64\")}`;\n }\n return {\n type: \"image_url\",\n image_url: { url },\n };\n }\n throw new Error(\n `Unsupported file type: ${part.mediaType}. Only image/* is supported.`,\n );\n }\n default:\n throw new Error(\n `Unsupported user content part type: ${(part as { type: string }).type}`,\n );\n }\n }),\n });\n break;\n\n case \"assistant\": {\n const textContent = message.content\n .filter((p) => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n\n const toolCalls = message.content\n .filter((p) => p.type === \"tool-call\")\n .map((tc) => {\n // V3 uses 'input' instead of 'args'\n let arguments_str = \"{}\";\n try {\n arguments_str =\n typeof tc.input === \"string\"\n ? tc.input\n : JSON.stringify(tc.input);\n } catch {\n arguments_str = \"{}\";\n }\n return {\n id: tc.toolCallId,\n type: \"function\" as const,\n function: { name: tc.toolName, arguments: arguments_str },\n };\n });\n\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n });\n break;\n }\n\n case \"tool\":\n for (const result of message.content) {\n if (result.type !== \"tool-result\") continue;\n\n // V3 uses 'output' instead of 'result'\n let content = \"{}\";\n const output = result.output;\n\n if (typeof output === \"string\") {\n content = output;\n } else if (Array.isArray(output)) {\n // Output can be an array of content parts\n const textParts = output\n .filter((p) => p.type === \"text\")\n .map((p) => p.text);\n content = textParts.join(\"\");\n } else {\n try {\n content = JSON.stringify(output);\n } catch {\n content = \"{}\";\n }\n }\n\n messages.push({\n role: \"tool\",\n tool_call_id: result.toolCallId,\n content,\n });\n }\n break;\n }\n }\n\n return messages;\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3ToolChoice,\n} from \"@ai-sdk/provider\";\n\nexport type OpenAITool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport type OpenAIToolChoice =\n | \"none\"\n | \"auto\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport function convertToOpenAITools(\n tools: LanguageModelV3FunctionTool[] | undefined,\n): OpenAITool[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema as Record<string, unknown>,\n },\n }));\n}\n\nexport function convertToOpenAIToolChoice(\n toolChoice: LanguageModelV3ToolChoice | undefined,\n): OpenAIToolChoice | undefined {\n if (!toolChoice) return undefined;\n\n switch (toolChoice.type) {\n case \"none\":\n return \"none\";\n case \"auto\":\n return \"auto\";\n case \"required\":\n return \"required\";\n case \"tool\":\n if (!toolChoice.toolName) return undefined;\n return {\n type: \"function\",\n function: { name: toolChoice.toolName },\n };\n default:\n return undefined;\n }\n}\n"],"mappings":"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","names":["import_provider_utils","import_provider_utils","import_zod"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LanguageModelV3 } from '@ai-sdk/provider';
|
|
2
2
|
|
|
3
3
|
type ApertisModelId = "gpt-5.2" | "gpt-5.2-codex" | "gpt-5.1" | "claude-opus-4-5-20251101" | "claude-sonnet-4.5" | "claude-haiku-4.5" | "gemini-3-pro-preview" | "gemini-3-flash-preview" | "gemini-2.5-flash-preview" | (string & {});
|
|
4
4
|
interface ApertisProviderSettings {
|
|
@@ -40,15 +40,15 @@ interface ApertisProvider {
|
|
|
40
40
|
/**
|
|
41
41
|
* Creates a chat model for text generation.
|
|
42
42
|
*/
|
|
43
|
-
(modelId: ApertisModelId, settings?: ApertisChatSettings):
|
|
43
|
+
(modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;
|
|
44
44
|
/**
|
|
45
45
|
* Creates a chat model for text generation.
|
|
46
46
|
*/
|
|
47
|
-
chat(modelId: ApertisModelId, settings?: ApertisChatSettings):
|
|
47
|
+
chat(modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;
|
|
48
48
|
/**
|
|
49
49
|
* Creates a chat model for text generation (alias for languageModel).
|
|
50
50
|
*/
|
|
51
|
-
languageModel(modelId: ApertisModelId, settings?: ApertisChatSettings):
|
|
51
|
+
languageModel(modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;
|
|
52
52
|
}
|
|
53
53
|
declare function createApertis(options?: ApertisProviderSettings): ApertisProvider;
|
|
54
54
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LanguageModelV3 } from '@ai-sdk/provider';
|
|
2
2
|
|
|
3
3
|
type ApertisModelId = "gpt-5.2" | "gpt-5.2-codex" | "gpt-5.1" | "claude-opus-4-5-20251101" | "claude-sonnet-4.5" | "claude-haiku-4.5" | "gemini-3-pro-preview" | "gemini-3-flash-preview" | "gemini-2.5-flash-preview" | (string & {});
|
|
4
4
|
interface ApertisProviderSettings {
|
|
@@ -40,15 +40,15 @@ interface ApertisProvider {
|
|
|
40
40
|
/**
|
|
41
41
|
* Creates a chat model for text generation.
|
|
42
42
|
*/
|
|
43
|
-
(modelId: ApertisModelId, settings?: ApertisChatSettings):
|
|
43
|
+
(modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;
|
|
44
44
|
/**
|
|
45
45
|
* Creates a chat model for text generation.
|
|
46
46
|
*/
|
|
47
|
-
chat(modelId: ApertisModelId, settings?: ApertisChatSettings):
|
|
47
|
+
chat(modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;
|
|
48
48
|
/**
|
|
49
49
|
* Creates a chat model for text generation (alias for languageModel).
|
|
50
50
|
*/
|
|
51
|
-
languageModel(modelId: ApertisModelId, settings?: ApertisChatSettings):
|
|
51
|
+
languageModel(modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;
|
|
52
52
|
}
|
|
53
53
|
declare function createApertis(options?: ApertisProviderSettings): ApertisProvider;
|
|
54
54
|
/**
|
package/dist/index.js
CHANGED
|
@@ -93,17 +93,18 @@ var openAIChatChunkSchema = z2.object({
|
|
|
93
93
|
|
|
94
94
|
// src/utils/map-finish-reason.ts
|
|
95
95
|
function mapApertisFinishReason(finishReason) {
|
|
96
|
+
const raw = finishReason ?? void 0;
|
|
96
97
|
switch (finishReason) {
|
|
97
98
|
case "stop":
|
|
98
|
-
return "stop";
|
|
99
|
+
return { unified: "stop", raw };
|
|
99
100
|
case "length":
|
|
100
|
-
return "length";
|
|
101
|
+
return { unified: "length", raw };
|
|
101
102
|
case "tool_calls":
|
|
102
|
-
return "tool-calls";
|
|
103
|
+
return { unified: "tool-calls", raw };
|
|
103
104
|
case "content_filter":
|
|
104
|
-
return "content-filter";
|
|
105
|
+
return { unified: "content-filter", raw };
|
|
105
106
|
default:
|
|
106
|
-
return "
|
|
107
|
+
return { unified: "other", raw };
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
|
|
@@ -122,13 +123,29 @@ function convertToOpenAIMessages(prompt) {
|
|
|
122
123
|
switch (part.type) {
|
|
123
124
|
case "text":
|
|
124
125
|
return { type: "text", text: part.text };
|
|
125
|
-
case "
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
url
|
|
126
|
+
case "file": {
|
|
127
|
+
if (part.mediaType?.startsWith("image/")) {
|
|
128
|
+
let url;
|
|
129
|
+
if (part.data instanceof URL) {
|
|
130
|
+
url = part.data.toString();
|
|
131
|
+
} else if (typeof part.data === "string") {
|
|
132
|
+
if (part.data.startsWith("http://") || part.data.startsWith("https://")) {
|
|
133
|
+
url = part.data;
|
|
134
|
+
} else {
|
|
135
|
+
url = `data:${part.mediaType};base64,${part.data}`;
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
url = `data:${part.mediaType};base64,${Buffer.from(part.data).toString("base64")}`;
|
|
130
139
|
}
|
|
131
|
-
|
|
140
|
+
return {
|
|
141
|
+
type: "image_url",
|
|
142
|
+
image_url: { url }
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
throw new Error(
|
|
146
|
+
`Unsupported file type: ${part.mediaType}. Only image/* is supported.`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
132
149
|
default:
|
|
133
150
|
throw new Error(
|
|
134
151
|
`Unsupported user content part type: ${part.type}`
|
|
@@ -139,12 +156,10 @@ function convertToOpenAIMessages(prompt) {
|
|
|
139
156
|
break;
|
|
140
157
|
case "assistant": {
|
|
141
158
|
const textContent = message.content.filter((p) => p.type === "text").map((p) => p.text).join("");
|
|
142
|
-
const toolCalls = message.content.filter(
|
|
143
|
-
(p) => p.type === "tool-call"
|
|
144
|
-
).map((tc) => {
|
|
159
|
+
const toolCalls = message.content.filter((p) => p.type === "tool-call").map((tc) => {
|
|
145
160
|
let arguments_str = "{}";
|
|
146
161
|
try {
|
|
147
|
-
arguments_str = JSON.stringify(tc.
|
|
162
|
+
arguments_str = typeof tc.input === "string" ? tc.input : JSON.stringify(tc.input);
|
|
148
163
|
} catch {
|
|
149
164
|
arguments_str = "{}";
|
|
150
165
|
}
|
|
@@ -163,12 +178,17 @@ function convertToOpenAIMessages(prompt) {
|
|
|
163
178
|
}
|
|
164
179
|
case "tool":
|
|
165
180
|
for (const result of message.content) {
|
|
181
|
+
if (result.type !== "tool-result") continue;
|
|
166
182
|
let content = "{}";
|
|
167
|
-
|
|
168
|
-
|
|
183
|
+
const output = result.output;
|
|
184
|
+
if (typeof output === "string") {
|
|
185
|
+
content = output;
|
|
186
|
+
} else if (Array.isArray(output)) {
|
|
187
|
+
const textParts = output.filter((p) => p.type === "text").map((p) => p.text);
|
|
188
|
+
content = textParts.join("");
|
|
169
189
|
} else {
|
|
170
190
|
try {
|
|
171
|
-
content = JSON.stringify(
|
|
191
|
+
content = JSON.stringify(output);
|
|
172
192
|
} catch {
|
|
173
193
|
content = "{}";
|
|
174
194
|
}
|
|
@@ -193,7 +213,7 @@ function convertToOpenAITools(tools) {
|
|
|
193
213
|
function: {
|
|
194
214
|
name: tool.name,
|
|
195
215
|
description: tool.description,
|
|
196
|
-
parameters: tool.
|
|
216
|
+
parameters: tool.inputSchema
|
|
197
217
|
}
|
|
198
218
|
}));
|
|
199
219
|
}
|
|
@@ -207,7 +227,11 @@ function convertToOpenAIToolChoice(toolChoice) {
|
|
|
207
227
|
case "required":
|
|
208
228
|
return "required";
|
|
209
229
|
case "tool":
|
|
210
|
-
|
|
230
|
+
if (!toolChoice.toolName) return void 0;
|
|
231
|
+
return {
|
|
232
|
+
type: "function",
|
|
233
|
+
function: { name: toolChoice.toolName }
|
|
234
|
+
};
|
|
211
235
|
default:
|
|
212
236
|
return void 0;
|
|
213
237
|
}
|
|
@@ -220,15 +244,17 @@ var ApertisChatLanguageModel = class {
|
|
|
220
244
|
this.settings = settings;
|
|
221
245
|
this.config = config;
|
|
222
246
|
}
|
|
223
|
-
specificationVersion = "
|
|
224
|
-
|
|
225
|
-
|
|
247
|
+
specificationVersion = "v3";
|
|
248
|
+
/**
|
|
249
|
+
* Supported URL patterns for different media types.
|
|
250
|
+
* Supports HTTP(S) image URLs for direct URL passing.
|
|
251
|
+
*/
|
|
252
|
+
supportedUrls = {
|
|
253
|
+
"image/*": [/^https?:\/\/.+$/]
|
|
254
|
+
};
|
|
226
255
|
get provider() {
|
|
227
256
|
return this.config.provider;
|
|
228
257
|
}
|
|
229
|
-
get supportsStructuredOutputs() {
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
258
|
async doGenerate(options) {
|
|
233
259
|
const body = this.buildRequestBody(options, false);
|
|
234
260
|
const { value: response } = await postJsonToApi({
|
|
@@ -243,20 +269,41 @@ var ApertisChatLanguageModel = class {
|
|
|
243
269
|
abortSignal: options.abortSignal
|
|
244
270
|
});
|
|
245
271
|
const choice = response.choices[0];
|
|
272
|
+
const content = [];
|
|
273
|
+
if (choice.message.content) {
|
|
274
|
+
content.push({
|
|
275
|
+
type: "text",
|
|
276
|
+
text: choice.message.content
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
if (choice.message.tool_calls) {
|
|
280
|
+
for (const tc of choice.message.tool_calls) {
|
|
281
|
+
content.push({
|
|
282
|
+
type: "tool-call",
|
|
283
|
+
toolCallId: tc.id,
|
|
284
|
+
toolName: tc.function.name,
|
|
285
|
+
input: tc.function.arguments
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
246
289
|
return {
|
|
247
|
-
|
|
248
|
-
toolCalls: choice.message.tool_calls?.map((tc) => ({
|
|
249
|
-
toolCallType: "function",
|
|
250
|
-
toolCallId: tc.id,
|
|
251
|
-
toolName: tc.function.name,
|
|
252
|
-
args: tc.function.arguments
|
|
253
|
-
})),
|
|
290
|
+
content,
|
|
254
291
|
finishReason: mapApertisFinishReason(choice.finish_reason),
|
|
255
292
|
usage: {
|
|
256
|
-
|
|
257
|
-
|
|
293
|
+
inputTokens: {
|
|
294
|
+
total: response.usage?.prompt_tokens ?? 0,
|
|
295
|
+
noCache: void 0,
|
|
296
|
+
cacheRead: void 0,
|
|
297
|
+
cacheWrite: void 0
|
|
298
|
+
},
|
|
299
|
+
outputTokens: {
|
|
300
|
+
total: response.usage?.completion_tokens ?? 0,
|
|
301
|
+
text: void 0,
|
|
302
|
+
reasoning: void 0
|
|
303
|
+
}
|
|
258
304
|
},
|
|
259
|
-
|
|
305
|
+
warnings: [],
|
|
306
|
+
request: { body }
|
|
260
307
|
};
|
|
261
308
|
}
|
|
262
309
|
async doStream(options) {
|
|
@@ -273,6 +320,7 @@ var ApertisChatLanguageModel = class {
|
|
|
273
320
|
abortSignal: options.abortSignal
|
|
274
321
|
});
|
|
275
322
|
const toolCallBuffers = /* @__PURE__ */ new Map();
|
|
323
|
+
let textId = null;
|
|
276
324
|
const transformStream = new TransformStream({
|
|
277
325
|
transform(parseResult, controller) {
|
|
278
326
|
if (!parseResult.success) {
|
|
@@ -282,9 +330,17 @@ var ApertisChatLanguageModel = class {
|
|
|
282
330
|
const choice = chunk.choices[0];
|
|
283
331
|
if (!choice) return;
|
|
284
332
|
if (choice.delta.content) {
|
|
333
|
+
if (!textId) {
|
|
334
|
+
textId = generateId();
|
|
335
|
+
controller.enqueue({
|
|
336
|
+
type: "text-start",
|
|
337
|
+
id: textId
|
|
338
|
+
});
|
|
339
|
+
}
|
|
285
340
|
controller.enqueue({
|
|
286
341
|
type: "text-delta",
|
|
287
|
-
|
|
342
|
+
id: textId,
|
|
343
|
+
delta: choice.delta.content
|
|
288
344
|
});
|
|
289
345
|
}
|
|
290
346
|
if (choice.delta.tool_calls) {
|
|
@@ -301,14 +357,19 @@ var ApertisChatLanguageModel = class {
|
|
|
301
357
|
}
|
|
302
358
|
}
|
|
303
359
|
if (choice.finish_reason) {
|
|
360
|
+
if (textId) {
|
|
361
|
+
controller.enqueue({
|
|
362
|
+
type: "text-end",
|
|
363
|
+
id: textId
|
|
364
|
+
});
|
|
365
|
+
}
|
|
304
366
|
for (const [, buffer] of toolCallBuffers) {
|
|
305
367
|
if (buffer.name) {
|
|
306
368
|
controller.enqueue({
|
|
307
369
|
type: "tool-call",
|
|
308
|
-
toolCallType: "function",
|
|
309
370
|
toolCallId: buffer.id,
|
|
310
371
|
toolName: buffer.name,
|
|
311
|
-
|
|
372
|
+
input: buffer.arguments
|
|
312
373
|
});
|
|
313
374
|
}
|
|
314
375
|
}
|
|
@@ -317,21 +378,35 @@ var ApertisChatLanguageModel = class {
|
|
|
317
378
|
type: "finish",
|
|
318
379
|
finishReason: mapApertisFinishReason(choice.finish_reason),
|
|
319
380
|
usage: {
|
|
320
|
-
|
|
321
|
-
|
|
381
|
+
inputTokens: {
|
|
382
|
+
total: chunk.usage?.prompt_tokens ?? 0,
|
|
383
|
+
noCache: void 0,
|
|
384
|
+
cacheRead: void 0,
|
|
385
|
+
cacheWrite: void 0
|
|
386
|
+
},
|
|
387
|
+
outputTokens: {
|
|
388
|
+
total: chunk.usage?.completion_tokens ?? 0,
|
|
389
|
+
text: void 0,
|
|
390
|
+
reasoning: void 0
|
|
391
|
+
}
|
|
322
392
|
}
|
|
323
393
|
});
|
|
324
394
|
}
|
|
325
395
|
},
|
|
326
396
|
flush(controller) {
|
|
397
|
+
if (textId) {
|
|
398
|
+
controller.enqueue({
|
|
399
|
+
type: "text-end",
|
|
400
|
+
id: textId
|
|
401
|
+
});
|
|
402
|
+
}
|
|
327
403
|
for (const [, buffer] of toolCallBuffers) {
|
|
328
404
|
if (buffer.name) {
|
|
329
405
|
controller.enqueue({
|
|
330
406
|
type: "tool-call",
|
|
331
|
-
toolCallType: "function",
|
|
332
407
|
toolCallId: buffer.id,
|
|
333
408
|
toolName: buffer.name,
|
|
334
|
-
|
|
409
|
+
input: buffer.arguments
|
|
335
410
|
});
|
|
336
411
|
}
|
|
337
412
|
}
|
|
@@ -339,13 +414,12 @@ var ApertisChatLanguageModel = class {
|
|
|
339
414
|
});
|
|
340
415
|
return {
|
|
341
416
|
stream: response.pipeThrough(transformStream),
|
|
342
|
-
|
|
417
|
+
request: { body }
|
|
343
418
|
};
|
|
344
419
|
}
|
|
345
420
|
buildRequestBody(options, stream) {
|
|
346
|
-
const tools =
|
|
347
|
-
const
|
|
348
|
-
const responseFormat = options.mode.type === "object-json" ? { type: "json_object" } : void 0;
|
|
421
|
+
const tools = this.filterFunctionTools(options.tools);
|
|
422
|
+
const responseFormat = options.responseFormat?.type === "json" ? { type: "json_object" } : void 0;
|
|
349
423
|
const body = {
|
|
350
424
|
model: this.modelId,
|
|
351
425
|
messages: convertToOpenAIMessages(options.prompt),
|
|
@@ -354,7 +428,8 @@ var ApertisChatLanguageModel = class {
|
|
|
354
428
|
if (stream) body.stream_options = { include_usage: true };
|
|
355
429
|
if (options.temperature !== void 0)
|
|
356
430
|
body.temperature = options.temperature;
|
|
357
|
-
if (options.
|
|
431
|
+
if (options.maxOutputTokens !== void 0)
|
|
432
|
+
body.max_tokens = options.maxOutputTokens;
|
|
358
433
|
if (options.topP !== void 0) body.top_p = options.topP;
|
|
359
434
|
if (options.frequencyPenalty !== void 0)
|
|
360
435
|
body.frequency_penalty = options.frequencyPenalty;
|
|
@@ -364,7 +439,7 @@ var ApertisChatLanguageModel = class {
|
|
|
364
439
|
if (options.seed !== void 0) body.seed = options.seed;
|
|
365
440
|
const convertedTools = convertToOpenAITools(tools);
|
|
366
441
|
if (convertedTools !== void 0) body.tools = convertedTools;
|
|
367
|
-
const convertedToolChoice = convertToOpenAIToolChoice(toolChoice);
|
|
442
|
+
const convertedToolChoice = convertToOpenAIToolChoice(options.toolChoice);
|
|
368
443
|
if (convertedToolChoice !== void 0)
|
|
369
444
|
body.tool_choice = convertedToolChoice;
|
|
370
445
|
if (responseFormat !== void 0) body.response_format = responseFormat;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apertis-provider.ts","../src/apertis-chat-language-model.ts","../src/apertis-error.ts","../src/schemas/chat-response.ts","../src/utils/map-finish-reason.ts","../src/utils/convert-to-openai-messages.ts","../src/utils/convert-to-openai-tools.ts"],"sourcesContent":["import type { LanguageModelV1 } from \"@ai-sdk/provider\";\nimport { loadApiKey, withoutTrailingSlash } from \"@ai-sdk/provider-utils\";\nimport { ApertisChatLanguageModel } from \"./apertis-chat-language-model\";\nimport type {\n ApertisChatSettings,\n ApertisModelId,\n ApertisProviderSettings,\n} from \"./apertis-chat-settings\";\n\nexport interface ApertisProvider {\n /**\n * Creates a chat model for text generation.\n */\n (modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV1;\n\n /**\n * Creates a chat model for text generation.\n */\n chat(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV1;\n\n /**\n * Creates a chat model for text generation (alias for languageModel).\n */\n languageModel(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV1;\n}\n\nexport function createApertis(\n options: ApertisProviderSettings = {},\n): ApertisProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? \"https://api.apertis.ai/v1\";\n\n const getHeaders = () => ({\n ...options.headers,\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: \"APERTIS_API_KEY\",\n description: \"Apertis API key\",\n })}`,\n \"Content-Type\": \"application/json\",\n });\n\n const createChatModel = (\n modelId: ApertisModelId,\n settings: ApertisChatSettings = {},\n ): LanguageModelV1 =>\n new ApertisChatLanguageModel(modelId, settings, {\n provider: \"apertis.chat\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider: ApertisProvider = Object.assign(\n (modelId: ApertisModelId, settings?: ApertisChatSettings) =>\n createChatModel(modelId, settings),\n {\n chat: createChatModel,\n languageModel: createChatModel,\n },\n );\n\n return provider;\n}\n\n/**\n * Default Apertis provider instance.\n */\nexport const apertis = createApertis();\n","import type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1FunctionTool,\n LanguageModelV1StreamPart,\n} from \"@ai-sdk/provider\";\nimport {\n type ParseResult,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\";\nimport type { ApertisChatSettings } from \"./apertis-chat-settings\";\nimport { apertisFailedResponseHandler } from \"./apertis-error\";\nimport {\n type OpenAIChatChunk,\n openAIChatChunkSchema,\n openAIChatResponseSchema,\n} from \"./schemas/chat-response\";\nimport {\n convertToOpenAIMessages,\n convertToOpenAIToolChoice,\n convertToOpenAITools,\n mapApertisFinishReason,\n} from \"./utils\";\n\nexport interface ApertisChatConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport class ApertisChatLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = \"v1\";\n readonly defaultObjectGenerationMode = \"json\";\n readonly supportsImageUrls = true;\n\n constructor(\n readonly modelId: string,\n private readonly settings: ApertisChatSettings,\n private readonly config: ApertisChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportsStructuredOutputs(): boolean {\n return true;\n }\n\n async doGenerate(options: LanguageModelV1CallOptions): Promise<{\n text?: string;\n toolCalls?: Array<{\n toolCallType: \"function\";\n toolCallId: string;\n toolName: string;\n args: string;\n }>;\n finishReason: LanguageModelV1FinishReason;\n usage: { promptTokens: number; completionTokens: number };\n rawCall: { rawPrompt: unknown; rawSettings: Record<string, unknown> };\n warnings?: LanguageModelV1CallWarning[];\n }> {\n const body = this.buildRequestBody(options, false);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n openAIChatResponseSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const choice = response.choices[0];\n\n return {\n text: choice.message.content ?? undefined,\n toolCalls: choice.message.tool_calls?.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: tc.function.arguments,\n })),\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? 0,\n completionTokens: response.usage?.completion_tokens ?? 0,\n },\n rawCall: { rawPrompt: options.prompt, rawSettings: body },\n };\n }\n\n async doStream(options: LanguageModelV1CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV1StreamPart>;\n rawCall: { rawPrompt: unknown; rawSettings: Record<string, unknown> };\n warnings?: LanguageModelV1CallWarning[];\n }> {\n const body = this.buildRequestBody(options, true);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n openAIChatChunkSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const toolCallBuffers: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n const transformStream = new TransformStream<\n ParseResult<OpenAIChatChunk>,\n LanguageModelV1StreamPart\n >({\n transform(parseResult, controller) {\n // Skip failed parse results\n if (!parseResult.success) {\n return;\n }\n\n const chunk = parseResult.value;\n const choice = chunk.choices[0];\n\n if (!choice) return;\n\n // Handle text delta\n if (choice.delta.content) {\n controller.enqueue({\n type: \"text-delta\",\n textDelta: choice.delta.content,\n });\n }\n\n // Handle tool calls\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n let buffer = toolCallBuffers.get(tc.index);\n\n if (!buffer) {\n buffer = { id: tc.id ?? generateId(), name: \"\", arguments: \"\" };\n toolCallBuffers.set(tc.index, buffer);\n }\n\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name += tc.function.name;\n if (tc.function?.arguments)\n buffer.arguments += tc.function.arguments;\n }\n }\n\n // Handle finish\n if (choice.finish_reason) {\n // Emit completed tool calls (only those with valid names)\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.arguments,\n });\n }\n }\n // Clear buffers after emitting\n toolCallBuffers.clear();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n promptTokens: chunk.usage?.prompt_tokens ?? 0,\n completionTokens: chunk.usage?.completion_tokens ?? 0,\n },\n });\n }\n },\n flush(controller) {\n // Emit any remaining buffered tool calls when stream closes early\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.arguments,\n });\n }\n }\n },\n });\n\n return {\n stream: response.pipeThrough(transformStream),\n rawCall: { rawPrompt: options.prompt, rawSettings: body },\n };\n }\n\n private buildRequestBody(\n options: LanguageModelV1CallOptions,\n stream: boolean,\n ) {\n // Extract tools and toolChoice from mode if available\n const tools =\n options.mode.type === \"regular\"\n ? this.filterFunctionTools(options.mode.tools)\n : undefined;\n const toolChoice =\n options.mode.type === \"regular\" ? options.mode.toolChoice : undefined;\n\n // Determine response format based on mode\n const responseFormat =\n options.mode.type === \"object-json\"\n ? { type: \"json_object\" as const }\n : undefined;\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: convertToOpenAIMessages(options.prompt),\n stream,\n };\n\n // Only add defined optional fields to avoid sending undefined to API\n if (stream) body.stream_options = { include_usage: true };\n if (options.temperature !== undefined)\n body.temperature = options.temperature;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.frequencyPenalty !== undefined)\n body.frequency_penalty = options.frequencyPenalty;\n if (options.presencePenalty !== undefined)\n body.presence_penalty = options.presencePenalty;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\n\n const convertedTools = convertToOpenAITools(tools);\n if (convertedTools !== undefined) body.tools = convertedTools;\n\n const convertedToolChoice = convertToOpenAIToolChoice(toolChoice);\n if (convertedToolChoice !== undefined)\n body.tool_choice = convertedToolChoice;\n\n if (responseFormat !== undefined) body.response_format = responseFormat;\n if (this.settings.user !== undefined) body.user = this.settings.user;\n if (this.settings.logprobs !== undefined)\n body.logprobs = this.settings.logprobs;\n if (this.settings.topLogprobs !== undefined)\n body.top_logprobs = this.settings.topLogprobs;\n\n return body;\n }\n\n private filterFunctionTools(\n tools: Array<LanguageModelV1FunctionTool | { type: string }> | undefined,\n ): LanguageModelV1FunctionTool[] | undefined {\n if (!tools) return undefined;\n return tools.filter(\n (tool): tool is LanguageModelV1FunctionTool => tool.type === \"function\",\n );\n }\n}\n","import { createJsonErrorResponseHandler } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nconst apertisErrorSchema = z.object({\n error: z.object({\n message: z.string(),\n type: z.string().optional(),\n code: z.string().nullable().optional(),\n param: z.string().nullable().optional(),\n }),\n});\n\nexport type ApertisErrorData = z.infer<typeof apertisErrorSchema>;\n\nexport const apertisFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: apertisErrorSchema,\n errorToMessage: (error) => error.error.message,\n});\n","import { z } from \"zod\";\n\nexport const openAIChatResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable(),\n logprobs: z.any().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type OpenAIChatResponse = z.infer<typeof openAIChatResponseSchema>;\n\nexport const openAIChatChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.literal(\"assistant\").optional(),\n content: z.string().nullable().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n })\n .nullish(),\n});\n\nexport type OpenAIChatChunk = z.infer<typeof openAIChatChunkSchema>;\n","import type { LanguageModelV1FinishReason } from \"@ai-sdk/provider\";\n\nexport function mapApertisFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV1FinishReason {\n switch (finishReason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n","import type { LanguageModelV1Prompt } from \"@ai-sdk/provider\";\n\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentPart[] }\n | { role: \"assistant\"; content: string | null; tool_calls?: OpenAIToolCall[] }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\nexport type OpenAIContentPart =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: { url: string; detail?: \"auto\" | \"low\" | \"high\" };\n };\n\nexport type OpenAIToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport function convertToOpenAIMessages(\n prompt: LanguageModelV1Prompt,\n): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n messages.push({ role: \"system\", content: message.content });\n break;\n\n case \"user\":\n messages.push({\n role: \"user\",\n content: message.content.map((part): OpenAIContentPart => {\n switch (part.type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"image\":\n return {\n type: \"image_url\",\n image_url: {\n url:\n part.image instanceof URL\n ? part.image.toString()\n : `data:${part.mimeType ?? \"image/png\"};base64,${Buffer.from(part.image).toString(\"base64\")}`,\n },\n };\n default:\n throw new Error(\n `Unsupported user content part type: ${(part as { type: string }).type}`,\n );\n }\n }),\n });\n break;\n\n case \"assistant\": {\n const textContent = message.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n\n const toolCalls = message.content\n .filter(\n (\n p,\n ): p is {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n } => p.type === \"tool-call\",\n )\n .map((tc) => {\n let arguments_str = \"{}\";\n try {\n arguments_str = JSON.stringify(tc.args);\n } catch {\n arguments_str = \"{}\";\n }\n return {\n id: tc.toolCallId,\n type: \"function\" as const,\n function: { name: tc.toolName, arguments: arguments_str },\n };\n });\n\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n });\n break;\n }\n\n case \"tool\":\n for (const result of message.content) {\n let content = \"{}\";\n if (typeof result.result === \"string\") {\n content = result.result;\n } else {\n try {\n content = JSON.stringify(result.result);\n } catch {\n content = \"{}\";\n }\n }\n messages.push({\n role: \"tool\",\n tool_call_id: result.toolCallId,\n content,\n });\n }\n break;\n }\n }\n\n return messages;\n}\n","import type {\n LanguageModelV1FunctionTool,\n LanguageModelV1ToolChoice,\n} from \"@ai-sdk/provider\";\n\nexport type OpenAITool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport type OpenAIToolChoice =\n | \"none\"\n | \"auto\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport function convertToOpenAITools(\n tools: LanguageModelV1FunctionTool[] | undefined,\n): OpenAITool[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as Record<string, unknown>,\n },\n }));\n}\n\nexport function convertToOpenAIToolChoice(\n toolChoice: LanguageModelV1ToolChoice | undefined,\n): OpenAIToolChoice | undefined {\n if (!toolChoice) return undefined;\n\n switch (toolChoice.type) {\n case \"none\":\n return \"none\";\n case \"auto\":\n return \"auto\";\n case \"required\":\n return \"required\";\n case \"tool\":\n return { type: \"function\", function: { name: toolChoice.toolName } };\n default:\n return undefined;\n }\n}\n"],"mappings":"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","names":["z"]}
|
|
1
|
+
{"version":3,"sources":["../src/apertis-provider.ts","../src/apertis-chat-language-model.ts","../src/apertis-error.ts","../src/schemas/chat-response.ts","../src/utils/map-finish-reason.ts","../src/utils/convert-to-openai-messages.ts","../src/utils/convert-to-openai-tools.ts"],"sourcesContent":["import type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport { loadApiKey, withoutTrailingSlash } from \"@ai-sdk/provider-utils\";\nimport { ApertisChatLanguageModel } from \"./apertis-chat-language-model\";\nimport type {\n ApertisChatSettings,\n ApertisModelId,\n ApertisProviderSettings,\n} from \"./apertis-chat-settings\";\n\nexport interface ApertisProvider {\n /**\n * Creates a chat model for text generation.\n */\n (modelId: ApertisModelId, settings?: ApertisChatSettings): LanguageModelV3;\n\n /**\n * Creates a chat model for text generation.\n */\n chat(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV3;\n\n /**\n * Creates a chat model for text generation (alias for languageModel).\n */\n languageModel(\n modelId: ApertisModelId,\n settings?: ApertisChatSettings,\n ): LanguageModelV3;\n}\n\nexport function createApertis(\n options: ApertisProviderSettings = {},\n): ApertisProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? \"https://api.apertis.ai/v1\";\n\n const getHeaders = () => ({\n ...options.headers,\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: \"APERTIS_API_KEY\",\n description: \"Apertis API key\",\n })}`,\n \"Content-Type\": \"application/json\",\n });\n\n const createChatModel = (\n modelId: ApertisModelId,\n settings: ApertisChatSettings = {},\n ): LanguageModelV3 =>\n new ApertisChatLanguageModel(modelId, settings, {\n provider: \"apertis.chat\",\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider: ApertisProvider = Object.assign(\n (modelId: ApertisModelId, settings?: ApertisChatSettings) =>\n createChatModel(modelId, settings),\n {\n chat: createChatModel,\n languageModel: createChatModel,\n },\n );\n\n return provider;\n}\n\n/**\n * Default Apertis provider instance.\n */\nexport const apertis = createApertis();\n","import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport {\n type ParseResult,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\";\nimport type { ApertisChatSettings } from \"./apertis-chat-settings\";\nimport { apertisFailedResponseHandler } from \"./apertis-error\";\nimport {\n type OpenAIChatChunk,\n openAIChatChunkSchema,\n openAIChatResponseSchema,\n} from \"./schemas/chat-response\";\nimport {\n convertToOpenAIMessages,\n convertToOpenAIToolChoice,\n convertToOpenAITools,\n mapApertisFinishReason,\n} from \"./utils\";\n\nexport interface ApertisChatConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport class ApertisChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n\n /**\n * Supported URL patterns for different media types.\n * Supports HTTP(S) image URLs for direct URL passing.\n */\n readonly supportedUrls: Record<string, RegExp[]> = {\n \"image/*\": [/^https?:\\/\\/.+$/],\n };\n\n constructor(\n readonly modelId: string,\n private readonly settings: ApertisChatSettings,\n private readonly config: ApertisChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const body = this.buildRequestBody(options, false);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n openAIChatResponseSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const choice = response.choices[0];\n\n // Build V3 content array\n const content: LanguageModelV3Content[] = [];\n\n // Add text content if present\n if (choice.message.content) {\n content.push({\n type: \"text\",\n text: choice.message.content,\n });\n }\n\n // Add tool calls if present\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n });\n }\n }\n\n return {\n content,\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens ?? 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens ?? 0,\n text: undefined,\n reasoning: undefined,\n },\n },\n warnings: [],\n request: { body },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const body = this.buildRequestBody(options, true);\n\n const { value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: this.config.headers(),\n body,\n failedResponseHandler: apertisFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n openAIChatChunkSchema,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const toolCallBuffers: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n let textId: string | null = null;\n\n const transformStream = new TransformStream<\n ParseResult<OpenAIChatChunk>,\n LanguageModelV3StreamPart\n >({\n transform(parseResult, controller) {\n // Skip failed parse results\n if (!parseResult.success) {\n return;\n }\n\n const chunk = parseResult.value;\n const choice = chunk.choices[0];\n\n if (!choice) return;\n\n // Handle text delta with start/delta/end pattern\n if (choice.delta.content) {\n if (!textId) {\n textId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: textId,\n });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta: choice.delta.content,\n });\n }\n\n // Handle tool calls\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n let buffer = toolCallBuffers.get(tc.index);\n\n if (!buffer) {\n buffer = { id: tc.id ?? generateId(), name: \"\", arguments: \"\" };\n toolCallBuffers.set(tc.index, buffer);\n }\n\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name += tc.function.name;\n if (tc.function?.arguments)\n buffer.arguments += tc.function.arguments;\n }\n }\n\n // Handle finish\n if (choice.finish_reason) {\n // End text stream if started\n if (textId) {\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n }\n\n // Emit completed tool calls (only those with valid names)\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n input: buffer.arguments,\n });\n }\n }\n // Clear buffers after emitting\n toolCallBuffers.clear();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: mapApertisFinishReason(choice.finish_reason),\n usage: {\n inputTokens: {\n total: chunk.usage?.prompt_tokens ?? 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: chunk.usage?.completion_tokens ?? 0,\n text: undefined,\n reasoning: undefined,\n },\n },\n });\n }\n },\n flush(controller) {\n // End text stream if started but not ended\n if (textId) {\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n }\n\n // Emit any remaining buffered tool calls when stream closes early\n for (const [, buffer] of toolCallBuffers) {\n if (buffer.name) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: buffer.id,\n toolName: buffer.name,\n input: buffer.arguments,\n });\n }\n }\n },\n });\n\n return {\n stream: response.pipeThrough(transformStream),\n request: { body },\n };\n }\n\n private buildRequestBody(\n options: LanguageModelV3CallOptions,\n stream: boolean,\n ) {\n // Extract function tools from options.tools\n const tools = this.filterFunctionTools(options.tools);\n\n // Determine response format\n const responseFormat =\n options.responseFormat?.type === \"json\"\n ? { type: \"json_object\" as const }\n : undefined;\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: convertToOpenAIMessages(options.prompt),\n stream,\n };\n\n // Only add defined optional fields to avoid sending undefined to API\n if (stream) body.stream_options = { include_usage: true };\n if (options.temperature !== undefined)\n body.temperature = options.temperature;\n if (options.maxOutputTokens !== undefined)\n body.max_tokens = options.maxOutputTokens;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.frequencyPenalty !== undefined)\n body.frequency_penalty = options.frequencyPenalty;\n if (options.presencePenalty !== undefined)\n body.presence_penalty = options.presencePenalty;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\n\n const convertedTools = convertToOpenAITools(tools);\n if (convertedTools !== undefined) body.tools = convertedTools;\n\n const convertedToolChoice = convertToOpenAIToolChoice(options.toolChoice);\n if (convertedToolChoice !== undefined)\n body.tool_choice = convertedToolChoice;\n\n if (responseFormat !== undefined) body.response_format = responseFormat;\n if (this.settings.user !== undefined) body.user = this.settings.user;\n if (this.settings.logprobs !== undefined)\n body.logprobs = this.settings.logprobs;\n if (this.settings.topLogprobs !== undefined)\n body.top_logprobs = this.settings.topLogprobs;\n\n return body;\n }\n\n private filterFunctionTools(\n tools: LanguageModelV3CallOptions[\"tools\"],\n ): LanguageModelV3FunctionTool[] | undefined {\n if (!tools) return undefined;\n return tools.filter(\n (tool): tool is LanguageModelV3FunctionTool => tool.type === \"function\",\n );\n }\n}\n","import { createJsonErrorResponseHandler } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nconst apertisErrorSchema = z.object({\n error: z.object({\n message: z.string(),\n type: z.string().optional(),\n code: z.string().nullable().optional(),\n param: z.string().nullable().optional(),\n }),\n});\n\nexport type ApertisErrorData = z.infer<typeof apertisErrorSchema>;\n\nexport const apertisFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: apertisErrorSchema,\n errorToMessage: (error) => error.error.message,\n});\n","import { z } from \"zod\";\n\nexport const openAIChatResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable(),\n logprobs: z.any().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type OpenAIChatResponse = z.infer<typeof openAIChatResponseSchema>;\n\nexport const openAIChatChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\").optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.literal(\"assistant\").optional(),\n content: z.string().nullable().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n }),\n finish_reason: z.string().nullable().optional(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n })\n .nullish(),\n});\n\nexport type OpenAIChatChunk = z.infer<typeof openAIChatChunkSchema>;\n","import type { LanguageModelV3FinishReason } from \"@ai-sdk/provider\";\n\nexport function mapApertisFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV3FinishReason {\n const raw = finishReason ?? undefined;\n\n switch (finishReason) {\n case \"stop\":\n return { unified: \"stop\", raw };\n case \"length\":\n return { unified: \"length\", raw };\n case \"tool_calls\":\n return { unified: \"tool-calls\", raw };\n case \"content_filter\":\n return { unified: \"content-filter\", raw };\n default:\n return { unified: \"other\", raw };\n }\n}\n","import type { LanguageModelV3Prompt } from \"@ai-sdk/provider\";\n\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentPart[] }\n | { role: \"assistant\"; content: string | null; tool_calls?: OpenAIToolCall[] }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\nexport type OpenAIContentPart =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: { url: string; detail?: \"auto\" | \"low\" | \"high\" };\n };\n\nexport type OpenAIToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport function convertToOpenAIMessages(\n prompt: LanguageModelV3Prompt,\n): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n // V3 system messages have content as string directly\n messages.push({ role: \"system\", content: message.content });\n break;\n\n case \"user\":\n messages.push({\n role: \"user\",\n content: message.content.map((part): OpenAIContentPart => {\n switch (part.type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"file\": {\n // V3 uses 'file' type with mediaType for images\n if (part.mediaType?.startsWith(\"image/\")) {\n let url: string;\n if (part.data instanceof URL) {\n url = part.data.toString();\n } else if (typeof part.data === \"string\") {\n // Assume it's a URL string or base64\n if (\n part.data.startsWith(\"http://\") ||\n part.data.startsWith(\"https://\")\n ) {\n url = part.data;\n } else {\n // Base64 encoded string\n url = `data:${part.mediaType};base64,${part.data}`;\n }\n } else {\n // Uint8Array\n url = `data:${part.mediaType};base64,${Buffer.from(part.data).toString(\"base64\")}`;\n }\n return {\n type: \"image_url\",\n image_url: { url },\n };\n }\n throw new Error(\n `Unsupported file type: ${part.mediaType}. Only image/* is supported.`,\n );\n }\n default:\n throw new Error(\n `Unsupported user content part type: ${(part as { type: string }).type}`,\n );\n }\n }),\n });\n break;\n\n case \"assistant\": {\n const textContent = message.content\n .filter((p) => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n\n const toolCalls = message.content\n .filter((p) => p.type === \"tool-call\")\n .map((tc) => {\n // V3 uses 'input' instead of 'args'\n let arguments_str = \"{}\";\n try {\n arguments_str =\n typeof tc.input === \"string\"\n ? tc.input\n : JSON.stringify(tc.input);\n } catch {\n arguments_str = \"{}\";\n }\n return {\n id: tc.toolCallId,\n type: \"function\" as const,\n function: { name: tc.toolName, arguments: arguments_str },\n };\n });\n\n messages.push({\n role: \"assistant\",\n content: textContent || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n });\n break;\n }\n\n case \"tool\":\n for (const result of message.content) {\n if (result.type !== \"tool-result\") continue;\n\n // V3 uses 'output' instead of 'result'\n let content = \"{}\";\n const output = result.output;\n\n if (typeof output === \"string\") {\n content = output;\n } else if (Array.isArray(output)) {\n // Output can be an array of content parts\n const textParts = output\n .filter((p) => p.type === \"text\")\n .map((p) => p.text);\n content = textParts.join(\"\");\n } else {\n try {\n content = JSON.stringify(output);\n } catch {\n content = \"{}\";\n }\n }\n\n messages.push({\n role: \"tool\",\n tool_call_id: result.toolCallId,\n content,\n });\n }\n break;\n }\n }\n\n return messages;\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3ToolChoice,\n} from \"@ai-sdk/provider\";\n\nexport type OpenAITool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport type OpenAIToolChoice =\n | \"none\"\n | \"auto\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport function convertToOpenAITools(\n tools: LanguageModelV3FunctionTool[] | undefined,\n): OpenAITool[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema as Record<string, unknown>,\n },\n }));\n}\n\nexport function convertToOpenAIToolChoice(\n toolChoice: LanguageModelV3ToolChoice | undefined,\n): OpenAIToolChoice | undefined {\n if (!toolChoice) return undefined;\n\n switch (toolChoice.type) {\n case \"none\":\n return \"none\";\n case \"auto\":\n return \"auto\";\n case \"required\":\n return \"required\";\n case \"tool\":\n if (!toolChoice.toolName) return undefined;\n return {\n type: \"function\",\n function: { name: toolChoice.toolName },\n };\n default:\n return undefined;\n }\n}\n"],"mappings":"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","names":["z"]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apertis/ai-sdk-provider",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Apertis AI provider for Vercel AI SDK",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/
|
|
8
|
+
"url": "https://github.com/apertis-ai/apertis-sdk"
|
|
9
9
|
},
|
|
10
|
-
"homepage": "https://github.com/
|
|
10
|
+
"homepage": "https://github.com/apertis-ai/apertis-sdk#readme",
|
|
11
11
|
"type": "module",
|
|
12
12
|
"engines": {
|
|
13
13
|
"node": ">=18.0.0"
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"prepublishOnly": "pnpm build"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@ai-sdk/provider": "^
|
|
37
|
-
"@ai-sdk/provider-utils": "^
|
|
36
|
+
"@ai-sdk/provider": "^3.0.0",
|
|
37
|
+
"@ai-sdk/provider-utils": "^4.0.0",
|
|
38
38
|
"zod": "^3.23.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"vitest": "^2.0.0"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
|
+
"ai": ">=6.0.0",
|
|
48
49
|
"zod": "^3.0.0"
|
|
49
50
|
},
|
|
50
51
|
"keywords": [
|