UNPKG

@langchain/core

Version:
1 lines 24.5 kB
{"version":3,"file":"llms.cjs","names":["BaseLanguageModel","CallbackManager","GenerationChunk","callbackHandlerPrefersStreaming","concat","RUN_KEY"],"sources":["../../src/language_models/llms.ts"],"sourcesContent":["import type { BasePromptValueInterface } from \"../prompt_values.js\";\nimport {\n type LLMResult,\n RUN_KEY,\n type Generation,\n GenerationChunk,\n} from \"../outputs.js\";\nimport {\n type BaseCallbackConfig,\n CallbackManager,\n type CallbackManagerForLLMRun,\n type Callbacks,\n} from \"../callbacks/manager.js\";\nimport {\n BaseLanguageModel,\n type BaseLanguageModelCallOptions,\n type BaseLanguageModelInput,\n type BaseLanguageModelParams,\n} from \"./base.js\";\nimport type { RunnableConfig } from \"../runnables/config.js\";\nimport type { BaseCache } from \"../caches/index.js\";\nimport { concat } from \"../utils/stream.js\";\nimport { callbackHandlerPrefersStreaming } from \"../callbacks/base.js\";\n\nexport type SerializedLLM = {\n _model: string;\n _type: string;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\nexport interface BaseLLMParams extends BaseLanguageModelParams {}\n\nexport interface BaseLLMCallOptions extends BaseLanguageModelCallOptions {}\n\n/**\n * LLM Wrapper. Takes in a prompt (or prompts) and returns a string.\n */\nexport abstract class BaseLLM<\n CallOptions extends BaseLLMCallOptions = BaseLLMCallOptions,\n> extends BaseLanguageModel<string, CallOptions> {\n // Backwards compatibility since fields have been moved to RunnableConfig\n declare ParsedCallOptions: Omit<\n CallOptions,\n Exclude<keyof RunnableConfig, \"signal\" | \"timeout\" | \"maxConcurrency\">\n >;\n\n // Only ever instantiated in main LangChain\n lc_namespace = [\"langchain\", \"llms\", this._llmType()];\n\n /**\n * This method takes an input and options, and returns a string. It\n * converts the input to a prompt value and generates a result based on\n * the prompt.\n * @param input Input for the LLM.\n * @param options Options for the LLM call.\n * @returns A string result based on the prompt.\n */\n async invoke(\n input: BaseLanguageModelInput,\n options?: Partial<CallOptions>\n ): Promise<string> {\n const promptValue = BaseLLM._convertInputToPromptValue(input);\n const result = await this.generatePrompt(\n [promptValue],\n options,\n options?.callbacks\n );\n return result.generations[0][0].text;\n }\n\n // oxlint-disable-next-line require-yield\n async *_streamResponseChunks(\n _input: string,\n _options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n throw new Error(\"Not implemented.\");\n }\n\n protected _separateRunnableConfigFromCallOptionsCompat(\n options?: Partial<CallOptions>\n ): [RunnableConfig, this[\"ParsedCallOptions\"]] {\n // For backwards compat, keep `signal` in both runnableConfig and callOptions\n const [runnableConfig, callOptions] =\n super._separateRunnableConfigFromCallOptions(options);\n (callOptions as this[\"ParsedCallOptions\"]).signal = runnableConfig.signal;\n return [runnableConfig, callOptions as this[\"ParsedCallOptions\"]];\n }\n\n async *_streamIterator(\n input: BaseLanguageModelInput,\n options?: Partial<CallOptions>\n ): AsyncGenerator<string> {\n // Subclass check required to avoid double callbacks with default implementation\n if (\n this._streamResponseChunks === BaseLLM.prototype._streamResponseChunks\n ) {\n yield this.invoke(input, options);\n } else {\n const prompt = BaseLLM._convertInputToPromptValue(input);\n const [runnableConfig, callOptions] =\n this._separateRunnableConfigFromCallOptionsCompat(options);\n const invocationParams = this.invocationParams(callOptions);\n const callbackManager_ = await CallbackManager.configure(\n runnableConfig.callbacks,\n this.callbacks,\n runnableConfig.tags,\n this.tags,\n runnableConfig.metadata,\n this.metadata,\n {\n verbose: this.verbose,\n tracerInheritableMetadata:\n this._filterInvocationParamsForTracing(invocationParams),\n }\n );\n const extra = {\n options: callOptions,\n invocation_params: invocationParams,\n batch_size: 1,\n };\n const runManagers = await callbackManager_?.handleLLMStart(\n this.toJSON(),\n [prompt.toString()],\n runnableConfig.runId,\n undefined,\n extra,\n undefined,\n undefined,\n runnableConfig.runName\n );\n let generation = new GenerationChunk({\n text: \"\",\n });\n try {\n for await (const chunk of this._streamResponseChunks(\n prompt.toString(),\n callOptions,\n runManagers?.[0]\n )) {\n if (!generation) {\n generation = chunk;\n } else {\n generation = generation.concat(chunk);\n }\n if (typeof chunk.text === \"string\") {\n yield chunk.text;\n }\n }\n } catch (err) {\n await Promise.all(\n (runManagers ?? []).map((runManager) =>\n runManager?.handleLLMError(err)\n )\n );\n throw err;\n }\n await Promise.all(\n (runManagers ?? []).map((runManager) =>\n runManager?.handleLLMEnd({\n generations: [[generation]],\n })\n )\n );\n }\n }\n\n /**\n * This method takes prompt values, options, and callbacks, and generates\n * a result based on the prompts.\n * @param promptValues Prompt values for the LLM.\n * @param options Options for the LLM call.\n * @param callbacks Callbacks for the LLM call.\n * @returns An LLMResult based on the prompts.\n */\n async generatePrompt(\n promptValues: BasePromptValueInterface[],\n options?: string[] | Partial<CallOptions>,\n callbacks?: Callbacks\n ): Promise<LLMResult> {\n const prompts: string[] = promptValues.map((promptValue) =>\n promptValue.toString()\n );\n return this.generate(prompts, options, callbacks);\n }\n\n /**\n * Run the LLM on the given prompts and input.\n */\n abstract _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult>;\n\n /**\n * Get the parameters used to invoke the model\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n invocationParams(_options?: this[\"ParsedCallOptions\"]): any {\n return {};\n }\n\n _flattenLLMResult(llmResult: LLMResult): LLMResult[] {\n const llmResults: LLMResult[] = [];\n\n for (let i = 0; i < llmResult.generations.length; i += 1) {\n const genList = llmResult.generations[i];\n\n if (i === 0) {\n llmResults.push({\n generations: [genList],\n llmOutput: llmResult.llmOutput,\n });\n } else {\n const llmOutput = llmResult.llmOutput\n ? { ...llmResult.llmOutput, tokenUsage: {} }\n : undefined;\n\n llmResults.push({\n generations: [genList],\n llmOutput,\n });\n }\n }\n\n return llmResults;\n }\n\n /** @ignore */\n async _generateUncached(\n prompts: string[],\n parsedOptions: this[\"ParsedCallOptions\"],\n handledOptions: BaseCallbackConfig,\n startedRunManagers?: CallbackManagerForLLMRun[]\n ): Promise<LLMResult> {\n let runManagers: CallbackManagerForLLMRun[] | undefined;\n if (\n startedRunManagers !== undefined &&\n startedRunManagers.length === prompts.length\n ) {\n runManagers = startedRunManagers;\n } else {\n const invocationParams = this.invocationParams(parsedOptions);\n const callbackManager_ = await CallbackManager.configure(\n handledOptions.callbacks,\n this.callbacks,\n handledOptions.tags,\n this.tags,\n handledOptions.metadata,\n this.metadata,\n {\n verbose: this.verbose,\n tracerInheritableMetadata:\n this._filterInvocationParamsForTracing(invocationParams),\n }\n );\n const extra = {\n options: parsedOptions,\n invocation_params: invocationParams,\n batch_size: prompts.length,\n };\n runManagers = await callbackManager_?.handleLLMStart(\n this.toJSON(),\n prompts,\n handledOptions.runId,\n undefined,\n extra,\n undefined,\n undefined,\n handledOptions?.runName\n );\n }\n // Even if stream is not explicitly called, check if model is implicitly\n // called from streamEvents() or streamLog() to get all streamed events.\n // Bail out if _streamResponseChunks not overridden\n const hasStreamingHandler = !!runManagers?.[0].handlers.find(\n callbackHandlerPrefersStreaming\n );\n let output: LLMResult;\n if (\n hasStreamingHandler &&\n prompts.length === 1 &&\n this._streamResponseChunks !== BaseLLM.prototype._streamResponseChunks\n ) {\n try {\n const stream = await this._streamResponseChunks(\n prompts[0],\n parsedOptions,\n runManagers?.[0]\n );\n let aggregated;\n for await (const chunk of stream) {\n if (aggregated === undefined) {\n aggregated = chunk;\n } else {\n aggregated = concat(aggregated, chunk);\n }\n }\n if (aggregated === undefined) {\n throw new Error(\"Received empty response from chat model call.\");\n }\n output = { generations: [[aggregated]], llmOutput: {} };\n await runManagers?.[0].handleLLMEnd(output);\n } catch (e) {\n await runManagers?.[0].handleLLMError(e);\n throw e;\n }\n } else {\n try {\n output = await this._generate(prompts, parsedOptions, runManagers?.[0]);\n } catch (err) {\n await Promise.all(\n (runManagers ?? []).map((runManager) =>\n runManager?.handleLLMError(err)\n )\n );\n throw err;\n }\n\n const flattenedOutputs: LLMResult[] = this._flattenLLMResult(output);\n await Promise.all(\n (runManagers ?? []).map((runManager, i) =>\n runManager?.handleLLMEnd(flattenedOutputs[i])\n )\n );\n }\n const runIds = runManagers?.map((manager) => manager.runId) || undefined;\n // This defines RUN_KEY as a non-enumerable property on the output object\n // so that it is not serialized when the output is stringified, and so that\n // it isnt included when listing the keys of the output object.\n Object.defineProperty(output, RUN_KEY, {\n value: runIds ? { runIds } : undefined,\n configurable: true,\n });\n return output;\n }\n\n async _generateCached({\n prompts,\n cache,\n llmStringKey,\n parsedOptions,\n handledOptions,\n runId,\n }: {\n prompts: string[];\n cache: BaseCache<Generation[]>;\n llmStringKey: string;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n parsedOptions: any;\n handledOptions: RunnableConfig;\n runId?: string;\n }): Promise<\n LLMResult & {\n missingPromptIndices: number[];\n startedRunManagers?: CallbackManagerForLLMRun[];\n }\n > {\n const invocationParams = this.invocationParams(parsedOptions);\n const callbackManager_ = await CallbackManager.configure(\n handledOptions.callbacks,\n this.callbacks,\n handledOptions.tags,\n this.tags,\n handledOptions.metadata,\n this.metadata,\n {\n verbose: this.verbose,\n tracerInheritableMetadata:\n this._filterInvocationParamsForTracing(invocationParams),\n }\n );\n const extra = {\n options: parsedOptions,\n invocation_params: invocationParams,\n batch_size: prompts.length,\n };\n const runManagers = await callbackManager_?.handleLLMStart(\n this.toJSON(),\n prompts,\n runId,\n undefined,\n extra,\n undefined,\n undefined,\n handledOptions?.runName\n );\n\n // generate results\n const missingPromptIndices: number[] = [];\n const results = await Promise.allSettled(\n prompts.map(async (prompt, index) => {\n const result = await cache.lookup(prompt, llmStringKey);\n if (result == null) {\n missingPromptIndices.push(index);\n }\n return result;\n })\n );\n\n // Map run managers to the results before filtering out null results\n // Null results are just absent from the cache.\n const cachedResults = results\n .map((result, index) => ({ result, runManager: runManagers?.[index] }))\n .filter(\n ({ result }) =>\n (result.status === \"fulfilled\" && result.value != null) ||\n result.status === \"rejected\"\n );\n\n // Handle results and call run managers\n const generations: Generation[][] = [];\n await Promise.all(\n cachedResults.map(async ({ result: promiseResult, runManager }, i) => {\n if (promiseResult.status === \"fulfilled\") {\n const result = promiseResult.value as Generation[];\n generations[i] = result.map((result) => {\n result.generationInfo = {\n ...result.generationInfo,\n tokenUsage: {},\n };\n return result;\n });\n if (result.length) {\n await runManager?.handleLLMNewToken(result[0].text);\n }\n return runManager?.handleLLMEnd(\n {\n generations: [result],\n },\n undefined,\n undefined,\n undefined,\n {\n cached: true,\n }\n );\n } else {\n // status === \"rejected\"\n await runManager?.handleLLMError(\n promiseResult.reason,\n undefined,\n undefined,\n undefined,\n {\n cached: true,\n }\n );\n return Promise.reject(promiseResult.reason);\n }\n })\n );\n\n const output = {\n generations,\n missingPromptIndices,\n startedRunManagers: runManagers,\n };\n\n // This defines RUN_KEY as a non-enumerable property on the output object\n // so that it is not serialized when the output is stringified, and so that\n // it isnt included when listing the keys of the output object.\n Object.defineProperty(output, RUN_KEY, {\n value: runManagers\n ? { runIds: runManagers?.map((manager) => manager.runId) }\n : undefined,\n configurable: true,\n });\n\n return output;\n }\n\n /**\n * Run the LLM on the given prompts and input, handling caching.\n */\n async generate(\n prompts: string[],\n options?: string[] | Partial<CallOptions>,\n callbacks?: Callbacks\n ): Promise<LLMResult> {\n if (!Array.isArray(prompts)) {\n throw new Error(\"Argument 'prompts' is expected to be a string[]\");\n }\n\n let parsedOptions: Partial<CallOptions> | undefined;\n if (Array.isArray(options)) {\n parsedOptions = { stop: options } as Partial<CallOptions>;\n } else {\n parsedOptions = options;\n }\n\n const [runnableConfig, callOptions] =\n this._separateRunnableConfigFromCallOptionsCompat(parsedOptions);\n runnableConfig.callbacks = runnableConfig.callbacks ?? callbacks;\n\n if (!this.cache) {\n return this._generateUncached(prompts, callOptions, runnableConfig);\n }\n\n const { cache } = this;\n const llmStringKey = this._getSerializedCacheKeyParametersForCall(\n callOptions as CallOptions\n );\n const { generations, missingPromptIndices, startedRunManagers } =\n await this._generateCached({\n prompts,\n cache,\n llmStringKey,\n parsedOptions: callOptions,\n handledOptions: runnableConfig,\n runId: runnableConfig.runId,\n });\n\n let llmOutput = {};\n if (missingPromptIndices.length > 0) {\n const results = await this._generateUncached(\n missingPromptIndices.map((i) => prompts[i]),\n callOptions,\n runnableConfig,\n startedRunManagers !== undefined\n ? missingPromptIndices.map((i) => startedRunManagers?.[i])\n : undefined\n );\n await Promise.all(\n results.generations.map(async (generation, index) => {\n const promptIndex = missingPromptIndices[index];\n generations[promptIndex] = generation;\n return cache.update(prompts[promptIndex], llmStringKey, generation);\n })\n );\n llmOutput = results.llmOutput ?? {};\n }\n\n return { generations, llmOutput } as LLMResult;\n }\n\n /**\n * Get the identifying parameters of the LLM.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _identifyingParams(): Record<string, any> {\n return {};\n }\n\n /**\n * Return the string type key uniquely identifying this class of LLM.\n */\n abstract _llmType(): string;\n\n _modelType(): string {\n return \"base_llm\" as const;\n }\n}\n\n/**\n * LLM class that provides a simpler interface to subclass than {@link BaseLLM}.\n *\n * Requires only implementing a simpler {@link _call} method instead of {@link _generate}.\n *\n * @augments BaseLLM\n */\nexport abstract class LLM<\n CallOptions extends BaseLLMCallOptions = BaseLLMCallOptions,\n> extends BaseLLM<CallOptions> {\n /**\n * Run the LLM on the given prompt and input.\n */\n abstract _call(\n prompt: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<string>;\n\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const generations: Generation[][] = await Promise.all(\n prompts.map((prompt, promptIndex) =>\n this._call(prompt, { ...options, promptIndex }, runManager).then(\n (text) => [{ text }]\n )\n )\n );\n return { generations };\n }\n}\n"],"mappings":"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"}