{"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":[]}