@ai-sdk/baseten 2.1.32 → 2.1.35

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,32 @@
1
1
  # @ai-sdk/baseten
2
2
 
3
+ ## 2.1.35
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [af9597b]
8
+ - Updated dependencies [bc49f78]
9
+ - @ai-sdk/provider-utils@5.0.49
10
+ - @ai-sdk/openai-compatible@3.0.57
11
+
12
+ ## 2.1.34
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [be877ff]
17
+ - @ai-sdk/provider-utils@5.0.48
18
+ - @ai-sdk/openai-compatible@3.0.56
19
+
20
+ ## 2.1.33
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies [fe07867]
25
+ - Updated dependencies [a4b0940]
26
+ - Updated dependencies [771e74b]
27
+ - @ai-sdk/provider-utils@5.0.47
28
+ - @ai-sdk/openai-compatible@3.0.55
29
+
3
30
  ## 2.1.32
4
31
 
5
32
  ### Patch Changes
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  import { z } from "zod/v4";
15
15
 
16
16
  // src/version.ts
17
- var VERSION = true ? "2.1.32" : "0.0.0-test";
17
+ var VERSION = true ? "2.1.35" : "0.0.0-test";
18
18
 
19
19
  // src/baseten-provider.ts
20
20
  var MAX_EMBEDDINGS_PER_CALL = 128;
@@ -36,8 +36,7 @@ var basetenErrorStructure = {
36
36
  };
37
37
  var defaultBaseURL = "https://inference.baseten.co/v1";
38
38
  function createBaseten(options = {}) {
39
- var _a;
40
- const baseURL = withoutTrailingSlash((_a = options.baseURL) != null ? _a : defaultBaseURL);
39
+ const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);
41
40
  const getHeaders = () => withUserAgentSuffix(
42
41
  {
43
42
  Authorization: `Bearer ${loadApiKey({
@@ -52,7 +51,7 @@ function createBaseten(options = {}) {
52
51
  const getCommonModelConfig = (modelType, customURL) => ({
53
52
  provider: `baseten.${modelType}`,
54
53
  url: ({ path }) => {
55
- if (modelType === "embedding" && (customURL == null ? void 0 : customURL.includes("/sync")) && !(customURL == null ? void 0 : customURL.includes("/sync/v1"))) {
54
+ if (modelType === "embedding" && customURL?.includes("/sync") && !customURL?.includes("/sync/v1")) {
56
55
  return `${customURL}/v1${path}`;
57
56
  }
58
57
  return `${customURL || baseURL}${path}`;
@@ -64,7 +63,7 @@ function createBaseten(options = {}) {
64
63
  const customURL = options.modelURL;
65
64
  if (customURL) {
66
65
  if (customURL.includes("/sync/v1")) {
67
- return new OpenAICompatibleChatLanguageModel(modelId != null ? modelId : "placeholder", {
66
+ return new OpenAICompatibleChatLanguageModel(modelId ?? "placeholder", {
68
67
  ...getCommonModelConfig("chat", customURL),
69
68
  errorStructure: basetenErrorStructure,
70
69
  // Or stream_options.include_usage is omitted and streams report no usage.
@@ -77,7 +76,7 @@ function createBaseten(options = {}) {
77
76
  );
78
77
  }
79
78
  }
80
- return new OpenAICompatibleChatLanguageModel(modelId != null ? modelId : "chat", {
79
+ return new OpenAICompatibleChatLanguageModel(modelId ?? "chat", {
81
80
  ...getCommonModelConfig("chat"),
82
81
  errorStructure: basetenErrorStructure,
83
82
  includeUsage: true,
@@ -96,7 +95,7 @@ function createBaseten(options = {}) {
96
95
  "Not supported. You must use a /sync or /sync/v1 endpoint for embeddings."
97
96
  );
98
97
  }
99
- const model = new OpenAICompatibleEmbeddingModel(modelId != null ? modelId : "embeddings", {
98
+ const model = new OpenAICompatibleEmbeddingModel(modelId ?? "embeddings", {
100
99
  ...getCommonModelConfig("embedding", customURL),
101
100
  errorStructure: basetenErrorStructure,
102
101
  // Over HTTP, cap each request and let `embedMany` split and parallelise.
@@ -116,20 +115,19 @@ function createBaseten(options = {}) {
116
115
  })
117
116
  );
118
117
  model.doEmbed = async (params) => {
119
- var _a2;
120
118
  if (!params.values || !Array.isArray(params.values)) {
121
119
  throw new Error("params.values must be an array of strings");
122
120
  }
123
121
  const response = await performanceClient.embed(
124
122
  params.values,
125
123
  // model_id is for Model APIs; dedicated deployments ignore it.
126
- modelId != null ? modelId : "embeddings"
124
+ modelId ?? "embeddings"
127
125
  );
128
126
  return {
129
127
  embeddings: response.data.map((item) => item.embedding),
130
128
  // The native client types its response as `any`; only report usage when
131
129
  // a token count is actually present rather than `{ tokens: undefined }`.
132
- usage: typeof ((_a2 = response.usage) == null ? void 0 : _a2.total_tokens) === "number" ? { tokens: response.usage.total_tokens } : void 0,
130
+ usage: typeof response.usage?.total_tokens === "number" ? { tokens: response.usage.total_tokens } : void 0,
133
131
  response: { headers: {}, body: response },
134
132
  warnings: []
135
133
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/baseten-provider.ts","../src/version.ts"],"sourcesContent":["import {\n OpenAICompatibleChatLanguageModel,\n OpenAICompatibleEmbeddingModel,\n type ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport {\n NoSuchModelError,\n type EmbeddingModelV4,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { BasetenChatModelId } from './baseten-chat-options';\nimport type { BasetenEmbeddingModelId } from './baseten-embedding-options';\nimport { VERSION } from './version';\n\n/**\n * Baseten's per-request embedding input limit: larger batches are rejected with\n * `413 batch size N > maximum allowed batch size 128`. It is also the native\n * performance client's own default `batchSize`. `embedMany` splits larger\n * inputs into chunks of this size and runs them in parallel.\n */\nconst MAX_EMBEDDINGS_PER_CALL = 128;\n\n/**\n * The part of `@basetenlabs/performance-client` we use, declared structurally to\n * keep that native addon out of our dependency and type graph.\n */\nexport type BasetenPerformanceClient = {\n embed(\n input: string[],\n model: string,\n ): Promise<{\n data: { embedding: number[] }[];\n usage?: { total_tokens?: number };\n }>;\n};\n\nexport type BasetenPerformanceClientConstructor = new (\n baseUrl: string,\n apiKey?: string,\n) => BasetenPerformanceClient;\n\nexport type BasetenErrorData = z.infer<typeof basetenErrorSchema>;\n\n// Baseten returns two different envelopes. The Model APIs send a bare string\n// (`{\"error\":\"please check the model you provided\"}`), while dedicated\n// deployments pass through their server's OpenAI-shaped object. Parsing only\n// the string form left dedicated-deployment errors falling back to the HTTP\n// reason phrase — \"Not Found\", or nothing at all over HTTP/2.\nconst basetenErrorSchema = z.object({\n error: z.union([\n z.string(),\n z.object({\n message: z.string(),\n object: z.string().nullish(),\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n ]),\n});\n\nconst basetenErrorStructure: ProviderErrorStructure<BasetenErrorData> = {\n errorSchema: basetenErrorSchema,\n errorToMessage: data =>\n typeof data.error === 'string' ? data.error : data.error.message,\n};\n\nexport interface BasetenProviderSettings {\n /**\n * Baseten API key. Default value is taken from the `BASETEN_API_KEY`\n * environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the Model APIs. Default: 'https://inference.baseten.co/v1'\n */\n baseURL?: string;\n\n /**\n * Model URL for custom models (chat or embeddings).\n * If not supplied, the default Model APIs will be used.\n */\n modelURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Opt in to Baseten's native performance client for embeddings, for\n * client-side batching and request hedging. Pass the `PerformanceClient`\n * constructor from `@basetenlabs/performance-client`, which you install\n * yourself:\n *\n * ```ts\n * import { PerformanceClient } from '@basetenlabs/performance-client';\n *\n * const baseten = createBaseten({ modelURL, performanceClient: PerformanceClient });\n * ```\n *\n * When omitted, embeddings go over plain HTTP to Baseten's OpenAI-compatible\n * endpoint — the default, since this NAPI addon cannot load in edge runtimes\n * and bundlers cannot resolve its platform binaries.\n */\n performanceClient?: BasetenPerformanceClientConstructor;\n}\n\nexport interface BasetenProvider extends ProviderV4 {\n /**\n * Creates a chat model for text generation.\n */\n (modelId?: BasetenChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId?: BasetenChatModelId): LanguageModelV4;\n\n /**\n * Creates a language model for text generation. Alias for chatModel.\n */\n languageModel(modelId?: BasetenChatModelId): LanguageModelV4;\n\n /**\n * Creates a embedding model for text generation.\n */\n embeddingModel(modelId?: BasetenEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId?: BasetenEmbeddingModelId): EmbeddingModelV4;\n}\n\n// by default, we use the Model APIs\nconst defaultBaseURL = 'https://inference.baseten.co/v1';\n\nexport function createBaseten(\n options: BasetenProviderSettings = {},\n): BasetenProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'BASETEN_API_KEY',\n description: 'Baseten API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/baseten/${VERSION}`,\n );\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n }\n\n const getCommonModelConfig = (\n modelType: string,\n customURL?: string,\n ): CommonModelConfig => ({\n provider: `baseten.${modelType}`,\n url: ({ path }) => {\n // For embeddings with /sync URLs (but not /sync/v1), we need to add /v1\n if (\n modelType === 'embedding' &&\n customURL?.includes('/sync') &&\n !customURL?.includes('/sync/v1')\n ) {\n return `${customURL}/v1${path}`;\n }\n return `${customURL || baseURL}${path}`;\n },\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId?: BasetenChatModelId) => {\n const customURL = options.modelURL;\n if (customURL) {\n if (customURL.includes('/sync/v1')) {\n return new OpenAICompatibleChatLanguageModel(modelId ?? 'placeholder', {\n ...getCommonModelConfig('chat', customURL),\n errorStructure: basetenErrorStructure,\n // Or stream_options.include_usage is omitted and streams report no usage.\n includeUsage: true,\n supportsStructuredOutputs: true,\n });\n } else if (customURL.includes('/predict')) {\n throw new Error(\n 'Not supported. You must use a /sync/v1 endpoint for chat models.',\n );\n }\n }\n\n return new OpenAICompatibleChatLanguageModel(modelId ?? 'chat', {\n ...getCommonModelConfig('chat'),\n errorStructure: basetenErrorStructure,\n includeUsage: true,\n supportsStructuredOutputs: true,\n });\n };\n\n const createEmbeddingModel = (modelId?: BasetenEmbeddingModelId) => {\n const customURL = options.modelURL;\n if (!customURL) {\n throw new Error(\n 'No model URL provided for embeddings. Please set modelURL option for embeddings.',\n );\n }\n\n if (!customURL.includes('/sync')) {\n throw new Error(\n 'Not supported. You must use a /sync or /sync/v1 endpoint for embeddings.',\n );\n }\n\n // BEI embedding deployments are OpenAI-compatible with no extra settings, so\n // plain HTTP is the default and needs no override.\n const model = new OpenAICompatibleEmbeddingModel(modelId ?? 'embeddings', {\n ...getCommonModelConfig('embedding', customURL),\n errorStructure: basetenErrorStructure,\n // Over HTTP, cap each request and let `embedMany` split and parallelise.\n // The native client does its own batching, so let it take everything at\n // once — `embedMany` treats Infinity as \"one call\".\n maxEmbeddingsPerCall: options.performanceClient\n ? Number.POSITIVE_INFINITY\n : MAX_EMBEDDINGS_PER_CALL,\n });\n\n if (!options.performanceClient) {\n return model;\n }\n\n // Opted in to the native client. It appends /v1 itself, so hand it the bare\n // /sync form.\n const performanceClient = new options.performanceClient(\n customURL.replace('/sync/v1', '/sync'),\n loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'BASETEN_API_KEY',\n description: 'Baseten API key',\n }),\n );\n\n model.doEmbed = async params => {\n if (!params.values || !Array.isArray(params.values)) {\n throw new Error('params.values must be an array of strings');\n }\n\n const response = await performanceClient.embed(\n params.values,\n // model_id is for Model APIs; dedicated deployments ignore it.\n modelId ?? 'embeddings',\n );\n\n return {\n embeddings: response.data.map(item => item.embedding),\n // The native client types its response as `any`; only report usage when\n // a token count is actually present rather than `{ tokens: undefined }`.\n usage:\n typeof response.usage?.total_tokens === 'number'\n ? { tokens: response.usage.total_tokens }\n : undefined,\n response: { headers: {}, body: response },\n warnings: [],\n };\n };\n\n return model;\n };\n\n const provider = (modelId?: BasetenChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.chatModel = createChatModel;\n provider.languageModel = createChatModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n return provider;\n}\n\nexport const baseten = createBaseten();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../src/baseten-provider.ts","../src/version.ts"],"sourcesContent":["import {\n OpenAICompatibleChatLanguageModel,\n OpenAICompatibleEmbeddingModel,\n type ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport {\n NoSuchModelError,\n type EmbeddingModelV4,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { BasetenChatModelId } from './baseten-chat-options';\nimport type { BasetenEmbeddingModelId } from './baseten-embedding-options';\nimport { VERSION } from './version';\n\n/**\n * Baseten's per-request embedding input limit: larger batches are rejected with\n * `413 batch size N > maximum allowed batch size 128`. It is also the native\n * performance client's own default `batchSize`. `embedMany` splits larger\n * inputs into chunks of this size and runs them in parallel.\n */\nconst MAX_EMBEDDINGS_PER_CALL = 128;\n\n/**\n * The part of `@basetenlabs/performance-client` we use, declared structurally to\n * keep that native addon out of our dependency and type graph.\n */\nexport type BasetenPerformanceClient = {\n embed(\n input: string[],\n model: string,\n ): Promise<{\n data: { embedding: number[] }[];\n usage?: { total_tokens?: number };\n }>;\n};\n\nexport type BasetenPerformanceClientConstructor = new (\n baseUrl: string,\n apiKey?: string,\n) => BasetenPerformanceClient;\n\nexport type BasetenErrorData = z.infer<typeof basetenErrorSchema>;\n\n// Baseten returns two different envelopes. The Model APIs send a bare string\n// (`{\"error\":\"please check the model you provided\"}`), while dedicated\n// deployments pass through their server's OpenAI-shaped object. Parsing only\n// the string form left dedicated-deployment errors falling back to the HTTP\n// reason phrase — \"Not Found\", or nothing at all over HTTP/2.\nconst basetenErrorSchema = z.object({\n error: z.union([\n z.string(),\n z.object({\n message: z.string(),\n object: z.string().nullish(),\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n ]),\n});\n\nconst basetenErrorStructure: ProviderErrorStructure<BasetenErrorData> = {\n errorSchema: basetenErrorSchema,\n errorToMessage: data =>\n typeof data.error === 'string' ? data.error : data.error.message,\n};\n\nexport interface BasetenProviderSettings {\n /**\n * Baseten API key. Default value is taken from the `BASETEN_API_KEY`\n * environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the Model APIs. Default: 'https://inference.baseten.co/v1'\n */\n baseURL?: string;\n\n /**\n * Model URL for custom models (chat or embeddings).\n * If not supplied, the default Model APIs will be used.\n */\n modelURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Opt in to Baseten's native performance client for embeddings, for\n * client-side batching and request hedging. Pass the `PerformanceClient`\n * constructor from `@basetenlabs/performance-client`, which you install\n * yourself:\n *\n * ```ts\n * import { PerformanceClient } from '@basetenlabs/performance-client';\n *\n * const baseten = createBaseten({ modelURL, performanceClient: PerformanceClient });\n * ```\n *\n * When omitted, embeddings go over plain HTTP to Baseten's OpenAI-compatible\n * endpoint — the default, since this NAPI addon cannot load in edge runtimes\n * and bundlers cannot resolve its platform binaries.\n */\n performanceClient?: BasetenPerformanceClientConstructor;\n}\n\nexport interface BasetenProvider extends ProviderV4 {\n /**\n * Creates a chat model for text generation.\n */\n (modelId?: BasetenChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId?: BasetenChatModelId): LanguageModelV4;\n\n /**\n * Creates a language model for text generation. Alias for chatModel.\n */\n languageModel(modelId?: BasetenChatModelId): LanguageModelV4;\n\n /**\n * Creates a embedding model for text generation.\n */\n embeddingModel(modelId?: BasetenEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId?: BasetenEmbeddingModelId): EmbeddingModelV4;\n}\n\n// by default, we use the Model APIs\nconst defaultBaseURL = 'https://inference.baseten.co/v1';\n\nexport function createBaseten(\n options: BasetenProviderSettings = {},\n): BasetenProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'BASETEN_API_KEY',\n description: 'Baseten API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/baseten/${VERSION}`,\n );\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n }\n\n const getCommonModelConfig = (\n modelType: string,\n customURL?: string,\n ): CommonModelConfig => ({\n provider: `baseten.${modelType}`,\n url: ({ path }) => {\n // For embeddings with /sync URLs (but not /sync/v1), we need to add /v1\n if (\n modelType === 'embedding' &&\n customURL?.includes('/sync') &&\n !customURL?.includes('/sync/v1')\n ) {\n return `${customURL}/v1${path}`;\n }\n return `${customURL || baseURL}${path}`;\n },\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId?: BasetenChatModelId) => {\n const customURL = options.modelURL;\n if (customURL) {\n if (customURL.includes('/sync/v1')) {\n return new OpenAICompatibleChatLanguageModel(modelId ?? 'placeholder', {\n ...getCommonModelConfig('chat', customURL),\n errorStructure: basetenErrorStructure,\n // Or stream_options.include_usage is omitted and streams report no usage.\n includeUsage: true,\n supportsStructuredOutputs: true,\n });\n } else if (customURL.includes('/predict')) {\n throw new Error(\n 'Not supported. You must use a /sync/v1 endpoint for chat models.',\n );\n }\n }\n\n return new OpenAICompatibleChatLanguageModel(modelId ?? 'chat', {\n ...getCommonModelConfig('chat'),\n errorStructure: basetenErrorStructure,\n includeUsage: true,\n supportsStructuredOutputs: true,\n });\n };\n\n const createEmbeddingModel = (modelId?: BasetenEmbeddingModelId) => {\n const customURL = options.modelURL;\n if (!customURL) {\n throw new Error(\n 'No model URL provided for embeddings. Please set modelURL option for embeddings.',\n );\n }\n\n if (!customURL.includes('/sync')) {\n throw new Error(\n 'Not supported. You must use a /sync or /sync/v1 endpoint for embeddings.',\n );\n }\n\n // BEI embedding deployments are OpenAI-compatible with no extra settings, so\n // plain HTTP is the default and needs no override.\n const model = new OpenAICompatibleEmbeddingModel(modelId ?? 'embeddings', {\n ...getCommonModelConfig('embedding', customURL),\n errorStructure: basetenErrorStructure,\n // Over HTTP, cap each request and let `embedMany` split and parallelise.\n // The native client does its own batching, so let it take everything at\n // once — `embedMany` treats Infinity as \"one call\".\n maxEmbeddingsPerCall: options.performanceClient\n ? Number.POSITIVE_INFINITY\n : MAX_EMBEDDINGS_PER_CALL,\n });\n\n if (!options.performanceClient) {\n return model;\n }\n\n // Opted in to the native client. It appends /v1 itself, so hand it the bare\n // /sync form.\n const performanceClient = new options.performanceClient(\n customURL.replace('/sync/v1', '/sync'),\n loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'BASETEN_API_KEY',\n description: 'Baseten API key',\n }),\n );\n\n model.doEmbed = async params => {\n if (!params.values || !Array.isArray(params.values)) {\n throw new Error('params.values must be an array of strings');\n }\n\n const response = await performanceClient.embed(\n params.values,\n // model_id is for Model APIs; dedicated deployments ignore it.\n modelId ?? 'embeddings',\n );\n\n return {\n embeddings: response.data.map(item => item.embedding),\n // The native client types its response as `any`; only report usage when\n // a token count is actually present rather than `{ tokens: undefined }`.\n usage:\n typeof response.usage?.total_tokens === 'number'\n ? { tokens: response.usage.total_tokens }\n : undefined,\n response: { headers: {}, body: response },\n warnings: [],\n };\n };\n\n return model;\n };\n\n const provider = (modelId?: BasetenChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.chatModel = createChatModel;\n provider.languageModel = createChatModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n return provider;\n}\n\nexport const baseten = createBaseten();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,SAAS;;;ACfX,IAAM,UACX,OACI,WACA;;;ADuBN,IAAM,0BAA0B;AA4BhC,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,OAAO,EAAE,MAAM;AAAA,IACb,EAAE,OAAO;AAAA,IACT,EAAE,OAAO;AAAA,MACP,SAAS,EAAE,OAAO;AAAA,MAClB,QAAQ,EAAE,OAAO,EAAE,QAAQ;AAAA,MAC3B,MAAM,EAAE,OAAO,EAAE,QAAQ;AAAA,MACzB,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA,MACvB,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,IAClD,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,IAAM,wBAAkE;AAAA,EACtE,aAAa;AAAA,EACb,gBAAgB,UACd,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK,MAAM;AAC7D;AA6EA,IAAM,iBAAiB;AAEhB,SAAS,cACd,UAAmC,CAAC,GACnB;AACjB,QAAM,UAAU,qBAAqB,QAAQ,WAAW,cAAc;AACtE,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,kBAAkB,OAAO;AAAA,EAC3B;AASF,QAAM,uBAAuB,CAC3B,WACA,eACuB;AAAA,IACvB,UAAU,WAAW,SAAS;AAAA,IAC9B,KAAK,CAAC,EAAE,KAAK,MAAM;AAEjB,UACE,cAAc,eACd,WAAW,SAAS,OAAO,KAC3B,CAAC,WAAW,SAAS,UAAU,GAC/B;AACA,eAAO,GAAG,SAAS,MAAM,IAAI;AAAA,MAC/B;AACA,aAAO,GAAG,aAAa,OAAO,GAAG,IAAI;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,kBAAkB,CAAC,YAAiC;AACxD,UAAM,YAAY,QAAQ;AAC1B,QAAI,WAAW;AACb,UAAI,UAAU,SAAS,UAAU,GAAG;AAClC,eAAO,IAAI,kCAAkC,WAAW,eAAe;AAAA,UACrE,GAAG,qBAAqB,QAAQ,SAAS;AAAA,UACzC,gBAAgB;AAAA;AAAA,UAEhB,cAAc;AAAA,UACd,2BAA2B;AAAA,QAC7B,CAAC;AAAA,MACH,WAAW,UAAU,SAAS,UAAU,GAAG;AACzC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI,kCAAkC,WAAW,QAAQ;AAAA,MAC9D,GAAG,qBAAqB,MAAM;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,uBAAuB,CAAC,YAAsC;AAClE,UAAM,YAAY,QAAQ;AAC1B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,SAAS,OAAO,GAAG;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAIA,UAAM,QAAQ,IAAI,+BAA+B,WAAW,cAAc;AAAA,MACxE,GAAG,qBAAqB,aAAa,SAAS;AAAA,MAC9C,gBAAgB;AAAA;AAAA;AAAA;AAAA,MAIhB,sBAAsB,QAAQ,oBAC1B,OAAO,oBACP;AAAA,IACN,CAAC;AAED,QAAI,CAAC,QAAQ,mBAAmB;AAC9B,aAAO;AAAA,IACT;AAIA,UAAM,oBAAoB,IAAI,QAAQ;AAAA,MACpC,UAAU,QAAQ,YAAY,OAAO;AAAA,MACrC,WAAW;AAAA,QACT,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,OAAM,WAAU;AAC9B,UAAI,CAAC,OAAO,UAAU,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACnD,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAEA,YAAM,WAAW,MAAM,kBAAkB;AAAA,QACvC,OAAO;AAAA;AAAA,QAEP,WAAW;AAAA,MACb;AAEA,aAAO;AAAA,QACL,YAAY,SAAS,KAAK,IAAI,UAAQ,KAAK,SAAS;AAAA;AAAA;AAAA,QAGpD,OACE,OAAO,SAAS,OAAO,iBAAiB,WACpC,EAAE,QAAQ,SAAS,MAAM,aAAa,IACtC;AAAA,QACN,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,SAAS;AAAA,QACxC,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,YAAiC,gBAAgB,OAAO;AAE1E,WAAS,uBAAuB;AAChC,WAAS,YAAY;AACrB,WAAS,gBAAgB;AACzB,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AACA,WAAS,iBAAiB;AAC1B,WAAS,qBAAqB;AAC9B,SAAO;AACT;AAEO,IAAM,UAAU,cAAc;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/baseten",
3
- "version": "2.1.32",
3
+ "version": "2.1.35",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -29,12 +29,12 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/openai-compatible": "3.0.54",
32
+ "@ai-sdk/openai-compatible": "3.0.57",
33
33
  "@ai-sdk/provider": "4.0.18",
34
- "@ai-sdk/provider-utils": "5.0.46"
34
+ "@ai-sdk/provider-utils": "5.0.49"
35
35
  },
36
36
  "devDependencies": {
37
- "@ai-sdk/test-server": "2.0.1",
37
+ "@ai-sdk/test-server": "2.0.2",
38
38
  "@types/node": "22.19.19",
39
39
  "@vercel/ai-tsconfig": "0.0.0",
40
40
  "tsup": "^8.5.1",