{"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","withoutFileMimeTypesUnlessSupported","isBuiltInToolChoice","formatToOpenAIToolChoice","normalizePromptCacheRetention","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","convertOpenAIResponsesStream","convertResponsesDeltaToChatGenerationChunk","wrapOpenAIClientError","isBuiltInTool","isCustomTool","isOpenAIFunctionTool","isOpenAICustomTool","convertCompletionsCustomTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n  ChatOpenAIToolType,\n  convertCompletionsCustomTool,\n  formatToOpenAIToolChoice,\n  isBuiltInTool,\n  isBuiltInToolChoice,\n  isCustomTool,\n  isOpenAICustomTool,\n  ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n  BaseChatOpenAI,\n  BaseChatOpenAICallOptions,\n  BaseChatOpenAIFields,\n  getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n  convertMessagesToResponsesInput,\n  convertResponsesDeltaToChatGenerationChunk,\n  convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\nimport { normalizePromptCacheRetention } from \"../utils/misc.js\";\nimport { withoutFileMimeTypesUnlessSupported } from \"../utils/file_mime_types.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n  /**\n   * Configuration options for a text response from the model. Can be plain text or\n   * structured JSON data.\n   */\n  text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n  /**\n   * The truncation strategy to use for the model response.\n   */\n  truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n  /**\n   * Specify additional output data to include in the model response.\n   */\n  include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n  /**\n   * The unique ID of the previous response to the model. Use this to create multi-turn\n   * conversations.\n   */\n  previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n  /**\n   * The verbosity of the model's response.\n   */\n  verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n  OpenAIClient.Responses.ResponseCreateParams,\n  \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n  CallOptions extends ChatOpenAIResponsesCallOptions =\n    ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n  constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n  constructor(fields?: BaseChatOpenAIFields);\n  constructor(\n    modelOrFields?: string | BaseChatOpenAIFields,\n    fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n  ) {\n    super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n  }\n\n  override get profile(): ModelProfile {\n    return withoutFileMimeTypesUnlessSupported(super.profile, true);\n  }\n\n  override invocationParams(\n    options?: this[\"ParsedCallOptions\"]\n  ): ChatResponsesInvocationParams {\n    let strict: boolean | undefined;\n    if (options?.strict !== undefined) {\n      strict = options.strict;\n    }\n    if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n      strict = this.supportsStrictToolCalling;\n    }\n\n    const params: ChatResponsesInvocationParams = {\n      model: this.model,\n      temperature: this.temperature,\n      top_p: this.topP,\n      user: this.user,\n      service_tier: this.service_tier,\n\n      // if include_usage is set or streamUsage then stream must be set to true.\n      stream: this.streaming,\n      previous_response_id: options?.previous_response_id,\n      truncation: options?.truncation,\n      include: options?.include,\n      tools: options?.tools?.length\n        ? this._reduceChatOpenAITools(options.tools, {\n            stream: this.streaming,\n            strict,\n          })\n        : undefined,\n      tool_choice: isBuiltInToolChoice(options?.tool_choice)\n        ? options?.tool_choice\n        : (() => {\n            const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n            if (typeof formatted === \"object\" && \"type\" in formatted) {\n              if (formatted.type === \"function\") {\n                return { type: \"function\", name: formatted.function.name };\n              } else if (formatted.type === \"allowed_tools\") {\n                return {\n                  type: \"allowed_tools\",\n                  mode: formatted.allowed_tools.mode,\n                  tools: formatted.allowed_tools.tools,\n                };\n              } else if (formatted.type === \"custom\") {\n                return {\n                  type: \"custom\",\n                  name: formatted.custom.name,\n                };\n              }\n            }\n            return undefined;\n          })(),\n      text: (() => {\n        if (options?.text) return options.text;\n        const format = this._getResponseFormat(options?.response_format);\n        if (format?.type === \"json_schema\") {\n          if (format.json_schema.schema != null) {\n            return {\n              format: {\n                type: \"json_schema\",\n                schema: format.json_schema.schema,\n                description: format.json_schema.description,\n                name: format.json_schema.name,\n                strict: format.json_schema.strict,\n              },\n              verbosity: options?.verbosity,\n            };\n          }\n          return undefined;\n        }\n        return { format, verbosity: options?.verbosity };\n      })(),\n      parallel_tool_calls: options?.parallel_tool_calls,\n      max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n      ...(this.zdrEnabled ? { store: false } : {}),\n      ...this.modelKwargs,\n      prompt_cache_key:\n        options?.promptCacheKey ??\n        this.modelKwargs?.prompt_cache_key ??\n        this.promptCacheKey,\n      prompt_cache_retention: normalizePromptCacheRetention(\n        options?.promptCacheRetention ??\n          this.modelKwargs?.prompt_cache_retention ??\n          this.promptCacheRetention\n      ),\n      prompt_cache_options:\n        options?.promptCacheOptions ??\n        this.modelKwargs?.prompt_cache_options ??\n        this.promptCacheOptions,\n    };\n\n    const reasoning = this._getReasoningParams(options);\n\n    if (reasoning !== undefined) {\n      params.reasoning = reasoning;\n    }\n\n    return params;\n  }\n\n  async _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<ChatResult> {\n    options.signal?.throwIfAborted();\n    const invocationParams = this.invocationParams(options);\n    if (invocationParams.stream) {\n      const stream = this._streamResponseChunks(messages, options, runManager);\n      let finalChunk: ChatGenerationChunk | undefined;\n      for await (const chunk of stream) {\n        chunk.message.response_metadata = {\n          ...chunk.generationInfo,\n          ...chunk.message.response_metadata,\n        };\n        finalChunk = finalChunk?.concat(chunk) ?? chunk;\n      }\n\n      return {\n        generations: finalChunk ? [finalChunk] : [],\n        llmOutput: {\n          estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n            ?.usage_metadata,\n        },\n      };\n    } else {\n      const data = await this.completionWithRetry(\n        {\n          input: convertMessagesToResponsesInput({\n            messages,\n            zdrEnabled: this.zdrEnabled ?? false,\n            model: this.model,\n          }),\n          ...invocationParams,\n          stream: false,\n        },\n        {\n          signal: options?.signal,\n          maxRetries: options?.maxRetries,\n          ...options?.options,\n        }\n      );\n\n      return {\n        generations: [\n          {\n            text: data.output_text,\n            message: convertResponsesMessageToAIMessage(data),\n          },\n        ],\n        llmOutput: {\n          id: data.id,\n          estimatedTokenUsage: data.usage\n            ? {\n                promptTokens: data.usage.input_tokens,\n                completionTokens: data.usage.output_tokens,\n                totalTokens: data.usage.total_tokens,\n              }\n            : undefined,\n        },\n      };\n    }\n  }\n\n  async *_streamChatModelEvents(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    _runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatModelStreamEvent> {\n    const streamIterable = await this.completionWithRetry(\n      {\n        ...this.invocationParams(options),\n        input: convertMessagesToResponsesInput({\n          messages,\n          zdrEnabled: this.zdrEnabled ?? false,\n          model: this.model,\n        }),\n        stream: true,\n      },\n      options\n    );\n\n    const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n    const abortableStream = async function* (\n      source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n      signal?: AbortSignal\n    ) {\n      for await (const data of source) {\n        if (signal?.aborted) {\n          return;\n        }\n        yield data;\n      }\n    };\n\n    yield* convertOpenAIResponsesStream(\n      abortableStream(streamIterable, options.signal),\n      {\n        streamUsage: shouldStreamUsage ?? true,\n        provider: this.streamEventProvider,\n      }\n    );\n  }\n\n  /** Provider id used in native stream protocol passthrough events. */\n  protected get streamEventProvider(): string {\n    return \"openai\";\n  }\n\n  async *_streamResponseChunks(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatGenerationChunk> {\n    const streamIterable = await this.completionWithRetry(\n      {\n        ...this.invocationParams(options),\n        input: convertMessagesToResponsesInput({\n          messages,\n          zdrEnabled: this.zdrEnabled ?? false,\n          model: this.model,\n        }),\n        stream: true,\n      },\n      options\n    );\n\n    try {\n      for await (const data of streamIterable) {\n        if (options.signal?.aborted) {\n          return;\n        }\n        const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n        if (chunk == null) continue;\n        yield chunk;\n        await runManager?.handleLLMNewToken(\n          chunk.text || \"\",\n          {\n            prompt: options.promptIndex ?? 0,\n            completion: 0,\n          },\n          undefined,\n          undefined,\n          undefined,\n          { chunk }\n        );\n      }\n    } catch (e) {\n      const error = wrapOpenAIClientError(e);\n      throw error;\n    }\n  }\n\n  /**\n   * Calls the Responses API with retry logic in case of failures.\n   * @param request The request to send to the OpenAI API.\n   * @param options Optional configuration for the API call.\n   * @returns The response from the OpenAI API.\n   */\n  async completionWithRetry(\n    request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n    requestOptions?: OpenAIClient.RequestOptions\n  ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n  async completionWithRetry(\n    request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n    requestOptions?: OpenAIClient.RequestOptions\n  ): Promise<OpenAIClient.Responses.Response>;\n\n  async completionWithRetry(\n    request: OpenAIClient.Responses.ResponseCreateParams,\n    requestOptions?: OpenAIClient.RequestOptions\n  ): Promise<\n    | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n    | OpenAIClient.Responses.Response\n  > {\n    // The SDK has its own `maxRetries`; take it for our caller instead so\n    // the two retry loops don't multiply.\n    const { maxRetries, ...sdkOptions } = requestOptions ?? {};\n    const clientOptions = this._getClientOptions(sdkOptions);\n    return this.caller.callWithOptions({ maxRetries }, async () => {\n      try {\n        // use parse if dealing with json_schema\n        if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n          return await this.client.responses.parse(request, clientOptions);\n        }\n        return await this.client.responses.create(request, clientOptions);\n      } catch (e) {\n        const error = wrapOpenAIClientError(e);\n        throw error;\n      }\n    });\n  }\n\n  /** @internal */\n  protected _reduceChatOpenAITools(\n    tools: ChatOpenAIToolType[],\n    fields: { stream?: boolean; strict?: boolean }\n  ): ResponsesTool[] {\n    const reducedTools: ResponsesTool[] = [];\n    for (const tool of tools) {\n      if (isBuiltInTool(tool)) {\n        if (tool.type === \"image_generation\" && fields?.stream) {\n          // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n          // We also set it to 1 since we don't support partial images yet.\n          tool.partial_images = 1;\n        }\n        reducedTools.push(tool);\n      } else if (isCustomTool(tool)) {\n        const customToolData = tool.metadata.customTool;\n        reducedTools.push({\n          type: \"custom\",\n          name: customToolData.name,\n          description: customToolData.description,\n          format: customToolData.format,\n        } as ResponsesTool);\n      } else if (isOpenAIFunctionTool(tool)) {\n        const extra: Record<string, unknown> = {};\n        for (const [k, v] of Object.entries(tool)) {\n          if (k !== \"type\" && k !== \"function\") {\n            extra[k] = v;\n          }\n        }\n        reducedTools.push({\n          type: \"function\",\n          name: tool.function.name,\n          parameters: tool.function.parameters,\n          description: tool.function.description,\n          strict: fields?.strict ?? null,\n          ...extra,\n        });\n      } else if (isOpenAICustomTool(tool)) {\n        reducedTools.push(convertCompletionsCustomTool(tool));\n      }\n    }\n    return reducedTools;\n  }\n}\n"],"mappings":"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"}