mixedbread-ai-provider
Version:
Mixedbread AI Provider for running Mixedbread AI models with Vercel AI SDK
1 lines • 11 kB
Source Map (JSON)
{"version":3,"sources":["../src/mixedbread-provider.ts","../src/mixedbread-embedding-model.ts","../src/mixedbread-error.ts","../src/mixedbread-embedding-options.ts"],"sourcesContent":["import type {\n EmbeddingModelV2,\n ImageModelV2,\n LanguageModelV2,\n ProviderV2,\n} from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { MixedbreadEmbeddingModel } from './mixedbread-embedding-model';\nimport type { MixedbreadEmbeddingModelId } from './mixedbread-embedding-options';\n\nexport interface MixedbreadProvider extends ProviderV2 {\n (modelId: MixedbreadEmbeddingModelId): EmbeddingModelV2<string>;\n\n textEmbeddingModel: (\n modelId: MixedbreadEmbeddingModelId,\n ) => EmbeddingModelV2<string>;\n}\n\nexport interface MixedbreadProviderSettings {\n /**\n Use a different URL prefix for API calls, e.g. to use proxy servers.\n The default prefix is `https://api.mixedbread.com/v1`.\n */\n baseURL?: string;\n\n /**\n API key that is being send using the `Authorization` header.\n It defaults to the `MIXEDBREAD_API_KEY` environment variable.\n */\n apiKey?: string;\n\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/**\n Create a Mixedbread AI provider instance.\n */\nexport function createMixedbread(\n options: MixedbreadProviderSettings = {},\n): MixedbreadProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'https://api.mixedbread.com/v1';\n\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MIXEDBREAD_API_KEY',\n description: 'Mixedbread',\n })}`,\n ...options.headers,\n });\n\n const createEmbeddingModel = (modelId: MixedbreadEmbeddingModelId) =>\n new MixedbreadEmbeddingModel(modelId, {\n provider: 'mixedbread.embedding',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: MixedbreadEmbeddingModelId) {\n if (new.target) {\n throw new Error(\n 'The Mixedbread model function cannot be called with the new keyword.',\n );\n }\n\n return createEmbeddingModel(modelId);\n };\n\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.chat = provider.languageModel = (): LanguageModelV2 => {\n throw new Error('languageModel method is not implemented.');\n };\n provider.imageModel = (): ImageModelV2 => {\n throw new Error('imageModel method is not implemented.');\n };\n\n return provider as MixedbreadProvider;\n}\n\n/**\n Default Mixedbread provider instance.\n */\nexport const mixedbread = createMixedbread();\n","import {\n type EmbeddingModelV2,\n TooManyEmbeddingValuesForCallError,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n type FetchFunction,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nimport { mixedbreadFailedResponseHandler } from '@/mixedbread-error';\nimport {\n mixedbreadEmbeddingOptions,\n type MixedbreadEmbeddingModelId,\n} from './mixedbread-embedding-options';\n\ntype MixedbreadEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class MixedbreadEmbeddingModel implements EmbeddingModelV2<string> {\n readonly specificationVersion = 'v2';\n readonly modelId: MixedbreadEmbeddingModelId;\n\n private readonly config: MixedbreadEmbeddingConfig;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxEmbeddingsPerCall(): number {\n return 256;\n }\n\n get supportsParallelCalls(): boolean {\n return true;\n }\n\n constructor(\n modelId: MixedbreadEmbeddingModelId,\n config: MixedbreadEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n async doEmbed({\n abortSignal,\n values,\n headers,\n providerOptions,\n }: Parameters<EmbeddingModelV2<string>['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV2<string>['doEmbed']>>\n > {\n const embeddingOptions = await parseProviderOptions({\n provider: 'mixedbread',\n providerOptions,\n schema: mixedbreadEmbeddingOptions,\n });\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n modelId: this.modelId,\n provider: this.provider,\n values,\n });\n }\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n abortSignal,\n body: {\n input: values,\n model: this.modelId,\n prompt: embeddingOptions?.prompt,\n normalize: embeddingOptions?.normalized,\n dimensions: embeddingOptions?.dimensions,\n encoding_format: embeddingOptions?.encodingFormat,\n },\n failedResponseHandler: mixedbreadFailedResponseHandler,\n fetch: this.config.fetch,\n headers: combineHeaders(this.config.headers(), headers),\n successfulResponseHandler: createJsonResponseHandler(\n mixedbreadTextEmbeddingResponseSchema,\n ),\n url: `${this.config.baseURL}/embeddings`,\n });\n\n return {\n embeddings: response.data.map((item) => item.embedding),\n usage: response.usage\n ? { tokens: response.usage.total_tokens }\n : undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst mixedbreadTextEmbeddingResponseSchema = z.object({\n data: z.array(z.object({ embedding: z.array(z.number()) })),\n usage: z.object({ total_tokens: z.number() }).nullish(),\n});\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst mixedbreadErrorDataSchema = z.object({\n error: z.object({\n code: z.string().nullable(),\n message: z.string(),\n param: z.any().nullable(),\n type: z.string(),\n }),\n});\n\nexport type MixedbreadErrorData = z.infer<typeof mixedbreadErrorDataSchema>;\n\nexport const mixedbreadFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: mixedbreadErrorDataSchema,\n errorToMessage: (data) => data.error.message,\n});\n","import { z } from 'zod/v4';\n\nexport type MixedbreadEmbeddingModelId =\n | 'mixedbread-ai/deepset-mxbai-embed-de-large-v1'\n | 'mixedbread-ai/mxbai-embed-large-v1'\n | 'mixedbread-ai/mxbai-embed-2d-large-v1'\n // | 'mxbai-colbert-large-v1'\n | (string & NonNullable<unknown>);\n\nexport const mixedbreadEmbeddingOptions = z.object({\n /**\n * An optional prompt to provide context to the model. Refer to the model's documentation for more information.\n * A string between 1 and 256 characters.\n */\n prompt: z.string().optional(),\n\n /**\n * Option to normalize the embeddings.\n */\n normalized: z.boolean().optional(),\n\n /**\n * The desired number of dimensions in the output vectors. Defaults to the model's maximum.\n * A number between 1 and the model's maximum output dimensions.\n * Only applicable for Matryoshka-based models.\n */\n dimensions: z.number().optional(),\n\n /**\n * The desired format for the embeddings. Defaults to \"float\".\n * Options: float, float16, binary, ubinary, int8, uint8, base64.\n */\n encodingFormat: z\n .enum(['float', 'float16', 'binary', 'ubinary', 'int8', 'uint8', 'base64'])\n .optional(),\n});\n\nexport type MixedbreadEmbeddingOptions = z.infer<\n typeof mixedbreadEmbeddingOptions\n>;\n"],"mappings":"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","names":["z","z","z"]}