{"version":3,"file":"completions.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","withoutFileMimeTypesUnlessSupported","formatToOpenAIToolChoice","normalizePromptCacheRetention","isReasoningModel","convertMessagesToCompletionsMessageParams","isAIMessage","AIMessage","convertOpenAICompletionsStream","ChatGenerationChunk","AIMessageChunk","wrapOpenAIClientError","convertCompletionsDeltaToBaseMessageChunk","convertCompletionsMessageToBaseMessage"],"sources":["../../src/chat_models/completions.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 {\n  AIMessage,\n  AIMessageChunk,\n  type BaseMessage,\n  isAIMessage,\n  type UsageMetadata,\n  type AIMessageFields,\n  BaseMessageChunk,\n} from \"@langchain/core/messages\";\nimport {\n  ChatGenerationChunk,\n  type ChatGeneration,\n  type ChatResult,\n} from \"@langchain/core/outputs\";\nimport { NewTokenIndices } from \"@langchain/core/callbacks/base\";\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport { withoutFileMimeTypesUnlessSupported } from \"../utils/file_mime_types.js\";\nimport {\n  OpenAIToolChoice,\n  formatToOpenAIToolChoice,\n  _convertToOpenAITool,\n} from \"../utils/tools.js\";\nimport {\n  isReasoningModel,\n  normalizePromptCacheRetention,\n} from \"../utils/misc.js\";\nimport {\n  BaseChatOpenAI,\n  BaseChatOpenAICallOptions,\n  BaseChatOpenAIFields,\n  getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n  convertCompletionsDeltaToBaseMessageChunk,\n  convertCompletionsMessageToBaseMessage,\n  convertMessagesToCompletionsMessageParams,\n} from \"../converters/completions.js\";\nimport { convertOpenAICompletionsStream } from \"../utils/stream_events.js\";\n\nexport interface ChatOpenAICompletionsCallOptions extends BaseChatOpenAICallOptions {}\n\ntype ChatCompletionsInvocationParams = Omit<\n  OpenAIClient.Chat.Completions.ChatCompletionCreateParams,\n  \"messages\"\n>;\n\nconst TOOL_IMAGE_HINT =\n  \"Chat Completions does not support images in tool messages. \" +\n  \"Use the Responses API (`useResponsesApi: true`) to send images from tool results.\";\n\n/** Points a 400 caused by a tool-result image at the Responses API. */\nfunction addToolImageHint(\n  error: unknown,\n  messages: OpenAIClient.Chat.ChatCompletionMessageParam[]\n) {\n  const hasToolImage = messages.some(\n    (message) =>\n      message.role === \"tool\" &&\n      Array.isArray(message.content) &&\n      message.content.some(\n        (part) => (part as { type: string }).type === \"image\"\n      )\n  );\n  if (\n    hasToolImage &&\n    error instanceof Error &&\n    \"status\" in error &&\n    error.status === 400\n  ) {\n    error.message = `${error.message}\\n\\n${TOOL_IMAGE_HINT}`;\n  }\n  return error;\n}\n\n/**\n * OpenAI Completions API implementation.\n * @internal\n */\nexport class ChatOpenAICompletions<\n  CallOptions extends ChatOpenAICompletionsCallOptions =\n    ChatOpenAICompletionsCallOptions,\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, false);\n  }\n\n  /** @internal */\n  override invocationParams(\n    options?: this[\"ParsedCallOptions\"],\n    extra?: { streaming?: boolean }\n  ): ChatCompletionsInvocationParams {\n    let strict: boolean | undefined;\n    if (options?.strict !== undefined) {\n      strict = options.strict;\n    } else if (this.supportsStrictToolCalling !== undefined) {\n      strict = this.supportsStrictToolCalling;\n    }\n\n    // A `json_schema` response format goes through the SDK `.parse()` helper,\n    // which requires strict function tools — but only on the NON-streaming path\n    // (`completionWithRetry` uses `.parse()` only when `!request.stream`).\n    // Streaming structured output uses `create()`, which doesn't need strict, so\n    // don't force it there. Default to strict for the parse path unless the\n    // caller set strict:false. (Re-applied here because the agent core no longer\n    // forces strict for every provider.)\n    const isStreaming = this.streaming || extra?.streaming;\n    if (\n      !isStreaming &&\n      options?.response_format?.type === \"json_schema\" &&\n      strict !== false\n    ) {\n      strict = true;\n    }\n\n    let streamOptionsConfig = {};\n    if (options?.stream_options !== undefined) {\n      streamOptionsConfig = { stream_options: options.stream_options };\n    } else if (this.streamUsage && (this.streaming || extra?.streaming)) {\n      streamOptionsConfig = { stream_options: { include_usage: true } };\n    }\n\n    const params: Partial<ChatCompletionsInvocationParams> = {\n      model: this.model,\n      temperature: this.temperature,\n      top_p: this.topP,\n      frequency_penalty: this.frequencyPenalty,\n      presence_penalty: this.presencePenalty,\n      logprobs: this.logprobs,\n      top_logprobs: this.topLogprobs,\n      n: this.n,\n      logit_bias: this.logitBias,\n      stop: options?.stop ?? this.stopSequences,\n      user: this.user,\n      // if include_usage is set or streamUsage then stream must be set to true.\n      stream: this.streaming,\n      functions: options?.functions,\n      function_call: options?.function_call,\n      tools: options?.tools?.length\n        ? options.tools.map((tool) =>\n            this._convertChatOpenAIToolToCompletionsTool(tool, { strict })\n          )\n        : undefined,\n      tool_choice: formatToOpenAIToolChoice(\n        options?.tool_choice as OpenAIToolChoice\n      ),\n      response_format: this._getResponseFormat(options?.response_format),\n      seed: options?.seed,\n      ...streamOptionsConfig,\n      parallel_tool_calls: options?.parallel_tool_calls,\n      ...(this.audio || options?.audio\n        ? { audio: this.audio || options?.audio }\n        : {}),\n      ...(this.modalities || options?.modalities\n        ? { modalities: this.modalities || options?.modalities }\n        : {}),\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      verbosity: options?.verbosity ?? this.verbosity,\n    };\n    if (options?.prediction !== undefined) {\n      params.prediction = options.prediction;\n    }\n    if (this.service_tier !== undefined) {\n      params.service_tier = this.service_tier;\n    }\n    if (options?.service_tier !== undefined) {\n      params.service_tier = options.service_tier;\n    }\n    const reasoning = this._getReasoningParams(options);\n    if (reasoning !== undefined && reasoning.effort !== undefined) {\n      params.reasoning_effort = reasoning.effort;\n    }\n    if (isReasoningModel(params.model)) {\n      params.max_completion_tokens =\n        this.maxTokens === -1 ? undefined : this.maxTokens;\n    } else {\n      params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;\n    }\n\n    return params as ChatCompletionsInvocationParams;\n  }\n\n  async _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<ChatResult> {\n    options.signal?.throwIfAborted();\n    const usageMetadata = {} as UsageMetadata;\n    const params = this.invocationParams(options);\n    const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n      convertMessagesToCompletionsMessageParams({\n        messages,\n        model: this.model,\n      });\n\n    if (params.stream) {\n      const stream = this._streamResponseChunks(messages, options, runManager);\n      const finalChunks: Record<number, ChatGenerationChunk> = {};\n      for await (const chunk of stream) {\n        chunk.message.response_metadata = {\n          ...chunk.generationInfo,\n          ...chunk.message.response_metadata,\n        };\n        const index =\n          (chunk.generationInfo as NewTokenIndices)?.completion ?? 0;\n        if (finalChunks[index] === undefined) {\n          finalChunks[index] = chunk;\n        } else {\n          finalChunks[index] = finalChunks[index].concat(chunk);\n        }\n      }\n      const generations = Object.entries(finalChunks)\n        .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10))\n        .map(([_, value]) => value);\n\n      const { functions, function_call } = this.invocationParams(options);\n\n      // OpenAI does not support token usage report under stream mode,\n      // fallback to estimation.\n\n      const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n        messages,\n        functions,\n        function_call\n      );\n      const completionTokenUsage =\n        await this._getNumTokensFromGenerations(generations);\n\n      usageMetadata.input_tokens = promptTokenUsage;\n      usageMetadata.output_tokens = completionTokenUsage;\n      usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n      return {\n        generations,\n        llmOutput: {\n          estimatedTokenUsage: {\n            promptTokens: usageMetadata.input_tokens,\n            completionTokens: usageMetadata.output_tokens,\n            totalTokens: usageMetadata.total_tokens,\n          },\n        },\n      };\n    } else {\n      const data = await this.completionWithRetry(\n        {\n          ...params,\n          stream: false,\n          messages: messagesMapped,\n        },\n        {\n          signal: options?.signal,\n          maxRetries: options?.maxRetries,\n          ...options?.options,\n        }\n      );\n\n      const {\n        completion_tokens: completionTokens,\n        prompt_tokens: promptTokens,\n        total_tokens: totalTokens,\n        prompt_tokens_details: promptTokensDetails,\n        completion_tokens_details: completionTokensDetails,\n      } = data?.usage ?? {};\n\n      if (completionTokens) {\n        usageMetadata.output_tokens =\n          (usageMetadata.output_tokens ?? 0) + completionTokens;\n      }\n\n      if (promptTokens) {\n        usageMetadata.input_tokens =\n          (usageMetadata.input_tokens ?? 0) + promptTokens;\n      }\n\n      if (totalTokens) {\n        usageMetadata.total_tokens =\n          (usageMetadata.total_tokens ?? 0) + totalTokens;\n      }\n\n      if (\n        promptTokensDetails?.audio_tokens !== null ||\n        promptTokensDetails?.cached_tokens !== null ||\n        promptTokensDetails?.cache_write_tokens != null\n      ) {\n        usageMetadata.input_token_details = {\n          ...(promptTokensDetails?.audio_tokens !== null && {\n            audio: promptTokensDetails?.audio_tokens,\n          }),\n          ...(promptTokensDetails?.cached_tokens !== null && {\n            cache_read: promptTokensDetails?.cached_tokens,\n          }),\n          ...(promptTokensDetails?.cache_write_tokens != null && {\n            cache_creation: promptTokensDetails?.cache_write_tokens,\n          }),\n        };\n      }\n\n      if (\n        completionTokensDetails?.audio_tokens !== null ||\n        completionTokensDetails?.reasoning_tokens !== null\n      ) {\n        usageMetadata.output_token_details = {\n          ...(completionTokensDetails?.audio_tokens !== null && {\n            audio: completionTokensDetails?.audio_tokens,\n          }),\n          ...(completionTokensDetails?.reasoning_tokens !== null && {\n            reasoning: completionTokensDetails?.reasoning_tokens,\n          }),\n        };\n      }\n\n      const generations: ChatGeneration[] = [];\n      for (const part of data?.choices ?? []) {\n        const text = part.message?.content ?? \"\";\n        const generation: ChatGeneration = {\n          text,\n          message: this._convertCompletionsMessageToBaseMessage(\n            part.message ?? { role: \"assistant\" },\n            data\n          ),\n        };\n        generation.generationInfo = {\n          ...(part.finish_reason ? { finish_reason: part.finish_reason } : {}),\n          ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n        };\n        if (isAIMessage(generation.message)) {\n          generation.message.usage_metadata = usageMetadata;\n        }\n        // Fields are not serialized unless passed to the constructor\n        // Doing this ensures all fields on the message are serialized\n        generation.message = new AIMessage(\n          Object.fromEntries(\n            Object.entries(generation.message).filter(\n              ([key]) => !key.startsWith(\"lc_\")\n            )\n          ) as AIMessageFields\n        );\n        generations.push(generation);\n      }\n      return {\n        generations,\n        llmOutput: {\n          tokenUsage: {\n            promptTokens: usageMetadata.input_tokens,\n            completionTokens: usageMetadata.output_tokens,\n            totalTokens: usageMetadata.total_tokens,\n          },\n        },\n      };\n    }\n  }\n\n  /**\n   * Native implementation of the content-block-centric streaming protocol\n   * for OpenAI Chat Completions.\n   */\n  async *_streamChatModelEvents(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    _runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatModelStreamEvent> {\n    const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n      convertMessagesToCompletionsMessageParams({\n        messages,\n        model: this.model,\n      });\n\n    const params = {\n      ...this.invocationParams(options, {\n        streaming: true,\n      }),\n      messages: messagesMapped,\n      stream: true as const,\n    };\n\n    const streamIterable = await this.completionWithRetry(params, options);\n    const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n    const abortableStream = async function* (\n      source: AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>,\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* convertOpenAICompletionsStream(\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 messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n      convertMessagesToCompletionsMessageParams({\n        messages,\n        model: this.model,\n      });\n\n    const params = {\n      ...this.invocationParams(options, {\n        streaming: true,\n      }),\n      messages: messagesMapped,\n      stream: true as const,\n    };\n    let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n    const streamIterable = await this.completionWithRetry(params, options);\n    let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n    for await (const data of streamIterable) {\n      if (options.signal?.aborted) {\n        return;\n      }\n      const choice = data?.choices?.[0];\n      if (data.usage) {\n        usage = data.usage;\n      }\n      if (!choice) {\n        continue;\n      }\n\n      const { delta } = choice;\n      if (!delta) {\n        continue;\n      }\n      const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n        delta,\n        data,\n        defaultRole\n      );\n      defaultRole = delta.role ?? defaultRole;\n      const newTokenIndices = {\n        prompt: options.promptIndex ?? 0,\n        completion: choice.index ?? 0,\n      };\n      if (typeof chunk.content !== \"string\") {\n        console.log(\n          \"[WARNING]: Received non-string content from OpenAI. This is currently not supported.\"\n        );\n        continue;\n      }\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      const generationInfo: Record<string, any> = { ...newTokenIndices };\n      if (choice.finish_reason != null) {\n        generationInfo.finish_reason = choice.finish_reason;\n        // Only include system fingerprint in the last chunk for now\n        // to avoid concatenation issues\n        generationInfo.system_fingerprint = data.system_fingerprint;\n        generationInfo.model_name = data.model;\n        generationInfo.service_tier = data.service_tier;\n      }\n      if (this.logprobs) {\n        generationInfo.logprobs = choice.logprobs;\n      }\n      const generationChunk = new ChatGenerationChunk({\n        message: chunk,\n        text: chunk.content,\n        generationInfo,\n      });\n      yield generationChunk;\n      await runManager?.handleLLMNewToken(\n        generationChunk.text ?? \"\",\n        newTokenIndices,\n        undefined,\n        undefined,\n        undefined,\n        { chunk: generationChunk }\n      );\n    }\n    if (usage) {\n      const inputTokenDetails = {\n        ...(usage.prompt_tokens_details?.audio_tokens !== null && {\n          audio: usage.prompt_tokens_details?.audio_tokens,\n        }),\n        ...(usage.prompt_tokens_details?.cached_tokens !== null && {\n          cache_read: usage.prompt_tokens_details?.cached_tokens,\n        }),\n        ...(usage.prompt_tokens_details?.cache_write_tokens != null && {\n          cache_creation: usage.prompt_tokens_details?.cache_write_tokens,\n        }),\n      };\n      const outputTokenDetails = {\n        ...(usage.completion_tokens_details?.audio_tokens !== null && {\n          audio: usage.completion_tokens_details?.audio_tokens,\n        }),\n        ...(usage.completion_tokens_details?.reasoning_tokens !== null && {\n          reasoning: usage.completion_tokens_details?.reasoning_tokens,\n        }),\n      };\n      const generationChunk = new ChatGenerationChunk({\n        message: new AIMessageChunk({\n          content: \"\",\n          response_metadata: {\n            usage: { ...usage },\n          },\n          usage_metadata: {\n            input_tokens: usage.prompt_tokens,\n            output_tokens: usage.completion_tokens,\n            total_tokens: usage.total_tokens,\n            ...(Object.keys(inputTokenDetails).length > 0 && {\n              input_token_details: inputTokenDetails,\n            }),\n            ...(Object.keys(outputTokenDetails).length > 0 && {\n              output_token_details: outputTokenDetails,\n            }),\n          },\n        }),\n        text: \"\",\n      });\n      yield generationChunk;\n      await runManager?.handleLLMNewToken(\n        generationChunk.text ?? \"\",\n        { prompt: 0, completion: 0 },\n        undefined,\n        undefined,\n        undefined,\n        { chunk: generationChunk }\n      );\n    }\n    if (options.signal?.aborted) {\n      throw new Error(\"AbortError\");\n    }\n  }\n\n  async completionWithRetry(\n    request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n    requestOptions?: OpenAIClient.RequestOptions\n  ): Promise<AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>>;\n\n  async completionWithRetry(\n    request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n    requestOptions?: OpenAIClient.RequestOptions\n  ): Promise<OpenAIClient.Chat.Completions.ChatCompletion>;\n\n  async completionWithRetry(\n    request: OpenAIClient.Chat.ChatCompletionCreateParams,\n    requestOptions?: OpenAIClient.RequestOptions\n  ): Promise<\n    | AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>\n    | OpenAIClient.Chat.Completions.ChatCompletion\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    const isParseableFormat =\n      request.response_format && request.response_format.type === \"json_schema\";\n    return this.caller.callWithOptions({ maxRetries }, async () => {\n      try {\n        if (isParseableFormat && !request.stream) {\n          return await this.client.chat.completions.parse(\n            request,\n            clientOptions\n          );\n        } else {\n          return await this.client.chat.completions.create(\n            request,\n            clientOptions\n          );\n        }\n      } catch (e) {\n        const error = wrapOpenAIClientError(e);\n        throw addToolImageHint(error, request.messages);\n      }\n    });\n  }\n\n  /**\n   * @deprecated\n   * This function was hoisted into a publicly accessible function from a\n   * different export, but to maintain backwards compatibility with chat models\n   * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n   * method. This will be removed in a future release\n   */\n  protected _convertCompletionsDeltaToBaseMessageChunk(\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    delta: Record<string, any>,\n    rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n    defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n  ): BaseMessageChunk {\n    return convertCompletionsDeltaToBaseMessageChunk({\n      delta,\n      rawResponse,\n      includeRawResponse: this.__includeRawResponse,\n      defaultRole,\n    });\n  }\n\n  /**\n   * @deprecated\n   * This function was hoisted into a publicly accessible function from a\n   * different export, but to maintain backwards compatibility with chat models\n   * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n   * method. This will be removed in a future release\n   */\n  protected _convertCompletionsMessageToBaseMessage(\n    message: OpenAIClient.ChatCompletionMessage,\n    rawResponse: OpenAIClient.ChatCompletion\n  ): BaseMessage {\n    return convertCompletionsMessageToBaseMessage({\n      message,\n      rawResponse,\n      includeRawResponse: this.__includeRawResponse,\n    });\n  }\n}\n"],"mappings":"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"}