// Package xai implements the go-llm v2 provider interface for xAI (Grok, // https://x.ai/api). xAI speaks OpenAI Chat Completions, so this package is a // thin wrapper over openaicompat with its own defaults and per-model Rules. package xai import ( "strings" "gitea.stevedudenhoeffer.com/steve/go-llm/v2/openaicompat" ) // DefaultBaseURL is the public xAI API endpoint. const DefaultBaseURL = "https://api.x.ai/v1" // Provider is a type alias over openaicompat.Provider. type Provider = openaicompat.Provider // New creates a new xAI provider. An empty baseURL uses DefaultBaseURL. func New(apiKey, baseURL string) *Provider { if baseURL == "" { baseURL = DefaultBaseURL } return openaicompat.New(apiKey, baseURL, openaicompat.Rules{ // Grok models whose name contains "vision" accept images; others don't. SupportsVision: func(m string) bool { return strings.Contains(m, "vision") }, // Reasoning is supported on grok-3-mini and grok-4 family. The xAI // API only accepts low|high (no medium); we map medium up to high. SupportsReasoning: func(m string) bool { return strings.Contains(m, "grok-3-mini") || strings.Contains(m, "grok-4") }, MapReasoningEffort: func(level string) string { if level == "medium" { return "high" } return level }, }) }