š§ Model Management - Download, cache, and organize AI models from Hugging Face
š Advanced Filtering - Search models with regex patterns and SQL-style queries
š» System Detection - Automatic GPU detection and resource reporting
š OpenAI-Compatible API - RESTful API with streaming support
cargo install puma
# Clone the repository git clone https://github.com/InftyAI/PUMA.git cd PUMA # Build the binary make build # The binary will be available at ./puma ./puma version
# Download a model puma pull qwen/qwen2.5-0.5b # Run a model in an interactive chat puma run qwen/qwen2.5-0.5b # List all models puma ls # Inspect model details puma inspect qwen/qwen2.5-0.5b # Check system info puma info # Remove a model puma rm qwen/qwen2.5-0.5b
# Start the inference server with a model puma serve qwen/qwen2.5-0.5b # Server will start on http://0.0.0.0:8000 # API endpoints: # POST /v1/chat/completions # POST /v1/completions # GET /v1/models # GET /v1/models/:model # GET /health
Test the API:
# Health check curl http://localhost:8000/health # Chat completion curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen/qwen2.5-0.5b", "messages": [{"role": "user", "content": "Hello!"}] }' # Or use the test script ./hack/scripts/test_api.sh
| Command | Status | Description |
|---|---|---|
pull <model> |
ā | Download model from provider |
ls |
ā | List models (supports regex, label filters) |
inspect <model> |
ā | Show detailed model information |
rm <model> |
ā | Remove model and cache |
info |
ā | Display system information |
version |
ā | Show PUMA version |
run <model> |
ā | Run a model in an interactive chat |
serve <model> |
ā | Start OpenAI-compatible API server with a model |
ps |
š§ | List running models |
stop |
š§ | Stop running model |
# Substring match puma ls qwen # Prefix match puma ls "^inftyai/" # Alternation puma ls "llama-(2|3)"
# Single filter puma ls -l author=inftyai # Multiple filters (AND condition) puma ls -l author=inftyai,license=mit # Combine pattern + filter puma ls llama -l author=meta
Available filters: author, task, license, provider, model_series
Both run and serve accept flags to tune the inference engine (KV-cache pool,
block size, batch size, default token budget):
puma run qwen/qwen2.5-0.5b --max-batch-size 64 --default-max-tokens 256
See docs/configuration.md for the full list of flags and defaults.
PUMA provides an OpenAI-compatible API server for model inference.
# Start server with a model (default: 0.0.0.0:8000) puma serve qwen/qwen2.5-0.5b # Custom host and port puma serve qwen/qwen2.5-0.5b --host 127.0.0.1 --port 3000 # Model must be pulled first puma pull qwen/qwen2.5-0.5b
Engine parameters (KV-cache, batch size, etc.) can be tuned with additional flags ā see docs/configuration.md.
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen/qwen2.5-0.5b", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"} ], "max_tokens": 100, "temperature": 0.7 }'
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen/qwen2.5-0.5b", "messages": [{"role": "user", "content": "Tell me a story"}], "stream": true }'
# Returns the currently loaded model
curl http://localhost:8000/v1/modelscurl http://localhost:8000/health
# Returns: {"status":"ok"}PUMA is compatible with the OpenAI Python SDK:
from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", api_key="dummy" # Not required ) response = client.chat.completions.create( model="qwen/qwen2.5-0.5b", messages=[ {"role": "user", "content": "Hello!"} ] ) print(response.choices[0].message.content)
$ puma inspect qwen/qwen2.5-0.5b
name: qwen/qwen2.5-0.5b
kind: Model
spec:
author: qwen
model_series: qwen2
task: text-generation
license: APACHE-2.0
context_window: 32.77K
safetensors:
total: 494.03M
parameters:
bf16: 494.03M
provider: huggingface
cache:
revision: 060db6499f32faf8b98477b0a26969ef7d8b9987
size: 988.10 MB
path: ~/.puma/cache/huggingface/models--qwen--qwen2.5-0.5b
status:
created: 2 months ago
updated: 2 months ago- Database:
~/.puma/models.db(SQLite) - Cache:
~/.puma/cache/(model files)
Models are stored with lowercase names for case-insensitive matching.
# Build make build # Run all tests make test # Test API manually ./hack/scripts/test_api.sh
puma/
āāā src/
ā āāā api/ # OpenAI-compatible API
ā āāā backend/ # Inference backends (Mock, MLX)
ā āāā cli/ # Command implementations
ā āāā downloader/ # HuggingFace download logic
ā āāā registry/ # Model registry & metadata
ā āāā storage/ # SQLite storage backend
ā āāā system/ # System info detection
ā āāā utils/ # Formatting & helpers
āāā tests/ # Integration tests
āāā hack/ # Development scripts
āāā Cargo.toml # Rust dependencies
āāā Makefile # Build commands
Apache-2.0