{"version":3,"file":"llms.cjs","names":["LLM","OllamaClient","GenerationChunk"],"sources":["../src/llms.ts"],"sourcesContent":["import type { BaseLanguageModelCallOptions } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport type { StringWithAutocomplete } from \"@langchain/core/utils/types\";\nimport { LLM, type BaseLLMParams } from \"@langchain/core/language_models/llms\";\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore CJS type resolution workaround\nimport { Ollama as OllamaClient } from \"ollama/browser\";\nimport { OllamaCamelCaseOptions } from \"./types.js\";\n\nexport interface OllamaCallOptions extends BaseLanguageModelCallOptions {\n  images?: string[];\n}\n\nexport interface OllamaInput extends BaseLLMParams, OllamaCamelCaseOptions {\n  /**\n   * The model to use when making requests.\n   * @default \"llama3\"\n   */\n  model?: string;\n  /**\n   * Optionally override the base URL to make request to.\n   * This should only be set if your Ollama instance is being\n   * server from a non-standard location.\n   * Defaults to `OLLAMA_BASE_URL` if set.\n   * @default \"http://localhost:11434\"\n   */\n  baseUrl?: string;\n\n  format?: string;\n\n  /**\n   * Optional HTTP Headers to include in the request.\n   */\n  headers?: Headers | Record<string, string>;\n\n  /**\n   * The fetch function to use.\n   * @default fetch\n   */\n  fetch?: typeof fetch;\n  think?: boolean;\n}\n\n/**\n * Class that represents the Ollama language model. It extends the base\n * LLM class and implements the OllamaInput interface.\n * @example\n * ```typescript\n * const ollama = new Ollama({\n *   baseUrl: \"http://api.example.com\",\n *   model: \"llama3\",\n * });\n *\n * // Streaming translation from English to German\n * const stream = await ollama.stream(\n *   `Translate \"I love programming\" into German.`\n * );\n *\n * const chunks = [];\n * for await (const chunk of stream) {\n *   chunks.push(chunk);\n * }\n *\n * console.log(chunks.join(\"\"));\n * ```\n */\nexport class Ollama extends LLM<OllamaCallOptions> implements OllamaInput {\n  static lc_name() {\n    return \"Ollama\";\n  }\n\n  lc_serializable = true;\n\n  model = \"llama3\";\n\n  baseUrl = \"http://localhost:11434\";\n\n  think?: boolean;\n\n  keepAlive?: string | number;\n\n  embeddingOnly?: boolean;\n\n  f16KV?: boolean;\n\n  frequencyPenalty?: number;\n\n  logitsAll?: boolean;\n\n  lowVram?: boolean;\n\n  mainGpu?: number;\n\n  mirostat?: number;\n\n  mirostatEta?: number;\n\n  mirostatTau?: number;\n\n  numBatch?: number;\n\n  numCtx?: number;\n\n  numGpu?: number;\n\n  numKeep?: number;\n\n  numPredict?: number;\n\n  numThread?: number;\n\n  penalizeNewline?: boolean;\n\n  presencePenalty?: number;\n\n  repeatLastN?: number;\n\n  repeatPenalty?: number;\n\n  temperature?: number;\n\n  stop?: string[];\n\n  tfsZ?: number;\n\n  topK?: number;\n\n  topP?: number;\n\n  typicalP?: number;\n\n  useMLock?: boolean;\n\n  useMMap?: boolean;\n\n  vocabOnly?: boolean;\n\n  format?: StringWithAutocomplete<\"json\">;\n\n  client: OllamaClient;\n\n  constructor(fields?: OllamaInput & BaseLLMParams) {\n    super(fields ?? {});\n    this._addVersion(\"@langchain/ollama\", __PKG_VERSION__);\n    this.model = fields?.model ?? this.model;\n    this.baseUrl = fields?.baseUrl\n      ? fields?.baseUrl.endsWith(\"/\")\n        ? fields?.baseUrl.slice(0, -1)\n        : fields?.baseUrl\n      : (getEnvironmentVariable(\"OLLAMA_BASE_URL\") ?? this.baseUrl);\n    this.client = new OllamaClient({\n      fetch: fields?.fetch,\n      host: this.baseUrl,\n      headers: fields?.headers,\n    });\n    this.keepAlive = fields?.keepAlive;\n    this.think = fields?.think;\n\n    this.embeddingOnly = fields?.embeddingOnly;\n    this.f16KV = fields?.f16Kv;\n    this.frequencyPenalty = fields?.frequencyPenalty;\n    this.logitsAll = fields?.logitsAll;\n    this.lowVram = fields?.lowVram;\n    this.mainGpu = fields?.mainGpu;\n    this.mirostat = fields?.mirostat;\n    this.mirostatEta = fields?.mirostatEta;\n    this.mirostatTau = fields?.mirostatTau;\n    this.numBatch = fields?.numBatch;\n    this.numCtx = fields?.numCtx;\n    this.numGpu = fields?.numGpu;\n    this.numKeep = fields?.numKeep;\n    this.numPredict = fields?.numPredict;\n    this.numThread = fields?.numThread;\n    this.penalizeNewline = fields?.penalizeNewline;\n    this.presencePenalty = fields?.presencePenalty;\n    this.repeatLastN = fields?.repeatLastN;\n    this.repeatPenalty = fields?.repeatPenalty;\n    this.temperature = fields?.temperature;\n    this.stop = fields?.stop;\n    this.tfsZ = fields?.tfsZ;\n    this.topK = fields?.topK;\n    this.topP = fields?.topP;\n    this.typicalP = fields?.typicalP;\n    this.useMLock = fields?.useMlock;\n    this.useMMap = fields?.useMmap;\n    this.vocabOnly = fields?.vocabOnly;\n    this.format = fields?.format;\n  }\n\n  _llmType() {\n    return \"ollama\";\n  }\n\n  invocationParams(options?: this[\"ParsedCallOptions\"]) {\n    return {\n      model: this.model,\n      format: this.format,\n      keep_alive: this.keepAlive,\n      think: this.think,\n      images: options?.images,\n      options: {\n        embedding_only: this.embeddingOnly,\n        f16_kv: this.f16KV,\n        frequency_penalty: this.frequencyPenalty,\n        logits_all: this.logitsAll,\n        low_vram: this.lowVram,\n        main_gpu: this.mainGpu,\n        mirostat: this.mirostat,\n        mirostat_eta: this.mirostatEta,\n        mirostat_tau: this.mirostatTau,\n        num_batch: this.numBatch,\n        num_ctx: this.numCtx,\n        num_gpu: this.numGpu,\n        num_keep: this.numKeep,\n        num_predict: this.numPredict,\n        num_thread: this.numThread,\n        penalize_newline: this.penalizeNewline,\n        presence_penalty: this.presencePenalty,\n        repeat_last_n: this.repeatLastN,\n        repeat_penalty: this.repeatPenalty,\n        temperature: this.temperature,\n        stop: options?.stop ?? this.stop,\n        tfs_z: this.tfsZ,\n        top_k: this.topK,\n        top_p: this.topP,\n        typical_p: this.typicalP,\n        use_mlock: this.useMLock,\n        use_mmap: this.useMMap,\n        vocab_only: this.vocabOnly,\n      },\n    };\n  }\n\n  async *_streamResponseChunks(\n    prompt: string,\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<GenerationChunk> {\n    const stream = await this.caller.call(async () =>\n      this.client.generate({\n        ...this.invocationParams(options),\n        prompt,\n        stream: true,\n      })\n    );\n    for await (const chunk of stream) {\n      if (options.signal?.aborted) {\n        throw new Error(\"This operation was aborted\");\n      }\n\n      if (!chunk.done) {\n        // when think is enabled, try thinking first\n        const token =\n          this.think || this.think === undefined\n            ? (chunk.thinking ?? chunk.response ?? \"\")\n            : (chunk.response ?? \"\");\n\n        yield new GenerationChunk({\n          text: token,\n          generationInfo: {\n            ...chunk,\n            response: undefined,\n          },\n        });\n        await runManager?.handleLLMNewToken(token);\n      } else {\n        yield new GenerationChunk({\n          text: \"\",\n          generationInfo: {\n            model: chunk.model,\n            total_duration: chunk.total_duration,\n            load_duration: chunk.load_duration,\n            prompt_eval_count: chunk.prompt_eval_count,\n            prompt_eval_duration: chunk.prompt_eval_duration,\n            eval_count: chunk.eval_count,\n            eval_duration: chunk.eval_duration,\n          },\n        });\n      }\n    }\n  }\n\n  /** @ignore */\n  async _call(\n    prompt: string,\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<string> {\n    const chunks = [];\n    for await (const chunk of this._streamResponseChunks(\n      prompt,\n      options,\n      runManager\n    )) {\n      chunks.push(chunk.text);\n    }\n    return chunks.join(\"\");\n  }\n}\n"],"mappings":"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"}