genkitx-ollama
Version:
Genkit AI framework plugin for Ollama APIs.
1 lines • 4.53 kB
Source Map (JSON)
{"version":3,"sources":["../src/embeddings.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { Document, EmbedderAction, Genkit } from 'genkit';\nimport type { EmbedRequest, EmbedResponse } from 'ollama';\nimport type { DefineOllamaEmbeddingParams, RequestHeaders } from './types.js';\n\nasync function toOllamaEmbedRequest(\n modelName: string,\n dimensions: number,\n documents: Document[],\n serverAddress: string,\n requestHeaders?: RequestHeaders\n): Promise<{\n url: string;\n requestPayload: EmbedRequest;\n headers: Record<string, string>;\n}> {\n const requestPayload: EmbedRequest = {\n model: modelName,\n input: documents.map((doc) => doc.text),\n };\n\n // Determine headers\n const extraHeaders = requestHeaders\n ? typeof requestHeaders === 'function'\n ? await requestHeaders({\n serverAddress,\n model: {\n name: modelName,\n dimensions,\n },\n embedRequest: requestPayload,\n })\n : requestHeaders\n : {};\n\n const headers = {\n 'Content-Type': 'application/json',\n ...extraHeaders, // Add any dynamic headers\n };\n\n return {\n url: `${serverAddress}/api/embed`,\n requestPayload,\n headers,\n };\n}\n\nexport function defineOllamaEmbedder(\n ai: Genkit,\n { name, modelName, dimensions, options }: DefineOllamaEmbeddingParams\n): EmbedderAction<any> {\n return ai.defineEmbedder(\n {\n name: `ollama/${name}`,\n info: {\n label: 'Ollama Embedding - ' + name,\n dimensions,\n supports: {\n // TODO: do any ollama models support other modalities?\n input: ['text'],\n },\n },\n },\n async (input, config) => {\n const serverAddress = config?.serverAddress || options.serverAddress;\n\n const { url, requestPayload, headers } = await toOllamaEmbedRequest(\n modelName,\n dimensions,\n input,\n serverAddress,\n options.requestHeaders\n );\n\n const response: Response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestPayload),\n });\n\n if (!response.ok) {\n const errMsg = (await response.json()).error?.message || '';\n throw new Error(\n `Error fetching embedding from Ollama: ${response.statusText}. ${errMsg}`\n );\n }\n\n const payload = (await response.json()) as EmbedResponse;\n\n const embeddings: { embedding: number[] }[] = [];\n\n for (const embedding of payload.embeddings) {\n embeddings.push({ embedding });\n }\n return { embeddings };\n }\n );\n}\n"],"mappings":"AAmBA,eAAe,qBACb,WACA,YACA,WACA,eACA,gBAKC;AACD,QAAM,iBAA+B;AAAA,IACnC,OAAO;AAAA,IACP,OAAO,UAAU,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,EACxC;AAGA,QAAM,eAAe,iBACjB,OAAO,mBAAmB,aACxB,MAAM,eAAe;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB,CAAC,IACD,iBACF,CAAC;AAEL,QAAM,UAAU;AAAA,IACd,gBAAgB;AAAA,IAChB,GAAG;AAAA;AAAA,EACL;AAEA,SAAO;AAAA,IACL,KAAK,GAAG,aAAa;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,qBACd,IACA,EAAE,MAAM,WAAW,YAAY,QAAQ,GAClB;AACrB,SAAO,GAAG;AAAA,IACR;AAAA,MACE,MAAM,UAAU,IAAI;AAAA,MACpB,MAAM;AAAA,QACJ,OAAO,wBAAwB;AAAA,QAC/B;AAAA,QACA,UAAU;AAAA;AAAA,UAER,OAAO,CAAC,MAAM;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,OAAO,WAAW;AACvB,YAAM,gBAAgB,QAAQ,iBAAiB,QAAQ;AAEvD,YAAM,EAAE,KAAK,gBAAgB,QAAQ,IAAI,MAAM;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAEA,YAAM,WAAqB,MAAM,MAAM,KAAK;AAAA,QAC1C,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,cAAc;AAAA,MACrC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,UAAU,MAAM,SAAS,KAAK,GAAG,OAAO,WAAW;AACzD,cAAM,IAAI;AAAA,UACR,yCAAyC,SAAS,UAAU,KAAK,MAAM;AAAA,QACzE;AAAA,MACF;AAEA,YAAM,UAAW,MAAM,SAAS,KAAK;AAErC,YAAM,aAAwC,CAAC;AAE/C,iBAAW,aAAa,QAAQ,YAAY;AAC1C,mBAAW,KAAK,EAAE,UAAU,CAAC;AAAA,MAC/B;AACA,aAAO,EAAE,WAAW;AAAA,IACtB;AAAA,EACF;AACF;","names":[]}