{"version":3,"file":"chat_models.cjs","names":["BaseChatModel","Cerebras","formatToCerebrasToolChoice","AIMessage","convertToCerebrasMessageParams","ChatGenerationChunk","AIMessageChunk","RunnableLambda"],"sources":["../src/chat_models.ts"],"sourcesContent":["import Cerebras from \"@cerebras/cerebras_cloud_sdk\";\n\nimport {\n  AIMessage,\n  AIMessageChunk,\n  UsageMetadata,\n  type BaseMessage,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n  BaseChatModel,\n  BaseChatModelCallOptions,\n  type BaseChatModelParams,\n  BindToolsInput,\n  LangSmithParams,\n  ToolChoice,\n} from \"@langchain/core/language_models/chat_models\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport {\n  BaseLanguageModelInput,\n  StructuredOutputMethodOptions,\n  ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport { convertToOpenAITool } from \"@langchain/core/utils/function_calling\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport {\n  getSchemaDescription,\n  InteropZodType,\n  isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\n\nimport {\n  convertToCerebrasMessageParams,\n  formatToCerebrasToolChoice,\n} from \"./utils.js\";\nimport {\n  isSerializableSchema,\n  SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport { assembleStructuredOutputPipeline } from \"@langchain/core/language_models/structured_output\";\n\n/**\n * Input to chat model class.\n */\nexport interface ChatCerebrasInput extends BaseChatModelParams {\n  model: Cerebras.ChatCompletionCreateParams[\"model\"];\n  apiKey?: string;\n  streaming?: boolean;\n  maxTokens?: number;\n  maxCompletionTokens?: number;\n  temperature?: number;\n  topP?: number;\n  seed?: number;\n  timeout?: number;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  fetch?: (...args: any) => any;\n}\n\nexport interface ChatCerebrasCallOptions\n  extends\n    BaseChatModelCallOptions,\n    Pick<Cerebras.RequestOptions, \"httpAgent\" | \"headers\"> {\n  tools?: BindToolsInput[];\n  tool_choice?: ToolChoice;\n  user?: string;\n  response_format?: Cerebras.ChatCompletionCreateParams[\"response_format\"];\n}\n\n/**\n * Cerebras chat model integration.\n *\n * Setup:\n * Install `@langchain/cerebras` and set an environment variable named `CEREBRAS_API_KEY`.\n *\n * ```bash\n * npm install @langchain/cerebras\n * export CEREBRAS_API_KEY=\"your-api-key\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain_cerebras.ChatCerebras.html#constructor)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_cerebras.ChatCerebrasCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n *   stop: [\"\\n\"],\n *   tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n *   [...],\n *   {\n *     tool_choice: \"auto\",\n *   }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatCerebras } from '@langchain/cerebras';\n *\n * const llm = new ChatCerebras({\n *   model: \"llama-3.3-70b\",\n *   temperature: 0,\n *   // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessage {\n *   \"id\": \"run-9281952d-d4c5-424c-9c18-c6ad62dd6684\",\n *   \"content\": \"J'adore la programmation.\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"id\": \"chatcmpl-bb411272-aac5-44a5-b793-ae70bd94fd3d\",\n *     \"created\": 1735784442,\n *     \"model\": \"llama-3.3-70b\",\n *     \"system_fingerprint\": \"fp_2e2a2a083c\",\n *     \"object\": \"chat.completion\",\n *     \"time_info\": {\n *       \"queue_time\": 0.000096069,\n *       \"prompt_time\": 0.002166527,\n *       \"completion_time\": 0.012331633,\n *       \"total_time\": 0.01629185676574707,\n *       \"created\": 1735784442\n *     }\n *   },\n *   \"tool_calls\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {\n *     \"input_tokens\": 55,\n *     \"output_tokens\": 9,\n *     \"total_tokens\": 64\n *   }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n *   console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \"\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\"\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {}\n * }\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \"J\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\"\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {}\n * }\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \"'\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\"\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {}\n * }\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \"ad\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\"\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {}\n * }\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \"ore\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\"\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {}\n * }\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \" la\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\"\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {}\n * }\n * ...\n * AIMessageChunk {\n *   \"id\": \"run-1756a5b2-2ce0-47a9-81e0-2195bf893bd4\",\n *   \"content\": \"\",\n *   \"additional_kwargs\": {},\n *   \"response_metadata\": {\n *     \"finish_reason\": \"stop\",\n *     \"id\": \"chatcmpl-15c80082-4475-423c-b140-7b0a556311ca\",\n *     \"system_fingerprint\": \"fp_2e2a2a083c\",\n *     \"model\": \"llama-3.3-70b\",\n *     \"created\": 1735785346,\n *     \"object\": \"chat.completion.chunk\",\n *     \"time_info\": {\n *       \"queue_time\": 0.000100589,\n *       \"prompt_time\": 0.002167348,\n *       \"completion_time\": 0.012320277,\n *       \"total_time\": 0.0169985294342041,\n *       \"created\": 1735785346\n *     }\n *   },\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": [],\n *   \"usage_metadata\": {\n *     \"input_tokens\": 55,\n *     \"output_tokens\": 9,\n *     \"total_tokens\": 64\n *   }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n *   full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n *   \"content\": \"J'adore la programmation.\",\n *   \"additional_kwargs\": {},\n *   \"tool_calls\": [],\n *   \"tool_call_chunks\": [],\n *   \"invalid_tool_calls\": []\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const llmForToolCalling = new ChatCerebras({\n *   model: \"llama-3.3-70b\",\n *   temperature: 0,\n *   // other params...\n * });\n *\n * const GetWeather = {\n *   name: \"GetWeather\",\n *   description: \"Get the current weather in a given location\",\n *   schema: z.object({\n *     location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n *   }),\n * }\n *\n * const GetPopulation = {\n *   name: \"GetPopulation\",\n *   description: \"Get the current population in a given location\",\n *   schema: z.object({\n *     location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n *   }),\n * }\n *\n * const llmWithTools = llmForToolCalling.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n *   \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n *   {\n *     name: 'GetWeather',\n *     args: { location: 'Los Angeles, CA' },\n *     type: 'tool_call',\n *     id: 'call_cd34'\n *   },\n *   {\n *     name: 'GetWeather',\n *     args: { location: 'New York, NY' },\n *     type: 'tool_call',\n *     id: 'call_68rf'\n *   },\n *   {\n *     name: 'GetPopulation',\n *     args: { location: 'Los Angeles, CA' },\n *     type: 'tool_call',\n *     id: 'call_f81z'\n *   },\n *   {\n *     name: 'GetPopulation',\n *     args: { location: 'New York, NY' },\n *     type: 'tool_call',\n *     id: 'call_8byt'\n *   }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n *   setup: z.string().describe(\"The setup of the joke\"),\n *   punchline: z.string().describe(\"The punchline to the joke\"),\n *   rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llmForToolCalling.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n *   setup: \"Why don't cats play poker in the wild?\",\n *   punchline: 'Because there are too many cheetahs.'\n * }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatCerebras\n  extends BaseChatModel<ChatCerebrasCallOptions>\n  implements ChatCerebrasInput\n{\n  static lc_name() {\n    return \"ChatCerebras\";\n  }\n\n  lc_serializable = true;\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"CEREBRAS_API_KEY\",\n    };\n  }\n\n  get lc_aliases(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"CEREBRAS_API_KEY\",\n    };\n  }\n\n  getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n    const params = this.invocationParams(options);\n    return {\n      ls_provider: \"cerebras\",\n      ls_model_name: this.model,\n      ls_model_type: \"chat\",\n      ls_temperature: params.temperature ?? undefined,\n      ls_max_tokens: params.max_completion_tokens ?? undefined,\n      ls_stop: options.stop,\n    };\n  }\n\n  client: Cerebras;\n\n  model: string;\n\n  maxCompletionTokens?: number;\n\n  temperature?: number;\n\n  topP?: number;\n\n  seed?: number;\n\n  streaming?: boolean;\n\n  constructor(\n    model: Cerebras.ChatCompletionCreateParams[\"model\"],\n    fields?: Omit<ChatCerebrasInput, \"model\">\n  );\n  constructor(fields?: ChatCerebrasInput);\n  constructor(\n    modelOrFields?: string | ChatCerebrasInput,\n    fieldsArg?: Omit<ChatCerebrasInput, \"model\">\n  ) {\n    const fields = (\n      typeof modelOrFields === \"string\"\n        ? { ...(fieldsArg ?? {}), model: modelOrFields }\n        : (modelOrFields ?? {})\n    ) as ChatCerebrasInput;\n    super(fields);\n    this._addVersion(\"@langchain/cerebras\", __PKG_VERSION__);\n    this.model = fields.model;\n    this.maxCompletionTokens = fields.maxCompletionTokens;\n    this.temperature = fields.temperature;\n    this.topP = fields.topP;\n    this.seed = fields.seed;\n    this.streaming = fields.streaming;\n    this.client = new Cerebras({\n      apiKey: fields.apiKey ?? getEnvironmentVariable(\"CEREBRAS_API_KEY\"),\n      timeout: fields.timeout,\n      // Rely on built-in async caller\n      maxRetries: 0,\n      fetch: fields.fetch,\n    });\n  }\n\n  // Replace\n  _llmType() {\n    return \"cerebras\";\n  }\n\n  override bindTools(\n    tools: BindToolsInput[],\n    kwargs?: Partial<this[\"ParsedCallOptions\"]>\n  ): Runnable<BaseLanguageModelInput, AIMessageChunk, ChatCerebrasCallOptions> {\n    return this.withConfig({\n      tools: tools.map((tool) => convertToOpenAITool(tool)),\n      ...kwargs,\n    });\n  }\n\n  /**\n   * A method that returns the parameters for an Ollama API call. It\n   * includes model and options parameters.\n   * @param options Optional parsed call options.\n   * @returns An object containing the parameters for an Ollama API call.\n   */\n  override invocationParams(\n    options?: this[\"ParsedCallOptions\"]\n  ): Omit<Cerebras.ChatCompletionCreateParams, \"stream\" | \"messages\"> {\n    return {\n      model: this.model,\n      max_completion_tokens: this.maxCompletionTokens,\n      temperature: this.temperature,\n      top_p: this.topP,\n      seed: this.seed,\n      stop: options?.stop,\n      response_format: options?.response_format,\n      user: options?.user,\n      tools: options?.tools?.length\n        ? options.tools.map(\n            (tool) =>\n              convertToOpenAITool(\n                tool\n              ) as Cerebras.ChatCompletionCreateParams.Tool\n          )\n        : undefined,\n      tool_choice: formatToCerebrasToolChoice(options?.tool_choice),\n    };\n  }\n\n  async _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<ChatResult> {\n    // Handle streaming\n    if (this.streaming) {\n      let finalChunk: AIMessageChunk | undefined;\n      for await (const chunk of this._streamResponseChunks(\n        messages,\n        options,\n        runManager\n      )) {\n        if (!finalChunk) {\n          finalChunk = chunk.message;\n        } else {\n          finalChunk = concat(finalChunk, chunk.message);\n        }\n      }\n\n      // Convert from AIMessageChunk to AIMessage since `generate` expects AIMessage.\n      const nonChunkMessage = new AIMessage({\n        id: finalChunk?.id,\n        content: finalChunk?.content ?? \"\",\n        tool_calls: finalChunk?.tool_calls,\n        response_metadata: finalChunk?.response_metadata,\n        usage_metadata: finalChunk?.usage_metadata,\n      });\n      return {\n        generations: [\n          {\n            text:\n              typeof nonChunkMessage.content === \"string\"\n                ? nonChunkMessage.content\n                : \"\",\n            message: nonChunkMessage,\n          },\n        ],\n      };\n    }\n\n    const res = await this.caller.call(async () => {\n      const res = await this.client.chat.completions.create(\n        {\n          ...this.invocationParams(options),\n          messages: convertToCerebrasMessageParams(messages),\n          stream: false,\n        },\n        {\n          headers: options.headers,\n          httpAgent: options.httpAgent,\n        }\n      );\n      return res;\n    });\n\n    const { choices, usage, ...rest } = res;\n    // TODO: Remove casts when underlying types are fixed\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const choice = (choices as any)[0];\n    const content = choice?.message?.content ?? \"\";\n    const usageMetadata: UsageMetadata = {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      input_tokens: (usage as any)?.prompt_tokens,\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      output_tokens: (usage as any)?.completion_tokens,\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      total_tokens: (usage as any)?.total_tokens,\n    };\n\n    return {\n      generations: [\n        {\n          text: content,\n          message: new AIMessage({\n            content,\n            tool_calls: choice?.message?.tool_calls?.map(\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              (toolCall: any) => ({\n                id: toolCall.id,\n                name: toolCall.function?.name,\n                args: JSON.parse(toolCall.function?.arguments),\n                index: toolCall.index,\n                type: \"tool_call\",\n              })\n            ),\n            usage_metadata: usageMetadata,\n            response_metadata: rest,\n          }),\n        },\n      ],\n    };\n  }\n\n  /**\n   * Implement to support streaming.\n   * Should yield chunks iteratively.\n   */\n  async *_streamResponseChunks(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatGenerationChunk> {\n    const stream = await this.caller.call(async () => {\n      const res = await this.client.chat.completions.create(\n        {\n          ...this.invocationParams(options),\n          messages: convertToCerebrasMessageParams(messages),\n          stream: true,\n        },\n        {\n          headers: options.headers,\n          httpAgent: options.httpAgent,\n        }\n      );\n      return res;\n    });\n    for await (const chunk of stream) {\n      const { choices, system_fingerprint, model, id, object, usage, ...rest } =\n        chunk;\n      // TODO: Remove casts when underlying types are fixed\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const choice = (choices as any)[0];\n      const content = choice?.delta?.content ?? \"\";\n      let usageMetadata: UsageMetadata | undefined;\n      if (usage !== undefined) {\n        usageMetadata = {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          input_tokens: (usage as any).prompt_tokens,\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          output_tokens: (usage as any).completion_tokens,\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          total_tokens: (usage as any).total_tokens,\n        };\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const generationInfo: Record<string, any> = {};\n      if (choice.finish_reason != null) {\n        generationInfo.finish_reason = choice.finish_reason;\n        // Only include system fingerprint and related in the last chunk for now\n        // to avoid concatenation issues\n        generationInfo.id = id;\n        generationInfo.system_fingerprint = system_fingerprint;\n        generationInfo.model = model;\n        generationInfo.object = object;\n      }\n      const generationChunk = new ChatGenerationChunk({\n        text: content,\n        message: new AIMessageChunk({\n          content,\n          tool_call_chunks: choice?.delta.tool_calls?.map(\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            (toolCallChunk: any) => ({\n              id: toolCallChunk.id,\n              name: toolCallChunk.function?.name,\n              args: toolCallChunk.function?.arguments,\n              index: toolCallChunk.index,\n              type: \"tool_call_chunk\",\n            })\n          ),\n          usage_metadata: usageMetadata,\n          response_metadata: rest,\n        }),\n        generationInfo,\n      });\n      yield generationChunk;\n      await runManager?.handleLLMNewToken(\n        content,\n        undefined,\n        undefined,\n        undefined,\n        undefined,\n        { chunk: generationChunk }\n      );\n    }\n  }\n\n  withStructuredOutput<\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<false>\n  ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n  withStructuredOutput<\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<true>\n  ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n  withStructuredOutput<\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<boolean>\n  ):\n    | Runnable<BaseLanguageModelInput, RunOutput>\n    | Runnable<\n        BaseLanguageModelInput,\n        {\n          raw: BaseMessage;\n          parsed: RunOutput;\n        }\n      > {\n    if (config?.strict) {\n      throw new Error(\n        `\"strict\" mode is not supported for this model by default.`\n      );\n    }\n\n    const schema = outputSchema;\n    const name = config?.name;\n    const description =\n      getSchemaDescription(schema) ?? \"A function available to call.\";\n    const method = config?.method;\n    const includeRaw = config?.includeRaw;\n\n    if (method === \"jsonMode\") {\n      throw new Error(\n        `Cerebras withStructuredOutput implementation only supports \"functionCalling\" as a method.`\n      );\n    }\n\n    let functionName = name ?? \"extract\";\n    if (\n      !isInteropZodSchema(schema) &&\n      !isSerializableSchema(schema) &&\n      \"name\" in schema\n    ) {\n      functionName = schema.name;\n    }\n\n    const asJsonSchema =\n      isInteropZodSchema(schema) || isSerializableSchema(schema)\n        ? toJsonSchema(schema)\n        : schema;\n\n    const tools: ToolDefinition[] = [\n      {\n        type: \"function\",\n        function: {\n          name: functionName,\n          description,\n          parameters: asJsonSchema,\n        },\n      },\n    ];\n\n    const llm = this.bindTools(tools, {\n      tool_choice: tools[0].function.name,\n    });\n    const outputParser = RunnableLambda.from<AIMessageChunk, RunOutput>(\n      (input: AIMessageChunk): RunOutput => {\n        if (!input.tool_calls || input.tool_calls.length === 0) {\n          throw new Error(\"No tool calls found in the response.\");\n        }\n        const toolCall = input.tool_calls.find(\n          (tc) => tc.name === functionName\n        );\n        if (!toolCall) {\n          throw new Error(`No tool call found with name ${functionName}.`);\n        }\n        return toolCall.args as RunOutput;\n      }\n    );\n\n    return assembleStructuredOutputPipeline(\n      llm,\n      outputParser,\n      includeRaw,\n      \"ChatCerebrasStructuredOutput\"\n    );\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0ZA,IAAa,eAAb,cACUA,0DAEV;CACE,OAAO,UAAU;AACf,SAAO;;CAGT,kBAAkB;CAElB,IAAI,aAAoD;AACtD,SAAO,EACL,QAAQ,oBACT;;CAGH,IAAI,aAAoD;AACtD,SAAO,EACL,QAAQ,oBACT;;CAGH,YAAY,SAAqD;EAC/D,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,SAAO;GACL,aAAa;GACb,eAAe,KAAK;GACpB,eAAe;GACf,gBAAgB,OAAO,eAAe;GACtC,eAAe,OAAO,yBAAyB;GAC/C,SAAS,QAAQ;GAClB;;CAGH;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAOA,YACE,eACA,WACA;EACA,MAAM,SACJ,OAAO,kBAAkB,WACrB;GAAE,GAAI,aAAa,EAAE;GAAG,OAAO;GAAe,GAC7C,iBAAiB,EAAE;AAE1B,QAAM,OAAO;AACb,OAAK,YAAY,+BAAuC;AACxD,OAAK,QAAQ,OAAO;AACpB,OAAK,sBAAsB,OAAO;AAClC,OAAK,cAAc,OAAO;AAC1B,OAAK,OAAO,OAAO;AACnB,OAAK,OAAO,OAAO;AACnB,OAAK,YAAY,OAAO;AACxB,OAAK,SAAS,IAAIC,qCAAS;GACzB,QAAQ,OAAO,gEAAiC,mBAAmB;GACnE,SAAS,OAAO;GAEhB,YAAY;GACZ,OAAO,OAAO;GACf,CAAC;;CAIJ,WAAW;AACT,SAAO;;CAGT,AAAS,UACP,OACA,QAC2E;AAC3E,SAAO,KAAK,WAAW;GACrB,OAAO,MAAM,KAAK,yEAA6B,KAAK,CAAC;GACrD,GAAG;GACJ,CAAC;;;;;;;;CASJ,AAAS,iBACP,SACkE;AAClE,SAAO;GACL,OAAO,KAAK;GACZ,uBAAuB,KAAK;GAC5B,aAAa,KAAK;GAClB,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,MAAM,SAAS;GACf,iBAAiB,SAAS;GAC1B,MAAM,SAAS;GACf,OAAO,SAAS,OAAO,SACnB,QAAQ,MAAM,KACX,yEAEG,KACD,CACJ,GACD;GACJ,aAAaC,yCAA2B,SAAS,YAAY;GAC9D;;CAGH,MAAM,UACJ,UACA,SACA,YACqB;AAErB,MAAI,KAAK,WAAW;GAClB,IAAI;AACJ,cAAW,MAAM,SAAS,KAAK,sBAC7B,UACA,SACA,WACD,CACC,KAAI,CAAC,WACH,cAAa,MAAM;OAEnB,uDAAoB,YAAY,MAAM,QAAQ;GAKlD,MAAM,kBAAkB,IAAIC,mCAAU;IACpC,IAAI,YAAY;IAChB,SAAS,YAAY,WAAW;IAChC,YAAY,YAAY;IACxB,mBAAmB,YAAY;IAC/B,gBAAgB,YAAY;IAC7B,CAAC;AACF,UAAO,EACL,aAAa,CACX;IACE,MACE,OAAO,gBAAgB,YAAY,WAC/B,gBAAgB,UAChB;IACN,SAAS;IACV,CACF,EACF;;EAkBH,MAAM,EAAE,SAAS,OAAO,GAAG,SAff,MAAM,KAAK,OAAO,KAAK,YAAY;AAY7C,UAXY,MAAM,KAAK,OAAO,KAAK,YAAY,OAC7C;IACE,GAAG,KAAK,iBAAiB,QAAQ;IACjC,UAAUC,6CAA+B,SAAS;IAClD,QAAQ;IACT,EACD;IACE,SAAS,QAAQ;IACjB,WAAW,QAAQ;IACpB,CACF;IAED;EAKF,MAAM,SAAU,QAAgB;EAChC,MAAM,UAAU,QAAQ,SAAS,WAAW;EAC5C,MAAM,gBAA+B;GAEnC,cAAe,OAAe;GAE9B,eAAgB,OAAe;GAE/B,cAAe,OAAe;GAC/B;AAED,SAAO,EACL,aAAa,CACX;GACE,MAAM;GACN,SAAS,IAAID,mCAAU;IACrB;IACA,YAAY,QAAQ,SAAS,YAAY,KAEtC,cAAmB;KAClB,IAAI,SAAS;KACb,MAAM,SAAS,UAAU;KACzB,MAAM,KAAK,MAAM,SAAS,UAAU,UAAU;KAC9C,OAAO,SAAS;KAChB,MAAM;KACP,EACF;IACD,gBAAgB;IAChB,mBAAmB;IACpB,CAAC;GACH,CACF,EACF;;;;;;CAOH,OAAO,sBACL,UACA,SACA,YACqC;EACrC,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,YAAY;AAYhD,UAXY,MAAM,KAAK,OAAO,KAAK,YAAY,OAC7C;IACE,GAAG,KAAK,iBAAiB,QAAQ;IACjC,UAAUC,6CAA+B,SAAS;IAClD,QAAQ;IACT,EACD;IACE,SAAS,QAAQ;IACjB,WAAW,QAAQ;IACpB,CACF;IAED;AACF,aAAW,MAAM,SAAS,QAAQ;GAChC,MAAM,EAAE,SAAS,oBAAoB,OAAO,IAAI,QAAQ,OAAO,GAAG,SAChE;GAGF,MAAM,SAAU,QAAgB;GAChC,MAAM,UAAU,QAAQ,OAAO,WAAW;GAC1C,IAAI;AACJ,OAAI,UAAU,OACZ,iBAAgB;IAEd,cAAe,MAAc;IAE7B,eAAgB,MAAc;IAE9B,cAAe,MAAc;IAC9B;GAIH,MAAM,iBAAsC,EAAE;AAC9C,OAAI,OAAO,iBAAiB,MAAM;AAChC,mBAAe,gBAAgB,OAAO;AAGtC,mBAAe,KAAK;AACpB,mBAAe,qBAAqB;AACpC,mBAAe,QAAQ;AACvB,mBAAe,SAAS;;GAE1B,MAAM,kBAAkB,IAAIC,4CAAoB;IAC9C,MAAM;IACN,SAAS,IAAIC,wCAAe;KAC1B;KACA,kBAAkB,QAAQ,MAAM,YAAY,KAEzC,mBAAwB;MACvB,IAAI,cAAc;MAClB,MAAM,cAAc,UAAU;MAC9B,MAAM,cAAc,UAAU;MAC9B,OAAO,cAAc;MACrB,MAAM;MACP,EACF;KACD,gBAAgB;KAChB,mBAAmB;KACpB,CAAC;IACF;IACD,CAAC;AACF,SAAM;AACN,SAAM,YAAY,kBAChB,SACA,QACA,QACA,QACA,QACA,EAAE,OAAO,iBAAiB,CAC3B;;;CA4BL,qBAIE,cAKA,QASI;AACJ,MAAI,QAAQ,OACV,OAAM,IAAI,MACR,4DACD;EAGH,MAAM,SAAS;EACf,MAAM,OAAO,QAAQ;EACrB,MAAM,oEACiB,OAAO,IAAI;EAClC,MAAM,SAAS,QAAQ;EACvB,MAAM,aAAa,QAAQ;AAE3B,MAAI,WAAW,WACb,OAAM,IAAI,MACR,4FACD;EAGH,IAAI,eAAe,QAAQ;AAC3B,MACE,qDAAoB,OAAO,IAC3B,iEAAsB,OAAO,IAC7B,UAAU,OAEV,gBAAe,OAAO;EAGxB,MAAM,mEACe,OAAO,oEAAyB,OAAO,uDACzC,OAAO,GACpB;EAEN,MAAM,QAA0B,CAC9B;GACE,MAAM;GACN,UAAU;IACR,MAAM;IACN;IACA,YAAY;IACb;GACF,CACF;AAoBD,iGAlBY,KAAK,UAAU,OAAO,EAChC,aAAa,MAAM,GAAG,SAAS,MAChC,CAAC,EACmBC,yCAAe,MACjC,UAAqC;AACpC,OAAI,CAAC,MAAM,cAAc,MAAM,WAAW,WAAW,EACnD,OAAM,IAAI,MAAM,uCAAuC;GAEzD,MAAM,WAAW,MAAM,WAAW,MAC/B,OAAO,GAAG,SAAS,aACrB;AACD,OAAI,CAAC,SACH,OAAM,IAAI,MAAM,gCAAgC,aAAa,GAAG;AAElE,UAAO,SAAS;IAEnB,EAKC,YACA,+BACD"}