{"version":3,"file":"zhipuai.cjs","names":["ChatMessage","BaseChatModel","AIMessage","encodeApiKey","convertEventStreamToIterableReadableDataStream","ChatGenerationChunk","AIMessageChunk"],"sources":["../../src/chat_models/zhipuai.ts"],"sourcesContent":["import {\n  BaseChatModel,\n  BaseChatModelCallOptions,\n  BindToolsInput,\n  type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n  AIMessage,\n  type BaseMessage,\n  ChatMessage,\n  AIMessageChunk,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { type CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nimport { encodeApiKey } from \"../utils/zhipuai.js\";\nimport { convertEventStreamToIterableReadableDataStream } from \"../utils/event_source_parse.js\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport {\n  BaseLanguageModelInput,\n  ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport { convertToOpenAITool } from \"@langchain/core/utils/function_calling\";\nimport {\n  makeInvalidToolCall,\n  parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\n\nexport type ZhipuMessageRole = \"system\" | \"assistant\" | \"user\";\n\ninterface ZhipuMessage {\n  role: ZhipuMessageRole;\n  content: string;\n}\n\n/**\n * Interface representing a request for a chat completion.\n *\n * See https://open.bigmodel.cn/dev/howuse/model\n */\ntype ModelName =\n  | (string & NonNullable<unknown>)\n  // will be deprecated models\n  | \"chatglm_pro\" // deprecated in 2024-12-31T23:59:59+0800，point to glm-4\n  | \"chatglm_std\" // deprecated in 2024-12-31T23:59:59+0800，point to glm-3-turbo\n  | \"chatglm_lite\" // deprecated in 2024-12-31T23:59:59+0800，point to glm-3-turbo\n  // GLM-4 more powerful on Q/A and text generation, suitable for complex dialog interactions and deep content creation design.\n  | \"glm-4\" // context size: 128k\n  | \"glm-4v\" // context size: 2k\n  // ChatGLM-Turbo\n  | \"glm-3-turbo\" // context size: 128k\n  | \"chatglm_turbo\"; // context size: 32k\n\nexport interface ChatZhipuAICallOptions extends BaseChatModelCallOptions {\n  tools?: BindToolsInput[];\n}\n\ninterface ChatCompletionRequest {\n  model: ModelName;\n  messages?: ZhipuMessage[];\n  tools?: ToolDefinition[];\n  do_sample?: boolean;\n  stream?: boolean;\n  request_id?: string;\n  max_tokens?: number | null;\n  top_p?: number | null;\n  top_k?: number | null;\n  temperature?: number | null;\n  stop?: string[];\n}\n\ninterface BaseResponse {\n  code?: string;\n  message?: string;\n}\n\ninterface ChoiceMessage {\n  role: string;\n  content?: string;\n  tool_calls?: ToolCall[];\n}\n\ninterface ToolCall {\n  id: string;\n  type: string;\n  index: number;\n  function: {\n    name: string;\n    arguments: string; // Model-generated function call parameters list in JSON format.\n  };\n}\n\ninterface ResponseChoice {\n  index: number;\n  finish_reason: \"stop\" | \"tool_calls\" | \"length\" | \"null\" | null;\n  delta: ChoiceMessage;\n  message: ChoiceMessage;\n}\n\ninterface ZhipuAIError {\n  error: BaseResponse;\n}\n\n/**\n * Interface representing a response from a chat completion.\n */\ninterface ChatCompletionResponse extends ZhipuAIError {\n  choices: ResponseChoice[];\n  created: number;\n  id: string;\n  model: string;\n  request_id: string;\n  usage: {\n    completion_tokens: number;\n    prompt_tokens: number;\n    total_tokens: number;\n  };\n  output: {\n    text: string;\n    finish_reason: \"stop\" | \"tool_calls\" | \"length\" | \"null\" | null;\n    tool_calls?: ToolCall[];\n  };\n}\n\n/**\n * Interface defining the input to the ZhipuAIChatInput class.\n */\nexport interface ChatZhipuAIParams {\n  /**\n   * @default \"glm-3-turbo\"\n   * Alias for `model`\n   */\n  modelName: ModelName;\n  /**\n   * @default \"glm-3-turbo\"\n   */\n  model: ModelName;\n\n  /** Whether to stream the results or not. Defaults to false. */\n  streaming?: boolean;\n\n  /** Messages to pass as a prefix to the prompt */\n  messages?: ZhipuMessage[];\n\n  /**\n   * API key to use when making requests. Defaults to the value of\n   * `ZHIPUAI_API_KEY` environment variable.\n   * Alias for `apiKey`\n   */\n  zhipuAIApiKey?: string;\n\n  /**\n   * API key to use when making requests. Defaults to the value of\n   * `ZHIPUAI_API_KEY` environment variable.\n   */\n  apiKey?: string;\n\n  /** Amount of randomness injected into the response. Ranges\n   * from 0 to 1 (0 is not included). Use temp closer to 0 for analytical /\n   * multiple choice, and temp closer to 1 for creative\n   * and generative tasks. Defaults to 0.95\n   */\n  temperature?: number;\n\n  /** Total probability mass of tokens to consider at each step. Range\n   * from 0 to 1 Defaults to 0.7\n   */\n  topP?: number;\n\n  /**\n   * Unique identifier for the request. Defaults to a random UUID.\n   */\n  requestId?: string;\n\n  /**\n   * turn on sampling strategy when do_sample is true,\n   * do_sample is false, temperature、top_p will not take effect\n   */\n  doSample?: boolean;\n\n  /**\n   * max value is 8192，defaults to 1024\n   */\n  maxTokens?: number;\n\n  stop?: string[];\n}\n\nfunction messageToRole(message: BaseMessage): ZhipuMessageRole {\n  const type = message._getType();\n  switch (type) {\n    case \"ai\":\n      return \"assistant\";\n    case \"human\":\n      return \"user\";\n    case \"system\":\n      return \"system\";\n    case \"function\":\n      throw new Error(\"Function messages not supported yet\");\n    case \"generic\": {\n      if (!ChatMessage.isInstance(message)) {\n        throw new Error(\"Invalid generic chat message\");\n      }\n      if ([\"system\", \"assistant\", \"user\"].includes(message.role)) {\n        return message.role as ZhipuMessageRole;\n      }\n      throw new Error(`Unknown message type: ${type}`);\n    }\n    default:\n      throw new Error(`Unknown message type: ${type}`);\n  }\n}\n\nfunction parseRawToolCalls(rawToolCalls: ToolCall[]) {\n  const toolCalls = [];\n  const invalidToolCalls = [];\n  for (const rawToolCall of rawToolCalls) {\n    try {\n      toolCalls.push(parseToolCall(rawToolCall, { returnId: true }));\n      // oxlint-disable-next-line typescript/no-explicit-any\n    } catch (e: any) {\n      invalidToolCalls.push(makeInvalidToolCall(rawToolCall, e.message));\n    }\n  }\n  return { toolCalls, invalidToolCalls };\n}\n\nexport class ChatZhipuAI\n  extends BaseChatModel<ChatZhipuAICallOptions>\n  implements ChatZhipuAIParams\n{\n  static lc_name() {\n    return \"ChatZhipuAI\";\n  }\n\n  get callKeys() {\n    return [\"stop\", \"signal\", \"options\"];\n  }\n\n  get lc_secrets() {\n    return {\n      zhipuAIApiKey: \"ZHIPUAI_API_KEY\",\n      apiKey: \"ZHIPUAI_API_KEY\",\n    };\n  }\n\n  get lc_aliases() {\n    return undefined;\n  }\n\n  zhipuAIApiKey?: string;\n\n  apiKey?: string;\n\n  streaming: boolean;\n\n  doSample?: boolean;\n\n  messages?: ZhipuMessage[];\n\n  requestId?: string;\n\n  modelName: ChatCompletionRequest[\"model\"];\n\n  model: ChatCompletionRequest[\"model\"];\n\n  apiUrl: string;\n\n  maxTokens?: number | undefined;\n\n  temperature?: number | undefined;\n\n  topP?: number | undefined;\n\n  stop?: string[];\n\n  constructor(fields: Partial<ChatZhipuAIParams> & BaseChatModelParams = {}) {\n    super(fields);\n\n    this.zhipuAIApiKey =\n      fields?.apiKey ??\n      fields?.zhipuAIApiKey ??\n      getEnvironmentVariable(\"ZHIPUAI_API_KEY\");\n    if (!this.zhipuAIApiKey) {\n      throw new Error(\"ZhipuAI API key not found\");\n    }\n\n    this.apiUrl = \"https://open.bigmodel.cn/api/paas/v4/chat/completions\";\n    this.streaming = fields.streaming ?? false;\n    this.messages = fields.messages ?? [];\n    this.temperature = fields.temperature ?? 0.95;\n    this.topP = fields.topP ?? 0.7;\n    this.stop = fields.stop;\n    this.maxTokens = fields.maxTokens;\n    this.modelName = fields?.model ?? fields.modelName ?? \"glm-3-turbo\";\n    this.model = this.modelName;\n    this.doSample = fields.doSample;\n  }\n\n  /**\n   * Get the parameters used to invoke the model\n   */\n  invocationParams(\n    options?: this[\"ParsedCallOptions\"]\n  ): Omit<ChatCompletionRequest, \"messages\"> {\n    return {\n      model: this.model,\n      request_id: this.requestId,\n      do_sample: this.doSample,\n      stream: this.streaming,\n      temperature: this.temperature,\n      top_p: this.topP,\n      max_tokens: this.maxTokens,\n      stop: this.stop,\n      tools: options?.tools?.map((tool) => convertToOpenAITool(tool)) ?? [],\n    };\n  }\n\n  /**\n   * Get the identifying parameters for the model\n   */\n  identifyingParams(): Omit<ChatCompletionRequest, \"messages\"> {\n    return this.invocationParams();\n  }\n\n  /** @ignore */\n  async _generate(\n    messages: BaseMessage[],\n    options?: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<ChatResult> {\n    const parameters = this.invocationParams(options);\n\n    const messagesMapped: ZhipuMessage[] = messages.map((message) => ({\n      role: messageToRole(message),\n      content: message.content as string,\n    }));\n\n    const data = parameters.stream\n      ? await new Promise<ChatCompletionResponse>((resolve, reject) => {\n          let response: ChatCompletionResponse;\n          let rejected = false;\n          let resolved = false;\n          this.completionWithRetry(\n            {\n              ...parameters,\n              messages: messagesMapped,\n            },\n            true,\n            options?.signal,\n            (event) => {\n              const data: ChatCompletionResponse = JSON.parse(event.data);\n              if (data?.error?.code) {\n                if (rejected) {\n                  return;\n                }\n                rejected = true;\n                reject(new Error(data?.error?.message));\n                return;\n              }\n\n              const { delta, finish_reason } = data.choices[0];\n              const text = delta.content ?? \"\";\n              const tool_calls = delta.tool_calls ?? [];\n\n              if (!response) {\n                response = {\n                  ...data,\n                  output: { text, finish_reason, tool_calls },\n                };\n              } else {\n                response.output.text += text;\n                response.output.finish_reason = finish_reason;\n                response.output.tool_calls =\n                  response.output.tool_calls?.concat(tool_calls) ?? tool_calls;\n                response.usage = data.usage;\n              }\n\n              // eslint-disable-next-line no-void\n              void runManager?.handleLLMNewToken(text ?? \"\");\n              if (finish_reason && finish_reason !== \"null\") {\n                if (resolved || rejected) return;\n                resolved = true;\n                resolve(response);\n              }\n            }\n          ).catch((error) => {\n            if (!rejected) {\n              rejected = true;\n              reject(error);\n            }\n          });\n        })\n      : await this.completionWithRetry(\n          {\n            ...parameters,\n            messages: messagesMapped,\n          },\n          false,\n          options?.signal\n        ).then<ChatCompletionResponse>((data: ChatCompletionResponse) => {\n          if (data?.error?.code) {\n            throw new Error(data?.error?.message);\n          }\n          const { finish_reason, message } = data.choices[0];\n          const text = message.content ?? \"\";\n          return {\n            ...data,\n            output: { text, finish_reason, tool_calls: message.tool_calls },\n          };\n        });\n\n    const {\n      prompt_tokens = 0,\n      completion_tokens = 0,\n      total_tokens = 0,\n    } = data.usage;\n\n    const { text, tool_calls: rawToolCalls } = data.output;\n    const { toolCalls, invalidToolCalls } = parseRawToolCalls(\n      rawToolCalls ?? []\n    );\n\n    return {\n      generations: [\n        {\n          text,\n          message: new AIMessage({\n            content: text,\n            tool_calls: toolCalls,\n            invalid_tool_calls: invalidToolCalls,\n          }),\n        },\n      ],\n      llmOutput: {\n        tokenUsage: {\n          promptTokens: prompt_tokens,\n          completionTokens: completion_tokens,\n          totalTokens: total_tokens,\n        },\n      },\n    };\n  }\n\n  bindTools(\n    tools: BindToolsInput[],\n    kwargs?: Partial<this[\"ParsedCallOptions\"]>\n  ): Runnable<\n    BaseLanguageModelInput,\n    AIMessageChunk,\n    BaseChatModelCallOptions\n  > {\n    return this.withConfig({\n      tools: tools.map((tool) => convertToOpenAITool(tool)),\n      ...kwargs,\n    });\n  }\n\n  /** @ignore */\n  async completionWithRetry(\n    request: ChatCompletionRequest,\n    stream: boolean,\n    signal?: AbortSignal,\n    onmessage?: (event: MessageEvent) => void\n  ) {\n    const makeCompletionRequest = async () => {\n      const response = await fetch(this.apiUrl, {\n        method: \"POST\",\n        headers: {\n          ...(stream ? { Accept: \"text/event-stream\" } : {}),\n          Authorization: `Bearer ${encodeApiKey(this.zhipuAIApiKey)}`,\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify(request),\n        signal,\n      });\n\n      if (!stream) {\n        return response.json();\n      }\n\n      if (response.body) {\n        // response will not be a stream if an error occurred\n        if (\n          !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\")\n        ) {\n          onmessage?.(\n            new MessageEvent(\"message\", {\n              data: await response.text(),\n            })\n          );\n          return;\n        }\n        const reader = response.body.getReader();\n        const decoder = new TextDecoder(\"utf-8\");\n        let data = \"\";\n        let continueReading = true;\n        while (continueReading) {\n          const { done, value } = await reader.read();\n          if (done) {\n            continueReading = false;\n            break;\n          }\n          data += decoder.decode(value);\n          let continueProcessing = true;\n          while (continueProcessing) {\n            const newlineIndex = data.indexOf(\"\\n\");\n            if (newlineIndex === -1) {\n              continueProcessing = false;\n              break;\n            }\n            const line = data.slice(0, newlineIndex);\n            data = data.slice(newlineIndex + 1);\n            if (line.startsWith(\"data:\")) {\n              const value = line.slice(\"data:\".length).trim();\n              if (value === \"[DONE]\") {\n                continueReading = false;\n                break;\n              }\n              const event = new MessageEvent(\"message\", { data: value });\n              onmessage?.(event);\n            }\n          }\n        }\n      }\n    };\n\n    return this.caller.call(makeCompletionRequest);\n  }\n\n  private async createZhipuStream(\n    request: ChatCompletionRequest,\n    signal?: AbortSignal\n  ) {\n    const response = await fetch(this.apiUrl, {\n      method: \"POST\",\n      headers: {\n        Accept: \"text/event-stream\",\n        Authorization: `Bearer ${encodeApiKey(this.zhipuAIApiKey)}`,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(request),\n      signal,\n    });\n\n    if (!response.body) {\n      throw new Error(\n        \"Could not begin Zhipu stream. Please check the given URL and try again.\"\n      );\n    }\n\n    return convertEventStreamToIterableReadableDataStream(response.body);\n  }\n\n  private _deserialize(json: string) {\n    try {\n      return JSON.parse(json);\n    } catch {\n      console.warn(`Received a non-JSON parseable chunk: ${json}`);\n    }\n  }\n\n  async *_streamResponseChunks(\n    messages: BaseMessage[],\n    options?: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatGenerationChunk> {\n    const parameters = {\n      ...this.invocationParams(options),\n      stream: true,\n    };\n\n    const messagesMapped: ZhipuMessage[] = messages.map((message) => ({\n      role: messageToRole(message),\n      content: message.content as string,\n    }));\n\n    const stream = await this.caller.call(async () =>\n      this.createZhipuStream(\n        {\n          ...parameters,\n          messages: messagesMapped,\n        },\n        options?.signal\n      )\n    );\n\n    for await (const chunk of stream) {\n      if (chunk !== \"[DONE]\") {\n        const deserializedChunk = this._deserialize(chunk);\n        const { choices, usage, id } = deserializedChunk;\n        const text = choices[0]?.delta?.content ?? \"\";\n        const rawToolCalls = choices[0]?.delta?.tool_calls ?? [];\n        const { toolCalls, invalidToolCalls } = parseRawToolCalls(rawToolCalls);\n        const finished = !!choices[0]?.finish_reason;\n        const isToolCall = rawToolCalls.length > 0;\n        yield new ChatGenerationChunk({\n          text,\n          // In stream mode, ZhipuAI's delta chunk includes\n          // either `tool_calls` or `content` field, but not both\n          message: isToolCall\n            ? new AIMessageChunk({\n                tool_calls: toolCalls,\n                invalid_tool_calls: invalidToolCalls,\n              })\n            : new AIMessageChunk({ content: text }),\n          generationInfo: finished\n            ? {\n                finished,\n                request_id: id,\n                // The usage of tokens is counted at the end of the stream\n                usage,\n              }\n            : undefined,\n        });\n        await runManager?.handleLLMNewToken(text);\n      } else {\n        continue;\n      }\n    }\n  }\n\n  _llmType(): string {\n    return \"zhipuai\";\n  }\n\n  /** @ignore */\n  _combineLLMOutput() {\n    return [];\n  }\n}\n"],"mappings":"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"}