jina-ai-provider
Version:
Jina AI Provider for running Jina AI models with Vercel AI SDK
1 lines • 10.8 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/jina-provider.ts","../src/jina-embedding-model.ts","../src/jina-error.ts"],"sourcesContent":["export { createJina, jina } from './jina-provider';\nexport type {\n JinaProvider,\n JinaProviderSettings,\n MultimodalEmbeddingInput,\n} from './jina-provider';\n","import type {\n EmbeddingModelV1,\n LanguageModelV1,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n JinaEmbeddingModel,\n type MultimodalEmbeddingInput,\n type TextEmbeddingInput,\n} from './jina-embedding-model';\nimport type {\n JinaEmbeddingModelId,\n JinaEmbeddingSettings,\n} from './jina-embedding-settings';\n\nexport interface JinaProvider extends ProviderV1 {\n /**\n * Create a text embedding model for string inputs only.\n * This ensures type safety by only allowing string arrays.\n * @param modelId - The Jina model ID\n * @param settings - Optional model settings\n */\n textEmbeddingModel(\n modelId: JinaEmbeddingModelId,\n settings?: JinaEmbeddingSettings,\n ): EmbeddingModelV1<string>;\n\n /**\n * Create a multimodal embedding model for MultimodalEmbeddingInput only.\n * This ensures type safety by only allowing MultimodalEmbeddingInput arrays.\n * @param modelId - The Jina model ID\n * @param settings - Optional model settings\n */\n multiModalEmbeddingModel(\n modelId: JinaEmbeddingModelId,\n settings?: JinaEmbeddingSettings,\n ): EmbeddingModelV1<MultimodalEmbeddingInput>;\n}\n\nexport interface JinaProviderSettings {\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers.\n * The default prefix is `https://api.jina.ai/v1`.\n */\n baseURL?: string;\n\n /**\n * API key that is being send using the `Authorization` header.\n * It defaults to the `JINA_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\nexport function createJina(options: JinaProviderSettings = {}): JinaProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'https://api.jina.ai/v1';\n\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'JINA_API_KEY',\n description: 'Jina',\n })}`,\n ...options.headers,\n });\n\n const createTextEmbeddingModel = (\n modelId: JinaEmbeddingModelId,\n settings: JinaEmbeddingSettings = {},\n ) =>\n new JinaEmbeddingModel<TextEmbeddingInput>(modelId, settings, {\n provider: 'jina.text.embedding',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createMultiModalEmbeddingModel = (\n modelId: JinaEmbeddingModelId,\n settings: JinaEmbeddingSettings = {},\n ) =>\n new JinaEmbeddingModel<MultimodalEmbeddingInput>(modelId, settings, {\n provider: 'jina.multimodal.embedding',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (\n modelId: JinaEmbeddingModelId,\n settings?: JinaEmbeddingSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Jina model function cannot be called with the new keyword.',\n );\n }\n\n return createTextEmbeddingModel(modelId, settings);\n };\n\n provider.textEmbeddingModel = createTextEmbeddingModel;\n provider.multiModalEmbeddingModel = createMultiModalEmbeddingModel;\n\n provider.languageModel = (modelId: string): LanguageModelV1 => {\n throw new Error(\n `Language model '${modelId}' is not supported by Jina provider.`,\n );\n };\n return provider as JinaProvider;\n}\n\nexport const jina = createJina();\n\nexport type {\n MultimodalEmbeddingInput,\n JinaEmbeddingModelId,\n JinaEmbeddingSettings,\n};\n","import {\n type EmbeddingModelV1,\n TooManyEmbeddingValuesForCallError,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n type FetchFunction,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nimport type {\n JinaEmbeddingModelId,\n JinaEmbeddingSettings,\n} from '@/jina-embedding-settings';\nimport { voyageFailedResponseHandler } from '@/jina-error';\n\ntype JinaEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport type TextEmbeddingInput = string;\n\nexport type MultimodalEmbeddingInput = {\n text?: string;\n image?: string;\n};\n\nexport class JinaEmbeddingModel<T> implements EmbeddingModelV1<T> {\n readonly specificationVersion = 'v1' as const;\n readonly modelId: JinaEmbeddingModelId;\n\n private readonly config: JinaEmbeddingConfig;\n private readonly settings: JinaEmbeddingSettings;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxEmbeddingsPerCall(): number {\n return 2048;\n }\n\n get supportsParallelCalls(): boolean {\n return false;\n }\n\n constructor(\n modelId: JinaEmbeddingModelId,\n settings: JinaEmbeddingSettings,\n config: JinaEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n }: Parameters<EmbeddingModelV1<T>['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV1<T>['doEmbed']>>\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 { responseHeaders, value: response } = await postJsonToApi({\n abortSignal,\n body: {\n model: this.modelId,\n input: values,\n task: this.settings.inputType,\n embedding_type: this.settings.embeddingType,\n dimensions: this.settings.outputDimension,\n normalized: this.settings.normalized ?? true,\n late_chunking: this.settings.lateChunking,\n truncate: this.settings.truncate ?? false,\n },\n failedResponseHandler: voyageFailedResponseHandler,\n fetch: this.config.fetch,\n headers: combineHeaders(this.config.headers(), headers),\n successfulResponseHandler: createJsonResponseHandler(\n jinaEmbeddingResponseSchema,\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 rawResponse: { headers: responseHeaders },\n };\n }\n}\n\nconst jinaEmbeddingResponseSchema = z.object({\n data: z.array(\n z.object({\n object: z.literal('embedding'),\n embedding: z.array(z.number()),\n index: z.number().optional(),\n }),\n ),\n usage: z\n .object({\n total_tokens: z.number(),\n prompt_tokens: z.number().optional(),\n })\n .nullish(),\n model: z.string().optional(),\n});\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst voyageErrorDataSchema = 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 VoyageErrorData = z.infer<typeof voyageErrorDataSchema>;\n\nexport const voyageFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: voyageErrorDataSchema,\n errorToMessage: (data) => data.error.message,\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAAA,yBAIO;;;ACTP,sBAGO;AACP,IAAAC,yBAKO;AACP,IAAAC,cAAkB;;;ACVlB,4BAA+C;AAC/C,iBAAkB;AAElB,IAAM,wBAAwB,aAAE,OAAO;AAAA,EACrC,OAAO,aAAE,OAAO;AAAA,IACd,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,SAAS,aAAE,OAAO;AAAA,IAClB,OAAO,aAAE,IAAI,EAAE,SAAS;AAAA,IACxB,MAAM,aAAE,OAAO;AAAA,EACjB,CAAC;AACH,CAAC;AAIM,IAAM,kCAA8B,sDAA+B;AAAA,EACxE,aAAa;AAAA,EACb,gBAAgB,CAAC,SAAS,KAAK,MAAM;AACvC,CAAC;;;ADeM,IAAM,qBAAN,MAA2D;AAAA,EACvD,uBAAuB;AAAA,EACvB;AAAA,EAEQ;AAAA,EACA;AAAA,EAEjB,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,uBAA+B;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,wBAAiC;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,YACE,SACA,UACA,QACA;AACA,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAEE;AACA,QAAI,OAAO,SAAS,KAAK,sBAAsB;AAC7C,YAAM,IAAI,mDAAmC;AAAA,QAC3C,sBAAsB,KAAK;AAAA,QAC3B,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,UAAM,sCAAc;AAAA,MAC/D;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,MAAM,KAAK,SAAS;AAAA,QACpB,gBAAgB,KAAK,SAAS;AAAA,QAC9B,YAAY,KAAK,SAAS;AAAA,QAC1B,YAAY,KAAK,SAAS,cAAc;AAAA,QACxC,eAAe,KAAK,SAAS;AAAA,QAC7B,UAAU,KAAK,SAAS,YAAY;AAAA,MACtC;AAAA,MACA,uBAAuB;AAAA,MACvB,OAAO,KAAK,OAAO;AAAA,MACnB,aAAS,uCAAe,KAAK,OAAO,QAAQ,GAAG,OAAO;AAAA,MACtD,+BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,IAC7B,CAAC;AAED,WAAO;AAAA,MACL,YAAY,SAAS,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS;AAAA,MACtD,OAAO,SAAS,QACZ,EAAE,QAAQ,SAAS,MAAM,aAAa,IACtC;AAAA,MACJ,aAAa,EAAE,SAAS,gBAAgB;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAC3C,MAAM,cAAE;AAAA,IACN,cAAE,OAAO;AAAA,MACP,QAAQ,cAAE,QAAQ,WAAW;AAAA,MAC7B,WAAW,cAAE,MAAM,cAAE,OAAO,CAAC;AAAA,MAC7B,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EACA,OAAO,cACJ,OAAO;AAAA,IACN,cAAc,cAAE,OAAO;AAAA,IACvB,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,EACrC,CAAC,EACA,QAAQ;AAAA,EACX,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;;;ADtDM,SAAS,WAAW,UAAgC,CAAC,GAAiB;AAC3E,QAAM,cACJ,6CAAqB,QAAQ,OAAO,KAAK;AAE3C,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,cAAU,mCAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,2BAA2B,CAC/B,SACA,WAAkC,CAAC,MAEnC,IAAI,mBAAuC,SAAS,UAAU;AAAA,IAC5D,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,iCAAiC,CACrC,SACA,WAAkC,CAAC,MAEnC,IAAI,mBAA6C,SAAS,UAAU;AAAA,IAClE,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,WAAW,SACf,SACA,UACA;AACA,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,yBAAyB,SAAS,QAAQ;AAAA,EACnD;AAEA,WAAS,qBAAqB;AAC9B,WAAS,2BAA2B;AAEpC,WAAS,gBAAgB,CAAC,YAAqC;AAC7D,UAAM,IAAI;AAAA,MACR,mBAAmB,OAAO;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,OAAO,WAAW;","names":["import_provider_utils","import_provider_utils","import_zod"]}