@providerprotocol/ai 0.0.17 → 0.0.18

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.
@@ -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/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 type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.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) return undefined;\n if (typeof system === 'string') return system;\n return (system as Array<{text?: string}>)\n .map(block => block.text ?? '')\n .filter(text => text.length > 0)\n .join('\\n\\n');\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 textContent: TextBlock[] = [];\n let structuredData: unknown;\n if (choice.message.content) {\n textContent.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 textContent.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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id,\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 /** 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 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: 'message_start', 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 if (choice.delta.content) {\n state.text += choice.delta.content;\n events.push({\n type: 'text_delta',\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: 'text_delta',\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: 'tool_call_delta',\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: 'message_stop', 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 textContent: TextBlock[] = [];\n let structuredData: unknown;\n if (state.text) {\n textContent.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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: state.id,\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 { LLMHandler, BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError } 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 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 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 'INVALID_REQUEST',\n 'xai',\n '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 response.json()) as XAICompletionsResponse;\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 };\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 'PROVIDER_ERROR',\n 'xai',\n '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 'PROVIDER_ERROR',\n 'xai',\n '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 responseReject(error as Error);\n throw error;\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 type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport type {\n XAIResponsesParams,\n XAIResponsesRequest,\n XAIResponsesInputItem,\n XAIResponsesContentPart,\n XAIResponsesTool,\n XAIResponsesResponse,\n XAIResponsesStreamEvent,\n XAIResponsesOutputItem,\n XAIResponsesMessageOutput,\n XAIResponsesFunctionCallOutput,\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 const xaiRequest: XAIResponsesRequest = {\n ...params,\n model: modelId,\n input: transformInputItems(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.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) return undefined;\n if (typeof system === 'string') return system;\n return (system as Array<{text?: string}>)\n .map(block => block.text ?? '')\n .filter(text => text.length > 0)\n .join('\\n\\n');\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 | { functionCallItems?: Array<{ id: string; call_id: string; name: string; arguments: string }> }\n | undefined;\n const functionCallItems = xaiMeta?.functionCallItems;\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 textContent: TextBlock[] = [];\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\n for (const item of data.output) {\n if (item.type === 'message') {\n const messageItem = item as XAIResponsesMessageOutput;\n for (const content of messageItem.content) {\n if (content.type === 'output_text') {\n textContent.push({ type: 'text', text: content.text });\n if (structuredData === undefined) {\n try {\n structuredData = JSON.parse(content.text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n } else if (content.type === 'refusal') {\n textContent.push({ type: 'text', text: content.refusal });\n hadRefusal = true;\n }\n }\n } else if (item.type === 'function_call') {\n const functionCall = item as XAIResponsesFunctionCallOutput;\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 }\n }\n\n const message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id,\n metadata: {\n xai: {\n model: data.model,\n status: data.status,\n response_id: data.id,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\n citations: data.citations,\n inline_citations: data.inline_citations,\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 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}\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 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: 'message_start', 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: 'message_stop', index: 0, delta: {} });\n break;\n\n case 'response.failed':\n state.status = 'failed';\n events.push({ type: 'message_stop', index: 0, delta: {} });\n break;\n\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const functionCall = event.item as XAIResponsesFunctionCallOutput;\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: 'content_block_start',\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 as XAIResponsesFunctionCallOutput;\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: 'content_block_stop',\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: 'text_delta',\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: 'text_delta',\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: 'tool_call_delta',\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 '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 textContent: TextBlock[] = [];\n let structuredData: unknown;\n\n for (const [, text] of state.textByIndex) {\n if (text) {\n textContent.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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: state.id,\n metadata: {\n xai: {\n model: state.model,\n status: state.status,\n response_id: state.id,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\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 { LLMHandler, BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError } 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 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 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 'INVALID_REQUEST',\n 'xai',\n '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 response.json()) as XAIResponsesResponse;\n\n // Check for error in response\n if (data.status === 'failed' && data.error) {\n throw new UPPError(\n data.error.message,\n 'PROVIDER_ERROR',\n 'xai',\n '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 };\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 'PROVIDER_ERROR',\n 'xai',\n '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 'PROVIDER_ERROR',\n 'xai',\n '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 responseReject(error as Error);\n throw error;\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 type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.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) return undefined;\n if (typeof system === 'string') return system;\n return (system as Array<{ text?: string }>)\n .map((block) => block.text ?? '')\n .filter((text) => text.length > 0)\n .join('\\n\\n');\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[] = validContent.map(transformContentBlock);\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 textContent: TextBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n\n for (const block of data.content) {\n if (block.type === 'text') {\n textContent.push({ type: 'text', text: block.text });\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 textContent,\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 },\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<{ type: string; text?: string; id?: string; name?: string; input?: string }>;\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: 'message_start', 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 === '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: 'content_block_start', 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: 'text_delta',\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: 'tool_call_delta',\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 return {\n type: 'reasoning_delta',\n index: index,\n delta: { text: delta.thinking },\n };\n }\n return null;\n }\n\n case 'content_block_stop':\n return { type: 'content_block_stop', 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: 'message_stop', 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 textContent: TextBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n\n for (const block of state.content) {\n if (block.type === 'text' && block.text) {\n textContent.push({ type: 'text', text: block.text });\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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: state.messageId,\n metadata: {\n xai: {\n stop_reason: state.stopReason,\n model: state.model,\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 { LLMHandler, BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError } 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 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 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 'INVALID_REQUEST',\n 'xai',\n '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 response.json()) as XAIMessagesResponse;\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 };\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 'PROVIDER_ERROR',\n 'xai',\n '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 'PROVIDER_ERROR',\n 'xai',\n '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 responseReject(error as Error);\n throw error;\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 * 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 * builtInTools: [\n * tools.webSearch(),\n * tools.xSearch({ from_date: '2025-01-01' }),\n * tools.codeExecution(),\n * ],\n * },\n * });\n * ```\n */\n builtInTools?: 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 * container: {\n * pip_packages: ['numpy', 'pandas'],\n * },\n * };\n * ```\n */\nexport interface XAICodeExecutionTool {\n /** Tool type identifier */\n type: 'code_interpreter';\n /** Container configuration */\n container?: {\n /** Additional pip packages to install */\n pip_packages?: string[];\n };\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 * @param options - Optional configuration for the execution environment\n * @returns A code execution tool configuration object\n *\n * @example\n * ```typescript\n * // Basic code execution\n * const codeExec = codeExecutionTool();\n *\n * // With additional packages\n * const codeExecWithPackages = codeExecutionTool({\n * pip_packages: ['numpy', 'pandas', 'scipy'],\n * });\n * ```\n */\nexport function codeExecutionTool(options?: {\n pip_packages?: string[];\n}): XAICodeExecutionTool {\n return {\n type: 'code_interpreter',\n ...(options?.pip_packages && { container: { pip_packages: options.pip_packages } }),\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 * builtInTools: [\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}\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}\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?: XAIResponsesTool[];\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\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\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 | 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 when an error occurs during streaming. */\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 */\nexport type XAIMessagesContent =\n | XAIMessagesTextContent\n | XAIMessagesImageContent\n | XAIMessagesToolUseContent\n | XAIMessagesToolResultContent;\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","import type {\n Provider,\n ModelReference,\n LLMHandler,\n LLMProvider,\n} from '../../types/provider.ts';\nimport { createCompletionsLLMHandler } from './llm.completions.ts';\nimport { createResponsesLLMHandler } from './llm.responses.ts';\nimport { createMessagesLLMHandler } from './llm.messages.ts';\nimport type { XAICompletionsParams, XAIResponsesParams, XAIMessagesParams, XAIConfig, XAIAPIMode } from './types.ts';\n\n/**\n * Union type for LLM parameters across all xAI API modes.\n * This type enables the provider to handle parameters from any of the three APIs.\n */\ntype XAILLMParamsUnion = XAICompletionsParams | XAIResponsesParams | XAIMessagesParams;\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 * xAI provider with configurable API mode\n *\n * xAI's APIs are compatible with OpenAI and Anthropic SDKs, supporting three API modes:\n * - Chat Completions API (OpenAI-compatible) - default, recommended\n * - Responses API (OpenAI Responses-compatible) - stateful conversations\n * - Messages API (Anthropic-compatible) - for migration from Anthropic\n *\n * @example\n * // Using the Chat Completions API (default)\n * const model = xai('grok-4');\n *\n * @example\n * // Using the Responses API (stateful)\n * const model = xai('grok-4', { api: 'responses' });\n *\n * @example\n * // Using the Messages API (Anthropic-compatible)\n * const model = xai('grok-4', { api: 'messages' });\n */\nexport interface XAIProvider extends Provider<XAIProviderOptions> {\n /**\n * Create a model reference\n * @param modelId - The model identifier (e.g., 'grok-4', 'grok-4.1-fast', 'grok-3-mini')\n * @param options - Provider options including API selection\n */\n (modelId: string, options?: XAIProviderOptions): ModelReference<XAIProviderOptions>;\n\n /** Provider name */\n readonly name: 'xai';\n\n /** Provider version */\n readonly version: string;\n\n /** Supported modalities */\n readonly modalities: {\n llm: LLMHandler<XAILLMParamsUnion>;\n };\n}\n\n/**\n * Creates the xAI provider instance with support for all three API modes.\n *\n * @returns The configured xAI provider\n */\nfunction createXAIProvider(): XAIProvider {\n let currentApiMode: XAIAPIMode = 'completions';\n\n const completionsHandler = createCompletionsLLMHandler();\n const responsesHandler = createResponsesLLMHandler();\n const messagesHandler = createMessagesLLMHandler();\n\n const fn = function (\n modelId: string,\n options?: XAIProviderOptions\n ): ModelReference<XAIProviderOptions> {\n const apiMode = options?.api ?? 'completions';\n currentApiMode = apiMode;\n return { modelId, provider };\n };\n\n const modalities = {\n get llm(): LLMHandler<XAILLMParamsUnion> {\n switch (currentApiMode) {\n case 'responses':\n return responsesHandler as unknown as LLMHandler<XAILLMParamsUnion>;\n case 'messages':\n return messagesHandler as unknown as LLMHandler<XAILLMParamsUnion>;\n case 'completions':\n default:\n return completionsHandler as unknown as LLMHandler<XAILLMParamsUnion>;\n }\n },\n };\n\n Object.defineProperties(fn, {\n name: {\n value: 'xai',\n writable: false,\n configurable: true,\n },\n version: {\n value: '1.0.0',\n writable: false,\n configurable: true,\n },\n modalities: {\n value: modalities,\n writable: false,\n configurable: true,\n },\n });\n\n const provider = fn as XAIProvider;\n\n completionsHandler._setProvider?.(provider as unknown as LLMProvider<XAICompletionsParams>);\n responsesHandler._setProvider?.(provider as unknown as LLMProvider<XAIResponsesParams>);\n messagesHandler._setProvider?.(provider as unknown as LLMProvider<XAIMessagesParams>);\n\n return provider;\n}\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 = createXAIProvider();\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"],"mappings":";;;;;;;;;;;;;;;;;;AAkCO,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,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAQ,OACL,IAAI,WAAS,MAAM,QAAQ,EAAE,EAC7B,OAAO,UAAQ,KAAK,SAAS,CAAC,EAC9B,KAAK,MAAM;AAChB;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;AAE7C,cAAM,SAAS;AAAA,UACb,MAAM,KAAK,WAAW,OAAO,IAAI,EAC9B,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,EACjC,KAAK,EAAE;AAAA,QACZ;AACA,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,cAA2B,CAAC;AAClC,MAAI;AACJ,MAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,QAAQ,CAAC;AAC/D,QAAI;AACF,uBAAiB,KAAK,MAAM,OAAO,QAAQ,OAAO;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,aAAa;AACjB,MAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,QAAQ,CAAC;AAC/D,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,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI,KAAK;AAAA,MACT,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;AAkCO,SAAS,oBAA4C;AAC1D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,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,iBAAiB,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,EAC5D;AACA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,QAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,MAAI,QAAQ;AACV,QAAI,OAAO,MAAM,SAAS;AACxB,YAAM,QAAQ,OAAO,MAAM;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,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;AAAA,QACN,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;AAAA,YACN;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,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IAC3D;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,cAA2B,CAAC;AAClC,MAAI;AACJ,MAAI,MAAM,MAAM;AACd,gBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AACnD,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,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI,MAAM;AAAA,MACV,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;;;ACplBA,IAAM,0BAA0B;AAMhC,IAAM,+BAAgD;AAAA,EACpD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,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;AAAA,UACA;AAAA,UACA;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,OAAQ,MAAM,SAAS,KAAK;AAClC,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,cACjC;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;AAAA,kBACA;AAAA,kBACA;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;AAAA,sBACA;AAAA,sBACA;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,6BAAe,KAAc;AAC7B,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;;;AClNO,SAASA,kBACd,SACA,SACqB;AACrB,QAAM,SAAS,QAAQ,UAAW,CAAC;AAEnC,QAAM,aAAkC;AAAA,IACtC,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO,oBAAoB,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC7D;AAEA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,eAAW,QAAQ,QAAQ,MAAM,IAAIC,cAAa;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,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,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAQ,OACL,IAAI,WAAS,MAAM,QAAQ,EAAE,EAC7B,OAAO,UAAQ,KAAK,SAAS,CAAC,EAC9B,KAAK,MAAM;AAChB;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;AAGlC,UAAM,oBAAoB,SAAS;AAEnC,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;AAEtC,cAAM,SAAS;AAAA,UACb,MAAM,KAAK,WAAW,OAAO,IAAI,EAC9B,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,EACjC,KAAK,EAAE;AAAA,QACZ;AACA,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,cAA2B,CAAC;AAClC,QAAM,YAAwB,CAAC;AAC/B,QAAM,oBAKD,CAAC;AACN,MAAI,aAAa;AACjB,MAAI;AAEJ,aAAW,QAAQ,KAAK,QAAQ;AAC9B,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,cAAc;AACpB,iBAAW,WAAW,YAAY,SAAS;AACzC,YAAI,QAAQ,SAAS,eAAe;AAClC,sBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,KAAK,CAAC;AACrD,cAAI,mBAAmB,QAAW;AAChC,gBAAI;AACF,+BAAiB,KAAK,MAAM,QAAQ,IAAI;AAAA,YAC1C,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,SAAS,WAAW;AACrC,sBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AACxD,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;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,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,aAAa,KAAK;AAAA,UAClB,mBACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,UACrD,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,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;AAqCO,SAASC,qBAA0C;AACxD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa,oBAAI,IAAI;AAAA,IACrB,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,iBAAiB,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAC1D;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,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AACzD;AAAA,IAEF,KAAK;AACH,YAAM,SAAS;AACf,aAAO,KAAK,EAAE,MAAM,gBAAgB,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AACzD;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;AAAA,QACN,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;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,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;AAAA,QACN,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;AAAA,QACN,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;AAAA,QACN,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;AACH;AAAA,IAEF;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAWO,SAASC,wBAAuB,OAA0C;AAC/E,QAAM,cAA2B,CAAC;AAClC,MAAI;AAEJ,aAAW,CAAC,EAAE,IAAI,KAAK,MAAM,aAAa;AACxC,QAAI,MAAM;AACR,kBAAY,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AACvC,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,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI,MAAM;AAAA,MACV,UAAU;AAAA,QACR,KAAK;AAAA,UACH,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,aAAa,MAAM;AAAA,UACnB,mBACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,QACvD;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;;;ACrsBA,IAAM,wBAAwB;AAM9B,IAAM,6BAA8C;AAAA,EAClD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,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;AAAA,UACA;AAAA,UACA;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,OAAQ,MAAM,SAAS,KAAK;AAGlC,cAAI,KAAK,WAAW,YAAY,KAAK,OAAO;AAC1C,kBAAM,IAAI;AAAA,cACR,KAAK,MAAM;AAAA,cACX;AAAA,cACA;AAAA,cACA;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,cACjC;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;AAAA,kBACA;AAAA,kBACA;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;AAAA,sBACA;AAAA,sBACA;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,6BAAe,KAAc;AAC7B,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;;;AC/OA,SAASC,iBAAgB,QAA4D;AACnF,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAQ,OACL,IAAI,CAAC,UAAU,MAAM,QAAQ,EAAE,EAC/B,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,MAAM;AAChB;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,eAAW,cAAc,EAAE,MAAM,OAAO;AAAA,EAC1C;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,aAAa,IAAIC,sBAAqB;AAE5E,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;AAEtC,cAAM,SAAS;AAAA,UACb,MAAM,KAAK,WAAW,OAAO,IAAI,EAC9B,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,EACjC,KAAK,EAAE;AAAA,QACZ;AACA,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,cAA2B,CAAC;AAClC,QAAM,YAAwB,CAAC;AAC/B,MAAI;AAEJ,aAAW,SAAS,KAAK,SAAS;AAChC,QAAI,MAAM,SAAS,QAAQ;AACzB,kBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACrD,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,QACd;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;AAkCO,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,iBAAiB,OAAO,GAAG,OAAO,CAAC,EAAE;AAAA,IAEtD,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;AAAA,UAC3B,MAAM;AAAA,UACN,IAAI,MAAM,cAAc;AAAA,UACxB,MAAM,MAAM,cAAc;AAAA,UAC1B,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,EAAE,MAAM,uBAAuB,OAAO,MAAM,OAAO,OAAO,CAAC,EAAE;AAAA,IAEtE,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;AAAA,UACN;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;AAAA,UACN;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,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,OAAO,EAAE,MAAM,MAAM,SAAS;AAAA,QAChC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,EAAE,MAAM,sBAAsB,OAAO,MAAM,SAAS,MAAM,cAAc,OAAO,CAAC,EAAE;AAAA,IAE3F,KAAK;AACH,YAAM,aAAa,MAAM,MAAM;AAC/B,YAAM,eAAe,MAAM,MAAM;AACjC,aAAO;AAAA,IAET,KAAK;AACH,aAAO,EAAE,MAAM,gBAAgB,OAAO,GAAG,OAAO,CAAC,EAAE;AAAA,IAErD,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IAET;AACE,aAAO;AAAA,EACX;AACF;AAWO,SAASC,wBAAuB,OAAyC;AAC9E,QAAM,cAA2B,CAAC;AAClC,QAAM,YAAwB,CAAC;AAC/B,MAAI;AAEJ,aAAW,SAAS,MAAM,SAAS;AACjC,QAAI,MAAM,SAAS,UAAU,MAAM,MAAM;AACvC,kBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACrD,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,UAAU,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,IAAI,YAAY;AAAA,IACnC;AAAA,MACE,IAAI,MAAM;AAAA,MACV,UAAU;AAAA,QACR,KAAK;AAAA,UACH,aAAa,MAAM;AAAA,UACnB,OAAO,MAAM;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;;;AC7dA,IAAM,uBAAuB;AAM7B,IAAM,4BAA6C;AAAA,EACjD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,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;AAAA,UACA;AAAA,UACA;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,OAAQ,MAAM,SAAS,KAAK;AAClC,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,cACvB;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;AAAA,kBACA;AAAA,kBACA;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;AAAA,sBACA;AAAA,sBACA;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,6BAAe,KAAc;AAC7B,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;;;ACqPO,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;AAsBO,SAAS,kBAAkB,SAET;AACvB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,SAAS,gBAAgB,EAAE,WAAW,EAAE,cAAc,QAAQ,aAAa,EAAE;AAAA,EACnF;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;;;ACpkBA,SAAS,oBAAiC;AACxC,MAAI,iBAA6B;AAEjC,QAAM,qBAAqB,4BAA4B;AACvD,QAAM,mBAAmB,0BAA0B;AACnD,QAAM,kBAAkB,yBAAyB;AAEjD,QAAM,KAAK,SACT,SACA,SACoC;AACpC,UAAM,UAAU,SAAS,OAAO;AAChC,qBAAiB;AACjB,WAAO,EAAE,SAAS,SAAS;AAAA,EAC7B;AAEA,QAAM,aAAa;AAAA,IACjB,IAAI,MAAqC;AACvC,cAAQ,gBAAgB;AAAA,QACtB,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AAAA,QACL;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iBAAiB,IAAI;AAAA,IAC1B,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAED,QAAM,WAAW;AAEjB,qBAAmB,eAAe,QAAwD;AAC1F,mBAAiB,eAAe,QAAsD;AACtF,kBAAgB,eAAe,QAAqD;AAEpF,SAAO;AACT;AA8EO,IAAM,MAAM,kBAAkB;","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"]}
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/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 type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.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) return undefined;\n if (typeof system === 'string') return system;\n return (system as Array<{text?: string}>)\n .map(block => block.text ?? '')\n .filter(text => text.length > 0)\n .join('\\n\\n');\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 textContent: TextBlock[] = [];\n let structuredData: unknown;\n if (choice.message.content) {\n textContent.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 textContent.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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id,\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 /** 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 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: 'message_start', 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 if (choice.delta.content) {\n state.text += choice.delta.content;\n events.push({\n type: 'text_delta',\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: 'text_delta',\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: 'tool_call_delta',\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: 'message_stop', 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 textContent: TextBlock[] = [];\n let structuredData: unknown;\n if (state.text) {\n textContent.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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: state.id,\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 { LLMHandler, BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError } 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 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 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 'INVALID_REQUEST',\n 'xai',\n '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 response.json()) as XAICompletionsResponse;\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 };\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 'PROVIDER_ERROR',\n 'xai',\n '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 'PROVIDER_ERROR',\n 'xai',\n '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 responseReject(error as Error);\n throw error;\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 type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport type {\n XAIResponsesParams,\n XAIResponsesRequest,\n XAIResponsesInputItem,\n XAIResponsesContentPart,\n XAIResponsesTool,\n XAIResponsesResponse,\n XAIResponsesStreamEvent,\n XAIResponsesOutputItem,\n XAIResponsesMessageOutput,\n XAIResponsesFunctionCallOutput,\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 const xaiRequest: XAIResponsesRequest = {\n ...params,\n model: modelId,\n input: transformInputItems(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.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) return undefined;\n if (typeof system === 'string') return system;\n return (system as Array<{text?: string}>)\n .map(block => block.text ?? '')\n .filter(text => text.length > 0)\n .join('\\n\\n');\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 | { functionCallItems?: Array<{ id: string; call_id: string; name: string; arguments: string }> }\n | undefined;\n const functionCallItems = xaiMeta?.functionCallItems;\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 textContent: TextBlock[] = [];\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\n for (const item of data.output) {\n if (item.type === 'message') {\n const messageItem = item as XAIResponsesMessageOutput;\n for (const content of messageItem.content) {\n if (content.type === 'output_text') {\n textContent.push({ type: 'text', text: content.text });\n if (structuredData === undefined) {\n try {\n structuredData = JSON.parse(content.text);\n } catch {\n // Not valid JSON, which is fine for non-structured responses\n }\n }\n } else if (content.type === 'refusal') {\n textContent.push({ type: 'text', text: content.refusal });\n hadRefusal = true;\n }\n }\n } else if (item.type === 'function_call') {\n const functionCall = item as XAIResponsesFunctionCallOutput;\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 }\n }\n\n const message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id,\n metadata: {\n xai: {\n model: data.model,\n status: data.status,\n response_id: data.id,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\n citations: data.citations,\n inline_citations: data.inline_citations,\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 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}\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 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: 'message_start', 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: 'message_stop', index: 0, delta: {} });\n break;\n\n case 'response.failed':\n state.status = 'failed';\n events.push({ type: 'message_stop', index: 0, delta: {} });\n break;\n\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const functionCall = event.item as XAIResponsesFunctionCallOutput;\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: 'content_block_start',\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 as XAIResponsesFunctionCallOutput;\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: 'content_block_stop',\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: 'text_delta',\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: 'text_delta',\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: 'tool_call_delta',\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 '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 textContent: TextBlock[] = [];\n let structuredData: unknown;\n\n for (const [, text] of state.textByIndex) {\n if (text) {\n textContent.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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: state.id,\n metadata: {\n xai: {\n model: state.model,\n status: state.status,\n response_id: state.id,\n functionCallItems:\n functionCallItems.length > 0 ? functionCallItems : undefined,\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 { LLMHandler, BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError } 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 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 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 'INVALID_REQUEST',\n 'xai',\n '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 response.json()) as XAIResponsesResponse;\n\n // Check for error in response\n if (data.status === 'failed' && data.error) {\n throw new UPPError(\n data.error.message,\n 'PROVIDER_ERROR',\n 'xai',\n '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 };\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 'PROVIDER_ERROR',\n 'xai',\n '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 'PROVIDER_ERROR',\n 'xai',\n '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 responseReject(error as Error);\n throw error;\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 type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.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) return undefined;\n if (typeof system === 'string') return system;\n return (system as Array<{ text?: string }>)\n .map((block) => block.text ?? '')\n .filter((text) => text.length > 0)\n .join('\\n\\n');\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[] = validContent.map(transformContentBlock);\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 textContent: TextBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n\n for (const block of data.content) {\n if (block.type === 'text') {\n textContent.push({ type: 'text', text: block.text });\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 textContent,\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 },\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<{ type: string; text?: string; id?: string; name?: string; input?: string }>;\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: 'message_start', 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 === '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: 'content_block_start', 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: 'text_delta',\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: 'tool_call_delta',\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 return {\n type: 'reasoning_delta',\n index: index,\n delta: { text: delta.thinking },\n };\n }\n return null;\n }\n\n case 'content_block_stop':\n return { type: 'content_block_stop', 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: 'message_stop', 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 textContent: TextBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let structuredData: unknown;\n\n for (const block of state.content) {\n if (block.type === 'text' && block.text) {\n textContent.push({ type: 'text', text: block.text });\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 message = new AssistantMessage(\n textContent,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: state.messageId,\n metadata: {\n xai: {\n stop_reason: state.stopReason,\n model: state.model,\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 { LLMHandler, BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport { UPPError } 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 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 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 'INVALID_REQUEST',\n 'xai',\n '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 response.json()) as XAIMessagesResponse;\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 };\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 'PROVIDER_ERROR',\n 'xai',\n '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 'PROVIDER_ERROR',\n 'xai',\n '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 responseReject(error as Error);\n throw error;\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 * 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 * builtInTools: [\n * tools.webSearch(),\n * tools.xSearch({ from_date: '2025-01-01' }),\n * tools.codeExecution(),\n * ],\n * },\n * });\n * ```\n */\n builtInTools?: 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 * container: {\n * pip_packages: ['numpy', 'pandas'],\n * },\n * };\n * ```\n */\nexport interface XAICodeExecutionTool {\n /** Tool type identifier */\n type: 'code_interpreter';\n /** Container configuration */\n container?: {\n /** Additional pip packages to install */\n pip_packages?: string[];\n };\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 * @param options - Optional configuration for the execution environment\n * @returns A code execution tool configuration object\n *\n * @example\n * ```typescript\n * // Basic code execution\n * const codeExec = codeExecutionTool();\n *\n * // With additional packages\n * const codeExecWithPackages = codeExecutionTool({\n * pip_packages: ['numpy', 'pandas', 'scipy'],\n * });\n * ```\n */\nexport function codeExecutionTool(options?: {\n pip_packages?: string[];\n}): XAICodeExecutionTool {\n return {\n type: 'code_interpreter',\n ...(options?.pip_packages && { container: { pip_packages: options.pip_packages } }),\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 * builtInTools: [\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}\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}\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?: XAIResponsesTool[];\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\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\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 | 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 when an error occurs during streaming. */\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 */\nexport type XAIMessagesContent =\n | XAIMessagesTextContent\n | XAIMessagesImageContent\n | XAIMessagesToolUseContent\n | XAIMessagesToolResultContent;\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","import type {\n Provider,\n ModelReference,\n LLMHandler,\n LLMProvider,\n} from '../../types/provider.ts';\nimport { createCompletionsLLMHandler } from './llm.completions.ts';\nimport { createResponsesLLMHandler } from './llm.responses.ts';\nimport { createMessagesLLMHandler } from './llm.messages.ts';\nimport type { XAICompletionsParams, XAIResponsesParams, XAIMessagesParams, XAIConfig, XAIAPIMode } from './types.ts';\n\n/**\n * Union type for LLM parameters across all xAI API modes.\n * This type enables the provider to handle parameters from any of the three APIs.\n */\ntype XAILLMParamsUnion = XAICompletionsParams | XAIResponsesParams | XAIMessagesParams;\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 * xAI provider with configurable API mode\n *\n * xAI's APIs are compatible with OpenAI and Anthropic SDKs, supporting three API modes:\n * - Chat Completions API (OpenAI-compatible) - default, recommended\n * - Responses API (OpenAI Responses-compatible) - stateful conversations\n * - Messages API (Anthropic-compatible) - for migration from Anthropic\n *\n * @example\n * // Using the Chat Completions API (default)\n * const model = xai('grok-4');\n *\n * @example\n * // Using the Responses API (stateful)\n * const model = xai('grok-4', { api: 'responses' });\n *\n * @example\n * // Using the Messages API (Anthropic-compatible)\n * const model = xai('grok-4', { api: 'messages' });\n */\nexport interface XAIProvider extends Provider<XAIProviderOptions> {\n /**\n * Create a model reference\n * @param modelId - The model identifier (e.g., 'grok-4', 'grok-4.1-fast', 'grok-3-mini')\n * @param options - Provider options including API selection\n */\n (modelId: string, options?: XAIProviderOptions): ModelReference<XAIProviderOptions>;\n\n /** Provider name */\n readonly name: 'xai';\n\n /** Provider version */\n readonly version: string;\n\n /** Supported modalities */\n readonly modalities: {\n llm: LLMHandler<XAILLMParamsUnion>;\n };\n}\n\n/**\n * Creates the xAI provider instance with support for all three API modes.\n *\n * @returns The configured xAI provider\n */\nfunction createXAIProvider(): XAIProvider {\n let currentApiMode: XAIAPIMode = 'completions';\n\n const completionsHandler = createCompletionsLLMHandler();\n const responsesHandler = createResponsesLLMHandler();\n const messagesHandler = createMessagesLLMHandler();\n\n const fn = function (\n modelId: string,\n options?: XAIProviderOptions\n ): ModelReference<XAIProviderOptions> {\n const apiMode = options?.api ?? 'completions';\n currentApiMode = apiMode;\n return { modelId, provider };\n };\n\n const modalities = {\n get llm(): LLMHandler<XAILLMParamsUnion> {\n switch (currentApiMode) {\n case 'responses':\n return responsesHandler as unknown as LLMHandler<XAILLMParamsUnion>;\n case 'messages':\n return messagesHandler as unknown as LLMHandler<XAILLMParamsUnion>;\n case 'completions':\n default:\n return completionsHandler as unknown as LLMHandler<XAILLMParamsUnion>;\n }\n },\n };\n\n Object.defineProperties(fn, {\n name: {\n value: 'xai',\n writable: false,\n configurable: true,\n },\n version: {\n value: '1.0.0',\n writable: false,\n configurable: true,\n },\n modalities: {\n value: modalities,\n writable: false,\n configurable: true,\n },\n });\n\n const provider = fn as XAIProvider;\n\n completionsHandler._setProvider?.(provider as unknown as LLMProvider<XAICompletionsParams>);\n responsesHandler._setProvider?.(provider as unknown as LLMProvider<XAIResponsesParams>);\n messagesHandler._setProvider?.(provider as unknown as LLMProvider<XAIMessagesParams>);\n\n return provider;\n}\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 = createXAIProvider();\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"],"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"]}