UNPKG

@langchain/community

Version:
1 lines 52.1 kB
{"version":3,"file":"ibm.cjs","names":["_convertToolCallIdToMistralCompatible","convertLangChainToolCallToOpenAI","AIMessage","ChatMessage","HumanMessageChunk","AIMessageChunk","ToolMessageChunk","FunctionMessageChunk","ChatMessageChunk","BaseChatModel","authenticateAndSetGatewayInstance","authenticateAndSetInstance","AsyncCaller","ChatGenerationChunk","StructuredOutputParser","JsonOutputParser","WatsonxToolsOutputParser","RunnablePassthrough","RunnableSequence"],"sources":["../../src/chat_models/ibm.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n ChatMessage,\n ChatMessageChunk,\n FunctionMessageChunk,\n HumanMessageChunk,\n isAIMessage,\n MessageType,\n ToolMessageChunk,\n UsageMetadata,\n type BaseMessage,\n} from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n FunctionDefinition,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseChatModel,\n BindToolsInput,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n ChatGeneration,\n ChatGenerationChunk,\n ChatResult,\n} from \"@langchain/core/outputs\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport {\n DeploymentsTextChatParams,\n RequestCallbacks,\n TextChatMessagesTextChatMessageAssistant,\n TextChatParameterTools,\n TextChatParams,\n TextChatResponse,\n TextChatResponseFormat,\n TextChatResultChoice,\n TextChatResultMessage,\n TextChatToolCall,\n TextChatUsage,\n} from \"@ibm-cloud/watsonx-ai/dist/watsonx-ai-ml/vml_v1.js\";\nimport { WatsonXAI, Stream } from \"@ibm-cloud/watsonx-ai\";\nimport { Response } from \"@ibm-cloud/watsonx-ai/base\";\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport {\n BaseLLMOutputParser,\n JsonOutputParser,\n StructuredOutputParser,\n} from \"@langchain/core/output_parsers\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n JsonSchema7Type,\n toJsonSchema,\n} from \"@langchain/core/utils/json_schema\";\nimport { NewTokenIndices } from \"@langchain/core/callbacks/base\";\nimport {\n ChatObjectStream,\n ChatsChoice,\n ChatsMessage,\n ChatsRequestTool,\n ChatsResponse,\n CreateChatCompletionsParams,\n Gateway,\n} from \"@ibm-cloud/watsonx-ai/gateway\";\nimport { WatsonxAuth, XOR, WatsonxBaseChatParams } from \"../types/ibm.js\";\nimport {\n _convertToolCallIdToMistralCompatible,\n authenticateAndSetGatewayInstance,\n authenticateAndSetInstance,\n checkValidProps,\n expectOneOf,\n WatsonxToolsOutputParser,\n} from \"../utils/ibm.js\";\n\n// Ensuring back compatibility\nexport interface WatsonxCallParams extends WatsonxCallOptionsChat {}\nexport interface WatsonxCallDeployedParams extends DeploymentsTextChatParams {}\n\nexport interface WatsonxDeltaStream {\n role?: string;\n content?: string;\n tool_calls?: TextChatToolCall[];\n refusal?: string;\n}\n\n/** Project/space params */\n\nexport interface WatsonxCallOptionsChat\n extends\n Partial<Omit<TextChatParams, \"modelId\" | \"toolChoice\" | \"messages\">>,\n WatsonxBaseChatParams {\n model?: string;\n}\n\nexport interface WatsonxProjectSpaceParams extends WatsonxCallOptionsChat {\n model: string;\n serviceUrl: string;\n version: string;\n}\n/** Deployed params */\nexport interface WatsonxCallOptionsDeployedChat\n extends\n Partial<Omit<DeploymentsTextChatParams, \"messages\">>,\n WatsonxBaseChatParams {}\n\nexport interface WatsonxDeployedParams extends WatsonxCallOptionsDeployedChat {\n serviceUrl: string;\n version: string;\n}\n/** Gateway params */\nexport interface WatsonxGatewayChatKwargs extends Omit<\n CreateChatCompletionsParams,\n keyof TextChatParams | \"model\" | \"stream\" | \"messages\"\n> {}\nexport interface WatsonxCallOptionsGatewayChat\n extends\n Omit<\n CreateChatCompletionsParams,\n | \"stream\"\n | \"toolChoice\"\n | \"messages\"\n | \"prompt\"\n | keyof WatsonxGatewayChatKwargs\n >,\n WatsonxBaseChatParams {\n /** Additional parameters usable only in model gateway */\n modelGatewayKwargs?: WatsonxGatewayChatKwargs;\n}\n\nexport interface WatsonxGatewayChatParams extends WatsonxCallOptionsGatewayChat {\n serviceUrl: string;\n version: string;\n}\n\n// Chat input for different chat modes\nexport interface ChatWatsonxInput\n extends BaseChatModelParams, WatsonxProjectSpaceParams {}\n\nexport interface ChatWatsonxDeployedInput\n extends BaseChatModelParams, WatsonxDeployedParams {}\n\nexport interface ChatWatsonxGatewayInput\n extends BaseChatModelParams, WatsonxGatewayChatParams {\n /** Flag indicating weather to use Model Gateway or no */\n modelGateway: boolean;\n}\n\n// Chat type to be extended by chat class\nexport type ChatWatsonxConstructor = BaseChatModelParams &\n Partial<WatsonxBaseChatParams> &\n WatsonxDeployedParams &\n WatsonxCallParams &\n WatsonxDeployedParams;\n\nfunction _convertToValidToolId(model: string, tool_call_id: string): string {\n if (model.startsWith(\"mistralai\") && tool_call_id)\n return _convertToolCallIdToMistralCompatible(tool_call_id);\n return tool_call_id;\n}\n\ntype ChatWatsonxToolType =\n | BindToolsInput\n | TextChatParameterTools\n | ChatsRequestTool;\n\nfunction _convertToolToWatsonxTool(\n tools: ChatWatsonxToolType[]\n): WatsonXAI.TextChatParameterTools[] {\n return tools.map((tool) => {\n if (\"type\" in tool) {\n return tool as WatsonXAI.TextChatParameterTools;\n }\n // Check if schema is a Zod schema or already a JSON schema\n const parameters = isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema;\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description ?? `Tool: ${tool.name}`,\n parameters,\n },\n };\n });\n}\nconst MESSAGE_TYPE_TO_ROLE_MAP: Record<MessageType, string> = {\n human: \"user\",\n ai: \"assistant\",\n system: \"system\",\n tool: \"tool\",\n function: \"function\",\n generic: \"assistant\",\n developer: \"developer\",\n remove: \"function\",\n};\n\nconst getRole = (role: MessageType): string => {\n const watsonRole = MESSAGE_TYPE_TO_ROLE_MAP[role];\n if (!watsonRole) {\n throw new Error(`Unknown message type: ${role}`);\n }\n return watsonRole;\n};\n\nconst getToolCalls = (message: BaseMessage, model?: string) => {\n if (isAIMessage(message) && message.tool_calls?.length) {\n return message.tool_calls\n .map((toolCall) => ({\n ...toolCall,\n id: _convertToValidToolId(model ?? \"\", toolCall.id ?? \"\"),\n }))\n .map(convertLangChainToolCallToOpenAI);\n }\n return undefined;\n};\n\nfunction _convertMessagesToWatsonxMessages(\n messages: BaseMessage[],\n model?: string\n): TextChatResultMessage[] | ChatsMessage[] {\n return messages.map((message) => {\n const toolCalls = getToolCalls(message, model);\n const content = toolCalls === undefined ? message.content : \"\";\n if (\"tool_call_id\" in message && typeof message.tool_call_id === \"string\") {\n return {\n role: getRole(message.getType()),\n content,\n name: message.name,\n tool_call_id: _convertToValidToolId(model ?? \"\", message.tool_call_id),\n };\n }\n\n return {\n role: getRole(message.getType()),\n content,\n tool_calls: toolCalls,\n };\n });\n}\n\nfunction _watsonxResponseToChatMessage(\n choice: TextChatResultChoice | ChatsChoice,\n rawDataId: string,\n usage?: TextChatUsage\n): BaseMessage {\n const { message } = choice;\n if (!message) throw new Error(\"No message presented\");\n const rawToolCalls = message.tool_calls ?? [];\n\n switch (message.role) {\n case \"assistant\": {\n const toolCalls = [];\n const invalidToolCalls = [];\n for (const rawToolCall of rawToolCalls) {\n try {\n const parsed = parseToolCall(rawToolCall, { returnId: true });\n toolCalls.push(parsed);\n } catch (e: unknown) {\n invalidToolCalls.push(\n makeInvalidToolCall(rawToolCall, (e as Error).message)\n );\n }\n }\n const additional_kwargs: Record<string, unknown> = {\n tool_calls: rawToolCalls.map((toolCall) => ({\n ...toolCall,\n type: \"function\",\n })),\n ...(\"reasoning_content\" in message\n ? { reasoning: message?.reasoning_content }\n : {}),\n };\n\n return new AIMessage({\n id: rawDataId,\n content: message.content ?? \"\",\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n additional_kwargs,\n usage_metadata: usage\n ? {\n input_tokens: usage.prompt_tokens ?? 0,\n output_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n }\n : undefined,\n });\n }\n default:\n return new ChatMessage(message.content ?? \"\", message.role ?? \"unknown\");\n }\n}\n\nfunction _convertDeltaToMessageChunk(\n helperIndex: { [\"value\"]: number },\n delta: WatsonxDeltaStream,\n rawData: TextChatResponse | ChatsResponse,\n model?: string,\n usage?: TextChatUsage,\n defaultRole?: TextChatMessagesTextChatMessageAssistant.Constants.Role\n) {\n if (delta.refusal) throw new Error(delta.refusal);\n\n const rawToolCalls = delta.tool_calls?.length\n ? delta.tool_calls?.map(\n (\n toolCall,\n index\n ): TextChatToolCall & { index: number; type: \"function\" } => {\n const validId =\n toolCall.id && toolCall.id !== \"\"\n ? _convertToValidToolId(model ?? \"\", toolCall.id)\n : undefined;\n if (toolCall.id) helperIndex.value += 1;\n return {\n index:\n delta?.tool_calls && delta?.tool_calls?.length > 1\n ? index\n : helperIndex.value,\n ...toolCall,\n ...(validId !== null && { id: validId }),\n type: \"function\",\n };\n }\n )\n : undefined;\n\n const role = delta.role || defaultRole || \"assistant\";\n const content = delta.content ?? \"\";\n const additional_kwargs = {\n ...(rawToolCalls ? { tool_calls: rawToolCalls } : {}),\n ...(\"reasoning_content\" in delta\n ? { reasoning: delta?.reasoning_content }\n : {}),\n };\n\n const usageMetadata = {\n input_tokens: usage?.prompt_tokens ?? 0,\n output_tokens: usage?.completion_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n };\n switch (role) {\n case \"user\":\n return new HumanMessageChunk({ content });\n\n case \"assistant\": {\n // Extract tool call chunks creation\n const toolCallChunks: ToolCallChunk[] = [];\n if (rawToolCalls && rawToolCalls?.length > 0) {\n for (const rawToolCallChunk of rawToolCalls) {\n const toolCallName = rawToolCallChunk.function.name;\n toolCallChunks.push({\n name: toolCallName.length > 0 ? toolCallName : undefined,\n args: rawToolCallChunk.function?.arguments,\n id: rawToolCallChunk.id,\n index: rawToolCallChunk.index,\n type: \"tool_call_chunk\",\n });\n }\n }\n\n return new AIMessageChunk({\n content,\n tool_call_chunks: toolCallChunks,\n additional_kwargs,\n usage_metadata: usageMetadata,\n id: rawData.id,\n });\n }\n\n case \"tool\":\n if (rawToolCalls) {\n return new ToolMessageChunk({\n content,\n additional_kwargs,\n tool_call_id: _convertToValidToolId(model ?? \"\", rawToolCalls[0].id),\n });\n }\n return null;\n\n case \"function\":\n return new FunctionMessageChunk({\n content,\n additional_kwargs,\n });\n\n default:\n return new ChatMessageChunk({ content, role });\n }\n}\n\nfunction _convertToolChoiceToWatsonxToolChoice(\n toolChoice: TextChatParameterTools | string | \"auto\" | \"any\"\n) {\n if (typeof toolChoice === \"string\") {\n if (toolChoice === \"any\" || toolChoice === \"required\") {\n return { toolChoiceOption: \"required\" };\n } else if (toolChoice === \"auto\" || toolChoice === \"none\") {\n return { toolChoiceOption: toolChoice };\n } else {\n return {\n toolChoice: {\n type: \"function\",\n function: { name: toolChoice },\n },\n };\n }\n } else if (\"type\" in toolChoice) return { toolChoice };\n else\n throw new Error(\n `Unrecognized tool_choice type. Expected string or TextChatParameterTools. Recieved ${toolChoice}`\n );\n}\n\n// Combined input for chat excluding each mode to not be present at the same time\nexport type ChatWatsonxConstructorInput = XOR<\n XOR<ChatWatsonxInput, ChatWatsonxDeployedInput>,\n ChatWatsonxGatewayInput\n> &\n WatsonxAuth;\n\n// Helper to force type expansion\nexport type ChatWatsonxCallOptions = XOR<\n XOR<WatsonxCallOptionsChat, WatsonxCallOptionsDeployedChat>,\n WatsonxCallOptionsGatewayChat\n>;\n\nexport class ChatWatsonx<\n CallOptions extends ChatWatsonxCallOptions = ChatWatsonxCallOptions,\n>\n extends BaseChatModel<CallOptions>\n implements ChatWatsonxConstructor\n{\n static lc_name() {\n return \"ChatWatsonx\";\n }\n\n lc_serializable = true;\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 getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"watsonx\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.maxTokens ?? undefined,\n };\n }\n\n private checkValidProperties(\n fields: this[\"ParsedCallOptions\"] | ChatWatsonxConstructorInput\n ) {\n const PROPERTY_GROUPS = {\n ALWAYS_ALLOWED: [\n \"headers\",\n \"signal\",\n \"tool_choice\",\n \"promptIndex\",\n \"ls_structured_output_format\",\n \"watsonxCallbacks\",\n \"writer\",\n \"interrupt\",\n ],\n\n AUTH: [\n \"serviceUrl\",\n \"watsonxAIApikey\",\n \"watsonxAIBearerToken\",\n \"watsonxAIUsername\",\n \"watsonxAIPassword\",\n \"watsonxAIUrl\",\n \"watsonxAIAuthType\",\n \"disableSSL\",\n ],\n\n SHARED: [\n \"maxRetries\",\n \"authenticator\",\n \"serviceUrl\",\n \"version\",\n \"streaming\",\n \"callbackManager\",\n \"callbacks\",\n \"maxConcurrency\",\n \"cache\",\n \"metadata\",\n \"concurrency\",\n \"onFailedAttempt\",\n \"verbose\",\n \"tags\",\n \"headers\",\n \"disableStreaming\",\n \"timeout\",\n \"stopSequences\",\n ],\n\n GATEWAY: [\n \"tools\",\n \"frequencyPenalty\",\n \"logitBias\",\n \"logprobs\",\n \"topLogprobs\",\n \"maxTokens\",\n \"n\",\n \"presencePenalty\",\n \"responseFormat\",\n \"seed\",\n \"stop\",\n \"temperature\",\n \"topP\",\n \"model\",\n \"modelGatewayKwargs\",\n \"modelGateway\",\n \"reasoningEffort\",\n ],\n\n DEPLOYMENT: [\"idOrName\"],\n\n PROJECT_OR_SPACE: [\n \"spaceId\",\n \"projectId\",\n \"tools\",\n \"toolChoiceOption\",\n \"frequencyPenalty\",\n \"logitBias\",\n \"logprobs\",\n \"topLogprobs\",\n \"maxTokens\",\n \"maxCompletionTokens\",\n \"n\",\n \"presencePenalty\",\n \"responseFormat\",\n \"seed\",\n \"stop\",\n \"temperature\",\n \"topP\",\n \"timeLimit\",\n \"model\",\n \"reasoningEffort\",\n \"includeReasoning\",\n ],\n };\n\n const validProps: string[] = [\n ...PROPERTY_GROUPS.ALWAYS_ALLOWED,\n ...PROPERTY_GROUPS.AUTH,\n ...PROPERTY_GROUPS.SHARED,\n ];\n\n if (this.modelGateway) {\n validProps.push(...PROPERTY_GROUPS.GATEWAY);\n } else if (this.idOrName) {\n validProps.push(...PROPERTY_GROUPS.DEPLOYMENT);\n } else if (this.spaceId || this.projectId) {\n validProps.push(...PROPERTY_GROUPS.PROJECT_OR_SPACE);\n }\n\n checkValidProps(fields, validProps);\n }\n\n protected service?: WatsonXAI;\n\n protected gateway?: Gateway;\n\n model?: string;\n\n version = \"2024-05-31\";\n\n modelGateway = false;\n\n maxTokens?: number;\n\n maxCompletionTokens?: number;\n\n maxRetries = 0;\n\n serviceUrl: string;\n\n spaceId?: string;\n\n projectId?: string;\n\n idOrName?: string;\n\n frequencyPenalty?: number;\n\n logprobs?: boolean;\n\n topLogprobs?: number;\n\n n?: number;\n\n presencePenalty?: number;\n\n temperature?: number;\n\n topP?: number;\n\n timeLimit?: number;\n\n includeReasoning?: boolean;\n\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n\n maxConcurrency?: number;\n\n responseFormat?: TextChatResponseFormat;\n\n streaming = false;\n\n modelGatewayKwargs?: WatsonxGatewayChatKwargs;\n\n watsonxCallbacks?: RequestCallbacks;\n\n constructor(fields: ChatWatsonxConstructorInput) {\n super(fields);\n const uniqueProps = [\"spaceId\", \"projectId\", \"idOrName\", \"modelGateway\"];\n expectOneOf(fields, uniqueProps, 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.projectId = fields?.projectId;\n this.spaceId = fields?.spaceId;\n this.watsonxCallbacks = fields?.watsonxCallbacks;\n this.serviceUrl = fields?.serviceUrl;\n this.version = fields?.version ?? this.version;\n\n this.temperature = fields?.temperature;\n this.maxRetries = fields?.maxRetries || this.maxRetries;\n this.maxConcurrency = fields?.maxConcurrency;\n this.frequencyPenalty = fields?.frequencyPenalty;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.maxCompletionTokens = fields?.maxCompletionTokens;\n this.presencePenalty = fields?.presencePenalty;\n this.topP = fields?.topP;\n this.responseFormat = fields?.responseFormat ?? this.responseFormat;\n this.streaming = fields?.streaming ?? this.streaming;\n this.n = fields?.n ?? this.n;\n this.timeLimit = fields?.timeLimit;\n this.reasoningEffort = fields?.reasoningEffort;\n this.includeReasoning = fields?.includeReasoning;\n\n this.modelGateway = fields?.modelGateway ?? this.modelGateway;\n this.modelGatewayKwargs = fields?.modelGatewayKwargs;\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 chatGateway = authenticateAndSetGatewayInstance(authData);\n if (chatGateway) this.gateway = chatGateway;\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 _llmType() {\n return \"watsonx\";\n }\n\n invocationParams(options: this[\"ParsedCallOptions\"]) {\n const { tools, responseFormat, timeLimit, tool_choice } = options;\n\n expectOneOf(options, [\"spaceId\", \"projectId\", \"idOrName\", \"modelGateway\"]);\n\n const paramDefaults = {\n maxTokens: options.maxTokens ?? this.maxTokens,\n maxCompletionTokens:\n options.maxCompletionTokens ?? this.maxCompletionTokens,\n temperature: options.temperature ?? this.temperature,\n topP: options.topP ?? this.topP,\n presencePenalty: options.presencePenalty ?? this.presencePenalty,\n n: options.n ?? this.n,\n topLogprobs: options.topLogprobs ?? this.topLogprobs,\n logprobs: options.logprobs ?? this.logprobs,\n frequencyPenalty: options.frequencyPenalty ?? this.frequencyPenalty,\n reasoningEffort: options.reasoningEffort ?? this.reasoningEffort,\n };\n\n const toolParams: Record<string, WatsonXAI.TextChatParameterTools[]> = tools\n ? { tools: _convertToolToWatsonxTool(tools) }\n : {};\n\n const toolChoiceParams: Record<\n string,\n TextChatParameterTools | string | undefined\n > = tool_choice ? _convertToolChoiceToWatsonxToolChoice(tool_choice) : {};\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const gatewayParams: Record<string, any> = this.modelGateway\n ? { ...this.modelGatewayKwargs }\n : {\n timeLimit: timeLimit ?? this.timeLimit,\n projectId: options.projectId ?? this.projectId,\n includeReasoning: options.includeReasoning ?? this.includeReasoning,\n };\n\n return {\n ...paramDefaults,\n ...toolParams,\n responseFormat,\n ...toolChoiceParams,\n ...gatewayParams,\n };\n }\n\n invocationCallbacks(options: this[\"ParsedCallOptions\"]) {\n return options.watsonxCallbacks ?? this.watsonxCallbacks;\n }\n\n override bindTools(\n tools: ChatWatsonxToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n return this.withConfig({\n tools: _convertToolToWatsonxTool(tools),\n ...kwargs,\n } as CallOptions);\n }\n\n scopeId(\n options?: this[\"ParsedCallOptions\"]\n ):\n | { idOrName: string }\n | { projectId: string; modelId: string }\n | { spaceId: string; modelId: string }\n | { modelId: string }\n | { model: string } {\n const model = options?.model ?? this.model;\n const projectId = options?.projectId ?? this.projectId;\n const spaceId = options?.spaceId ?? this.spaceId;\n const idOrName = options?.idOrName ?? this.idOrName;\n\n if (this.modelGateway) {\n if (!model) {\n throw new Error(\n \"No model provided! Model gateway expects model to be provided\"\n );\n }\n return { model };\n }\n\n if (projectId && model) return { projectId, modelId: model };\n if (spaceId && model) return { spaceId, modelId: model };\n if (idOrName) return { idOrName };\n if (model) return { modelId: model };\n\n throw new Error(\"No id or model provided!\");\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 private async _chatModelGateway<S extends boolean = false>(\n scopeId: ReturnType<ChatWatsonx[\"scopeId\"]>,\n params: ReturnType<ChatWatsonx[\"invocationParams\"]>,\n messages: ChatsMessage[],\n signal?: AbortSignal,\n stream: S = false as S\n ): Promise<\n S extends true ? Stream<ChatObjectStream> : Response<ChatsResponse>\n > {\n if (this.gateway) {\n if (\"model\" in scopeId) {\n return this.gateway.chat.completion.create({\n ...params,\n ...scopeId,\n signal,\n stream,\n ...(stream ? { returnObject: true } : {}),\n messages,\n });\n }\n throw new Error(\n \"No 'model' specified. Model needs to be spcified for model gateway\"\n );\n }\n throw new Error(\n \"'gateway' instance is not set. Please check your implementation\"\n );\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks: Record<number, ChatGenerationChunk> = {};\n let tokenUsage: UsageMetadata = {\n input_tokens: 0,\n output_tokens: 0,\n total_tokens: 0,\n };\n const tokenUsages: UsageMetadata[] = [];\n for await (const chunk of stream) {\n const message = chunk.message as AIMessageChunk;\n const usageMetadata = message?.usage_metadata as UsageMetadata;\n if (usageMetadata) {\n const completion = chunk.generationInfo?.completion;\n if (tokenUsages[completion])\n tokenUsages[completion].output_tokens =\n usageMetadata?.output_tokens;\n else tokenUsages[completion] = usageMetadata;\n }\n chunk.message.response_metadata = {\n model: this.model,\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n\n const index =\n (chunk.generationInfo as NewTokenIndices)?.completion ?? 0;\n if (finalChunks[index] === undefined) {\n finalChunks[index] = chunk;\n } else {\n finalChunks[index] = finalChunks[index].concat(chunk);\n }\n }\n tokenUsage = tokenUsages.reduce((acc, curr) => {\n return {\n input_tokens: acc.input_tokens + curr.input_tokens,\n output_tokens: acc.output_tokens + curr.output_tokens,\n total_tokens: acc.total_tokens + curr.total_tokens,\n };\n });\n const generations = Object.entries(finalChunks)\n .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10))\n .map(([_, value]) => value);\n return { generations, llmOutput: { tokenUsage } };\n } else {\n const params = this.invocationParams(options);\n const scopeId = this.scopeId(options);\n const watsonxCallbacks = this.invocationCallbacks(options);\n const watsonxMessages = _convertMessagesToWatsonxMessages(\n messages,\n this.model\n );\n const callback = () => {\n if (this.modelGateway) {\n return this._chatModelGateway(\n scopeId,\n params,\n watsonxMessages,\n options.signal,\n false\n );\n }\n\n if (this.service) {\n if (\"idOrName\" in scopeId) {\n return this.service.deploymentsTextChat(\n {\n ...scopeId,\n messages: watsonxMessages,\n signal: options?.signal,\n },\n watsonxCallbacks\n );\n }\n\n if (\"modelId\" in scopeId)\n return this.service.textChat(\n {\n ...params,\n ...scopeId,\n messages: watsonxMessages,\n signal: options?.signal,\n },\n watsonxCallbacks\n );\n }\n\n throw new Error(\n \"No service or gateway set. Please check your intsance init\"\n );\n };\n\n const { result } = await this.completionWithRetry(callback, options);\n const generations: ChatGeneration[] = [];\n for (const part of result.choices) {\n const generation: ChatGeneration = {\n text: part.message?.content ?? \"\",\n message: _watsonxResponseToChatMessage(\n part,\n result.id,\n result?.usage\n ),\n };\n if (part.finish_reason) {\n generation.generationInfo = { finish_reason: part.finish_reason };\n }\n generations.push(generation);\n }\n\n return {\n generations,\n llmOutput: {\n tokenUsage: result?.usage,\n model_name: this.model,\n model: this.model,\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = this.invocationParams(options);\n const scopeId = this.scopeId(options);\n const watsonxMessages = _convertMessagesToWatsonxMessages(\n messages,\n this.model\n );\n const watsonxCallbacks = this.invocationCallbacks(options);\n const { signal } = options;\n const callback = () => {\n if (this.modelGateway) {\n return this._chatModelGateway(\n scopeId,\n params,\n watsonxMessages,\n signal,\n true\n );\n }\n if (this.service) {\n if (\"idOrName\" in scopeId)\n return this.service.deploymentsTextChatStream(\n {\n ...scopeId,\n messages: watsonxMessages,\n returnObject: true,\n signal,\n },\n watsonxCallbacks\n );\n if (\"modelId\" in scopeId)\n return this.service.textChatStream(\n {\n ...params,\n ...scopeId,\n messages: watsonxMessages,\n returnObject: true,\n signal,\n },\n watsonxCallbacks\n );\n\n throw new Error(\n \"No idOrName or modelId specified. At least one of these needs to be specified in basic mode\"\n );\n }\n throw new Error(\n \"No service or gateway set. Please check your intsance init\"\n );\n };\n const stream = await this.completionWithRetry(callback, options);\n let defaultRole;\n let usage: TextChatUsage | undefined;\n let currentCompletion = 0;\n const counter = { value: -1 };\n for await (const chunk of stream) {\n if (chunk?.data?.usage) usage = chunk.data.usage;\n const { data } = chunk;\n const choice = data.choices[0] as TextChatResultChoice &\n Record<\"delta\", TextChatResultMessage>;\n\n if (choice && !(\"delta\" in choice)) {\n continue;\n }\n const delta = choice?.delta;\n if (!delta) {\n continue;\n }\n\n currentCompletion = choice.index ?? 0;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index ?? 0,\n };\n\n const generationInfo = {\n ...newTokenIndices,\n finish_reason: choice.finish_reason,\n };\n\n const message = _convertDeltaToMessageChunk(\n counter,\n delta,\n data,\n this.model,\n chunk.data.usage,\n defaultRole\n );\n defaultRole = (delta.role ||\n defaultRole) as TextChatMessagesTextChatMessageAssistant.Constants.Role;\n\n if (\n message === null ||\n (!delta.content && !delta.tool_calls && delta.role === \"assistant\")\n ) {\n continue;\n }\n const generationChunk = new ChatGenerationChunk({\n message,\n text: delta.content ?? \"\",\n generationInfo,\n });\n\n yield generationChunk;\n // eslint-disable-next-line no-void\n void _runManager?.handleLLMNewToken(\n generationChunk.text,\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: {\n model: this.model,\n usage,\n },\n usage_metadata: {\n input_tokens: usage?.prompt_tokens ?? 0,\n output_tokens: usage?.completion_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n },\n }),\n text: \"\",\n generationInfo: {\n prompt: options.promptIndex ?? 0,\n completion: currentCompletion ?? 0,\n },\n });\n yield generationChunk;\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line typescript/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // oxlint-disable-next-line typescript/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line typescript/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // oxlint-disable-next-line typescript/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line typescript/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // oxlint-disable-next-line typescript/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n // oxlint-disable-next-line typescript/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n let functionName = name ?? \"extract\";\n let outputParser: BaseLLMOutputParser<RunOutput>;\n let llm: Runnable<BaseLanguageModelInput>;\n if (method === \"jsonMode\") {\n let outputFormatSchema: JsonSchema7Type | undefined;\n if (isInteropZodSchema(schema)) {\n outputParser = StructuredOutputParser.fromZodSchema(schema);\n outputFormatSchema = toJsonSchema(schema);\n } else {\n outputParser = new JsonOutputParser<RunOutput>();\n }\n const options = {\n responseFormat: { type: \"json_object\" },\n ls_structured_output_format: {\n kwargs: { method: \"jsonMode\" },\n schema: outputFormatSchema,\n },\n } as Partial<CallOptions>;\n llm = this.withConfig(options);\n } else {\n if (isInteropZodSchema(schema)) {\n const asJsonSchema = toJsonSchema(schema);\n llm = this.withConfig({\n tools: [\n {\n type: \"function\" as const,\n function: {\n name: functionName,\n description:\n asJsonSchema.description ?? `Tool: ${functionName}`,\n parameters: asJsonSchema,\n },\n },\n ],\n // Ideally that would be set to required but this is not supported yet\n tool_choice: {\n type: \"function\",\n function: {\n name: functionName,\n },\n },\n ls_structured_output_format: {\n kwargs: { method: \"functionCalling\" },\n schema: asJsonSchema,\n },\n } as Partial<CallOptions>);\n outputParser = new WatsonxToolsOutputParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let openAIFunctionDefinition: FunctionDefinition;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n openAIFunctionDefinition = schema as FunctionDefinition;\n functionName = schema.name;\n } else {\n openAIFunctionDefinition = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters: schema,\n };\n }\n llm = this.withConfig({\n tools: [\n {\n type: \"function\" as const,\n function: openAIFunctionDefinition,\n },\n ],\n tool_choice: {\n type: \"function\" as const,\n function: {\n name: functionName,\n },\n },\n ls_structured_output_format: {\n kwargs: { method: \"functionCalling\" },\n schema: toJsonSchema(schema),\n },\n } as Partial<CallOptions>);\n outputParser = new WatsonxToolsOutputParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser) as Runnable<\n BaseLanguageModelInput,\n RunOutput\n >;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // oxlint-disable-next-line typescript/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]);\n }\n}\n"],"mappings":"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AAO;GACL,eAAe;GACf,QAAQ;GACR,QAAQ;GACR,mBAAmB;GACnB,iBAAiB;GACjB,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,cAAc;GACf;;CAGH,IAAI,aAAwC;AAC1C,SAAO;GACL,eAAe;GACf,QAAQ;GACR,QAAQ;GACR,mBAAmB;GACnB,iBAAiB;GACjB,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,cAAc;GACf;;CAGH,YAAY,SAAqD;EAC/D,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,SAAO;GACL,aAAa;GACb,eAAe,KAAK;GACpB,eAAe;GACf,gBAAgB,OAAO,eAAe,KAAA;GACtC,eAAe,OAAO,aAAa,KAAA;GACpC;;CAGH,qBACE,QACA;EACA,MAAM,kBAAkB;GACtB,gBAAgB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GAED,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GAED,QAAQ;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GAED,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GAED,YAAY,CAAC,WAAW;GAExB,kBAAkB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EAED,MAAM,aAAuB;GAC3B,GAAG,gBAAgB;GACnB,GAAG,gBAAgB;GACnB,GAAG,gBAAgB;GACpB;AAED,MAAI,KAAK,aACP,YAAW,KAAK,GAAG,gBAAgB,QAAQ;WAClC,KAAK,SACd,YAAW,KAAK,GAAG,gBAAgB,WAAW;WACrC,KAAK,WAAW,KAAK,UAC9B,YAAW,KAAK,GAAG,gBAAgB,iBAAiB;AAGtD,cAAA,gBAAgB,QAAQ,WAAW;;CAGrC;CAEA;CAEA;CAEA,UAAU;CAEV,eAAe;CAEf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