{"version":3,"file":"responses.cjs","names":["AIMessage","ChatGenerationChunk","AIMessageChunk"],"sources":["../../src/converters/responses.ts"],"sourcesContent":["import {\n  AIMessage,\n  AIMessageChunk,\n  BaseMessage,\n  type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk } from \"@langchain/core/outputs\";\n\nimport type {\n  XAIResponse,\n  XAIResponsesInputItem,\n  XAIResponsesMessage,\n  XAIResponsesOutputContent,\n  XAIResponsesOutputItem,\n  XAIResponsesStreamEvent,\n  XAIResponsesUsage,\n} from \"../chat_models/responses-types.js\";\n\n// ============================================================================\n// Message Converters\n// ============================================================================\n\n/**\n * Converts a single LangChain BaseMessage to xAI Responses API input format.\n *\n * @param message - The LangChain message to convert\n * @returns The xAI Responses API input item\n */\nexport function convertMessageToResponsesInput(\n  message: BaseMessage\n): XAIResponsesInputItem {\n  if (message.type === \"human\") {\n    const content =\n      typeof message.content === \"string\"\n        ? message.content\n        : message.content.map((part) => {\n            if (typeof part === \"string\") {\n              return { type: \"input_text\" as const, text: part };\n            }\n            if (part.type === \"text\") {\n              return { type: \"input_text\" as const, text: part.text };\n            }\n            if (part.type === \"image_url\") {\n              const imageUrlPart = part as {\n                type: \"image_url\";\n                image_url: string | { url: string };\n              };\n              const imageUrl =\n                typeof imageUrlPart.image_url === \"string\"\n                  ? imageUrlPart.image_url\n                  : imageUrlPart.image_url.url;\n              return {\n                type: \"input_image\" as const,\n                image_url: imageUrl,\n                detail: \"auto\" as const,\n              };\n            }\n            return { type: \"input_text\" as const, text: \"\" };\n          });\n\n    return {\n      role: \"user\",\n      content,\n    } as XAIResponsesMessage;\n  }\n\n  if (message.type === \"system\") {\n    return {\n      role: \"system\",\n      content:\n        typeof message.content === \"string\"\n          ? message.content\n          : message.content\n              .map((part) =>\n                typeof part === \"string\" ? part : part.text || \"\"\n              )\n              .join(\"\"),\n    } as XAIResponsesMessage;\n  }\n\n  if (message.type === \"ai\") {\n    const aiMessage = message as AIMessage;\n    return {\n      type: \"message\",\n      role: \"assistant\",\n      text: typeof aiMessage.content === \"string\" ? aiMessage.content : \"\",\n    } as unknown as XAIResponsesInputItem;\n  }\n\n  // Default fallback\n  return {\n    role: \"user\",\n    content:\n      typeof message.content === \"string\"\n        ? message.content\n        : JSON.stringify(message.content),\n  } as XAIResponsesMessage;\n}\n\n/**\n * Converts an array of LangChain BaseMessages to xAI Responses API input format.\n *\n * @param messages - Array of LangChain messages to convert\n * @returns Array of xAI Responses API input items\n */\nexport function convertMessagesToResponsesInput(\n  messages: BaseMessage[]\n): XAIResponsesInputItem[] {\n  return messages.map(convertMessageToResponsesInput);\n}\n\n// ============================================================================\n// Usage Converters\n// ============================================================================\n\n/**\n * Converts xAI usage statistics to LangChain UsageMetadata format.\n *\n * @param usage - The xAI usage statistics\n * @returns LangChain UsageMetadata object\n */\nexport function convertUsageToUsageMetadata(\n  usage: XAIResponsesUsage | null | undefined\n): UsageMetadata {\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: {\n      ...(usage?.input_tokens_details?.cached_tokens != null && {\n        cache_read: usage.input_tokens_details.cached_tokens,\n      }),\n    },\n    output_token_details: {\n      ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n        reasoning: usage.output_tokens_details.reasoning_tokens,\n      }),\n    },\n  };\n}\n\n// ============================================================================\n// Output Converters\n// ============================================================================\n\n/**\n * Extracts text content from xAI response output items.\n *\n * @param output - Array of xAI response output items\n * @returns Concatenated text content\n */\nexport function extractTextFromOutput(\n  output: XAIResponsesOutputItem[]\n): string {\n  const textParts: string[] = [];\n\n  for (const item of output) {\n    if (item.type === \"message\" && \"content\" in item) {\n      for (const contentItem of item.content as XAIResponsesOutputContent[]) {\n        if (contentItem.type === \"output_text\") {\n          textParts.push(contentItem.text);\n        }\n      }\n    }\n  }\n\n  return textParts.join(\"\");\n}\n\n/**\n * Converts an xAI Response to a LangChain AIMessage.\n *\n * @param response - The xAI API response\n * @returns LangChain AIMessage\n */\nexport function convertResponseToAIMessage(response: XAIResponse): AIMessage {\n  const text = extractTextFromOutput(response.output);\n\n  const responseMetadata: Record<string, unknown> = {\n    model_provider: \"xai\",\n    model: response.model,\n    created_at: response.created_at,\n    id: response.id,\n    status: response.status,\n    object: response.object,\n  };\n\n  if (response.incomplete_details) {\n    responseMetadata.incomplete_details = response.incomplete_details;\n  }\n\n  return new AIMessage({\n    content: text,\n    usage_metadata: convertUsageToUsageMetadata(response.usage),\n    response_metadata: responseMetadata,\n    additional_kwargs: {\n      ...(response.reasoning && { reasoning: response.reasoning }),\n    },\n  });\n}\n\n// ============================================================================\n// Streaming Converters\n// ============================================================================\n\n/**\n * Converts an xAI streaming event to a LangChain ChatGenerationChunk.\n *\n * @param event - The xAI streaming event\n * @returns ChatGenerationChunk or null if the event doesn't produce a chunk\n */\nexport function convertStreamEventToChunk(\n  event: XAIResponsesStreamEvent\n): ChatGenerationChunk | null {\n  const responseMetadata: Record<string, unknown> = {\n    model_provider: \"xai\",\n  };\n\n  if (event.type === \"response.output_text.delta\") {\n    return new ChatGenerationChunk({\n      text: event.delta,\n      message: new AIMessageChunk({\n        content: event.delta,\n        response_metadata: responseMetadata,\n      }),\n    });\n  }\n\n  if (event.type === \"response.created\") {\n    responseMetadata.id = event.response.id;\n    responseMetadata.model = event.response.model;\n    return new ChatGenerationChunk({\n      text: \"\",\n      message: new AIMessageChunk({\n        content: \"\",\n        response_metadata: responseMetadata,\n      }),\n    });\n  }\n\n  if (event.type === \"response.completed\") {\n    const aiMessage = convertResponseToAIMessage(event.response);\n    return new ChatGenerationChunk({\n      text: \"\",\n      message: new AIMessageChunk({\n        content: \"\",\n        usage_metadata: aiMessage.usage_metadata,\n        response_metadata: {\n          ...responseMetadata,\n          ...aiMessage.response_metadata,\n        },\n      }),\n    });\n  }\n\n  return null;\n}\n"],"mappings":"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"}