{"version":3,"file":"chat_models.cjs","names":["BaseChatModel","AIMessage"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessage, BaseMessage } from \"@langchain/core/messages\";\nimport { ChatResult, ChatGeneration } from \"@langchain/core/outputs\";\nimport { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nimport { YandexGPTInputs } from \"./llms.js\";\n\nconst apiUrl =\n  \"https://llm.api.cloud.yandex.net/foundationModels/v1/completion\";\n\ninterface ParsedMessage {\n  role: string;\n  text: string;\n}\n\nfunction _parseChatHistory(history: BaseMessage[]): ParsedMessage[] {\n  const chatHistory: ParsedMessage[] = [];\n\n  for (const message of history) {\n    if (typeof message.content !== \"string\") {\n      throw new Error(\n        \"ChatYandexGPT does not support non-string message content.\"\n      );\n    }\n    if (\"content\" in message) {\n      if (message._getType() === \"human\") {\n        chatHistory.push({ role: \"user\", text: message.content });\n      } else if (message._getType() === \"ai\") {\n        chatHistory.push({ role: \"assistant\", text: message.content });\n      } else if (message._getType() === \"system\") {\n        chatHistory.push({ role: \"system\", text: message.content });\n      }\n    }\n  }\n\n  return chatHistory;\n}\n\n/**\n * @example\n * ```typescript\n * const chat = new ChatYandexGPT({});\n * // The assistant is set to translate English to French.\n * const res = await chat.invoke([\n *   new SystemMessage(\n *     \"You are a helpful assistant that translates English to French.\"\n *   ),\n *   new HumanMessage(\"I love programming.\"),\n * ]);\n * ```\n */\nexport class ChatYandexGPT extends BaseChatModel {\n  apiKey?: string;\n\n  iamToken?: string;\n\n  temperature = 0.6;\n\n  maxTokens = 1700;\n\n  model = \"yandexgpt-lite\";\n\n  modelVersion = \"latest\";\n\n  modelURI?: string;\n\n  folderID?: string;\n\n  constructor(model: string, fields?: Omit<YandexGPTInputs, \"model\">);\n  constructor(fields?: YandexGPTInputs);\n  constructor(\n    modelOrFields?: string | YandexGPTInputs,\n    fields?: Omit<YandexGPTInputs, \"model\">\n  ) {\n    const params =\n      typeof modelOrFields === \"string\"\n        ? { ...(fields ?? {}), model: modelOrFields }\n        : (modelOrFields ?? {});\n    super(params);\n    this._addVersion(\"@langchain/yandex\", __PKG_VERSION__);\n\n    const apiKey = params.apiKey ?? getEnvironmentVariable(\"YC_API_KEY\");\n\n    const iamToken = params.iamToken ?? getEnvironmentVariable(\"YC_IAM_TOKEN\");\n\n    const folderID = params.folderID ?? getEnvironmentVariable(\"YC_FOLDER_ID\");\n\n    if (apiKey === undefined && iamToken === undefined) {\n      throw new Error(\n        \"Please set the YC_API_KEY or YC_IAM_TOKEN environment variable or pass it to the constructor as the apiKey or iamToken field.\"\n      );\n    }\n\n    this.modelURI = params.modelURI;\n    this.apiKey = apiKey;\n    this.iamToken = iamToken;\n    this.folderID = folderID;\n    this.maxTokens = params.maxTokens ?? this.maxTokens;\n    this.temperature = params.temperature ?? this.temperature;\n    this.model = params.model ?? this.model;\n    this.modelVersion = params.modelVersion ?? this.modelVersion;\n\n    if (this.modelURI === undefined && folderID === undefined) {\n      throw new Error(\n        \"Please set the YC_FOLDER_ID environment variable or pass Yandex GPT model URI to the constructor as the modelURI field.\"\n      );\n    }\n\n    if (!this.modelURI) {\n      this.modelURI = `gpt://${this.folderID}/${this.model}/${this.modelVersion}`;\n    }\n  }\n\n  _llmType() {\n    return \"yandexgpt\";\n  }\n\n  _combineLLMOutput?() {\n    return {};\n  }\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"YC_API_KEY\",\n      iamToken: \"YC_IAM_TOKEN\",\n      folderID: \"YC_FOLDER_ID\",\n    };\n  }\n\n  /** @ignore */\n  async _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    _runManager?: CallbackManagerForLLMRun | undefined\n  ): Promise<ChatResult> {\n    const messageHistory = _parseChatHistory(messages);\n    const headers = {\n      \"Content-Type\": \"application/json\",\n      Authorization: \"\",\n      \"x-folder-id\": \"\",\n    };\n    if (this.apiKey !== undefined) {\n      headers.Authorization = `Api-Key ${this.apiKey}`;\n      if (this.folderID !== undefined) {\n        headers[\"x-folder-id\"] = this.folderID;\n      }\n    } else {\n      headers.Authorization = `Bearer ${this.iamToken}`;\n    }\n    const bodyData = {\n      modelUri: this.modelURI,\n      completionOptions: {\n        temperature: this.temperature,\n        maxTokens: this.maxTokens,\n      },\n      messages: messageHistory,\n    };\n    const response = await fetch(apiUrl, {\n      method: \"POST\",\n      headers,\n      body: JSON.stringify(bodyData),\n      signal: options?.signal,\n    });\n    if (!response.ok) {\n      throw new Error(\n        `Failed to fetch ${apiUrl} from YandexGPT: ${response.status}`\n      );\n    }\n    const responseData = await response.json();\n    const { result } = responseData;\n    const { text } = result.alternatives[0].message;\n    const { totalTokens } = result.usage;\n    const generations: ChatGeneration[] = [\n      { text, message: new AIMessage(text) },\n    ];\n\n    return {\n      generations,\n      llmOutput: { totalTokens },\n    };\n  }\n}\n"],"mappings":";;;;;;AAQA,MAAM,SACJ;AAOF,SAAS,kBAAkB,SAAyC;CAClE,MAAM,cAA+B,EAAE;AAEvC,MAAK,MAAM,WAAW,SAAS;AAC7B,MAAI,OAAO,QAAQ,YAAY,SAC7B,OAAM,IAAI,MACR,6DACD;AAEH,MAAI,aAAa,SACf;OAAI,QAAQ,UAAU,KAAK,QACzB,aAAY,KAAK;IAAE,MAAM;IAAQ,MAAM,QAAQ;IAAS,CAAC;YAChD,QAAQ,UAAU,KAAK,KAChC,aAAY,KAAK;IAAE,MAAM;IAAa,MAAM,QAAQ;IAAS,CAAC;YACrD,QAAQ,UAAU,KAAK,SAChC,aAAY,KAAK;IAAE,MAAM;IAAU,MAAM,QAAQ;IAAS,CAAC;;;AAKjE,QAAO;;;;;;;;;;;;;;;AAgBT,IAAa,gBAAb,cAAmCA,0DAAc;CAC/C;CAEA;CAEA,cAAc;CAEd,YAAY;CAEZ,QAAQ;CAER,eAAe;CAEf;CAEA;CAIA,YACE,eACA,QACA;EACA,MAAM,SACJ,OAAO,kBAAkB,WACrB;GAAE,GAAI,UAAU,EAAE;GAAG,OAAO;GAAe,GAC1C,iBAAiB,EAAE;AAC1B,QAAM,OAAO;AACb,OAAK,YAAY,6BAAqC;EAEtD,MAAM,SAAS,OAAO,gEAAiC,aAAa;EAEpE,MAAM,WAAW,OAAO,kEAAmC,eAAe;EAE1E,MAAM,WAAW,OAAO,kEAAmC,eAAe;AAE1E,MAAI,WAAW,UAAa,aAAa,OACvC,OAAM,IAAI,MACR,gIACD;AAGH,OAAK,WAAW,OAAO;AACvB,OAAK,SAAS;AACd,OAAK,WAAW;AAChB,OAAK,WAAW;AAChB,OAAK,YAAY,OAAO,aAAa,KAAK;AAC1C,OAAK,cAAc,OAAO,eAAe,KAAK;AAC9C,OAAK,QAAQ,OAAO,SAAS,KAAK;AAClC,OAAK,eAAe,OAAO,gBAAgB,KAAK;AAEhD,MAAI,KAAK,aAAa,UAAa,aAAa,OAC9C,OAAM,IAAI,MACR,0HACD;AAGH,MAAI,CAAC,KAAK,SACR,MAAK,WAAW,SAAS,KAAK,SAAS,GAAG,KAAK,MAAM,GAAG,KAAK;;CAIjE,WAAW;AACT,SAAO;;CAGT,oBAAqB;AACnB,SAAO,EAAE;;CAGX,IAAI,aAAoD;AACtD,SAAO;GACL,QAAQ;GACR,UAAU;GACV,UAAU;GACX;;;CAIH,MAAM,UACJ,UACA,SACA,aACqB;EACrB,MAAM,iBAAiB,kBAAkB,SAAS;EAClD,MAAM,UAAU;GACd,gBAAgB;GAChB,eAAe;GACf,eAAe;GAChB;AACD,MAAI,KAAK,WAAW,QAAW;AAC7B,WAAQ,gBAAgB,WAAW,KAAK;AACxC,OAAI,KAAK,aAAa,OACpB,SAAQ,iBAAiB,KAAK;QAGhC,SAAQ,gBAAgB,UAAU,KAAK;EAEzC,MAAM,WAAW;GACf,UAAU,KAAK;GACf,mBAAmB;IACjB,aAAa,KAAK;IAClB,WAAW,KAAK;IACjB;GACD,UAAU;GACX;EACD,MAAM,WAAW,MAAM,MAAM,QAAQ;GACnC,QAAQ;GACR;GACA,MAAM,KAAK,UAAU,SAAS;GAC9B,QAAQ,SAAS;GAClB,CAAC;AACF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MACR,mBAAmB,OAAO,mBAAmB,SAAS,SACvD;EAGH,MAAM,EAAE,WADa,MAAM,SAAS,MAAM;EAE1C,MAAM,EAAE,SAAS,OAAO,aAAa,GAAG;EACxC,MAAM,EAAE,gBAAgB,OAAO;AAK/B,SAAO;GACL,aALoC,CACpC;IAAE;IAAM,SAAS,IAAIC,mCAAU,KAAK;IAAE,CACvC;GAIC,WAAW,EAAE,aAAa;GAC3B"}