AWS vLLM on Neuron infrastructure provider for Strands Agents SDK
Project description
strands-neuron
vLLM on AWS Neuron infrastructure provider for AWS Strands Agents SDK.
This package provides a model provider implementation that connects to vLLM servers running on AWS AI Chips, enabling high-performance LLM inference with OpenAI-compatible APIs.
Features
- 🚀 OpenAI-compatible API - Works with any OpenAI-compatible vLLM server
- 📡 Full streaming support - Async generators for real-time token streaming
- 🛠️ Tool/function calling - Native support for function calling and tool use
- 📊 Structured output - Generate structured data via tool calls
- ⚡ Neuron-optimized - Designed for AWS Neuron hardware acceleration
- 🔧 Flexible configuration - Extensive configuration options for model behavior
⚠️ Parallel Tool Calling Support
Tool calling support depends on the underlying model:
- Llama 3.1 models: Only support single tool calls at once (e.g.,
mistralai/Mistral-7B-Instruct-v0.3) - Llama 4 models: Support parallel tool calls
- Other models with parallel support: Granite 3.1, xLAM, Pythonic parser models
If you encounter "This model only supports single tool-calls at once!" errors, this is a model limitation, not a configuration issue. The vLLM server is correctly configured with --enable-auto-tool-choice and --tool-call-parser flags in the Dockerfile.
Workarounds:
- Use a model that supports parallel tool calls (e.g., Llama 4, Granite 3.1, xLAM)
- Design agents to only use one tool at a time
- Use
structured_output()which only requires a single tool call (works perfectly with Llama 3.1)
Installation
First, clone the repository and create a virtual environment:
git clone <repository-url>
cd strands-neuron
python3 -m venv .venv
source .venv/bin/activate
Install the Strands Agents SDK:
pip install strands-agents strands-agents-tools
Then install the package:
pip install strands-neuron
For development (includes testing and linting tools):
pip install -e ".[dev]"
Prerequisites
Hardware Requirements
- AWS EC2 instance with Neuron hardware (e.g., inf2, trn1, trn2 or trn3)
- AWS Neuron Deep Learning AMI (DLAMI) for Ubuntu 22.04
See the infrastructure README for detailed setup instructions.
Software Requirements
- Python 3.10 or higher
- Running vLLM Neuron server (see infrastructure setup)
Quick Start
1. Start the vLLM Neuron Server
First, set up and start your vLLM Neuron server following the infrastructure README.
The server should be accessible at http://localhost:8080/v1 (or your configured endpoint).
2. Use NeuronModel in Your Code
from strands import Agent
from strands_neuron import NeuronModel
# Initialize the model
model = NeuronModel(
config={
"model_id": "mistralai/Mistral-7B-Instruct-v0.3",
"base_url": "http://localhost:8080/v1",
"api_key": "EMPTY", # Not required for local servers
# "support_tool_choice_auto": True, # Uncomment if vLLM has --enable-auto-tool-choice flag
}
)
# Create an agent
agent = Agent(
system_prompt="You are a helpful assistant.",
model=model,
)
# Use the agent
response = agent("What is machine learning?")
print(response)
3. Streaming Example
import asyncio
from strands_neuron import NeuronModel
async def stream_example():
model = NeuronModel(
config={
"model_id": "mistralai/Mistral-7B-Instruct-v0.3",
"base_url": "http://localhost:8080/v1",
"api_key": "EMPTY",
}
)
messages = [{"role": "user", "content": [{"text": "Explain Python"}]}]
async for event in model.stream(messages, system_prompt="You are a coding assistant."):
if "contentBlockDelta" in event:
delta = event["contentBlockDelta"].get("delta", {})
if "text" in delta:
print(delta["text"], end="", flush=True)
asyncio.run(stream_example())
Configuration
The NeuronModel accepts a configuration dictionary with the following options:
Required
model_id(str): The model identifier (e.g.,"mistralai/Mistral-7B-Instruct-v0.3")
Optional
API Configuration
base_url(str): Base URL for the OpenAI-compatible API (default:"http://localhost:8080/v1")api_key(str): API key for authentication (default:"EMPTY")
Generation Parameters
temperature(float): Sampling temperature (0.0 to 2.0)top_p(float): Nucleus sampling parametermax_completion_tokens(int): Maximum tokens to generatestop(str | List[str]): Sequences that stop generationstop_sequences(List[str]): Alternative tostopfor backwards compatibilityfrequency_penalty(float): Penalize tokens based on frequency (-2.0 to 2.0)presence_penalty(float): Penalize tokens based on presence (-2.0 to 2.0)n(int): Number of completions to generatelogprobs(bool): Return log probabilitiestop_logprobs(int): Number of top log probabilities to return
vLLM Server Capabilities
support_tool_choice_auto(bool): Set toTrueif your vLLM server has--enable-auto-tool-choiceand--tool-call-parserflags enabled (default:False)
Advanced Options
additional_args(Dict[str, Any]): Additional arguments passed to the API request
Example Configuration
model = NeuronModel(
config={
"model_id": "mistralai/Mistral-7B-Instruct-v0.3",
"base_url": "http://localhost:8080/v1",
"api_key": "EMPTY",
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 1000,
"stop_sequences": ["\n\n"],
"tensor_parallel_size": 2,
"enable_prefix_caching": True,
}
)
Examples
This package includes several example implementations:
Person Info Example (Structured Output)
Demonstrates structured output extraction using Pydantic models:
python examples/person_example.py
Weather Agent Example
Demonstrates using NeuronModel with tools to create a weather assistant:
python examples/weather_example.py
Streaming Examples
Shows various streaming patterns:
python examples/stream_example.py
MCP Integration
Demonstrates Model Context Protocol (MCP) integration:
cd examples/mcp
python mcp-server.py # In one terminal
python mcp-example.py # In another terminal
See the MCP example README for detailed instructions.
API Reference
NeuronModel
The main model class that implements the Strands Model interface.
Methods
stream(messages, tool_specs=None, system_prompt=None, **kwargs): Stream responses as async generatorstructured_output(output_model, prompt, system_prompt=None, **kwargs): Generate structured outputformat_request(messages, tool_specs=None, system_prompt=None, stream=True): Format request for APIupdate_config(**config): Update model configurationget_config(): Get current configuration
Development
Setup
# Clone the repository
git clone <repository-url>
cd strands-neuron
# Install in development mode
pip install strands-agents strands-agents-tools pytest
pip install -e ".[dev]"
Running Tests
# Run all tests
pytest
# Run unit tests only
pytest tests/unit
# Run integration tests only
pytest tests/integration
Code Quality
This project uses:
- Ruff for linting
- Black for code formatting
- mypy for type checking
# Format code
black src tests
# Lint
ruff check src tests
# Type check
mypy src
Infrastructure
For information on setting up and deploying the vLLM Neuron server, see the infrastructure README.
License
Apache-2.0 License - see LICENSE file for details.
Changelog
See CHANGELOG.md for a list of changes and version history.
Project details
Release history Release notifications | RSS feed
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_neuron-0.1.3.tar.gz.
File metadata
- Download URL: strands_neuron-0.1.3.tar.gz
- Upload date:
- Size: 76.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
826688ecd3df97dbd08f49d75db2bb10db707a016e1cf07a97b0ea8447b5ddb8
|
|
| MD5 |
3745c9b14b073153492bec64cbb3f908
|
|
| BLAKE2b-256 |
f8445a84cbbc81da9cc671ca6ea548035eb5dbbbc89c05db72d186a86f4b2a30
|
File details
Details for the file strands_neuron-0.1.3-py3-none-any.whl.
File metadata
- Download URL: strands_neuron-0.1.3-py3-none-any.whl
- Upload date:
- Size: 13.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
432b393fac006bd27b9bd6e5bad16c26381ec025d368685a601ccc675bdcc0af
|
|
| MD5 |
457879a6c4dcd6fcaf56303e389c2610
|
|
| BLAKE2b-256 |
cf4a7ffb020aaffbe45ec294d65bee5eddc29bf1098b63b579ba7a05bbd00230
|