{"version":3,"sources":["../../../../src/adapters/watsonx/backend/chat.ts"],"names":["Type","WatsonxAiMlVml_v1","WatsonxChatModel","ChatModel","client","emitter","Emitter","root","child","namespace","creator","toolChoiceSupport","providerId","modelId","getEnv","WatsonxClient","ensure","config","name","parameters","undefined","NotImplementedError","_create","input","run","result","instance","textChat","prepareInput","signal","messages","finishReason","usage","extractOutput","choices","id","ChatModelOutput","_createStream","stream","textChatStream","returnObject","toolCallIds","Map","raw","aborted","controller","abort","Array","isArray","data","map","delta","choice","message","toolCallIdsByName","extractToolCall","toolCallId","toolCallName","getLast","get","randomBytes","toString","set","toolName","findLast","Boolean","finish_reason","completionTokens","completion_tokens","promptTokens","prompt_tokens","totalTokens","total_tokens","flatMap","reasoning_content","msg","AssistantMessage","type","text","push","content","tool_calls","length","chunks","toolCall","function","arguments","refusal","filter","isTruthy","overrides","tools","Promise","all","tool","description","getInputJsonSchema","toolConfig","toolChoice","toolChoiceOption","Tool","includes","ToolMessage","role","output","isString","value","JSON","stringify","tool_call_id","SystemMessage","Error","toPlain","spaceId","projectId","isEmpty","responseFormat","JSON_OBJECT","topP","frequencyPenalty","temperature","n","maxTokens","presencePenalty","stop","stopSequences","seed","createSnapshot","shallowCopy","loadSnapshot","snapshot","Object","assign"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,MAAOA,IAAAA,GAAOC,kCAAA,CAAkB,sBAAA,CAAuB,SAAA,CAAU,IAAA;AAY1D,MAAMC,yBAAyBC,kBAAAA,CAAAA;EAxCtC;;;;AAyCqBC,EAAAA,MAAAA;EACHC,OAAAA,GAA4BC,mBAAAA,CAAQC,KAAKC,KAAAA,CAAM;IAC7DC,SAAAA,EAAW;AAAC,MAAA,SAAA;AAAW,MAAA,SAAA;AAAW,MAAA;;IAClCC,OAAAA,EAAS;GACX,CAAA;EACgBC,iBAAAA,GAAkD;AAAC,IAAA,MAAA;AAAQ,IAAA;;AAE3E,EAAA,IAAIC,UAAAA,GAAa;AACf,IAAA,OAAO,SAAA;AACT,EAAA;AAEA,EAAA,WAAA,CACkBC,OAAAA,GAAUC,cAAAA,CAAO,oBAAA,EAAsB,2BAAA,GACvDV,MAAAA,EACA;AACA,IAAA,KAAA,EAAK,EAAA,KAHWS,OAAAA,GAAAA,OAAAA;AAIhB,IAAA,IAAA,CAAKT,MAAAA,GAASW,wBAAAA,CAAcC,MAAAA,CAAOZ,MAAAA,CAAAA;AACrC,EAAA;AAEAa,EAAAA,MAAAA,CAAOA,MAAAA,EAAoB;AACzB,IAAA,KAAA,CAAMA,OAAOA,MAAAA,CAAAA;AACb,IAAA,KAAA,MAAWC,IAAAA,IAAQ;AAAC,MAAA;AAA0C,KAAA,EAAA;AAC5D,MAAA,IAAI,IAAA,CAAKC,UAAAA,CAAWD,IAAAA,CAAAA,KAAUE,MAAAA,EAAW;AACvC,QAAA,IAAA,CAAKD,UAAAA,CAAWD,IAAAA,CAAAA,GAAQE,MAAAA;AACxB,QAAA,MAAM,IAAIC,8BAAAA,CACR,CAAA,SAAA,EAAYH,IAAAA,CAAAA,qDAAAA,CAA2D,CAAA;AAE3E,MAAA;AACF,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;EAEA,MAAgBI,OAAAA,CAAQC,OAAuBC,GAAAA,EAAyB;AACtE,IAAA,MAAM,EAAEC,MAAAA,EAAM,GAAK,MAAM,IAAA,CAAKrB,MAAAA,CAAOsB,SAASC,QAAAA,CAAS;MACrD,GAAI,MAAM,IAAA,CAAKC,YAAAA,CAAaL,KAAAA,CAAAA;AAC5BM,MAAAA,MAAAA,EAAQL,GAAAA,CAAIK;KACd,CAAA;AACA,IAAA,MAAM,EAAEC,QAAAA,EAAUC,YAAAA,EAAcC,KAAAA,EAAK,GAAK,IAAA,CAAKC,aAAAA,CAC7CR,MAAAA,CAAOS,OAAAA,EACPT,MAAAA,CAAOO,KAAAA,EACPP,MAAAA,CAAOU,EAAE,CAAA;AAEX,IAAA,OAAO,IAAIC,wBAAAA,CAAgBN,QAAAA,EAAUE,KAAAA,EAAOD,YAAAA,CAAAA;AAC9C,EAAA;EAEA,OAAOM,aAAAA,CAAcd,OAAuBC,GAAAA,EAA0B;AAEpE,IAAA,MAAMc,MAAAA,GAAS,MAAM,IAAA,CAAKlC,MAAAA,CAAOsB,SAASa,cAAAA,CAAe;MACvD,GAAI,MAAM,IAAA,CAAKX,YAAAA,CAAaL,KAAAA,CAAAA;AAC5BM,MAAAA,MAAAA,EAAQL,GAAAA,CAAIK,MAAAA;MACZW,YAAAA,EAAc;KAChB,CAAA;AAEA,IAAA,MAAMC,WAAAA,uBAAkBC,GAAAA,EAAAA;AACxB,IAAA,WAAA,MAAiBC,OAAOL,MAAAA,EAAQ;AAC9B,MAAA,IAAId,GAAAA,CAAIK,OAAOe,OAAAA,EAAS;AACtBN,QAAAA,MAAAA,CAAOO,UAAAA,CAAWC,KAAAA,CAAMtB,GAAAA,CAAIK,MAAAA,CAAOe,OAAO,CAAA;AAC1C,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAACG,KAAAA,CAAMC,OAAAA,CAAQL,GAAAA,CAAIM,IAAAA,EAAMf,OAAAA,CAAAA,EAAU;AACrC,QAAA;AACF,MAAA;AACA,MAAA,MAAM,EAAEJ,QAAAA,EAAUC,YAAAA,EAAcC,KAAAA,EAAK,GAAK,KAAKC,aAAAA,CAC7CU,GAAAA,CAAIM,IAAAA,CAAKf,OAAAA,CAAQgB,IAAI,CAAC,EAAEC,KAAAA,EAAO,GAAGC,QAAAA,MAAc;QAAE,GAAGA,MAAAA;QAAQC,OAAAA,EAASF;AAAM,OAAA,CAAA,GAC5ER,GAAAA,CAAIM,IAAAA,CAAKjB,OACTW,GAAAA,CAAIM,IAAAA,CAAKd,IACTM,WAAAA,CAAAA;AAEF,MAAA,MAAM,IAAIL,wBAAAA,CAAgBN,QAAAA,EAAUE,KAAAA,EAAOD,YAAAA,CAAAA;AAC7C,IAAA;AACF,EAAA;EAEUE,aAAAA,CACRC,OAAAA,EACAF,KAAAA,EACAG,EAAAA,EACAmB,iBAAAA,EACA;AACA,IAAA,IAAI,CAACA,iBAAAA,EAAmB;AACtBA,MAAAA,iBAAAA,uBAAwBZ,GAAAA,EAAAA;AAC1B,IAAA;AAEA,IAAA,MAAMa,eAAAA,mBAAkB,MAAA,CAAA,CACtBC,UAAAA,EACAC,YAAAA,KAAAA;AAIA,MAAA,IAAI,CAACA,YAAAA,IAAgB,CAACD,UAAAA,EAAY;AAChC,QAAA,CAACC,YAAAA,EAAcD,UAAAA,CAAAA,GAAcE,kBAAAA,CAAQJ,iBAAAA,EAAmB;AAAC,UAAA,EAAA;AAAI,UAAA;AAAG,SAAA,CAAA;AAClE,MAAA;AACA,MAAA,IAAI,CAACE,UAAAA,EAAY;AACfA,QAAAA,UAAAA,GAAaF,iBAAAA,CAAkBK,GAAAA,CAAIF,YAAAA,CAAAA,IAAiB,EAAA;AACtD,MAAA;AACA,MAAA,IAAI,CAACD,UAAAA,EAAY;AACfA,QAAAA,UAAAA,GAAa,iBAAiBI,uBAAAA,CAAY,EAAA,CAAA,CAAIC,QAAAA,CAAS,KAAA,CAAA,CAAA,CAAA;AACzD,MAAA;AACAP,MAAAA,iBAAAA,CAAkBQ,GAAAA,CAAIL,cAAcD,UAAAA,CAAAA;AACpC,MAAA,OAAO;AACLA,QAAAA,UAAAA;QACAO,QAAAA,EAAUN;AACZ,OAAA;IACF,CAAA,EApBwB,iBAAA,CAAA;AAsBxB,IAAA,OAAO;MACL1B,YAAAA,EAAciC,eAAAA,CAAS9B,SAAS,CAACkB,MAAAA,KAAWa,QAAQb,MAAAA,EAAQc,aAAAA,CAAAA,CAAAA,EACxDA,aAAAA;AACJlC,MAAAA,KAAAA,EAAOA,KAAAA,GACH;AACEmC,QAAAA,gBAAAA,EAAkBnC,MAAMoC,iBAAAA,IAAqB,CAAA;AAC7CC,QAAAA,YAAAA,EAAcrC,MAAMsC,aAAAA,IAAiB,CAAA;AACrCC,QAAAA,WAAAA,EAAavC,MAAMwC,YAAAA,IAAgB;OACrC,GACApD,MAAAA;AACJU,MAAAA,QAAAA,EAAUI,OAAAA,CACPuC,OAAAA,CAAQ,CAAC,EAAEpB,SAAO,KAAE;AACnB,QAAA,MAAMvB,WAAsB,EAAA;AAE5B,QAAA,IAAIuB,SAASqB,iBAAAA,EAAmB;AAC9B,UAAA,MAAMC,GAAAA,GAAM,IAAIC,4BAAAA,CACd;YAAEC,IAAAA,EAAM,MAAA;AAAQC,YAAAA,IAAAA,EAAMzB,OAAAA,CAAQqB;WAAkB,EAChD,IACAvC,EAAAA,CAAAA;AAEFL,UAAAA,QAAAA,CAASiD,KAAKJ,GAAAA,CAAAA;AAChB,QAAA;AACA,QAAA,IAAItB,SAAS2B,OAAAA,EAAS;AACpB,UAAA,MAAML,GAAAA,GAAM,IAAIC,4BAAAA,CAAiB;YAAEC,IAAAA,EAAM,MAAA;AAAQC,YAAAA,IAAAA,EAAMzB,OAAAA,CAAQ2B;WAAQ,EAAG,IAAI7C,EAAAA,CAAAA;AAC9EL,UAAAA,QAAAA,CAASiD,KAAKJ,GAAAA,CAAAA;AAChB,QAAA;AACA,QAAA,IAAItB,OAAAA,EAAS4B,UAAAA,IAAc5B,OAAAA,CAAQ4B,UAAAA,CAAWC,SAAS,CAAA,EAAG;AACxD,UAAA,MAAMC,SAAyB,EAAA;AAC/B,UAAA,KAAA,MAAWC,QAAAA,IAAY/B,QAAQ4B,UAAAA,EAAY;AACzCE,YAAAA,MAAAA,CAAOJ,IAAAA,CAAK;cACVF,IAAAA,EAAM,WAAA;AACN,cAAA,GAAGtB,eAAAA,CAAgB6B,QAAAA,CAASjD,EAAAA,EAAIiD,QAAAA,CAASC,SAASnE,IAAI,CAAA;AACtDK,cAAAA,KAAAA,EAAO6D,SAASC,QAAAA,CAASC;aAC3B,CAAA;AACF,UAAA;AACA,UAAA,MAAMX,MAAM,IAAIC,4BAAAA,CAAiBO,MAAAA,EAAQ,IAAIhD,EAAAA,CAAAA;AAC7CL,UAAAA,QAAAA,CAASiD,KAAKJ,GAAAA,CAAAA;AAChB,QAAA;AACA,QAAA,IAAItB,SAASkC,OAAAA,EAAS;AACpB,UAAA,MAAMZ,GAAAA,GAAM,IAAIC,4BAAAA,CAAiB;YAAEC,IAAAA,EAAM,MAAA;AAAQC,YAAAA,IAAAA,EAAMzB,OAAAA,CAAQkC;WAAQ,EAAG,IAAIpD,EAAAA,CAAAA;AAC9EL,UAAAA,QAAAA,CAASiD,KAAKJ,GAAAA,CAAAA;AAChB,QAAA;AACA,QAAA,OAAO7C,QAAAA;MACT,CAAA,CAAA,CACC0D,OAAOC,eAAAA;AACZ,KAAA;AACF,EAAA;AAEA,EAAA,MAAgB7D,aAAa8D,SAAAA,EAAoD;AAC/E,IAAA,MAAMnE,KAAAA,GAAwB;AAAE,MAAA,GAAG,IAAA,CAAKJ,UAAAA;MAAY,GAAGuE;AAAU,KAAA;AACjE,IAAA,MAAMC,KAAAA,GAAkC,MAAMC,OAAAA,CAAQC,GAAAA,CAAAA,CACnDtE,KAAAA,CAAMoE,SAAS,EAAA,EAAIzC,GAAAA,CAAI,OAAO4C,IAAAA,MAAU;MACvCjB,IAAAA,EAAM,UAAA;MACNQ,QAAAA,EAAU;AACRnE,QAAAA,IAAAA,EAAM4E,IAAAA,CAAK5E,IAAAA;AACX6E,QAAAA,WAAAA,EAAaD,IAAAA,CAAKC,WAAAA;QAClB5E,UAAAA,EAAY,MAAM2E,KAAKE,kBAAAA;AACzB;AACF,KAAA,CAAA,CAAA,CAAA;AAGF,IAAA,MAAMC,UAAAA,GAAsE;MAC1EC,UAAAA,EAAY9E,MAAAA;MACZ+E,gBAAAA,EAAkB/E;AACpB,KAAA;AACA,IAAA,IAAIG,MAAM2E,UAAAA,EAAY;AACpB,MAAA,IAAI3E,KAAAA,CAAM2E,sBAAsBE,aAAAA,EAAM;AACpCH,QAAAA,UAAAA,CAAWC,UAAAA,GAAa;UACtBrB,IAAAA,EAAM,UAAA;UACNQ,QAAAA,EAAU;AAAEnE,YAAAA,IAAAA,EAAMK,MAAM2E,UAAAA,CAAWhF;AAAK;AAC1C,SAAA;AACF,MAAA,CAAA,MAAA,IAAW,IAAA,CAAKP,iBAAAA,CAAkB0F,QAAAA,CAAS9E,KAAAA,CAAM2E,UAAU,CAAA,EAAG;AAC5DD,QAAAA,UAAAA,CAAWE,mBAAmB5E,KAAAA,CAAM2E,UAAAA;AACtC,MAAA;AACF,IAAA;AAEA,IAAA,OAAO;AACLrF,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACdiB,MAAAA,QAAAA,EAAUP,KAAAA,CAAMO,QAAAA,CAAS2C,OAAAA,CAAQ,CAACpB,OAAAA,KAAAA;AAChC,QAAA,IAAIA,mBAAmBiD,uBAAAA,EAAa;AAClC,UAAA,OAAOjD,OAAAA,CAAQ2B,OAAAA,CAAQ9B,GAAAA,CACrB,CAAC8B,OAAAA,MAAkC;YACjCuB,IAAAA,EAAM,MAAA;AACNvB,YAAAA,OAAAA,EACE,OAAA,IAAWA,OAAAA,CAAQwB,MAAAA,IAAUC,eAAAA,CAASzB,OAAAA,CAAQwB,MAAAA,CAAOE,KAAK,CAAA,GACtD1B,OAAAA,CAAQwB,MAAAA,CAAOE,KAAAA,GACfC,IAAAA,CAAKC,UAAU5B,OAAAA,CAAAA;AACrB6B,YAAAA,YAAAA,EAAc7B,OAAAA,CAAQxB;WACxB,CAAA,CAAA;AAEJ,QAAA,CAAA,MAAA,IAAWH,mBAAmByD,yBAAAA,EAAe;AAC3C,UAAA,OAAOzD,OAAAA,CAAQ2B,OAAAA,CAAQ9B,GAAAA,CACrB,CAAC8B,OAAAA,MAAoC;YACnCuB,IAAAA,EAAM,QAAA;AACNvB,YAAAA,OAAAA,EAASA,OAAAA,CAAQF;WACnB,CAAA,CAAA;AAEJ,QAAA,CAAA,MAAA,IAAWzB,mBAAmBuB,4BAAAA,EAAkB;AAC9C,UAAA,OAAOvB,OAAAA,CAAQ2B,OAAAA,CAAQ9B,GAAAA,CACrB,CAAC8B,OAAAA,MAAuC;YACtCuB,IAAAA,EAAM,WAAA;YACN,GAAIvB,OAAAA,CAAQH,SAAS,MAAA,IAAU;AAC7BG,cAAAA,OAAAA,EAASA,OAAAA,CAAQF;AACnB,aAAA;YACA,GAAIE,OAAAA,CAAQH,SAAS,WAAA,IAAe;AAClC1C,cAAAA,EAAAA,EAAI6C,OAAAA,CAAQxB,UAAAA;cACZqB,IAAAA,EAAM,UAAA;cACNQ,QAAAA,EAAU;AACRnE,gBAAAA,IAAAA,EAAM8D,OAAAA,CAAQjB,QAAAA;gBACduB,SAAAA,EAAWqB,IAAAA,CAAKC,SAAAA,CAAU5B,OAAAA,CAAQzD,KAAK;AACzC;AACF,aAAA;AACA,YAAA,GAAA,CAAI,MAAA;AACF,cAAA,IAAIyD,OAAAA,CAAQH,SAAS,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAIkC,MAAM,8CAAA,CAAA;AAClB,cAAA;AACA,cAAA,OAAO,EAAC;YACV,CAAA;WACF,CAAA,CAAA;QAEJ,CAAA,MAAO;AACL,UAAA,OAAO;AAAC1D,YAAAA,OAAAA,CAAQ2D,OAAAA;;AAClB,QAAA;MACF,CAAA,CAAA;AACAC,MAAAA,OAAAA,EAAS,KAAK7G,MAAAA,CAAO6G,OAAAA;AACrBC,MAAAA,SAAAA,EAAW,KAAK9G,MAAAA,CAAO8G,SAAAA;MACvBvB,KAAAA,EAAOwB,cAAAA,CAAQxB,KAAAA,CAAAA,GAASvE,MAAAA,GAAYuE,KAAAA;MACpCyB,cAAAA,EAAgBhG,MAAAA;AAChB,MAAA,GAAIG,MAAM6F,cAAAA,IAAkB;QAC1BA,cAAAA,EAAgB;AAAEvC,UAAAA,IAAAA,EAAM7E,IAAAA,CAAKqH;AAAY;AAC3C,OAAA;AACAC,MAAAA,IAAAA,EAAM/F,KAAAA,CAAM+F,IAAAA;AACZC,MAAAA,gBAAAA,EAAkBhG,KAAAA,CAAMgG,gBAAAA;AACxBC,MAAAA,WAAAA,EAAajG,KAAAA,CAAMiG,WAAAA;AACnBC,MAAAA,CAAAA,EAAGlG,KAAAA,CAAMkG,CAAAA;AACTC,MAAAA,SAAAA,EAAWnG,KAAAA,CAAMmG,SAAAA;AACjBC,MAAAA,eAAAA,EAAiBpG,KAAAA,CAAMoG,eAAAA;AACvBC,MAAAA,IAAAA,EAAMrG,KAAAA,CAAMsG,aAAAA;AACZC,MAAAA,IAAAA,EAAMvG,KAAAA,CAAMuG,IAAAA;MACZ,GAAG7B;AACL,KAAA;AACF,EAAA;EAEA8B,cAAAA,GAAiB;AACf,IAAA,OAAO;AACL,MAAA,GAAG,MAAMA,cAAAA,EAAAA;AACTlH,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;MACdM,UAAAA,EAAY6G,qBAAAA,CAAY,KAAK7G,UAAU,CAAA;AACvCf,MAAAA,MAAAA,EAAQ,IAAA,CAAKA;AACf,KAAA;AACF,EAAA;AAEA6H,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB,EAAA;AACF","file":"chat.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n  ChatConfig,\n  ChatModel,\n  ChatModelEmitter,\n  ChatModelInput,\n  ChatModelOutput,\n  ChatModelParameters,\n  ChatModelToolChoiceSupport,\n} from \"@/backend/chat.js\";\nimport { WatsonxClient, WatsonxClientSettings } from \"@/adapters/watsonx/backend/client.js\";\nimport { findLast, isEmpty, isString, isTruthy } from \"remeda\";\nimport WatsonxAiMlVml_v1, {\n  TextChatMessages,\n  TextChatParameterTools,\n  TextChatParams,\n  TextChatResultChoice,\n  TextChatUsage,\n} from \"@ibm-cloud/watsonx-ai/dist/watsonx-ai-ml/vml_v1.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { AssistantMessage, Message, SystemMessage, ToolMessage } from \"@/backend/message.js\";\nimport { ToolCallPart } from \"ai\";\nimport Type = WatsonxAiMlVml_v1.TextChatResponseFormat.Constants.Type;\nimport { getEnv } from \"@/internals/env.js\";\nimport { NotImplementedError } from \"@/errors.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport type {\n  TextChatMessageAssistant,\n  TextChatMessageSystem,\n  TextChatMessageTool,\n} from \"@ibm-cloud/watsonx-ai\";\nimport { getLast } from \"@/internals/helpers/object.js\";\nimport { randomBytes } from \"node:crypto\";\n\nexport class WatsonxChatModel extends ChatModel {\n  protected readonly client: WatsonxClient;\n  public readonly emitter: ChatModelEmitter = Emitter.root.child({\n    namespace: [\"backend\", \"watsonx\", \"chat\"],\n    creator: this,\n  });\n  public readonly toolChoiceSupport: ChatModelToolChoiceSupport[] = [\"none\", \"single\"];\n\n  get providerId() {\n    return \"watsonx\";\n  }\n\n  constructor(\n    public readonly modelId = getEnv(\"WATSONX_CHAT_MODEL\", \"ibm/granite-3-8b-instruct\"),\n    client?: WatsonxClient | WatsonxClientSettings,\n  ) {\n    super();\n    this.client = WatsonxClient.ensure(client);\n  }\n\n  config(config: ChatConfig) {\n    super.config(config);\n    for (const name of [\"topK\"] as (keyof ChatModelParameters)[]) {\n      if (this.parameters[name] !== undefined) {\n        this.parameters[name] = undefined;\n        throw new NotImplementedError(\n          `Setting \"${name}\" parameter is not supported for WatsonX Chat Models.`,\n        );\n      }\n    }\n    return this;\n  }\n\n  protected async _create(input: ChatModelInput, run: GetRunContext<any>) {\n    const { result } = await this.client.instance.textChat({\n      ...(await this.prepareInput(input)),\n      signal: run.signal,\n    });\n    const { messages, finishReason, usage } = this.extractOutput(\n      result.choices,\n      result.usage,\n      result.id,\n    );\n    return new ChatModelOutput(messages, usage, finishReason);\n  }\n\n  async *_createStream(input: ChatModelInput, run: GetRunContext<this>) {\n    // @ts-ignore\n    const stream = await this.client.instance.textChatStream({\n      ...(await this.prepareInput(input)),\n      signal: run.signal,\n      returnObject: true,\n    });\n\n    const toolCallIds = new Map<string, string>(); // toolName / id\n    for await (const raw of stream) {\n      if (run.signal.aborted) {\n        stream.controller.abort(run.signal.aborted);\n        break;\n      }\n      if (!Array.isArray(raw.data?.choices)) {\n        continue;\n      }\n      const { messages, finishReason, usage } = this.extractOutput(\n        raw.data.choices.map(({ delta, ...choice }) => ({ ...choice, message: delta })),\n        raw.data.usage,\n        raw.data.id,\n        toolCallIds,\n      );\n      yield new ChatModelOutput(messages, usage, finishReason);\n    }\n  }\n\n  protected extractOutput(\n    choices: TextChatResultChoice[],\n    usage?: TextChatUsage,\n    id?: string,\n    toolCallIdsByName?: Map<string, string>,\n  ) {\n    if (!toolCallIdsByName) {\n      toolCallIdsByName = new Map();\n    }\n\n    const extractToolCall = (\n      toolCallId: string,\n      toolCallName: string,\n    ): Pick<ToolCallPart, \"toolName\" | \"toolCallId\"> => {\n      // Some tool call parts don't have the 'id'\n      // this function tries to guess it based on the previous chunks\n      if (!toolCallName && !toolCallId) {\n        [toolCallName, toolCallId] = getLast(toolCallIdsByName, [\"\", \"\"]);\n      }\n      if (!toolCallId) {\n        toolCallId = toolCallIdsByName.get(toolCallName) || \"\";\n      }\n      if (!toolCallId) {\n        toolCallId = `chatcmpl-tool-${randomBytes(16).toString(\"hex\")}`;\n      }\n      toolCallIdsByName.set(toolCallName, toolCallId);\n      return {\n        toolCallId: toolCallId,\n        toolName: toolCallName,\n      };\n    };\n\n    return {\n      finishReason: findLast(choices, (choice) => Boolean(choice?.finish_reason))\n        ?.finish_reason as ChatModelOutput[\"finishReason\"],\n      usage: usage\n        ? {\n            completionTokens: usage.completion_tokens ?? 0,\n            promptTokens: usage.prompt_tokens ?? 0,\n            totalTokens: usage.total_tokens ?? 0,\n          }\n        : undefined,\n      messages: choices\n        .flatMap(({ message }) => {\n          const messages: Message[] = [];\n\n          if (message?.reasoning_content) {\n            const msg = new AssistantMessage(\n              { type: \"text\", text: message.reasoning_content },\n              {},\n              id,\n            );\n            messages.push(msg);\n          }\n          if (message?.content) {\n            const msg = new AssistantMessage({ type: \"text\", text: message.content }, {}, id);\n            messages.push(msg);\n          }\n          if (message?.tool_calls && message.tool_calls.length > 0) {\n            const chunks: ToolCallPart[] = [];\n            for (const toolCall of message.tool_calls) {\n              chunks.push({\n                type: \"tool-call\",\n                ...extractToolCall(toolCall.id, toolCall.function.name),\n                input: toolCall.function.arguments,\n              });\n            }\n            const msg = new AssistantMessage(chunks, {}, id);\n            messages.push(msg);\n          }\n          if (message?.refusal) {\n            const msg = new AssistantMessage({ type: \"text\", text: message.refusal }, {}, id);\n            messages.push(msg);\n          }\n          return messages;\n        })\n        .filter(isTruthy),\n    };\n  }\n\n  protected async prepareInput(overrides: ChatModelInput): Promise<TextChatParams> {\n    const input: ChatModelInput = { ...this.parameters, ...overrides };\n    const tools: TextChatParameterTools[] = await Promise.all(\n      (input.tools ?? []).map(async (tool) => ({\n        type: \"function\",\n        function: {\n          name: tool.name,\n          description: tool.description,\n          parameters: await tool.getInputJsonSchema(),\n        },\n      })),\n    );\n\n    const toolConfig: Pick<TextChatParams, \"toolChoice\" | \"toolChoiceOption\"> = {\n      toolChoice: undefined,\n      toolChoiceOption: undefined,\n    };\n    if (input.toolChoice) {\n      if (input.toolChoice instanceof Tool) {\n        toolConfig.toolChoice = {\n          type: \"function\",\n          function: { name: input.toolChoice.name },\n        };\n      } else if (this.toolChoiceSupport.includes(input.toolChoice)) {\n        toolConfig.toolChoiceOption = input.toolChoice;\n      }\n    }\n\n    return {\n      modelId: this.modelId,\n      messages: input.messages.flatMap((message): TextChatMessages[] => {\n        if (message instanceof ToolMessage) {\n          return message.content.map(\n            (content): TextChatMessageTool => ({\n              role: \"tool\",\n              content:\n                \"value\" in content.output && isString(content.output.value)\n                  ? content.output.value\n                  : JSON.stringify(content),\n              tool_call_id: content.toolCallId,\n            }),\n          );\n        } else if (message instanceof SystemMessage) {\n          return message.content.map(\n            (content): TextChatMessageSystem => ({\n              role: \"system\",\n              content: content.text,\n            }),\n          );\n        } else if (message instanceof AssistantMessage) {\n          return message.content.map(\n            (content): TextChatMessageAssistant => ({\n              role: \"assistant\",\n              ...(content.type === \"text\" && {\n                content: content.text,\n              }),\n              ...(content.type === \"tool-call\" && {\n                id: content.toolCallId,\n                type: \"function\",\n                function: {\n                  name: content.toolName,\n                  arguments: JSON.stringify(content.input),\n                },\n              }),\n              ...(() => {\n                if (content.type === \"file\") {\n                  throw new Error(\"Assistants cannot send a file in IBM watsonx\");\n                }\n                return {};\n              })(),\n            }),\n          );\n        } else {\n          return [message.toPlain()];\n        }\n      }),\n      spaceId: this.client.spaceId,\n      projectId: this.client.projectId,\n      tools: isEmpty(tools) ? undefined : tools,\n      responseFormat: undefined,\n      ...(input.responseFormat && {\n        responseFormat: { type: Type.JSON_OBJECT },\n      }),\n      topP: input.topP,\n      frequencyPenalty: input.frequencyPenalty,\n      temperature: input.temperature,\n      n: input.n,\n      maxTokens: input.maxTokens,\n      presencePenalty: input.presencePenalty,\n      stop: input.stopSequences,\n      seed: input.seed,\n      ...toolConfig,\n    };\n  }\n\n  createSnapshot() {\n    return {\n      ...super.createSnapshot(),\n      modelId: this.modelId,\n      parameters: shallowCopy(this.parameters),\n      client: this.client,\n    };\n  }\n\n  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n    Object.assign(this, snapshot);\n  }\n}\n"]}