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 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)
/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.1

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.1
File Size Uploaded
ottopilot-0.1.1.tar.gz 38.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ottopilot 0.1.1
File Interpreter ABI Platform
ottopilot-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 79.9 kB

Release files / ottopilot-0.1.1.tar.gz

Download URL ottopilot-0.1.1.tar.gz
Size 38.0 kB
Tags Source
SHA-256 checksum
How to use checksums
836dc3e690d0398e7f70872425335f8c7b66ccb066e9ab6643ae07612f399444
BLAKE2b-256 checksum
How to use checksums
1e1a69f4dd32281dfd954b971645f7b7f05bbfb504ddba3c556950e3c4c721f1
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.1-py3-none-any.whl

Download URL ottopilot-0.1.1-py3-none-any.whl
Size 41.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9ca6e106a085967557db2a251a07a46c1129787442abed281f4583f5b4247bb1
BLAKE2b-256 checksum
How to use checksums
a269445c894a68b5c564fa20d917050d87c9e8b7de8aff30e5535e0dc4c470be
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

0.1.3

2 release files

0.1.2

2 release files

This release

0.1.1 This release

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