Skip to main content

Mithril

"Mithril! All folk desired it. It could be beaten like copper, and polished like glass; and the Dwarves could make of it a metal, light and yet harder than tempered steel." — Gandalf

A multi-model orchestration engine. Combine any mix of LLM providers (Gemini, OpenAI, Anthropic, Groq, local GGUF) into a single Ollama-compatible API endpoint. Configure who does what in a YAML file, then point any AI tool at it.

Build PyPI version License API


What It Does

You define a fellowship — a team of AI models working together:

# .mithril/fellowship.yaml
name: "my-team"
controller:
  provider: local          # Free GGUF model routes requests
  model: qwen-1.5b

agents:
  - name: coder
    provider: gemini
    model: gemini-2.5-flash
    when: "coding tasks"
    tools: ["*"]

  - name: reviewer
    provider: openai
    model: gpt-4o
    when: "code review requested"
    tools: ["read_psi", "grep_files"]

Then you start the engine:

mithril serve

Now any Ollama-compatible client sees your fellowship as a model:

# From Junie, OpenCode, Open WebUI, or any Ollama client:
curl http://localhost:16180/api/tags
# → {"models": [{"name": "my-team:latest", "details": {"family": "mithril-fellowship"}}]}

Use Cases

Use Case How
Backend for Junie Point Junie at http://localhost:16180, select your fellowship as the model
Backend for OpenCode Same — Ollama API compatible
Backend for Open WebUI Add as Ollama connection
Backend for LangChain / LlamaIndex Use OpenAI API at http://localhost:16180/v1/chat/completions
Backend for Jupyter / Python pip install mithril-cli — run directly in notebooks and data workflows
MCP server for Claude Desktop mithril mcp-stdio
Standalone CLI mithril chat — built-in terminal interface
Docker service for teams docker compose up — shared orchestration backend
Telegram bot mithril telegram — chat via Telegram with same fellowship

Architecture

graph TB
    subgraph "Clients (any Ollama/OpenAI consumer)"
        J[Junie]
        O[OpenCode]
        W[Open WebUI]
        L[LangChain]
        C[Claude Desktop]
        T[Telegram]
        CLI[Mithril CLI]
    end

    subgraph "Mithril Engine"
        API[API Layer<br/>Ollama + OpenAI + MCP]
        ORCH[Orchestrator<br/>GGUF Classifier → Agent Routing]
        TOOLS[24 Built-in Tools<br/>File, Git, Web, Code, Terminal]
    end

    subgraph "Cloud API Providers"
        G[Gemini]
        GPT[OpenAI]
        A[Anthropic]
        GR[Groq]
    end

    subgraph "Local"
        LOCAL[Local GGUF]
    end

    subgraph "CLI Providers"
        K[Kiro]
        JN[Junie]
        COP[Copilot]
        ANY[Any CLI]
    end

    J -->|Ollama API| API
    O -->|Ollama API| API
    W -->|Ollama API| API
    L -->|OpenAI API| API
    C -->|MCP stdio| API
    T -->|Internal| API
    CLI -->|Internal| API

    API --> ORCH
    ORCH --> G
    ORCH --> GPT
    ORCH --> A
    ORCH --> GR
    ORCH --> LOCAL
    ORCH --> K
    ORCH --> JN
    ORCH --> COP
    ORCH --> ANY
    ORCH --> TOOLS

Installation

One-liner (Linux & macOS)

Downloads the universal zero-dependency static binary and automatically configures your shell PATH:

curl -fsSL https://raw.githubusercontent.com/GiacomoSaccaggi/mithril/main/install.sh | bash

Python / Jupyter / Conda (pip)

Ideal for Jupyter notebooks, Google Colab, SageMaker, cloud VMs, and Python data science stacks:

pip install mithril-cli

Inside a Jupyter notebook cell:

!pip install mithril-cli
!mithril --version

Homebrew (macOS & Linux)

brew install GiacomoSaccaggi/tap/mithril
# or:
brew tap giacomosaccaggi/tap && brew install mithril

Standalone Pre-built Binaries

Download the standalone binary for your architecture from GitHub Releases:

Platform Architecture Archive
Linux (Universal Static MUSL) x86_64 / amd64 mithril-linux-x64.tar.gz
Linux (Universal Static MUSL) ARM64 / aarch64 mithril-linux-arm64.tar.gz
macOS Apple Silicon (arm64) mithril-macos-arm64.tar.gz
macOS Intel (x64) mithril-macos-x64.tar.gz
Windows x86_64 mithril-windows-x64.zip

Docker

docker run -d -p 16180:16180 ghcr.io/giacomosaccaggi/mithril:latest

Or via Docker Compose:

git clone https://github.com/GiacomoSaccaggi/mithril.git
cd mithril
docker compose up -d
# API available at http://localhost:16180

Build from source

git clone https://github.com/GiacomoSaccaggi/mithril.git
cd mithril && cargo build --release

Quick Start

1. Configure providers

# API keys — stored encrypted with Argon2id + AES-256-GCM
mithril config set gemini "AIza..."
mithril config set openai "sk-..."

# Or via environment variables (for Docker/CI):
export MITHRIL_KEY_GEMINI="AIza..."
export MITHRIL_KEY_OPENAI="sk-..."

2. Create a fellowship

mithril fellowship init
# Creates .mithril/fellowship.yaml with sensible defaults

3. Start the engine

mithril serve
# → http://localhost:16180 (Ollama + OpenAI + MCP)

4. Connect your tools

Junie / OpenCode / Open WebUI:

  • Ollama URL: http://localhost:16180
  • Model: select your fellowship name from the list

LangChain / custom:

from openai import OpenAI
client = OpenAI(base_url="http://localhost:16180/v1", api_key="unused")
response = client.chat.completions.create(
    model="my-team",
    messages=[{"role": "user", "content": "Review this code"}]
)

Credentials in Docker

Mithril reads API keys in this priority order:

  1. Environment variables (recommended for Docker): MITHRIL_KEY_<PROVIDER>
  2. Encrypted config file: ~/.mithril/config.yaml (used by CLI)
# Docker Compose — set in .env file or environment:
MITHRIL_KEY_GEMINI=AIza...
MITHRIL_KEY_OPENAI=sk-...
MITHRIL_KEY_ANTHROPIC=sk-ant-...
MITHRIL_KEY_GROQ=gsk_...

No secrets are stored in the Docker image. Mount .mithril/fellowship.yaml for your agent configuration.


Fellowship Configuration

A fellowship defines who does what:

name: "code-team"
description: "Multi-model coding assistant"

controller:
  provider: local         # Routes requests (free, fast)
  model: qwen-1.5b
  context_window: 2       # Messages the router sees

agents:
  - name: worker
    provider: gemini
    model: gemini-2.5-flash
    role: "Fast coder — implements features"
    when: "any coding task"
    can_call: [reviewer]
    tools: ["*"]           # All 24 tools

  - name: reviewer
    provider: openai
    model: gpt-4o
    role: "Senior reviewer — catches bugs"
    when: "review requested or complex logic"
    can_call: []
    tools: [read_psi, grep_files, git_diff]

Agents communicate via the NEXT/TASK protocol:

  • NEXT: DONE — task complete, return to user
  • NEXT: reviewer + TASK: check auth.rs — delegate to another agent

The CLI (Optional)

Mithril includes a full-featured terminal interface:

mithril chat              # Interactive REPL with Tab completion
mithril chat --tui        # Full-screen TUI with panels
mithril exec "fix bug"    # Non-interactive (for CI/scripts)

Features: @file expansion, #agent routing, /commands, Plan/Build modes, undo/redo, session persistence, custom commands, hooks.

See docs/CLI.md for details.


API Endpoints

Endpoint Protocol Use
GET /health — Health check
GET /api/tags Ollama List models (includes fellowships)
POST /api/chat Ollama Chat completion
POST /api/generate Ollama Text generation
POST /v1/chat/completions OpenAI Chat completion
GET /v1/models OpenAI List models
POST /mcp MCP JSON-RPC tool calls

Provider Types

Mithril supports three types of providers:

Type Examples How It Works
Local GGUF qwen-1.5b, qwen-14b, llama-8b Direct inference via llama.cpp (free, private, fast for routing)
Cloud API Gemini, OpenAI, Anthropic, Groq HTTP calls to cloud LLM endpoints (pay-per-token)
CLI Tools Kiro, Junie, Copilot, any CLI Subprocess calls to local CLI tools that have their own model access
# .mithril/fellowship.yaml
name: "my-team"

controller:
  provider: local          # Local GGUF (free, used for routing)
  model: qwen-1.5b

agents:
  # Cloud API provider
  - name: coder
    provider: gemini
    model: gemini-2.5-flash

  # CLI provider (uses kiro-cli with its own auth)
  - name: reviewer
    provider: kiro
    model: claude-opus-4.6

  # GitHub Copilot CLI (2000 credits/month)
  - name: specialist
    provider: copilot
    model: gpt-5.4

  # Local GGUF (free, private, offline)
  - name: local-coder
    provider: local
    model: qwen-14b

CLI providers are useful when you have access to tools like Kiro, Junie, or GitHub Copilot with their own authentication and model access. Mithril orchestrates them as part of your fellowship without needing separate API keys. Each CLI tool has its own credit budget — use them strategically for complex tasks while Gemini handles the bulk.

Note on the controller: The controller (classifier/router) defaults to a local GGUF model which is free, fast (~100ms), and private. You can technically use any provider as controller (e.g., provider: gemini), but it's not worth the cost unless you have a very large agent structure where precise routing justifies paying per-classification.


24 Built-in Tools

File: read_file, write_file, edit_file, delete_file, apply_patch Terminal: run_terminal (sandboxed) Discovery: list_files, grep_files, find_file, file_stats, glob_files Git: git_status, git_log, git_diff, git_blame, git_branch Web: web_search, fetch_page Code: search_symbols, document_outline Knowledge: lore_write, lore_read Interaction: todo_write, question


Documentation

Document Contents
docs/ARCHITECTURE.md System design and module map
docs/TOOLS.md All 24 tools with parameters
docs/CLI.md Terminal commands and features
docs/API.md HTTP endpoints reference
docs/PROVIDERS.md Provider configuration
docs/SECURITY.md Security model
docs/SESSION.md Session persistence
docs/ENGINE.md GGUF inference engine
CONTRIBUTING.md Join the Fellowship

License

MIT

Metadata

Release files for mithril-cli 0.5.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mithril-cli 0.5.4
File Size Uploaded
mithril_cli-0.5.4.tar.gz 2.7 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for mithril-cli 0.5.4
File
mithril_cli-0.5.4-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
mithril_cli-0.5.4-py3-none-manylinux_2_39_x86_64.whl Python 3 none Linux glibc 2.39+ x86-64 Details
mithril_cli-0.5.4-py3-none-manylinux_2_39_aarch64.whl Python 3 none Linux glibc 2.39+ ARM64 Details
mithril_cli-0.5.4-py3-none-macosx_11_0_x86_64.whl Python 3 none macOS 11.0+ x86-64 Details
mithril_cli-0.5.4-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details

Total release size: 38.0 MB

Release files / mithril_cli-0.5.4.tar.gz

Download URL mithril_cli-0.5.4.tar.gz
Size 2.7 MB
Tags Source
SHA-256 checksum
How to use checksums
1c0b5d6e9d50d2b5acaddb43df61aa534cd862fdbb09102b4c2bbe351f6c88bc
BLAKE2b-256 checksum
How to use checksums
198a2deb4a8bdc3152738d60e5a8a77df2a04ff048d6ba232428cf056036e78b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mithril_cli-0.5.4-py3-none-win_amd64.whl

Download URL mithril_cli-0.5.4-py3-none-win_amd64.whl
Size 7.3 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
fa04557fc11610c626f8e11c012299357e5e82b5abeeb15eda14ec5d825fa4b4
BLAKE2b-256 checksum
How to use checksums
79d6266dce074ec0887ce5bc007ae51dcd0ccef664864fa775edd553c671592c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mithril_cli-0.5.4-py3-none-manylinux_2_39_x86_64.whl

Download URL mithril_cli-0.5.4-py3-none-manylinux_2_39_x86_64.whl
Size 7.4 MB
Tags Linux glibc 2.39+ x86-64 Python 3
SHA-256 checksum
How to use checksums
05950a3e2e851a6c61cb70ac9b420d08a6c71fa92e2881115134d3c7ddfd1d8e
BLAKE2b-256 checksum
How to use checksums
3401f4919406d5955134ecb19145c5d1b812f84e1d07a217f723e985a02d2449
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mithril_cli-0.5.4-py3-none-manylinux_2_39_aarch64.whl

Download URL mithril_cli-0.5.4-py3-none-manylinux_2_39_aarch64.whl
Size 7.0 MB
Tags Linux glibc 2.39+ ARM64 Python 3
SHA-256 checksum
How to use checksums
5a856f03d3488f19bf4a836ffd1dfce587b1e1733241df25367ab7510961d774
BLAKE2b-256 checksum
How to use checksums
0b04e4aa23fad34559591ca6339d212a6b8ae0af2fe6f81af65ddf8deeae336a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mithril_cli-0.5.4-py3-none-macosx_11_0_x86_64.whl

Download URL mithril_cli-0.5.4-py3-none-macosx_11_0_x86_64.whl
Size 7.0 MB
Tags Python 3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
78aa2f67033b061e0dc96cf5d6196f4ce5211b56f18dcfd1900c4d93b43e04c0
BLAKE2b-256 checksum
How to use checksums
692a46b7b6d4b5b4868713fb0abe4eba9866dd36ec1e9bd2dcb4e38d6a29a1b7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mithril_cli-0.5.4-py3-none-macosx_11_0_arm64.whl

Download URL mithril_cli-0.5.4-py3-none-macosx_11_0_arm64.whl
Size 6.6 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1e9249e1a62196df17593efd03ff91ec2bc799a756de2e92a40cda9b803db7d8
BLAKE2b-256 checksum
How to use checksums
790e93d0180733628dde9d3833515062a8dd4dd674edee23f2c478a898998be8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

1.0.0

6 release files

This release

0.5.4 This release

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page