UNPKG

@langchain/community

Version:
1 lines 32.3 kB
{"version":3,"file":"ibm.cjs","names":["BaseLLM","authenticateAndSetGatewayInstance","authenticateAndSetInstance","AsyncCaller","GenerationChunk"],"sources":["../../src/llms/ibm.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseLLM, BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport { Stream, WatsonXAI } from \"@ibm-cloud/watsonx-ai\";\nimport {\n RequestCallbacks,\n ReturnOptionProperties,\n TextGenLengthPenalty,\n TextGenParameters,\n TextTokenizationParams,\n TextTokenizeParameters,\n} from \"@ibm-cloud/watsonx-ai/dist/watsonx-ai-ml/vml_v1.js\";\nimport {\n Generation,\n LLMResult,\n GenerationChunk,\n} from \"@langchain/core/outputs\";\nimport { BaseLanguageModelCallOptions } from \"@langchain/core/language_models/base\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport {\n CreateCompletionsParams,\n Gateway,\n TextCompletionStream,\n} from \"@ibm-cloud/watsonx-ai/gateway\";\nimport {\n authenticateAndSetGatewayInstance,\n authenticateAndSetInstance,\n checkValidProps,\n expectOneOf,\n} from \"../utils/ibm.js\";\nimport {\n GenerationInfo,\n ResponseChunk,\n TokenUsage,\n WatsonxAuth,\n WatsonxInit,\n WatsonxLLMBasicOptions,\n XOR,\n} from \"../types/ibm.js\";\n\n/**\n * Input to LLM class.\n */\n\n/** Parameters for basic llm invoke */\nexport interface WatsonxLLMParams {\n maxNewTokens?: number;\n maxTokens?: number;\n decodingMethod?: TextGenParameters.Constants.DecodingMethod | string;\n lengthPenalty?: TextGenLengthPenalty;\n minNewTokens?: number;\n randomSeed?: number;\n stopSequence?: string[];\n temperature?: number;\n timeLimit?: number;\n topK?: number;\n topP?: number;\n repetitionPenalty?: number;\n truncateInputTokens?: number;\n returnOptions?: ReturnOptionProperties;\n includeStopSequence?: boolean;\n // oxlint-disable-next-line typescript/no-explicit-any\n headers?: Record<string, any>;\n signal?: AbortSignal;\n}\n/** Parameters for basic llm invoke */\nexport interface WatsonxDeploymentLLMParams {\n idOrName: string;\n}\n/** Gateway parameters */\n\ninterface WatsonxLLMGatewayKwargs extends Omit<\n CreateCompletionsParams,\n keyof WatsonxLLMParams | \"model\" | \"stream\" | \"prompt\" | \"maxTokens\"\n> {}\n\nexport interface WatsonxLLMGatewayParams\n extends\n WatsonxInit,\n Omit<\n CreateCompletionsParams,\n keyof WatsonxLLMGatewayKwargs | \"stream\" | \"prompt\"\n > {\n /** Additional parameters usable only in model gateway */\n modelGatewayKwargs?: WatsonxLLMGatewayKwargs;\n modelGateway: boolean;\n}\n\n/** Call interface for second parameter of inbuild methods */\nexport interface WatsonxCallOptionsLLM\n extends BaseLanguageModelCallOptions, Partial<WatsonxInit> {\n maxRetries?: number;\n parameters?: XOR<Partial<WatsonxLLMParams>, Partial<WatsonxLLMGatewayParams>>;\n watsonxCallbacks?: RequestCallbacks;\n}\n\n/** Constructor input interfaces for each mode */\n\nexport interface WatsonxInputLLM\n extends WatsonxLLMBasicOptions, WatsonxLLMParams {\n model: string;\n spaceId?: string;\n projectId?: string;\n}\n\nexport interface WatsonxDeployedInputLLM\n extends WatsonxLLMBasicOptions, WatsonxDeploymentLLMParams {}\n\nexport interface WatsonxGatewayInputLLM\n extends WatsonxLLMBasicOptions, WatsonxLLMGatewayParams {}\n\n// Combined input for chat excluding each mode to not be present at the same time\nexport type WatsonxLLMConstructor = XOR<\n XOR<WatsonxInputLLM, WatsonxDeployedInputLLM>,\n WatsonxGatewayInputLLM\n> &\n WatsonxAuth;\n\n/**\n * Integration with an LLM.\n */\nexport class WatsonxLLM<\n CallOptions extends WatsonxCallOptionsLLM = WatsonxCallOptionsLLM,\n>\n extends BaseLLM<CallOptions>\n implements BaseLLMParams\n{\n // Used for tracing, replace with the same name as your class\n static lc_name() {\n return \"WatsonxLLM\";\n }\n\n lc_serializable = true;\n\n streaming = false;\n\n model: string;\n\n maxRetries = 0;\n\n version = \"2024-05-31\";\n\n serviceUrl: string;\n\n maxTokens?: number;\n\n maxNewTokens?: number;\n\n spaceId?: string;\n\n projectId?: string;\n\n idOrName?: string;\n\n decodingMethod?:\n | WatsonXAI.TextGenParameters.Constants.DecodingMethod\n | string;\n\n lengthPenalty?: TextGenLengthPenalty;\n\n minNewTokens?: number;\n\n randomSeed?: number;\n\n stopSequence?: string[];\n\n temperature?: number;\n\n timeLimit?: number;\n\n topK?: number;\n\n topP?: number;\n\n repetitionPenalty?: number;\n\n truncateInputTokens?: number;\n\n returnOptions?: ReturnOptionProperties;\n\n includeStopSequence?: boolean;\n\n maxConcurrency?: number;\n\n watsonxCallbacks?: RequestCallbacks;\n\n modelGateway = false;\n\n modelGatewayKwargs: WatsonxLLMGatewayKwargs = {};\n\n protected service?: WatsonXAI;\n\n protected gateway?: Gateway;\n\n private checkValidProperties(\n fields:\n | WatsonxLLMConstructor\n | XOR<Partial<WatsonxLLMParams>, Partial<WatsonxLLMGatewayParams>>,\n includeCommonProps = true\n ) {\n const authProps = [\n \"serviceUrl\",\n \"watsonxAIApikey\",\n \"watsonxAIBearerToken\",\n \"watsonxAIUsername\",\n \"watsonxAIPassword\",\n \"watsonxAIUrl\",\n \"watsonxAIAuthType\",\n \"disableSSL\",\n ];\n\n const sharedProps = [\n \"maxRetries\",\n \"watsonxCallbacks\",\n \"authenticator\",\n \"serviceUrl\",\n \"version\",\n \"streaming\",\n \"callbackManager\",\n \"callbacks\",\n \"maxConcurrency\",\n \"cache\",\n \"metadata\",\n \"concurrency\",\n \"onFailedAttempt\",\n \"concurrency\",\n \"verbose\",\n \"tags\",\n ];\n\n const gatewayProps = [\n \"temperature\",\n \"topP\",\n \"model\",\n \"modelGatewayKwargs\",\n \"modelGateway\",\n \"verbose\",\n \"tags\",\n \"maxTokens\",\n ];\n\n const deploymentProps = [\"idOrName\"];\n\n const projectOrSpaceProps = [\n \"spaceId\",\n \"projectId\",\n \"temperature\",\n \"topP\",\n \"timeLimit\",\n \"model\",\n \"maxNewTokens\",\n \"decodingMethod\",\n \"lengthPenalty\",\n \"minNewTokens\",\n \"randomSeed\",\n \"stopSequence\",\n \"topK\",\n \"repetitionPenalty\",\n \"truncateInputTokens\",\n \"returnOptions\",\n \"includeStopSequence\",\n ];\n\n const validProps: string[] = [];\n if (includeCommonProps) validProps.push(...authProps, ...sharedProps);\n\n if (this.modelGateway) {\n validProps.push(...gatewayProps);\n } else if (this.idOrName) {\n validProps.push(...deploymentProps);\n } else if (this.spaceId || this.projectId) {\n validProps.push(...projectOrSpaceProps);\n }\n checkValidProps(fields, validProps);\n }\n\n constructor(fields: WatsonxLLMConstructor) {\n super(fields);\n expectOneOf(\n fields,\n [\"spaceId\", \"projectId\", \"idOrName\", \"modelGateway\"],\n true\n );\n this.idOrName = fields?.idOrName;\n this.projectId = fields?.projectId;\n this.modelGateway = fields.modelGateway || this.modelGateway;\n this.spaceId = fields?.spaceId;\n\n this.checkValidProperties(fields);\n\n this.model = fields.model ?? this.model;\n this.serviceUrl = fields.serviceUrl;\n this.version = fields.version;\n\n this.topP = fields.topP;\n this.temperature = fields.temperature;\n this.maxNewTokens = fields.maxNewTokens ?? fields.maxTokens;\n this.decodingMethod = fields.decodingMethod;\n this.lengthPenalty = fields.lengthPenalty;\n this.minNewTokens = fields.minNewTokens;\n this.maxTokens = fields.maxTokens;\n this.randomSeed = fields.randomSeed;\n this.stopSequence = fields.stopSequence;\n this.timeLimit = fields.timeLimit;\n this.topK = fields.topK;\n this.repetitionPenalty = fields.repetitionPenalty;\n this.truncateInputTokens = fields.truncateInputTokens;\n this.returnOptions = fields.returnOptions;\n this.includeStopSequence = fields.includeStopSequence;\n\n this.modelGatewayKwargs =\n fields.modelGatewayKwargs || this.modelGatewayKwargs;\n\n this.maxRetries = fields.maxRetries || this.maxRetries;\n this.maxConcurrency = fields.maxConcurrency;\n this.streaming = fields.streaming || this.streaming;\n this.watsonxCallbacks = fields.watsonxCallbacks || this.watsonxCallbacks;\n\n const {\n watsonxAIApikey,\n watsonxAIAuthType,\n watsonxAIBearerToken,\n watsonxAIUsername,\n watsonxAIPassword,\n watsonxAIUrl,\n disableSSL,\n version,\n serviceUrl,\n } = fields;\n\n const authData = {\n watsonxAIApikey,\n watsonxAIAuthType,\n watsonxAIBearerToken,\n watsonxAIUsername,\n watsonxAIPassword,\n watsonxAIUrl,\n disableSSL,\n version,\n serviceUrl,\n };\n\n if (this.modelGateway) {\n const gateway = authenticateAndSetGatewayInstance(authData);\n\n if (gateway) this.gateway = gateway;\n else throw new Error(\"You have not provided any type of authentication\");\n } else {\n const service = authenticateAndSetInstance(authData);\n\n if (service) this.service = service;\n else throw new Error(\"You have not provided any type of authentication\");\n }\n }\n\n get lc_secrets(): { [key: string]: string } {\n return {\n authenticator: \"AUTHENTICATOR\",\n apiKey: \"WATSONX_AI_APIKEY\",\n apikey: \"WATSONX_AI_APIKEY\",\n watsonxAIAuthType: \"WATSONX_AI_AUTH_TYPE\",\n watsonxAIApikey: \"WATSONX_AI_APIKEY\",\n watsonxAIBearerToken: \"WATSONX_AI_BEARER_TOKEN\",\n watsonxAIUsername: \"WATSONX_AI_USERNAME\",\n watsonxAIPassword: \"WATSONX_AI_PASSWORD\",\n watsonxAIUrl: \"WATSONX_AI_URL\",\n };\n }\n\n get lc_aliases(): { [key: string]: string } {\n return {\n authenticator: \"authenticator\",\n apikey: \"watsonx_ai_apikey\",\n apiKey: \"watsonx_ai_apikey\",\n watsonxAIAuthType: \"watsonx_ai_auth_type\",\n watsonxAIApikey: \"watsonx_ai_apikey\",\n watsonxAIBearerToken: \"watsonx_ai_bearer_token\",\n watsonxAIUsername: \"watsonx_ai_username\",\n watsonxAIPassword: \"watsonx_ai_password\",\n watsonxAIUrl: \"watsonx_ai_url\",\n };\n }\n\n invocationParams(options: this[\"ParsedCallOptions\"]) {\n const { parameters } = options;\n const { signal, maxRetries, maxConcurrency, timeout, ...rest } = options;\n if (parameters) this.checkValidProperties(parameters, false);\n if (this.idOrName && Object.keys(rest).length > 0)\n throw new Error(\"Options cannot be provided to a deployed model\");\n if (this.idOrName) return undefined;\n\n if (this.modelGateway) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const modelGatewayParams: Record<string, any> = {\n ...this?.modelGatewayKwargs,\n ...parameters?.modelGatewayKwargs,\n };\n return {\n stop: options?.stop ?? this.stopSequence,\n temperature: parameters?.temperature ?? this.temperature,\n topP: parameters?.topP ?? this.topP,\n maxTokens: parameters?.maxTokens ?? this.maxTokens,\n ...modelGatewayParams,\n };\n }\n\n return {\n stop_sequences: options?.stop ?? this.stopSequence,\n temperature: parameters?.temperature ?? this.temperature,\n top_p: parameters?.topP ?? this.topP,\n max_new_tokens:\n parameters?.maxNewTokens ??\n this.maxNewTokens ??\n parameters?.maxTokens ??\n this.maxTokens,\n decoding_method: parameters?.decodingMethod ?? this.decodingMethod,\n length_penalty: parameters?.lengthPenalty ?? this.lengthPenalty,\n min_new_tokens: parameters?.minNewTokens ?? this.minNewTokens,\n random_seed: parameters?.randomSeed ?? this.randomSeed,\n time_limit: parameters?.timeLimit ?? this.timeLimit ?? timeout,\n top_k: parameters?.topK ?? this.topK,\n repetition_penalty:\n parameters?.repetitionPenalty ?? this.repetitionPenalty,\n truncate_input_tokens:\n parameters?.truncateInputTokens ?? this.truncateInputTokens,\n return_options: parameters?.returnOptions ?? this.returnOptions,\n include_stop_sequence:\n parameters?.includeStopSequence ?? this.includeStopSequence,\n };\n }\n\n invocationCallbacks(options: this[\"ParsedCallOptions\"]) {\n return options.watsonxCallbacks ?? this.watsonxCallbacks;\n }\n\n scopeId() {\n if (this.projectId)\n return { projectId: this.projectId, modelId: this.model };\n else if (this.spaceId)\n return { spaceId: this.spaceId, modelId: this.model };\n else if (this.idOrName)\n return { idOrName: this.idOrName, modelId: this.model };\n else if (this.modelGateway) return { modelId: this.model };\n else\n throw new Error(\n \"Invalid mode type. Please make sure you have provided correct parameters\"\n );\n }\n\n async listModels() {\n if (this.service) {\n const { service } = this;\n const listModelParams = {\n filters: \"function_text_generation\",\n };\n const listModels = await this.completionWithRetry(() =>\n service.listFoundationModelSpecs(listModelParams)\n );\n return listModels.result.resources?.map((item) => item.model_id);\n } else {\n throw new Error(\"This method is not supported in this model gateway\");\n }\n }\n\n private async generateSingleMessage(\n input: string,\n options: this[\"ParsedCallOptions\"],\n stream: true\n ): Promise<\n | Stream<WatsonXAI.ObjectStreamed<WatsonXAI.TextGenResponse>>\n | Stream<TextCompletionStream>\n >;\n\n private async generateSingleMessage(\n input: string,\n options: this[\"ParsedCallOptions\"],\n stream: false\n ): Promise<Generation[]>;\n\n private async generateSingleMessage(\n input: string,\n options: this[\"ParsedCallOptions\"],\n stream: boolean\n ) {\n const {\n signal,\n stop,\n maxRetries,\n maxConcurrency,\n timeout,\n ...requestOptions\n } = options;\n const parameters = this.invocationParams(options);\n const watsonxCallbacks = this.invocationCallbacks(options);\n\n if (stream) {\n if (this.service) {\n if (this.idOrName) {\n return await this.service.deploymentGenerateTextStream({\n idOrName: this.idOrName,\n ...requestOptions,\n parameters: {\n ...parameters,\n prompt_variables: {\n input,\n },\n },\n returnObject: true,\n signal,\n });\n } else {\n return await this.service.generateTextStream(\n {\n input,\n parameters,\n ...this.scopeId(),\n ...requestOptions,\n returnObject: true,\n signal,\n },\n watsonxCallbacks\n );\n }\n } else if (this.gateway) {\n return await this.gateway.completion.create({\n ...parameters,\n model: this.model,\n prompt: input,\n stream: true,\n signal,\n returnObject: true,\n });\n }\n } else {\n if (this.service) {\n const tokenUsage = { generated_token_count: 0, input_token_count: 0 };\n\n const textGenerationPromise = this.idOrName\n ? this.service.deploymentGenerateText(\n {\n ...requestOptions,\n idOrName: this.idOrName,\n parameters: {\n ...parameters,\n prompt_variables: {\n input,\n },\n },\n signal,\n },\n watsonxCallbacks\n )\n : this.service.generateText(\n {\n input,\n parameters,\n ...this.scopeId(),\n ...requestOptions,\n signal,\n },\n watsonxCallbacks\n );\n\n const textGeneration = await textGenerationPromise;\n const singleGeneration: Generation[] =\n textGeneration.result.results.map((result) => {\n tokenUsage.generated_token_count += result.generated_token_count\n ? result.generated_token_count\n : 0;\n tokenUsage.input_token_count += result.input_token_count\n ? result.input_token_count\n : 0;\n return {\n text: result.generated_text,\n generationInfo: {\n stop_reason: result.stop_reason,\n input_token_count: result.input_token_count,\n generated_token_count: result.generated_token_count,\n },\n };\n });\n return singleGeneration;\n } else if (this.gateway) {\n const textGeneration = await this.gateway.completion.create({\n ...parameters,\n prompt: input,\n model: this.model,\n signal,\n });\n const tokenUsage = textGeneration.result.usage;\n const singleGeneration: Generation[] =\n textGeneration.result.choices.map((choice) => {\n return {\n text: choice.text ?? \"\",\n generationInfo: {\n stop_reason: choice.finish_reason,\n input_token_count: tokenUsage?.prompt_tokens,\n generated_token_count: tokenUsage?.completion_tokens,\n },\n };\n });\n return singleGeneration;\n }\n }\n throw new Error(\n \"No service or gateway set. Please check your intsance init\"\n );\n }\n\n async completionWithRetry<T>(\n callback: () => T,\n options?: this[\"ParsedCallOptions\"]\n ) {\n const caller = new AsyncCaller({\n maxConcurrency: options?.maxConcurrency || this.maxConcurrency,\n maxRetries: this.maxRetries,\n });\n const result = options\n ? caller.callWithOptions(\n {\n signal: options.signal,\n },\n async () => callback()\n )\n : caller.call(async () => callback());\n\n return result;\n }\n\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const tokenUsage: TokenUsage = {\n generated_token_count: 0,\n input_token_count: 0,\n };\n if (this.streaming) {\n const generations: Generation[][] = await Promise.all(\n prompts.map(async (prompt, promptIdx) => {\n const stream = this._streamResponseChunks(prompt, options);\n const geneartionsArray: GenerationInfo[] = [];\n\n for await (const chunk of stream) {\n const completion = chunk?.generationInfo?.completion ?? 0;\n const generationInfo: GenerationInfo = {\n text: \"\",\n stop_reason: \"\",\n generated_token_count: 0,\n input_token_count: 0,\n };\n geneartionsArray[completion] ??= generationInfo;\n geneartionsArray[completion].generated_token_count =\n chunk?.generationInfo?.usage_metadata.generated_token_count ?? 0;\n geneartionsArray[completion].input_token_count +=\n chunk?.generationInfo?.usage_metadata.input_token_count ?? 0;\n geneartionsArray[completion].stop_reason =\n chunk?.generationInfo?.stop_reason;\n geneartionsArray[completion].text += chunk.text;\n if (chunk.text)\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text, {\n prompt: promptIdx,\n completion: 0,\n });\n }\n\n return geneartionsArray.map((item) => {\n const { text, ...rest } = item;\n tokenUsage.generated_token_count = rest.generated_token_count;\n tokenUsage.input_token_count += rest.input_token_count;\n\n return {\n text,\n generationInfo: rest,\n };\n });\n })\n );\n const result: LLMResult = { generations, llmOutput: { tokenUsage } };\n return result;\n } else {\n const generations: Generation[][] = await Promise.all(\n prompts.map(async (prompt) => {\n const callback = () =>\n this.generateSingleMessage(prompt, options, false);\n type ReturnMessage = ReturnType<typeof callback>;\n\n const response = await this.completionWithRetry<ReturnMessage>(\n callback,\n options\n );\n const [generated_token_count, input_token_count] = response.reduce(\n (acc, curr) => {\n let generated = 0;\n let inputed = 0;\n if (curr?.generationInfo?.generated_token_count)\n generated = curr.generationInfo.generated_token_count + acc[0];\n if (curr?.generationInfo?.input_token_count)\n inputed = curr.generationInfo.input_token_count + acc[1];\n return [generated, inputed];\n },\n [0, 0]\n );\n tokenUsage.generated_token_count += generated_token_count;\n tokenUsage.input_token_count += input_token_count;\n return response;\n })\n );\n\n const result: LLMResult = { generations, llmOutput: { tokenUsage } };\n return result;\n }\n }\n\n async getNumTokens(\n content: string,\n options?: TextTokenizeParameters\n ): Promise<number> {\n if (this.service) {\n const { service } = this;\n const params: TextTokenizationParams = {\n ...this.scopeId(),\n input: content,\n parameters: options,\n };\n const callback = () => service.tokenizeText(params);\n type ReturnTokens = ReturnType<typeof callback>;\n\n const response = await this.completionWithRetry<ReturnTokens>(callback);\n return response.result.result.token_count;\n } else throw new Error(\"This method is not supported in model gateway\");\n }\n\n async *_streamResponseChunks(\n prompt: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const callback = () => this.generateSingleMessage(prompt, options, true);\n type ReturnStream = ReturnType<typeof callback>;\n const streamInferDeployedPrompt =\n await this.completionWithRetry<ReturnStream>(callback);\n const responseChunk: ResponseChunk = {\n id: 0,\n event: \"\",\n data: {\n results: [],\n },\n };\n for await (const chunk of streamInferDeployedPrompt) {\n const results =\n \"model_id\" in chunk.data ? chunk.data.results : chunk.data.choices;\n\n const usage = \"usage\" in chunk.data ? chunk.data.usage : {};\n for (const [index, item] of results.entries()) {\n const params =\n \"generated_text\" in item\n ? {\n text: item.generated_text,\n generationInfo: {\n stop_reason: item.stop_reason,\n completion: index,\n usage_metadata: {\n generated_token_count: item.generated_token_count,\n input_token_count: item.input_token_count,\n stop_reason: item.stop_reason,\n },\n },\n }\n : {\n text: item.text ?? \"\",\n generationInfo: {\n stop_reason: item.finish_reason,\n completion: index,\n usage_metadata: {\n generated_token_count: usage?.completion_tokens,\n input_token_count: usage?.prompt_tokens,\n stop_reason: item.finish_reason,\n },\n },\n };\n yield new GenerationChunk(params);\n if (!this.streaming)\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(\n \"generated_text\" in item ? item.generated_text : (item.text ?? \"\")\n );\n }\n Object.assign(responseChunk, { id: 0, event: \"\", data: {} });\n }\n }\n\n _llmType() {\n return \"watsonx\";\n }\n}\n"],"mappings":"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"}