{"version":3,"file":"responses.cjs","names":["parseCustomToolCall","parseComputerCall","AIMessage","ChatGenerationChunk","AIMessageChunk","iife","messageToOpenAIRole","getFilenameFromMetadata","getRequiredFilenameFromMetadata","isReasoningModel","isCustomToolCall","isComputerToolCall","completionsApiContentBlockConverter"],"sources":["../../src/converters/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport {\n  AIMessage,\n  AIMessageChunk,\n  type BaseMessage,\n  type UsageMetadata,\n  type BaseMessageFields,\n  type MessageContent,\n  type InvalidToolCall,\n  MessageContentImageUrl,\n  isDataContentBlock,\n  convertToProviderContentBlock,\n  ContentBlock,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk } from \"@langchain/core/outputs\";\nimport {\n  makeInvalidToolCall,\n  parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport type {\n  ToolCall,\n  ToolCallChunk,\n  ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport { ResponseInputMessageContentList } from \"openai/resources/responses/responses.js\";\nimport { ChatOpenAIReasoningSummary } from \"../types.js\";\nimport {\n  isComputerToolCall,\n  isCustomToolCall,\n  parseComputerCall,\n  parseCustomToolCall,\n} from \"../utils/tools.js\";\nimport {\n  getFilenameFromMetadata,\n  getRequiredFilenameFromMetadata,\n  iife,\n  isReasoningModel,\n  messageToOpenAIRole,\n} from \"../utils/misc.js\";\nimport { Converter } from \"@langchain/core/utils/format\";\nimport { completionsApiContentBlockConverter } from \"./completions.js\";\n\nconst _FUNCTION_CALL_IDS_MAP_KEY = \"__openai_function_call_ids__\";\n\ntype OpenAIAnnotation =\n  OpenAIClient.Responses.ResponseOutputText[\"annotations\"][number];\n\n/**\n * Converts an OpenAI annotation to a LangChain Citation or BaseContentBlock.\n *\n * OpenAI has several annotation types:\n * - `url_citation`: Web citations with url, title, start_index, end_index\n * - `file_citation`: File citations with file_id, filename, index\n * - `container_file_citation`: Container file citations with container_id, file_id, filename, start_index, end_index\n * - `file_path`: File paths with file_id, index\n *\n * This function maps them to LangChain's Citation format or preserves them as non-standard blocks.\n */\nfunction convertOpenAIAnnotationToLangChain(\n  annotation: OpenAIAnnotation\n): ContentBlock.Citation | ContentBlock.NonStandard {\n  if (annotation.type === \"url_citation\") {\n    return {\n      type: \"citation\",\n      source: \"url_citation\",\n      url: annotation.url,\n      title: annotation.title,\n      startIndex: annotation.start_index,\n      endIndex: annotation.end_index,\n    } satisfies ContentBlock.Citation;\n  }\n\n  if (annotation.type === \"file_citation\") {\n    return {\n      type: \"citation\",\n      source: \"file_citation\",\n      title: annotation.filename,\n      startIndex: annotation.index,\n      // Store file_id in a way that can be retrieved\n      file_id: annotation.file_id,\n    } as ContentBlock.Citation;\n  }\n\n  if (annotation.type === \"container_file_citation\") {\n    return {\n      type: \"citation\",\n      source: \"container_file_citation\",\n      title: annotation.filename,\n      startIndex: annotation.start_index,\n      endIndex: annotation.end_index,\n      // Store additional IDs\n      file_id: annotation.file_id,\n      container_id: annotation.container_id,\n    } as ContentBlock.Citation;\n  }\n\n  if (annotation.type === \"file_path\") {\n    return {\n      type: \"citation\",\n      source: \"file_path\",\n      startIndex: annotation.index,\n      file_id: annotation.file_id,\n    } as ContentBlock.Citation;\n  }\n\n  // For unknown annotation types, preserve them as non-standard blocks\n  return {\n    type: \"non_standard\",\n    value: annotation as unknown as Record<string, unknown>,\n  } satisfies ContentBlock.NonStandard;\n}\n\n/**\n * Converts a LangChain Citation or BaseContentBlock back to an OpenAI annotation.\n *\n * This is the inverse of `convertOpenAIAnnotationToLangChain`. It handles all four\n * annotation types (url_citation, file_citation, container_file_citation, file_path)\n * and also passes through annotations that are already in OpenAI format.\n */\nfunction convertLangChainAnnotationToOpenAI(\n  annotation:\n    | ContentBlock.Citation\n    | ContentBlock.NonStandard\n    | Record<string, unknown>\n): OpenAIAnnotation {\n  // If it's already in OpenAI format, pass through unchanged\n  if (\n    annotation.type === \"url_citation\" ||\n    annotation.type === \"file_citation\" ||\n    annotation.type === \"container_file_citation\" ||\n    annotation.type === \"file_path\"\n  ) {\n    return annotation as unknown as OpenAIAnnotation;\n  }\n\n  // Convert from LangChain citation format back to OpenAI format\n  if (annotation.type === \"citation\") {\n    const citation = annotation as ContentBlock.Citation & {\n      file_id?: string;\n      container_id?: string;\n    };\n\n    if (citation.source === \"url_citation\") {\n      return {\n        type: \"url_citation\",\n        url: citation.url ?? \"\",\n        title: citation.title ?? \"\",\n        start_index: citation.startIndex ?? 0,\n        end_index: citation.endIndex ?? 0,\n      } as OpenAIAnnotation;\n    }\n\n    if (citation.source === \"file_citation\") {\n      return {\n        type: \"file_citation\",\n        file_id: citation.file_id ?? \"\",\n        filename: citation.title ?? \"\",\n        index: citation.startIndex ?? 0,\n      } as OpenAIAnnotation;\n    }\n\n    if (citation.source === \"container_file_citation\") {\n      return {\n        type: \"container_file_citation\",\n        file_id: citation.file_id ?? \"\",\n        filename: citation.title ?? \"\",\n        container_id: citation.container_id ?? \"\",\n        start_index: citation.startIndex ?? 0,\n        end_index: citation.endIndex ?? 0,\n      } as OpenAIAnnotation;\n    }\n\n    if (citation.source === \"file_path\") {\n      return {\n        type: \"file_path\",\n        file_id: citation.file_id ?? \"\",\n        index: citation.startIndex ?? 0,\n      } as OpenAIAnnotation;\n    }\n  }\n\n  // For non_standard blocks, unwrap the value\n  if (annotation.type === \"non_standard\") {\n    return (annotation as ContentBlock.NonStandard)\n      .value as unknown as OpenAIAnnotation;\n  }\n\n  // Unknown format, pass through as-is\n  return annotation as unknown as OpenAIAnnotation;\n}\n\ntype ExcludeController<T> = T extends { controller: unknown } ? never : T;\n\nexport type ResponsesCreate = OpenAIClient.Responses[\"create\"];\nexport type ResponsesParse = OpenAIClient.Responses[\"parse\"];\n\nexport type ResponsesCreateInvoke = ExcludeController<\n  Awaited<ReturnType<ResponsesCreate>>\n>;\nexport type ResponsesParseInvoke = ExcludeController<\n  Awaited<ReturnType<ResponsesParse>>\n>;\n\nexport type ResponsesInputItem = OpenAIClient.Responses.ResponseInputItem;\n\n/**\n * Converts OpenAI Responses API usage statistics to LangChain's UsageMetadata format.\n *\n * This converter transforms token usage information from OpenAI's Responses API into\n * the standardized UsageMetadata format used throughout LangChain. It handles both\n * basic token counts and detailed token breakdowns including cached tokens and\n * reasoning tokens.\n *\n * @param usage - The usage statistics object from OpenAI's Responses API containing\n *                token counts and optional detailed breakdowns.\n *\n * @returns A UsageMetadata object containing:\n *   - `input_tokens`: Total number of tokens in the input/prompt (defaults to 0 if not provided)\n *   - `output_tokens`: Total number of tokens in the model's output (defaults to 0 if not provided)\n *   - `total_tokens`: Combined total of input and output tokens (defaults to 0 if not provided)\n *   - `input_token_details`: Object containing detailed input token information:\n *     - `cache_read`: Number of tokens read from cache (only included if available)\n *   - `output_token_details`: Object containing detailed output token information:\n *     - `reasoning`: Number of tokens used for reasoning (only included if available)\n *\n * @example\n * ```typescript\n * const usage = {\n *   input_tokens: 100,\n *   output_tokens: 50,\n *   total_tokens: 150,\n *   input_tokens_details: { cached_tokens: 20 },\n *   output_tokens_details: { reasoning_tokens: 10 }\n * };\n *\n * const metadata = convertResponsesUsageToUsageMetadata(usage);\n * // Returns:\n * // {\n * //   input_tokens: 100,\n * //   output_tokens: 50,\n * //   total_tokens: 150,\n * //   input_token_details: { cache_read: 20 },\n * //   output_token_details: { reasoning: 10 }\n * // }\n * ```\n *\n * @remarks\n * - The function safely handles undefined or null values by using optional chaining\n *   and nullish coalescing operators\n * - Detailed token information (cache_read, reasoning) is only included in the result\n *   if the corresponding values are present in the input\n * - Token counts default to 0 if not provided in the usage object\n * - This converter is specifically designed for OpenAI's Responses API format and\n *   may differ from other OpenAI API endpoints\n */\nexport const convertResponsesUsageToUsageMetadata: Converter<\n  OpenAIClient.Responses.ResponseUsage | undefined,\n  UsageMetadata\n> = (usage) => {\n  const inputTokenDetails = {\n    ...(usage?.input_tokens_details?.cached_tokens != null && {\n      cache_read: usage?.input_tokens_details?.cached_tokens,\n    }),\n  };\n  const outputTokenDetails = {\n    ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n      reasoning: usage?.output_tokens_details?.reasoning_tokens,\n    }),\n  };\n  return {\n    input_tokens: usage?.input_tokens ?? 0,\n    output_tokens: usage?.output_tokens ?? 0,\n    total_tokens: usage?.total_tokens ?? 0,\n    input_token_details: inputTokenDetails,\n    output_token_details: outputTokenDetails,\n  };\n};\n\n/**\n * Converts an OpenAI Responses API response to a LangChain AIMessage.\n *\n * This converter processes the output from OpenAI's Responses API (both `create` and `parse` methods)\n * and transforms it into a LangChain AIMessage object with all relevant metadata, tool calls, and content.\n *\n * @param response - The response object from OpenAI's Responses API. Can be either:\n *   - ResponsesCreateInvoke: Result from `responses.create()`\n *   - ResponsesParseInvoke: Result from `responses.parse()`\n *\n * @returns An AIMessage containing:\n *   - `id`: The message ID from the response output\n *   - `content`: Array of message content blocks (text, images, etc.)\n *   - `tool_calls`: Array of successfully parsed tool calls\n *   - `invalid_tool_calls`: Array of tool calls that failed to parse\n *   - `usage_metadata`: Token usage information converted to LangChain format\n *   - `additional_kwargs`: Extra data including:\n *     - `refusal`: Refusal text if the model refused to respond\n *     - `reasoning`: Reasoning output for reasoning models\n *     - `tool_outputs`: Results from built-in tools (web search, file search, etc.)\n *     - `parsed`: Parsed structured output when using json_schema format\n *     - Function call ID mappings for tracking\n *   - `response_metadata`: Metadata about the response including model, timestamps, status, etc.\n *\n * @throws Error if the response contains an error object. The error message and code are extracted\n *   from the response.error field.\n *\n * @example\n * ```typescript\n * const response = await client.responses.create({\n *   model: \"gpt-4\",\n *   input: [{ type: \"message\", content: \"Hello\" }]\n * });\n * const message = convertResponsesMessageToAIMessage(response);\n * console.log(message.content); // Message content\n * console.log(message.tool_calls); // Any tool calls made\n * ```\n *\n * @remarks\n * The converter handles multiple output item types:\n * - `message`: Text and structured content from the model\n * - `function_call`: Tool/function calls that need to be executed\n * - `reasoning`: Reasoning traces from reasoning models (o1, o3, etc.)\n * - `custom_tool_call`: Custom tool invocations\n * - Built-in tool outputs: web_search, file_search, code_interpreter, etc.\n *\n * Tool calls are parsed and validated. Invalid tool calls (malformed JSON, etc.) are captured\n * in the `invalid_tool_calls` array rather than throwing errors.\n */\nexport const convertResponsesMessageToAIMessage: Converter<\n  ResponsesCreateInvoke | ResponsesParseInvoke,\n  AIMessage\n> = (response) => {\n  if (response.error) {\n    // TODO: add support for `addLangChainErrorFields`\n    const error = new Error(response.error.message);\n    error.name = response.error.code;\n    throw error;\n  }\n\n  let messageId: string | undefined;\n  const content: MessageContent = [];\n  const tool_calls: ToolCall[] = [];\n  const invalid_tool_calls: InvalidToolCall[] = [];\n  // Preserve the raw output items so that convertMessagesToResponsesInput can\n  // return them verbatim on the fast path.  We strip `parsed_arguments` from\n  // function_call items because the OpenAI SDK injects it when using\n  // responses.parse(), but the API rejects it when sent back as input.\n  const cleanedOutput = response.output.map((item) => {\n    if (item.type === \"function_call\" && \"parsed_arguments\" in item) {\n      const cleaned = { ...item };\n      delete (cleaned as Record<string, unknown>).parsed_arguments;\n      return cleaned;\n    }\n    return item;\n  });\n\n  const response_metadata: Record<string, unknown> = {\n    model_provider: \"openai\",\n    model: response.model,\n    created_at: response.created_at,\n    id: response.id,\n    incomplete_details: response.incomplete_details,\n    metadata: response.metadata,\n    object: response.object,\n    output: cleanedOutput,\n    status: response.status,\n    user: response.user,\n    service_tier: response.service_tier,\n    // for compatibility with chat completion calls.\n    model_name: response.model,\n  };\n\n  const additional_kwargs: {\n    [key: string]: unknown;\n    refusal?: string;\n    reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n    tool_outputs?: unknown[];\n    parsed?: unknown;\n    [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n  } = {};\n\n  for (const item of response.output) {\n    if (item.type === \"message\") {\n      messageId = item.id;\n      content.push(\n        ...item.content.flatMap((part) => {\n          if (part.type === \"output_text\") {\n            if (\"parsed\" in part && part.parsed != null) {\n              additional_kwargs.parsed = part.parsed;\n            }\n            const block: ContentBlock = {\n              type: \"text\",\n              text: part.text,\n              annotations: part.annotations.map(\n                convertOpenAIAnnotationToLangChain\n              ),\n              ...(item.phase !== null ? { phase: item.phase } : {}),\n            };\n            return block;\n          }\n\n          if (part.type === \"refusal\") {\n            additional_kwargs.refusal = part.refusal;\n            return [];\n          }\n\n          return part;\n        })\n      );\n    } else if (item.type === \"function_call\") {\n      const fnAdapter = {\n        function: { name: item.name, arguments: item.arguments },\n        id: item.call_id,\n      };\n\n      try {\n        tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));\n      } catch (e: unknown) {\n        let errMessage: string | undefined;\n        if (\n          typeof e === \"object\" &&\n          e != null &&\n          \"message\" in e &&\n          typeof e.message === \"string\"\n        ) {\n          errMessage = e.message;\n        }\n        invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));\n      }\n\n      additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};\n      if (item.id) {\n        additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;\n      }\n    } else if (item.type === \"reasoning\") {\n      additional_kwargs.reasoning = item;\n      // Also elevate reasoning to content for UI rendering\n      const reasoningText = item.summary\n        ?.map((s) => s.text)\n        .filter(Boolean)\n        .join(\"\");\n      if (reasoningText) {\n        content.push({\n          type: \"reasoning\",\n          reasoning: reasoningText,\n        });\n      }\n    } else if (item.type === \"custom_tool_call\") {\n      const parsed = parseCustomToolCall(item);\n      if (parsed) {\n        tool_calls.push(parsed);\n      } else {\n        invalid_tool_calls.push(\n          makeInvalidToolCall(item, \"Malformed custom tool call\")\n        );\n      }\n    } else if (item.type === \"computer_call\") {\n      const parsed = parseComputerCall(item);\n      if (parsed) {\n        tool_calls.push(parsed);\n      } else {\n        invalid_tool_calls.push(\n          makeInvalidToolCall(item, \"Malformed computer call\")\n        );\n      }\n    } else if (item.type === \"image_generation_call\") {\n      // Add image as proper content block if result is available\n      if (item.result) {\n        content.push({\n          type: \"image\",\n          mimeType: \"image/png\",\n          data: item.result,\n          id: item.id,\n          metadata: {\n            status: item.status,\n          },\n        } satisfies ContentBlock.Multimodal.Image);\n      }\n      // Also store in tool_outputs for backwards compatibility and multi-turn editing (needs id)\n      additional_kwargs.tool_outputs ??= [];\n      additional_kwargs.tool_outputs.push(item);\n    } else {\n      additional_kwargs.tool_outputs ??= [];\n      additional_kwargs.tool_outputs.push(item);\n    }\n  }\n\n  return new AIMessage({\n    id: messageId,\n    content,\n    tool_calls,\n    invalid_tool_calls,\n    usage_metadata: convertResponsesUsageToUsageMetadata(response.usage),\n    additional_kwargs,\n    response_metadata,\n  });\n};\n\n/**\n * Converts a LangChain ChatOpenAI reasoning summary to an OpenAI Responses API reasoning item.\n *\n * This converter transforms reasoning summaries that have been accumulated during streaming\n * (where summary parts may arrive in multiple chunks with the same index) into the final\n * consolidated format expected by OpenAI's Responses API. It combines summary parts that\n * share the same index and removes the index field from the final output.\n *\n * @param reasoning - A ChatOpenAI reasoning summary object containing:\n *   - `id`: The reasoning item ID\n *   - `type`: The type of reasoning (typically \"reasoning\")\n *   - `summary`: Array of summary parts, each with:\n *     - `text`: The summary text content\n *     - `type`: The summary type (e.g., \"summary_text\")\n *     - `index`: The index used to group related summary parts during streaming\n *\n * @returns An OpenAI Responses API ResponseReasoningItem with:\n *   - All properties from the input reasoning object\n *   - `summary`: Consolidated array of summary objects with:\n *     - `text`: Combined text from all parts with the same index\n *     - `type`: The summary type\n *     - No `index` field (removed after consolidation)\n *\n * @example\n * ```typescript\n * // Input: Reasoning summary with multiple parts at the same index\n * const reasoning = {\n *   id: \"reasoning_123\",\n *   type: \"reasoning\",\n *   summary: [\n *     { text: \"First \", type: \"summary_text\", index: 0 },\n *     { text: \"part\", type: \"summary_text\", index: 0 },\n *     { text: \"Second part\", type: \"summary_text\", index: 1 }\n *   ]\n * };\n *\n * const result = convertReasoningSummaryToResponsesReasoningItem(reasoning);\n * // Returns:\n * // {\n * //   id: \"reasoning_123\",\n * //   type: \"reasoning\",\n * //   summary: [\n * //     { text: \"First part\", type: \"summary_text\" },\n * //     { text: \"Second part\", type: \"summary_text\" }\n * //   ]\n * // }\n * ```\n *\n * @remarks\n * - This converter is primarily used when reconstructing complete reasoning items from\n *   streaming chunks, where summary parts may arrive incrementally with index markers\n * - Summary parts with the same index are concatenated in the order they appear\n * - If the reasoning summary contains only one part, no reduction is performed\n * - The index field is used internally during streaming to track which summary parts\n *   belong together, but is removed from the final output as it's not part of the\n *   OpenAI Responses API schema\n * - This is the inverse operation of the streaming accumulation that happens in\n *   `convertResponsesDeltaToChatGenerationChunk`\n */\nexport const convertReasoningSummaryToResponsesReasoningItem: Converter<\n  ChatOpenAIReasoningSummary,\n  OpenAIClient.Responses.ResponseReasoningItem\n> = (reasoning) => {\n  // combine summary parts that have the the same index and then remove the indexes\n  const summary = (\n    reasoning.summary.length > 1\n      ? reasoning.summary.reduce(\n          (acc, curr) => {\n            const last = acc[acc.length - 1];\n\n            if (last!.index === curr.index) {\n              last!.text += curr.text;\n            } else {\n              acc.push(curr);\n            }\n            return acc;\n          },\n          [{ ...reasoning.summary[0] }]\n        )\n      : reasoning.summary\n  ).map((s) =>\n    Object.fromEntries(Object.entries(s).filter(([k]) => k !== \"index\"))\n  ) as OpenAIClient.Responses.ResponseReasoningItem.Summary[];\n\n  return {\n    ...reasoning,\n    summary,\n  } as OpenAIClient.Responses.ResponseReasoningItem;\n};\n\n/**\n * Converts OpenAI Responses API stream events to LangChain ChatGenerationChunk objects.\n *\n * This converter processes streaming events from OpenAI's Responses API and transforms them\n * into LangChain ChatGenerationChunk objects that can be used in streaming chat applications.\n * It handles various event types including text deltas, tool calls, reasoning, and metadata updates.\n *\n * @param event - A streaming event from OpenAI's Responses API\n *\n * @returns A ChatGenerationChunk containing:\n *   - `text`: Concatenated text content from all text parts in the event\n *   - `message`: An AIMessageChunk with:\n *     - `id`: Message ID (set when a message output item is added)\n *     - `content`: Array of content blocks (text with optional annotations)\n *     - `tool_call_chunks`: Incremental tool call data (name, args, id)\n *     - `usage_metadata`: Token usage information (only in completion events)\n *     - `additional_kwargs`: Extra data including:\n *       - `refusal`: Refusal text if the model refused to respond\n *       - `reasoning`: Reasoning output for reasoning models (id, type, summary)\n *       - `tool_outputs`: Results from built-in tools (web search, file search, etc.)\n *       - `parsed`: Parsed structured output when using json_schema format\n *       - Function call ID mappings for tracking\n *     - `response_metadata`: Metadata about the response (model, id, etc.)\n *   - `generationInfo`: Additional generation information (e.g., tool output status)\n *\n *   Returns `null` for events that don't produce meaningful chunks:\n *   - Partial image generation events (to avoid storing all partial images in history)\n *   - Unrecognized event types\n *\n * @example\n * ```typescript\n * const stream = await client.responses.create({\n *   model: \"gpt-4\",\n *   input: [{ type: \"message\", content: \"Hello\" }],\n *   stream: true\n * });\n *\n * for await (const event of stream) {\n *   const chunk = convertResponsesDeltaToChatGenerationChunk(event);\n *   if (chunk) {\n *     console.log(chunk.text); // Incremental text\n *     console.log(chunk.message.tool_call_chunks); // Tool call updates\n *   }\n * }\n * ```\n *\n * @remarks\n * - Text content is accumulated in an array with index tracking for proper ordering\n * - Tool call chunks include incremental arguments that need to be concatenated by the consumer\n * - Reasoning summaries are built incrementally across multiple events\n * - Function call IDs are tracked in `additional_kwargs` to map call_id to item id\n * - The `text` field is provided for legacy compatibility with `onLLMNewToken` callbacks\n * - Usage metadata is only available in `response.completed` events\n * - Partial images are intentionally ignored to prevent memory bloat in conversation history\n */\nexport const convertResponsesDeltaToChatGenerationChunk: Converter<\n  OpenAIClient.Responses.ResponseStreamEvent,\n  ChatGenerationChunk | null\n> = (event) => {\n  const content: ContentBlock[] = [];\n  let generationInfo: Record<string, unknown> = {};\n  let usage_metadata: UsageMetadata | undefined;\n  const tool_call_chunks: ToolCallChunk[] = [];\n  const response_metadata: Record<string, unknown> = {\n    model_provider: \"openai\",\n  };\n  const additional_kwargs: {\n    [key: string]: unknown;\n    reasoning?: Partial<ChatOpenAIReasoningSummary>;\n    tool_outputs?: unknown[];\n  } = {};\n  let id: string | undefined;\n  if (event.type === \"response.output_text.delta\") {\n    content.push({\n      type: \"text\",\n      text: event.delta,\n      index: event.content_index,\n    } satisfies ContentBlock.Text);\n  } else if (event.type === \"response.output_text.annotation.added\") {\n    content.push({\n      type: \"text\",\n      text: \"\",\n      annotations: [\n        convertOpenAIAnnotationToLangChain(\n          event.annotation as OpenAIAnnotation\n        ),\n      ],\n      index: event.content_index,\n    } satisfies ContentBlock.Text);\n  } else if (\n    event.type === \"response.output_item.added\" &&\n    event.item.type === \"message\"\n  ) {\n    id = event.item.id;\n    const phase = \"phase\" in event.item ? event.item.phase : undefined;\n    if (phase) {\n      content.push({\n        type: \"text\",\n        text: \"\",\n        phase,\n        index: 0,\n      } as ContentBlock.Text);\n    }\n  } else if (\n    event.type === \"response.output_item.added\" &&\n    event.item.type === \"function_call\"\n  ) {\n    tool_call_chunks.push({\n      type: \"tool_call_chunk\",\n      name: event.item.name,\n      args: event.item.arguments,\n      id: event.item.call_id,\n      index: event.output_index,\n    });\n\n    additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = {\n      [event.item.call_id]: event.item.id,\n    };\n  } else if (\n    event.type === \"response.output_item.done\" &&\n    event.item.type === \"computer_call\"\n  ) {\n    // Handle computer_call as a tool call so ToolNode can process it\n    tool_call_chunks.push({\n      type: \"tool_call_chunk\",\n      name: \"computer_use\",\n      args: JSON.stringify({ action: event.item.action }),\n      id: event.item.call_id,\n      index: event.output_index,\n    });\n    // Also store the raw item for additional context (pending_safety_checks, etc.)\n    additional_kwargs.tool_outputs = [event.item];\n  } else if (\n    event.type === \"response.output_item.done\" &&\n    event.item.type === \"image_generation_call\"\n  ) {\n    // Add image as proper content block if result is available\n    if (event.item.result) {\n      content.push({\n        type: \"image\",\n        mimeType: \"image/png\",\n        data: event.item.result,\n        id: event.item.id,\n        metadata: {\n          status: event.item.status,\n        },\n      } satisfies ContentBlock.Multimodal.Image);\n    }\n    // Also store in tool_outputs for backwards compatibility and multi-turn editing (needs id)\n    additional_kwargs.tool_outputs = [event.item];\n  } else if (\n    event.type === \"response.output_item.done\" &&\n    [\n      \"web_search_call\",\n      \"file_search_call\",\n      \"code_interpreter_call\",\n      \"shell_call\",\n      \"local_shell_call\",\n      \"mcp_call\",\n      \"mcp_list_tools\",\n      \"mcp_approval_request\",\n      \"custom_tool_call\",\n      \"tool_search_call\",\n      \"tool_search_output\",\n    ].includes(event.item.type)\n  ) {\n    additional_kwargs.tool_outputs = [event.item];\n  } else if (event.type === \"response.created\") {\n    response_metadata.id = event.response.id;\n    response_metadata.model_name = event.response.model;\n    response_metadata.model = event.response.model;\n  } else if (event.type === \"response.completed\") {\n    const msg = convertResponsesMessageToAIMessage(event.response);\n\n    usage_metadata = convertResponsesUsageToUsageMetadata(event.response.usage);\n\n    if (event.response.text?.format?.type === \"json_schema\" && msg.text) {\n      additional_kwargs.parsed ??= JSON.parse(msg.text);\n    }\n    for (const [key, value] of Object.entries(event.response)) {\n      if (key === \"id\") continue;\n      // Use the cleaned output from the converted message so that\n      // SDK-only fields like parsed_arguments are not persisted.\n      if (key === \"output\") {\n        response_metadata[key] = msg.response_metadata.output;\n      } else {\n        response_metadata[key] = value;\n      }\n    }\n  } else if (\n    event.type === \"response.function_call_arguments.delta\" ||\n    event.type === \"response.custom_tool_call_input.delta\"\n  ) {\n    tool_call_chunks.push({\n      type: \"tool_call_chunk\",\n      args: event.delta,\n      index: event.output_index,\n    });\n  } else if (\n    event.type === \"response.web_search_call.completed\" ||\n    event.type === \"response.file_search_call.completed\"\n  ) {\n    generationInfo = {\n      tool_outputs: {\n        id: event.item_id,\n        type: event.type.replace(\"response.\", \"\").replace(\".completed\", \"\"),\n        status: \"completed\",\n      },\n    };\n  } else if (event.type === \"response.refusal.done\") {\n    additional_kwargs.refusal = event.refusal;\n  } else if (\n    event.type === \"response.output_item.added\" &&\n    \"item\" in event &&\n    event.item.type === \"reasoning\"\n  ) {\n    const summary: ChatOpenAIReasoningSummary[\"summary\"] | undefined = event\n      .item.summary\n      ? event.item.summary.map((s, index) => ({\n          ...s,\n          index,\n        }))\n      : undefined;\n\n    additional_kwargs.reasoning = {\n      // We only capture ID in the first event or else the concatenated result of all chunks will\n      // have an ID field that is repeated once per event. There is special handling for the `type`\n      // field that prevents this, however.\n      id: event.item.id,\n      type: event.item.type,\n      ...(summary ? { summary } : {}),\n    };\n\n    // Also elevate reasoning to content for UI rendering\n    const reasoningText = event.item.summary\n      ?.map((s) => s.text)\n      .filter(Boolean)\n      .join(\"\");\n    if (reasoningText) {\n      content.push({\n        type: \"reasoning\",\n        reasoning: reasoningText,\n      });\n    }\n  } else if (event.type === \"response.reasoning_summary_part.added\") {\n    additional_kwargs.reasoning = {\n      type: \"reasoning\",\n      summary: [{ ...event.part, index: event.summary_index }],\n    };\n\n    // Also elevate reasoning to content for UI rendering\n    if (event.part.text) {\n      content.push({\n        type: \"reasoning\",\n        reasoning: event.part.text,\n        index: event.summary_index,\n      });\n    }\n  } else if (event.type === \"response.reasoning_summary_text.delta\") {\n    additional_kwargs.reasoning = {\n      type: \"reasoning\",\n      summary: [\n        {\n          text: event.delta,\n          type: \"summary_text\",\n          index: event.summary_index,\n        },\n      ],\n    };\n\n    // Also elevate reasoning to content for UI rendering\n    if (event.delta) {\n      content.push({\n        type: \"reasoning\",\n        reasoning: event.delta,\n        index: event.summary_index,\n      });\n    }\n  } else if (event.type === \"response.image_generation_call.partial_image\") {\n    // noop/fixme: retaining partial images in a message chunk means that _all_\n    // partial images get kept in history, so we don't do anything here.\n    return null;\n  } else {\n    return null;\n  }\n\n  return new ChatGenerationChunk({\n    // Legacy reasons, `onLLMNewToken` should pulls this out\n    text: content.map((part) => part.text).join(\"\"),\n    message: new AIMessageChunk({\n      id,\n      content,\n      tool_call_chunks,\n      usage_metadata,\n      additional_kwargs,\n      response_metadata,\n    }),\n    generationInfo,\n  });\n};\n\n/**\n * Converts a single LangChain BaseMessage to OpenAI Responses API input format.\n *\n * This converter transforms a LangChain message into one or more ResponseInputItem objects\n * that can be used with OpenAI's Responses API. It handles complex message structures including\n * tool calls, reasoning blocks, multimodal content, and various content block types.\n *\n * @param message - The LangChain BaseMessage to convert. Can be any message type including\n *   HumanMessage, AIMessage, SystemMessage, ToolMessage, etc.\n *\n * @returns An array of ResponseInputItem objects.\n *\n * @example\n * Basic text message conversion:\n * ```typescript\n * const message = new HumanMessage(\"Hello, how are you?\");\n * const items = convertStandardContentMessageToResponsesInput(message);\n * // Returns: [{ type: \"message\", role: \"user\", content: [{ type: \"input_text\", text: \"Hello, how are you?\" }] }]\n * ```\n *\n * @example\n * AI message with tool calls:\n * ```typescript\n * const message = new AIMessage({\n *   content: \"I'll check the weather for you.\",\n *   tool_calls: [{\n *     id: \"call_123\",\n *     name: \"get_weather\",\n *     args: { location: \"San Francisco\" }\n *   }]\n * });\n * const items = convertStandardContentMessageToResponsesInput(message);\n * // Returns:\n * // [\n * //   { type: \"message\", role: \"assistant\", content: [{ type: \"input_text\", text: \"I'll check the weather for you.\" }] },\n * //   { type: \"function_call\", call_id: \"call_123\", name: \"get_weather\", arguments: '{\"location\":\"San Francisco\"}' }\n * // ]\n * ```\n */\nexport const convertStandardContentMessageToResponsesInput: Converter<\n  BaseMessage,\n  OpenAIClient.Responses.ResponseInputItem[]\n> = (message) => {\n  const isResponsesMessage =\n    AIMessage.isInstance(message) &&\n    message.response_metadata?.model_provider === \"openai\";\n\n  function* iterateItems(): Generator<OpenAIClient.Responses.ResponseInputItem> {\n    const messageRole = iife(() => {\n      try {\n        const role = messageToOpenAIRole(message);\n        if (\n          role === \"system\" ||\n          role === \"developer\" ||\n          role === \"assistant\" ||\n          role === \"user\"\n        ) {\n          return role;\n        }\n        return \"assistant\";\n      } catch {\n        return \"assistant\";\n      }\n    });\n\n    let currentMessage: OpenAIClient.Responses.EasyInputMessage | undefined =\n      undefined;\n\n    const functionCallIdsWithBlocks = new Set<string>();\n    const serverFunctionCallIdsWithBlocks = new Set<string>();\n\n    const pendingFunctionChunks = new Map<\n      string,\n      { name?: string; args: string[] }\n    >();\n    const pendingServerFunctionChunks = new Map<\n      string,\n      { name?: string; args: string[] }\n    >();\n\n    function* flushMessage() {\n      if (!currentMessage) return;\n      const content = currentMessage.content;\n      if (\n        (typeof content === \"string\" && content.length > 0) ||\n        (Array.isArray(content) && content.length > 0)\n      ) {\n        yield currentMessage;\n      }\n      currentMessage = undefined;\n    }\n\n    const pushMessageContent = (\n      content: OpenAIClient.Responses.ResponseInputMessageContentList,\n      phase?: OpenAIClient.Responses.EasyInputMessage[\"phase\"]\n    ) => {\n      if (!currentMessage) {\n        currentMessage = {\n          type: \"message\",\n          role: messageRole,\n          content: [],\n          ...(phase ? { phase } : {}),\n        };\n      }\n      if (typeof currentMessage.content === \"string\") {\n        currentMessage.content =\n          currentMessage.content.length > 0\n            ? [{ type: \"input_text\", text: currentMessage.content }, ...content]\n            : [...content];\n      } else {\n        currentMessage.content.push(...content);\n      }\n    };\n\n    const toJsonString = (value: unknown) => {\n      if (typeof value === \"string\") {\n        return value;\n      }\n      try {\n        return JSON.stringify(value ?? {});\n      } catch {\n        return \"{}\";\n      }\n    };\n\n    const resolveImageItem = (\n      block: ContentBlock.Multimodal.Image\n    ): OpenAIClient.Responses.ResponseInputImage | undefined => {\n      const detail = iife(() => {\n        const raw = block.metadata?.detail;\n        if (raw === \"low\" || raw === \"high\" || raw === \"auto\") {\n          return raw;\n        }\n        return \"auto\";\n      });\n      if (block.fileId) {\n        return {\n          type: \"input_image\",\n          detail,\n          file_id: block.fileId,\n        };\n      }\n      if (block.url) {\n        return {\n          type: \"input_image\",\n          detail,\n          image_url: block.url,\n        };\n      }\n      if (block.data) {\n        const base64Data =\n          typeof block.data === \"string\"\n            ? block.data\n            : Buffer.from(block.data).toString(\"base64\");\n        const mimeType = block.mimeType ?? \"image/png\";\n        return {\n          type: \"input_image\",\n          detail,\n          image_url: `data:${mimeType};base64,${base64Data}`,\n        };\n      }\n      return undefined;\n    };\n\n    const resolveFileItem = (\n      block: ContentBlock.Multimodal.File | ContentBlock.Multimodal.Video\n    ): OpenAIClient.Responses.ResponseInputFile | undefined => {\n      if (block.fileId) {\n        const filename = getFilenameFromMetadata(block);\n        return {\n          type: \"input_file\",\n          file_id: block.fileId,\n          ...(filename ? { filename } : {}),\n        };\n      }\n      if (block.url) {\n        const filename = getFilenameFromMetadata(block);\n        return {\n          ...(filename ? { filename } : {}),\n          type: \"input_file\",\n          file_url: block.url,\n        };\n      }\n      if (block.data) {\n        const filename = getRequiredFilenameFromMetadata(block);\n        const encoded =\n          typeof block.data === \"string\"\n            ? block.data\n            : Buffer.from(block.data).toString(\"base64\");\n        const mimeType = block.mimeType ?? \"application/octet-stream\";\n        return {\n          type: \"input_file\",\n          file_data: `data:${mimeType};base64,${encoded}`,\n          filename,\n        };\n      }\n      return undefined;\n    };\n\n    const convertReasoningBlock = (\n      block: ContentBlock.Reasoning\n    ): OpenAIClient.Responses.ResponseReasoningItem => {\n      const summaryEntries = iife(() => {\n        if (Array.isArray(block.summary)) {\n          const candidate = block.summary;\n          const mapped =\n            candidate\n              ?.map((item) => item?.text)\n              .filter((text): text is string => typeof text === \"string\") ?? [];\n          if (mapped.length > 0) {\n            return mapped;\n          }\n        }\n        return block.reasoning ? [block.reasoning] : [];\n      });\n\n      const summary =\n        summaryEntries.length > 0\n          ? summaryEntries.map((text) => ({\n              type: \"summary_text\" as const,\n              text,\n            }))\n          : [{ type: \"summary_text\" as const, text: \"\" }];\n\n      const reasoningItem: OpenAIClient.Responses.ResponseReasoningItem = {\n        type: \"reasoning\",\n        id: block.id ?? \"\",\n        summary,\n      };\n\n      if (block.reasoning) {\n        reasoningItem.content = [\n          {\n            type: \"reasoning_text\" as const,\n            text: block.reasoning,\n          },\n        ];\n      }\n      return reasoningItem;\n    };\n\n    const convertFunctionCall = (\n      block: ContentBlock.Tools.ToolCall | ContentBlock.Tools.ServerToolCall\n    ): OpenAIClient.Responses.ResponseFunctionToolCall => ({\n      type: \"function_call\",\n      name: block.name ?? \"\",\n      call_id: block.id ?? \"\",\n      arguments: toJsonString(block.args),\n    });\n\n    const convertFunctionCallOutput = (\n      block: ContentBlock.Tools.ServerToolCallResult\n    ): OpenAIClient.Responses.ResponseInputItem.FunctionCallOutput => {\n      const output = toJsonString(block.output);\n      const status =\n        block.status === \"success\"\n          ? \"completed\"\n          : block.status === \"error\"\n            ? \"incomplete\"\n            : undefined;\n      return {\n        type: \"function_call_output\",\n        call_id: block.toolCallId ?? \"\",\n        output,\n        ...(status ? { status } : {}),\n      };\n    };\n\n    for (const block of message.contentBlocks) {\n      if (block.type === \"text\") {\n        const phase = iife(() => {\n          if (\n            !(\n              \"extras\" in block &&\n              typeof block.extras === \"object\" &&\n              block.extras !== null &&\n              \"phase\" in block.extras\n            )\n          )\n            return undefined;\n          return block.extras\n            .phase as OpenAIClient.Responses.EasyInputMessage[\"phase\"];\n        });\n        pushMessageContent([{ type: \"input_text\", text: block.text }], phase);\n      } else if (block.type === \"invalid_tool_call\") {\n        // no-op\n      } else if (block.type === \"reasoning\") {\n        yield* flushMessage();\n        yield convertReasoningBlock(\n          block as ContentBlock.Standard & { type: \"reasoning\" }\n        );\n      } else if (block.type === \"tool_call\") {\n        yield* flushMessage();\n        const id = block.id ?? \"\";\n        if (id) {\n          functionCallIdsWithBlocks.add(id);\n          pendingFunctionChunks.delete(id);\n        }\n        yield convertFunctionCall(\n          block as ContentBlock.Standard & { type: \"tool_call\" }\n        );\n      } else if (block.type === \"tool_call_chunk\") {\n        if (block.id) {\n          const existing = pendingFunctionChunks.get(block.id) ?? {\n            name: block.name,\n            args: [],\n          };\n          if (block.name) existing.name = block.name;\n          if (block.args) existing.args.push(block.args);\n          pendingFunctionChunks.set(block.id, existing);\n        }\n      } else if (block.type === \"server_tool_call\") {\n        yield* flushMessage();\n        const id = block.id ?? \"\";\n        if (id) {\n          serverFunctionCallIdsWithBlocks.add(id);\n          pendingServerFunctionChunks.delete(id);\n        }\n        yield convertFunctionCall(block);\n      } else if (block.type === \"server_tool_call_chunk\") {\n        if (block.id) {\n          const existing = pendingServerFunctionChunks.get(block.id) ?? {\n            name: block.name,\n            args: [],\n          };\n          if (block.name) existing.name = block.name;\n          if (block.args) existing.args.push(block.args);\n          pendingServerFunctionChunks.set(block.id, existing);\n        }\n      } else if (block.type === \"server_tool_call_result\") {\n        yield* flushMessage();\n        yield convertFunctionCallOutput(block);\n      } else if (block.type === \"audio\") {\n        // no-op\n      } else if (block.type === \"file\") {\n        const fileItem = resolveFileItem(block);\n        if (fileItem) {\n          pushMessageContent([fileItem]);\n        }\n      } else if (block.type === \"image\") {\n        const imageItem = resolveImageItem(block);\n        if (imageItem) {\n          pushMessageContent([imageItem]);\n        }\n      } else if (block.type === \"video\") {\n        const videoItem = resolveFileItem(block);\n        if (videoItem) {\n          pushMessageContent([videoItem]);\n        }\n      } else if (block.type === \"text-plain\") {\n        if (block.text) {\n          pushMessageContent([\n            {\n              type: \"input_text\",\n              text: block.text,\n            },\n          ]);\n        }\n      } else if (block.type === \"non_standard\" && isResponsesMessage) {\n        yield* flushMessage();\n        yield block.value as ResponsesInputItem;\n      }\n    }\n    yield* flushMessage();\n\n    for (const [id, chunk] of pendingFunctionChunks) {\n      if (!id || functionCallIdsWithBlocks.has(id)) continue;\n      const args = chunk.args.join(\"\");\n      if (!chunk.name && !args) continue;\n      yield {\n        type: \"function_call\",\n        call_id: id,\n        name: chunk.name ?? \"\",\n        arguments: args,\n      };\n    }\n\n    for (const [id, chunk] of pendingServerFunctionChunks) {\n      if (!id || serverFunctionCallIdsWithBlocks.has(id)) continue;\n      const args = chunk.args.join(\"\");\n      if (!chunk.name && !args) continue;\n      yield {\n        type: \"function_call\",\n        call_id: id,\n        name: chunk.name ?? \"\",\n        arguments: args,\n      };\n    }\n  }\n  return Array.from(iterateItems());\n};\n\n/**\n * - MCP (Model Context Protocol) approval responses\n * - Zero Data Retention (ZDR) mode handling\n *\n * @param params - Conversion parameters\n * @param params.messages - Array of LangChain BaseMessages to convert\n * @param params.zdrEnabled - Whether Zero Data Retention mode is enabled. When true, certain\n *   metadata like message IDs and function call IDs are omitted from the output\n * @param params.model - The model name being used. Used to determine if special role mapping\n *   is needed (e.g., \"system\" -> \"developer\" for reasoning models)\n *\n * @returns Array of ResponsesInputItem objects formatted for the OpenAI Responses API\n *\n * @throws {Error} When a function message is encountered (not supported)\n * @throws {Error} When computer call output format is invalid\n *\n * @example\n * ```typescript\n * const messages = [\n *   new HumanMessage(\"Hello\"),\n *   new AIMessage({ content: \"Hi there!\", tool_calls: [...] })\n * ];\n *\n * const input = convertMessagesToResponsesInput({\n *   messages,\n *   zdrEnabled: false,\n *   model: \"gpt-4\"\n * });\n * ```\n */\nexport const convertMessagesToResponsesInput: Converter<\n  { messages: BaseMessage[]; zdrEnabled: boolean; model: string },\n  ResponsesInputItem[]\n> = ({ messages, zdrEnabled, model }) => {\n  return messages.flatMap(\n    (lcMsg): ResponsesInputItem | ResponsesInputItem[] => {\n      const responseMetadata = lcMsg.response_metadata as\n        | Record<string, unknown>\n        | undefined;\n      if (responseMetadata?.output_version === \"v1\") {\n        return convertStandardContentMessageToResponsesInput(lcMsg);\n      }\n\n      const additional_kwargs =\n        lcMsg.additional_kwargs as BaseMessageFields[\"additional_kwargs\"] & {\n          [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n          reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n          type?: string;\n          refusal?: string;\n        };\n\n      let role = messageToOpenAIRole(lcMsg);\n      if (role === \"system\" && isReasoningModel(model)) role = \"developer\";\n\n      if (role === \"function\") {\n        throw new Error(\"Function messages are not supported in Responses API\");\n      }\n\n      if (role === \"tool\") {\n        const toolMessage = lcMsg as ToolMessage;\n\n        // Handle computer call output\n        if (additional_kwargs?.type === \"computer_call_output\") {\n          const output = (() => {\n            if (typeof toolMessage.content === \"string\") {\n              return {\n                type: \"input_image\" as const,\n                image_url: toolMessage.content,\n              };\n            }\n\n            if (Array.isArray(toolMessage.content)) {\n              /**\n               * Check for input_image type first (computer-use-preview format)\n               */\n              const inputImage = toolMessage.content.find(\n                (i) => i.type === \"input_image\"\n              ) as { type: \"input_image\"; image_url: string } | undefined;\n\n              if (inputImage) return inputImage;\n\n              /**\n               * Check for computer_screenshot type (legacy format)\n               */\n              const oaiScreenshot = toolMessage.content.find(\n                (i) => i.type === \"computer_screenshot\"\n              ) as\n                | { type: \"computer_screenshot\"; image_url: string }\n                | undefined;\n\n              if (oaiScreenshot) return oaiScreenshot;\n\n              /**\n               * Convert image_url content block to input_image format\n               */\n              const lcImage = toolMessage.content.find(\n                (i) => i.type === \"image_url\"\n              ) as MessageContentImageUrl;\n\n              if (lcImage) {\n                return {\n                  type: \"input_image\" as const,\n                  image_url:\n                    typeof lcImage.image_url === \"string\"\n                      ? lcImage.image_url\n                      : lcImage.image_url.url,\n                };\n              }\n            }\n\n            throw new Error(\"Invalid computer call output\");\n          })();\n\n          /**\n           * Cast needed because OpenAI SDK types don't yet include input_image\n           * for computer-use-preview model output format\n           */\n          return {\n            type: \"computer_call_output\",\n            output,\n            call_id: toolMessage.tool_call_id,\n          } as ResponsesInputItem;\n        }\n\n        // Handle custom tool output\n        if (toolMessage.additional_kwargs?.customTool) {\n          return {\n            type: \"custom_tool_call_output\",\n            call_id: toolMessage.tool_call_id,\n            output: toolMessage.content as string,\n          };\n        }\n\n        // Check if content contains provider-native OpenAI content blocks\n        // that should be passed through without stringification\n        const isProviderNativeContent =\n          Array.isArray(toolMessage.content) &&\n          toolMessage.content.every(\n            (item) =>\n              typeof item === \"object\" &&\n              item !== null &&\n              \"type\" in item &&\n              (item.type === \"input_file\" ||\n                item.type === \"input_image\" ||\n                item.type === \"input_text\")\n          );\n\n        return {\n          type: \"function_call_output\",\n          call_id: toolMessage.tool_call_id,\n          id: toolMessage.id?.startsWith(\"fc_\") ? toolMessage.id : undefined,\n          output: isProviderNativeContent\n            ? (toolMessage.content as OpenAIClient.Responses.ResponseFunctionCallOutputItemList)\n            : typeof toolMessage.content !== \"string\"\n              ? JSON.stringify(toolMessage.content)\n              : toolMessage.content,\n        };\n      }\n\n      if (role === \"assistant\") {\n        // if we have the original response items, just reuse them\n        if (\n          !zdrEnabled &&\n          responseMetadata?.output != null &&\n          Array.isArray(responseMetadata?.output) &&\n          responseMetadata?.output.length > 0 &&\n          responseMetadata?.output.every((item) => \"type\" in item)\n        ) {\n          return responseMetadata?.output;\n        }\n\n        // otherwise, try to reconstruct the response from what we have\n\n        const input: ResponsesInputItem[] = [];\n\n        // reasoning items\n        const reasoning = additional_kwargs?.reasoning;\n        const hasEncryptedContent = !!reasoning?.encrypted_content;\n        /**\n         * With ZDR enabled, OpenAI does not retain reasoning items, so we only send\n         * them when encrypted content is available (via include: [\"reasoning.encrypted_content\"]).\n         * With ZDR disabled, we include reasoning item ids so OpenAI can reference them, as it's storing them.\n         */\n        if (reasoning && (!zdrEnabled || hasEncryptedContent)) {\n          const reasoningItem =\n            convertReasoningSummaryToResponsesReasoningItem(reasoning);\n          input.push(reasoningItem);\n        }\n\n        // ai content\n        let { content } = lcMsg;\n        if (additional_kwargs?.refusal) {\n          if (typeof content === \"string\") {\n            content = [{ type: \"output_text\", text: content, annotations: [] }];\n          }\n          content = [\n            ...(content as ContentBlock[]),\n            { type: \"refusal\", refusal: additional_kwargs.refusal },\n          ];\n        }\n\n        if (typeof content === \"string\" || content.length > 0) {\n          const messageItem: ResponsesInputItem = {\n            type: \"message\",\n            role: \"assistant\",\n            ...(lcMsg.id && !zdrEnabled && lcMsg.id.startsWith(\"msg_\")\n              ? { id: lcMsg.id }\n              : {}),\n            content: iife(() => {\n              if (typeof content === \"string\") {\n                return content;\n              }\n              return content.flatMap((item) => {\n                if (item.type === \"text\") {\n                  const textItem = item as ContentBlock.Text;\n                  return {\n                    type: \"output_text\",\n                    text: textItem.text,\n                    annotations: (textItem.annotations ?? []).map(\n                      convertLangChainAnnotationToOpenAI\n                    ),\n                  };\n                }\n\n                if (item.type === \"output_text\" || item.type === \"refusal\") {\n                  return item;\n                }\n\n                return [];\n              });\n            }) as ResponseInputMessageContentList,\n            phase: iife(() => {\n              if (!Array.isArray(content)) {\n                return undefined;\n              }\n\n              const phasedContent = content.find(\n                (item): item is ContentBlock & { phase: string } =>\n                  \"phase\" in item && typeof item.phase === \"string\"\n              );\n              return phasedContent?.phase as\n                | OpenAIClient.Responses.EasyInputMessage[\"phase\"]\n                | undefined;\n            }),\n          };\n          input.push(messageItem);\n        }\n\n        const functionCallIds = additional_kwargs?.[_FUNCTION_CALL_IDS_MAP_KEY];\n\n        if (AIMessage.isInstance(lcMsg) && !!lcMsg.tool_calls?.length) {\n          input.push(\n            ...lcMsg.tool_calls.map((toolCall): ResponsesInputItem => {\n              if (isCustomToolCall(toolCall)) {\n                return {\n                  type: \"custom_tool_call\",\n                  id: toolCall.call_id,\n                  call_id: toolCall.id ?? \"\",\n                  input: toolCall.args.input,\n                  name: toolCall.name,\n                };\n              }\n              if (isComputerToolCall(toolCall)) {\n                return {\n                  type: \"computer_call\",\n                  id: toolCall.call_id,\n                  call_id: toolCall.id ?? \"\",\n                  action: toolCall.args.action,\n                } as ResponsesInputItem;\n              }\n              return {\n                type: \"function_call\",\n                name: toolCall.name,\n                arguments: JSON.stringify(toolCall.args),\n                call_id: toolCall.id!,\n                ...(!zdrEnabled ? { id: functionCallIds?.[toolCall.id!] } : {}),\n              };\n            })\n          );\n        } else if (additional_kwargs?.tool_calls) {\n          input.push(\n            ...additional_kwargs.tool_calls.map(\n              (toolCall): ResponsesInputItem => ({\n                type: \"function_call\",\n                name: toolCall.function.name,\n                call_id: toolCall.id,\n                arguments: toolCall.function.arguments,\n                ...(!zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}),\n              })\n            )\n          );\n        }\n\n        const toolOutputs = (\n          responseMetadata?.output as Array<ResponsesInputItem>\n        )?.length\n          ? responseMetadata?.output\n          : additional_kwargs.tool_outputs;\n\n        const fallthroughCallTypes: ResponsesInputItem[\"type\"][] = [\n          \"computer_call\",\n          \"mcp_call\",\n          \"code_interpreter_call\",\n          \"image_generation_call\",\n          \"shell_call\",\n          \"local_shell_call\",\n        ];\n\n        if (toolOutputs != null) {\n          const castToolOutputs = toolOutputs as Array<ResponsesInputItem>;\n          const fallthroughCalls = castToolOutputs?.filter((item) =>\n            fallthroughCallTypes.includes(item.type)\n          );\n          if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);\n        }\n\n        return input;\n      }\n\n      if (role === \"user\" || role === \"system\" || role === \"developer\") {\n        if (typeof lcMsg.content === \"string\") {\n          return { type: \"message\", role, content: lcMsg.content };\n        }\n\n        const messages: ResponsesInputItem[] = [];\n        const content = (lcMsg.content as ContentBlock[]).flatMap((item) => {\n          if (item.type === \"mcp_approval_response\") {\n            messages.push({\n              type: \"mcp_approval_response\",\n              approval_request_id: item.approval_request_id as string,\n              approve: item.approve as boolean,\n            });\n          }\n          if (isDataContentBlock(item)) {\n            return convertToProviderContentBlock(\n              item,\n              completionsApiContentBlockConverter\n            );\n          }\n          if (item.type === \"text\") {\n            return {\n              type: \"input_text\",\n              text: item.text,\n            };\n          }\n          if (item.type === \"image_url\") {\n            const imageUrl = iife(() => {\n              if (typeof item.image_url === \"string\") {\n                return item.image_url;\n              } else if (\n                typeof item.image_url === \"object\" &&\n                item.image_url !== null &&\n                \"url\" in item.image_url\n              ) {\n                return item.image_url.url;\n              }\n              return undefined;\n            });\n            const detail = iife(() => {\n              if (typeof item.image_url === \"string\") {\n                return \"auto\";\n              } else if (\n                typeof item.image_url === \"object\" &&\n                item.image_url !== null &&\n                \"detail\" in item.image_url\n              ) {\n                return item.image_url.detail;\n              }\n              return undefined;\n            });\n            return {\n              type: \"input_image\",\n              image_url: imageUrl,\n              detail,\n            };\n          }\n          if (\n            item.type === \"input_text\" ||\n            item.type === \"input_image\" ||\n            item.type === \"input_file\"\n          ) {\n            return item;\n          }\n          return [];\n        });\n\n        if (content.length > 0) {\n          messages.push({\n            type: \"message\",\n            role,\n            content: content as ResponseInputMessageContentList,\n          });\n        }\n        return messages;\n      }\n\n      console.warn(\n        `Unsupported role found when converting to OpenAI Responses API: ${role}`\n      );\n      return [];\n    }\n  );\n};\n"],"mappings":"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"}