xAI model provider for Strands Agents SDK
Project description
strands-xai
xAI model provider for Strands Agents SDK
Features
- Full Grok Model Support - Access all xAI Grok models (grok-4, grok-3-mini, etc.)
- Server-Side Tools - Use xAI's built-in tools (web_search, x_search, code_execution)
- Reasoning Models - Leverage visible reasoning (grok-3-mini) or encrypted reasoning (grok-4)
- Streaming Support - Real-time response streaming with full event handling
- Hybrid Tool Usage - Combine xAI server-side tools with Strands client-side tools
- Multi-Turn Context - Seamless conversation history with encrypted content preservation
- Type Safe - Full type hints and mypy support
Requirements
- Python 3.10+
- Strands Agents SDK 1.23.0+
- xAI API key from xAI Console
Installation
pip install strands-agents strands-xai
Quick Start
Basic Usage
from strands_xai import xAIModel
from strands import Agent
# Initialize xAI model
model = xAIModel(
client_args={"api_key": "your-xai-api-key"}, # or set XAI_API_KEY env var
model_id="grok-4-1-fast-non-reasoning-latest",
)
# Create an agent
agent = Agent(model=model)
# Use the agent
result = agent("What is the capital of France?")
print(result)
With Streaming
from strands_xai import xAIModel
from strands import Agent
from strands.handlers.callback_handler import PrintingCallbackHandler
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
)
# Streaming happens automatically with callback handlers
agent = Agent(
model=model,
callback_handler=PrintingCallbackHandler()
)
# Text streams to console in real-time
result = agent("Tell me a story")
With Server-Side Tools
from strands_xai import xAIModel
from strands import Agent
from xai_sdk.tools import x_search, web_search
# Use xAI's built-in tools (executed on xAI servers)
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
xai_tools=[x_search(), web_search()],
)
agent = Agent(model=model)
result = agent("What are people saying about AI on X?")
print(result)
With Reasoning (grok-3-mini)
from strands_xai import xAIModel
from strands import Agent
# Enable visible reasoning
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-3-mini",
reasoning_effort="high", # "low" or "high"
)
agent = Agent(model=model)
result = agent("Solve this logic puzzle: If all roses are flowers...")
print(result)
With Encrypted Reasoning (grok-4)
For multi-turn conversations with reasoning preserved:
from strands_xai import xAIModel
from strands import Agent
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-fast-reasoning",
use_encrypted_content=True, # Preserves reasoning across turns
)
agent = Agent(model=model)
# First turn
result1 = agent("Think through this problem: 2+2")
print(result1)
# Second turn - reasoning context preserved
result2 = agent("Now multiply that by 3")
print(result2)
With Inline Citations
Get sources cited directly in responses:
from strands_xai import xAIModel
from strands import Agent
from xai_sdk.tools import web_search
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
xai_tools=[web_search()],
include=["inline_citations"], # Enable citations
)
agent = Agent(
model=model,
system_prompt="You are a helpful assistant. Always cite sources."
)
result = agent("What are the latest developments in AI?")
print(result)
# Output includes inline citations like [1], [2] with source URLs
Hybrid: Server-Side + Client-Side Tools
from strands_xai import xAIModel
from strands import Agent, tool
from xai_sdk.tools import x_search
@tool
def get_weather(city: str) -> str:
"""Get weather for a city."""
return f"Weather in {city}: Sunny, 22°C"
# Combine xAI tools with Strands tools
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
xai_tools=[x_search()],
)
agent = Agent(model=model, tools=[get_weather])
result = agent("What's the weather in Paris and what are people tweeting about it?")
print(result)
Configuration Options
| Parameter | Type | Description |
|---|---|---|
model_id |
str |
Grok model ID (e.g., "grok-4", "grok-3-mini") |
client_args |
dict |
Arguments for xAI client (api_key, timeout, etc.) |
params |
dict |
Model parameters (temperature, max_tokens, etc.) |
xai_tools |
list |
Server-side tools from xai_sdk.tools |
reasoning_effort |
str |
"low" or "high" (grok-3-mini only) |
use_encrypted_content |
bool |
Enable encrypted reasoning for multi-turn |
include |
list |
Optional xAI features (e.g., ["inline_citations"]) |
Model Parameters
Common parameters you can pass in params:
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
params={
"temperature": 0.7, # 0.0-2.0, controls randomness
"max_tokens": 2048, # Maximum tokens in response
"top_p": 0.9, # Nucleus sampling
"frequency_penalty": 0, # -2.0 to 2.0
"presence_penalty": 0, # -2.0 to 2.0
}
)
Available Models
| Model | Context | Best For |
|---|---|---|
grok-4-1-fast-reasoning |
2M | Fast reasoning with encrypted thinking |
grok-4-1-fast-non-reasoning |
2M | Fast, high-performance inference |
grok-4-fast-reasoning |
2M | Reasoning with encrypted thinking |
grok-4-fast-non-reasoning |
2M | Fast inference without reasoning |
grok-4-0709 |
256K | Premium model (higher cost) |
grok-code-fast-1 |
256K | Code-optimized model |
grok-3-mini |
131K | Compact with visible reasoning |
See xAI documentation for pricing and rate limits.
Server-Side Tools
xAI provides built-in tools executed on their infrastructure:
Available Tools
web_search()- Search the web for current informationx_search()- Search X (Twitter) for posts and trendscode_execution()- Execute Python code safely
Basic Usage
from strands_xai import xAIModel
from strands import Agent
from xai_sdk.tools import web_search, x_search, code_execution
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
xai_tools=[web_search(), x_search(), code_execution()],
)
agent = Agent(model=model)
result = agent("What's trending on X about AI?")
Why Server-Side Tools?
- ✅ No implementation needed - xAI handles execution
- ✅ Always up-to-date - Real-time web/X data
- ✅ Secure - Code execution in sandboxed environment
- ✅ Fast - Optimized by xAI infrastructure
Combining with Client-Side Tools
Mix xAI server-side tools with your own Strands tools:
from strands_xai import xAIModel
from strands import Agent, tool
from xai_sdk.tools import x_search
@tool
def get_weather(city: str) -> str:
"""Get weather for a city."""
return f"Weather in {city}: Sunny, 22°C"
model = xAIModel(
client_args={"api_key": "your-xai-api-key"},
model_id="grok-4-1-fast-non-reasoning-latest",
xai_tools=[x_search()], # Server-side
)
agent = Agent(
model=model,
tools=[get_weather] # Client-side
)
# Agent can use both types of tools
result = agent("What's the weather in Paris and what are people saying about it on X?")
Examples
See the examples directory for complete working examples.
Interactive Chat
Full-featured interactive chat with 10 different agent configurations:
export XAI_API_KEY="your-xai-api-key"
cd strands-xai
source .venv/bin/activate
python examples/interactive_chat.py
Choose from:
- Simple (non-streaming)
- Streaming with debug mode
- Client-side tools (calculator, weather)
- Server-side tools (X search, web search)
- Hybrid (both server and client tools)
- Reasoning models (grok-3-mini, grok-4)
- Web search with citations
Quick Test
export XAI_API_KEY="your-xai-api-key"
python examples/test_grok_final.py
Or use the convenience script:
./run_examples.sh chat # Interactive chat
./run_examples.sh test # Quick test
Development
# Clone the repository
git clone https://github.com/Cerrix/strands-xai.git
cd strands-xai
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=strands_xai --cov-report=html
# Format code
ruff format .
# Lint code
ruff check .
# Type check
mypy src/strands_xai
Testing
Unit Tests
The package includes 74 comprehensive unit tests:
# Run all tests
pytest
# Run with coverage
pytest --cov=strands_xai --cov-report=html
# Run specific test
pytest tests/test_xai.py::TestBuildChat -v
Integration Tests with Real API
Test with your xAI API key using the example scripts:
export XAI_API_KEY="your-xai-api-key"
# Interactive testing
python examples/interactive_chat.py
# Quick functionality test
python examples/test_grok_final.py
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
Acknowledgments
Built for the Strands Agents community.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file strands_xai-0.1.1.tar.gz.
File metadata
- Download URL: strands_xai-0.1.1.tar.gz
- Upload date:
- Size: 26.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7b965b5140d65845deb7cf62463669082c7193f92a7e1b4064bd772387a4ef4
|
|
| MD5 |
d8b4db9019eff12ef3ac76d0fc462f28
|
|
| BLAKE2b-256 |
148e522d442ff60b3886f6a781f77cd9d59f87a4fd1c70be4050f95caee67a2e
|
Provenance
The following attestation bundles were made for strands_xai-0.1.1.tar.gz:
Publisher:
publish.yml on Cerrix/strands-xai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
strands_xai-0.1.1.tar.gz -
Subject digest:
a7b965b5140d65845deb7cf62463669082c7193f92a7e1b4064bd772387a4ef4 - Sigstore transparency entry: 856355056
- Sigstore integration time:
-
Permalink:
Cerrix/strands-xai@979340bb372ee51a24d1c742565f3523de2b6208 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Cerrix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@979340bb372ee51a24d1c742565f3523de2b6208 -
Trigger Event:
release
-
Statement type:
File details
Details for the file strands_xai-0.1.1-py3-none-any.whl.
File metadata
- Download URL: strands_xai-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e085002802c34125a037d3d1f9bd8d0b93baf61a30d0202ca6fc4835d5d5c5ed
|
|
| MD5 |
4570de3fa5acf61ee6266f6ced3eac88
|
|
| BLAKE2b-256 |
6b5fdf249f8bd482c8d47a2662ee41170d6f15da8bbb8d4548ddc1d66da4e44f
|
Provenance
The following attestation bundles were made for strands_xai-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Cerrix/strands-xai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
strands_xai-0.1.1-py3-none-any.whl -
Subject digest:
e085002802c34125a037d3d1f9bd8d0b93baf61a30d0202ca6fc4835d5d5c5ed - Sigstore transparency entry: 856355092
- Sigstore integration time:
-
Permalink:
Cerrix/strands-xai@979340bb372ee51a24d1c742565f3523de2b6208 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Cerrix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@979340bb372ee51a24d1c742565f3523de2b6208 -
Trigger Event:
release
-
Statement type: