@providerprotocol/ai 0.0.28 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/anthropic/index.d.ts +11 -0
- package/dist/anthropic/index.js +7 -7
- package/dist/anthropic/index.js.map +1 -1
- package/dist/{chunk-Z6DKC37J.js → chunk-3C7O2RNO.js} +2 -2
- package/dist/{chunk-55X3W2MN.js → chunk-3D6XGGVG.js} +9 -2
- package/dist/{chunk-55X3W2MN.js.map → chunk-3D6XGGVG.js.map} +1 -1
- package/dist/{chunk-QNJO7DSD.js → chunk-4J6OFUKX.js} +10 -1
- package/dist/chunk-4J6OFUKX.js.map +1 -0
- package/dist/{chunk-SBCATNHA.js → chunk-KUPF5KHT.js} +2 -2
- package/dist/{embedding-DtyOFIsS.d.ts → embedding-k7g-BcSY.d.ts} +14 -1
- package/dist/google/index.d.ts +4 -0
- package/dist/google/index.js +14 -10
- package/dist/google/index.js.map +1 -1
- package/dist/http/index.d.ts +7 -2
- package/dist/http/index.js +9 -5
- package/dist/index.d.ts +3 -3
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/ollama/index.js +24 -18
- package/dist/ollama/index.js.map +1 -1
- package/dist/openai/index.js +8 -11
- package/dist/openai/index.js.map +1 -1
- package/dist/openrouter/index.d.ts +1 -1
- package/dist/openrouter/index.js +6 -4
- package/dist/openrouter/index.js.map +1 -1
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.js +2 -2
- package/dist/{retry-DXLQnTuU.d.ts → retry-CyAwm_KZ.d.ts} +15 -1
- package/dist/xai/index.d.ts +15 -35
- package/dist/xai/index.js +11 -14
- package/dist/xai/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-QNJO7DSD.js.map +0 -1
- /package/dist/{chunk-Z6DKC37J.js.map → chunk-3C7O2RNO.js.map} +0 -0
- /package/dist/{chunk-SBCATNHA.js.map → chunk-KUPF5KHT.js.map} +0 -0
package/dist/xai/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/xai/transform.completions.ts","../../src/providers/xai/llm.completions.ts","../../src/providers/xai/transform.responses.ts","../../src/providers/xai/llm.responses.ts","../../src/providers/xai/transform.messages.ts","../../src/providers/xai/llm.messages.ts","../../src/providers/xai/image.ts","../../src/providers/xai/types.ts","../../src/providers/xai/index.ts"],"sourcesContent":["import type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock, ReasoningBlock, AssistantContent } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n XAICompletionsParams,\n XAICompletionsRequest,\n XAICompletionsMessage,\n XAIUserContent,\n XAICompletionsTool,\n XAICompletionsResponse,\n XAICompletionsStreamChunk,\n XAIToolCall,\n} from './types.ts';\n\n/**\n * Transforms a UPP LLM request to the xAI Chat Completions API format.\n *\n * All params are spread directly to enable pass-through of xAI API fields\n * not explicitly defined in our types. This allows developers to use new\n * API features without waiting for library updates.\n *\n * @param request - The unified provider protocol request\n * @param modelId - The xAI model identifier\n * @returns The transformed xAI Chat Completions request body\n */\nexport function transformRequest(\n request: LLMRequest<XAICompletionsParams>,\n modelId: string\n): XAICompletionsRequest {\n const params = request.params ?? ({} as XAICompletionsParams);\n\n const xaiRequest: XAICompletionsRequest = {\n ...params,\n model: modelId,\n messages: transformMessages(request.messages, request.system),\n };\n\n if (request.tools && request.tools.length > 0) {\n xaiRequest.tools = request.tools.map(transformTool);\n }\n\n if (request.structure) {\n const schema: Record<string, unknown> = {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n ...(request.structure.additionalProperties !== undefined\n ? { additionalProperties: request.structure.additionalProperties }\n : { additionalProperties: false }),\n };\n if (request.structure.description) {\n schema.description = request.structure.description;\n }\n\n xaiRequest.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'json_response',\n description: request.structure.description,\n schema,\n strict: true,\n },\n };\n }\n\n return xaiRequest;\n}\n\n/**\n * Normalizes system prompt to string.\n * Converts array format to concatenated string for providers that only support strings.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Transforms UPP messages to xAI Chat Completions message format.\n *\n * @param messages - The array of UPP messages\n * @param system - Optional system prompt (string or array, normalized to string)\n * @returns Array of xAI-formatted messages\n */\nfunction transformMessages(\n messages: Message[],\n system?: string | unknown[]\n): XAICompletionsMessage[] {\n const result: XAICompletionsMessage[] = [];\n const normalizedSystem = normalizeSystem(system);\n\n if (normalizedSystem) {\n result.push({\n role: 'system',\n content: normalizedSystem,\n });\n }\n\n for (const message of messages) {\n if (isToolResultMessage(message)) {\n const toolMessages = transformToolResults(message);\n result.push(...toolMessages);\n } else {\n const transformed = transformMessage(message);\n if (transformed) {\n result.push(transformed);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Filters content blocks to only those with a valid type property.\n *\n * @param content - Array of content blocks\n * @returns Filtered array with only valid content blocks\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a single UPP message to xAI Chat Completions format.\n *\n * @param message - The UPP message to transform\n * @returns The xAI-formatted message or null if unsupported\n */\nfunction transformMessage(message: Message): XAICompletionsMessage | null {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n if (validContent.length === 1 && validContent[0]?.type === 'text') {\n return {\n role: 'user',\n content: (validContent[0] as TextBlock).text,\n };\n }\n return {\n role: 'user',\n content: validContent.map(transformContentBlock),\n };\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const textContent = validContent\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const hasToolCalls = message.toolCalls && message.toolCalls.length > 0;\n\n const assistantMessage: XAICompletionsMessage = {\n role: 'assistant',\n content: hasToolCalls && !textContent ? null : textContent,\n };\n\n if (hasToolCalls) {\n (assistantMessage as { tool_calls?: XAIToolCall[] }).tool_calls =\n message.toolCalls!.map((call) => ({\n id: call.toolCallId,\n type: 'function' as const,\n function: {\n name: call.toolName,\n arguments: JSON.stringify(call.arguments),\n },\n }));\n }\n\n return assistantMessage;\n }\n\n if (isToolResultMessage(message)) {\n const results = message.results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n return results[0] ?? null;\n }\n\n return null;\n}\n\n/**\n * Transforms tool result messages into multiple xAI tool messages.\n *\n * Tool results in xAI's Chat Completions API require separate messages\n * for each tool call result.\n *\n * @param message - The UPP message containing tool results\n * @returns Array of xAI tool messages\n */\nexport function transformToolResults(\n message: Message\n): XAICompletionsMessage[] {\n if (!isToolResultMessage(message)) {\n const single = transformMessage(message);\n return single ? [single] : [];\n }\n\n return message.results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n}\n\n/**\n * Transforms a UPP content block to xAI user content format.\n *\n * @param block - The content block to transform\n * @returns The xAI-formatted user content\n * @throws Error if the content type is unsupported\n */\nfunction transformContentBlock(block: ContentBlock): XAIUserContent {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n let url: string;\n\n if (imageBlock.source.type === 'base64') {\n url = `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`;\n } else if (imageBlock.source.type === 'url') {\n url = imageBlock.source.url;\n } else if (imageBlock.source.type === 'bytes') {\n // Convert bytes to base64\n const base64 = btoa(\n Array.from(imageBlock.source.data)\n .map((b) => String.fromCharCode(b))\n .join('')\n );\n url = `data:${imageBlock.mimeType};base64,${base64}`;\n } else {\n throw new Error('Unknown image source type');\n }\n\n return {\n type: 'image_url',\n image_url: { url },\n };\n }\n\n default:\n throw new Error(`Unsupported content type: ${block.type}`);\n }\n}\n\n/**\n * Transforms a UPP tool definition to xAI Chat Completions format.\n *\n * @param tool - The UPP tool definition\n * @returns The xAI-formatted tool definition\n */\nfunction transformTool(tool: Tool): XAICompletionsTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n ...(tool.parameters.additionalProperties !== undefined\n ? { additionalProperties: tool.parameters.additionalProperties }\n : {}),\n },\n },\n };\n}\n\n/**\n * Transforms an xAI Chat Completions response to the UPP LLMResponse format.\n *\n * @param data - The xAI Chat Completions API response\n * @returns The unified provider protocol response\n * @throws Error if no choices are present in the response\n */\nexport function transformResponse(data: XAICompletionsResponse): LLMResponse {\n const choice = data.choices[0];\n if (!choice) {\n throw new Error('No choices in xAI response');\n }\n\n const content: AssistantContent[] = [];\n let structuredData: unknown;\n\n // Extract reasoning content (grok-3-mini only)\n if (choice.message.reasoning_content) {\n content.push({ type: 'reasoning', text: choice.message.reasoning_content });\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content });\n try {\n structuredData = JSON.parse(choice.message.content);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n let hadRefusal = false;\n if (choice.message.refusal) {\n content.push({ type: 'text', text: choice.message.refusal });\n hadRefusal = true;\n }\n\n const toolCalls: ToolCall[] = [];\n if (choice.message.tool_calls) {\n for (const call of choice.message.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(call.function.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n toolCalls.push({\n toolCallId: call.id,\n toolName: call.function.name,\n arguments: args,\n });\n }\n }\n\n const responseId = data.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: responseId,\n metadata: {\n xai: {\n model: data.model,\n finish_reason: choice.finish_reason,\n system_fingerprint: data.system_fingerprint,\n citations: data.citations,\n inline_citations: data.inline_citations,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n cacheReadTokens: data.usage.prompt_tokens_details?.cached_tokens ?? 0,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n switch (choice.finish_reason) {\n case 'stop':\n stopReason = 'end_turn';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'content_filter':\n stopReason = 'content_filter';\n break;\n }\n if (hadRefusal && stopReason !== 'content_filter') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n\n/**\n * State object for accumulating data during streaming responses.\n *\n * This state is progressively updated as stream chunks arrive and is used\n * to build the final LLMResponse when streaming completes.\n */\nexport interface CompletionsStreamState {\n /** Response identifier */\n id: string;\n /** Model used for generation */\n model: string;\n /** Accumulated text content */\n text: string;\n /** Accumulated reasoning content (grok-3-mini only) */\n reasoning: string;\n /** Map of tool call index to accumulated tool call data */\n toolCalls: Map<number, { id: string; name: string; arguments: string }>;\n /** Final finish reason from the API */\n finishReason: string | null;\n /** Total input tokens (from usage chunk) */\n inputTokens: number;\n /** Total output tokens (from usage chunk) */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n /** Whether a refusal message was received */\n hadRefusal: boolean;\n}\n\n/**\n * Creates a new initialized stream state for accumulating streaming data.\n *\n * @returns A fresh CompletionsStreamState with default values\n */\nexport function createStreamState(): CompletionsStreamState {\n return {\n id: '',\n model: '',\n text: '',\n reasoning: '',\n toolCalls: new Map(),\n finishReason: null,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n hadRefusal: false,\n };\n}\n\n/**\n * Transforms an xAI Chat Completions stream chunk to UPP StreamEvents.\n *\n * A single chunk may produce multiple events (e.g., text delta + tool call delta).\n * The state object is mutated to accumulate data for the final response.\n *\n * @param chunk - The xAI streaming chunk\n * @param state - The mutable stream state to update\n * @returns Array of UPP stream events (may be empty)\n */\nexport function transformStreamEvent(\n chunk: XAICompletionsStreamChunk,\n state: CompletionsStreamState\n): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n if (chunk.id && !state.id) {\n state.id = chunk.id;\n events.push({ type: StreamEventType.MessageStart, index: 0, delta: {} });\n }\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n const choice = chunk.choices[0];\n if (choice) {\n // Handle reasoning content delta (grok-3-mini only)\n if (choice.delta.reasoning_content) {\n state.reasoning += choice.delta.reasoning_content;\n events.push({\n type: StreamEventType.ReasoningDelta,\n index: 0,\n delta: { text: choice.delta.reasoning_content },\n });\n }\n if (choice.delta.content) {\n state.text += choice.delta.content;\n events.push({\n type: StreamEventType.TextDelta,\n index: 0,\n delta: { text: choice.delta.content },\n });\n }\n if (choice.delta.refusal) {\n state.hadRefusal = true;\n state.text += choice.delta.refusal;\n events.push({\n type: StreamEventType.TextDelta,\n index: 0,\n delta: { text: choice.delta.refusal },\n });\n }\n\n if (choice.delta.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n const index = toolCallDelta.index;\n let toolCall = state.toolCalls.get(index);\n\n if (!toolCall) {\n toolCall = { id: '', name: '', arguments: '' };\n state.toolCalls.set(index, toolCall);\n }\n\n if (toolCallDelta.id) {\n toolCall.id = toolCallDelta.id;\n }\n if (toolCallDelta.function?.name) {\n toolCall.name = toolCallDelta.function.name;\n }\n if (toolCallDelta.function?.arguments) {\n toolCall.arguments += toolCallDelta.function.arguments;\n events.push({\n type: StreamEventType.ToolCallDelta,\n index: index,\n delta: {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n argumentsJson: toolCallDelta.function.arguments,\n },\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n state.finishReason = choice.finish_reason;\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n }\n }\n\n if (chunk.usage) {\n state.inputTokens = chunk.usage.prompt_tokens;\n state.outputTokens = chunk.usage.completion_tokens;\n state.cacheReadTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;\n }\n\n return events;\n}\n\n/**\n * Builds the final LLMResponse from accumulated stream state.\n *\n * Called when streaming is complete to construct the unified response\n * from all the data accumulated during streaming.\n *\n * @param state - The accumulated stream state\n * @returns The complete LLMResponse\n */\nexport function buildResponseFromState(state: CompletionsStreamState): LLMResponse {\n const content: AssistantContent[] = [];\n let structuredData: unknown;\n\n // Add reasoning content first (grok-3-mini only)\n if (state.reasoning) {\n content.push({ type: 'reasoning', text: state.reasoning });\n }\n\n if (state.text) {\n content.push({ type: 'text', text: state.text });\n try {\n structuredData = JSON.parse(state.text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n\n const toolCalls: ToolCall[] = [];\n for (const [, toolCall] of state.toolCalls) {\n let args: Record<string, unknown> = {};\n if (toolCall.arguments) {\n try {\n args = JSON.parse(toolCall.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n }\n toolCalls.push({\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n arguments: args,\n });\n }\n\n const messageId = state.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: messageId,\n metadata: {\n xai: {\n model: state.model,\n finish_reason: state.finishReason,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n switch (state.finishReason) {\n case 'stop':\n stopReason = 'end_turn';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'content_filter':\n stopReason = 'content_filter';\n break;\n }\n if (state.hadRefusal && stopReason !== 'content_filter') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n","import type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { XAICompletionsParams, XAICompletionsResponse, XAICompletionsStreamChunk } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.completions.ts';\n\n/** Base URL for the xAI Chat Completions API endpoint. */\nconst XAI_COMPLETIONS_API_URL = 'https://api.x.ai/v1/chat/completions';\n\n/**\n * Capability declarations for the xAI Chat Completions API.\n * Indicates which features are supported by this API mode.\n */\nconst XAI_COMPLETIONS_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: false,\n audioInput: false,\n};\n\n/**\n * Creates an LLM handler for the xAI Chat Completions API (OpenAI-compatible).\n *\n * The Chat Completions API is the default and recommended API mode for xAI.\n * It provides full compatibility with OpenAI's Chat Completions API, making\n * it easy to migrate existing OpenAI-based applications.\n *\n * @returns An LLM handler configured for the Chat Completions API\n *\n * @example\n * ```typescript\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * const model = llm({\n * model: xai('grok-4'),\n * params: {\n * max_tokens: 1000,\n * temperature: 0.7,\n * }\n * });\n *\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n *\n * @see {@link createMessagesLLMHandler} for Anthropic-compatible mode\n * @see {@link createResponsesLLMHandler} for stateful Responses API mode\n */\nexport function createCompletionsLLMHandler(): LLMHandler<XAICompletionsParams> {\n let providerRef: LLMProvider<XAICompletionsParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<XAICompletionsParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<XAICompletionsParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<XAICompletionsParams> = {\n modelId,\n capabilities: XAI_COMPLETIONS_CAPABILITIES,\n\n get provider(): LLMProvider<XAICompletionsParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<XAICompletionsParams>): Promise<LLMResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_COMPLETIONS_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n const data = await parseJsonResponse<XAICompletionsResponse>(response, 'xai', 'llm');\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<XAICompletionsParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_COMPLETIONS_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n body.stream_options = { include_usage: true };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'xai', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Skip [DONE] marker\n if (data === '[DONE]') {\n continue;\n }\n\n // Check for xAI error event\n if (typeof data === 'object' && data !== null) {\n const chunk = data as XAICompletionsStreamChunk;\n\n // Check for error in chunk\n if ('error' in chunk && chunk.error) {\n const errorData = chunk.error as { message?: string; type?: string };\n const error = new UPPError(\n errorData.message ?? 'Unknown error',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvents = transformStreamEvent(chunk, state);\n for (const event of uppEvents) {\n yield event;\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","import type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock, AssistantContent } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n XAIResponsesParams,\n XAIResponsesRequest,\n XAIResponsesInputItem,\n XAIResponsesContentPart,\n XAIResponsesTool,\n XAIResponsesResponse,\n XAIResponsesStreamEvent,\n XAIBuiltInTool,\n XAIResponsesReasoningInputItem,\n XAIResponsesReasoningOutput,\n} from './types.ts';\n\n/**\n * Transforms a UPP LLM request to the xAI Responses API format.\n *\n * All params are spread directly to enable pass-through of xAI API fields\n * not explicitly defined in our types. This allows developers to use new\n * API features without waiting for library updates.\n *\n * @param request - The unified provider protocol request\n * @param modelId - The xAI model identifier\n * @returns The transformed xAI Responses API request body\n */\nexport function transformRequest(\n request: LLMRequest<XAIResponsesParams>,\n modelId: string\n): XAIResponsesRequest {\n const params = request.params ?? ({} as XAIResponsesParams);\n\n // Extract tools before spreading params to avoid including it in the request\n const { tools: builtInTools, ...restParams } = params;\n\n const xaiRequest: XAIResponsesRequest = {\n ...restParams,\n model: modelId,\n input: transformInputItems(request.messages, request.system),\n };\n\n // Build tools array: function tools from request.tools + built-in agentic tools from params\n const functionTools: XAIResponsesTool[] = request.tools?.map(transformTool) ?? [];\n const allTools: Array<XAIResponsesTool | XAIBuiltInTool> = [\n ...functionTools,\n ...(builtInTools ?? []),\n ];\n\n if (allTools.length > 0) {\n xaiRequest.tools = allTools;\n }\n\n if (request.structure) {\n const schema: Record<string, unknown> = {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n ...(request.structure.additionalProperties !== undefined\n ? { additionalProperties: request.structure.additionalProperties }\n : { additionalProperties: false }),\n };\n if (request.structure.description) {\n schema.description = request.structure.description;\n }\n\n xaiRequest.text = {\n format: {\n type: 'json_schema',\n name: 'json_response',\n description: request.structure.description,\n schema,\n strict: true,\n },\n };\n }\n\n return xaiRequest;\n}\n\n/**\n * Normalizes system prompt to string.\n * Converts array format to concatenated string for providers that only support strings.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Transforms UPP messages to Responses API input items.\n *\n * @param messages - The array of UPP messages\n * @param system - Optional system prompt (string or array, normalized to string)\n * @returns Array of input items or a simple string for single user messages\n */\nfunction transformInputItems(\n messages: Message[],\n system?: string | unknown[]\n): XAIResponsesInputItem[] | string {\n const result: XAIResponsesInputItem[] = [];\n const normalizedSystem = normalizeSystem(system);\n\n if (normalizedSystem) {\n result.push({\n type: 'message',\n role: 'system',\n content: normalizedSystem,\n });\n }\n\n for (const message of messages) {\n const items = transformMessage(message);\n result.push(...items);\n }\n\n if (result.length === 1 && result[0]?.type === 'message') {\n const item = result[0] as { role?: string; content?: string | unknown[] };\n if (item.role === 'user' && typeof item.content === 'string') {\n return item.content;\n }\n }\n\n return result;\n}\n\n/**\n * Filters content blocks to only those with a valid type property.\n *\n * @param content - Array of content blocks\n * @returns Filtered array with only valid content blocks\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a single UPP message to xAI Responses API input items.\n *\n * A single message may produce multiple input items (e.g., assistant message\n * followed by function_call items for tool calls).\n *\n * @param message - The UPP message to transform\n * @returns Array of xAI Responses API input items\n */\nfunction transformMessage(message: Message): XAIResponsesInputItem[] {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n if (validContent.length === 1 && validContent[0]?.type === 'text') {\n return [\n {\n type: 'message',\n role: 'user',\n content: (validContent[0] as TextBlock).text,\n },\n ];\n }\n return [\n {\n type: 'message',\n role: 'user',\n content: validContent.map(transformContentPart),\n },\n ];\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const items: XAIResponsesInputItem[] = [];\n\n const textContent = validContent\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join('\\n\\n');\n\n if (textContent) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: textContent,\n });\n }\n\n const xaiMeta = message.metadata?.xai as\n | {\n functionCallItems?: Array<{ id: string; call_id: string; name: string; arguments: string }>;\n reasoningEncryptedContent?: string;\n }\n | undefined;\n const functionCallItems = xaiMeta?.functionCallItems;\n\n // Forward reasoning content for multi-turn context preservation (must use original ID)\n if (xaiMeta?.reasoningEncryptedContent) {\n try {\n const reasoningData = JSON.parse(xaiMeta.reasoningEncryptedContent) as {\n id: string;\n summary?: Array<{ type: 'summary_text'; text: string }>;\n encrypted_content?: string;\n };\n if (reasoningData.encrypted_content) {\n const reasoningItem: XAIResponsesReasoningInputItem = {\n type: 'reasoning',\n id: reasoningData.id,\n encrypted_content: reasoningData.encrypted_content,\n };\n if (Array.isArray(reasoningData.summary)) {\n reasoningItem.summary = reasoningData.summary;\n }\n items.push(reasoningItem);\n }\n } catch {\n // Invalid JSON - skip reasoning item\n }\n }\n\n if (functionCallItems && functionCallItems.length > 0) {\n for (const fc of functionCallItems) {\n items.push({\n type: 'function_call',\n id: fc.id,\n call_id: fc.call_id,\n name: fc.name,\n arguments: fc.arguments,\n });\n }\n } else if (message.toolCalls && message.toolCalls.length > 0) {\n for (const call of message.toolCalls) {\n items.push({\n type: 'function_call',\n id: `fc_${call.toolCallId}`,\n call_id: call.toolCallId,\n name: call.toolName,\n arguments: JSON.stringify(call.arguments),\n });\n }\n }\n\n return items;\n }\n\n if (isToolResultMessage(message)) {\n return message.results.map((result) => ({\n type: 'function_call_output' as const,\n call_id: result.toolCallId,\n output:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n }\n\n return [];\n}\n\n/**\n * Transforms a UPP content block to Responses API content part format.\n *\n * @param block - The content block to transform\n * @returns The xAI-formatted content part\n * @throws Error if the content type is unsupported\n */\nfunction transformContentPart(block: ContentBlock): XAIResponsesContentPart {\n switch (block.type) {\n case 'text':\n return { type: 'input_text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n if (imageBlock.source.type === 'base64') {\n return {\n type: 'input_image',\n image_url: `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`,\n };\n }\n\n if (imageBlock.source.type === 'url') {\n return {\n type: 'input_image',\n image_url: imageBlock.source.url,\n };\n }\n\n if (imageBlock.source.type === 'bytes') {\n // Convert bytes to base64\n const base64 = btoa(\n Array.from(imageBlock.source.data)\n .map((b) => String.fromCharCode(b))\n .join('')\n );\n return {\n type: 'input_image',\n image_url: `data:${imageBlock.mimeType};base64,${base64}`,\n };\n }\n\n throw new Error('Unknown image source type');\n }\n\n default:\n throw new Error(`Unsupported content type: ${block.type}`);\n }\n}\n\n/**\n * Transforms a UPP tool definition to Responses API format.\n *\n * @param tool - The UPP tool definition\n * @returns The xAI-formatted tool definition\n */\nfunction transformTool(tool: Tool): XAIResponsesTool {\n return {\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n ...(tool.parameters.additionalProperties !== undefined\n ? { additionalProperties: tool.parameters.additionalProperties }\n : {}),\n },\n };\n}\n\n/**\n * Transforms an xAI Responses API response to the UPP LLMResponse format.\n *\n * @param data - The xAI Responses API response\n * @returns The unified provider protocol response\n */\nexport function transformResponse(data: XAIResponsesResponse): LLMResponse {\n const content: AssistantContent[] = [];\n const toolCalls: ToolCall[] = [];\n const functionCallItems: Array<{\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n }> = [];\n let hadRefusal = false;\n let structuredData: unknown;\n let reasoningEncryptedContent: string | undefined;\n\n for (const item of data.output) {\n if (item.type === 'message') {\n const messageItem = item;\n for (const outputContent of messageItem.content) {\n if (outputContent.type === 'output_text') {\n content.push({ type: 'text', text: outputContent.text });\n if (structuredData === undefined) {\n try {\n structuredData = JSON.parse(outputContent.text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n } else if (outputContent.type === 'refusal') {\n content.push({ type: 'text', text: outputContent.refusal });\n hadRefusal = true;\n }\n }\n } else if (item.type === 'function_call') {\n const functionCall = item;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(functionCall.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n toolCalls.push({\n toolCallId: functionCall.call_id,\n toolName: functionCall.name,\n arguments: args,\n });\n functionCallItems.push({\n id: functionCall.id,\n call_id: functionCall.call_id,\n name: functionCall.name,\n arguments: functionCall.arguments,\n });\n } else if (item.type === 'reasoning') {\n const reasoningItem = item as XAIResponsesReasoningOutput;\n // Extract reasoning summary text\n if (reasoningItem.summary) {\n const reasoningText = reasoningItem.summary\n .filter((s): s is { type: 'summary_text'; text: string } => s.type === 'summary_text')\n .map(s => s.text)\n .join('');\n if (reasoningText) {\n content.push({ type: 'reasoning', text: reasoningText });\n }\n }\n // Capture full reasoning item for multi-turn context preservation (must be passed back as-is)\n reasoningEncryptedContent = JSON.stringify({\n id: reasoningItem.id,\n summary: reasoningItem.summary,\n encrypted_content: reasoningItem.encrypted_content,\n });\n }\n }\n\n const responseId = data.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: responseId,\n metadata: {\n xai: {\n model: data.model,\n status: data.status,\n response_id: responseId,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\n citations: data.citations,\n inline_citations: data.inline_citations,\n reasoningEncryptedContent,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n cacheReadTokens: data.usage.input_tokens_details?.cached_tokens ?? 0,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n if (data.status === 'completed') {\n stopReason = toolCalls.length > 0 ? 'tool_use' : 'end_turn';\n } else if (data.status === 'incomplete') {\n stopReason = data.incomplete_details?.reason === 'max_output_tokens'\n ? 'max_tokens'\n : 'end_turn';\n } else if (data.status === 'failed') {\n stopReason = 'error';\n }\n if (hadRefusal && stopReason !== 'error') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n\n/**\n * State object for accumulating data during Responses API streaming.\n *\n * This state is progressively updated as stream events arrive and is used\n * to build the final LLMResponse when streaming completes.\n */\nexport interface ResponsesStreamState {\n /** Response identifier */\n id: string;\n /** Model used for generation */\n model: string;\n /** Map of output index to accumulated text content */\n textByIndex: Map<number, string>;\n /** Map of output index to accumulated reasoning content */\n reasoningByIndex: Map<number, string>;\n /** Map of output index to accumulated tool call data */\n toolCalls: Map<\n number,\n { itemId?: string; callId?: string; name?: string; arguments: string }\n >;\n /** Current response status */\n status: string;\n /** Total input tokens */\n inputTokens: number;\n /** Total output tokens */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n /** Whether a refusal message was received */\n hadRefusal: boolean;\n /** Serialized reasoning item for multi-turn context preservation (includes encrypted_content) */\n reasoningEncryptedContent?: string;\n}\n\n/**\n * Creates a new initialized stream state for Responses API streaming.\n *\n * @returns A fresh ResponsesStreamState with default values\n */\nexport function createStreamState(): ResponsesStreamState {\n return {\n id: '',\n model: '',\n textByIndex: new Map(),\n reasoningByIndex: new Map(),\n toolCalls: new Map(),\n status: 'in_progress',\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n hadRefusal: false,\n };\n}\n\n/**\n * Transforms an xAI Responses API stream event to UPP StreamEvents.\n *\n * A single event may produce multiple UPP events. The state object is\n * mutated to accumulate data for the final response.\n *\n * @param event - The xAI Responses API stream event\n * @param state - The mutable stream state to update\n * @returns Array of UPP stream events (may be empty)\n */\nexport function transformStreamEvent(\n event: XAIResponsesStreamEvent,\n state: ResponsesStreamState\n): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n switch (event.type) {\n case 'response.created':\n state.id = event.response.id;\n state.model = event.response.model;\n events.push({ type: StreamEventType.MessageStart, index: 0, delta: {} });\n break;\n\n case 'response.in_progress':\n state.status = 'in_progress';\n break;\n\n case 'response.completed':\n state.status = 'completed';\n if (event.response.usage) {\n state.inputTokens = event.response.usage.input_tokens;\n state.outputTokens = event.response.usage.output_tokens;\n state.cacheReadTokens = event.response.usage.input_tokens_details?.cached_tokens ?? 0;\n }\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n break;\n\n case 'response.failed':\n state.status = 'failed';\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n break;\n\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const functionCall = event.item;\n const existing = state.toolCalls.get(event.output_index) ?? {\n arguments: '',\n };\n existing.itemId = functionCall.id;\n existing.callId = functionCall.call_id;\n existing.name = functionCall.name;\n if (functionCall.arguments) {\n existing.arguments = functionCall.arguments;\n }\n state.toolCalls.set(event.output_index, existing);\n }\n events.push({\n type: StreamEventType.ContentBlockStart,\n index: event.output_index,\n delta: {},\n });\n break;\n\n case 'response.output_item.done':\n if (event.item.type === 'function_call') {\n const functionCall = event.item;\n const existing = state.toolCalls.get(event.output_index) ?? {\n arguments: '',\n };\n existing.itemId = functionCall.id;\n existing.callId = functionCall.call_id;\n existing.name = functionCall.name;\n if (functionCall.arguments) {\n existing.arguments = functionCall.arguments;\n }\n state.toolCalls.set(event.output_index, existing);\n } else if (event.item.type === 'reasoning') {\n // Capture full reasoning item for multi-turn context preservation (must be passed back as-is)\n const reasoningItem = event.item as XAIResponsesReasoningOutput;\n state.reasoningEncryptedContent = JSON.stringify({\n id: reasoningItem.id,\n summary: reasoningItem.summary,\n encrypted_content: reasoningItem.encrypted_content,\n });\n }\n events.push({\n type: StreamEventType.ContentBlockStop,\n index: event.output_index,\n delta: {},\n });\n break;\n\n case 'response.output_text.delta': {\n const currentText = state.textByIndex.get(event.output_index) ?? '';\n state.textByIndex.set(event.output_index, currentText + event.delta);\n events.push({\n type: StreamEventType.TextDelta,\n index: event.output_index,\n delta: { text: event.delta },\n });\n break;\n }\n\n case 'response.output_text.done':\n state.textByIndex.set(event.output_index, event.text);\n break;\n\n case 'response.refusal.delta': {\n state.hadRefusal = true;\n const currentRefusal = state.textByIndex.get(event.output_index) ?? '';\n state.textByIndex.set(event.output_index, currentRefusal + event.delta);\n events.push({\n type: StreamEventType.TextDelta,\n index: event.output_index,\n delta: { text: event.delta },\n });\n break;\n }\n\n case 'response.refusal.done':\n state.hadRefusal = true;\n state.textByIndex.set(event.output_index, event.refusal);\n break;\n\n case 'response.function_call_arguments.delta': {\n let toolCall = state.toolCalls.get(event.output_index);\n if (!toolCall) {\n toolCall = { arguments: '' };\n state.toolCalls.set(event.output_index, toolCall);\n }\n if (event.item_id && !toolCall.itemId) {\n toolCall.itemId = event.item_id;\n }\n if (event.call_id && !toolCall.callId) {\n toolCall.callId = event.call_id;\n }\n toolCall.arguments += event.delta;\n events.push({\n type: StreamEventType.ToolCallDelta,\n index: event.output_index,\n delta: {\n toolCallId: toolCall.callId ?? toolCall.itemId ?? '',\n toolName: toolCall.name,\n argumentsJson: event.delta,\n },\n });\n break;\n }\n\n case 'response.function_call_arguments.done': {\n let toolCall = state.toolCalls.get(event.output_index);\n if (!toolCall) {\n toolCall = { arguments: '' };\n state.toolCalls.set(event.output_index, toolCall);\n }\n if (event.item_id) {\n toolCall.itemId = event.item_id;\n }\n if (event.call_id) {\n toolCall.callId = event.call_id;\n }\n toolCall.name = event.name;\n toolCall.arguments = event.arguments;\n break;\n }\n\n case 'response.reasoning_summary_text.delta': {\n const currentReasoning = state.reasoningByIndex.get(event.output_index) ?? '';\n state.reasoningByIndex.set(event.output_index, currentReasoning + event.delta);\n events.push({\n type: StreamEventType.ReasoningDelta,\n index: event.output_index,\n delta: { text: event.delta },\n });\n break;\n }\n\n case 'response.reasoning_summary_text.done':\n state.reasoningByIndex.set(event.output_index, event.text);\n break;\n\n case 'error':\n break;\n\n default:\n break;\n }\n\n return events;\n}\n\n/**\n * Builds the final LLMResponse from accumulated Responses API stream state.\n *\n * Called when streaming is complete to construct the unified response\n * from all the data accumulated during streaming.\n *\n * @param state - The accumulated stream state\n * @returns The complete LLMResponse\n */\nexport function buildResponseFromState(state: ResponsesStreamState): LLMResponse {\n const content: AssistantContent[] = [];\n let structuredData: unknown;\n\n // Add reasoning content first (in order by index)\n const orderedReasoningEntries = [...state.reasoningByIndex.entries()].sort(\n ([leftIndex], [rightIndex]) => leftIndex - rightIndex\n );\n for (const [, reasoning] of orderedReasoningEntries) {\n if (reasoning) {\n content.push({ type: 'reasoning', text: reasoning });\n }\n }\n\n // Add text content (in order by index)\n const orderedTextEntries = [...state.textByIndex.entries()].sort(\n ([leftIndex], [rightIndex]) => leftIndex - rightIndex\n );\n for (const [, text] of orderedTextEntries) {\n if (text) {\n content.push({ type: 'text', text });\n if (structuredData === undefined) {\n try {\n structuredData = JSON.parse(text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n }\n }\n\n const toolCalls: ToolCall[] = [];\n const functionCallItems: Array<{\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n }> = [];\n for (const [, toolCall] of state.toolCalls) {\n let args: Record<string, unknown> = {};\n if (toolCall.arguments) {\n try {\n args = JSON.parse(toolCall.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n }\n const itemId = toolCall.itemId ?? '';\n const callId = toolCall.callId ?? toolCall.itemId ?? '';\n const name = toolCall.name ?? '';\n toolCalls.push({\n toolCallId: callId,\n toolName: name,\n arguments: args,\n });\n\n if (itemId && callId && name) {\n functionCallItems.push({\n id: itemId,\n call_id: callId,\n name,\n arguments: toolCall.arguments,\n });\n }\n }\n\n const responseId = state.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: responseId,\n metadata: {\n xai: {\n model: state.model,\n status: state.status,\n response_id: responseId,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\n reasoningEncryptedContent: state.reasoningEncryptedContent,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n if (state.status === 'completed') {\n stopReason = toolCalls.length > 0 ? 'tool_use' : 'end_turn';\n } else if (state.status === 'failed') {\n stopReason = 'error';\n }\n if (state.hadRefusal && stopReason !== 'error') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n","import type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { XAIResponsesParams, XAIResponsesResponse, XAIResponsesStreamEvent, XAIResponseErrorEvent } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.responses.ts';\n\n/** Base URL for the xAI Responses API endpoint. */\nconst XAI_RESPONSES_API_URL = 'https://api.x.ai/v1/responses';\n\n/**\n * Capability declarations for the xAI Responses API.\n * Indicates which features are supported by this OpenAI Responses-compatible API mode.\n */\nconst XAI_RESPONSES_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: false,\n audioInput: false,\n};\n\n/**\n * Creates an LLM handler for the xAI Responses API (OpenAI Responses-compatible).\n *\n * The Responses API provides stateful conversation support, allowing you to\n * continue conversations across requests using `previous_response_id`. This\n * is useful for building applications that need to maintain context over\n * extended interactions.\n *\n * @returns An LLM handler configured for the Responses API\n *\n * @example\n * ```typescript\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * // Initial request\n * const model = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * max_output_tokens: 1000,\n * store: true, // Enable stateful storage\n * }\n * });\n *\n * const turn = await model.generate('Hello!');\n * const responseId = turn.response.message.metadata?.xai?.response_id;\n *\n * // Continue the conversation\n * const continuedModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * previous_response_id: responseId,\n * }\n * });\n * ```\n *\n * @see {@link createCompletionsLLMHandler} for OpenAI Chat Completions mode\n * @see {@link createMessagesLLMHandler} for Anthropic-compatible mode\n */\nexport function createResponsesLLMHandler(): LLMHandler<XAIResponsesParams> {\n let providerRef: LLMProvider<XAIResponsesParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<XAIResponsesParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<XAIResponsesParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<XAIResponsesParams> = {\n modelId,\n capabilities: XAI_RESPONSES_CAPABILITIES,\n\n get provider(): LLMProvider<XAIResponsesParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<XAIResponsesParams>): Promise<LLMResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_RESPONSES_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n const data = await parseJsonResponse<XAIResponsesResponse>(response, 'xai', 'llm');\n\n // Check for error in response\n if (data.status === 'failed') {\n const message = data.error?.message ?? 'Provider returned a failed response.';\n throw new UPPError(\n message,\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n }\n\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<XAIResponsesParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_RESPONSES_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'xai', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Skip [DONE] marker\n if (data === '[DONE]') {\n continue;\n }\n\n // Check for xAI error event\n if (typeof data === 'object' && data !== null) {\n const event = data as XAIResponsesStreamEvent;\n\n // Check for error event\n if (event.type === 'error') {\n const errorEvent = event as XAIResponseErrorEvent;\n const error = new UPPError(\n errorEvent.error.message,\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvents = transformStreamEvent(event, state);\n for (const uppEvent of uppEvents) {\n yield uppEvent;\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","import type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ReasoningBlock, ImageBlock, AssistantContent } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n XAIMessagesParams,\n XAIMessagesRequest,\n XAIMessagesMessage,\n XAIMessagesContent,\n XAIMessagesTool,\n XAIMessagesResponse,\n XAIMessagesStreamEvent,\n XAIMessagesContentBlockDeltaEvent,\n} from './types.ts';\n\n/**\n * Normalizes system prompt to string.\n * Converts array format to concatenated string since xAI Messages API only supports string.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Transforms a UPP LLM request to the xAI Messages API format (Anthropic-compatible).\n *\n * All params are spread directly to enable pass-through of xAI API fields\n * not explicitly defined in our types.\n *\n * @param request - The unified provider protocol request\n * @param modelId - The xAI model identifier\n * @returns The transformed xAI Messages API request body\n */\nexport function transformRequest(\n request: LLMRequest<XAIMessagesParams>,\n modelId: string\n): XAIMessagesRequest {\n const params = request.params ?? ({} as XAIMessagesParams);\n const normalizedSystem = normalizeSystem(request.system);\n\n const xaiRequest: XAIMessagesRequest = {\n ...params,\n model: modelId,\n messages: request.messages.map(transformMessage),\n };\n\n if (normalizedSystem) {\n xaiRequest.system = normalizedSystem;\n }\n\n if (request.tools && request.tools.length > 0) {\n xaiRequest.tools = request.tools.map(transformTool);\n xaiRequest.tool_choice = { type: 'auto' };\n }\n\n if (request.structure) {\n const structuredTool: XAIMessagesTool = {\n name: 'json_response',\n description: 'Return the response in the specified JSON format. You MUST use this tool to provide your response.',\n input_schema: {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n },\n };\n\n xaiRequest.tools = [...(xaiRequest.tools ?? []), structuredTool];\n xaiRequest.tool_choice = { type: 'tool', name: 'json_response' };\n }\n\n return xaiRequest;\n}\n\n/**\n * Filters content blocks to only those with a valid type property.\n *\n * @param content - Array of content blocks\n * @returns Filtered array with only valid content blocks\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a single UPP message to xAI Messages API format.\n *\n * @param message - The UPP message to transform\n * @returns The xAI-formatted message\n * @throws Error if the message type is unknown\n */\nfunction transformMessage(message: Message): XAIMessagesMessage {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n return {\n role: 'user',\n content: validContent.map(transformContentBlock),\n };\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const content: XAIMessagesContent[] = [];\n\n // Check for thinking signature in metadata (for multi-turn context)\n const xaiMeta = message.metadata?.xai as {\n thinkingSignature?: string;\n } | undefined;\n\n // Add reasoning blocks as thinking content with signature if available\n for (const block of validContent) {\n if (block.type === 'reasoning') {\n content.push({\n type: 'thinking',\n thinking: (block as ReasoningBlock).text,\n signature: xaiMeta?.thinkingSignature,\n });\n } else {\n content.push(transformContentBlock(block));\n }\n }\n\n if (message.toolCalls) {\n for (const call of message.toolCalls) {\n content.push({\n type: 'tool_use',\n id: call.toolCallId,\n name: call.toolName,\n input: call.arguments,\n });\n }\n }\n\n if (content.length === 0) {\n content.push({ type: 'text', text: '' });\n }\n\n return {\n role: 'assistant',\n content,\n };\n }\n\n if (isToolResultMessage(message)) {\n return {\n role: 'user',\n content: message.results.map((result) => ({\n type: 'tool_result' as const,\n tool_use_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n is_error: result.isError,\n })),\n };\n }\n\n throw new Error(`Unknown message type: ${message.type}`);\n}\n\n/**\n * Transforms a UPP content block to xAI Messages API format.\n *\n * @param block - The content block to transform\n * @returns The xAI-formatted content block\n * @throws Error if the content type is unsupported\n */\nfunction transformContentBlock(block: ContentBlock): XAIMessagesContent {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n if (imageBlock.source.type === 'base64') {\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: imageBlock.mimeType,\n data: imageBlock.source.data,\n },\n };\n }\n if (imageBlock.source.type === 'url') {\n return {\n type: 'image',\n source: {\n type: 'url',\n url: imageBlock.source.url,\n },\n };\n }\n if (imageBlock.source.type === 'bytes') {\n // Convert bytes to base64\n const base64 = btoa(\n Array.from(imageBlock.source.data)\n .map((b) => String.fromCharCode(b))\n .join('')\n );\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: imageBlock.mimeType,\n data: base64,\n },\n };\n }\n throw new Error(`Unknown image source type`);\n }\n\n default:\n throw new Error(`Unsupported content type: ${block.type}`);\n }\n}\n\n/**\n * Transforms a UPP tool definition to xAI Messages API format.\n *\n * @param tool - The UPP tool definition\n * @returns The xAI-formatted tool definition\n */\nfunction transformTool(tool: Tool): XAIMessagesTool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n}\n\n/**\n * Transforms an xAI Messages API response to the UPP LLMResponse format.\n *\n * @param data - The xAI Messages API response\n * @returns The unified provider protocol response\n */\nexport function transformResponse(data: XAIMessagesResponse): LLMResponse {\n const content: AssistantContent[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n let thinkingSignature: string | undefined;\n\n for (const block of data.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text });\n } else if (block.type === 'thinking') {\n // Handle extended thinking content\n content.push({ type: 'reasoning', text: block.thinking });\n // Store signature for multi-turn context preservation\n if (block.signature) {\n thinkingSignature = block.signature;\n }\n } else if (block.type === 'tool_use') {\n if (block.name === 'json_response') {\n structuredData = block.input;\n }\n toolCalls.push({\n toolCallId: block.id,\n toolName: block.name,\n arguments: block.input,\n });\n }\n }\n\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id,\n metadata: {\n xai: {\n stop_reason: data.stop_reason,\n stop_sequence: data.stop_sequence,\n model: data.model,\n // Store thinking signature for multi-turn context\n thinkingSignature,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n cacheReadTokens: data.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: data.usage.cache_creation_input_tokens ?? 0,\n };\n\n return {\n message,\n usage,\n stopReason: data.stop_reason ?? 'end_turn',\n data: structuredData,\n };\n}\n\n/**\n * State object for accumulating data during Messages API streaming.\n *\n * This state is progressively updated as stream events arrive and is used\n * to build the final LLMResponse when streaming completes.\n */\nexport interface MessagesStreamState {\n /** Message identifier */\n messageId: string;\n /** Model used for generation */\n model: string;\n /** Accumulated content blocks */\n content: Array<{\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: string;\n thinking?: string;\n signature?: string;\n }>;\n /** Final stop reason */\n stopReason: string | null;\n /** Total input tokens */\n inputTokens: number;\n /** Total output tokens */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n /** Number of tokens written to cache */\n cacheWriteTokens: number;\n /** Current content block index (xAI may omit index in delta events) */\n currentIndex: number;\n}\n\n/**\n * Creates a new initialized stream state for Messages API streaming.\n *\n * @returns A fresh MessagesStreamState with default values\n */\nexport function createStreamState(): MessagesStreamState {\n return {\n messageId: '',\n model: '',\n content: [],\n stopReason: null,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n currentIndex: 0,\n };\n}\n\n/**\n * Transforms an xAI Messages API stream event to a UPP StreamEvent.\n *\n * The state object is mutated to accumulate data for the final response.\n *\n * @param event - The xAI Messages API stream event\n * @param state - The mutable stream state to update\n * @returns A UPP stream event or null for events that don't map to UPP events\n */\nexport function transformStreamEvent(\n event: XAIMessagesStreamEvent,\n state: MessagesStreamState\n): StreamEvent | null {\n switch (event.type) {\n case 'message_start':\n state.messageId = event.message.id;\n state.model = event.message.model;\n state.inputTokens = event.message.usage.input_tokens;\n state.cacheReadTokens = event.message.usage.cache_read_input_tokens ?? 0;\n state.cacheWriteTokens = event.message.usage.cache_creation_input_tokens ?? 0;\n return { type: StreamEventType.MessageStart, index: 0, delta: {} };\n\n case 'content_block_start':\n state.currentIndex = event.index;\n if (event.content_block.type === 'text') {\n state.content[event.index] = { type: 'text', text: '' };\n } else if (event.content_block.type === 'thinking') {\n state.content[event.index] = { type: 'thinking', thinking: '' };\n } else if (event.content_block.type === 'tool_use') {\n state.content[event.index] = {\n type: 'tool_use',\n id: event.content_block.id,\n name: event.content_block.name,\n input: '',\n };\n }\n return { type: StreamEventType.ContentBlockStart, index: event.index, delta: {} };\n\n case 'content_block_delta': {\n const delta = event.delta;\n const index = event.index ?? state.currentIndex;\n if (delta.type === 'text_delta') {\n if (!state.content[index]) {\n state.content[index] = { type: 'text', text: '' };\n }\n state.content[index]!.text =\n (state.content[index]!.text ?? '') + delta.text;\n return {\n type: StreamEventType.TextDelta,\n index: index,\n delta: { text: delta.text },\n };\n }\n if (delta.type === 'input_json_delta') {\n if (!state.content[index]) {\n state.content[index] = { type: 'tool_use', id: '', name: '', input: '' };\n }\n state.content[index]!.input =\n (state.content[index]!.input ?? '') + delta.partial_json;\n return {\n type: StreamEventType.ToolCallDelta,\n index: index,\n delta: {\n argumentsJson: delta.partial_json,\n toolCallId: state.content[index]?.id,\n toolName: state.content[index]?.name,\n },\n };\n }\n if (delta.type === 'thinking_delta') {\n if (!state.content[index]) {\n state.content[index] = { type: 'thinking', thinking: '' };\n }\n state.content[index]!.thinking =\n (state.content[index]!.thinking ?? '') + delta.thinking;\n return {\n type: StreamEventType.ReasoningDelta,\n index: index,\n delta: { text: delta.thinking },\n };\n }\n if (delta.type === 'signature_delta') {\n // Capture thinking block signature for multi-turn context verification\n if (state.content[index]) {\n state.content[index]!.signature = delta.signature;\n }\n return null;\n }\n return null;\n }\n\n case 'content_block_stop':\n return { type: StreamEventType.ContentBlockStop, index: event.index ?? state.currentIndex, delta: {} };\n\n case 'message_delta':\n state.stopReason = event.delta.stop_reason;\n state.outputTokens = event.usage.output_tokens;\n return null;\n\n case 'message_stop':\n return { type: StreamEventType.MessageStop, index: 0, delta: {} };\n\n case 'ping':\n case 'error':\n return null;\n\n default:\n return null;\n }\n}\n\n/**\n * Builds the final LLMResponse from accumulated Messages API stream state.\n *\n * Called when streaming is complete to construct the unified response\n * from all the data accumulated during streaming.\n *\n * @param state - The accumulated stream state\n * @returns The complete LLMResponse\n */\nexport function buildResponseFromState(state: MessagesStreamState): LLMResponse {\n const content: AssistantContent[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n let thinkingSignature: string | undefined;\n\n for (const block of state.content) {\n if (block.type === 'text' && block.text) {\n content.push({ type: 'text', text: block.text });\n } else if (block.type === 'thinking' && block.thinking) {\n content.push({ type: 'reasoning', text: block.thinking });\n // Store signature for multi-turn context preservation\n if (block.signature) {\n thinkingSignature = block.signature;\n }\n } else if (block.type === 'tool_use' && block.id && block.name) {\n let args: Record<string, unknown> = {};\n if (block.input) {\n try {\n args = JSON.parse(block.input);\n } catch {\n // Invalid JSON, use empty object\n }\n }\n if (block.name === 'json_response') {\n structuredData = args;\n }\n toolCalls.push({\n toolCallId: block.id,\n toolName: block.name,\n arguments: args,\n });\n }\n }\n\n const messageId = state.messageId || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: messageId,\n metadata: {\n xai: {\n stop_reason: state.stopReason,\n model: state.model,\n thinkingSignature,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n };\n\n return {\n message,\n usage,\n stopReason: state.stopReason ?? 'end_turn',\n data: structuredData,\n };\n}\n","import type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { XAIMessagesParams, XAIMessagesResponse, XAIMessagesStreamEvent } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.messages.ts';\n\n/** Base URL for the xAI Messages API endpoint. */\nconst XAI_MESSAGES_API_URL = 'https://api.x.ai/v1/messages';\n\n/**\n * Capability declarations for the xAI Messages API.\n * Indicates which features are supported by this Anthropic-compatible API mode.\n */\nconst XAI_MESSAGES_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: false,\n audioInput: false,\n};\n\n/**\n * Creates an LLM handler for the xAI Messages API (Anthropic-compatible).\n *\n * The Messages API provides compatibility with Anthropic's Messages API,\n * making it easy for developers migrating from Claude to use xAI's Grok models\n * with minimal code changes.\n *\n * @returns An LLM handler configured for the Messages API\n *\n * @example\n * ```typescript\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * const model = llm({\n * model: xai('grok-4', { api: 'messages' }),\n * params: {\n * max_tokens: 1000,\n * thinking: { type: 'enabled', budget_tokens: 500 }, // Extended thinking\n * }\n * });\n *\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n *\n * @see {@link createCompletionsLLMHandler} for OpenAI-compatible mode\n * @see {@link createResponsesLLMHandler} for stateful Responses API mode\n */\nexport function createMessagesLLMHandler(): LLMHandler<XAIMessagesParams> {\n let providerRef: LLMProvider<XAIMessagesParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<XAIMessagesParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<XAIMessagesParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<XAIMessagesParams> = {\n modelId,\n capabilities: XAI_MESSAGES_CAPABILITIES,\n\n get provider(): LLMProvider<XAIMessagesParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<XAIMessagesParams>): Promise<LLMResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_MESSAGES_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n const data = await parseJsonResponse<XAIMessagesResponse>(response, 'xai', 'llm');\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<XAIMessagesParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_MESSAGES_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'xai', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Check for xAI error event\n if (typeof data === 'object' && data !== null && 'type' in data) {\n const event = data as XAIMessagesStreamEvent;\n\n if (event.type === 'error') {\n const error = new UPPError(\n event.error.message,\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvent = transformStreamEvent(event, state);\n if (uppEvent) {\n yield uppEvent;\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview xAI Image Generation API Handler\n *\n * This module implements the image handler for xAI's Image Generation API (Aurora).\n * Supports the grok-2-image-1212 model.\n *\n * @see {@link https://docs.x.ai/docs/image-generation xAI Image Generation Reference}\n * @module providers/xai/image\n */\n\nimport type { ImageProvider, ImageHandler } from '../../types/provider.ts';\nimport type {\n BoundImageModel,\n ImageRequest,\n ImageResponse,\n ImageCapabilities,\n GeneratedImage,\n} from '../../types/image.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch } from '../../http/fetch.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { Image } from '../../core/media/Image.ts';\n\nconst XAI_IMAGES_API_URL = 'https://api.x.ai/v1/images/generations';\n\n/**\n * xAI image generation parameters.\n * Passed through unchanged to the API.\n *\n * Note: xAI does NOT support negative_prompt or seed parameters.\n */\nexport interface XAIImageParams {\n /** Number of images to generate (1-10) */\n n?: number;\n /** Response format */\n response_format?: 'url' | 'b64_json';\n /** User identifier */\n user?: string;\n}\n\n/**\n * xAI image generation API response structure.\n */\ninterface XAIImagesResponse {\n created: number;\n data: Array<{\n url?: string;\n b64_json?: string;\n revised_prompt?: string;\n }>;\n}\n\n/**\n * Determines capabilities based on model ID.\n */\nfunction getCapabilities(modelId: string): ImageCapabilities {\n return {\n generate: true,\n streaming: false,\n edit: false,\n maxImages: 10,\n };\n}\n\n/**\n * Creates an image handler for xAI's Image Generation API.\n *\n * @returns An image handler configured for xAI\n *\n * @example\n * ```typescript\n * const handler = createImageHandler();\n * const model = handler.bind('grok-2-image-1212');\n *\n * const response = await model.generate({\n * prompt: 'A sunset over mountains',\n * config: { apiKey: 'xai-...' },\n * params: { n: 1 }\n * });\n * ```\n */\nexport function createImageHandler(): ImageHandler<XAIImageParams> {\n let providerRef: ImageProvider<XAIImageParams> | null = null;\n\n return {\n _setProvider(provider: ImageProvider<XAIImageParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundImageModel<XAIImageParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.Image\n );\n }\n\n const capabilities = getCapabilities(modelId);\n\n const model: BoundImageModel<XAIImageParams> = {\n modelId,\n capabilities,\n\n get provider(): ImageProvider<XAIImageParams> {\n return providerRef!;\n },\n\n async generate(request: ImageRequest<XAIImageParams>): Promise<ImageResponse> {\n return executeGenerate(modelId, request);\n },\n };\n\n return model;\n },\n };\n}\n\n/**\n * Execute a non-streaming image generation request.\n */\nasync function executeGenerate(\n modelId: string,\n request: ImageRequest<XAIImageParams>\n): Promise<ImageResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'image'\n );\n\n const baseUrl = request.config.baseUrl\n ? `${request.config.baseUrl.replace(/\\/$/, '')}/v1/images/generations`\n : XAI_IMAGES_API_URL;\n\n const body: Record<string, unknown> = {\n model: modelId,\n prompt: request.prompt,\n };\n\n if (request.params) {\n const { n, response_format, user } = request.params;\n if (n !== undefined) body.n = n;\n if (response_format !== undefined) body.response_format = response_format;\n if (user !== undefined) body.user = user;\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(baseUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n }, request.config, 'xai', 'image');\n\n const data = await parseJsonResponse<XAIImagesResponse>(response, 'xai', 'image');\n\n return transformResponse(data);\n}\n\n/**\n * Transform xAI response to ImageResponse.\n */\nfunction transformResponse(data: XAIImagesResponse): ImageResponse {\n const images: GeneratedImage[] = data.data.map((item) => {\n let image: Image;\n if (item.b64_json) {\n image = Image.fromBase64(item.b64_json, 'image/jpeg');\n } else if (item.url) {\n image = Image.fromUrl(item.url, 'image/jpeg');\n } else {\n throw new UPPError(\n 'No image data in response',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.Image\n );\n }\n\n return {\n image,\n metadata: item.revised_prompt ? { revised_prompt: item.revised_prompt } : undefined,\n };\n });\n\n return {\n images,\n usage: {\n imagesGenerated: images.length,\n },\n };\n}\n","/**\n * xAI Chat Completions API parameters (OpenAI-compatible).\n *\n * These parameters are passed through to the xAI `/v1/chat/completions` endpoint.\n * The API is fully compatible with OpenAI's Chat Completions API, allowing seamless\n * migration between providers.\n *\n * @example\n * ```typescript\n * const params: XAICompletionsParams = {\n * max_tokens: 1000,\n * temperature: 0.7,\n * reasoning_effort: 'high', // Grok 3 Mini only\n * };\n * ```\n *\n * @see {@link XAIResponsesParams} for Responses API parameters\n * @see {@link XAIMessagesParams} for Messages API parameters\n */\nexport interface XAICompletionsParams {\n /** Maximum number of tokens to generate */\n max_tokens?: number;\n\n /** Maximum completion tokens */\n max_completion_tokens?: number;\n\n /** Temperature for randomness (0.0 - 2.0) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0) */\n top_p?: number;\n\n /** Frequency penalty (-2.0 - 2.0) */\n frequency_penalty?: number;\n\n /** Presence penalty (-2.0 - 2.0) */\n presence_penalty?: number;\n\n /** Custom stop sequences */\n stop?: string | string[];\n\n /** Number of completions to generate */\n n?: number;\n\n /** Enable logprobs */\n logprobs?: boolean;\n\n /** Number of top logprobs to return (0-20) */\n top_logprobs?: number;\n\n /** Seed for deterministic sampling */\n seed?: number;\n\n /** User identifier for abuse detection */\n user?: string;\n\n /** Logit bias map */\n logit_bias?: Record<string, number>;\n\n /** Whether to enable parallel tool calls */\n parallel_tool_calls?: boolean;\n\n /**\n * Reasoning effort for Grok 3 Mini models\n * Note: Only 'low' and 'high' are supported by xAI\n */\n reasoning_effort?: 'low' | 'high';\n\n /** Store completion */\n store?: boolean;\n\n /** Metadata key-value pairs */\n metadata?: Record<string, string>;\n\n /** Response format for structured output */\n response_format?: XAIResponseFormat;\n\n /**\n * Live Search parameters (deprecated, will be removed Dec 15, 2025)\n * Use Agent Tools API instead for new implementations\n */\n search_parameters?: XAISearchParameters;\n}\n\n/**\n * xAI Responses API parameters (OpenAI Responses-compatible).\n *\n * These parameters are passed through to the xAI `/v1/responses` endpoint.\n * The Responses API provides stateful conversation support with features like\n * `previous_response_id` for continuing conversations across requests.\n *\n * @example\n * ```typescript\n * const params: XAIResponsesParams = {\n * max_output_tokens: 1000,\n * temperature: 0.7,\n * store: true, // Enable stateful storage\n * previous_response_id: 'resp_123...', // Continue previous conversation\n * };\n * ```\n *\n * @see {@link XAICompletionsParams} for Chat Completions API parameters\n * @see {@link XAIMessagesParams} for Messages API parameters\n */\nexport interface XAIResponsesParams {\n /** Maximum output tokens */\n max_output_tokens?: number;\n\n /** Temperature for randomness (0.0 - 2.0) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0) */\n top_p?: number;\n\n /** Whether to enable parallel tool calls */\n parallel_tool_calls?: boolean;\n\n /** Reasoning configuration */\n reasoning?: {\n effort?: 'low' | 'high';\n /** Include encrypted reasoning content for continuation */\n encrypted_content?: boolean;\n };\n\n /** Truncation strategy */\n truncation?: 'auto' | 'disabled';\n\n /** Fields to include in output */\n include?: string[];\n\n /** Continue from a previous response */\n previous_response_id?: string;\n\n /** Store response for continuation */\n store?: boolean;\n\n /** Store messages on xAI servers (default: true) */\n store_messages?: boolean;\n\n /** Metadata key-value pairs */\n metadata?: Record<string, string>;\n\n /**\n * Live Search parameters (deprecated, will be removed Dec 15, 2025)\n * Use Agent Tools API instead for new implementations\n */\n search_parameters?: XAISearchParameters;\n\n /**\n * Built-in agentic tools for server-side execution.\n *\n * Use the tool helper constructors from the `tools` namespace:\n * - `tools.webSearch()` - Web search capability\n * - `tools.xSearch()` - X (Twitter) search capability\n * - `tools.codeExecution()` - Python code execution\n * - `tools.fileSearch()` - Document/collections search\n * - `tools.mcp()` - Remote MCP server connection\n *\n * Note: Only available via the Responses API (`api: 'responses'`).\n *\n * @example\n * ```typescript\n * import { xai, tools } from 'provider-protocol/xai';\n *\n * const model = llm({\n * model: xai('grok-4-1-fast', { api: 'responses' }),\n * params: {\n * tools: [\n * tools.webSearch(),\n * tools.xSearch({ from_date: '2025-01-01' }),\n * tools.codeExecution(),\n * ],\n * },\n * });\n * ```\n */\n tools?: XAIBuiltInTool[];\n\n /**\n * Maximum agent reasoning turns.\n * Limits the number of assistant turns, not individual tool calls.\n */\n max_turns?: number;\n}\n\n/**\n * xAI Messages API parameters (Anthropic-compatible).\n *\n * These parameters are passed through to the xAI `/v1/messages` endpoint.\n * The API is compatible with Anthropic's Messages API, allowing developers\n * migrating from Anthropic to use familiar patterns.\n *\n * @example\n * ```typescript\n * const params: XAIMessagesParams = {\n * max_tokens: 1000,\n * temperature: 0.7,\n * thinking: { type: 'enabled', budget_tokens: 500 }, // Extended thinking\n * };\n * ```\n *\n * @see {@link XAICompletionsParams} for Chat Completions API parameters\n * @see {@link XAIResponsesParams} for Responses API parameters\n */\nexport interface XAIMessagesParams {\n /** Maximum number of tokens to generate */\n max_tokens?: number;\n\n /** Temperature for randomness (0.0 - 1.0) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0) */\n top_p?: number;\n\n /** Top-k sampling */\n top_k?: number;\n\n /** Custom stop sequences */\n stop_sequences?: string[];\n\n /** Metadata for the request */\n metadata?: {\n user_id?: string;\n };\n\n /** Extended thinking configuration */\n thinking?: {\n type: 'enabled';\n budget_tokens: number;\n };\n}\n\n/**\n * API mode selector for the xAI provider.\n *\n * xAI supports three distinct API modes, each with different capabilities:\n * - `completions`: OpenAI Chat Completions compatible (recommended, default)\n * - `responses`: OpenAI Responses compatible with stateful conversations\n * - `messages`: Anthropic Messages compatible for easy migration\n */\nexport type XAIAPIMode = 'completions' | 'responses' | 'messages';\n\n/**\n * Options for configuring an xAI model reference.\n */\nexport interface XAIModelOptions {\n /** The API mode to use for this model */\n api?: XAIAPIMode;\n}\n\n/**\n * A reference to an xAI model with optional configuration.\n */\nexport interface XAIModelReference {\n /** The xAI model identifier (e.g., 'grok-4', 'grok-3-mini') */\n modelId: string;\n /** Optional model-specific options */\n options?: XAIModelOptions;\n}\n\n/**\n * Configuration options for the xAI provider.\n */\nexport interface XAIConfig {\n /** The API mode to use (defaults to 'completions') */\n api?: XAIAPIMode;\n}\n\n/**\n * Live Search parameters for real-time web search integration.\n *\n * @deprecated Live Search API will be removed on December 15, 2025.\n * Use the Agent Tools API with `web_search` tool instead.\n */\nexport interface XAISearchParameters {\n /** Search mode */\n mode?: 'auto' | 'on' | 'off';\n /** Limit search to specific date range */\n from_date?: string;\n /** End date for search range */\n to_date?: string;\n /** Sources to search */\n sources?: Array<'web' | 'x' | 'news' | 'rss'>;\n /** Maximum number of search results */\n max_search_results?: number;\n}\n\n// ============================================\n// Built-in Agentic Tools (Responses API)\n// ============================================\n\n/**\n * Web search tool for real-time web information retrieval.\n *\n * Enables Grok to search the web for up-to-date information.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAIWebSearchTool = {\n * type: 'web_search',\n * allowed_domains: ['wikipedia.org', 'github.com'],\n * };\n * ```\n */\nexport interface XAIWebSearchTool {\n /** Tool type identifier */\n type: 'web_search';\n /** Restrict to specific domains (max 5, mutually exclusive with excluded_domains) */\n allowed_domains?: string[];\n /** Exclude specific domains (max 5, mutually exclusive with allowed_domains) */\n excluded_domains?: string[];\n /** Enable image analysis from search results */\n enable_image_understanding?: boolean;\n}\n\n/**\n * X (Twitter) search tool for social media content.\n *\n * Enables Grok to search X posts and profiles in real-time.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAIXSearchTool = {\n * type: 'x_search',\n * allowed_x_handles: ['elonmusk', 'xai'],\n * from_date: '2025-01-01',\n * };\n * ```\n */\nexport interface XAIXSearchTool {\n /** Tool type identifier */\n type: 'x_search';\n /** Limit to specific X handles (max 10, mutually exclusive with excluded_x_handles) */\n allowed_x_handles?: string[];\n /** Exclude specific X handles (max 10, \"grok\" excluded by default) */\n excluded_x_handles?: string[];\n /** Start date filter (YYYY-MM-DD) */\n from_date?: string;\n /** End date filter (YYYY-MM-DD) */\n to_date?: string;\n /** Enable image analysis in posts */\n enable_image_understanding?: boolean;\n /** Enable video analysis in posts */\n enable_video_understanding?: boolean;\n}\n\n/**\n * Code execution tool for Python in a sandbox.\n *\n * Enables Grok to write and execute Python code in a secure environment.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAICodeExecutionTool = {\n * type: 'code_interpreter',\n * };\n * ```\n */\nexport interface XAICodeExecutionTool {\n /** Tool type identifier */\n type: 'code_interpreter';\n}\n\n/**\n * File/collections search tool for document retrieval.\n *\n * Enables Grok to search through uploaded document collections.\n * Pricing: $2.50 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAIFileSearchTool = {\n * type: 'file_search',\n * vector_store_ids: ['vs_abc123'],\n * max_num_results: 10,\n * };\n * ```\n */\nexport interface XAIFileSearchTool {\n /** Tool type identifier */\n type: 'file_search';\n /** Collection/vector store IDs to search */\n vector_store_ids: string[];\n /** Maximum results to return */\n max_num_results?: number;\n /** Retrieval mode configuration */\n retrieval_mode?: {\n type: 'keyword' | 'semantic' | 'hybrid';\n };\n}\n\n/**\n * Remote MCP server tool configuration.\n *\n * Enables Grok to connect to external Model Context Protocol servers.\n * Pricing: Token-based only (no per-invocation charge).\n *\n * @example\n * ```typescript\n * const tool: XAIMcpTool = {\n * type: 'mcp',\n * server_url: 'https://my-mcp-server.com/sse',\n * server_label: 'my_tools',\n * };\n * ```\n */\nexport interface XAIMcpTool {\n /** Tool type identifier */\n type: 'mcp';\n /** MCP server URL (HTTP Streaming/SSE only) */\n server_url: string;\n /** Server label for tool call prefixing */\n server_label?: string;\n /** Description of server capabilities */\n server_description?: string;\n /** Specific tools to enable (empty = all available) */\n allowed_tool_names?: string[];\n /** Authentication token */\n authorization?: string;\n /** Custom request headers */\n extra_headers?: Record<string, string>;\n}\n\n/**\n * Union type for all xAI built-in tools.\n *\n * These tools are only available via the Responses API (`api: 'responses'`).\n * They run server-side and provide agentic capabilities.\n */\nexport type XAIBuiltInTool =\n | XAIWebSearchTool\n | XAIXSearchTool\n | XAICodeExecutionTool\n | XAIFileSearchTool\n | XAIMcpTool;\n\n/**\n * Server-side tool usage tracking returned in responses.\n */\nexport interface XAIServerSideToolUsage {\n /** Number of successful web searches */\n web_search?: number;\n /** Number of successful X searches */\n x_search?: number;\n /** Number of successful code executions */\n code_execution?: number;\n /** Number of successful file searches */\n file_search?: number;\n}\n\n// ============================================\n// Tool Helper Constructors\n// ============================================\n\n/**\n * Creates a web search tool configuration.\n *\n * Enables Grok to search the web for up-to-date information.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @param options - Optional configuration for search behavior\n * @returns A web search tool configuration object\n *\n * @example\n * ```typescript\n * // Basic web search\n * const search = webSearchTool();\n *\n * // With domain restrictions\n * const searchWithDomains = webSearchTool({\n * allowed_domains: ['wikipedia.org', 'github.com'],\n * });\n * ```\n */\nexport function webSearchTool(options?: {\n allowed_domains?: string[];\n excluded_domains?: string[];\n enable_image_understanding?: boolean;\n}): XAIWebSearchTool {\n return {\n type: 'web_search',\n ...options,\n };\n}\n\n/**\n * Creates an X (Twitter) search tool configuration.\n *\n * Enables Grok to search X posts and profiles in real-time.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @param options - Optional configuration for search behavior\n * @returns An X search tool configuration object\n *\n * @example\n * ```typescript\n * // Basic X search\n * const xSearch = xSearchTool();\n *\n * // With handle and date filters\n * const filteredSearch = xSearchTool({\n * allowed_x_handles: ['elonmusk', 'xai'],\n * from_date: '2025-01-01',\n * to_date: '2025-12-31',\n * });\n * ```\n */\nexport function xSearchTool(options?: {\n allowed_x_handles?: string[];\n excluded_x_handles?: string[];\n from_date?: string;\n to_date?: string;\n enable_image_understanding?: boolean;\n enable_video_understanding?: boolean;\n}): XAIXSearchTool {\n return {\n type: 'x_search',\n ...options,\n };\n}\n\n/**\n * Creates a code execution tool configuration.\n *\n * Enables Grok to write and execute Python code in a sandbox.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @returns A code execution tool configuration object\n *\n * @example\n * ```typescript\n * const codeExec = codeExecutionTool();\n * ```\n */\nexport function codeExecutionTool(): XAICodeExecutionTool {\n return {\n type: 'code_interpreter',\n };\n}\n\n/**\n * Creates a file/collections search tool configuration.\n *\n * Enables Grok to search through uploaded document collections.\n * Pricing: $2.50 per 1,000 successful tool invocations.\n *\n * @param options - File search configuration\n * @returns A file search tool configuration object\n *\n * @example\n * ```typescript\n * const fileSearch = fileSearchTool({\n * vector_store_ids: ['vs_abc123'],\n * max_num_results: 10,\n * retrieval_mode: 'hybrid',\n * });\n * ```\n */\nexport function fileSearchTool(options: {\n vector_store_ids: string[];\n max_num_results?: number;\n retrieval_mode?: 'keyword' | 'semantic' | 'hybrid';\n}): XAIFileSearchTool {\n return {\n type: 'file_search',\n vector_store_ids: options.vector_store_ids,\n ...(options.max_num_results !== undefined && { max_num_results: options.max_num_results }),\n ...(options.retrieval_mode && { retrieval_mode: { type: options.retrieval_mode } }),\n };\n}\n\n/**\n * Creates a remote MCP server tool configuration.\n *\n * Enables Grok to connect to external Model Context Protocol servers.\n * Pricing: Token-based only (no per-invocation charge).\n *\n * @param options - MCP server configuration\n * @returns An MCP tool configuration object\n *\n * @example\n * ```typescript\n * const mcp = mcpTool({\n * server_url: 'https://my-mcp-server.com/sse',\n * server_label: 'my_tools',\n * allowed_tool_names: ['get_weather', 'search_db'],\n * });\n * ```\n */\nexport function mcpTool(options: {\n server_url: string;\n server_label?: string;\n server_description?: string;\n allowed_tool_names?: string[];\n authorization?: string;\n extra_headers?: Record<string, string>;\n}): XAIMcpTool {\n return {\n type: 'mcp',\n ...options,\n };\n}\n\n/**\n * Namespace object containing all xAI tool helper constructors.\n *\n * Provides a convenient way to create built-in tool configurations.\n * Note: These tools are only available via the Responses API (`api: 'responses'`).\n *\n * @example\n * ```typescript\n * import { xai, tools } from 'provider-protocol/xai';\n *\n * const model = llm({\n * model: xai('grok-4-1-fast', { api: 'responses' }),\n * params: {\n * tools: [\n * tools.webSearch(),\n * tools.xSearch({ from_date: '2025-01-01' }),\n * tools.codeExecution(),\n * ],\n * include: ['inline_citations', 'code_execution_call_output'],\n * },\n * });\n * ```\n */\nexport const tools = {\n /** Creates a web search tool configuration */\n webSearch: webSearchTool,\n /** Creates an X (Twitter) search tool configuration */\n xSearch: xSearchTool,\n /** Creates a code execution tool configuration */\n codeExecution: codeExecutionTool,\n /** Creates a file/collections search tool configuration */\n fileSearch: fileSearchTool,\n /** Creates a remote MCP server tool configuration */\n mcp: mcpTool,\n};\n\n/**\n * @deprecated Use the specific tool interfaces and the `tools` namespace instead.\n * This basic type is maintained for backwards compatibility.\n */\nexport interface XAIAgentTool {\n /** The type of server-side tool to enable */\n type: 'web_search' | 'x_search' | 'code_execution';\n}\n\n// ============================================\n// Chat Completions API Types (OpenAI-compatible)\n// ============================================\n\n/**\n * Request body for the xAI Chat Completions API.\n *\n * This interface represents the full request structure sent to `/v1/chat/completions`.\n * It follows the OpenAI Chat Completions API specification.\n */\nexport interface XAICompletionsRequest {\n model: string;\n messages: XAICompletionsMessage[];\n temperature?: number;\n top_p?: number;\n n?: number;\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n stop?: string | string[];\n max_tokens?: number;\n max_completion_tokens?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n logit_bias?: Record<string, number>;\n logprobs?: boolean;\n top_logprobs?: number;\n user?: string;\n seed?: number;\n tools?: XAICompletionsTool[];\n tool_choice?: XAIToolChoice;\n parallel_tool_calls?: boolean;\n response_format?: XAIResponseFormat;\n reasoning_effort?: string;\n store?: boolean;\n metadata?: Record<string, string>;\n search_parameters?: XAISearchParameters;\n}\n\n/**\n * Union type for all message roles in the Chat Completions API.\n */\nexport type XAICompletionsMessage =\n | XAISystemMessage\n | XAIUserMessage\n | XAIAssistantMessage\n | XAIToolMessage;\n\n/** System message for setting context and instructions. */\nexport interface XAISystemMessage {\n role: 'system';\n content: string;\n name?: string;\n}\n\n/** User message containing the user's input. */\nexport interface XAIUserMessage {\n role: 'user';\n content: string | XAIUserContent[];\n name?: string;\n}\n\n/** Assistant message containing the model's response. */\nexport interface XAIAssistantMessage {\n role: 'assistant';\n content?: string | null;\n name?: string;\n tool_calls?: XAIToolCall[];\n refusal?: string | null;\n /** Raw reasoning/thinking trace (grok-3-mini only) */\n reasoning_content?: string | null;\n}\n\n/** Tool result message containing the output of a tool call. */\nexport interface XAIToolMessage {\n role: 'tool';\n content: string;\n tool_call_id: string;\n}\n\n/**\n * Union type for content within user messages.\n */\nexport type XAIUserContent = XAITextContent | XAIImageContent;\n\n/** Text content block. */\nexport interface XAITextContent {\n type: 'text';\n text: string;\n}\n\n/** Image content block with URL reference. */\nexport interface XAIImageContent {\n type: 'image_url';\n image_url: {\n /** Image URL (supports data: URLs for base64) */\n url: string;\n /** Image processing detail level */\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\n/**\n * A tool call made by the assistant.\n */\nexport interface XAIToolCall {\n /** Unique identifier for this tool call */\n id: string;\n type: 'function';\n function: {\n /** Name of the function to call */\n name: string;\n /** JSON-encoded function arguments */\n arguments: string;\n };\n}\n\n/**\n * Tool definition for the Chat Completions API.\n */\nexport interface XAICompletionsTool {\n type: 'function';\n function: {\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does */\n description: string;\n /** JSON Schema defining the tool's parameters */\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n /** Enable strict mode for parameter validation */\n strict?: boolean;\n };\n}\n\n/**\n * Controls how the model selects which tools to use.\n *\n * - `'none'`: Never use tools\n * - `'auto'`: Let the model decide when to use tools\n * - `'required'`: Force the model to use at least one tool\n * - `{ type: 'function', function: { name: string } }`: Force a specific tool\n */\nexport type XAIToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\n/**\n * Specifies the output format for structured responses.\n *\n * - `{ type: 'text' }`: Plain text output (default)\n * - `{ type: 'json_object' }`: JSON output with flexible schema\n * - `{ type: 'json_schema', ... }`: JSON output with strict schema validation\n */\nexport type XAIResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n json_schema: {\n name: string;\n description?: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n };\n };\n\n/**\n * Response from the Chat Completions API.\n */\nexport interface XAICompletionsResponse {\n /** Unique response identifier */\n id: string;\n object: 'chat.completion';\n /** Unix timestamp of creation */\n created: number;\n /** Model used for generation */\n model: string;\n /** Generated completion choices */\n choices: XAICompletionsChoice[];\n /** Token usage statistics */\n usage: XAIUsage;\n /** Server-side fingerprint for reproducibility */\n system_fingerprint?: string;\n /** Citation URLs from Live Search */\n citations?: string[];\n /** Inline citations with text and URL */\n inline_citations?: Array<{ text: string; url: string }>;\n}\n\n/** A single completion choice from the API response. */\nexport interface XAICompletionsChoice {\n /** Index of this choice in the choices array */\n index: number;\n /** The generated assistant message */\n message: XAIAssistantMessage;\n /** Reason the model stopped generating */\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n /** Log probabilities for tokens (if requested) */\n logprobs?: XAILogprobs | null;\n}\n\n/** Token log probabilities for debugging and analysis. */\nexport interface XAILogprobs {\n content?: Array<{\n token: string;\n logprob: number;\n bytes?: number[];\n top_logprobs?: Array<{\n token: string;\n logprob: number;\n bytes?: number[];\n }>;\n }>;\n}\n\n/** Token usage statistics for billing and monitoring. */\nexport interface XAIUsage {\n /** Tokens in the prompt */\n prompt_tokens: number;\n /** Tokens in the completion */\n completion_tokens: number;\n /** Total tokens used */\n total_tokens: number;\n /** Breakdown of prompt token types */\n prompt_tokens_details?: {\n cached_tokens?: number;\n audio_tokens?: number;\n };\n /** Breakdown of completion token types */\n completion_tokens_details?: {\n reasoning_tokens?: number;\n audio_tokens?: number;\n };\n}\n\n/**\n * A streaming chunk from the Chat Completions API.\n */\nexport interface XAICompletionsStreamChunk {\n /** Response identifier (same across all chunks) */\n id: string;\n object: 'chat.completion.chunk';\n /** Unix timestamp of creation */\n created: number;\n /** Model used for generation */\n model: string;\n /** Streaming choices with deltas */\n choices: XAICompletionsStreamChoice[];\n /** Token usage (only present in final chunk with stream_options.include_usage) */\n usage?: XAIUsage | null;\n /** Server-side fingerprint */\n system_fingerprint?: string;\n}\n\n/** A streaming choice containing delta updates. */\nexport interface XAICompletionsStreamChoice {\n index: number;\n /** Incremental content update */\n delta: XAICompletionsStreamDelta;\n /** Non-null when generation is complete */\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n logprobs?: XAILogprobs | null;\n}\n\n/** Delta update containing new content. */\nexport interface XAICompletionsStreamDelta {\n role?: 'assistant';\n /** New text content */\n content?: string | null;\n /** Tool call updates */\n tool_calls?: XAIStreamToolCall[];\n /** Refusal message */\n refusal?: string | null;\n /** Reasoning content delta (grok-3-mini only) */\n reasoning_content?: string | null;\n}\n\n/** Streaming tool call with incremental argument updates. */\nexport interface XAIStreamToolCall {\n /** Index within the tool_calls array */\n index: number;\n /** Tool call ID (present in first chunk for this call) */\n id?: string;\n type?: 'function';\n function?: {\n /** Function name (present in first chunk) */\n name?: string;\n /** Incremental JSON argument fragment */\n arguments?: string;\n };\n}\n\n// ============================================\n// Responses API Types (OpenAI Responses-compatible)\n// ============================================\n\n/**\n * Request body for the xAI Responses API.\n *\n * This interface represents the full request structure sent to `/v1/responses`.\n * The Responses API supports stateful conversations via `previous_response_id`.\n */\nexport interface XAIResponsesRequest {\n model: string;\n input: string | XAIResponsesInputItem[];\n instructions?: string;\n max_output_tokens?: number;\n temperature?: number;\n top_p?: number;\n stream?: boolean;\n tools?: Array<XAIResponsesTool | XAIBuiltInTool>;\n tool_choice?: XAIResponsesToolChoice;\n parallel_tool_calls?: boolean;\n text?: XAIResponsesTextConfig;\n truncation?: 'auto' | 'disabled';\n store?: boolean;\n metadata?: Record<string, string>;\n reasoning?: {\n effort?: 'low' | 'high';\n };\n include?: string[];\n previous_response_id?: string;\n search_parameters?: XAISearchParameters;\n}\n\n/**\n * Union type for input items in the Responses API.\n */\nexport type XAIResponsesInputItem =\n | XAIResponsesSystemItem\n | XAIResponsesUserItem\n | XAIResponsesAssistantItem\n | XAIResponsesFunctionCallInputItem\n | XAIResponsesToolResultItem\n | XAIResponsesReasoningInputItem;\n\n/**\n * Reasoning input item for forwarding encrypted reasoning in multi-turn conversations.\n * Used with grok-4 models that support encrypted reasoning context.\n */\nexport interface XAIResponsesReasoningInputItem {\n type: 'reasoning';\n id: string;\n /** Summary of reasoning (if available) */\n summary?: Array<{ type: 'summary_text'; text: string }>;\n /** Encrypted reasoning content from previous response */\n encrypted_content: string;\n}\n\n/** System or developer message for the Responses API. */\nexport interface XAIResponsesSystemItem {\n type: 'message';\n role: 'system' | 'developer';\n content: string | XAIResponsesContentPart[];\n}\n\n/** User message for the Responses API. */\nexport interface XAIResponsesUserItem {\n type: 'message';\n role: 'user';\n content: string | XAIResponsesContentPart[];\n}\n\n/** Assistant message for the Responses API. */\nexport interface XAIResponsesAssistantItem {\n type: 'message';\n role: 'assistant';\n content: string | XAIResponsesContentPart[];\n}\n\n/** Function call input item for multi-turn tool conversations. */\nexport interface XAIResponsesFunctionCallInputItem {\n type: 'function_call';\n /** Unique item identifier */\n id: string;\n /** Call identifier for matching with output */\n call_id: string;\n /** Function name */\n name: string;\n /** JSON-encoded arguments */\n arguments: string;\n}\n\n/** Tool result item containing function output. */\nexport interface XAIResponsesToolResultItem {\n type: 'function_call_output';\n /** Call identifier matching the function_call */\n call_id: string;\n /** String output from the function */\n output: string;\n}\n\n/**\n * Union type for content parts within Responses API messages.\n */\nexport type XAIResponsesContentPart =\n | XAIResponsesTextPart\n | XAIResponsesImagePart\n | XAIResponsesFunctionCallPart;\n\n/** Text content part for input or output. */\nexport interface XAIResponsesTextPart {\n type: 'input_text' | 'output_text';\n text: string;\n}\n\n/** Image content part for input. */\nexport interface XAIResponsesImagePart {\n type: 'input_image';\n /** Image URL (including data: URLs) */\n image_url?: string;\n /** Base64-encoded image data */\n image?: string;\n /** Image processing detail level */\n detail?: 'auto' | 'low' | 'high';\n}\n\n/** Function call content part. */\nexport interface XAIResponsesFunctionCallPart {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n}\n\n/**\n * Tool definition for the Responses API.\n */\nexport interface XAIResponsesTool {\n type: 'function';\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does */\n description: string;\n /** JSON Schema defining the tool's parameters */\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n /** Enable strict mode for parameter validation */\n strict?: boolean;\n}\n\n/**\n * Controls how the model selects which tools to use in the Responses API.\n */\nexport type XAIResponsesToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; name: string };\n\n/**\n * Text output configuration for structured responses in the Responses API.\n */\nexport interface XAIResponsesTextConfig {\n /** Output format specification */\n format?:\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n name: string;\n description?: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n };\n}\n\n/**\n * Response from the Responses API.\n */\nexport interface XAIResponsesResponse {\n /** Unique response identifier (used as previous_response_id for continuation) */\n id: string;\n object: 'response';\n /** Unix timestamp of creation */\n created_at: number;\n /** Model used for generation */\n model: string;\n /** Generated output items */\n output: XAIResponsesOutputItem[];\n /** Token usage statistics */\n usage: XAIResponsesUsage;\n /** Current response status */\n status: 'completed' | 'failed' | 'incomplete' | 'in_progress';\n /** Error details if status is 'failed' */\n error?: {\n code: string;\n message: string;\n };\n /** Details about why response is incomplete */\n incomplete_details?: {\n reason: string;\n };\n /** Citation URLs from Live Search */\n citations?: string[];\n /** Inline citations with text and URL */\n inline_citations?: Array<{ text: string; url: string }>;\n}\n\n/** Union type for output items in Responses API responses. */\nexport type XAIResponsesOutputItem =\n | XAIResponsesMessageOutput\n | XAIResponsesFunctionCallOutput\n | XAIResponsesReasoningOutput;\n\n/** Reasoning output item from reasoning models (grok-4 with encrypted_content). */\nexport interface XAIResponsesReasoningOutput {\n type: 'reasoning';\n id: string;\n /** Summary of reasoning (if not encrypted) */\n summary?: Array<{ type: 'summary_text'; text: string }>;\n /** Encrypted reasoning content for multi-turn context */\n encrypted_content?: string;\n status: 'completed' | 'in_progress' | null;\n}\n\n/** Message output item containing text or refusal content. */\nexport interface XAIResponsesMessageOutput {\n type: 'message';\n /** Unique output item identifier */\n id: string;\n role: 'assistant';\n /** Content blocks within this message */\n content: XAIResponsesOutputContent[];\n /** Generation status for this item */\n status: 'completed' | 'in_progress';\n}\n\n/** Function call output item representing a tool invocation. */\nexport interface XAIResponsesFunctionCallOutput {\n type: 'function_call';\n /** Unique item identifier */\n id: string;\n /** Call identifier for matching with function_call_output */\n call_id: string;\n /** Function name */\n name: string;\n /** JSON-encoded arguments */\n arguments: string;\n /** Generation status for this item */\n status: 'completed' | 'in_progress';\n}\n\n/** Union type for output content within message items. */\nexport type XAIResponsesOutputContent =\n | { type: 'output_text'; text: string; annotations?: unknown[] }\n | { type: 'refusal'; refusal: string };\n\n/** Token usage statistics for the Responses API. */\nexport interface XAIResponsesUsage {\n /** Tokens in the input */\n input_tokens: number;\n /** Tokens in the output */\n output_tokens: number;\n /** Total tokens used */\n total_tokens: number;\n /** Breakdown of input token types */\n input_tokens_details?: {\n cached_tokens?: number;\n text_tokens?: number;\n image_tokens?: number;\n audio_tokens?: number;\n };\n /** Breakdown of output token types */\n output_tokens_details?: {\n text_tokens?: number;\n reasoning_tokens?: number;\n audio_tokens?: number;\n };\n}\n\n/**\n * Union type for all streaming events in the Responses API.\n */\nexport type XAIResponsesStreamEvent =\n | XAIResponseCreatedEvent\n | XAIResponseInProgressEvent\n | XAIResponseCompletedEvent\n | XAIResponseFailedEvent\n | XAIResponseOutputItemAddedEvent\n | XAIResponseOutputItemDoneEvent\n | XAIResponseContentPartAddedEvent\n | XAIResponseContentPartDoneEvent\n | XAIResponseTextDeltaEvent\n | XAIResponseTextDoneEvent\n | XAIResponseRefusalDeltaEvent\n | XAIResponseRefusalDoneEvent\n | XAIResponseFunctionCallArgumentsDeltaEvent\n | XAIResponseFunctionCallArgumentsDoneEvent\n | XAIResponseReasoningSummaryTextDeltaEvent\n | XAIResponseReasoningSummaryTextDoneEvent\n | XAIResponseErrorEvent;\n\n/** Emitted when a response is first created. */\nexport interface XAIResponseCreatedEvent {\n type: 'response.created';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when response generation is in progress. */\nexport interface XAIResponseInProgressEvent {\n type: 'response.in_progress';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when response generation completes successfully. */\nexport interface XAIResponseCompletedEvent {\n type: 'response.completed';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when response generation fails. */\nexport interface XAIResponseFailedEvent {\n type: 'response.failed';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when a new output item is added to the response. */\nexport interface XAIResponseOutputItemAddedEvent {\n type: 'response.output_item.added';\n output_index: number;\n item: XAIResponsesOutputItem;\n}\n\n/** Emitted when an output item generation is complete. */\nexport interface XAIResponseOutputItemDoneEvent {\n type: 'response.output_item.done';\n output_index: number;\n item: XAIResponsesOutputItem;\n}\n\n/** Emitted when a content part is added to an output item. */\nexport interface XAIResponseContentPartAddedEvent {\n type: 'response.content_part.added';\n output_index: number;\n content_index: number;\n part: XAIResponsesOutputContent;\n}\n\n/** Emitted when a content part generation is complete. */\nexport interface XAIResponseContentPartDoneEvent {\n type: 'response.content_part.done';\n output_index: number;\n content_index: number;\n part: XAIResponsesOutputContent;\n}\n\n/** Emitted for incremental text content updates. */\nexport interface XAIResponseTextDeltaEvent {\n type: 'response.output_text.delta';\n output_index: number;\n content_index: number;\n /** The new text fragment */\n delta: string;\n}\n\n/** Emitted when text content generation is complete. */\nexport interface XAIResponseTextDoneEvent {\n type: 'response.output_text.done';\n output_index: number;\n content_index: number;\n /** The complete text content */\n text: string;\n}\n\n/** Emitted for incremental refusal message updates. */\nexport interface XAIResponseRefusalDeltaEvent {\n type: 'response.refusal.delta';\n output_index: number;\n content_index: number;\n delta: string;\n}\n\n/** Emitted when refusal message generation is complete. */\nexport interface XAIResponseRefusalDoneEvent {\n type: 'response.refusal.done';\n output_index: number;\n content_index: number;\n refusal: string;\n}\n\n/** Emitted for incremental function call argument updates. */\nexport interface XAIResponseFunctionCallArgumentsDeltaEvent {\n type: 'response.function_call_arguments.delta';\n output_index: number;\n item_id: string;\n /** The new JSON argument fragment */\n delta: string;\n call_id?: string;\n}\n\n/** Emitted when function call arguments generation is complete. */\nexport interface XAIResponseFunctionCallArgumentsDoneEvent {\n type: 'response.function_call_arguments.done';\n output_index: number;\n item_id: string;\n name: string;\n /** The complete JSON arguments */\n arguments: string;\n call_id?: string;\n}\n\n/** Emitted for incremental reasoning summary text updates. */\nexport interface XAIResponseReasoningSummaryTextDeltaEvent {\n type: 'response.reasoning_summary_text.delta';\n item_id: string;\n output_index: number;\n summary_index: number;\n delta: string;\n}\n\n/** Emitted when reasoning summary text generation is complete. */\nexport interface XAIResponseReasoningSummaryTextDoneEvent {\n type: 'response.reasoning_summary_text.done';\n item_id: string;\n output_index: number;\n summary_index: number;\n text: string;\n}\n\nexport interface XAIResponseErrorEvent {\n type: 'error';\n error: {\n type: string;\n code?: string;\n message: string;\n };\n}\n\n// ============================================\n// Messages API Types (Anthropic-compatible)\n// ============================================\n\n/**\n * Request body for the xAI Messages API.\n *\n * This interface represents the full request structure sent to `/v1/messages`.\n * It follows the Anthropic Messages API specification for compatibility.\n */\nexport interface XAIMessagesRequest {\n model: string;\n max_tokens?: number;\n messages: XAIMessagesMessage[];\n system?: string;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n stream?: boolean;\n tools?: XAIMessagesTool[];\n tool_choice?: { type: 'auto' | 'any' | 'tool'; name?: string };\n metadata?: { user_id?: string };\n thinking?: { type: 'enabled'; budget_tokens: number };\n}\n\n/**\n * Message format for the Messages API.\n */\nexport interface XAIMessagesMessage {\n /** Message role (user or assistant) */\n role: 'user' | 'assistant';\n /** Message content (string or array of content blocks) */\n content: XAIMessagesContent[] | string;\n}\n\n/**\n * Union type for content blocks in the Messages API.\n * Includes thinking content for forwarding extended thinking in multi-turn conversations.\n */\nexport type XAIMessagesContent =\n | XAIMessagesTextContent\n | XAIMessagesImageContent\n | XAIMessagesToolUseContent\n | XAIMessagesToolResultContent\n | XAIMessagesThinkingContent;\n\n/** Text content block. */\nexport interface XAIMessagesTextContent {\n type: 'text';\n text: string;\n}\n\n/** Image content block with source information. */\nexport interface XAIMessagesImageContent {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n /** MIME type (e.g., 'image/png') */\n media_type?: string;\n /** Base64-encoded image data (for type: 'base64') */\n data?: string;\n /** Image URL (for type: 'url') */\n url?: string;\n };\n}\n\n/** Tool use content block representing a tool invocation by the assistant. */\nexport interface XAIMessagesToolUseContent {\n type: 'tool_use';\n /** Unique identifier for this tool use */\n id: string;\n /** Name of the tool being used */\n name: string;\n /** Tool input arguments */\n input: Record<string, unknown>;\n}\n\n/** Tool result content block containing the output of a tool execution. */\nexport interface XAIMessagesToolResultContent {\n type: 'tool_result';\n /** ID of the tool_use this is a result for */\n tool_use_id: string;\n /** Result content */\n content: string | XAIMessagesContent[];\n /** Whether the tool execution resulted in an error */\n is_error?: boolean;\n}\n\n/**\n * Tool definition for the Messages API.\n */\nexport interface XAIMessagesTool {\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does */\n description: string;\n /** JSON Schema defining the tool's input parameters */\n input_schema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Response from the Messages API.\n */\nexport interface XAIMessagesResponse {\n /** Unique message identifier */\n id: string;\n type: 'message';\n role: 'assistant';\n /** Content blocks in the response */\n content: XAIMessagesResponseContent[];\n /** Model used for generation */\n model: string;\n /** Reason the model stopped generating */\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | 'pause_turn' | 'refusal' | null;\n /** The stop sequence that triggered stop (if applicable) */\n stop_sequence: string | null;\n /** Token usage statistics */\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\n/** Union type for response content blocks in the Messages API. */\nexport type XAIMessagesResponseContent =\n | XAIMessagesTextContent\n | XAIMessagesToolUseContent\n | XAIMessagesThinkingContent;\n\n/** Thinking content block from extended thinking feature. */\nexport interface XAIMessagesThinkingContent {\n type: 'thinking';\n /** The model's internal reasoning */\n thinking: string;\n /** Cryptographic signature for verification */\n signature?: string;\n}\n\n/**\n * Union type for all streaming events in the Messages API.\n */\nexport type XAIMessagesStreamEvent =\n | XAIMessagesMessageStartEvent\n | XAIMessagesContentBlockStartEvent\n | XAIMessagesContentBlockDeltaEvent\n | XAIMessagesContentBlockStopEvent\n | XAIMessagesMessageDeltaEvent\n | XAIMessagesMessageStopEvent\n | XAIMessagesPingEvent\n | XAIMessagesErrorEvent;\n\n/** Emitted at the start of a message. */\nexport interface XAIMessagesMessageStartEvent {\n type: 'message_start';\n message: XAIMessagesResponse;\n}\n\n/** Emitted when a new content block starts. */\nexport interface XAIMessagesContentBlockStartEvent {\n type: 'content_block_start';\n index: number;\n content_block: XAIMessagesResponseContent;\n}\n\n/** Emitted for incremental content block updates. */\nexport interface XAIMessagesContentBlockDeltaEvent {\n type: 'content_block_delta';\n /** Index may be omitted by xAI (unlike Anthropic) - use tracked currentIndex as fallback */\n index?: number;\n /** Delta content (type varies based on content block type) */\n delta:\n | { type: 'text_delta'; text: string }\n | { type: 'thinking_delta'; thinking: string }\n | { type: 'signature_delta'; signature: string }\n | { type: 'input_json_delta'; partial_json: string };\n}\n\n/** Emitted when a content block is complete. */\nexport interface XAIMessagesContentBlockStopEvent {\n type: 'content_block_stop';\n index: number;\n}\n\n/** Emitted with final message metadata. */\nexport interface XAIMessagesMessageDeltaEvent {\n type: 'message_delta';\n delta: {\n stop_reason: string | null;\n stop_sequence: string | null;\n };\n usage: {\n output_tokens: number;\n };\n}\n\n/** Emitted when message generation is complete. */\nexport interface XAIMessagesMessageStopEvent {\n type: 'message_stop';\n}\n\n/** Keep-alive ping event. */\nexport interface XAIMessagesPingEvent {\n type: 'ping';\n}\n\n/** Error event during streaming. */\nexport interface XAIMessagesErrorEvent {\n type: 'error';\n error: {\n type: string;\n message: string;\n };\n}\n\n/**\n * xAI-specific HTTP headers for API requests.\n *\n * @example\n * ```typescript\n * const headers: XAIHeaders = {\n * 'X-Client-Request-Id': 'trace-123',\n * };\n * ```\n */\nexport interface XAIHeaders {\n /** Client-generated request ID for tracing. */\n 'X-Client-Request-Id'?: string;\n [key: string]: string | undefined;\n}\n","/**\n * @fileoverview xAI Provider Factory\n *\n * This module provides the main xAI provider implementation that supports three\n * API modes: Chat Completions (default, OpenAI-compatible), Responses (stateful),\n * and Messages (Anthropic-compatible).\n *\n * @module providers/xai\n */\n\nimport type { Provider } from '../../types/provider.ts';\nimport { createProvider } from '../../core/provider.ts';\nimport type { LLMHandlerResolver } from '../../core/provider-handlers.ts';\nimport { createCompletionsLLMHandler } from './llm.completions.ts';\nimport { createResponsesLLMHandler } from './llm.responses.ts';\nimport { createMessagesLLMHandler } from './llm.messages.ts';\nimport { createImageHandler, type XAIImageParams } from './image.ts';\nimport type { XAIAPIMode } from './types.ts';\n\n/**\n * Configuration options for creating xAI model references.\n */\nexport interface XAIProviderOptions {\n /**\n * The API mode to use for this model.\n *\n * - `'completions'`: Chat Completions API (OpenAI-compatible, default, recommended)\n * - `'responses'`: Responses API (OpenAI Responses-compatible, supports stateful conversations)\n * - `'messages'`: Messages API (Anthropic-compatible, for easy migration from Anthropic)\n *\n * @default 'completions'\n */\n api?: XAIAPIMode;\n}\n\n/**\n * Type alias for the xAI provider with its options.\n */\nexport type XAIProvider = Provider<XAIProviderOptions>;\n\n/**\n * xAI provider\n *\n * Supports three API modes:\n * - Chat Completions API (default, OpenAI-compatible)\n * - Responses API (stateful, OpenAI Responses-compatible)\n * - Messages API (Anthropic-compatible)\n *\n * xAI's Grok models support:\n * - Real-time search via Live Search API (deprecated Dec 2025) or Agent Tools API\n * - Reasoning with `reasoning_effort` parameter (for Grok 3 Mini)\n * - Tool/function calling\n * - Image input\n * - Streaming responses\n * - Structured output (JSON mode)\n *\n * @example\n * ```ts\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * // Using Chat Completions API (default, recommended)\n * const model = llm({\n * model: xai('grok-4'),\n * params: { max_tokens: 1000 }\n * });\n *\n * // Using Responses API (stateful conversations)\n * const statefulModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * max_output_tokens: 1000,\n * store: true, // Enable stateful storage\n * }\n * });\n *\n * // Continue a previous conversation\n * const continuedModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * previous_response_id: 'resp_123...',\n * }\n * });\n *\n * // Using Messages API (Anthropic-compatible)\n * const anthropicModel = llm({\n * model: xai('grok-4', { api: 'messages' }),\n * params: { max_tokens: 1000 }\n * });\n *\n * // Using reasoning effort (Grok 3 Mini only)\n * const reasoningModel = llm({\n * model: xai('grok-3-mini'),\n * params: {\n * max_tokens: 1000,\n * reasoning_effort: 'high', // 'low' or 'high'\n * }\n * });\n *\n * // Using Live Search (deprecated Dec 2025)\n * const searchModel = llm({\n * model: xai('grok-4'),\n * params: {\n * max_tokens: 1000,\n * search_parameters: {\n * mode: 'auto',\n * sources: ['web', 'x', 'news'],\n * }\n * }\n * });\n *\n * // Generate\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n */\nexport const xai = createProvider<XAIProviderOptions>({\n name: 'xai',\n version: '1.0.0',\n handlers: {\n llm: {\n handlers: {\n completions: createCompletionsLLMHandler(),\n responses: createResponsesLLMHandler(),\n messages: createMessagesLLMHandler(),\n },\n defaultMode: 'completions',\n getMode: (options) => options?.api ?? 'completions',\n } satisfies LLMHandlerResolver<XAIProviderOptions>,\n image: createImageHandler(),\n },\n});\n\n// Re-export tools and types\nexport { tools } from './types.ts';\nexport type {\n XAICompletionsParams,\n XAIResponsesParams,\n XAIMessagesParams,\n XAIConfig,\n XAIAPIMode,\n XAIModelOptions,\n XAIModelReference,\n XAISearchParameters,\n XAIAgentTool,\n XAIHeaders,\n XAIBuiltInTool,\n XAIWebSearchTool,\n XAIXSearchTool,\n XAICodeExecutionTool,\n XAIFileSearchTool,\n XAIMcpTool,\n XAIServerSideToolUsage,\n} from './types.ts';\n\nexport type { XAIImageParams } from './image.ts';\n"],"mappings":"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","names":["transformRequest","transformTool","normalizeSystem","transformMessage","filterValidContent","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","transformRequest","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","normalizeSystem","transformRequest","transformMessage","transformTool","filterValidContent","transformContentBlock","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","transformRequest","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","transformResponse"]}
|
|
1
|
+
{"version":3,"sources":["../../src/providers/xai/transform.completions.ts","../../src/providers/xai/llm.completions.ts","../../src/providers/xai/transform.responses.ts","../../src/providers/xai/llm.responses.ts","../../src/providers/xai/transform.messages.ts","../../src/providers/xai/llm.messages.ts","../../src/providers/xai/image.ts","../../src/providers/xai/types.ts","../../src/providers/xai/index.ts"],"sourcesContent":["import type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock, AssistantContent } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n XAICompletionsParams,\n XAICompletionsRequest,\n XAICompletionsMessage,\n XAIUserContent,\n XAICompletionsTool,\n XAICompletionsResponse,\n XAICompletionsStreamChunk,\n XAIToolCall,\n} from './types.ts';\n\n/**\n * Transforms a UPP LLM request to the xAI Chat Completions API format.\n *\n * All params are spread directly to enable pass-through of xAI API fields\n * not explicitly defined in our types. This allows developers to use new\n * API features without waiting for library updates.\n *\n * @param request - The unified provider protocol request\n * @param modelId - The xAI model identifier\n * @returns The transformed xAI Chat Completions request body\n */\nexport function transformRequest(\n request: LLMRequest<XAICompletionsParams>,\n modelId: string\n): XAICompletionsRequest {\n const params = request.params ?? ({} as XAICompletionsParams);\n\n const xaiRequest: XAICompletionsRequest = {\n ...params,\n model: modelId,\n messages: transformMessages(request.messages, request.system),\n };\n\n if (request.tools && request.tools.length > 0) {\n xaiRequest.tools = request.tools.map(transformTool);\n }\n\n if (request.structure) {\n const schema: Record<string, unknown> = {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n ...(request.structure.additionalProperties !== undefined\n ? { additionalProperties: request.structure.additionalProperties }\n : { additionalProperties: false }),\n };\n if (request.structure.description) {\n schema.description = request.structure.description;\n }\n\n xaiRequest.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'json_response',\n description: request.structure.description,\n schema,\n strict: true,\n },\n };\n }\n\n return xaiRequest;\n}\n\n/**\n * Normalizes system prompt to string.\n * Converts array format to concatenated string for providers that only support strings.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Transforms UPP messages to xAI Chat Completions message format.\n *\n * @param messages - The array of UPP messages\n * @param system - Optional system prompt (string or array, normalized to string)\n * @returns Array of xAI-formatted messages\n */\nfunction transformMessages(\n messages: Message[],\n system?: string | unknown[]\n): XAICompletionsMessage[] {\n const result: XAICompletionsMessage[] = [];\n const normalizedSystem = normalizeSystem(system);\n\n if (normalizedSystem) {\n result.push({\n role: 'system',\n content: normalizedSystem,\n });\n }\n\n for (const message of messages) {\n if (isToolResultMessage(message)) {\n const toolMessages = transformToolResults(message);\n result.push(...toolMessages);\n } else {\n const transformed = transformMessage(message);\n if (transformed) {\n result.push(transformed);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Filters content blocks to only those with a valid type property.\n *\n * @param content - Array of content blocks\n * @returns Filtered array with only valid content blocks\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a single UPP message to xAI Chat Completions format.\n *\n * @param message - The UPP message to transform\n * @returns The xAI-formatted message or null if unsupported\n */\nfunction transformMessage(message: Message): XAICompletionsMessage | null {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n if (validContent.length === 1 && validContent[0]?.type === 'text') {\n return {\n role: 'user',\n content: (validContent[0] as TextBlock).text,\n };\n }\n return {\n role: 'user',\n content: validContent.map(transformContentBlock),\n };\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const textContent = validContent\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const hasToolCalls = message.toolCalls && message.toolCalls.length > 0;\n\n const assistantMessage: XAICompletionsMessage = {\n role: 'assistant',\n content: hasToolCalls && !textContent ? null : textContent,\n };\n\n if (hasToolCalls) {\n (assistantMessage as { tool_calls?: XAIToolCall[] }).tool_calls =\n message.toolCalls!.map((call) => ({\n id: call.toolCallId,\n type: 'function' as const,\n function: {\n name: call.toolName,\n arguments: JSON.stringify(call.arguments),\n },\n }));\n }\n\n return assistantMessage;\n }\n\n if (isToolResultMessage(message)) {\n const results = message.results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n return results[0] ?? null;\n }\n\n return null;\n}\n\n/**\n * Transforms tool result messages into multiple xAI tool messages.\n *\n * Tool results in xAI's Chat Completions API require separate messages\n * for each tool call result.\n *\n * @param message - The UPP message containing tool results\n * @returns Array of xAI tool messages\n */\nexport function transformToolResults(\n message: Message\n): XAICompletionsMessage[] {\n if (!isToolResultMessage(message)) {\n const single = transformMessage(message);\n return single ? [single] : [];\n }\n\n return message.results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n}\n\n/**\n * Transforms a UPP content block to xAI user content format.\n *\n * @param block - The content block to transform\n * @returns The xAI-formatted user content\n * @throws Error if the content type is unsupported\n */\nfunction transformContentBlock(block: ContentBlock): XAIUserContent {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n let url: string;\n\n if (imageBlock.source.type === 'base64') {\n url = `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`;\n } else if (imageBlock.source.type === 'url') {\n url = imageBlock.source.url;\n } else if (imageBlock.source.type === 'bytes') {\n const base64 = Buffer.from(imageBlock.source.data).toString('base64');\n url = `data:${imageBlock.mimeType};base64,${base64}`;\n } else {\n throw new Error('Unknown image source type');\n }\n\n return {\n type: 'image_url',\n image_url: { url },\n };\n }\n\n default:\n throw new Error(`Unsupported content type: ${block.type}`);\n }\n}\n\n/**\n * Transforms a UPP tool definition to xAI Chat Completions format.\n *\n * @param tool - The UPP tool definition\n * @returns The xAI-formatted tool definition\n */\nfunction transformTool(tool: Tool): XAICompletionsTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n ...(tool.parameters.additionalProperties !== undefined\n ? { additionalProperties: tool.parameters.additionalProperties }\n : {}),\n },\n },\n };\n}\n\n/**\n * Transforms an xAI Chat Completions response to the UPP LLMResponse format.\n *\n * @param data - The xAI Chat Completions API response\n * @returns The unified provider protocol response\n * @throws Error if no choices are present in the response\n */\nexport function transformResponse(data: XAICompletionsResponse): LLMResponse {\n const choice = data.choices[0];\n if (!choice) {\n throw new Error('No choices in xAI response');\n }\n\n const content: AssistantContent[] = [];\n let structuredData: unknown;\n\n // Extract reasoning content (grok-3-mini only)\n if (choice.message.reasoning_content) {\n content.push({ type: 'reasoning', text: choice.message.reasoning_content });\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content });\n try {\n structuredData = JSON.parse(choice.message.content);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n let hadRefusal = false;\n if (choice.message.refusal) {\n content.push({ type: 'text', text: choice.message.refusal });\n hadRefusal = true;\n }\n\n const toolCalls: ToolCall[] = [];\n if (choice.message.tool_calls) {\n for (const call of choice.message.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(call.function.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n toolCalls.push({\n toolCallId: call.id,\n toolName: call.function.name,\n arguments: args,\n });\n }\n }\n\n const responseId = data.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: responseId,\n metadata: {\n xai: {\n model: data.model,\n finish_reason: choice.finish_reason,\n system_fingerprint: data.system_fingerprint,\n citations: data.citations,\n inline_citations: data.inline_citations,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n cacheReadTokens: data.usage.prompt_tokens_details?.cached_tokens ?? 0,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n switch (choice.finish_reason) {\n case 'stop':\n stopReason = 'end_turn';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'content_filter':\n stopReason = 'content_filter';\n break;\n }\n if (hadRefusal && stopReason !== 'content_filter') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n\n/**\n * State object for accumulating data during streaming responses.\n *\n * This state is progressively updated as stream chunks arrive and is used\n * to build the final LLMResponse when streaming completes.\n */\nexport interface CompletionsStreamState {\n /** Response identifier */\n id: string;\n /** Model used for generation */\n model: string;\n /** Accumulated text content */\n text: string;\n /** Accumulated reasoning content (grok-3-mini only) */\n reasoning: string;\n /** Map of tool call index to accumulated tool call data */\n toolCalls: Map<number, { id: string; name: string; arguments: string }>;\n /** Final finish reason from the API */\n finishReason: string | null;\n /** Total input tokens (from usage chunk) */\n inputTokens: number;\n /** Total output tokens (from usage chunk) */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n /** Whether a refusal message was received */\n hadRefusal: boolean;\n}\n\n/**\n * Creates a new initialized stream state for accumulating streaming data.\n *\n * @returns A fresh CompletionsStreamState with default values\n */\nexport function createStreamState(): CompletionsStreamState {\n return {\n id: '',\n model: '',\n text: '',\n reasoning: '',\n toolCalls: new Map(),\n finishReason: null,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n hadRefusal: false,\n };\n}\n\n/**\n * Transforms an xAI Chat Completions stream chunk to UPP StreamEvents.\n *\n * A single chunk may produce multiple events (e.g., text delta + tool call delta).\n * The state object is mutated to accumulate data for the final response.\n *\n * @param chunk - The xAI streaming chunk\n * @param state - The mutable stream state to update\n * @returns Array of UPP stream events (may be empty)\n */\nexport function transformStreamEvent(\n chunk: XAICompletionsStreamChunk,\n state: CompletionsStreamState\n): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n if (chunk.id && !state.id) {\n state.id = chunk.id;\n events.push({ type: StreamEventType.MessageStart, index: 0, delta: {} });\n }\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n const choice = chunk.choices[0];\n if (choice) {\n // Handle reasoning content delta (grok-3-mini only)\n if (choice.delta.reasoning_content) {\n state.reasoning += choice.delta.reasoning_content;\n events.push({\n type: StreamEventType.ReasoningDelta,\n index: 0,\n delta: { text: choice.delta.reasoning_content },\n });\n }\n if (choice.delta.content) {\n state.text += choice.delta.content;\n events.push({\n type: StreamEventType.TextDelta,\n index: 0,\n delta: { text: choice.delta.content },\n });\n }\n if (choice.delta.refusal) {\n state.hadRefusal = true;\n state.text += choice.delta.refusal;\n events.push({\n type: StreamEventType.TextDelta,\n index: 0,\n delta: { text: choice.delta.refusal },\n });\n }\n\n if (choice.delta.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n const index = toolCallDelta.index;\n let toolCall = state.toolCalls.get(index);\n\n if (!toolCall) {\n toolCall = { id: '', name: '', arguments: '' };\n state.toolCalls.set(index, toolCall);\n }\n\n if (toolCallDelta.id) {\n toolCall.id = toolCallDelta.id;\n }\n if (toolCallDelta.function?.name) {\n toolCall.name = toolCallDelta.function.name;\n }\n if (toolCallDelta.function?.arguments) {\n toolCall.arguments += toolCallDelta.function.arguments;\n events.push({\n type: StreamEventType.ToolCallDelta,\n index: index,\n delta: {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n argumentsJson: toolCallDelta.function.arguments,\n },\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n state.finishReason = choice.finish_reason;\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n }\n }\n\n if (chunk.usage) {\n state.inputTokens = chunk.usage.prompt_tokens;\n state.outputTokens = chunk.usage.completion_tokens;\n state.cacheReadTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;\n }\n\n return events;\n}\n\n/**\n * Builds the final LLMResponse from accumulated stream state.\n *\n * Called when streaming is complete to construct the unified response\n * from all the data accumulated during streaming.\n *\n * @param state - The accumulated stream state\n * @returns The complete LLMResponse\n */\nexport function buildResponseFromState(state: CompletionsStreamState): LLMResponse {\n const content: AssistantContent[] = [];\n let structuredData: unknown;\n\n // Add reasoning content first (grok-3-mini only)\n if (state.reasoning) {\n content.push({ type: 'reasoning', text: state.reasoning });\n }\n\n if (state.text) {\n content.push({ type: 'text', text: state.text });\n try {\n structuredData = JSON.parse(state.text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n\n const toolCalls: ToolCall[] = [];\n for (const [, toolCall] of state.toolCalls) {\n let args: Record<string, unknown> = {};\n if (toolCall.arguments) {\n try {\n args = JSON.parse(toolCall.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n }\n toolCalls.push({\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n arguments: args,\n });\n }\n\n const messageId = state.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: messageId,\n metadata: {\n xai: {\n model: state.model,\n finish_reason: state.finishReason,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n switch (state.finishReason) {\n case 'stop':\n stopReason = 'end_turn';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'content_filter':\n stopReason = 'content_filter';\n break;\n }\n if (state.hadRefusal && stopReason !== 'content_filter') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n","import type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { XAICompletionsParams, XAICompletionsResponse, XAICompletionsStreamChunk } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.completions.ts';\n\n/** Base URL for the xAI Chat Completions API endpoint. */\nconst XAI_COMPLETIONS_API_URL = 'https://api.x.ai/v1/chat/completions';\n\n/**\n * Capability declarations for the xAI Chat Completions API.\n * Indicates which features are supported by this API mode.\n */\nconst XAI_COMPLETIONS_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: false,\n audioInput: false,\n};\n\n/**\n * Creates an LLM handler for the xAI Chat Completions API (OpenAI-compatible).\n *\n * The Chat Completions API is the default and recommended API mode for xAI.\n * It provides full compatibility with OpenAI's Chat Completions API, making\n * it easy to migrate existing OpenAI-based applications.\n *\n * @returns An LLM handler configured for the Chat Completions API\n *\n * @example\n * ```typescript\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * const model = llm({\n * model: xai('grok-4'),\n * params: {\n * max_tokens: 1000,\n * temperature: 0.7,\n * }\n * });\n *\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n *\n * @see {@link createMessagesLLMHandler} for Anthropic-compatible mode\n * @see {@link createResponsesLLMHandler} for stateful Responses API mode\n */\nexport function createCompletionsLLMHandler(): LLMHandler<XAICompletionsParams> {\n let providerRef: LLMProvider<XAICompletionsParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<XAICompletionsParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<XAICompletionsParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<XAICompletionsParams> = {\n modelId,\n capabilities: XAI_COMPLETIONS_CAPABILITIES,\n\n get provider(): LLMProvider<XAICompletionsParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<XAICompletionsParams>): Promise<LLMResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_COMPLETIONS_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n const data = await parseJsonResponse<XAICompletionsResponse>(response, 'xai', 'llm');\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<XAICompletionsParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_COMPLETIONS_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n body.stream_options = { include_usage: true };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'xai', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Skip [DONE] marker\n if (data === '[DONE]') {\n continue;\n }\n\n // Check for xAI error event\n if (typeof data === 'object' && data !== null) {\n const chunk = data as XAICompletionsStreamChunk;\n\n // Check for error in chunk\n if ('error' in chunk && chunk.error) {\n const errorData = chunk.error as { message?: string; type?: string };\n const error = new UPPError(\n errorData.message ?? 'Unknown error',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvents = transformStreamEvent(chunk, state);\n for (const event of uppEvents) {\n yield event;\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","import type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock, AssistantContent } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n XAIResponsesParams,\n XAIResponsesRequest,\n XAIResponsesInputItem,\n XAIResponsesContentPart,\n XAIResponsesTool,\n XAIResponsesResponse,\n XAIResponsesStreamEvent,\n XAIBuiltInTool,\n XAIResponsesReasoningInputItem,\n XAIResponsesReasoningOutput,\n} from './types.ts';\n\n/**\n * Transforms a UPP LLM request to the xAI Responses API format.\n *\n * All params are spread directly to enable pass-through of xAI API fields\n * not explicitly defined in our types. This allows developers to use new\n * API features without waiting for library updates.\n *\n * @param request - The unified provider protocol request\n * @param modelId - The xAI model identifier\n * @returns The transformed xAI Responses API request body\n */\nexport function transformRequest(\n request: LLMRequest<XAIResponsesParams>,\n modelId: string\n): XAIResponsesRequest {\n const params = request.params ?? ({} as XAIResponsesParams);\n\n // Extract tools before spreading params to avoid including it in the request\n const { tools: builtInTools, ...restParams } = params;\n\n const xaiRequest: XAIResponsesRequest = {\n ...restParams,\n model: modelId,\n input: transformInputItems(request.messages, request.system),\n };\n\n // Build tools array: function tools from request.tools + built-in agentic tools from params\n const functionTools: XAIResponsesTool[] = request.tools?.map(transformTool) ?? [];\n const allTools: Array<XAIResponsesTool | XAIBuiltInTool> = [\n ...functionTools,\n ...(builtInTools ?? []),\n ];\n\n if (allTools.length > 0) {\n xaiRequest.tools = allTools;\n }\n\n if (request.structure) {\n const schema: Record<string, unknown> = {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n ...(request.structure.additionalProperties !== undefined\n ? { additionalProperties: request.structure.additionalProperties }\n : { additionalProperties: false }),\n };\n if (request.structure.description) {\n schema.description = request.structure.description;\n }\n\n xaiRequest.text = {\n format: {\n type: 'json_schema',\n name: 'json_response',\n description: request.structure.description,\n schema,\n strict: true,\n },\n };\n }\n\n return xaiRequest;\n}\n\n/**\n * Normalizes system prompt to string.\n * Converts array format to concatenated string for providers that only support strings.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Transforms UPP messages to Responses API input items.\n *\n * @param messages - The array of UPP messages\n * @param system - Optional system prompt (string or array, normalized to string)\n * @returns Array of input items or a simple string for single user messages\n */\nfunction transformInputItems(\n messages: Message[],\n system?: string | unknown[]\n): XAIResponsesInputItem[] | string {\n const result: XAIResponsesInputItem[] = [];\n const normalizedSystem = normalizeSystem(system);\n\n if (normalizedSystem) {\n result.push({\n type: 'message',\n role: 'system',\n content: normalizedSystem,\n });\n }\n\n for (const message of messages) {\n const items = transformMessage(message);\n result.push(...items);\n }\n\n if (result.length === 1 && result[0]?.type === 'message') {\n const item = result[0] as { role?: string; content?: string | unknown[] };\n if (item.role === 'user' && typeof item.content === 'string') {\n return item.content;\n }\n }\n\n return result;\n}\n\n/**\n * Filters content blocks to only those with a valid type property.\n *\n * @param content - Array of content blocks\n * @returns Filtered array with only valid content blocks\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a single UPP message to xAI Responses API input items.\n *\n * A single message may produce multiple input items (e.g., assistant message\n * followed by function_call items for tool calls).\n *\n * @param message - The UPP message to transform\n * @returns Array of xAI Responses API input items\n */\nfunction transformMessage(message: Message): XAIResponsesInputItem[] {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n if (validContent.length === 1 && validContent[0]?.type === 'text') {\n return [\n {\n type: 'message',\n role: 'user',\n content: (validContent[0] as TextBlock).text,\n },\n ];\n }\n return [\n {\n type: 'message',\n role: 'user',\n content: validContent.map(transformContentPart),\n },\n ];\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const items: XAIResponsesInputItem[] = [];\n\n const textContent = validContent\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join('\\n\\n');\n\n if (textContent) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: textContent,\n });\n }\n\n const xaiMeta = message.metadata?.xai as\n | {\n functionCallItems?: Array<{ id: string; call_id: string; name: string; arguments: string }>;\n reasoningEncryptedContent?: string;\n }\n | undefined;\n const functionCallItems = xaiMeta?.functionCallItems;\n\n // Forward reasoning content for multi-turn context preservation (must use original ID)\n if (xaiMeta?.reasoningEncryptedContent) {\n try {\n const reasoningData = JSON.parse(xaiMeta.reasoningEncryptedContent) as {\n id: string;\n summary?: Array<{ type: 'summary_text'; text: string }>;\n encrypted_content?: string;\n };\n if (reasoningData.encrypted_content) {\n const reasoningItem: XAIResponsesReasoningInputItem = {\n type: 'reasoning',\n id: reasoningData.id,\n encrypted_content: reasoningData.encrypted_content,\n };\n if (Array.isArray(reasoningData.summary)) {\n reasoningItem.summary = reasoningData.summary;\n }\n items.push(reasoningItem);\n }\n } catch {\n // Invalid JSON - skip reasoning item\n }\n }\n\n if (functionCallItems && functionCallItems.length > 0) {\n for (const fc of functionCallItems) {\n items.push({\n type: 'function_call',\n id: fc.id,\n call_id: fc.call_id,\n name: fc.name,\n arguments: fc.arguments,\n });\n }\n } else if (message.toolCalls && message.toolCalls.length > 0) {\n for (const call of message.toolCalls) {\n items.push({\n type: 'function_call',\n id: `fc_${call.toolCallId}`,\n call_id: call.toolCallId,\n name: call.toolName,\n arguments: JSON.stringify(call.arguments),\n });\n }\n }\n\n return items;\n }\n\n if (isToolResultMessage(message)) {\n return message.results.map((result) => ({\n type: 'function_call_output' as const,\n call_id: result.toolCallId,\n output:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n }\n\n return [];\n}\n\n/**\n * Transforms a UPP content block to Responses API content part format.\n *\n * @param block - The content block to transform\n * @returns The xAI-formatted content part\n * @throws Error if the content type is unsupported\n */\nfunction transformContentPart(block: ContentBlock): XAIResponsesContentPart {\n switch (block.type) {\n case 'text':\n return { type: 'input_text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n if (imageBlock.source.type === 'base64') {\n return {\n type: 'input_image',\n image_url: `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`,\n };\n }\n\n if (imageBlock.source.type === 'url') {\n return {\n type: 'input_image',\n image_url: imageBlock.source.url,\n };\n }\n\n if (imageBlock.source.type === 'bytes') {\n const base64 = Buffer.from(imageBlock.source.data).toString('base64');\n return {\n type: 'input_image',\n image_url: `data:${imageBlock.mimeType};base64,${base64}`,\n };\n }\n\n throw new Error('Unknown image source type');\n }\n\n default:\n throw new Error(`Unsupported content type: ${block.type}`);\n }\n}\n\n/**\n * Transforms a UPP tool definition to Responses API format.\n *\n * @param tool - The UPP tool definition\n * @returns The xAI-formatted tool definition\n */\nfunction transformTool(tool: Tool): XAIResponsesTool {\n return {\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n ...(tool.parameters.additionalProperties !== undefined\n ? { additionalProperties: tool.parameters.additionalProperties }\n : {}),\n },\n };\n}\n\n/**\n * Transforms an xAI Responses API response to the UPP LLMResponse format.\n *\n * @param data - The xAI Responses API response\n * @returns The unified provider protocol response\n */\nexport function transformResponse(data: XAIResponsesResponse): LLMResponse {\n const content: AssistantContent[] = [];\n const toolCalls: ToolCall[] = [];\n const functionCallItems: Array<{\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n }> = [];\n let hadRefusal = false;\n let structuredData: unknown;\n let reasoningEncryptedContent: string | undefined;\n\n for (const item of data.output) {\n if (item.type === 'message') {\n const messageItem = item;\n for (const outputContent of messageItem.content) {\n if (outputContent.type === 'output_text') {\n content.push({ type: 'text', text: outputContent.text });\n if (structuredData === undefined) {\n try {\n structuredData = JSON.parse(outputContent.text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n } else if (outputContent.type === 'refusal') {\n content.push({ type: 'text', text: outputContent.refusal });\n hadRefusal = true;\n }\n }\n } else if (item.type === 'function_call') {\n const functionCall = item;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(functionCall.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n toolCalls.push({\n toolCallId: functionCall.call_id,\n toolName: functionCall.name,\n arguments: args,\n });\n functionCallItems.push({\n id: functionCall.id,\n call_id: functionCall.call_id,\n name: functionCall.name,\n arguments: functionCall.arguments,\n });\n } else if (item.type === 'reasoning') {\n const reasoningItem = item as XAIResponsesReasoningOutput;\n // Extract reasoning summary text\n if (reasoningItem.summary) {\n const reasoningText = reasoningItem.summary\n .filter((s): s is { type: 'summary_text'; text: string } => s.type === 'summary_text')\n .map(s => s.text)\n .join('');\n if (reasoningText) {\n content.push({ type: 'reasoning', text: reasoningText });\n }\n }\n // Capture full reasoning item for multi-turn context preservation (must be passed back as-is)\n reasoningEncryptedContent = JSON.stringify({\n id: reasoningItem.id,\n summary: reasoningItem.summary,\n encrypted_content: reasoningItem.encrypted_content,\n });\n }\n }\n\n const responseId = data.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: responseId,\n metadata: {\n xai: {\n model: data.model,\n status: data.status,\n response_id: responseId,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\n citations: data.citations,\n inline_citations: data.inline_citations,\n reasoningEncryptedContent,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n cacheReadTokens: data.usage.input_tokens_details?.cached_tokens ?? 0,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n if (data.status === 'completed') {\n stopReason = toolCalls.length > 0 ? 'tool_use' : 'end_turn';\n } else if (data.status === 'incomplete') {\n stopReason = data.incomplete_details?.reason === 'max_output_tokens'\n ? 'max_tokens'\n : 'end_turn';\n } else if (data.status === 'failed') {\n stopReason = 'error';\n }\n if (hadRefusal && stopReason !== 'error') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n\n/**\n * State object for accumulating data during Responses API streaming.\n *\n * This state is progressively updated as stream events arrive and is used\n * to build the final LLMResponse when streaming completes.\n */\nexport interface ResponsesStreamState {\n /** Response identifier */\n id: string;\n /** Model used for generation */\n model: string;\n /** Map of output index to accumulated text content */\n textByIndex: Map<number, string>;\n /** Map of output index to accumulated reasoning content */\n reasoningByIndex: Map<number, string>;\n /** Map of output index to accumulated tool call data */\n toolCalls: Map<\n number,\n { itemId?: string; callId?: string; name?: string; arguments: string }\n >;\n /** Current response status */\n status: string;\n /** Total input tokens */\n inputTokens: number;\n /** Total output tokens */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n /** Whether a refusal message was received */\n hadRefusal: boolean;\n /** Serialized reasoning item for multi-turn context preservation (includes encrypted_content) */\n reasoningEncryptedContent?: string;\n}\n\n/**\n * Creates a new initialized stream state for Responses API streaming.\n *\n * @returns A fresh ResponsesStreamState with default values\n */\nexport function createStreamState(): ResponsesStreamState {\n return {\n id: '',\n model: '',\n textByIndex: new Map(),\n reasoningByIndex: new Map(),\n toolCalls: new Map(),\n status: 'in_progress',\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n hadRefusal: false,\n };\n}\n\n/**\n * Transforms an xAI Responses API stream event to UPP StreamEvents.\n *\n * A single event may produce multiple UPP events. The state object is\n * mutated to accumulate data for the final response.\n *\n * @param event - The xAI Responses API stream event\n * @param state - The mutable stream state to update\n * @returns Array of UPP stream events (may be empty)\n */\nexport function transformStreamEvent(\n event: XAIResponsesStreamEvent,\n state: ResponsesStreamState\n): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n switch (event.type) {\n case 'response.created':\n state.id = event.response.id;\n state.model = event.response.model;\n events.push({ type: StreamEventType.MessageStart, index: 0, delta: {} });\n break;\n\n case 'response.in_progress':\n state.status = 'in_progress';\n break;\n\n case 'response.completed':\n state.status = 'completed';\n if (event.response.usage) {\n state.inputTokens = event.response.usage.input_tokens;\n state.outputTokens = event.response.usage.output_tokens;\n state.cacheReadTokens = event.response.usage.input_tokens_details?.cached_tokens ?? 0;\n }\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n break;\n\n case 'response.failed':\n state.status = 'failed';\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n break;\n\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const functionCall = event.item;\n const existing = state.toolCalls.get(event.output_index) ?? {\n arguments: '',\n };\n existing.itemId = functionCall.id;\n existing.callId = functionCall.call_id;\n existing.name = functionCall.name;\n if (functionCall.arguments) {\n existing.arguments = functionCall.arguments;\n }\n state.toolCalls.set(event.output_index, existing);\n }\n events.push({\n type: StreamEventType.ContentBlockStart,\n index: event.output_index,\n delta: {},\n });\n break;\n\n case 'response.output_item.done':\n if (event.item.type === 'function_call') {\n const functionCall = event.item;\n const existing = state.toolCalls.get(event.output_index) ?? {\n arguments: '',\n };\n existing.itemId = functionCall.id;\n existing.callId = functionCall.call_id;\n existing.name = functionCall.name;\n if (functionCall.arguments) {\n existing.arguments = functionCall.arguments;\n }\n state.toolCalls.set(event.output_index, existing);\n } else if (event.item.type === 'reasoning') {\n // Capture full reasoning item for multi-turn context preservation (must be passed back as-is)\n const reasoningItem = event.item as XAIResponsesReasoningOutput;\n state.reasoningEncryptedContent = JSON.stringify({\n id: reasoningItem.id,\n summary: reasoningItem.summary,\n encrypted_content: reasoningItem.encrypted_content,\n });\n }\n events.push({\n type: StreamEventType.ContentBlockStop,\n index: event.output_index,\n delta: {},\n });\n break;\n\n case 'response.output_text.delta': {\n const currentText = state.textByIndex.get(event.output_index) ?? '';\n state.textByIndex.set(event.output_index, currentText + event.delta);\n events.push({\n type: StreamEventType.TextDelta,\n index: event.output_index,\n delta: { text: event.delta },\n });\n break;\n }\n\n case 'response.output_text.done':\n state.textByIndex.set(event.output_index, event.text);\n break;\n\n case 'response.refusal.delta': {\n state.hadRefusal = true;\n const currentRefusal = state.textByIndex.get(event.output_index) ?? '';\n state.textByIndex.set(event.output_index, currentRefusal + event.delta);\n events.push({\n type: StreamEventType.TextDelta,\n index: event.output_index,\n delta: { text: event.delta },\n });\n break;\n }\n\n case 'response.refusal.done':\n state.hadRefusal = true;\n state.textByIndex.set(event.output_index, event.refusal);\n break;\n\n case 'response.function_call_arguments.delta': {\n let toolCall = state.toolCalls.get(event.output_index);\n if (!toolCall) {\n toolCall = { arguments: '' };\n state.toolCalls.set(event.output_index, toolCall);\n }\n if (event.item_id && !toolCall.itemId) {\n toolCall.itemId = event.item_id;\n }\n if (event.call_id && !toolCall.callId) {\n toolCall.callId = event.call_id;\n }\n toolCall.arguments += event.delta;\n events.push({\n type: StreamEventType.ToolCallDelta,\n index: event.output_index,\n delta: {\n toolCallId: toolCall.callId ?? toolCall.itemId ?? '',\n toolName: toolCall.name,\n argumentsJson: event.delta,\n },\n });\n break;\n }\n\n case 'response.function_call_arguments.done': {\n let toolCall = state.toolCalls.get(event.output_index);\n if (!toolCall) {\n toolCall = { arguments: '' };\n state.toolCalls.set(event.output_index, toolCall);\n }\n if (event.item_id) {\n toolCall.itemId = event.item_id;\n }\n if (event.call_id) {\n toolCall.callId = event.call_id;\n }\n toolCall.name = event.name;\n toolCall.arguments = event.arguments;\n break;\n }\n\n case 'response.reasoning_summary_text.delta': {\n const currentReasoning = state.reasoningByIndex.get(event.output_index) ?? '';\n state.reasoningByIndex.set(event.output_index, currentReasoning + event.delta);\n events.push({\n type: StreamEventType.ReasoningDelta,\n index: event.output_index,\n delta: { text: event.delta },\n });\n break;\n }\n\n case 'response.reasoning_summary_text.done':\n state.reasoningByIndex.set(event.output_index, event.text);\n break;\n\n case 'error':\n break;\n\n default:\n break;\n }\n\n return events;\n}\n\n/**\n * Builds the final LLMResponse from accumulated Responses API stream state.\n *\n * Called when streaming is complete to construct the unified response\n * from all the data accumulated during streaming.\n *\n * @param state - The accumulated stream state\n * @returns The complete LLMResponse\n */\nexport function buildResponseFromState(state: ResponsesStreamState): LLMResponse {\n const content: AssistantContent[] = [];\n let structuredData: unknown;\n\n // Add reasoning content first (in order by index)\n const orderedReasoningEntries = [...state.reasoningByIndex.entries()].sort(\n ([leftIndex], [rightIndex]) => leftIndex - rightIndex\n );\n for (const [, reasoning] of orderedReasoningEntries) {\n if (reasoning) {\n content.push({ type: 'reasoning', text: reasoning });\n }\n }\n\n // Add text content (in order by index)\n const orderedTextEntries = [...state.textByIndex.entries()].sort(\n ([leftIndex], [rightIndex]) => leftIndex - rightIndex\n );\n for (const [, text] of orderedTextEntries) {\n if (text) {\n content.push({ type: 'text', text });\n if (structuredData === undefined) {\n try {\n structuredData = JSON.parse(text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n }\n }\n\n const toolCalls: ToolCall[] = [];\n const functionCallItems: Array<{\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n }> = [];\n for (const [, toolCall] of state.toolCalls) {\n let args: Record<string, unknown> = {};\n if (toolCall.arguments) {\n try {\n args = JSON.parse(toolCall.arguments);\n } catch {\n // Invalid JSON, use empty object\n }\n }\n const itemId = toolCall.itemId ?? '';\n const callId = toolCall.callId ?? toolCall.itemId ?? '';\n const name = toolCall.name ?? '';\n toolCalls.push({\n toolCallId: callId,\n toolName: name,\n arguments: args,\n });\n\n if (itemId && callId && name) {\n functionCallItems.push({\n id: itemId,\n call_id: callId,\n name,\n arguments: toolCall.arguments,\n });\n }\n }\n\n const responseId = state.id || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: responseId,\n metadata: {\n xai: {\n model: state.model,\n status: state.status,\n response_id: responseId,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\n reasoningEncryptedContent: state.reasoningEncryptedContent,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n if (state.status === 'completed') {\n stopReason = toolCalls.length > 0 ? 'tool_use' : 'end_turn';\n } else if (state.status === 'failed') {\n stopReason = 'error';\n }\n if (state.hadRefusal && stopReason !== 'error') {\n stopReason = 'content_filter';\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n","import type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { XAIResponsesParams, XAIResponsesResponse, XAIResponsesStreamEvent, XAIResponseErrorEvent } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.responses.ts';\n\n/** Base URL for the xAI Responses API endpoint. */\nconst XAI_RESPONSES_API_URL = 'https://api.x.ai/v1/responses';\n\n/**\n * Capability declarations for the xAI Responses API.\n * Indicates which features are supported by this OpenAI Responses-compatible API mode.\n */\nconst XAI_RESPONSES_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: false,\n audioInput: false,\n};\n\n/**\n * Creates an LLM handler for the xAI Responses API (OpenAI Responses-compatible).\n *\n * The Responses API provides stateful conversation support, allowing you to\n * continue conversations across requests using `previous_response_id`. This\n * is useful for building applications that need to maintain context over\n * extended interactions.\n *\n * @returns An LLM handler configured for the Responses API\n *\n * @example\n * ```typescript\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * // Initial request\n * const model = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * max_output_tokens: 1000,\n * store: true, // Enable stateful storage\n * }\n * });\n *\n * const turn = await model.generate('Hello!');\n * const responseId = turn.response.message.metadata?.xai?.response_id;\n *\n * // Continue the conversation\n * const continuedModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * previous_response_id: responseId,\n * }\n * });\n * ```\n *\n * @see {@link createCompletionsLLMHandler} for OpenAI Chat Completions mode\n * @see {@link createMessagesLLMHandler} for Anthropic-compatible mode\n */\nexport function createResponsesLLMHandler(): LLMHandler<XAIResponsesParams> {\n let providerRef: LLMProvider<XAIResponsesParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<XAIResponsesParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<XAIResponsesParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<XAIResponsesParams> = {\n modelId,\n capabilities: XAI_RESPONSES_CAPABILITIES,\n\n get provider(): LLMProvider<XAIResponsesParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<XAIResponsesParams>): Promise<LLMResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_RESPONSES_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n const data = await parseJsonResponse<XAIResponsesResponse>(response, 'xai', 'llm');\n\n // Check for error in response\n if (data.status === 'failed') {\n const message = data.error?.message ?? 'Provider returned a failed response.';\n throw new UPPError(\n message,\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n }\n\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<XAIResponsesParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_RESPONSES_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'xai', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Skip [DONE] marker\n if (data === '[DONE]') {\n continue;\n }\n\n // Check for xAI error event\n if (typeof data === 'object' && data !== null) {\n const event = data as XAIResponsesStreamEvent;\n\n // Check for error event\n if (event.type === 'error') {\n const errorEvent = event as XAIResponseErrorEvent;\n const error = new UPPError(\n errorEvent.error.message,\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvents = transformStreamEvent(event, state);\n for (const uppEvent of uppEvents) {\n yield uppEvent;\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","import type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, ReasoningBlock, ImageBlock, AssistantContent } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n XAIMessagesParams,\n XAIMessagesRequest,\n XAIMessagesMessage,\n XAIMessagesContent,\n XAIMessagesTool,\n XAIMessagesResponse,\n XAIMessagesStreamEvent,\n} from './types.ts';\n\n/**\n * Normalizes system prompt to string.\n * Converts array format to concatenated string since xAI Messages API only supports string.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Transforms a UPP LLM request to the xAI Messages API format (Anthropic-compatible).\n *\n * All params are spread directly to enable pass-through of xAI API fields\n * not explicitly defined in our types.\n *\n * @param request - The unified provider protocol request\n * @param modelId - The xAI model identifier\n * @returns The transformed xAI Messages API request body\n */\nexport function transformRequest(\n request: LLMRequest<XAIMessagesParams>,\n modelId: string\n): XAIMessagesRequest {\n const params = request.params ?? ({} as XAIMessagesParams);\n const normalizedSystem = normalizeSystem(request.system);\n\n const xaiRequest: XAIMessagesRequest = {\n ...params,\n model: modelId,\n messages: request.messages.map(transformMessage),\n };\n\n if (normalizedSystem) {\n xaiRequest.system = normalizedSystem;\n }\n\n if (request.tools && request.tools.length > 0) {\n xaiRequest.tools = request.tools.map(transformTool);\n if (!xaiRequest.tool_choice) {\n xaiRequest.tool_choice = { type: 'auto' };\n }\n }\n\n if (request.structure) {\n const structuredTool: XAIMessagesTool = {\n name: 'json_response',\n description: 'Return the response in the specified JSON format. You MUST use this tool to provide your response.',\n input_schema: {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n },\n };\n\n xaiRequest.tools = [...(xaiRequest.tools ?? []), structuredTool];\n xaiRequest.tool_choice = { type: 'tool', name: 'json_response' };\n }\n\n return xaiRequest;\n}\n\n/**\n * Filters content blocks to only those with a valid type property.\n *\n * @param content - Array of content blocks\n * @returns Filtered array with only valid content blocks\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a single UPP message to xAI Messages API format.\n *\n * @param message - The UPP message to transform\n * @returns The xAI-formatted message\n * @throws Error if the message type is unknown\n */\nfunction transformMessage(message: Message): XAIMessagesMessage {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n return {\n role: 'user',\n content: validContent.map(transformContentBlock),\n };\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const content: XAIMessagesContent[] = [];\n\n // Check for thinking signature in metadata (for multi-turn context)\n const xaiMeta = message.metadata?.xai as {\n thinkingSignature?: string;\n } | undefined;\n\n // Add reasoning blocks as thinking content with signature if available\n for (const block of validContent) {\n if (block.type === 'reasoning') {\n content.push({\n type: 'thinking',\n thinking: (block as ReasoningBlock).text,\n signature: xaiMeta?.thinkingSignature,\n });\n } else {\n content.push(transformContentBlock(block));\n }\n }\n\n if (message.toolCalls) {\n for (const call of message.toolCalls) {\n content.push({\n type: 'tool_use',\n id: call.toolCallId,\n name: call.toolName,\n input: call.arguments,\n });\n }\n }\n\n if (content.length === 0) {\n content.push({ type: 'text', text: '' });\n }\n\n return {\n role: 'assistant',\n content,\n };\n }\n\n if (isToolResultMessage(message)) {\n return {\n role: 'user',\n content: message.results.map((result) => ({\n type: 'tool_result' as const,\n tool_use_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n is_error: result.isError,\n })),\n };\n }\n\n throw new Error(`Unknown message type: ${message.type}`);\n}\n\n/**\n * Transforms a UPP content block to xAI Messages API format.\n *\n * @param block - The content block to transform\n * @returns The xAI-formatted content block\n * @throws Error if the content type is unsupported\n */\nfunction transformContentBlock(block: ContentBlock): XAIMessagesContent {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n if (imageBlock.source.type === 'base64') {\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: imageBlock.mimeType,\n data: imageBlock.source.data,\n },\n };\n }\n if (imageBlock.source.type === 'url') {\n return {\n type: 'image',\n source: {\n type: 'url',\n url: imageBlock.source.url,\n },\n };\n }\n if (imageBlock.source.type === 'bytes') {\n const base64 = Buffer.from(imageBlock.source.data).toString('base64');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: imageBlock.mimeType,\n data: base64,\n },\n };\n }\n throw new Error(`Unknown image source type`);\n }\n\n default:\n throw new Error(`Unsupported content type: ${block.type}`);\n }\n}\n\n/**\n * Transforms a UPP tool definition to xAI Messages API format.\n *\n * @param tool - The UPP tool definition\n * @returns The xAI-formatted tool definition\n */\nfunction transformTool(tool: Tool): XAIMessagesTool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n },\n };\n}\n\n/**\n * Transforms an xAI Messages API response to the UPP LLMResponse format.\n *\n * @param data - The xAI Messages API response\n * @returns The unified provider protocol response\n */\nexport function transformResponse(data: XAIMessagesResponse): LLMResponse {\n const content: AssistantContent[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n let thinkingSignature: string | undefined;\n\n for (const block of data.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text });\n } else if (block.type === 'thinking') {\n // Handle extended thinking content\n content.push({ type: 'reasoning', text: block.thinking });\n // Store signature for multi-turn context preservation\n if (block.signature) {\n thinkingSignature = block.signature;\n }\n } else if (block.type === 'tool_use') {\n if (block.name === 'json_response') {\n structuredData = block.input;\n }\n toolCalls.push({\n toolCallId: block.id,\n toolName: block.name,\n arguments: block.input,\n });\n }\n }\n\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id,\n metadata: {\n xai: {\n stop_reason: data.stop_reason,\n stop_sequence: data.stop_sequence,\n model: data.model,\n // Store thinking signature for multi-turn context\n thinkingSignature,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n cacheReadTokens: data.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: data.usage.cache_creation_input_tokens ?? 0,\n };\n\n return {\n message,\n usage,\n stopReason: data.stop_reason ?? 'end_turn',\n data: structuredData,\n };\n}\n\n/**\n * State object for accumulating data during Messages API streaming.\n *\n * This state is progressively updated as stream events arrive and is used\n * to build the final LLMResponse when streaming completes.\n */\nexport interface MessagesStreamState {\n /** Message identifier */\n messageId: string;\n /** Model used for generation */\n model: string;\n /** Accumulated content blocks */\n content: Array<{\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: string;\n thinking?: string;\n signature?: string;\n }>;\n /** Final stop reason */\n stopReason: string | null;\n /** Total input tokens */\n inputTokens: number;\n /** Total output tokens */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n /** Number of tokens written to cache */\n cacheWriteTokens: number;\n /** Current content block index (xAI may omit index in delta events) */\n currentIndex: number;\n}\n\n/**\n * Creates a new initialized stream state for Messages API streaming.\n *\n * @returns A fresh MessagesStreamState with default values\n */\nexport function createStreamState(): MessagesStreamState {\n return {\n messageId: '',\n model: '',\n content: [],\n stopReason: null,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n currentIndex: 0,\n };\n}\n\n/**\n * Transforms an xAI Messages API stream event to a UPP StreamEvent.\n *\n * The state object is mutated to accumulate data for the final response.\n *\n * @param event - The xAI Messages API stream event\n * @param state - The mutable stream state to update\n * @returns A UPP stream event or null for events that don't map to UPP events\n */\nexport function transformStreamEvent(\n event: XAIMessagesStreamEvent,\n state: MessagesStreamState\n): StreamEvent | null {\n switch (event.type) {\n case 'message_start':\n state.messageId = event.message.id;\n state.model = event.message.model;\n state.inputTokens = event.message.usage.input_tokens;\n state.cacheReadTokens = event.message.usage.cache_read_input_tokens ?? 0;\n state.cacheWriteTokens = event.message.usage.cache_creation_input_tokens ?? 0;\n return { type: StreamEventType.MessageStart, index: 0, delta: {} };\n\n case 'content_block_start':\n state.currentIndex = event.index;\n if (event.content_block.type === 'text') {\n state.content[event.index] = { type: 'text', text: '' };\n } else if (event.content_block.type === 'thinking') {\n state.content[event.index] = { type: 'thinking', thinking: '' };\n } else if (event.content_block.type === 'tool_use') {\n state.content[event.index] = {\n type: 'tool_use',\n id: event.content_block.id,\n name: event.content_block.name,\n input: '',\n };\n }\n return { type: StreamEventType.ContentBlockStart, index: event.index, delta: {} };\n\n case 'content_block_delta': {\n const delta = event.delta;\n const index = event.index ?? state.currentIndex;\n if (delta.type === 'text_delta') {\n if (!state.content[index]) {\n state.content[index] = { type: 'text', text: '' };\n }\n state.content[index]!.text =\n (state.content[index]!.text ?? '') + delta.text;\n return {\n type: StreamEventType.TextDelta,\n index: index,\n delta: { text: delta.text },\n };\n }\n if (delta.type === 'input_json_delta') {\n if (!state.content[index]) {\n state.content[index] = { type: 'tool_use', id: '', name: '', input: '' };\n }\n state.content[index]!.input =\n (state.content[index]!.input ?? '') + delta.partial_json;\n return {\n type: StreamEventType.ToolCallDelta,\n index: index,\n delta: {\n argumentsJson: delta.partial_json,\n toolCallId: state.content[index]?.id,\n toolName: state.content[index]?.name,\n },\n };\n }\n if (delta.type === 'thinking_delta') {\n if (!state.content[index]) {\n state.content[index] = { type: 'thinking', thinking: '' };\n }\n state.content[index]!.thinking =\n (state.content[index]!.thinking ?? '') + delta.thinking;\n return {\n type: StreamEventType.ReasoningDelta,\n index: index,\n delta: { text: delta.thinking },\n };\n }\n if (delta.type === 'signature_delta') {\n // Capture thinking block signature for multi-turn context verification\n if (state.content[index]) {\n state.content[index]!.signature = delta.signature;\n }\n return null;\n }\n return null;\n }\n\n case 'content_block_stop':\n return { type: StreamEventType.ContentBlockStop, index: event.index ?? state.currentIndex, delta: {} };\n\n case 'message_delta':\n state.stopReason = event.delta.stop_reason;\n state.outputTokens = event.usage.output_tokens;\n return null;\n\n case 'message_stop':\n return { type: StreamEventType.MessageStop, index: 0, delta: {} };\n\n case 'ping':\n case 'error':\n return null;\n\n default:\n return null;\n }\n}\n\n/**\n * Builds the final LLMResponse from accumulated Messages API stream state.\n *\n * Called when streaming is complete to construct the unified response\n * from all the data accumulated during streaming.\n *\n * @param state - The accumulated stream state\n * @returns The complete LLMResponse\n */\nexport function buildResponseFromState(state: MessagesStreamState): LLMResponse {\n const content: AssistantContent[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n let thinkingSignature: string | undefined;\n\n for (const block of state.content) {\n if (block.type === 'text' && block.text) {\n content.push({ type: 'text', text: block.text });\n } else if (block.type === 'thinking' && block.thinking) {\n content.push({ type: 'reasoning', text: block.thinking });\n // Store signature for multi-turn context preservation\n if (block.signature) {\n thinkingSignature = block.signature;\n }\n } else if (block.type === 'tool_use' && block.id && block.name) {\n let args: Record<string, unknown> = {};\n if (block.input) {\n try {\n args = JSON.parse(block.input);\n } catch {\n // Invalid JSON, use empty object\n }\n }\n if (block.name === 'json_response') {\n structuredData = args;\n }\n toolCalls.push({\n toolCallId: block.id,\n toolName: block.name,\n arguments: args,\n });\n }\n }\n\n const messageId = state.messageId || generateId();\n const message = new AssistantMessage(\n content,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: messageId,\n metadata: {\n xai: {\n stop_reason: state.stopReason,\n model: state.model,\n thinkingSignature,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n };\n\n return {\n message,\n usage,\n stopReason: state.stopReason ?? 'end_turn',\n data: structuredData,\n };\n}\n","import type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { XAIMessagesParams, XAIMessagesResponse, XAIMessagesStreamEvent } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.messages.ts';\n\n/** Base URL for the xAI Messages API endpoint. */\nconst XAI_MESSAGES_API_URL = 'https://api.x.ai/v1/messages';\n\n/**\n * Capability declarations for the xAI Messages API.\n * Indicates which features are supported by this Anthropic-compatible API mode.\n */\nconst XAI_MESSAGES_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: false,\n audioInput: false,\n};\n\n/**\n * Creates an LLM handler for the xAI Messages API (Anthropic-compatible).\n *\n * The Messages API provides compatibility with Anthropic's Messages API,\n * making it easy for developers migrating from Claude to use xAI's Grok models\n * with minimal code changes.\n *\n * @returns An LLM handler configured for the Messages API\n *\n * @example\n * ```typescript\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * const model = llm({\n * model: xai('grok-4', { api: 'messages' }),\n * params: {\n * max_tokens: 1000,\n * thinking: { type: 'enabled', budget_tokens: 500 }, // Extended thinking\n * }\n * });\n *\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n *\n * @see {@link createCompletionsLLMHandler} for OpenAI-compatible mode\n * @see {@link createResponsesLLMHandler} for stateful Responses API mode\n */\nexport function createMessagesLLMHandler(): LLMHandler<XAIMessagesParams> {\n let providerRef: LLMProvider<XAIMessagesParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<XAIMessagesParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<XAIMessagesParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<XAIMessagesParams> = {\n modelId,\n capabilities: XAI_MESSAGES_CAPABILITIES,\n\n get provider(): LLMProvider<XAIMessagesParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<XAIMessagesParams>): Promise<LLMResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_MESSAGES_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n const data = await parseJsonResponse<XAIMessagesResponse>(response, 'xai', 'llm');\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<XAIMessagesParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'llm'\n );\n\n const baseUrl = request.config.baseUrl ?? XAI_MESSAGES_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'xai',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'xai', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Check for xAI error event\n if (typeof data === 'object' && data !== null && 'type' in data) {\n const event = data as XAIMessagesStreamEvent;\n\n if (event.type === 'error') {\n const error = new UPPError(\n event.error.message,\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvent = transformStreamEvent(event, state);\n if (uppEvent) {\n yield uppEvent;\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview xAI Image Generation API Handler\n *\n * This module implements the image handler for xAI's Image Generation API (Aurora).\n * Supports the grok-2-image-1212 model.\n *\n * @see {@link https://docs.x.ai/docs/image-generation xAI Image Generation Reference}\n * @module providers/xai/image\n */\n\nimport type { ImageProvider, ImageHandler } from '../../types/provider.ts';\nimport type {\n BoundImageModel,\n ImageRequest,\n ImageResponse,\n ImageCapabilities,\n GeneratedImage,\n} from '../../types/image.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch } from '../../http/fetch.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { Image } from '../../core/media/Image.ts';\n\nconst XAI_IMAGES_API_URL = 'https://api.x.ai/v1/images/generations';\n\n/**\n * xAI image generation parameters.\n * Passed through unchanged to the API.\n *\n * Note: xAI does NOT support negative_prompt or seed parameters.\n */\nexport interface XAIImageParams {\n /** Number of images to generate (1-10) */\n n?: number;\n /** Response format */\n response_format?: 'url' | 'b64_json';\n /** User identifier */\n user?: string;\n}\n\n/**\n * xAI image generation API response structure.\n */\ninterface XAIImagesResponse {\n created: number;\n data: Array<{\n url?: string;\n b64_json?: string;\n revised_prompt?: string;\n }>;\n}\n\n/**\n * Determines capabilities based on model ID.\n */\nfunction getCapabilities(modelId: string): ImageCapabilities {\n return {\n generate: true,\n streaming: false,\n edit: false,\n maxImages: 10,\n };\n}\n\n/**\n * Creates an image handler for xAI's Image Generation API.\n *\n * @returns An image handler configured for xAI\n *\n * @example\n * ```typescript\n * const handler = createImageHandler();\n * const model = handler.bind('grok-2-image-1212');\n *\n * const response = await model.generate({\n * prompt: 'A sunset over mountains',\n * config: { apiKey: 'xai-...' },\n * params: { n: 1 }\n * });\n * ```\n */\nexport function createImageHandler(): ImageHandler<XAIImageParams> {\n let providerRef: ImageProvider<XAIImageParams> | null = null;\n\n return {\n _setProvider(provider: ImageProvider<XAIImageParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundImageModel<XAIImageParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'xai',\n ModalityType.Image\n );\n }\n\n const capabilities = getCapabilities(modelId);\n\n const model: BoundImageModel<XAIImageParams> = {\n modelId,\n capabilities,\n\n get provider(): ImageProvider<XAIImageParams> {\n return providerRef!;\n },\n\n async generate(request: ImageRequest<XAIImageParams>): Promise<ImageResponse> {\n return executeGenerate(modelId, request);\n },\n };\n\n return model;\n },\n };\n}\n\n/**\n * Execute a non-streaming image generation request.\n */\nasync function executeGenerate(\n modelId: string,\n request: ImageRequest<XAIImageParams>\n): Promise<ImageResponse> {\n const apiKey = await resolveApiKey(\n request.config,\n 'XAI_API_KEY',\n 'xai',\n 'image'\n );\n\n const baseUrl = request.config.baseUrl\n ? `${request.config.baseUrl.replace(/\\/$/, '')}/v1/images/generations`\n : XAI_IMAGES_API_URL;\n\n const body: Record<string, unknown> = {\n model: modelId,\n prompt: request.prompt,\n };\n\n if (request.params) {\n const { n, response_format, user } = request.params;\n if (n !== undefined) body.n = n;\n if (response_format !== undefined) body.response_format = response_format;\n if (user !== undefined) body.user = user;\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(baseUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n }, request.config, 'xai', 'image');\n\n const data = await parseJsonResponse<XAIImagesResponse>(response, 'xai', 'image');\n\n return transformResponse(data);\n}\n\n/**\n * Transform xAI response to ImageResponse.\n */\nfunction transformResponse(data: XAIImagesResponse): ImageResponse {\n const images: GeneratedImage[] = data.data.map((item) => {\n let image: Image;\n if (item.b64_json) {\n image = Image.fromBase64(item.b64_json, 'image/jpeg');\n } else if (item.url) {\n image = Image.fromUrl(item.url, 'image/jpeg');\n } else {\n throw new UPPError(\n 'No image data in response',\n ErrorCode.ProviderError,\n 'xai',\n ModalityType.Image\n );\n }\n\n return {\n image,\n // Per-image metadata namespaced under provider (Spec 15.4)\n metadata: item.revised_prompt\n ? { xai: { revised_prompt: item.revised_prompt } }\n : undefined,\n };\n });\n\n return {\n images,\n usage: {\n imagesGenerated: images.length,\n },\n };\n}\n","/**\n * xAI Chat Completions API parameters (OpenAI-compatible).\n *\n * These parameters are passed through to the xAI `/v1/chat/completions` endpoint.\n * The API is fully compatible with OpenAI's Chat Completions API, allowing seamless\n * migration between providers.\n *\n * @example\n * ```typescript\n * const params: XAICompletionsParams = {\n * max_tokens: 1000,\n * temperature: 0.7,\n * reasoning_effort: 'high', // Grok 3 Mini only\n * };\n * ```\n *\n * @see {@link XAIResponsesParams} for Responses API parameters\n * @see {@link XAIMessagesParams} for Messages API parameters\n */\nexport interface XAICompletionsParams {\n /** Maximum number of tokens to generate */\n max_tokens?: number;\n\n /** Maximum completion tokens */\n max_completion_tokens?: number;\n\n /** Temperature for randomness (0.0 - 2.0) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0) */\n top_p?: number;\n\n /** Frequency penalty (-2.0 - 2.0) */\n frequency_penalty?: number;\n\n /** Presence penalty (-2.0 - 2.0) */\n presence_penalty?: number;\n\n /** Custom stop sequences */\n stop?: string | string[];\n\n /** Number of completions to generate */\n n?: number;\n\n /** Enable logprobs */\n logprobs?: boolean;\n\n /** Number of top logprobs to return (0-20) */\n top_logprobs?: number;\n\n /** Seed for deterministic sampling */\n seed?: number;\n\n /** User identifier for abuse detection */\n user?: string;\n\n /** Logit bias map */\n logit_bias?: Record<string, number>;\n\n /** Whether to enable parallel tool calls */\n parallel_tool_calls?: boolean;\n\n /**\n * Reasoning effort for Grok 3 Mini models\n * Note: Only 'low' and 'high' are supported by xAI\n */\n reasoning_effort?: 'low' | 'high';\n\n /** Store completion */\n store?: boolean;\n\n /** Metadata key-value pairs */\n metadata?: Record<string, string>;\n\n /** Response format for structured output */\n response_format?: XAIResponseFormat;\n}\n\n/**\n * xAI Responses API parameters (OpenAI Responses-compatible).\n *\n * These parameters are passed through to the xAI `/v1/responses` endpoint.\n * The Responses API provides stateful conversation support with features like\n * `previous_response_id` for continuing conversations across requests.\n *\n * @example\n * ```typescript\n * const params: XAIResponsesParams = {\n * max_output_tokens: 1000,\n * temperature: 0.7,\n * store: true, // Enable stateful storage\n * previous_response_id: 'resp_123...', // Continue previous conversation\n * };\n * ```\n *\n * @see {@link XAICompletionsParams} for Chat Completions API parameters\n * @see {@link XAIMessagesParams} for Messages API parameters\n */\nexport interface XAIResponsesParams {\n /** Maximum output tokens */\n max_output_tokens?: number;\n\n /** Temperature for randomness (0.0 - 2.0) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0) */\n top_p?: number;\n\n /** Whether to enable parallel tool calls */\n parallel_tool_calls?: boolean;\n\n /** Reasoning configuration */\n reasoning?: {\n effort?: 'low' | 'high';\n /** Include encrypted reasoning content for continuation */\n encrypted_content?: boolean;\n };\n\n /** Truncation strategy */\n truncation?: 'auto' | 'disabled';\n\n /** Fields to include in output */\n include?: string[];\n\n /** Continue from a previous response */\n previous_response_id?: string;\n\n /** Store response for continuation */\n store?: boolean;\n\n /** Store messages on xAI servers (default: true) */\n store_messages?: boolean;\n\n /** Metadata key-value pairs */\n metadata?: Record<string, string>;\n\n /**\n * Built-in agentic tools for server-side execution.\n *\n * Use the tool helper constructors from the `tools` namespace:\n * - `tools.webSearch()` - Web search capability\n * - `tools.xSearch()` - X (Twitter) search capability\n * - `tools.codeExecution()` - Python code execution\n * - `tools.fileSearch()` - Document/collections search\n * - `tools.mcp()` - Remote MCP server connection\n *\n * Note: Only available via the Responses API (`api: 'responses'`).\n *\n * @example\n * ```typescript\n * import { xai, tools } from 'provider-protocol/xai';\n *\n * const model = llm({\n * model: xai('grok-4-1-fast', { api: 'responses' }),\n * params: {\n * tools: [\n * tools.webSearch(),\n * tools.xSearch({ from_date: '2025-01-01' }),\n * tools.codeExecution(),\n * ],\n * },\n * });\n * ```\n */\n tools?: XAIBuiltInTool[];\n\n /**\n * Maximum agent reasoning turns.\n * Limits the number of assistant turns, not individual tool calls.\n */\n max_turns?: number;\n}\n\n/**\n * xAI Messages API parameters (Anthropic-compatible).\n *\n * These parameters are passed through to the xAI `/v1/messages` endpoint.\n * The API is compatible with Anthropic's Messages API, allowing developers\n * migrating from Anthropic to use familiar patterns.\n *\n * @example\n * ```typescript\n * const params: XAIMessagesParams = {\n * max_tokens: 1000,\n * temperature: 0.7,\n * thinking: { type: 'enabled', budget_tokens: 500 }, // Extended thinking\n * };\n * ```\n *\n * @see {@link XAICompletionsParams} for Chat Completions API parameters\n * @see {@link XAIResponsesParams} for Responses API parameters\n */\nexport interface XAIMessagesParams {\n /** Maximum number of tokens to generate */\n max_tokens?: number;\n\n /** Temperature for randomness (0.0 - 1.0) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0) */\n top_p?: number;\n\n /** Top-k sampling */\n top_k?: number;\n\n /** Custom stop sequences */\n stop_sequences?: string[];\n\n /** Metadata for the request */\n metadata?: {\n user_id?: string;\n };\n\n /** Extended thinking configuration */\n thinking?: {\n type: 'enabled';\n budget_tokens: number;\n };\n\n /**\n * Tool selection strategy.\n *\n * - `auto`: Model decides when to use tools\n * - `any`: Model must use at least one tool\n * - `tool`: Model must use the specific tool named in `name`\n */\n tool_choice?: { type: 'auto' | 'any' | 'tool'; name?: string };\n}\n\n/**\n * API mode selector for the xAI provider.\n *\n * xAI supports three distinct API modes, each with different capabilities:\n * - `completions`: OpenAI Chat Completions compatible (recommended, default)\n * - `responses`: OpenAI Responses compatible with stateful conversations\n * - `messages`: Anthropic Messages compatible for easy migration\n */\nexport type XAIAPIMode = 'completions' | 'responses' | 'messages';\n\n/**\n * Options for configuring an xAI model reference.\n */\nexport interface XAIModelOptions {\n /** The API mode to use for this model */\n api?: XAIAPIMode;\n}\n\n/**\n * A reference to an xAI model with optional configuration.\n */\nexport interface XAIModelReference {\n /** The xAI model identifier (e.g., 'grok-4', 'grok-3-mini') */\n modelId: string;\n /** Optional model-specific options */\n options?: XAIModelOptions;\n}\n\n/**\n * Configuration options for the xAI provider.\n */\nexport interface XAIConfig {\n /** The API mode to use (defaults to 'completions') */\n api?: XAIAPIMode;\n}\n\n// ============================================\n// Built-in Agentic Tools (Responses API)\n// ============================================\n\n/**\n * Web search tool for real-time web information retrieval.\n *\n * Enables Grok to search the web for up-to-date information.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAIWebSearchTool = {\n * type: 'web_search',\n * allowed_domains: ['wikipedia.org', 'github.com'],\n * };\n * ```\n */\nexport interface XAIWebSearchTool {\n /** Tool type identifier */\n type: 'web_search';\n /** Restrict to specific domains (max 5, mutually exclusive with excluded_domains) */\n allowed_domains?: string[];\n /** Exclude specific domains (max 5, mutually exclusive with allowed_domains) */\n excluded_domains?: string[];\n /** Enable image analysis from search results */\n enable_image_understanding?: boolean;\n}\n\n/**\n * X (Twitter) search tool for social media content.\n *\n * Enables Grok to search X posts and profiles in real-time.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAIXSearchTool = {\n * type: 'x_search',\n * allowed_x_handles: ['elonmusk', 'xai'],\n * from_date: '2025-01-01',\n * };\n * ```\n */\nexport interface XAIXSearchTool {\n /** Tool type identifier */\n type: 'x_search';\n /** Limit to specific X handles (max 10, mutually exclusive with excluded_x_handles) */\n allowed_x_handles?: string[];\n /** Exclude specific X handles (max 10, \"grok\" excluded by default) */\n excluded_x_handles?: string[];\n /** Start date filter (YYYY-MM-DD) */\n from_date?: string;\n /** End date filter (YYYY-MM-DD) */\n to_date?: string;\n /** Enable image analysis in posts */\n enable_image_understanding?: boolean;\n /** Enable video analysis in posts */\n enable_video_understanding?: boolean;\n}\n\n/**\n * Code execution tool for Python in a sandbox.\n *\n * Enables Grok to write and execute Python code in a secure environment.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAICodeExecutionTool = {\n * type: 'code_interpreter',\n * };\n * ```\n */\nexport interface XAICodeExecutionTool {\n /** Tool type identifier */\n type: 'code_interpreter';\n}\n\n/**\n * File/collections search tool for document retrieval.\n *\n * Enables Grok to search through uploaded document collections.\n * Pricing: $2.50 per 1,000 successful tool invocations.\n *\n * @example\n * ```typescript\n * const tool: XAIFileSearchTool = {\n * type: 'file_search',\n * vector_store_ids: ['vs_abc123'],\n * max_num_results: 10,\n * };\n * ```\n */\nexport interface XAIFileSearchTool {\n /** Tool type identifier */\n type: 'file_search';\n /** Collection/vector store IDs to search */\n vector_store_ids: string[];\n /** Maximum results to return */\n max_num_results?: number;\n /** Retrieval mode configuration */\n retrieval_mode?: {\n type: 'keyword' | 'semantic' | 'hybrid';\n };\n}\n\n/**\n * Remote MCP server tool configuration.\n *\n * Enables Grok to connect to external Model Context Protocol servers.\n * Pricing: Token-based only (no per-invocation charge).\n *\n * @example\n * ```typescript\n * const tool: XAIMcpTool = {\n * type: 'mcp',\n * server_url: 'https://my-mcp-server.com/sse',\n * server_label: 'my_tools',\n * };\n * ```\n */\nexport interface XAIMcpTool {\n /** Tool type identifier */\n type: 'mcp';\n /** MCP server URL (HTTP Streaming/SSE only) */\n server_url: string;\n /** Server label for tool call prefixing */\n server_label?: string;\n /** Description of server capabilities */\n server_description?: string;\n /** Specific tools to enable (empty = all available) */\n allowed_tool_names?: string[];\n /** Authentication token */\n authorization?: string;\n /** Custom request headers */\n extra_headers?: Record<string, string>;\n}\n\n/**\n * Union type for all xAI built-in tools.\n *\n * These tools are only available via the Responses API (`api: 'responses'`).\n * They run server-side and provide agentic capabilities.\n */\nexport type XAIBuiltInTool =\n | XAIWebSearchTool\n | XAIXSearchTool\n | XAICodeExecutionTool\n | XAIFileSearchTool\n | XAIMcpTool;\n\n/**\n * Server-side tool usage tracking returned in responses.\n */\nexport interface XAIServerSideToolUsage {\n /** Number of successful web searches */\n web_search?: number;\n /** Number of successful X searches */\n x_search?: number;\n /** Number of successful code executions */\n code_execution?: number;\n /** Number of successful file searches */\n file_search?: number;\n}\n\n// ============================================\n// Tool Helper Constructors\n// ============================================\n\n/**\n * Creates a web search tool configuration.\n *\n * Enables Grok to search the web for up-to-date information.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @param options - Optional configuration for search behavior\n * @returns A web search tool configuration object\n *\n * @example\n * ```typescript\n * // Basic web search\n * const search = webSearchTool();\n *\n * // With domain restrictions\n * const searchWithDomains = webSearchTool({\n * allowed_domains: ['wikipedia.org', 'github.com'],\n * });\n * ```\n */\nexport function webSearchTool(options?: {\n allowed_domains?: string[];\n excluded_domains?: string[];\n enable_image_understanding?: boolean;\n}): XAIWebSearchTool {\n return {\n type: 'web_search',\n ...options,\n };\n}\n\n/**\n * Creates an X (Twitter) search tool configuration.\n *\n * Enables Grok to search X posts and profiles in real-time.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @param options - Optional configuration for search behavior\n * @returns An X search tool configuration object\n *\n * @example\n * ```typescript\n * // Basic X search\n * const xSearch = xSearchTool();\n *\n * // With handle and date filters\n * const filteredSearch = xSearchTool({\n * allowed_x_handles: ['elonmusk', 'xai'],\n * from_date: '2025-01-01',\n * to_date: '2025-12-31',\n * });\n * ```\n */\nexport function xSearchTool(options?: {\n allowed_x_handles?: string[];\n excluded_x_handles?: string[];\n from_date?: string;\n to_date?: string;\n enable_image_understanding?: boolean;\n enable_video_understanding?: boolean;\n}): XAIXSearchTool {\n return {\n type: 'x_search',\n ...options,\n };\n}\n\n/**\n * Creates a code execution tool configuration.\n *\n * Enables Grok to write and execute Python code in a sandbox.\n * Pricing: $5 per 1,000 successful tool invocations.\n *\n * @returns A code execution tool configuration object\n *\n * @example\n * ```typescript\n * const codeExec = codeExecutionTool();\n * ```\n */\nexport function codeExecutionTool(): XAICodeExecutionTool {\n return {\n type: 'code_interpreter',\n };\n}\n\n/**\n * Creates a file/collections search tool configuration.\n *\n * Enables Grok to search through uploaded document collections.\n * Pricing: $2.50 per 1,000 successful tool invocations.\n *\n * @param options - File search configuration\n * @returns A file search tool configuration object\n *\n * @example\n * ```typescript\n * const fileSearch = fileSearchTool({\n * vector_store_ids: ['vs_abc123'],\n * max_num_results: 10,\n * retrieval_mode: 'hybrid',\n * });\n * ```\n */\nexport function fileSearchTool(options: {\n vector_store_ids: string[];\n max_num_results?: number;\n retrieval_mode?: 'keyword' | 'semantic' | 'hybrid';\n}): XAIFileSearchTool {\n return {\n type: 'file_search',\n vector_store_ids: options.vector_store_ids,\n ...(options.max_num_results !== undefined && { max_num_results: options.max_num_results }),\n ...(options.retrieval_mode && { retrieval_mode: { type: options.retrieval_mode } }),\n };\n}\n\n/**\n * Creates a remote MCP server tool configuration.\n *\n * Enables Grok to connect to external Model Context Protocol servers.\n * Pricing: Token-based only (no per-invocation charge).\n *\n * @param options - MCP server configuration\n * @returns An MCP tool configuration object\n *\n * @example\n * ```typescript\n * const mcp = mcpTool({\n * server_url: 'https://my-mcp-server.com/sse',\n * server_label: 'my_tools',\n * allowed_tool_names: ['get_weather', 'search_db'],\n * });\n * ```\n */\nexport function mcpTool(options: {\n server_url: string;\n server_label?: string;\n server_description?: string;\n allowed_tool_names?: string[];\n authorization?: string;\n extra_headers?: Record<string, string>;\n}): XAIMcpTool {\n return {\n type: 'mcp',\n ...options,\n };\n}\n\n/**\n * Namespace object containing all xAI tool helper constructors.\n *\n * Provides a convenient way to create built-in tool configurations.\n * Note: These tools are only available via the Responses API (`api: 'responses'`).\n *\n * @example\n * ```typescript\n * import { xai, tools } from 'provider-protocol/xai';\n *\n * const model = llm({\n * model: xai('grok-4-1-fast', { api: 'responses' }),\n * params: {\n * tools: [\n * tools.webSearch(),\n * tools.xSearch({ from_date: '2025-01-01' }),\n * tools.codeExecution(),\n * ],\n * include: ['inline_citations', 'code_execution_call_output'],\n * },\n * });\n * ```\n */\nexport const tools = {\n /** Creates a web search tool configuration */\n webSearch: webSearchTool,\n /** Creates an X (Twitter) search tool configuration */\n xSearch: xSearchTool,\n /** Creates a code execution tool configuration */\n codeExecution: codeExecutionTool,\n /** Creates a file/collections search tool configuration */\n fileSearch: fileSearchTool,\n /** Creates a remote MCP server tool configuration */\n mcp: mcpTool,\n};\n\n/**\n * @deprecated Use the specific tool interfaces and the `tools` namespace instead.\n * This basic type is maintained for backwards compatibility.\n */\nexport interface XAIAgentTool {\n /** The type of server-side tool to enable */\n type: 'web_search' | 'x_search' | 'code_execution';\n}\n\n// ============================================\n// Chat Completions API Types (OpenAI-compatible)\n// ============================================\n\n/**\n * Request body for the xAI Chat Completions API.\n *\n * This interface represents the full request structure sent to `/v1/chat/completions`.\n * It follows the OpenAI Chat Completions API specification.\n */\nexport interface XAICompletionsRequest {\n model: string;\n messages: XAICompletionsMessage[];\n temperature?: number;\n top_p?: number;\n n?: number;\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n stop?: string | string[];\n max_tokens?: number;\n max_completion_tokens?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n logit_bias?: Record<string, number>;\n logprobs?: boolean;\n top_logprobs?: number;\n user?: string;\n seed?: number;\n tools?: XAICompletionsTool[];\n tool_choice?: XAIToolChoice;\n parallel_tool_calls?: boolean;\n response_format?: XAIResponseFormat;\n reasoning_effort?: string;\n store?: boolean;\n metadata?: Record<string, string>;\n}\n\n/**\n * Union type for all message roles in the Chat Completions API.\n */\nexport type XAICompletionsMessage =\n | XAISystemMessage\n | XAIUserMessage\n | XAIAssistantMessage\n | XAIToolMessage;\n\n/** System message for setting context and instructions. */\nexport interface XAISystemMessage {\n role: 'system';\n content: string;\n name?: string;\n}\n\n/** User message containing the user's input. */\nexport interface XAIUserMessage {\n role: 'user';\n content: string | XAIUserContent[];\n name?: string;\n}\n\n/** Assistant message containing the model's response. */\nexport interface XAIAssistantMessage {\n role: 'assistant';\n content?: string | null;\n name?: string;\n tool_calls?: XAIToolCall[];\n refusal?: string | null;\n /** Raw reasoning/thinking trace (grok-3-mini only) */\n reasoning_content?: string | null;\n}\n\n/** Tool result message containing the output of a tool call. */\nexport interface XAIToolMessage {\n role: 'tool';\n content: string;\n tool_call_id: string;\n}\n\n/**\n * Union type for content within user messages.\n */\nexport type XAIUserContent = XAITextContent | XAIImageContent;\n\n/** Text content block. */\nexport interface XAITextContent {\n type: 'text';\n text: string;\n}\n\n/** Image content block with URL reference. */\nexport interface XAIImageContent {\n type: 'image_url';\n image_url: {\n /** Image URL (supports data: URLs for base64) */\n url: string;\n /** Image processing detail level */\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\n/**\n * A tool call made by the assistant.\n */\nexport interface XAIToolCall {\n /** Unique identifier for this tool call */\n id: string;\n type: 'function';\n function: {\n /** Name of the function to call */\n name: string;\n /** JSON-encoded function arguments */\n arguments: string;\n };\n}\n\n/**\n * Tool definition for the Chat Completions API.\n */\nexport interface XAICompletionsTool {\n type: 'function';\n function: {\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does */\n description: string;\n /** JSON Schema defining the tool's parameters */\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n /** Enable strict mode for parameter validation */\n strict?: boolean;\n };\n}\n\n/**\n * Controls how the model selects which tools to use.\n *\n * - `'none'`: Never use tools\n * - `'auto'`: Let the model decide when to use tools\n * - `'required'`: Force the model to use at least one tool\n * - `{ type: 'function', function: { name: string } }`: Force a specific tool\n */\nexport type XAIToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\n/**\n * Specifies the output format for structured responses.\n *\n * - `{ type: 'text' }`: Plain text output (default)\n * - `{ type: 'json_object' }`: JSON output with flexible schema\n * - `{ type: 'json_schema', ... }`: JSON output with strict schema validation\n */\nexport type XAIResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n json_schema: {\n name: string;\n description?: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n };\n };\n\n/**\n * Response from the Chat Completions API.\n */\nexport interface XAICompletionsResponse {\n /** Unique response identifier */\n id: string;\n object: 'chat.completion';\n /** Unix timestamp of creation */\n created: number;\n /** Model used for generation */\n model: string;\n /** Generated completion choices */\n choices: XAICompletionsChoice[];\n /** Token usage statistics */\n usage: XAIUsage;\n /** Server-side fingerprint for reproducibility */\n system_fingerprint?: string;\n /** Citation URLs from Live Search */\n citations?: string[];\n /** Inline citations with text and URL */\n inline_citations?: Array<{ text: string; url: string }>;\n}\n\n/** A single completion choice from the API response. */\nexport interface XAICompletionsChoice {\n /** Index of this choice in the choices array */\n index: number;\n /** The generated assistant message */\n message: XAIAssistantMessage;\n /** Reason the model stopped generating */\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n /** Log probabilities for tokens (if requested) */\n logprobs?: XAILogprobs | null;\n}\n\n/** Token log probabilities for debugging and analysis. */\nexport interface XAILogprobs {\n content?: Array<{\n token: string;\n logprob: number;\n bytes?: number[];\n top_logprobs?: Array<{\n token: string;\n logprob: number;\n bytes?: number[];\n }>;\n }>;\n}\n\n/** Token usage statistics for billing and monitoring. */\nexport interface XAIUsage {\n /** Tokens in the prompt */\n prompt_tokens: number;\n /** Tokens in the completion */\n completion_tokens: number;\n /** Total tokens used */\n total_tokens: number;\n /** Breakdown of prompt token types */\n prompt_tokens_details?: {\n cached_tokens?: number;\n audio_tokens?: number;\n };\n /** Breakdown of completion token types */\n completion_tokens_details?: {\n reasoning_tokens?: number;\n audio_tokens?: number;\n };\n}\n\n/**\n * A streaming chunk from the Chat Completions API.\n */\nexport interface XAICompletionsStreamChunk {\n /** Response identifier (same across all chunks) */\n id: string;\n object: 'chat.completion.chunk';\n /** Unix timestamp of creation */\n created: number;\n /** Model used for generation */\n model: string;\n /** Streaming choices with deltas */\n choices: XAICompletionsStreamChoice[];\n /** Token usage (only present in final chunk with stream_options.include_usage) */\n usage?: XAIUsage | null;\n /** Server-side fingerprint */\n system_fingerprint?: string;\n}\n\n/** A streaming choice containing delta updates. */\nexport interface XAICompletionsStreamChoice {\n index: number;\n /** Incremental content update */\n delta: XAICompletionsStreamDelta;\n /** Non-null when generation is complete */\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n logprobs?: XAILogprobs | null;\n}\n\n/** Delta update containing new content. */\nexport interface XAICompletionsStreamDelta {\n role?: 'assistant';\n /** New text content */\n content?: string | null;\n /** Tool call updates */\n tool_calls?: XAIStreamToolCall[];\n /** Refusal message */\n refusal?: string | null;\n /** Reasoning content delta (grok-3-mini only) */\n reasoning_content?: string | null;\n}\n\n/** Streaming tool call with incremental argument updates. */\nexport interface XAIStreamToolCall {\n /** Index within the tool_calls array */\n index: number;\n /** Tool call ID (present in first chunk for this call) */\n id?: string;\n type?: 'function';\n function?: {\n /** Function name (present in first chunk) */\n name?: string;\n /** Incremental JSON argument fragment */\n arguments?: string;\n };\n}\n\n// ============================================\n// Responses API Types (OpenAI Responses-compatible)\n// ============================================\n\n/**\n * Request body for the xAI Responses API.\n *\n * This interface represents the full request structure sent to `/v1/responses`.\n * The Responses API supports stateful conversations via `previous_response_id`.\n */\nexport interface XAIResponsesRequest {\n model: string;\n input: string | XAIResponsesInputItem[];\n instructions?: string;\n max_output_tokens?: number;\n temperature?: number;\n top_p?: number;\n stream?: boolean;\n tools?: Array<XAIResponsesTool | XAIBuiltInTool>;\n tool_choice?: XAIResponsesToolChoice;\n parallel_tool_calls?: boolean;\n text?: XAIResponsesTextConfig;\n truncation?: 'auto' | 'disabled';\n store?: boolean;\n metadata?: Record<string, string>;\n reasoning?: {\n effort?: 'low' | 'high';\n };\n include?: string[];\n previous_response_id?: string;\n}\n\n/**\n * Union type for input items in the Responses API.\n */\nexport type XAIResponsesInputItem =\n | XAIResponsesSystemItem\n | XAIResponsesUserItem\n | XAIResponsesAssistantItem\n | XAIResponsesFunctionCallInputItem\n | XAIResponsesToolResultItem\n | XAIResponsesReasoningInputItem;\n\n/**\n * Reasoning input item for forwarding encrypted reasoning in multi-turn conversations.\n * Used with grok-4 models that support encrypted reasoning context.\n */\nexport interface XAIResponsesReasoningInputItem {\n type: 'reasoning';\n id: string;\n /** Summary of reasoning (if available) */\n summary?: Array<{ type: 'summary_text'; text: string }>;\n /** Encrypted reasoning content from previous response */\n encrypted_content: string;\n}\n\n/** System or developer message for the Responses API. */\nexport interface XAIResponsesSystemItem {\n type: 'message';\n role: 'system' | 'developer';\n content: string | XAIResponsesContentPart[];\n}\n\n/** User message for the Responses API. */\nexport interface XAIResponsesUserItem {\n type: 'message';\n role: 'user';\n content: string | XAIResponsesContentPart[];\n}\n\n/** Assistant message for the Responses API. */\nexport interface XAIResponsesAssistantItem {\n type: 'message';\n role: 'assistant';\n content: string | XAIResponsesContentPart[];\n}\n\n/** Function call input item for multi-turn tool conversations. */\nexport interface XAIResponsesFunctionCallInputItem {\n type: 'function_call';\n /** Unique item identifier */\n id: string;\n /** Call identifier for matching with output */\n call_id: string;\n /** Function name */\n name: string;\n /** JSON-encoded arguments */\n arguments: string;\n}\n\n/** Tool result item containing function output. */\nexport interface XAIResponsesToolResultItem {\n type: 'function_call_output';\n /** Call identifier matching the function_call */\n call_id: string;\n /** String output from the function */\n output: string;\n}\n\n/**\n * Union type for content parts within Responses API messages.\n */\nexport type XAIResponsesContentPart =\n | XAIResponsesTextPart\n | XAIResponsesImagePart\n | XAIResponsesFunctionCallPart;\n\n/** Text content part for input or output. */\nexport interface XAIResponsesTextPart {\n type: 'input_text' | 'output_text';\n text: string;\n}\n\n/** Image content part for input. */\nexport interface XAIResponsesImagePart {\n type: 'input_image';\n /** Image URL (including data: URLs) */\n image_url?: string;\n /** Base64-encoded image data */\n image?: string;\n /** Image processing detail level */\n detail?: 'auto' | 'low' | 'high';\n}\n\n/** Function call content part. */\nexport interface XAIResponsesFunctionCallPart {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n}\n\n/**\n * Tool definition for the Responses API.\n */\nexport interface XAIResponsesTool {\n type: 'function';\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does */\n description: string;\n /** JSON Schema defining the tool's parameters */\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n /** Enable strict mode for parameter validation */\n strict?: boolean;\n}\n\n/**\n * Controls how the model selects which tools to use in the Responses API.\n */\nexport type XAIResponsesToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; name: string };\n\n/**\n * Text output configuration for structured responses in the Responses API.\n */\nexport interface XAIResponsesTextConfig {\n /** Output format specification */\n format?:\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n name: string;\n description?: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n };\n}\n\n/**\n * Response from the Responses API.\n */\nexport interface XAIResponsesResponse {\n /** Unique response identifier (used as previous_response_id for continuation) */\n id: string;\n object: 'response';\n /** Unix timestamp of creation */\n created_at: number;\n /** Model used for generation */\n model: string;\n /** Generated output items */\n output: XAIResponsesOutputItem[];\n /** Token usage statistics */\n usage: XAIResponsesUsage;\n /** Current response status */\n status: 'completed' | 'failed' | 'incomplete' | 'in_progress';\n /** Error details if status is 'failed' */\n error?: {\n code: string;\n message: string;\n };\n /** Details about why response is incomplete */\n incomplete_details?: {\n reason: string;\n };\n /** Citation URLs from Live Search */\n citations?: string[];\n /** Inline citations with text and URL */\n inline_citations?: Array<{ text: string; url: string }>;\n}\n\n/** Union type for output items in Responses API responses. */\nexport type XAIResponsesOutputItem =\n | XAIResponsesMessageOutput\n | XAIResponsesFunctionCallOutput\n | XAIResponsesReasoningOutput;\n\n/** Reasoning output item from reasoning models (grok-4 with encrypted_content). */\nexport interface XAIResponsesReasoningOutput {\n type: 'reasoning';\n id: string;\n /** Summary of reasoning (if not encrypted) */\n summary?: Array<{ type: 'summary_text'; text: string }>;\n /** Encrypted reasoning content for multi-turn context */\n encrypted_content?: string;\n status: 'completed' | 'in_progress' | null;\n}\n\n/** Message output item containing text or refusal content. */\nexport interface XAIResponsesMessageOutput {\n type: 'message';\n /** Unique output item identifier */\n id: string;\n role: 'assistant';\n /** Content blocks within this message */\n content: XAIResponsesOutputContent[];\n /** Generation status for this item */\n status: 'completed' | 'in_progress';\n}\n\n/** Function call output item representing a tool invocation. */\nexport interface XAIResponsesFunctionCallOutput {\n type: 'function_call';\n /** Unique item identifier */\n id: string;\n /** Call identifier for matching with function_call_output */\n call_id: string;\n /** Function name */\n name: string;\n /** JSON-encoded arguments */\n arguments: string;\n /** Generation status for this item */\n status: 'completed' | 'in_progress';\n}\n\n/** Union type for output content within message items. */\nexport type XAIResponsesOutputContent =\n | { type: 'output_text'; text: string; annotations?: unknown[] }\n | { type: 'refusal'; refusal: string };\n\n/** Token usage statistics for the Responses API. */\nexport interface XAIResponsesUsage {\n /** Tokens in the input */\n input_tokens: number;\n /** Tokens in the output */\n output_tokens: number;\n /** Total tokens used */\n total_tokens: number;\n /** Breakdown of input token types */\n input_tokens_details?: {\n cached_tokens?: number;\n text_tokens?: number;\n image_tokens?: number;\n audio_tokens?: number;\n };\n /** Breakdown of output token types */\n output_tokens_details?: {\n text_tokens?: number;\n reasoning_tokens?: number;\n audio_tokens?: number;\n };\n}\n\n/**\n * Union type for all streaming events in the Responses API.\n */\nexport type XAIResponsesStreamEvent =\n | XAIResponseCreatedEvent\n | XAIResponseInProgressEvent\n | XAIResponseCompletedEvent\n | XAIResponseFailedEvent\n | XAIResponseOutputItemAddedEvent\n | XAIResponseOutputItemDoneEvent\n | XAIResponseContentPartAddedEvent\n | XAIResponseContentPartDoneEvent\n | XAIResponseTextDeltaEvent\n | XAIResponseTextDoneEvent\n | XAIResponseRefusalDeltaEvent\n | XAIResponseRefusalDoneEvent\n | XAIResponseFunctionCallArgumentsDeltaEvent\n | XAIResponseFunctionCallArgumentsDoneEvent\n | XAIResponseReasoningSummaryTextDeltaEvent\n | XAIResponseReasoningSummaryTextDoneEvent\n | XAIResponseErrorEvent;\n\n/** Emitted when a response is first created. */\nexport interface XAIResponseCreatedEvent {\n type: 'response.created';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when response generation is in progress. */\nexport interface XAIResponseInProgressEvent {\n type: 'response.in_progress';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when response generation completes successfully. */\nexport interface XAIResponseCompletedEvent {\n type: 'response.completed';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when response generation fails. */\nexport interface XAIResponseFailedEvent {\n type: 'response.failed';\n response: XAIResponsesResponse;\n}\n\n/** Emitted when a new output item is added to the response. */\nexport interface XAIResponseOutputItemAddedEvent {\n type: 'response.output_item.added';\n output_index: number;\n item: XAIResponsesOutputItem;\n}\n\n/** Emitted when an output item generation is complete. */\nexport interface XAIResponseOutputItemDoneEvent {\n type: 'response.output_item.done';\n output_index: number;\n item: XAIResponsesOutputItem;\n}\n\n/** Emitted when a content part is added to an output item. */\nexport interface XAIResponseContentPartAddedEvent {\n type: 'response.content_part.added';\n output_index: number;\n content_index: number;\n part: XAIResponsesOutputContent;\n}\n\n/** Emitted when a content part generation is complete. */\nexport interface XAIResponseContentPartDoneEvent {\n type: 'response.content_part.done';\n output_index: number;\n content_index: number;\n part: XAIResponsesOutputContent;\n}\n\n/** Emitted for incremental text content updates. */\nexport interface XAIResponseTextDeltaEvent {\n type: 'response.output_text.delta';\n output_index: number;\n content_index: number;\n /** The new text fragment */\n delta: string;\n}\n\n/** Emitted when text content generation is complete. */\nexport interface XAIResponseTextDoneEvent {\n type: 'response.output_text.done';\n output_index: number;\n content_index: number;\n /** The complete text content */\n text: string;\n}\n\n/** Emitted for incremental refusal message updates. */\nexport interface XAIResponseRefusalDeltaEvent {\n type: 'response.refusal.delta';\n output_index: number;\n content_index: number;\n delta: string;\n}\n\n/** Emitted when refusal message generation is complete. */\nexport interface XAIResponseRefusalDoneEvent {\n type: 'response.refusal.done';\n output_index: number;\n content_index: number;\n refusal: string;\n}\n\n/** Emitted for incremental function call argument updates. */\nexport interface XAIResponseFunctionCallArgumentsDeltaEvent {\n type: 'response.function_call_arguments.delta';\n output_index: number;\n item_id: string;\n /** The new JSON argument fragment */\n delta: string;\n call_id?: string;\n}\n\n/** Emitted when function call arguments generation is complete. */\nexport interface XAIResponseFunctionCallArgumentsDoneEvent {\n type: 'response.function_call_arguments.done';\n output_index: number;\n item_id: string;\n name: string;\n /** The complete JSON arguments */\n arguments: string;\n call_id?: string;\n}\n\n/** Emitted for incremental reasoning summary text updates. */\nexport interface XAIResponseReasoningSummaryTextDeltaEvent {\n type: 'response.reasoning_summary_text.delta';\n item_id: string;\n output_index: number;\n summary_index: number;\n delta: string;\n}\n\n/** Emitted when reasoning summary text generation is complete. */\nexport interface XAIResponseReasoningSummaryTextDoneEvent {\n type: 'response.reasoning_summary_text.done';\n item_id: string;\n output_index: number;\n summary_index: number;\n text: string;\n}\n\nexport interface XAIResponseErrorEvent {\n type: 'error';\n error: {\n type: string;\n code?: string;\n message: string;\n };\n}\n\n// ============================================\n// Messages API Types (Anthropic-compatible)\n// ============================================\n\n/**\n * Request body for the xAI Messages API.\n *\n * This interface represents the full request structure sent to `/v1/messages`.\n * It follows the Anthropic Messages API specification for compatibility.\n */\nexport interface XAIMessagesRequest {\n model: string;\n max_tokens?: number;\n messages: XAIMessagesMessage[];\n system?: string;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n stream?: boolean;\n tools?: XAIMessagesTool[];\n tool_choice?: { type: 'auto' | 'any' | 'tool'; name?: string };\n metadata?: { user_id?: string };\n thinking?: { type: 'enabled'; budget_tokens: number };\n}\n\n/**\n * Message format for the Messages API.\n */\nexport interface XAIMessagesMessage {\n /** Message role (user or assistant) */\n role: 'user' | 'assistant';\n /** Message content (string or array of content blocks) */\n content: XAIMessagesContent[] | string;\n}\n\n/**\n * Union type for content blocks in the Messages API.\n * Includes thinking content for forwarding extended thinking in multi-turn conversations.\n */\nexport type XAIMessagesContent =\n | XAIMessagesTextContent\n | XAIMessagesImageContent\n | XAIMessagesToolUseContent\n | XAIMessagesToolResultContent\n | XAIMessagesThinkingContent;\n\n/** Text content block. */\nexport interface XAIMessagesTextContent {\n type: 'text';\n text: string;\n}\n\n/** Image content block with source information. */\nexport interface XAIMessagesImageContent {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n /** MIME type (e.g., 'image/png') */\n media_type?: string;\n /** Base64-encoded image data (for type: 'base64') */\n data?: string;\n /** Image URL (for type: 'url') */\n url?: string;\n };\n}\n\n/** Tool use content block representing a tool invocation by the assistant. */\nexport interface XAIMessagesToolUseContent {\n type: 'tool_use';\n /** Unique identifier for this tool use */\n id: string;\n /** Name of the tool being used */\n name: string;\n /** Tool input arguments */\n input: Record<string, unknown>;\n}\n\n/** Tool result content block containing the output of a tool execution. */\nexport interface XAIMessagesToolResultContent {\n type: 'tool_result';\n /** ID of the tool_use this is a result for */\n tool_use_id: string;\n /** Result content */\n content: string | XAIMessagesContent[];\n /** Whether the tool execution resulted in an error */\n is_error?: boolean;\n}\n\n/**\n * Tool definition for the Messages API.\n */\nexport interface XAIMessagesTool {\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does */\n description: string;\n /** JSON Schema defining the tool's input parameters */\n input_schema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Response from the Messages API.\n */\nexport interface XAIMessagesResponse {\n /** Unique message identifier */\n id: string;\n type: 'message';\n role: 'assistant';\n /** Content blocks in the response */\n content: XAIMessagesResponseContent[];\n /** Model used for generation */\n model: string;\n /** Reason the model stopped generating */\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | 'pause_turn' | 'refusal' | null;\n /** The stop sequence that triggered stop (if applicable) */\n stop_sequence: string | null;\n /** Token usage statistics */\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\n/** Union type for response content blocks in the Messages API. */\nexport type XAIMessagesResponseContent =\n | XAIMessagesTextContent\n | XAIMessagesToolUseContent\n | XAIMessagesThinkingContent;\n\n/** Thinking content block from extended thinking feature. */\nexport interface XAIMessagesThinkingContent {\n type: 'thinking';\n /** The model's internal reasoning */\n thinking: string;\n /** Cryptographic signature for verification */\n signature?: string;\n}\n\n/**\n * Union type for all streaming events in the Messages API.\n */\nexport type XAIMessagesStreamEvent =\n | XAIMessagesMessageStartEvent\n | XAIMessagesContentBlockStartEvent\n | XAIMessagesContentBlockDeltaEvent\n | XAIMessagesContentBlockStopEvent\n | XAIMessagesMessageDeltaEvent\n | XAIMessagesMessageStopEvent\n | XAIMessagesPingEvent\n | XAIMessagesErrorEvent;\n\n/** Emitted at the start of a message. */\nexport interface XAIMessagesMessageStartEvent {\n type: 'message_start';\n message: XAIMessagesResponse;\n}\n\n/** Emitted when a new content block starts. */\nexport interface XAIMessagesContentBlockStartEvent {\n type: 'content_block_start';\n index: number;\n content_block: XAIMessagesResponseContent;\n}\n\n/** Emitted for incremental content block updates. */\nexport interface XAIMessagesContentBlockDeltaEvent {\n type: 'content_block_delta';\n /** Index may be omitted by xAI (unlike Anthropic) - use tracked currentIndex as fallback */\n index?: number;\n /** Delta content (type varies based on content block type) */\n delta:\n | { type: 'text_delta'; text: string }\n | { type: 'thinking_delta'; thinking: string }\n | { type: 'signature_delta'; signature: string }\n | { type: 'input_json_delta'; partial_json: string };\n}\n\n/** Emitted when a content block is complete. */\nexport interface XAIMessagesContentBlockStopEvent {\n type: 'content_block_stop';\n index: number;\n}\n\n/** Emitted with final message metadata. */\nexport interface XAIMessagesMessageDeltaEvent {\n type: 'message_delta';\n delta: {\n stop_reason: string | null;\n stop_sequence: string | null;\n };\n usage: {\n output_tokens: number;\n };\n}\n\n/** Emitted when message generation is complete. */\nexport interface XAIMessagesMessageStopEvent {\n type: 'message_stop';\n}\n\n/** Keep-alive ping event. */\nexport interface XAIMessagesPingEvent {\n type: 'ping';\n}\n\n/** Error event during streaming. */\nexport interface XAIMessagesErrorEvent {\n type: 'error';\n error: {\n type: string;\n message: string;\n };\n}\n\n/**\n * xAI-specific HTTP headers for API requests.\n *\n * @example\n * ```typescript\n * const headers: XAIHeaders = {\n * 'X-Client-Request-Id': 'trace-123',\n * };\n * ```\n */\nexport interface XAIHeaders {\n /** Client-generated request ID for tracing. */\n 'X-Client-Request-Id'?: string;\n [key: string]: string | undefined;\n}\n","/**\n * @fileoverview xAI Provider Factory\n *\n * This module provides the main xAI provider implementation that supports three\n * API modes: Chat Completions (default, OpenAI-compatible), Responses (stateful),\n * and Messages (Anthropic-compatible).\n *\n * @module providers/xai\n */\n\nimport type { Provider } from '../../types/provider.ts';\nimport { createProvider } from '../../core/provider.ts';\nimport type { LLMHandlerResolver } from '../../core/provider-handlers.ts';\nimport { createCompletionsLLMHandler } from './llm.completions.ts';\nimport { createResponsesLLMHandler } from './llm.responses.ts';\nimport { createMessagesLLMHandler } from './llm.messages.ts';\nimport { createImageHandler, type XAIImageParams } from './image.ts';\nimport type { XAIAPIMode } from './types.ts';\n\n/**\n * Configuration options for creating xAI model references.\n */\nexport interface XAIProviderOptions {\n /**\n * The API mode to use for this model.\n *\n * - `'completions'`: Chat Completions API (OpenAI-compatible, default, recommended)\n * - `'responses'`: Responses API (OpenAI Responses-compatible, supports stateful conversations)\n * - `'messages'`: Messages API (Anthropic-compatible, for easy migration from Anthropic)\n *\n * @default 'completions'\n */\n api?: XAIAPIMode;\n}\n\n/**\n * Type alias for the xAI provider with its options.\n */\nexport type XAIProvider = Provider<XAIProviderOptions>;\n\n/**\n * xAI provider\n *\n * Supports three API modes:\n * - Chat Completions API (default, OpenAI-compatible)\n * - Responses API (stateful, OpenAI Responses-compatible)\n * - Messages API (Anthropic-compatible)\n *\n * xAI's Grok models support:\n * - Real-time search via Live Search API (deprecated Dec 2025) or Agent Tools API\n * - Reasoning with `reasoning_effort` parameter (for Grok 3 Mini)\n * - Tool/function calling\n * - Image input\n * - Streaming responses\n * - Structured output (JSON mode)\n *\n * @example\n * ```ts\n * import { xai } from './providers/xai';\n * import { llm } from './core/llm';\n *\n * // Using Chat Completions API (default, recommended)\n * const model = llm({\n * model: xai('grok-4'),\n * params: { max_tokens: 1000 }\n * });\n *\n * // Using Responses API (stateful conversations)\n * const statefulModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * max_output_tokens: 1000,\n * store: true, // Enable stateful storage\n * }\n * });\n *\n * // Continue a previous conversation\n * const continuedModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * previous_response_id: 'resp_123...',\n * }\n * });\n *\n * // Using Messages API (Anthropic-compatible)\n * const anthropicModel = llm({\n * model: xai('grok-4', { api: 'messages' }),\n * params: { max_tokens: 1000 }\n * });\n *\n * // Using reasoning effort (Grok 3 Mini only)\n * const reasoningModel = llm({\n * model: xai('grok-3-mini'),\n * params: {\n * max_tokens: 1000,\n * reasoning_effort: 'high', // 'low' or 'high'\n * }\n * });\n *\n * // Using Agent Tools (web search, code execution, etc.)\n * const searchModel = llm({\n * model: xai('grok-4', { api: 'responses' }),\n * params: {\n * max_tokens: 1000,\n * tools: [tools.webSearch()],\n * }\n * });\n *\n * // Generate\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n */\nexport const xai = createProvider<XAIProviderOptions>({\n name: 'xai',\n version: '1.0.0',\n handlers: {\n llm: {\n handlers: {\n completions: createCompletionsLLMHandler(),\n responses: createResponsesLLMHandler(),\n messages: createMessagesLLMHandler(),\n },\n defaultMode: 'completions',\n getMode: (options) => options?.api ?? 'completions',\n } satisfies LLMHandlerResolver<XAIProviderOptions>,\n image: createImageHandler(),\n },\n});\n\n// Re-export tools and types\nexport { tools } from './types.ts';\nexport type {\n XAICompletionsParams,\n XAIResponsesParams,\n XAIMessagesParams,\n XAIConfig,\n XAIAPIMode,\n XAIModelOptions,\n XAIModelReference,\n XAIAgentTool,\n XAIHeaders,\n XAIBuiltInTool,\n XAIWebSearchTool,\n XAIXSearchTool,\n XAICodeExecutionTool,\n XAIFileSearchTool,\n XAIMcpTool,\n XAIServerSideToolUsage,\n} from './types.ts';\n\nexport type { XAIImageParams } from './image.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCO,SAAS,iBACd,SACA,SACuB;AACvB,QAAM,SAAS,QAAQ,UAAW,CAAC;AAEnC,QAAM,aAAoC;AAAA,IACxC,GAAG;AAAA,IACH,OAAO;AAAA,IACP,UAAU,kBAAkB,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC9D;AAEA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,eAAW,QAAQ,QAAQ,MAAM,IAAI,aAAa;AAAA,EACpD;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,SAAkC;AAAA,MACtC,MAAM;AAAA,MACN,YAAY,QAAQ,UAAU;AAAA,MAC9B,UAAU,QAAQ,UAAU;AAAA,MAC5B,GAAI,QAAQ,UAAU,yBAAyB,SAC3C,EAAE,sBAAsB,QAAQ,UAAU,qBAAqB,IAC/D,EAAE,sBAAsB,MAAM;AAAA,IACpC;AACA,QAAI,QAAQ,UAAU,aAAa;AACjC,aAAO,cAAc,QAAQ,UAAU;AAAA,IACzC;AAEA,eAAW,kBAAkB;AAAA,MAC3B,MAAM;AAAA,MACN,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa,QAAQ,UAAU;AAAA,QAC/B;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,gBAAgB,QAA4D;AACnF,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,UAAU,QAAQ;AAC7D,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,YAAa,MAA6B;AAChD,QAAI,OAAO,cAAc,UAAU;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,MAAM,IAAI;AACjD;AASA,SAAS,kBACP,UACA,QACyB;AACzB,QAAM,SAAkC,CAAC;AACzC,QAAM,mBAAmB,gBAAgB,MAAM;AAE/C,MAAI,kBAAkB;AACpB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,aAAW,WAAW,UAAU;AAC9B,QAAI,oBAAoB,OAAO,GAAG;AAChC,YAAM,eAAe,qBAAqB,OAAO;AACjD,aAAO,KAAK,GAAG,YAAY;AAAA,IAC7B,OAAO;AACL,YAAM,cAAc,iBAAiB,OAAO;AAC5C,UAAI,aAAa;AACf,eAAO,KAAK,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,mBAAgD,SAAmB;AAC1E,SAAO,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,SAAS,QAAQ;AAC9D;AAQA,SAAS,iBAAiB,SAAgD;AACxE,MAAI,cAAc,OAAO,GAAG;AAC1B,UAAM,eAAe,mBAAmB,QAAQ,OAAO;AACvD,QAAI,aAAa,WAAW,KAAK,aAAa,CAAC,GAAG,SAAS,QAAQ;AACjE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAU,aAAa,CAAC,EAAgB;AAAA,MAC1C;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,aAAa,IAAI,qBAAqB;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,mBAAmB,OAAO,GAAG;AAC/B,UAAM,eAAe,mBAAmB,QAAQ,OAAO;AACvD,UAAM,cAAc,aACjB,OAAO,CAAC,MAAsB,EAAE,SAAS,MAAM,EAC/C,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAEV,UAAM,eAAe,QAAQ,aAAa,QAAQ,UAAU,SAAS;AAErE,UAAM,mBAA0C;AAAA,MAC9C,MAAM;AAAA,MACN,SAAS,gBAAgB,CAAC,cAAc,OAAO;AAAA,IACjD;AAEA,QAAI,cAAc;AAChB,MAAC,iBAAoD,aACnD,QAAQ,UAAW,IAAI,CAAC,UAAU;AAAA,QAChC,IAAI,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,WAAW,KAAK,UAAU,KAAK,SAAS;AAAA,QAC1C;AAAA,MACF,EAAE;AAAA,IACN;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,oBAAoB,OAAO,GAAG;AAChC,UAAM,UAAU,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC/C,MAAM;AAAA,MACN,cAAc,OAAO;AAAA,MACrB,SACE,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,KAAK,UAAU,OAAO,MAAM;AAAA,IACpC,EAAE;AACF,WAAO,QAAQ,CAAC,KAAK;AAAA,EACvB;AAEA,SAAO;AACT;AAWO,SAAS,qBACd,SACyB;AACzB,MAAI,CAAC,oBAAoB,OAAO,GAAG;AACjC,UAAM,SAAS,iBAAiB,OAAO;AACvC,WAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9B;AAEA,SAAO,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,IACtC,MAAM;AAAA,IACN,cAAc,OAAO;AAAA,IACrB,SACE,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,KAAK,UAAU,OAAO,MAAM;AAAA,EACpC,EAAE;AACJ;AASA,SAAS,sBAAsB,OAAqC;AAClE,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,IAE1C,KAAK,SAAS;AACZ,YAAM,aAAa;AACnB,UAAI;AAEJ,UAAI,WAAW,OAAO,SAAS,UAAU;AACvC,cAAM,QAAQ,WAAW,QAAQ,WAAW,WAAW,OAAO,IAAI;AAAA,MACpE,WAAW,WAAW,OAAO,SAAS,OAAO;AAC3C,cAAM,WAAW,OAAO;AAAA,MAC1B,WAAW,WAAW,OAAO,SAAS,SAAS;AAC7C,cAAM,SAAS,OAAO,KAAK,WAAW,OAAO,IAAI,EAAE,SAAS,QAAQ;AACpE,cAAM,QAAQ,WAAW,QAAQ,WAAW,MAAM;AAAA,MACpD,OAAO;AACL,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,EAAE,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,6BAA6B,MAAM,IAAI,EAAE;AAAA,EAC7D;AACF;AAQA,SAAS,cAAc,MAAgC;AACrD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,KAAK,WAAW;AAAA,QAC5B,UAAU,KAAK,WAAW;AAAA,QAC1B,GAAI,KAAK,WAAW,yBAAyB,SACzC,EAAE,sBAAsB,KAAK,WAAW,qBAAqB,IAC7D,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AASO,SAAS,kBAAkB,MAA2C;AAC3E,QAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,UAA8B,CAAC;AACrC,MAAI;AAGJ,MAAI,OAAO,QAAQ,mBAAmB;AACpC,YAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,OAAO,QAAQ,kBAAkB,CAAC;AAAA,EAC5E;AAEA,MAAI,OAAO,QAAQ,SAAS;AAC1B,YAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,QAAQ,CAAC;AAC3D,QAAI;AACF,uBAAiB,KAAK,MAAM,OAAO,QAAQ,OAAO;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,aAAa;AACjB,MAAI,OAAO,QAAQ,SAAS;AAC1B,YAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,QAAQ,CAAC;AAC3D,iBAAa;AAAA,EACf;AAEA,QAAM,YAAwB,CAAC;AAC/B,MAAI,OAAO,QAAQ,YAAY;AAC7B,eAAW,QAAQ,OAAO,QAAQ,YAAY;AAC5C,UAAI,OAAgC,CAAC;AACrC,UAAI;AACF,eAAO,KAAK,MAAM,KAAK,SAAS,SAAS;AAAA,MAC3C,QAAQ;AAAA,MAER;AACA,gBAAU,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,MAAM,WAAW;AACzC,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,KAAK;AAAA,UACH,OAAO,KAAK;AAAA,UACZ,eAAe,OAAO;AAAA,UACtB,oBAAoB,KAAK;AAAA,UACzB,WAAW,KAAK;AAAA,UAChB,kBAAkB,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAoB;AAAA,IACxB,aAAa,KAAK,MAAM;AAAA,IACxB,cAAc,KAAK,MAAM;AAAA,IACzB,aAAa,KAAK,MAAM;AAAA,IACxB,iBAAiB,KAAK,MAAM,uBAAuB,iBAAiB;AAAA,IACpE,kBAAkB;AAAA,EACpB;AAEA,MAAI,aAAa;AACjB,UAAQ,OAAO,eAAe;AAAA,IAC5B,KAAK;AACH,mBAAa;AACb;AAAA,IACF,KAAK;AACH,mBAAa;AACb;AAAA,IACF,KAAK;AACH,mBAAa;AACb;AAAA,IACF,KAAK;AACH,mBAAa;AACb;AAAA,EACJ;AACA,MAAI,cAAc,eAAe,kBAAkB;AACjD,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAoCO,SAAS,oBAA4C;AAC1D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW,oBAAI,IAAI;AAAA,IACnB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd;AACF;AAYO,SAAS,qBACd,OACA,OACe;AACf,QAAM,SAAwB,CAAC;AAE/B,MAAI,MAAM,MAAM,CAAC,MAAM,IAAI;AACzB,UAAM,KAAK,MAAM;AACjB,WAAO,KAAK,EAAE,MAAM,gBAAgB,cAAc,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,EACzE;AACA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,QAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,MAAI,QAAQ;AAEV,QAAI,OAAO,MAAM,mBAAmB;AAClC,YAAM,aAAa,OAAO,MAAM;AAChC,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO;AAAA,QACP,OAAO,EAAE,MAAM,OAAO,MAAM,kBAAkB;AAAA,MAChD,CAAC;AAAA,IACH;AACA,QAAI,OAAO,MAAM,SAAS;AACxB,YAAM,QAAQ,OAAO,MAAM;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO;AAAA,QACP,OAAO,EAAE,MAAM,OAAO,MAAM,QAAQ;AAAA,MACtC,CAAC;AAAA,IACH;AACA,QAAI,OAAO,MAAM,SAAS;AACxB,YAAM,aAAa;AACnB,YAAM,QAAQ,OAAO,MAAM;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO;AAAA,QACP,OAAO,EAAE,MAAM,OAAO,MAAM,QAAQ;AAAA,MACtC,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,MAAM,YAAY;AAC3B,iBAAW,iBAAiB,OAAO,MAAM,YAAY;AACnD,cAAM,QAAQ,cAAc;AAC5B,YAAI,WAAW,MAAM,UAAU,IAAI,KAAK;AAExC,YAAI,CAAC,UAAU;AACb,qBAAW,EAAE,IAAI,IAAI,MAAM,IAAI,WAAW,GAAG;AAC7C,gBAAM,UAAU,IAAI,OAAO,QAAQ;AAAA,QACrC;AAEA,YAAI,cAAc,IAAI;AACpB,mBAAS,KAAK,cAAc;AAAA,QAC9B;AACA,YAAI,cAAc,UAAU,MAAM;AAChC,mBAAS,OAAO,cAAc,SAAS;AAAA,QACzC;AACA,YAAI,cAAc,UAAU,WAAW;AACrC,mBAAS,aAAa,cAAc,SAAS;AAC7C,iBAAO,KAAK;AAAA,YACV,MAAM,gBAAgB;AAAA,YACtB;AAAA,YACA,OAAO;AAAA,cACL,YAAY,SAAS;AAAA,cACrB,UAAU,SAAS;AAAA,cACnB,eAAe,cAAc,SAAS;AAAA,YACxC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,eAAe;AACxB,YAAM,eAAe,OAAO;AAC5B,aAAO,KAAK,EAAE,MAAM,gBAAgB,aAAa,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,cAAc,MAAM,MAAM;AAChC,UAAM,eAAe,MAAM,MAAM;AACjC,UAAM,kBAAkB,MAAM,MAAM,uBAAuB,iBAAiB;AAAA,EAC9E;AAEA,SAAO;AACT;AAWO,SAAS,uBAAuB,OAA4C;AACjF,QAAM,UAA8B,CAAC;AACrC,MAAI;AAGJ,MAAI,MAAM,WAAW;AACnB,YAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,MAAM,UAAU,CAAC;AAAA,EAC3D;AAEA,MAAI,MAAM,MAAM;AACd,YAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAC/C,QAAI;AACF,uBAAiB,KAAK,MAAM,MAAM,IAAI;AAAA,IACxC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,YAAwB,CAAC;AAC/B,aAAW,CAAC,EAAE,QAAQ,KAAK,MAAM,WAAW;AAC1C,QAAI,OAAgC,CAAC;AACrC,QAAI,SAAS,WAAW;AACtB,UAAI;AACF,eAAO,KAAK,MAAM,SAAS,SAAS;AAAA,MACtC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,cAAU,KAAK;AAAA,MACb,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,MACnB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM,MAAM,WAAW;AACzC,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,KAAK;AAAA,UACH,OAAO,MAAM;AAAA,UACb,eAAe,MAAM;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAoB;AAAA,IACxB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM,cAAc,MAAM;AAAA,IACvC,iBAAiB,MAAM;AAAA,IACvB,kBAAkB;AAAA,EACpB;AAEA,MAAI,aAAa;AACjB,UAAQ,MAAM,cAAc;AAAA,IAC1B,KAAK;AACH,mBAAa;AACb;AAAA,IACF,KAAK;AACH,mBAAa;AACb;AAAA,IACF,KAAK;AACH,mBAAa;AACb;AAAA,IACF,KAAK;AACH,mBAAa;AACb;AAAA,EACJ;AACA,MAAI,MAAM,cAAc,eAAe,kBAAkB;AACvD,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;ACvoBA,IAAM,0BAA0B;AAMhC,IAAM,+BAAgD;AAAA,EACpD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AACd;AA+BO,SAAS,8BAAgE;AAC9E,MAAI,cAAwD;AAE5D,SAAO;AAAA,IACL,aAAa,UAA6C;AACxD,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAAsD;AACzD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,QAA6C;AAAA,QACjD;AAAA,QACA,cAAc;AAAA,QAEd,IAAI,WAA8C;AAChD,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,SAAS,SAAiE;AAC9E,gBAAM,SAAS,MAAM;AAAA,YACnB,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,gBAAM,OAAO,iBAAiB,SAAS,OAAO;AAE9C,gBAAM,UAAkC;AAAA,YACtC,gBAAgB;AAAA,YAChB,eAAe,UAAU,MAAM;AAAA,UACjC;AAEA,cAAI,QAAQ,OAAO,SAAS;AAC1B,uBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,kBAAI,UAAU,QAAW;AACvB,wBAAQ,GAAG,IAAI;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR;AAAA,cACA,MAAM,KAAK,UAAU,IAAI;AAAA,cACzB,QAAQ,QAAQ;AAAA,YAClB;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,OAAO,MAAM,kBAA0C,UAAU,OAAO,KAAK;AACnF,iBAAO,kBAAkB,IAAI;AAAA,QAC/B;AAAA,QAEA,OAAO,SAA4D;AACjE,gBAAM,QAAQ,kBAAkB;AAChC,cAAI;AACJ,cAAI;AAEJ,gBAAM,kBAAkB,IAAI,QAAqB,CAAC,SAAS,WAAW;AACpE,8BAAkB;AAClB,6BAAiB;AAAA,UACnB,CAAC;AAED,0BAAgB,iBAA6D;AAC3E,gBAAI;AACF,oBAAM,SAAS,MAAM;AAAA,gBACnB,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,oBAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,oBAAM,OAAO,iBAAiB,SAAS,OAAO;AAC9C,mBAAK,SAAS;AACd,mBAAK,iBAAiB,EAAE,eAAe,KAAK;AAE5C,oBAAM,UAAkC;AAAA,gBACtC,gBAAgB;AAAA,gBAChB,eAAe,UAAU,MAAM;AAAA,gBAC/B,QAAQ;AAAA,cACV;AAEA,kBAAI,QAAQ,OAAO,SAAS;AAC1B,2BAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,sBAAI,UAAU,QAAW;AACvB,4BAAQ,GAAG,IAAI;AAAA,kBACjB;AAAA,gBACF;AAAA,cACF;AAEA,oBAAM,WAAW,MAAM;AAAA,gBACrB;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,KAAK,UAAU,IAAI;AAAA,kBACzB,QAAQ,QAAQ;AAAA,gBAClB;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACF;AAEA,kBAAI,CAAC,SAAS,IAAI;AAChB,sBAAM,QAAQ,MAAM,mBAAmB,UAAU,OAAO,KAAK;AAC7D,+BAAe,KAAK;AACpB,sBAAM;AAAA,cACR;AAEA,kBAAI,CAAC,SAAS,MAAM;AAClB,sBAAM,QAAQ,IAAI;AAAA,kBAChB;AAAA,kBACA,UAAU;AAAA,kBACV;AAAA,kBACA,aAAa;AAAA,gBACf;AACA,+BAAe,KAAK;AACpB,sBAAM;AAAA,cACR;AAEA,+BAAiB,QAAQ,eAAe,SAAS,IAAI,GAAG;AAEtD,oBAAI,SAAS,UAAU;AACrB;AAAA,gBACF;AAGA,oBAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,wBAAM,QAAQ;AAGd,sBAAI,WAAW,SAAS,MAAM,OAAO;AACnC,0BAAM,YAAY,MAAM;AACxB,0BAAM,QAAQ,IAAI;AAAA,sBAChB,UAAU,WAAW;AAAA,sBACrB,UAAU;AAAA,sBACV;AAAA,sBACA,aAAa;AAAA,oBACf;AACA,mCAAe,KAAK;AACpB,0BAAM;AAAA,kBACR;AAEA,wBAAM,YAAY,qBAAqB,OAAO,KAAK;AACnD,6BAAW,SAAS,WAAW;AAC7B,0BAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAGA,8BAAgB,uBAAuB,KAAK,CAAC;AAAA,YAC/C,SAAS,OAAO;AACd,oBAAM,MAAM,QAAQ,KAAK;AACzB,6BAAe,GAAG;AAClB,oBAAM;AAAA,YACR;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,CAAC,OAAO,aAAa,IAAI;AACvB,qBAAO,eAAe;AAAA,YACxB;AAAA,YACA,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACrNO,SAASA,kBACd,SACA,SACqB;AACrB,QAAM,SAAS,QAAQ,UAAW,CAAC;AAGnC,QAAM,EAAE,OAAO,cAAc,GAAG,WAAW,IAAI;AAE/C,QAAM,aAAkC;AAAA,IACtC,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO,oBAAoB,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC7D;AAGA,QAAM,gBAAoC,QAAQ,OAAO,IAAIC,cAAa,KAAK,CAAC;AAChF,QAAM,WAAqD;AAAA,IACzD,GAAG;AAAA,IACH,GAAI,gBAAgB,CAAC;AAAA,EACvB;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,eAAW,QAAQ;AAAA,EACrB;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,SAAkC;AAAA,MACtC,MAAM;AAAA,MACN,YAAY,QAAQ,UAAU;AAAA,MAC9B,UAAU,QAAQ,UAAU;AAAA,MAC5B,GAAI,QAAQ,UAAU,yBAAyB,SAC3C,EAAE,sBAAsB,QAAQ,UAAU,qBAAqB,IAC/D,EAAE,sBAAsB,MAAM;AAAA,IACpC;AACA,QAAI,QAAQ,UAAU,aAAa;AACjC,aAAO,cAAc,QAAQ,UAAU;AAAA,IACzC;AAEA,eAAW,OAAO;AAAA,MAChB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,QAAQ,UAAU;AAAA,QAC/B;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAASC,iBAAgB,QAA4D;AACnF,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,UAAU,QAAQ;AAC7D,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,YAAa,MAA6B;AAChD,QAAI,OAAO,cAAc,UAAU;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,MAAM,IAAI;AACjD;AASA,SAAS,oBACP,UACA,QACkC;AAClC,QAAM,SAAkC,CAAC;AACzC,QAAM,mBAAmBA,iBAAgB,MAAM;AAE/C,MAAI,kBAAkB;AACpB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQC,kBAAiB,OAAO;AACtC,WAAO,KAAK,GAAG,KAAK;AAAA,EACtB;AAEA,MAAI,OAAO,WAAW,KAAK,OAAO,CAAC,GAAG,SAAS,WAAW;AACxD,UAAM,OAAO,OAAO,CAAC;AACrB,QAAI,KAAK,SAAS,UAAU,OAAO,KAAK,YAAY,UAAU;AAC5D,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAASC,oBAAgD,SAAmB;AAC1E,SAAO,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,SAAS,QAAQ;AAC9D;AAWA,SAASD,kBAAiB,SAA2C;AACnE,MAAI,cAAc,OAAO,GAAG;AAC1B,UAAM,eAAeC,oBAAmB,QAAQ,OAAO;AACvD,QAAI,aAAa,WAAW,KAAK,aAAa,CAAC,GAAG,SAAS,QAAQ;AACjE,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAU,aAAa,CAAC,EAAgB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,aAAa,IAAI,oBAAoB;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB,OAAO,GAAG;AAC/B,UAAM,eAAeA,oBAAmB,QAAQ,OAAO;AACvD,UAAM,QAAiC,CAAC;AAExC,UAAM,cAAc,aACjB,OAAO,CAAC,MAAsB,EAAE,SAAS,MAAM,EAC/C,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,MAAM;AAEd,QAAI,aAAa;AACf,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,QAAQ,UAAU;AAMlC,UAAM,oBAAoB,SAAS;AAGnC,QAAI,SAAS,2BAA2B;AACtC,UAAI;AACF,cAAM,gBAAgB,KAAK,MAAM,QAAQ,yBAAyB;AAKlE,YAAI,cAAc,mBAAmB;AACnC,gBAAM,gBAAgD;AAAA,YACpD,MAAM;AAAA,YACN,IAAI,cAAc;AAAA,YAClB,mBAAmB,cAAc;AAAA,UACnC;AACA,cAAI,MAAM,QAAQ,cAAc,OAAO,GAAG;AACxC,0BAAc,UAAU,cAAc;AAAA,UACxC;AACA,gBAAM,KAAK,aAAa;AAAA,QAC1B;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI,qBAAqB,kBAAkB,SAAS,GAAG;AACrD,iBAAW,MAAM,mBAAmB;AAClC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,GAAG;AAAA,UACP,SAAS,GAAG;AAAA,UACZ,MAAM,GAAG;AAAA,UACT,WAAW,GAAG;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,WAAW,QAAQ,aAAa,QAAQ,UAAU,SAAS,GAAG;AAC5D,iBAAW,QAAQ,QAAQ,WAAW;AACpC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,MAAM,KAAK,UAAU;AAAA,UACzB,SAAS,KAAK;AAAA,UACd,MAAM,KAAK;AAAA,UACX,WAAW,KAAK,UAAU,KAAK,SAAS;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,oBAAoB,OAAO,GAAG;AAChC,WAAO,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,MACtC,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,QACE,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,KAAK,UAAU,OAAO,MAAM;AAAA,IACpC,EAAE;AAAA,EACJ;AAEA,SAAO,CAAC;AACV;AASA,SAAS,qBAAqB,OAA8C;AAC1E,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,MAAM,cAAc,MAAM,MAAM,KAAK;AAAA,IAEhD,KAAK,SAAS;AACZ,YAAM,aAAa;AACnB,UAAI,WAAW,OAAO,SAAS,UAAU;AACvC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,QAAQ,WAAW,QAAQ,WAAW,WAAW,OAAO,IAAI;AAAA,QACzE;AAAA,MACF;AAEA,UAAI,WAAW,OAAO,SAAS,OAAO;AACpC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,WAAW,OAAO;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,WAAW,OAAO,SAAS,SAAS;AACtC,cAAM,SAAS,OAAO,KAAK,WAAW,OAAO,IAAI,EAAE,SAAS,QAAQ;AACpE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,QAAQ,WAAW,QAAQ,WAAW,MAAM;AAAA,QACzD;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,6BAA6B,MAAM,IAAI,EAAE;AAAA,EAC7D;AACF;AAQA,SAASH,eAAc,MAA8B;AACnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY,KAAK,WAAW;AAAA,MAC5B,UAAU,KAAK,WAAW;AAAA,MAC1B,GAAI,KAAK,WAAW,yBAAyB,SACzC,EAAE,sBAAsB,KAAK,WAAW,qBAAqB,IAC7D,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAQO,SAASI,mBAAkB,MAAyC;AACzE,QAAM,UAA8B,CAAC;AACrC,QAAM,YAAwB,CAAC;AAC/B,QAAM,oBAKD,CAAC;AACN,MAAI,aAAa;AACjB,MAAI;AACJ,MAAI;AAEJ,aAAW,QAAQ,KAAK,QAAQ;AAC9B,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,cAAc;AACpB,iBAAW,iBAAiB,YAAY,SAAS;AAC/C,YAAI,cAAc,SAAS,eAAe;AACxC,kBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,cAAc,KAAK,CAAC;AACvD,cAAI,mBAAmB,QAAW;AAChC,gBAAI;AACF,+BAAiB,KAAK,MAAM,cAAc,IAAI;AAAA,YAChD,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF,WAAW,cAAc,SAAS,WAAW;AAC3C,kBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,cAAc,QAAQ,CAAC;AAC1D,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF,WAAW,KAAK,SAAS,iBAAiB;AACxC,YAAM,eAAe;AACrB,UAAI,OAAgC,CAAC;AACrC,UAAI;AACF,eAAO,KAAK,MAAM,aAAa,SAAS;AAAA,MAC1C,QAAQ;AAAA,MAER;AACA,gBAAU,KAAK;AAAA,QACb,YAAY,aAAa;AAAA,QACzB,UAAU,aAAa;AAAA,QACvB,WAAW;AAAA,MACb,CAAC;AACD,wBAAkB,KAAK;AAAA,QACrB,IAAI,aAAa;AAAA,QACjB,SAAS,aAAa;AAAA,QACtB,MAAM,aAAa;AAAA,QACnB,WAAW,aAAa;AAAA,MAC1B,CAAC;AAAA,IACH,WAAW,KAAK,SAAS,aAAa;AACpC,YAAM,gBAAgB;AAEtB,UAAI,cAAc,SAAS;AACzB,cAAM,gBAAgB,cAAc,QACjC,OAAO,CAAC,MAAmD,EAAE,SAAS,cAAc,EACpF,IAAI,OAAK,EAAE,IAAI,EACf,KAAK,EAAE;AACV,YAAI,eAAe;AACjB,kBAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,cAAc,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,kCAA4B,KAAK,UAAU;AAAA,QACzC,IAAI,cAAc;AAAA,QAClB,SAAS,cAAc;AAAA,QACvB,mBAAmB,cAAc;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,MAAM,WAAW;AACzC,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,KAAK;AAAA,UACH,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,aAAa;AAAA,UACb,mBACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,UACrD,WAAW,KAAK;AAAA,UAChB,kBAAkB,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAoB;AAAA,IACxB,aAAa,KAAK,MAAM;AAAA,IACxB,cAAc,KAAK,MAAM;AAAA,IACzB,aAAa,KAAK,MAAM;AAAA,IACxB,iBAAiB,KAAK,MAAM,sBAAsB,iBAAiB;AAAA,IACnE,kBAAkB;AAAA,EACpB;AAEA,MAAI,aAAa;AACjB,MAAI,KAAK,WAAW,aAAa;AAC/B,iBAAa,UAAU,SAAS,IAAI,aAAa;AAAA,EACnD,WAAW,KAAK,WAAW,cAAc;AACvC,iBAAa,KAAK,oBAAoB,WAAW,sBAC7C,eACA;AAAA,EACN,WAAW,KAAK,WAAW,UAAU;AACnC,iBAAa;AAAA,EACf;AACA,MAAI,cAAc,eAAe,SAAS;AACxC,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAyCO,SAASC,qBAA0C;AACxD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa,oBAAI,IAAI;AAAA,IACrB,kBAAkB,oBAAI,IAAI;AAAA,IAC1B,WAAW,oBAAI,IAAI;AAAA,IACnB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd;AACF;AAYO,SAASC,sBACd,OACA,OACe;AACf,QAAM,SAAwB,CAAC;AAE/B,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,YAAM,KAAK,MAAM,SAAS;AAC1B,YAAM,QAAQ,MAAM,SAAS;AAC7B,aAAO,KAAK,EAAE,MAAM,gBAAgB,cAAc,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AACvE;AAAA,IAEF,KAAK;AACH,YAAM,SAAS;AACf;AAAA,IAEF,KAAK;AACH,YAAM,SAAS;AACf,UAAI,MAAM,SAAS,OAAO;AACxB,cAAM,cAAc,MAAM,SAAS,MAAM;AACzC,cAAM,eAAe,MAAM,SAAS,MAAM;AAC1C,cAAM,kBAAkB,MAAM,SAAS,MAAM,sBAAsB,iBAAiB;AAAA,MACtF;AACA,aAAO,KAAK,EAAE,MAAM,gBAAgB,aAAa,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AACtE;AAAA,IAEF,KAAK;AACH,YAAM,SAAS;AACf,aAAO,KAAK,EAAE,MAAM,gBAAgB,aAAa,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AACtE;AAAA,IAEF,KAAK;AACH,UAAI,MAAM,KAAK,SAAS,iBAAiB;AACvC,cAAM,eAAe,MAAM;AAC3B,cAAM,WAAW,MAAM,UAAU,IAAI,MAAM,YAAY,KAAK;AAAA,UAC1D,WAAW;AAAA,QACb;AACA,iBAAS,SAAS,aAAa;AAC/B,iBAAS,SAAS,aAAa;AAC/B,iBAAS,OAAO,aAAa;AAC7B,YAAI,aAAa,WAAW;AAC1B,mBAAS,YAAY,aAAa;AAAA,QACpC;AACA,cAAM,UAAU,IAAI,MAAM,cAAc,QAAQ;AAAA,MAClD;AACA,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,OAAO,CAAC;AAAA,MACV,CAAC;AACD;AAAA,IAEF,KAAK;AACH,UAAI,MAAM,KAAK,SAAS,iBAAiB;AACvC,cAAM,eAAe,MAAM;AAC3B,cAAM,WAAW,MAAM,UAAU,IAAI,MAAM,YAAY,KAAK;AAAA,UAC1D,WAAW;AAAA,QACb;AACA,iBAAS,SAAS,aAAa;AAC/B,iBAAS,SAAS,aAAa;AAC/B,iBAAS,OAAO,aAAa;AAC7B,YAAI,aAAa,WAAW;AAC1B,mBAAS,YAAY,aAAa;AAAA,QACpC;AACA,cAAM,UAAU,IAAI,MAAM,cAAc,QAAQ;AAAA,MAClD,WAAW,MAAM,KAAK,SAAS,aAAa;AAE1C,cAAM,gBAAgB,MAAM;AAC5B,cAAM,4BAA4B,KAAK,UAAU;AAAA,UAC/C,IAAI,cAAc;AAAA,UAClB,SAAS,cAAc;AAAA,UACvB,mBAAmB,cAAc;AAAA,QACnC,CAAC;AAAA,MACH;AACA,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,OAAO,CAAC;AAAA,MACV,CAAC;AACD;AAAA,IAEF,KAAK,8BAA8B;AACjC,YAAM,cAAc,MAAM,YAAY,IAAI,MAAM,YAAY,KAAK;AACjE,YAAM,YAAY,IAAI,MAAM,cAAc,cAAc,MAAM,KAAK;AACnE,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,OAAO,EAAE,MAAM,MAAM,MAAM;AAAA,MAC7B,CAAC;AACD;AAAA,IACF;AAAA,IAEA,KAAK;AACH,YAAM,YAAY,IAAI,MAAM,cAAc,MAAM,IAAI;AACpD;AAAA,IAEF,KAAK,0BAA0B;AAC7B,YAAM,aAAa;AACnB,YAAM,iBAAiB,MAAM,YAAY,IAAI,MAAM,YAAY,KAAK;AACpE,YAAM,YAAY,IAAI,MAAM,cAAc,iBAAiB,MAAM,KAAK;AACtE,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,OAAO,EAAE,MAAM,MAAM,MAAM;AAAA,MAC7B,CAAC;AACD;AAAA,IACF;AAAA,IAEA,KAAK;AACH,YAAM,aAAa;AACnB,YAAM,YAAY,IAAI,MAAM,cAAc,MAAM,OAAO;AACvD;AAAA,IAEF,KAAK,0CAA0C;AAC7C,UAAI,WAAW,MAAM,UAAU,IAAI,MAAM,YAAY;AACrD,UAAI,CAAC,UAAU;AACb,mBAAW,EAAE,WAAW,GAAG;AAC3B,cAAM,UAAU,IAAI,MAAM,cAAc,QAAQ;AAAA,MAClD;AACA,UAAI,MAAM,WAAW,CAAC,SAAS,QAAQ;AACrC,iBAAS,SAAS,MAAM;AAAA,MAC1B;AACA,UAAI,MAAM,WAAW,CAAC,SAAS,QAAQ;AACrC,iBAAS,SAAS,MAAM;AAAA,MAC1B;AACA,eAAS,aAAa,MAAM;AAC5B,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,OAAO;AAAA,UACL,YAAY,SAAS,UAAU,SAAS,UAAU;AAAA,UAClD,UAAU,SAAS;AAAA,UACnB,eAAe,MAAM;AAAA,QACvB;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAAA,IAEA,KAAK,yCAAyC;AAC5C,UAAI,WAAW,MAAM,UAAU,IAAI,MAAM,YAAY;AACrD,UAAI,CAAC,UAAU;AACb,mBAAW,EAAE,WAAW,GAAG;AAC3B,cAAM,UAAU,IAAI,MAAM,cAAc,QAAQ;AAAA,MAClD;AACA,UAAI,MAAM,SAAS;AACjB,iBAAS,SAAS,MAAM;AAAA,MAC1B;AACA,UAAI,MAAM,SAAS;AACjB,iBAAS,SAAS,MAAM;AAAA,MAC1B;AACA,eAAS,OAAO,MAAM;AACtB,eAAS,YAAY,MAAM;AAC3B;AAAA,IACF;AAAA,IAEA,KAAK,yCAAyC;AAC5C,YAAM,mBAAmB,MAAM,iBAAiB,IAAI,MAAM,YAAY,KAAK;AAC3E,YAAM,iBAAiB,IAAI,MAAM,cAAc,mBAAmB,MAAM,KAAK;AAC7E,aAAO,KAAK;AAAA,QACV,MAAM,gBAAgB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,OAAO,EAAE,MAAM,MAAM,MAAM;AAAA,MAC7B,CAAC;AACD;AAAA,IACF;AAAA,IAEA,KAAK;AACH,YAAM,iBAAiB,IAAI,MAAM,cAAc,MAAM,IAAI;AACzD;AAAA,IAEF,KAAK;AACH;AAAA,IAEF;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAWO,SAASC,wBAAuB,OAA0C;AAC/E,QAAM,UAA8B,CAAC;AACrC,MAAI;AAGJ,QAAM,0BAA0B,CAAC,GAAG,MAAM,iBAAiB,QAAQ,CAAC,EAAE;AAAA,IACpE,CAAC,CAAC,SAAS,GAAG,CAAC,UAAU,MAAM,YAAY;AAAA,EAC7C;AACA,aAAW,CAAC,EAAE,SAAS,KAAK,yBAAyB;AACnD,QAAI,WAAW;AACb,cAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,IACrD;AAAA,EACF;AAGA,QAAM,qBAAqB,CAAC,GAAG,MAAM,YAAY,QAAQ,CAAC,EAAE;AAAA,IAC1D,CAAC,CAAC,SAAS,GAAG,CAAC,UAAU,MAAM,YAAY;AAAA,EAC7C;AACA,aAAW,CAAC,EAAE,IAAI,KAAK,oBAAoB;AACzC,QAAI,MAAM;AACR,cAAQ,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AACnC,UAAI,mBAAmB,QAAW;AAChC,YAAI;AACF,2BAAiB,KAAK,MAAM,IAAI;AAAA,QAClC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAwB,CAAC;AAC/B,QAAM,oBAKD,CAAC;AACN,aAAW,CAAC,EAAE,QAAQ,KAAK,MAAM,WAAW;AAC1C,QAAI,OAAgC,CAAC;AACrC,QAAI,SAAS,WAAW;AACtB,UAAI;AACF,eAAO,KAAK,MAAM,SAAS,SAAS;AAAA,MACtC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,SAAS,SAAS,UAAU;AAClC,UAAM,SAAS,SAAS,UAAU,SAAS,UAAU;AACrD,UAAM,OAAO,SAAS,QAAQ;AAC9B,cAAU,KAAK;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAED,QAAI,UAAU,UAAU,MAAM;AAC5B,wBAAkB,KAAK;AAAA,QACrB,IAAI;AAAA,QACJ,SAAS;AAAA,QACT;AAAA,QACA,WAAW,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,MAAM,WAAW;AAC1C,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,KAAK;AAAA,UACH,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,aAAa;AAAA,UACb,mBACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,UACrD,2BAA2B,MAAM;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAoB;AAAA,IACxB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM,cAAc,MAAM;AAAA,IACvC,iBAAiB,MAAM;AAAA,IACvB,kBAAkB;AAAA,EACpB;AAEA,MAAI,aAAa;AACjB,MAAI,MAAM,WAAW,aAAa;AAChC,iBAAa,UAAU,SAAS,IAAI,aAAa;AAAA,EACnD,WAAW,MAAM,WAAW,UAAU;AACpC,iBAAa;AAAA,EACf;AACA,MAAI,MAAM,cAAc,eAAe,SAAS;AAC9C,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;ACp0BA,IAAM,wBAAwB;AAM9B,IAAM,6BAA8C;AAAA,EAClD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AACd;AAyCO,SAAS,4BAA4D;AAC1E,MAAI,cAAsD;AAE1D,SAAO;AAAA,IACL,aAAa,UAA2C;AACtD,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAAoD;AACvD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,QAA2C;AAAA,QAC/C;AAAA,QACA,cAAc;AAAA,QAEd,IAAI,WAA4C;AAC9C,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,SAAS,SAA+D;AAC5E,gBAAM,SAAS,MAAM;AAAA,YACnB,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,gBAAM,OAAOC,kBAAiB,SAAS,OAAO;AAE9C,gBAAM,UAAkC;AAAA,YACtC,gBAAgB;AAAA,YAChB,eAAe,UAAU,MAAM;AAAA,UACjC;AAEA,cAAI,QAAQ,OAAO,SAAS;AAC1B,uBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,kBAAI,UAAU,QAAW;AACvB,wBAAQ,GAAG,IAAI;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR;AAAA,cACA,MAAM,KAAK,UAAU,IAAI;AAAA,cACzB,QAAQ,QAAQ;AAAA,YAClB;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,OAAO,MAAM,kBAAwC,UAAU,OAAO,KAAK;AAGjF,cAAI,KAAK,WAAW,UAAU;AAC5B,kBAAM,UAAU,KAAK,OAAO,WAAW;AACvC,kBAAM,IAAI;AAAA,cACR;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA,aAAa;AAAA,YACf;AAAA,UACF;AAEA,iBAAOC,mBAAkB,IAAI;AAAA,QAC/B;AAAA,QAEA,OAAO,SAA0D;AAC/D,gBAAM,QAAQC,mBAAkB;AAChC,cAAI;AACJ,cAAI;AAEJ,gBAAM,kBAAkB,IAAI,QAAqB,CAAC,SAAS,WAAW;AACpE,8BAAkB;AAClB,6BAAiB;AAAA,UACnB,CAAC;AAED,0BAAgB,iBAA6D;AAC3E,gBAAI;AACF,oBAAM,SAAS,MAAM;AAAA,gBACnB,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,oBAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,oBAAM,OAAOF,kBAAiB,SAAS,OAAO;AAC9C,mBAAK,SAAS;AAEd,oBAAM,UAAkC;AAAA,gBACtC,gBAAgB;AAAA,gBAChB,eAAe,UAAU,MAAM;AAAA,gBAC/B,QAAQ;AAAA,cACV;AAEA,kBAAI,QAAQ,OAAO,SAAS;AAC1B,2BAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,sBAAI,UAAU,QAAW;AACvB,4BAAQ,GAAG,IAAI;AAAA,kBACjB;AAAA,gBACF;AAAA,cACF;AAEA,oBAAM,WAAW,MAAM;AAAA,gBACrB;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,KAAK,UAAU,IAAI;AAAA,kBACzB,QAAQ,QAAQ;AAAA,gBAClB;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACF;AAEA,kBAAI,CAAC,SAAS,IAAI;AAChB,sBAAM,QAAQ,MAAM,mBAAmB,UAAU,OAAO,KAAK;AAC7D,+BAAe,KAAK;AACpB,sBAAM;AAAA,cACR;AAEA,kBAAI,CAAC,SAAS,MAAM;AAClB,sBAAM,QAAQ,IAAI;AAAA,kBAChB;AAAA,kBACA,UAAU;AAAA,kBACV;AAAA,kBACA,aAAa;AAAA,gBACf;AACA,+BAAe,KAAK;AACpB,sBAAM;AAAA,cACR;AAEA,+BAAiB,QAAQ,eAAe,SAAS,IAAI,GAAG;AAEtD,oBAAI,SAAS,UAAU;AACrB;AAAA,gBACF;AAGA,oBAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,wBAAM,QAAQ;AAGd,sBAAI,MAAM,SAAS,SAAS;AAC1B,0BAAM,aAAa;AACnB,0BAAM,QAAQ,IAAI;AAAA,sBAChB,WAAW,MAAM;AAAA,sBACjB,UAAU;AAAA,sBACV;AAAA,sBACA,aAAa;AAAA,oBACf;AACA,mCAAe,KAAK;AACpB,0BAAM;AAAA,kBACR;AAEA,wBAAM,YAAYG,sBAAqB,OAAO,KAAK;AACnD,6BAAW,YAAY,WAAW;AAChC,0BAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAGA,8BAAgBC,wBAAuB,KAAK,CAAC;AAAA,YAC/C,SAAS,OAAO;AACd,oBAAM,MAAM,QAAQ,KAAK;AACzB,6BAAe,GAAG;AAClB,oBAAM;AAAA,YACR;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,CAAC,OAAO,aAAa,IAAI;AACvB,qBAAO,eAAe;AAAA,YACxB;AAAA,YACA,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACpPA,SAASC,iBAAgB,QAA4D;AACnF,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,UAAU,QAAQ;AAC7D,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,YAAa,MAA6B;AAChD,QAAI,OAAO,cAAc,UAAU;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,MAAM,IAAI;AACjD;AAYO,SAASC,kBACd,SACA,SACoB;AACpB,QAAM,SAAS,QAAQ,UAAW,CAAC;AACnC,QAAM,mBAAmBD,iBAAgB,QAAQ,MAAM;AAEvD,QAAM,aAAiC;AAAA,IACrC,GAAG;AAAA,IACH,OAAO;AAAA,IACP,UAAU,QAAQ,SAAS,IAAIE,iBAAgB;AAAA,EACjD;AAEA,MAAI,kBAAkB;AACpB,eAAW,SAAS;AAAA,EACtB;AAEA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,eAAW,QAAQ,QAAQ,MAAM,IAAIC,cAAa;AAClD,QAAI,CAAC,WAAW,aAAa;AAC3B,iBAAW,cAAc,EAAE,MAAM,OAAO;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,iBAAkC;AAAA,MACtC,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,YAAY,QAAQ,UAAU;AAAA,QAC9B,UAAU,QAAQ,UAAU;AAAA,MAC9B;AAAA,IACF;AAEA,eAAW,QAAQ,CAAC,GAAI,WAAW,SAAS,CAAC,GAAI,cAAc;AAC/D,eAAW,cAAc,EAAE,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACjE;AAEA,SAAO;AACT;AAQA,SAASC,oBAAgD,SAAmB;AAC1E,SAAO,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,SAAS,QAAQ;AAC9D;AASA,SAASF,kBAAiB,SAAsC;AAC9D,MAAI,cAAc,OAAO,GAAG;AAC1B,UAAM,eAAeE,oBAAmB,QAAQ,OAAO;AACvD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,aAAa,IAAIC,sBAAqB;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,mBAAmB,OAAO,GAAG;AAC/B,UAAM,eAAeD,oBAAmB,QAAQ,OAAO;AACvD,UAAM,UAAgC,CAAC;AAGvC,UAAM,UAAU,QAAQ,UAAU;AAKlC,eAAW,SAAS,cAAc;AAChC,UAAI,MAAM,SAAS,aAAa;AAC9B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,UAAW,MAAyB;AAAA,UACpC,WAAW,SAAS;AAAA,QACtB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,KAAKC,uBAAsB,KAAK,CAAC;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW;AACrB,iBAAW,QAAQ,QAAQ,WAAW;AACpC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,GAAG,CAAC;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,OAAO,GAAG;AAChC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,SACE,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,KAAK,UAAU,OAAO,MAAM;AAAA,QAClC,UAAU,OAAO;AAAA,MACnB,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,yBAAyB,QAAQ,IAAI,EAAE;AACzD;AASA,SAASA,uBAAsB,OAAyC;AACtE,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,IAE1C,KAAK,SAAS;AACZ,YAAM,aAAa;AACnB,UAAI,WAAW,OAAO,SAAS,UAAU;AACvC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY,WAAW;AAAA,YACvB,MAAM,WAAW,OAAO;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW,OAAO,SAAS,OAAO;AACpC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,KAAK,WAAW,OAAO;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW,OAAO,SAAS,SAAS;AACtC,cAAM,SAAS,OAAO,KAAK,WAAW,OAAO,IAAI,EAAE,SAAS,QAAQ;AACpE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY,WAAW;AAAA,YACvB,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,6BAA6B,MAAM,IAAI,EAAE;AAAA,EAC7D;AACF;AAQA,SAASF,eAAc,MAA6B;AAClD,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,YAAY,KAAK,WAAW;AAAA,MAC5B,UAAU,KAAK,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AAQO,SAASG,mBAAkB,MAAwC;AACxE,QAAM,UAA8B,CAAC;AACrC,QAAM,YAAwB,CAAC;AAC/B,MAAI;AACJ,MAAI;AAEJ,aAAW,SAAS,KAAK,SAAS;AAChC,QAAI,MAAM,SAAS,QAAQ;AACzB,cAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACjD,WAAW,MAAM,SAAS,YAAY;AAEpC,cAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,MAAM,SAAS,CAAC;AAExD,UAAI,MAAM,WAAW;AACnB,4BAAoB,MAAM;AAAA,MAC5B;AAAA,IACF,WAAW,MAAM,SAAS,YAAY;AACpC,UAAI,MAAM,SAAS,iBAAiB;AAClC,yBAAiB,MAAM;AAAA,MACzB;AACA,gBAAU,KAAK;AAAA,QACb,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI,KAAK;AAAA,MACT,UAAU;AAAA,QACR,KAAK;AAAA,UACH,aAAa,KAAK;AAAA,UAClB,eAAe,KAAK;AAAA,UACpB,OAAO,KAAK;AAAA;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAoB;AAAA,IACxB,aAAa,KAAK,MAAM;AAAA,IACxB,cAAc,KAAK,MAAM;AAAA,IACzB,aAAa,KAAK,MAAM,eAAe,KAAK,MAAM;AAAA,IAClD,iBAAiB,KAAK,MAAM,2BAA2B;AAAA,IACvD,kBAAkB,KAAK,MAAM,+BAA+B;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,KAAK,eAAe;AAAA,IAChC,MAAM;AAAA,EACR;AACF;AA0CO,SAASC,qBAAyC;AACvD,SAAO;AAAA,IACL,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS,CAAC;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AACF;AAWO,SAASC,sBACd,OACA,OACoB;AACpB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,YAAM,YAAY,MAAM,QAAQ;AAChC,YAAM,QAAQ,MAAM,QAAQ;AAC5B,YAAM,cAAc,MAAM,QAAQ,MAAM;AACxC,YAAM,kBAAkB,MAAM,QAAQ,MAAM,2BAA2B;AACvE,YAAM,mBAAmB,MAAM,QAAQ,MAAM,+BAA+B;AAC5E,aAAO,EAAE,MAAM,gBAAgB,cAAc,OAAO,GAAG,OAAO,CAAC,EAAE;AAAA,IAEnE,KAAK;AACH,YAAM,eAAe,MAAM;AAC3B,UAAI,MAAM,cAAc,SAAS,QAAQ;AACvC,cAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,MACxD,WAAW,MAAM,cAAc,SAAS,YAAY;AAClD,cAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,MAAM,YAAY,UAAU,GAAG;AAAA,MAChE,WAAW,MAAM,cAAc,SAAS,YAAY;AAClD,cAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,UAC3B,MAAM;AAAA,UACN,IAAI,MAAM,cAAc;AAAA,UACxB,MAAM,MAAM,cAAc;AAAA,UAC1B,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,EAAE,MAAM,gBAAgB,mBAAmB,OAAO,MAAM,OAAO,OAAO,CAAC,EAAE;AAAA,IAElF,KAAK,uBAAuB;AAC1B,YAAM,QAAQ,MAAM;AACpB,YAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,UAAI,MAAM,SAAS,cAAc;AAC/B,YAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,gBAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,QAClD;AACA,cAAM,QAAQ,KAAK,EAAG,QACnB,MAAM,QAAQ,KAAK,EAAG,QAAQ,MAAM,MAAM;AAC7C,eAAO;AAAA,UACL,MAAM,gBAAgB;AAAA,UACtB;AAAA,UACA,OAAO,EAAE,MAAM,MAAM,KAAK;AAAA,QAC5B;AAAA,MACF;AACA,UAAI,MAAM,SAAS,oBAAoB;AACrC,YAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,gBAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,YAAY,IAAI,IAAI,MAAM,IAAI,OAAO,GAAG;AAAA,QACzE;AACA,cAAM,QAAQ,KAAK,EAAG,SACnB,MAAM,QAAQ,KAAK,EAAG,SAAS,MAAM,MAAM;AAC9C,eAAO;AAAA,UACL,MAAM,gBAAgB;AAAA,UACtB;AAAA,UACA,OAAO;AAAA,YACL,eAAe,MAAM;AAAA,YACrB,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,YAClC,UAAU,MAAM,QAAQ,KAAK,GAAG;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM,SAAS,kBAAkB;AACnC,YAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,gBAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,YAAY,UAAU,GAAG;AAAA,QAC1D;AACA,cAAM,QAAQ,KAAK,EAAG,YACnB,MAAM,QAAQ,KAAK,EAAG,YAAY,MAAM,MAAM;AACjD,eAAO;AAAA,UACL,MAAM,gBAAgB;AAAA,UACtB;AAAA,UACA,OAAO,EAAE,MAAM,MAAM,SAAS;AAAA,QAChC;AAAA,MACF;AACA,UAAI,MAAM,SAAS,mBAAmB;AAEpC,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,QAAQ,KAAK,EAAG,YAAY,MAAM;AAAA,QAC1C;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,EAAE,MAAM,gBAAgB,kBAAkB,OAAO,MAAM,SAAS,MAAM,cAAc,OAAO,CAAC,EAAE;AAAA,IAEvG,KAAK;AACH,YAAM,aAAa,MAAM,MAAM;AAC/B,YAAM,eAAe,MAAM,MAAM;AACjC,aAAO;AAAA,IAET,KAAK;AACH,aAAO,EAAE,MAAM,gBAAgB,aAAa,OAAO,GAAG,OAAO,CAAC,EAAE;AAAA,IAElE,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IAET;AACE,aAAO;AAAA,EACX;AACF;AAWO,SAASC,wBAAuB,OAAyC;AAC9E,QAAM,UAA8B,CAAC;AACrC,QAAM,YAAwB,CAAC;AAC/B,MAAI;AACJ,MAAI;AAEJ,aAAW,SAAS,MAAM,SAAS;AACjC,QAAI,MAAM,SAAS,UAAU,MAAM,MAAM;AACvC,cAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACjD,WAAW,MAAM,SAAS,cAAc,MAAM,UAAU;AACtD,cAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,MAAM,SAAS,CAAC;AAExD,UAAI,MAAM,WAAW;AACnB,4BAAoB,MAAM;AAAA,MAC5B;AAAA,IACF,WAAW,MAAM,SAAS,cAAc,MAAM,MAAM,MAAM,MAAM;AAC9D,UAAI,OAAgC,CAAC;AACrC,UAAI,MAAM,OAAO;AACf,YAAI;AACF,iBAAO,KAAK,MAAM,MAAM,KAAK;AAAA,QAC/B,QAAQ;AAAA,QAER;AAAA,MACF;AACA,UAAI,MAAM,SAAS,iBAAiB;AAClC,yBAAiB;AAAA,MACnB;AACA,gBAAU,KAAK;AAAA,QACb,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,aAAa,WAAW;AAChD,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,KAAK;AAAA,UACH,aAAa,MAAM;AAAA,UACnB,OAAO,MAAM;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAoB;AAAA,IACxB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM,cAAc,MAAM;AAAA,IACvC,iBAAiB,MAAM;AAAA,IACvB,kBAAkB,MAAM;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,MAAM,cAAc;AAAA,IAChC,MAAM;AAAA,EACR;AACF;;;ACljBA,IAAM,uBAAuB;AAM7B,IAAM,4BAA6C;AAAA,EACjD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AACd;AA+BO,SAAS,2BAA0D;AACxE,MAAI,cAAqD;AAEzD,SAAO;AAAA,IACL,aAAa,UAA0C;AACrD,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAAmD;AACtD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,QAA0C;AAAA,QAC9C;AAAA,QACA,cAAc;AAAA,QAEd,IAAI,WAA2C;AAC7C,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,SAAS,SAA8D;AAC3E,gBAAM,SAAS,MAAM;AAAA,YACnB,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,gBAAM,OAAOC,kBAAiB,SAAS,OAAO;AAE9C,gBAAM,UAAkC;AAAA,YACtC,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,qBAAqB;AAAA,UACvB;AAEA,cAAI,QAAQ,OAAO,SAAS;AAC1B,uBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,kBAAI,UAAU,QAAW;AACvB,wBAAQ,GAAG,IAAI;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR;AAAA,cACA,MAAM,KAAK,UAAU,IAAI;AAAA,cACzB,QAAQ,QAAQ;AAAA,YAClB;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,OAAO,MAAM,kBAAuC,UAAU,OAAO,KAAK;AAChF,iBAAOC,mBAAkB,IAAI;AAAA,QAC/B;AAAA,QAEA,OAAO,SAAyD;AAC9D,gBAAM,QAAQC,mBAAkB;AAChC,cAAI;AACJ,cAAI;AAEJ,gBAAM,kBAAkB,IAAI,QAAqB,CAAC,SAAS,WAAW;AACpE,8BAAkB;AAClB,6BAAiB;AAAA,UACnB,CAAC;AAED,0BAAgB,iBAA6D;AAC3E,gBAAI;AACF,oBAAM,SAAS,MAAM;AAAA,gBACnB,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,oBAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,oBAAM,OAAOF,kBAAiB,SAAS,OAAO;AAC9C,mBAAK,SAAS;AAEd,oBAAM,UAAkC;AAAA,gBACtC,gBAAgB;AAAA,gBAChB,aAAa;AAAA,gBACb,qBAAqB;AAAA,gBACrB,QAAQ;AAAA,cACV;AAEA,kBAAI,QAAQ,OAAO,SAAS;AAC1B,2BAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,sBAAI,UAAU,QAAW;AACvB,4BAAQ,GAAG,IAAI;AAAA,kBACjB;AAAA,gBACF;AAAA,cACF;AAEA,oBAAM,WAAW,MAAM;AAAA,gBACrB;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,KAAK,UAAU,IAAI;AAAA,kBACzB,QAAQ,QAAQ;AAAA,gBAClB;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACF;AAEA,kBAAI,CAAC,SAAS,IAAI;AAChB,sBAAM,QAAQ,MAAM,mBAAmB,UAAU,OAAO,KAAK;AAC7D,+BAAe,KAAK;AACpB,sBAAM;AAAA,cACR;AAEA,kBAAI,CAAC,SAAS,MAAM;AAClB,sBAAM,QAAQ,IAAI;AAAA,kBAChB;AAAA,kBACA,UAAU;AAAA,kBACV;AAAA,kBACA,aAAa;AAAA,gBACf;AACA,+BAAe,KAAK;AACpB,sBAAM;AAAA,cACR;AAEA,+BAAiB,QAAQ,eAAe,SAAS,IAAI,GAAG;AAEtD,oBAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,MAAM;AAC/D,wBAAM,QAAQ;AAEd,sBAAI,MAAM,SAAS,SAAS;AAC1B,0BAAM,QAAQ,IAAI;AAAA,sBAChB,MAAM,MAAM;AAAA,sBACZ,UAAU;AAAA,sBACV;AAAA,sBACA,aAAa;AAAA,oBACf;AACA,mCAAe,KAAK;AACpB,0BAAM;AAAA,kBACR;AAEA,wBAAM,WAAWG,sBAAqB,OAAO,KAAK;AAClD,sBAAI,UAAU;AACZ,0BAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAGA,8BAAgBC,wBAAuB,KAAK,CAAC;AAAA,YAC/C,SAAS,OAAO;AACd,oBAAM,MAAM,QAAQ,KAAK;AACzB,6BAAe,GAAG;AAClB,oBAAM;AAAA,YACR;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,CAAC,OAAO,aAAa,IAAI;AACvB,qBAAO,eAAe;AAAA,YACxB;AAAA,YACA,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC9NA,IAAM,qBAAqB;AAgC3B,SAAS,gBAAgB,SAAoC;AAC3D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,IACX,MAAM;AAAA,IACN,WAAW;AAAA,EACb;AACF;AAmBO,SAAS,qBAAmD;AACjE,MAAI,cAAoD;AAExD,SAAO;AAAA,IACL,aAAa,UAAyC;AACpD,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAAkD;AACrD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,eAAe,gBAAgB,OAAO;AAE5C,YAAM,QAAyC;AAAA,QAC7C;AAAA,QACA;AAAA,QAEA,IAAI,WAA0C;AAC5C,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,SAAS,SAA+D;AAC5E,iBAAO,gBAAgB,SAAS,OAAO;AAAA,QACzC;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAKA,eAAe,gBACb,SACA,SACwB;AACxB,QAAM,SAAS,MAAM;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,OAAO,UAC3B,GAAG,QAAQ,OAAO,QAAQ,QAAQ,OAAO,EAAE,CAAC,2BAC5C;AAEJ,QAAM,OAAgC;AAAA,IACpC,OAAO;AAAA,IACP,QAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,EAAE,GAAG,iBAAiB,KAAK,IAAI,QAAQ;AAC7C,QAAI,MAAM,OAAW,MAAK,IAAI;AAC9B,QAAI,oBAAoB,OAAW,MAAK,kBAAkB;AAC1D,QAAI,SAAS,OAAW,MAAK,OAAO;AAAA,EACtC;AAEA,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,eAAe,UAAU,MAAM;AAAA,EACjC;AAEA,MAAI,QAAQ,OAAO,SAAS;AAC1B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG;AACjE,UAAI,UAAU,QAAW;AACvB,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,QAAQ,SAAS;AAAA,IACtC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,QAAQ;AAAA,EAClB,GAAG,QAAQ,QAAQ,OAAO,OAAO;AAEjC,QAAM,OAAO,MAAM,kBAAqC,UAAU,OAAO,OAAO;AAEhF,SAAOC,mBAAkB,IAAI;AAC/B;AAKA,SAASA,mBAAkB,MAAwC;AACjE,QAAM,SAA2B,KAAK,KAAK,IAAI,CAAC,SAAS;AACvD,QAAI;AACJ,QAAI,KAAK,UAAU;AACjB,cAAQ,MAAM,WAAW,KAAK,UAAU,YAAY;AAAA,IACtD,WAAW,KAAK,KAAK;AACnB,cAAQ,MAAM,QAAQ,KAAK,KAAK,YAAY;AAAA,IAC9C,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA;AAAA,MAEA,UAAU,KAAK,iBACX,EAAE,KAAK,EAAE,gBAAgB,KAAK,eAAe,EAAE,IAC/C;AAAA,IACN;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,iBAAiB,OAAO;AAAA,IAC1B;AAAA,EACF;AACF;;;ACsPO,SAAS,cAAc,SAIT;AACnB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAwBO,SAAS,YAAY,SAOT;AACjB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAeO,SAAS,oBAA0C;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAoBO,SAAS,eAAe,SAIT;AACpB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,kBAAkB,QAAQ;AAAA,IAC1B,GAAI,QAAQ,oBAAoB,UAAa,EAAE,iBAAiB,QAAQ,gBAAgB;AAAA,IACxF,GAAI,QAAQ,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,eAAe,EAAE;AAAA,EACnF;AACF;AAoBO,SAAS,QAAQ,SAOT;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAyBO,IAAM,QAAQ;AAAA;AAAA,EAEnB,WAAW;AAAA;AAAA,EAEX,SAAS;AAAA;AAAA,EAET,eAAe;AAAA;AAAA,EAEf,YAAY;AAAA;AAAA,EAEZ,KAAK;AACP;;;ACzfO,IAAM,MAAM,eAAmC;AAAA,EACpD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,IACR,KAAK;AAAA,MACH,UAAU;AAAA,QACR,aAAa,4BAA4B;AAAA,QACzC,WAAW,0BAA0B;AAAA,QACrC,UAAU,yBAAyB;AAAA,MACrC;AAAA,MACA,aAAa;AAAA,MACb,SAAS,CAAC,YAAY,SAAS,OAAO;AAAA,IACxC;AAAA,IACA,OAAO,mBAAmB;AAAA,EAC5B;AACF,CAAC;","names":["transformRequest","transformTool","normalizeSystem","transformMessage","filterValidContent","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","transformRequest","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","normalizeSystem","transformRequest","transformMessage","transformTool","filterValidContent","transformContentBlock","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","transformRequest","transformResponse","createStreamState","transformStreamEvent","buildResponseFromState","transformResponse"]}
|