OttoAI
A local-first, extensible coding agent for your terminal — think "Copilot CLI, but yours." Runs on local models (Ollama / Qwen3) by default, works fully offline, and can optionally use cloud providers (OpenAI, Anthropic, Gemini, Azure, OpenRouter, or any OpenAI-compatible endpoint) when you choose to turn them on.
Features
- 🧠 Local by default — Ollama + Qwen3 out of the box, no cloud required.
- 🔌 Cloud-optional & pluggable — flip to online and use OpenAI / Claude / Gemini / Azure / OpenRouter / any OpenAI-compatible server via config.
- 🛠️ Real agent tools — shell, file read/write/edit, grep/glob code search, git, web fetch, cross-session history search, and MCP (Model Context Protocol) servers.
- 💾 Sessions + memory — every conversation is persisted in SQLite, with FTS5 keyword search and optional embeddings for semantic recall across past sessions.
- ♻️ Conversation compaction — long chats are automatically summarized to stay within context, while the full history stays searchable.
- 🧩 Extensible — add providers/tools via pip entry points or drop a
.pyfile in~/.ottoai/plugins/.
Install
pip install ottopilot # from PyPI (once published)
# or, from source:
pip install -e .
Install Ollama and pull the default model (light, runs on ~8GB RAM):
otto pull qwen3:1.7b
On 16GB+ machines you can use a stronger model, e.g.
otto pull qwen3:8borotto pull qwen2.5-coder:7b, then set it via/modelordefault_model.
Usage
otto # interactive REPL (local-first)
otto chat "explain this repo"
otto chat --provider openai --model gpt-4o "review my diff"
otto models # list models for the default provider
otto catalog # installable models + specs (size, RAM, best-for)
otto catalog --ram 8 # only models that fit 8GB RAM
otto catalog --coding # only coding-focused models
otto pull qwen3:8b # install a model
otto remove qwen3:8b # delete an installed model (alias: otto rm)
otto sessions # list past sessions
otto resume # resume the latest session
otto search "auth bug" # search across all past sessions
otto config init # write ~/.ottoai/config.toml to customize
In the REPL
/model <name> switch model
/catalog [ram|coding] installable models + specs (e.g. /catalog 8)
/remove <name> delete an installed local model
/provider <name> [m] switch provider
/online /local toggle cloud access
/stream toggle streaming output
/think [on|off] toggle model reasoning (faster vs. higher quality)
/search <query> recall past sessions
/remember subj | fact store a durable fact
/compact compress the current conversation
/tools /sessions /memory /help /quit
Configuration
Config lives at ~/.ottoai/config.toml (run otto config init). Highlights:
local_only = true # set false (or /online) to allow cloud providers
default_provider = "ollama"
default_model = "qwen3:1.7b" # light default; bump on 16GB+ machines
stream = true # token-by-token output (/stream to toggle)
think = true # model reasoning: true = higher quality, false = faster (/think)
[compaction]
enabled = true
trigger_messages = 40
keep_recent = 12
[embeddings]
enabled = false # set true for semantic cross-session search
provider = "ollama"
model = "nomic-embed-text"
[providers.openai]
type = "openai_compatible"
base_url = "https://api.openai.com/v1"
api_key_env = "OPENAI_API_KEY"
[mcp_servers.filesystem]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/path"]
Extending OttoAI
Local plugin — create ~/.ottoai/plugins/my_tool.py:
from ottoai.tools import Tool
class HelloTool(Tool):
name = "hello"
description = "Say hello"
parameters = {"type": "object", "properties": {"who": {"type": "string"}}}
def run(self, who="world", **_):
return f"Hello, {who}!"
TOOLS = [HelloTool]
# PROVIDERS = {"my_type": MyProviderClass} # providers work the same way
Pip plugin — expose ottoai.tools / ottoai.providers entry points in your package.
License
MIT
Metadata
Release files for ottopilot 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ottopilot-0.1.3.tar.gz | 38.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ottopilot-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 80.6 kB
Release files / ottopilot-0.1.3.tar.gz
| Download URL | ottopilot-0.1.3.tar.gz |
|---|---|
| Size | 38.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
df02026de479a5715e555183fd7d82ff31f140cf43d2f7393775cc694e5c7de3
|
|
BLAKE2b-256 checksum How to use checksums |
46355f98d36265761c8b4073407821b7e2d566ad15150a5ff67d48e6f4ce8b37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / ottopilot-0.1.3-py3-none-any.whl
| Download URL | ottopilot-0.1.3-py3-none-any.whl |
|---|---|
| Size | 42.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3300b68e7731c7e1b388f56016dfc506d24127398335e2bcfa2afe1212314a90
|
|
BLAKE2b-256 checksum How to use checksums |
fc906c5d433d4ff03e56691c14e2481c1c5fd5bfa088d0b1181682c4fca38b0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency log