ethical, local-only inference wrapper for llama.cpp
Project description
ethicallama
A local-first, privacy-respecting LLM inference wrapper for running large language models entirely on your own hardware.
Features
- Local-Only Inference: Everything runs on your machine. No data ever leaves your computer unless you explicitly configure it otherwise.
- Multi-Engine Support: Use llama.cpp, whisper.cpp, or any custom inference engine via Jinja2-templated configuration.
- Multiple GPU Backends: Choose between Vulkan, ROCm, CUDA, or CPU inference.
- Built-in HTTP API: Optional FastAPI-powered REST API for remote inference.
- Model Indexing: Automatically discover and manage models across your configured directories.
- Configurable Telemetry: Telemetry is DISABLED by default. Opt-in only with explicit confirmation.
Quick Start
Prerequisites
- Python 3.10+
- Rust/Cargo (for building the native core)
- Git
Installation
Pick the install method that matches your workflow. ethicallama is
local-only: nothing is sent to the network and no telemetry runs unless
you explicitly enable it.
Using pip (recommended, once on PyPI)
The standard, works-everywhere install. Wheels are pre-built for Linux and macOS on Python 3.10+.
pip install ethicallama
# With API server support:
pip install "ethicallama[api]"
# With everything (API, HF pulling, Safetensors conversion):
pip install "ethicallama[all]"
Using uv (10-100× faster than pip)
uv is a Rust-based Python package
manager — drop-in faster pip. Use it inside an existing virtualenv
or for one-off pip-style installs.
# Inside a uv-managed venv
uv pip install ethicallama
uv pip install "ethicallama[api]"
# Run without permanently installing (one-shot)
uv run --with ethicallama ethllama run llama3.2
Using pipx (isolated CLI, no venv management)
pipx installs Python CLI tools in their own
isolated virtualenv and exposes the ethllama executable on your
PATH globally — ideal if you just want the CLI on your machine.
pipx install ethicallama
# With API server support:
pipx install "ethicallama[api]"
# Upgrade later:
pipx upgrade ethicallama
From source (latest code, full Rust core)
For the latest unreleased code, custom Rust core builds, or contributing to the project:
git clone --recursive https://github.com/luluthehungrycat/ethicallama
cd ethicallama
# Set up a venv (uv or stdlib venv both work)
uv venv && source .venv/bin/activate
# (or: python3 -m venv .venv && source .venv/bin/activate)
uv pip install maturin ".[all]"
# (or: pip install maturin ".[all]")
# Build the Rust extension and install the Python package
maturin develop --release
After installing, initialize the user config:
ethllama config --init
Optional extras
| Extra | Adds |
|---|---|
[api] |
FastAPI server (ethllama serve) + uvicorn + pydantic |
[pull] |
HuggingFace Hub model pulling (ethllama pull) |
[convert] |
Safetensors → GGUF conversion (ethllama convert) |
[all] |
All of the above |
Extras are stacked with commas, e.g. pip install "ethicallama[api,pull]".
Basic Usage
# Run a model with default settings
ethllama run ~/models/qwen2.5-7b-q4_k_m.gguf --prompt "What is the capital of France?"
# Use a specific GPU backend
ethllama run ~/models/model.gguf --gpu cuda --gpu-layers 32
# Enable the HTTP API
ethllama serve --host 127.0.0.1 --port 8080
# List all indexed models
ethllama index list
# Index a directory of models
ethllama index add ~/models
CLI Reference
Global Options
| Option | Description |
|---|---|
--config |
Path to config file (default: ~/.ethllama/config.yaml) |
--verbose |
Enable verbose logging |
Commands
| Command | Description |
|---|---|
run |
Run inference with a model |
serve |
Start the HTTP API server |
config |
Manage configuration |
index |
Manage model index |
run
ethllama run <model> [options]
Options:
| Option | Default | Description |
|---|---|---|
--prompt, -p |
"Hello" |
Input prompt |
--temperature, -t |
0.7 |
Sampling temperature |
--top-p |
0.95 |
Top-p sampling |
--top-k |
40 |
Top-k sampling |
--threads |
4 |
Number of CPU threads |
--gpu |
cpu |
GPU backend: vulkan, rocm, cuda, cpu |
--gpu-layers |
0 |
Number of layers offloaded to GPU |
--engine |
llama-cpp |
Engine to use |
--output, -o |
None |
Output file path |
Examples:
# Basic inference
ethllama run model.gguf --prompt "Write a poem about AI"
# With GPU acceleration
ethllama run model.gguf --gpu cuda --gpu-layers 35 --threads 8
# Using a custom engine
ethllama run model.safetensors --engine my-custom-engine
# Save output to file
ethllama run model.gguf --prompt "Translate to French: Hello" --output result.txt
serve
ethllama serve [options]
Options:
| Option | Default | Description |
|---|---|---|
--host |
127.0.0.1 |
Bind address |
--port |
8080 |
Port number |
--api-key |
"" |
API key for authentication |
Example:
ethllama serve --host 0.0.0.0 --port 8080 --api-key "my-secret-key"
Configuration
Configuration is stored in ~/.ethllama/config.yaml:
gpu:
backend: vulkan
fallback: true
api:
enabled: false
host: 127.0.0.1
port: 8080
api_key: ""
telemetry:
enabled: false
model_dirs:
- /home/user/models
Run the interactive setup:
ethllama config --init
Architecture
┌─────────────────────────────────────────────┐
│ ethllama (Python CLI) │
│ ┌─────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Config │ │ Index │ │ Engines │ │
│ │ Manager │ │ Manager │ │ (YAML defs) │ │
│ └────┬────┘ └────┬─────┘ └──────┬───────┘ │
└───────┼───────────┼──────────────┼─────────┘
│ │ │
┌───────┴───────────┴──────────────┴──────────┐
│ ethllama-core (Rust/PyO3) │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ Model Loader │ │ Inference Engine │ │
│ └──────┬──────┘ └────────┬─────────┘ │
└─────────┼──────────────────┼────────────────┘
│ │
┌─────────┴──────────────────┴────────────────┐
│ External Backends (llama.cpp, whisper.cpp) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Vulkan │ │ ROCm │ │ CUDA │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────┘
Components
- ethllama (Python): CLI interface, configuration management, model indexing, and engine orchestration using Jinja2-templated YAML engine definitions.
- ethllama-core (Rust): Native model loading and inference via PyO3 bindings to llama.cpp.
- Engines (YAML): Pluggable engine configurations that define how to invoke external inference binaries (llama.cpp, whisper.cpp, or custom).
Engine Configuration
Engines are defined as YAML files placed in ~/.ethllama/engines/. See docs/examples/ for ready-to-use templates.
Each engine config specifies:
- The binary to invoke
- A Jinja2 args template for building CLI commands
- Environment variables
- A pre-check command for validation
- Streaming support flag
- Supported model file extensions
Development
Setup
# Clone and enter the project
git clone https://github.com/luluthehungrycat/ethicallama.git
cd ethicallama
# Initialize submodules (for llama.cpp dependency)
git submodule update --init --recursive
# Build the Rust core
cargo build --release -p ethllama-core
# Install the Python package in editable mode
pip install -e ".[dev]"
Project Structure
ethicallama/
├── ethllama/ # Python package
│ ├── __init__.py # Package exports
│ ├── config.py # Configuration management
│ ├── engines.py # Engine config loading/running
│ └── index.py # Model index management
├── ethllama-core/ # Rust core (PyO3 bindings)
│ ├── src/
│ │ ├── lib.rs # PyO3 module definition
│ │ ├── llama.rs # llama.cpp FFI bindings
│ │ └── utils.rs # Utilities
│ ├── build.rs # Build script (links llama.cpp)
│ └── Cargo.toml
├── docs/ # Documentation
│ ├── USAGE.md # Detailed usage guide
│ ├── PRIVACY.md # Privacy policy
│ └── examples/ # Example engine configs
├── scripts/ # Helper scripts
│ ├── setup.sh # Development setup
│ └── benchmark.sh # Simple benchmark
├── CREDITS.md # Open-source credits
├── LICENSE # MIT License
└── README.md # This file
Testing
# Run Python tests
pytest
# Run Rust tests
cargo test -p ethllama-core
Using uv? The entire project works seamlessly with
uv— see AGENTS.md for the full uv development workflow (venv creation, maturin builds, and the recommended test commands).
Credits
ethicallama is built on the shoulders of several excellent open-source projects. See CREDITS.md for the full list.
Key dependencies:
- llama.cpp - GGUF model loading and inference
- whisper.cpp - Speech-to-text (planned)
- PyO3 - Rust-Python bindings
- FastAPI - HTTP API server
License
MIT License. See LICENSE for details.
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 Distributions
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 ethicallama-0.1.2.tar.gz.
File metadata
- Download URL: ethicallama-0.1.2.tar.gz
- Upload date:
- Size: 87.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
431bebbbfcb776ae6050f18ef2b0f49ebd1fc96ce92b6a9e8a2be15b8b207684
|
|
| MD5 |
9b600d06e3cc5d0e8300e94a580fbdaf
|
|
| BLAKE2b-256 |
dfecae8afb92085bc09cf669dc22b9933619039a3ef9de8fc9c78a975e3594a1
|
Provenance
The following attestation bundles were made for ethicallama-0.1.2.tar.gz:
Publisher:
release.yml on luluthehungrycat/ethicallama
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ethicallama-0.1.2.tar.gz -
Subject digest:
431bebbbfcb776ae6050f18ef2b0f49ebd1fc96ce92b6a9e8a2be15b8b207684 - Sigstore transparency entry: 2116380760
- Sigstore integration time:
-
Permalink:
luluthehungrycat/ethicallama@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/luluthehungrycat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ethicallama-0.1.2-cp313-cp313-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ethicallama-0.1.2-cp313-cp313-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.13, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
057f4c5babec2a272b7f5a01611a6b74d22f897e35ff51cff015f1f0986560ab
|
|
| MD5 |
246314d5697cdcec68819c4abb0ffff2
|
|
| BLAKE2b-256 |
fb16c9902bbcf30b830c04b72dedaf1f4001dabb87bbe080784d93d2d1e9d76e
|
Provenance
The following attestation bundles were made for ethicallama-0.1.2-cp313-cp313-manylinux_2_39_x86_64.whl:
Publisher:
release.yml on luluthehungrycat/ethicallama
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ethicallama-0.1.2-cp313-cp313-manylinux_2_39_x86_64.whl -
Subject digest:
057f4c5babec2a272b7f5a01611a6b74d22f897e35ff51cff015f1f0986560ab - Sigstore transparency entry: 2116382798
- Sigstore integration time:
-
Permalink:
luluthehungrycat/ethicallama@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/luluthehungrycat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ethicallama-0.1.2-cp312-cp312-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ethicallama-0.1.2-cp312-cp312-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.12, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
833dc1ce8501c7a3b94b6a13ce977df3fc0f98922e95762d36adbfee8d04d259
|
|
| MD5 |
df45d27e2d30f1b40edd8dedfb6504f9
|
|
| BLAKE2b-256 |
650a8b34b4ea47fa418672cf0a212fd0c787e8c0f17df0afbc750ba55ad165ec
|
Provenance
The following attestation bundles were made for ethicallama-0.1.2-cp312-cp312-manylinux_2_39_x86_64.whl:
Publisher:
release.yml on luluthehungrycat/ethicallama
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ethicallama-0.1.2-cp312-cp312-manylinux_2_39_x86_64.whl -
Subject digest:
833dc1ce8501c7a3b94b6a13ce977df3fc0f98922e95762d36adbfee8d04d259 - Sigstore transparency entry: 2116382067
- Sigstore integration time:
-
Permalink:
luluthehungrycat/ethicallama@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/luluthehungrycat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ethicallama-0.1.2-cp311-cp311-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ethicallama-0.1.2-cp311-cp311-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c8e8052a5bddb671a239ac292aa7595ae5edade3ecd24cb4bb80e5ed4de3525
|
|
| MD5 |
ada8b75be7acadcc275a8936ce88b3fc
|
|
| BLAKE2b-256 |
f182a340468a1f6c44f8e7a710e536479c4cdd575df7e35dd5aa20aece45633e
|
Provenance
The following attestation bundles were made for ethicallama-0.1.2-cp311-cp311-manylinux_2_39_x86_64.whl:
Publisher:
release.yml on luluthehungrycat/ethicallama
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ethicallama-0.1.2-cp311-cp311-manylinux_2_39_x86_64.whl -
Subject digest:
4c8e8052a5bddb671a239ac292aa7595ae5edade3ecd24cb4bb80e5ed4de3525 - Sigstore transparency entry: 2116381443
- Sigstore integration time:
-
Permalink:
luluthehungrycat/ethicallama@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/luluthehungrycat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ethicallama-0.1.2-cp310-cp310-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ethicallama-0.1.2-cp310-cp310-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.10, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
074c8625cac7782033f22e7fdcbea94e25b137e66129f6414e68d255b36da4d2
|
|
| MD5 |
364e6e6198e9933d862cee78ed2d9c78
|
|
| BLAKE2b-256 |
dcbef7955b98e79aae5b415a6545b9d1a7931645ad2b72b287b5c256b89a89fa
|
Provenance
The following attestation bundles were made for ethicallama-0.1.2-cp310-cp310-manylinux_2_39_x86_64.whl:
Publisher:
release.yml on luluthehungrycat/ethicallama
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ethicallama-0.1.2-cp310-cp310-manylinux_2_39_x86_64.whl -
Subject digest:
074c8625cac7782033f22e7fdcbea94e25b137e66129f6414e68d255b36da4d2 - Sigstore transparency entry: 2116381347
- Sigstore integration time:
-
Permalink:
luluthehungrycat/ethicallama@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/luluthehungrycat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0530dd3471f27a764d9c11466b322a7d2aedb421 -
Trigger Event:
push
-
Statement type: