@ai-sdk/openai-compatible 1.0.0-canary.7 → 1.0.0-canary.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @ai-sdk/openai-compatible
2
2
 
3
+ ## 1.0.0-canary.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [95857aa]
8
+ - Updated dependencies [7ea4132]
9
+ - @ai-sdk/provider@2.0.0-canary.8
10
+ - @ai-sdk/provider-utils@3.0.0-canary.9
11
+
12
+ ## 1.0.0-canary.8
13
+
14
+ ### Patch Changes
15
+
16
+ - b9a6121: fix (provider/openai-compatible): change tool_call type schema to nullish
17
+ - Updated dependencies [5d142ab]
18
+ - Updated dependencies [b6b43c7]
19
+ - Updated dependencies [8aa9e20]
20
+ - Updated dependencies [3795467]
21
+ - @ai-sdk/provider-utils@3.0.0-canary.8
22
+ - @ai-sdk/provider@2.0.0-canary.7
23
+
3
24
  ## 1.0.0-canary.7
4
25
 
5
26
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { SharedV2ProviderMetadata, LanguageModelV2, LanguageModelV2ObjectGenerationMode, EmbeddingModelV2, ImageModelV1, ProviderV2 } from '@ai-sdk/provider';
1
+ import { SharedV2ProviderMetadata, LanguageModelV2, EmbeddingModelV2, ImageModelV1, ProviderV2 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
3
  import { z, ZodSchema } from 'zod';
4
4
 
@@ -109,15 +109,13 @@ type OpenAICompatibleChatConfig = {
109
109
  errorStructure?: ProviderErrorStructure<any>;
110
110
  metadataExtractor?: MetadataExtractor;
111
111
  /**
112
- Default object generation mode that should be used with this model when
113
- no mode is specified. Should be the mode with the best results for this
114
- model. `undefined` can be specified if object generation is not supported.
115
- */
116
- defaultObjectGenerationMode?: LanguageModelV2ObjectGenerationMode;
117
- /**
118
112
  * Whether the model supports structured outputs.
119
113
  */
120
114
  supportsStructuredOutputs?: boolean;
115
+ /**
116
+ * The supported URLs for the model.
117
+ */
118
+ getSupportedUrls?: () => Promise<Record<string, RegExp[]>>;
121
119
  };
122
120
  declare class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
123
121
  readonly specificationVersion = "v2";
@@ -127,9 +125,9 @@ declare class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
127
125
  private readonly failedResponseHandler;
128
126
  private readonly chunkSchema;
129
127
  constructor(modelId: OpenAICompatibleChatModelId, config: OpenAICompatibleChatConfig);
130
- get defaultObjectGenerationMode(): 'json' | 'tool' | undefined;
131
128
  get provider(): string;
132
129
  private get providerOptionsName();
130
+ getSupportedUrls(): Promise<Record<string, RegExp[]>>;
133
131
  private getArgs;
134
132
  doGenerate(options: Parameters<LanguageModelV2['doGenerate']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>>;
135
133
  doStream(options: Parameters<LanguageModelV2['doStream']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>>;
@@ -179,10 +177,13 @@ type OpenAICompatibleCompletionConfig = {
179
177
  }) => string;
180
178
  fetch?: FetchFunction;
181
179
  errorStructure?: ProviderErrorStructure<any>;
180
+ /**
181
+ * The supported URLs for the model.
182
+ */
183
+ getSupportedUrls?: () => Promise<Record<string, RegExp[]>>;
182
184
  };
183
185
  declare class OpenAICompatibleCompletionLanguageModel implements LanguageModelV2 {
184
186
  readonly specificationVersion = "v2";
185
- readonly defaultObjectGenerationMode: undefined;
186
187
  readonly modelId: OpenAICompatibleCompletionModelId;
187
188
  private readonly config;
188
189
  private readonly failedResponseHandler;
@@ -190,6 +191,7 @@ declare class OpenAICompatibleCompletionLanguageModel implements LanguageModelV2
190
191
  constructor(modelId: OpenAICompatibleCompletionModelId, config: OpenAICompatibleCompletionConfig);
191
192
  get provider(): string;
192
193
  private get providerOptionsName();
194
+ getSupportedUrls(): Promise<Record<string, RegExp[]>>;
193
195
  private getArgs;
194
196
  doGenerate(options: Parameters<LanguageModelV2['doGenerate']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>>;
195
197
  doStream(options: Parameters<LanguageModelV2['doStream']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SharedV2ProviderMetadata, LanguageModelV2, LanguageModelV2ObjectGenerationMode, EmbeddingModelV2, ImageModelV1, ProviderV2 } from '@ai-sdk/provider';
1
+ import { SharedV2ProviderMetadata, LanguageModelV2, EmbeddingModelV2, ImageModelV1, ProviderV2 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
3
  import { z, ZodSchema } from 'zod';
4
4
 
@@ -109,15 +109,13 @@ type OpenAICompatibleChatConfig = {
109
109
  errorStructure?: ProviderErrorStructure<any>;
110
110
  metadataExtractor?: MetadataExtractor;
111
111
  /**
112
- Default object generation mode that should be used with this model when
113
- no mode is specified. Should be the mode with the best results for this
114
- model. `undefined` can be specified if object generation is not supported.
115
- */
116
- defaultObjectGenerationMode?: LanguageModelV2ObjectGenerationMode;
117
- /**
118
112
  * Whether the model supports structured outputs.
119
113
  */
120
114
  supportsStructuredOutputs?: boolean;
115
+ /**
116
+ * The supported URLs for the model.
117
+ */
118
+ getSupportedUrls?: () => Promise<Record<string, RegExp[]>>;
121
119
  };
122
120
  declare class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
123
121
  readonly specificationVersion = "v2";
@@ -127,9 +125,9 @@ declare class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
127
125
  private readonly failedResponseHandler;
128
126
  private readonly chunkSchema;
129
127
  constructor(modelId: OpenAICompatibleChatModelId, config: OpenAICompatibleChatConfig);
130
- get defaultObjectGenerationMode(): 'json' | 'tool' | undefined;
131
128
  get provider(): string;
132
129
  private get providerOptionsName();
130
+ getSupportedUrls(): Promise<Record<string, RegExp[]>>;
133
131
  private getArgs;
134
132
  doGenerate(options: Parameters<LanguageModelV2['doGenerate']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>>;
135
133
  doStream(options: Parameters<LanguageModelV2['doStream']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>>;
@@ -179,10 +177,13 @@ type OpenAICompatibleCompletionConfig = {
179
177
  }) => string;
180
178
  fetch?: FetchFunction;
181
179
  errorStructure?: ProviderErrorStructure<any>;
180
+ /**
181
+ * The supported URLs for the model.
182
+ */
183
+ getSupportedUrls?: () => Promise<Record<string, RegExp[]>>;
182
184
  };
183
185
  declare class OpenAICompatibleCompletionLanguageModel implements LanguageModelV2 {
184
186
  readonly specificationVersion = "v2";
185
- readonly defaultObjectGenerationMode: undefined;
186
187
  readonly modelId: OpenAICompatibleCompletionModelId;
187
188
  private readonly config;
188
189
  private readonly failedResponseHandler;
@@ -190,6 +191,7 @@ declare class OpenAICompatibleCompletionLanguageModel implements LanguageModelV2
190
191
  constructor(modelId: OpenAICompatibleCompletionModelId, config: OpenAICompatibleCompletionConfig);
191
192
  get provider(): string;
192
193
  private get providerOptionsName();
194
+ getSupportedUrls(): Promise<Record<string, RegExp[]>>;
193
195
  private getArgs;
194
196
  doGenerate(options: Parameters<LanguageModelV2['doGenerate']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>>;
195
197
  doStream(options: Parameters<LanguageModelV2['doStream']>[0]): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>>;
package/dist/index.js CHANGED
@@ -266,15 +266,16 @@ var OpenAICompatibleChatLanguageModel = class {
266
266
  this.failedResponseHandler = (0, import_provider_utils.createJsonErrorResponseHandler)(errorStructure);
267
267
  this.supportsStructuredOutputs = (_b = config.supportsStructuredOutputs) != null ? _b : false;
268
268
  }
269
- get defaultObjectGenerationMode() {
270
- return this.config.defaultObjectGenerationMode;
271
- }
272
269
  get provider() {
273
270
  return this.config.provider;
274
271
  }
275
272
  get providerOptionsName() {
276
273
  return this.config.provider.split(".")[0].trim();
277
274
  }
275
+ async getSupportedUrls() {
276
+ var _a, _b, _c;
277
+ return (_c = (_b = (_a = this.config).getSupportedUrls) == null ? void 0 : _b.call(_a)) != null ? _c : {};
278
+ }
278
279
  getArgs({
279
280
  prompt,
280
281
  maxOutputTokens,
@@ -376,16 +377,39 @@ var OpenAICompatibleChatLanguageModel = class {
376
377
  abortSignal: options.abortSignal,
377
378
  fetch: this.config.fetch
378
379
  });
379
- const { messages: rawPrompt, ...rawSettings } = args;
380
380
  const choice = responseBody.choices[0];
381
+ const content = [];
382
+ const text = choice.message.content;
383
+ if (text != null && text.length > 0) {
384
+ content.push({ type: "text", text });
385
+ }
386
+ const reasoning = choice.message.reasoning_content;
387
+ if (reasoning != null && reasoning.length > 0) {
388
+ content.push({
389
+ type: "reasoning",
390
+ reasoningType: "text",
391
+ text: reasoning
392
+ });
393
+ }
394
+ if (choice.message.tool_calls != null) {
395
+ for (const toolCall of choice.message.tool_calls) {
396
+ content.push({
397
+ type: "tool-call",
398
+ toolCallType: "function",
399
+ toolCallId: (_a = toolCall.id) != null ? _a : (0, import_provider_utils.generateId)(),
400
+ toolName: toolCall.function.name,
401
+ args: toolCall.function.arguments
402
+ });
403
+ }
404
+ }
381
405
  const providerMetadata = {
382
406
  [this.providerOptionsName]: {},
383
- ...(_b = (_a = this.config.metadataExtractor) == null ? void 0 : _a.extractMetadata) == null ? void 0 : _b.call(_a, {
407
+ ...(_c = (_b = this.config.metadataExtractor) == null ? void 0 : _b.extractMetadata) == null ? void 0 : _c.call(_b, {
384
408
  parsedBody: rawResponse
385
409
  })
386
410
  };
387
- const completionTokenDetails = (_c = responseBody.usage) == null ? void 0 : _c.completion_tokens_details;
388
- const promptTokenDetails = (_d = responseBody.usage) == null ? void 0 : _d.prompt_tokens_details;
411
+ const completionTokenDetails = (_d = responseBody.usage) == null ? void 0 : _d.completion_tokens_details;
412
+ const promptTokenDetails = (_e = responseBody.usage) == null ? void 0 : _e.prompt_tokens_details;
389
413
  if ((completionTokenDetails == null ? void 0 : completionTokenDetails.reasoning_tokens) != null) {
390
414
  providerMetadata[this.providerOptionsName].reasoningTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.reasoning_tokens;
391
415
  }
@@ -399,24 +423,7 @@ var OpenAICompatibleChatLanguageModel = class {
399
423
  providerMetadata[this.providerOptionsName].cachedPromptTokens = promptTokenDetails == null ? void 0 : promptTokenDetails.cached_tokens;
400
424
  }
401
425
  return {
402
- text: choice.message.content != null ? { type: "text", text: choice.message.content } : void 0,
403
- reasoning: choice.message.reasoning_content ? [
404
- {
405
- type: "reasoning",
406
- reasoningType: "text",
407
- text: choice.message.reasoning_content
408
- }
409
- ] : void 0,
410
- toolCalls: (_e = choice.message.tool_calls) == null ? void 0 : _e.map((toolCall) => {
411
- var _a2;
412
- return {
413
- type: "tool-call",
414
- toolCallType: "function",
415
- toolCallId: (_a2 = toolCall.id) != null ? _a2 : (0, import_provider_utils.generateId)(),
416
- toolName: toolCall.function.name,
417
- args: toolCall.function.arguments
418
- };
419
- }),
426
+ content,
420
427
  finishReason: mapOpenAICompatibleFinishReason(choice.finish_reason),
421
428
  usage: {
422
429
  inputTokens: (_g = (_f = responseBody.usage) == null ? void 0 : _f.prompt_tokens) != null ? _g : void 0,
@@ -473,6 +480,9 @@ var OpenAICompatibleChatLanguageModel = class {
473
480
  return {
474
481
  stream: response.pipeThrough(
475
482
  new TransformStream({
483
+ start(controller) {
484
+ controller.enqueue({ type: "stream-start", warnings });
485
+ },
476
486
  // TODO we lost type safety on Chunk, most likely due to the error schema. MUST FIX
477
487
  transform(chunk, controller) {
478
488
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
@@ -653,8 +663,7 @@ var OpenAICompatibleChatLanguageModel = class {
653
663
  })
654
664
  ),
655
665
  request: { body },
656
- response: { headers: responseHeaders },
657
- warnings
666
+ response: { headers: responseHeaders }
658
667
  };
659
668
  }
660
669
  };
@@ -711,7 +720,7 @@ var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_zod3.z.union
711
720
  import_zod3.z.object({
712
721
  index: import_zod3.z.number(),
713
722
  id: import_zod3.z.string().nullish(),
714
- type: import_zod3.z.literal("function").optional(),
723
+ type: import_zod3.z.literal("function").nullish(),
715
724
  function: import_zod3.z.object({
716
725
  name: import_zod3.z.string().nullish(),
717
726
  arguments: import_zod3.z.string().nullish()
@@ -840,7 +849,6 @@ var OpenAICompatibleCompletionLanguageModel = class {
840
849
  // type inferred via constructor
841
850
  constructor(modelId, config) {
842
851
  this.specificationVersion = "v2";
843
- this.defaultObjectGenerationMode = void 0;
844
852
  var _a;
845
853
  this.modelId = modelId;
846
854
  this.config = config;
@@ -856,6 +864,10 @@ var OpenAICompatibleCompletionLanguageModel = class {
856
864
  get providerOptionsName() {
857
865
  return this.config.provider.split(".")[0].trim();
858
866
  }
867
+ async getSupportedUrls() {
868
+ var _a, _b, _c;
869
+ return (_c = (_b = (_a = this.config).getSupportedUrls) == null ? void 0 : _b.call(_a)) != null ? _c : {};
870
+ }
859
871
  getArgs({
860
872
  inputFormat,
861
873
  prompt,
@@ -944,8 +956,12 @@ var OpenAICompatibleCompletionLanguageModel = class {
944
956
  fetch: this.config.fetch
945
957
  });
946
958
  const choice = response.choices[0];
959
+ const content = [];
960
+ if (choice.text != null && choice.text.length > 0) {
961
+ content.push({ type: "text", text: choice.text });
962
+ }
947
963
  return {
948
- text: { type: "text", text: choice.text },
964
+ content,
949
965
  usage: {
950
966
  inputTokens: (_b = (_a = response.usage) == null ? void 0 : _a.prompt_tokens) != null ? _b : void 0,
951
967
  outputTokens: (_d = (_c = response.usage) == null ? void 0 : _c.completion_tokens) != null ? _d : void 0
@@ -989,6 +1005,9 @@ var OpenAICompatibleCompletionLanguageModel = class {
989
1005
  return {
990
1006
  stream: response.pipeThrough(
991
1007
  new TransformStream({
1008
+ start(controller) {
1009
+ controller.enqueue({ type: "stream-start", warnings });
1010
+ },
992
1011
  transform(chunk, controller) {
993
1012
  var _a, _b;
994
1013
  if (!chunk.success) {
@@ -1036,8 +1055,7 @@ var OpenAICompatibleCompletionLanguageModel = class {
1036
1055
  })
1037
1056
  ),
1038
1057
  request: { body },
1039
- response: { headers: responseHeaders },
1040
- warnings
1058
+ response: { headers: responseHeaders }
1041
1059
  };
1042
1060
  }
1043
1061
  };
@@ -1283,10 +1301,10 @@ function createOpenAICompatible(options) {
1283
1301
  fetch: options.fetch
1284
1302
  });
1285
1303
  const createLanguageModel = (modelId) => createChatModel(modelId);
1286
- const createChatModel = (modelId) => new OpenAICompatibleChatLanguageModel(modelId, {
1287
- ...getCommonModelConfig("chat"),
1288
- defaultObjectGenerationMode: "tool"
1289
- });
1304
+ const createChatModel = (modelId) => new OpenAICompatibleChatLanguageModel(
1305
+ modelId,
1306
+ getCommonModelConfig("chat")
1307
+ );
1290
1308
  const createCompletionModel = (modelId) => new OpenAICompatibleCompletionLanguageModel(
1291
1309
  modelId,
1292
1310
  getCommonModelConfig("completion")