Skip to main content

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 .py file 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:8b or otto pull qwen2.5-coder:7b, then set it via /model or default_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)

Source distribution for ottopilot 0.1.3
File Size Uploaded
ottopilot-0.1.3.tar.gz 38.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ottopilot 0.1.3
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 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