{"version":3,"file":"embeddings.cjs","names":["Embeddings","Ollama"],"sources":["../src/embeddings.ts"],"sourcesContent":["import { Embeddings, EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore CJS type resolution workaround\nimport { Ollama } from \"ollama/browser\";\nimport type { Options as OllamaOptions } from \"ollama\";\nimport { OllamaCamelCaseOptions } from \"./types.js\";\n\n/**\n * Interface for OllamaEmbeddings parameters. Extends EmbeddingsParams and\n * defines additional parameters specific to the OllamaEmbeddings class.\n */\nexport interface OllamaEmbeddingsParams extends EmbeddingsParams {\n  /**\n   * The Ollama model to use for embeddings.\n   * @default \"mxbai-embed-large\"\n   */\n  model?: string;\n\n  /**\n   * Base URL of the Ollama server.\n   * Defaults to `OLLAMA_BASE_URL` if set.\n   * @default \"http://localhost:11434\"\n   */\n  baseUrl?: string;\n\n  /**\n   * The number of dimensions for the embeddings.\n   */\n  dimensions?: number;\n\n  /**\n   * Defaults to \"5m\"\n   */\n  keepAlive?: string | number;\n\n  /**\n   * Whether or not to truncate the input text to fit inside the model's\n   * context window.\n   * @default false\n   */\n  truncate?: boolean;\n\n  /**\n   * Optional HTTP Headers to include in the request.\n   */\n  headers?: Headers | Record<string, string>;\n\n  /**\n   * Advanced Ollama API request parameters in camelCase, see\n   * https://github.com/ollama/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values\n   * for details of the available parameters.\n   */\n  requestOptions?: OllamaCamelCaseOptions & Partial<OllamaOptions>;\n\n  /**\n   * The fetch function to use.\n   * @default fetch\n   */\n  fetch?: typeof fetch;\n}\n\nexport class OllamaEmbeddings extends Embeddings {\n  model = \"mxbai-embed-large\";\n\n  baseUrl = \"http://localhost:11434\";\n\n  dimensions?: number;\n\n  keepAlive?: string | number;\n\n  requestOptions?: Partial<OllamaOptions>;\n\n  client: Ollama;\n\n  truncate = false;\n\n  constructor(fields?: OllamaEmbeddingsParams) {\n    super({ maxConcurrency: 1, ...fields });\n\n    this.baseUrl =\n      fields?.baseUrl ??\n      getEnvironmentVariable(\"OLLAMA_BASE_URL\") ??\n      this.baseUrl;\n    this.client = new Ollama({\n      fetch: fields?.fetch,\n      host: this.baseUrl,\n      headers: fields?.headers ? new Headers(fields.headers) : undefined,\n    });\n\n    this.model = fields?.model ?? this.model;\n    this.dimensions = fields?.dimensions;\n    this.keepAlive = fields?.keepAlive;\n    this.truncate = fields?.truncate ?? this.truncate;\n    this.requestOptions = fields?.requestOptions\n      ? this._convertOptions(fields?.requestOptions)\n      : undefined;\n  }\n\n  /** convert camelCased Ollama request options like \"useMMap\" to\n   * the snake_cased equivalent which the ollama API actually uses.\n   * Used only for consistency with the llms/Ollama and chatModels/Ollama classes\n   */\n  _convertOptions(\n    requestOptions: OllamaCamelCaseOptions\n  ): Partial<OllamaOptions> {\n    const snakeCasedOptions: Partial<OllamaOptions> = {};\n    const mapping: Record<keyof OllamaCamelCaseOptions, string> = {\n      embeddingOnly: \"embedding_only\",\n      frequencyPenalty: \"frequency_penalty\",\n      keepAlive: \"keep_alive\",\n      logitsAll: \"logits_all\",\n      lowVram: \"low_vram\",\n      mainGpu: \"main_gpu\",\n      mirostat: \"mirostat\",\n      mirostatEta: \"mirostat_eta\",\n      mirostatTau: \"mirostat_tau\",\n      numBatch: \"num_batch\",\n      numCtx: \"num_ctx\",\n      numGpu: \"num_gpu\",\n      numKeep: \"num_keep\",\n      numPredict: \"num_predict\",\n      numThread: \"num_thread\",\n      penalizeNewline: \"penalize_newline\",\n      presencePenalty: \"presence_penalty\",\n      repeatLastN: \"repeat_last_n\",\n      repeatPenalty: \"repeat_penalty\",\n      temperature: \"temperature\",\n      stop: \"stop\",\n      tfsZ: \"tfs_z\",\n      topK: \"top_k\",\n      topP: \"top_p\",\n      typicalP: \"typical_p\",\n      useMlock: \"use_mlock\",\n      useMmap: \"use_mmap\",\n      vocabOnly: \"vocab_only\",\n      f16Kv: \"f16_kv\",\n      numa: \"numa\",\n      seed: \"seed\",\n    };\n\n    for (const [key, value] of Object.entries(requestOptions)) {\n      const snakeCasedOption = mapping[key as keyof OllamaCamelCaseOptions];\n      if (snakeCasedOption) {\n        snakeCasedOptions[snakeCasedOption as keyof OllamaOptions] = value;\n      } else {\n        // Just pass unknown options through\n        snakeCasedOptions[key as keyof OllamaOptions] = value;\n      }\n    }\n    return snakeCasedOptions;\n  }\n\n  async embedDocuments(texts: string[]): Promise<number[][]> {\n    return this.embeddingWithRetry(texts);\n  }\n\n  async embedQuery(text: string) {\n    return (await this.embeddingWithRetry([text]))[0];\n  }\n\n  private async embeddingWithRetry(texts: string[]): Promise<number[][]> {\n    const res = await this.caller.call(() =>\n      this.client.embed({\n        model: this.model,\n        input: texts,\n        dimensions: this.dimensions,\n        keep_alive: this.keepAlive,\n        options: this.requestOptions,\n        truncate: this.truncate,\n      })\n    );\n    return res.embeddings;\n  }\n}\n"],"mappings":";;;;;AA8DA,IAAa,mBAAb,cAAsCA,sCAAW;CAC/C,QAAQ;CAER,UAAU;CAEV;CAEA;CAEA;CAEA;CAEA,WAAW;CAEX,YAAY,QAAiC;AAC3C,QAAM;GAAE,gBAAgB;GAAG,GAAG;GAAQ,CAAC;AAEvC,OAAK,UACH,QAAQ,iEACe,kBAAkB,IACzC,KAAK;AACP,OAAK,SAAS,IAAIC,sBAAO;GACvB,OAAO,QAAQ;GACf,MAAM,KAAK;GACX,SAAS,QAAQ,UAAU,IAAI,QAAQ,OAAO,QAAQ,GAAG;GAC1D,CAAC;AAEF,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,aAAa,QAAQ;AAC1B,OAAK,YAAY,QAAQ;AACzB,OAAK,WAAW,QAAQ,YAAY,KAAK;AACzC,OAAK,iBAAiB,QAAQ,iBAC1B,KAAK,gBAAgB,QAAQ,eAAe,GAC5C;;;;;;CAON,gBACE,gBACwB;EACxB,MAAM,oBAA4C,EAAE;EACpD,MAAM,UAAwD;GAC5D,eAAe;GACf,kBAAkB;GAClB,WAAW;GACX,WAAW;GACX,SAAS;GACT,SAAS;GACT,UAAU;GACV,aAAa;GACb,aAAa;GACb,UAAU;GACV,QAAQ;GACR,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,WAAW;GACX,iBAAiB;GACjB,iBAAiB;GACjB,aAAa;GACb,eAAe;GACf,aAAa;GACb,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,SAAS;GACT,WAAW;GACX,OAAO;GACP,MAAM;GACN,MAAM;GACP;AAED,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,eAAe,EAAE;GACzD,MAAM,mBAAmB,QAAQ;AACjC,OAAI,iBACF,mBAAkB,oBAA2C;OAG7D,mBAAkB,OAA8B;;AAGpD,SAAO;;CAGT,MAAM,eAAe,OAAsC;AACzD,SAAO,KAAK,mBAAmB,MAAM;;CAGvC,MAAM,WAAW,MAAc;AAC7B,UAAQ,MAAM,KAAK,mBAAmB,CAAC,KAAK,CAAC,EAAE;;CAGjD,MAAc,mBAAmB,OAAsC;AAWrE,UAVY,MAAM,KAAK,OAAO,WAC5B,KAAK,OAAO,MAAM;GAChB,OAAO,KAAK;GACZ,OAAO;GACP,YAAY,KAAK;GACjB,YAAY,KAAK;GACjB,SAAS,KAAK;GACd,UAAU,KAAK;GAChB,CAAC,CACH,EACU"}