Skip to main content

ethical, local-only inference wrapper for llama.cpp

Project description

ethicallama

CI PyPI License Python

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ethicallama-0.1.6.tar.gz (109.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ethicallama-0.1.6-cp313-cp313-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

ethicallama-0.1.6-cp312-cp312-manylinux_2_39_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

ethicallama-0.1.6-cp311-cp311-manylinux_2_39_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

ethicallama-0.1.6-cp310-cp310-manylinux_2_39_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

File details

Details for the file ethicallama-0.1.6.tar.gz.

File metadata

  • Download URL: ethicallama-0.1.6.tar.gz
  • Upload date:
  • Size: 109.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ethicallama-0.1.6.tar.gz
Algorithm Hash digest
SHA256 b05c356d097e78e0585f66d49d01faf0d3adc7ef8c7d58eead5df702de6c9154
MD5 87712397c50ccbffec67fedb094fb9af
BLAKE2b-256 80332321d33881cf7f3dd1b8587ed1aac68379081ebebd6428c1d4c51d68cc0f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethicallama-0.1.6.tar.gz:

Publisher: release.yml on luluthehungrycat/ethicallama

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ethicallama-0.1.6-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ethicallama-0.1.6-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 519956382d8dae87d061c4b90c35e978726b7f636e899d67b70a727ac7dbcdf5
MD5 bee6d662cc18687a4c310049b0b4b1ee
BLAKE2b-256 82aa261f1b0ad2f8b4e5a54b2f33acbe8b3141b22f28b5c4a879b9b93ac923a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethicallama-0.1.6-cp313-cp313-manylinux_2_39_x86_64.whl:

Publisher: release.yml on luluthehungrycat/ethicallama

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ethicallama-0.1.6-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ethicallama-0.1.6-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 12b957c3eca3f7b92ee55090b9a2673ef5f1be0775d71d6fa9cb320e69beff78
MD5 47974a4c87a96ae6dc52767f3aae1821
BLAKE2b-256 67dc2e4a89cb10d119aaa765297dfa677e304ce193778dbc1686178e99f4c433

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethicallama-0.1.6-cp312-cp312-manylinux_2_39_x86_64.whl:

Publisher: release.yml on luluthehungrycat/ethicallama

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ethicallama-0.1.6-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ethicallama-0.1.6-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 1652f4bc73217b78eb2d03a2489f8975568d3b7773e9e642083d8fdaa7d9b8a5
MD5 ac282ffdb808cd5588a0a194d1c04e13
BLAKE2b-256 c17fe403751152d6205225192c1a036c0ba93fee738a41384a58efca2b5c08fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethicallama-0.1.6-cp311-cp311-manylinux_2_39_x86_64.whl:

Publisher: release.yml on luluthehungrycat/ethicallama

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ethicallama-0.1.6-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ethicallama-0.1.6-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 7b8e827b5fe36b6f1b80dbc962d698d622fabf083990c27338060c0d042e6650
MD5 fa7e380429a325365e2cf3fcb7fbefc5
BLAKE2b-256 a598d8b487962146d07b970c3fcbb1ca3673568e2e0c90f93173b3efdbac3255

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethicallama-0.1.6-cp310-cp310-manylinux_2_39_x86_64.whl:

Publisher: release.yml on luluthehungrycat/ethicallama

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page