# xAI Grok Provider The [xAI Grok](https://x.ai) provider contains language model support for the [xAI API](https://x.ai/api). ## Setup The xAI Grok provider is available via the `@ai-sdk/xai` module. You can install it with ## Provider Instance You can import the default provider instance `xai` from `@ai-sdk/xai`: ```ts import { xai } from '@ai-sdk/xai'; ``` If you need a customized setup, you can import `createXai` from `@ai-sdk/xai` and create a provider instance with your settings: ```ts import { createXai } from '@ai-sdk/xai'; const xai = createXai({ apiKey: 'your-api-key', }); ``` You can use the following optional settings to customize the xAI provider instance: - **baseURL** _string_ Use a different URL prefix for API calls, e.g. to use proxy servers. The default prefix is `https://api.x.ai/v1`. - **apiKey** _string_ API key that is being sent using the `Authorization` header. It defaults to the `XAI_API_KEY` environment variable. - **headers** _Record<string,string>_ Custom headers to include in the requests. - **fetch** _(input: RequestInfo, init?: RequestInit) => Promise<Response>_ Custom [fetch](https://developer.mozilla.org/en-US/docs/Web/API/fetch) implementation. Defaults to the global `fetch` function. You can use it as a middleware to intercept requests, or to provide a custom fetch implementation for e.g. testing. ## Language Models You can create [xAI models](https://console.x.ai) using a provider instance. The first argument is the model id, e.g. `grok-3`. ```ts const model = xai('grok-3'); ``` By default, `xai(modelId)` uses the Chat API. To use the Responses API with server-side agentic tools, explicitly use `xai.responses(modelId)`. ### Example You can use xAI language models to generate text with the `generateText` function: ```ts import { xai } from '@ai-sdk/xai'; import { generateText } from 'ai'; const { text } = await generateText({ model: xai('grok-3'), prompt: 'Write a vegetarian lasagna recipe for 4 people.', }); ``` xAI language models can also be used in the `streamText`, `generateObject`, and `streamObject` functions (see [AI SDK Core](/docs/ai-sdk-core)). ### Provider Options xAI chat models support additional provider options that are not part of the [standard call settings](/docs/ai-sdk-core/settings). You can pass them in the `providerOptions` argument: ```ts const model = xai('grok-3-mini'); await generateText({ model, providerOptions: { xai: { reasoningEffort: 'high', }, }, }); ``` The following optional provider options are available for xAI chat models: - **reasoningEffort** _'low' | 'medium' | 'high'_ Reasoning effort for reasoning models. - **store** _boolean_ Whether to store the generation. Defaults to `true`. - **previousResponseId** _string_ The ID of the previous response. You can use it to continue a conversation. Defaults to `undefined`. ## Responses API (Agentic Tools) You can use the xAI Responses API with the `xai.responses(modelId)` factory method for server-side agentic tool calling. This enables the model to autonomously orchestrate tool calls and research on xAI's servers. ```ts const model = xai.responses('grok-4-fast'); ``` The Responses API provides server-side tools that the model can autonomously execute during its reasoning process: - **web_search**: Real-time web search and page browsing - **x_search**: Search X (Twitter) posts, users, and threads - **code_execution**: Execute Python code for calculations and data analysis ### Web Search Tool The web search tool enables autonomous web research with optional domain filtering and image understanding: ```ts import { xai } from '@ai-sdk/xai'; import { generateText } from 'ai'; const { text, sources } = await generateText({ model: xai.responses('grok-4-fast'), prompt: 'What are the latest developments in AI?', tools: { web_search: xai.tools.webSearch({ allowedDomains: ['arxiv.org', 'openai.com'], enableImageUnderstanding: true, }), }, }); console.log(text); console.log('Citations:', sources); ``` #### Web Search Parameters - **allowedDomains** _string[]_ Only search within specified domains (max 5). Cannot be used with `excludedDomains`. - **excludedDomains** _string[]_ Exclude specified domains from search (max 5). Cannot be used with `allowedDomains`. - **enableImageUnderstanding** _boolean_ Enable the model to view and analyze images found during search. Increases token usage. ### X Search Tool The X search tool enables searching X (Twitter) for posts, with filtering by handles and date ranges: ```ts const { text, sources } = await generateText({ model: xai.responses('grok-4-fast'), prompt: 'What are people saying about AI on X this week?', tools: { x_search: xai.tools.xSearch({ allowedXHandles: ['elonmusk', 'xai'], fromDate: '2025-10-23', toDate: '2025-10-30', enableImageUnderstanding: true, enableVideoUnderstanding: true, }), }, }); ``` #### X Search Parameters - **allowedXHandles** _string[]_ Only search posts from specified X handles (max 10). Cannot be used with `excludedXHandles`. - **excludedXHandles** _string[]_ Exclude posts from specified X handles (max 10). Cannot be used with `allowedXHandles`. - **fromDate** _string_ Start date for posts in ISO8601 format (`YYYY-MM-DD`). - **toDate** _string_ End date for posts in ISO8601 format (`YYYY-MM-DD`). - **enableImageUnderstanding** _boolean_ Enable the model to view and analyze images in X posts. - **enableVideoUnderstanding** _boolean_ Enable the model to view and analyze videos in X posts. ### Code Execution Tool The code execution tool enables the model to write and execute Python code for calculations and data analysis: ```ts const { text } = await generateText({ model: xai.responses('grok-4-fast'), prompt: 'Calculate the compound interest for $10,000 at 5% annually for 10 years', tools: { code_execution: xai.tools.codeExecution(), }, }); ``` ### File Search Tool xAI supports file search through OpenAI compatibility. You can use the OpenAI provider with xAI's base URL to search vector stores: ```ts import { createOpenAI } from '@ai-sdk/openai'; import { streamText } from 'ai'; const openai = createOpenAI({ baseURL: 'https://api.x.ai/v1', apiKey: process.env.XAI_API_KEY, }); const result = streamText({ model: openai('grok-4'), prompt: 'What documents do you have access to?', tools: { file_search: openai.tools.fileSearch({ vectorStoreIds: ['your-vector-store-id'], maxNumResults: 5, }), }, }); ``` File search requires grok-4 family models. See the [OpenAI provider](/providers/ai-sdk-providers/openai) documentation for additional file search options like filters and ranking. ### Multiple Tools You can combine multiple server-side tools for comprehensive research: ```ts import { xai } from '@ai-sdk/xai'; import { streamText } from 'ai'; const { fullStream } = streamText({ model: xai.responses('grok-4-fast'), prompt: 'Research AI safety developments and calculate risk metrics', tools: { web_search: xai.tools.webSearch(), x_search: xai.tools.xSearch(), code_execution: xai.tools.codeExecution(), }, }); for await (const part of fullStream) { if (part.type === 'text-delta') { process.stdout.write(part.text); } else if (part.type === 'source' && part.sourceType === 'url') { console.log('\nSource:', part.url); } } ``` ### Provider Options The Responses API supports the following provider options: ```ts import { xai } from '@ai-sdk/xai'; import { generateText } from 'ai'; const result = await generateText({ model: xai.responses('grok-4-fast'), providerOptions: { xai: { reasoningEffort: 'high', }, }, // ... }); ``` The following provider options are available: - **reasoningEffort** _'low' | 'high'_ Control the reasoning effort for the model. Higher effort may produce more thorough results at the cost of increased latency and token usage. The Responses API only supports server-side tools. You cannot mix server-side tools with client-side function tools in the same request. ## Live Search xAI models support Live Search functionality, allowing them to query real-time data from various sources and include it in responses with citations. ### Basic Search To enable search, specify `searchParameters` with a search mode: ```ts import { xai } from '@ai-sdk/xai'; import { generateText } from 'ai'; const { text, sources } = await generateText({ model: xai('grok-3-latest'), prompt: 'What are the latest developments in AI?', providerOptions: { xai: { searchParameters: { mode: 'auto', // 'auto', 'on', or 'off' returnCitations: true, maxSearchResults: 5, }, }, }, }); console.log(text); console.log('Sources:', sources); ``` ### Search Parameters The following search parameters are available: - **mode** _'auto' | 'on' | 'off'_ Search mode preference: - `'auto'` (default): Model decides whether to search - `'on'`: Always enables search - `'off'`: Disables search completely - **returnCitations** _boolean_ Whether to return citations in the response. Defaults to `true`. - **fromDate** _string_ Start date for search data in ISO8601 format (`YYYY-MM-DD`). - **toDate** _string_ End date for search data in ISO8601 format (`YYYY-MM-DD`). - **maxSearchResults** _number_ Maximum number of search results to consider. Defaults to 20, max 50. - **sources** _Array<SearchSource>_ Data sources to search from. Defaults to `["web", "x"]` if not specified. ### Search Sources You can specify different types of data sources for search: #### Web Search ```ts const result = await generateText({ model: xai('grok-3-latest'), prompt: 'Best ski resorts in Switzerland', providerOptions: { xai: { searchParameters: { mode: 'on', sources: [ { type: 'web', country: 'CH', // ISO alpha-2 country code allowedWebsites: ['ski.com', 'snow-forecast.com'], safeSearch: true, }, ], }, }, }, }); ``` #### Web source parameters - **country** _string_: ISO alpha-2 country code - **allowedWebsites** _string[]_: Max 5 allowed websites - **excludedWebsites** _string[]_: Max 5 excluded websites - **safeSearch** _boolean_: Enable safe search (default: true) #### X (Twitter) Search ```ts const result = await generateText({ model: xai('grok-3-latest'), prompt: 'Latest updates on Grok AI', providerOptions: { xai: { searchParameters: { mode: 'on', sources: [ { type: 'x', includedXHandles: ['grok', 'xai'], excludedXHandles: ['openai'], postFavoriteCount: 10, postViewCount: 100, }, ], }, }, }, }); ``` #### X source parameters - **includedXHandles** _string[]_: Array of X handles to search (without @ symbol) - **excludedXHandles** _string[]_: Array of X handles to exclude from search (without @ symbol) - **postFavoriteCount** _number_: Minimum favorite count of the X posts to consider. - **postViewCount** _number_: Minimum view count of the X posts to consider. #### News Search ```ts const result = await generateText({ model: xai('grok-3-latest'), prompt: 'Recent tech industry news', providerOptions: { xai: { searchParameters: { mode: 'on', sources: [ { type: 'news', country: 'US', excludedWebsites: ['tabloid.com'], safeSearch: true, }, ], }, }, }, }); ``` #### News source parameters - **country** _string_: ISO alpha-2 country code - **excludedWebsites** _string[]_: Max 5 excluded websites - **safeSearch** _boolean_: Enable safe search (default: true) #### RSS Feed Search ```ts const result = await generateText({ model: xai('grok-3-latest'), prompt: 'Latest status updates', providerOptions: { xai: { searchParameters: { mode: 'on', sources: [ { type: 'rss', links: ['https://status.x.ai/feed.xml'], }, ], }, }, }, }); ``` #### RSS source parameters - **links** _string[]_: Array of RSS feed URLs (max 1 currently supported) ### Multiple Sources You can combine multiple data sources in a single search: ```ts const result = await generateText({ model: xai('grok-3-latest'), prompt: 'Comprehensive overview of recent AI breakthroughs', providerOptions: { xai: { searchParameters: { mode: 'on', returnCitations: true, maxSearchResults: 15, sources: [ { type: 'web', allowedWebsites: ['arxiv.org', 'openai.com'], }, { type: 'news', country: 'US', }, { type: 'x', includedXHandles: ['openai', 'deepmind'], }, ], }, }, }, }); ``` ### Sources and Citations When search is enabled with `returnCitations: true`, the response includes sources that were used to generate the answer: ```ts const { text, sources } = await generateText({ model: xai('grok-3-latest'), prompt: 'What are the latest developments in AI?', providerOptions: { xai: { searchParameters: { mode: 'auto', returnCitations: true, }, }, }, }); // Access the sources used for (const source of sources) { if (source.sourceType === 'url') { console.log('Source:', source.url); } } ``` ### Streaming with Search Live Search works with streaming responses. Citations are included when the stream completes: ```ts import { streamText } from 'ai'; const result = streamText({ model: xai('grok-3-latest'), prompt: 'What has happened in tech recently?', providerOptions: { xai: { searchParameters: { mode: 'auto', returnCitations: true, }, }, }, }); for await (const textPart of result.textStream) { process.stdout.write(textPart); } console.log('Sources:', await result.sources); ``` ## Model Capabilities | Model | Image Input | Object Generation | Tool Usage | Tool Streaming | Reasoning | | --------------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | | `grok-4-fast-non-reasoning` | | | | | | | `grok-4-fast-reasoning` | | | | | | | `grok-code-fast-1` | | | | | | | `grok-4` | | | | | | | `grok-3` | | | | | | | `grok-3-latest` | | | | | | | `grok-3-fast` | | | | | | | `grok-3-fast-latest` | | | | | | | `grok-3-mini` | | | | | | | `grok-3-mini-latest` | | | | | | | `grok-3-mini-fast` | | | | | | | `grok-3-mini-fast-latest` | | | | | | | `grok-2` | | | | | | | `grok-2-latest` | | | | | | | `grok-2-1212` | | | | | | | `grok-2-vision` | | | | | | | `grok-2-vision-latest` | | | | | | | `grok-2-vision-1212` | | | | | | | `grok-beta` | | | | | | | `grok-vision-beta` | | | | | | The table above lists popular models. Please see the [xAI docs](https://docs.x.ai/docs#models) for a full list of available models. The table above lists popular models. You can also pass any available provider model ID as a string if needed. ## Image Models You can create xAI image models using the `.image()` factory method. For more on image generation with the AI SDK see [generateImage()](/docs/reference/ai-sdk-core/generate-image). ```ts import { xai } from '@ai-sdk/xai'; import { generateImage } from 'ai'; const { image } = await generateImage({ model: xai.image('grok-2-image'), prompt: 'A futuristic cityscape at sunset', }); ``` The xAI image model does not currently support the `aspectRatio` or `size` parameters. Image size defaults to 1024x768. ### Model-specific options You can customize the image generation behavior with model-specific settings: ```ts import { xai } from '@ai-sdk/xai'; import { generateImage } from 'ai'; const { images } = await generateImage({ model: xai.image('grok-2-image'), prompt: 'A futuristic cityscape at sunset', maxImagesPerCall: 5, // Default is 10 n: 2, // Generate 2 images }); ``` ### Model Capabilities | Model | Sizes | Notes | | -------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `grok-2-image` | 1024x768 (default) | xAI's text-to-image generation model, designed to create high-quality images from text prompts. It's trained on a diverse dataset and can generate images across various styles, subjects, and settings. |