Use xAI Grok through Responses (default) or Chat Completions. Responses preserves provider-native reasoning state and supports hosted search tools. BeamWeaver supplies chat integration, not an xAI embedding adapter.
Setup and first request
import Config
config :beam_weaver, :xai, api_key: System.fetch_env!("XAI_API_KEY")
Put configuration in your application's runtime file, then make an actual call:
alias BeamWeaver.Core.{ChatModel, Message}
{:ok, model} = BeamWeaver.Models.init_chat_model("xai:grok-4.3", max_tokens: 512, timeout: 120_000)
{:ok, reply} = ChatModel.invoke(model, "Explain parcel tracking in one sentence.")
true = byte_size(Message.text(reply)) > 0
true = reply.usage_metadata.total_tokens > 0
The example pins its model rather than relying on a changing provider default. The same identifier works in an agent's model declaration.
Options and endpoint differences
| Option | Purpose |
|---|---|
api:
| Responses or Chat Completions |
reasoning_effort:
| A level listed by the selected model profile |
max_tokens:
| Output budget |
prompt_cache_key:
| Responses and Chat Completions cache routing |
safety_identifier:
| Opaque end-user identifier on either API |
guidelines:
| Native category/behavior instructions on either API |
min_p:, top_k:
| Responses sampling controls |
x_grok_conv_id:
| Conversation header used for cache routing |
use_previous_response_id:
| Continue eligible stored Responses history |
service_tier:
| Native processing tier where available |
base_url:
| API root/gateway |
Stop sequences are supported only on nonreasoning Chat Completions models. Request metadata is not accepted; use trace metadata for application labels. On Chat Completions, tool-returned images/PDFs move to a following user message; on Responses they remain in the tool result.
Reasoning
BeamWeaver requests encrypted reasoning content on Responses for reasoning models and replays it unchanged. This also permits full-history continuation with store: false. An explicit raw include override can replace automatic include fields, so preserve required items when customizing requests.
Responses usage may include context_details for the latest server-side agent step. BeamWeaver exposes its input-plus-output count as usage_metadata.context_tokens for context budgeting while retaining cumulative total_tokens for billing.
Chat Completions has no equivalent encrypted reasoning field. Do not reduce saved messages to visible text when the next request needs provider-native continuation state.
Choose a supported effort setting and execute the model:
defmodule MyApp.SupportAgent do
use BeamWeaver.Agent
model "xai:grok-4.6", reasoning_effort: :low, timeout: 120_000
system_prompt "You are Acme's support agent."
end
{:ok, result} = MyApp.SupportAgent.invoke(%{messages: ["Reply with the word ready."]})
true = byte_size(result.messages |> List.last() |> BeamWeaver.Core.Message.text()) > 0
Server tools
A hosted tool executes at xAI. This example checks that search was actually requested by the provider response, not just declared:
{:ok, searched} =
ChatModel.invoke(
model,
"Use web search to find the official Elixir programming language website and return its URL.",
tools: [BeamWeaver.XAI.Tools.web_search()]
)
true = byte_size(Message.text(searched)) > 0
true = Enum.any?(List.wrap(searched.content), &(Map.get(&1, :type) == :web_search_call))
Other implemented declarations include X search, code execution, collection/ file search and remote MCP. Account resources such as vector-store IDs must come from actual provisioning. Chat Completions supports function tools; use Responses for hosted search.
Tools
explains application-run actions and their separate execution loop. Generated file references returned by Chat Completions are available in response_metadata.output_files, including in collected streams.
Stored conversations
use_previous_response_id: true can send only new messages after a compatible stored Responses reply. Replies from another provider/API or from store: false are sent as history instead. A stored response ID is remote state; account retention and availability apply. Keep your application's conversation data when you need independent recovery.
Use the complete stored reply when continuing. The second call must recall the earlier order:
alias BeamWeaver.Core.{ChatModel, Message}
{:ok, model} = BeamWeaver.Models.init_chat_model("xai:grok-4.6", timeout: 120_000)
history = [Message.user("My order number is A-1001.")]
{:ok, reply} = ChatModel.invoke(model, history, use_previous_response_id: true)
# Sends only the new question, with the id of `reply`.
{:ok, answer} =
ChatModel.invoke(model, history ++ [reply, Message.user("Which order did I mention?")],
use_previous_response_id: true
)
true = Message.text(answer) =~ "A-1001"
Prompt caching
The agent's prompt_caching declaration derives a stable key. Responses sends its key and conversation header; Chat Completions accepts both as well. Read actual cache usage to establish hits. The
caching guide
distinguishes provider prefix caching from skipping a whole model call.
Set the caching hint on the actual Chat Completions model. Caching is still subject to provider eligibility:
defmodule MyApp.SupportAgent do
use BeamWeaver.Agent
model "xai:grok-4.6", api: :chat_completions, timeout: 120_000
system_prompt "Refunds take five business days. Explain the policy briefly."
prompt_caching true
end
{:ok, result} = MyApp.SupportAgent.invoke(%{messages: ["Reply with the word ready."]})
true = byte_size(result.messages |> List.last() |> BeamWeaver.Core.Message.text()) > 0
Embeddings
Use an implemented embedding integration such as OpenAI for retrieval alongside a Grok chat model. There is no xAI embedding model to initialize through BeamWeaver. Image/video/voice generation APIs are also outside this chat integration.
Models
Limits are local profile data. A dash means not applicable or not recorded, not an unlimited allowance.
| Model | Input / output tokens | Operations and capabilities |
|---|---|---|
xai:grok-4.20-0309-non-reasoning
| 1,000,000 / 30,000 | chat; text, image, PDF; tools; structured output |
xai:grok-4.20-0309-reasoning
| 1,000,000 / 30,000 | chat; text, image, PDF; tools; structured output; reasoning |
xai:grok-4.20-multi-agent-0309
| 1,000,000 / 30,000 | chat; text, image, PDF; tools; structured output; reasoning |
xai:grok-4.3
| 1,000,000 / 30,000 | chat; text, image, PDF; tools; structured output; reasoning |
xai:grok-4.5
| 500,000 / 30,000 | chat; text, image, PDF; tools; structured output; reasoning |
xai:grok-4.6
| 500,000 / — | chat; text, image, PDF; tools; structured output; reasoning |
xai:grok-4.7
| 500,000 / — | chat; text, image, PDF; tools; structured output; reasoning |
xai:grok-build-0.1
| 256,000 / 30,000 | chat; text, image, PDF; tools; structured output; reasoning |
This is the checked-in compatibility registry, including snapshots. It does not imply every account can invoke every identifier. Verify your selected model with real calls and review provider capacity errors separately from invalid requests.
Further reading
The official xAI tools reference describes hosted tool requirements. Use Testing for deterministic failures and replay.