import type { CatalogEntry } from "@/lib/ai/registry/catalog"; import type { ModelCapabilities } from "@/lib/ai/core/types"; /** * xAI documented augmentation. `/v1/language-models` gives modalities, pricing and aliases * but not context windows or parameter support — those come from docs + probes * (docs/provider-research/xai.md, audited 2026-09-08). * * Verified rules: never send frequency/presence penalties; `stop` only on * grok-4.20-0309-non-reasoning; `reasoning_effort` only on 4.6 / 4.5 / 4.3 / multi-agent. * Files: xAI needs an uploaded file id (Files API) → PolyLLM inlines text files and does not * send PDFs (marked `files: false`). Web search requires /v1/responses. */ const base: ModelCapabilities = { text: true, vision: true, audioInput: false, audioOutput: false, imageGeneration: false, video: false, reasoning: true, tools: true, structuredOutput: true, streaming: true, files: false, webSearch: true, }; const baseParams = { temperature: true, topP: true, topK: true, maxTokens: true, seed: true, stop: false, frequencyPenalty: false, presencePenalty: false, temperatureRange: { min: 0, max: 2 } }; export const XAI_CATALOG = new Map([ [ "grok-4.6", { displayName: "Grok 4.6", family: "Grok 4.6", capabilities: base, limits: { contextTokens: 500_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, reasoningEffort: true, reasoningEffortLevels: ["low", "medium", "high", "xhigh"] }, status: "active", sortWeight: 100, metadata: { alwaysReasoning: true, knowledgeCutoff: "2026-02-01" }, }, ], [ "grok-4.5", { displayName: "Grok 4.5", family: "Grok 4.5", capabilities: base, limits: { contextTokens: 500_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, reasoningEffort: true, reasoningEffortLevels: ["low", "medium", "high"] }, status: "active", sortWeight: 95, metadata: { alwaysReasoning: true, agentic: true }, }, ], [ "grok-4.3", { displayName: "Grok 4.3", family: "Grok 4.3", capabilities: base, limits: { contextTokens: 1_000_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, reasoningEffort: true, reasoningEffortLevels: ["none", "low", "medium", "high"] }, status: "active", sortWeight: 90, metadata: { alwaysReasoning: false }, }, ], [ "grok-4.20-0309-reasoning", { displayName: "Grok 4.20 Reasoning", family: "Grok 4.20", capabilities: base, limits: { contextTokens: 1_000_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, reasoningEffort: false }, status: "active", sortWeight: 80, metadata: { alwaysReasoning: true, fixedReasoning: true }, }, ], [ "grok-4.20-0309-non-reasoning", { displayName: "Grok 4.20 Non-Reasoning", family: "Grok 4.20", capabilities: { ...base, reasoning: false }, limits: { contextTokens: 1_000_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, stop: true, reasoningEffort: false }, status: "active", sortWeight: 78, }, ], [ "grok-4.20-multi-agent-0309", { displayName: "Grok 4.20 Multi-Agent", family: "Grok 4.20", capabilities: { ...base, tools: false }, limits: { contextTokens: 1_000_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, reasoningEffort: true, reasoningEffortLevels: ["low", "medium", "high", "xhigh"] }, status: "preview", sortWeight: 70, metadata: { alwaysReasoning: true, responsesOnly: true, beta: true }, }, ], [ "grok-build-0.1", { displayName: "Grok Build 0.1", family: "Grok Build", capabilities: base, limits: { contextTokens: 256_000, maxOutputTokens: 128_000 }, parameters: { ...baseParams, reasoningEffort: false }, status: "active", sortWeight: 75, metadata: { alwaysReasoning: true, fixedReasoning: true, coding: true }, }, ], ]);