Skip to main content

DevOrch

A multi-provider AI coding assistant CLI — like Claude Code and Gemini CLI, but open source.

PyPI Python License Stars


DevOrch gives you a coding assistant in your terminal that can execute shell commands, edit files, search your codebase, manage terminal sessions, and remember context across conversations — powered by any of 13+ AI providers or your own local models.

Why DevOrch?

  • Provider freedom — Switch between OpenAI, Anthropic, Gemini, Mistral, Groq, and 8 more providers (including local models) with a single command. No vendor lock-in.
  • Actually does things — Runs shell commands, edits files, manages background processes, searches the web. Not just a chatbot.
  • Cross-session project memory — Per-project persistent memory system automatically recalls architecture decisions, coding preferences, and recent session milestones across sessions.
  • Loop & thrashing safeguards — Advanced safety layer detects duplicate calls, tool oscillation, and error loops, preventing runaway token drain.
  • Full token & speed transparency — Real-time prompt/completion token tracking, context compaction metrics, and generation speed (tok/s) across 13 providers.
  • Extensible — Add custom skills as YAML files, connect MCP servers for additional tools, configure permissions per-tool.

Quick Start

Install

# Recommended
pipx install devorch

# Or with pip
pip install devorch

# Or from source
git clone https://github.com/Amanbig/DevOrch.git
cd DevOrch && pip install -e .

Run

devorch                    # Interactive setup on first run
devorch -p openai          # Use a specific provider
devorch -p local           # Use Ollama (local models)
devorch --continue         # Continue the latest conversation started in this directory (-c)
devorch --resume           # Pick a previous session from a list (this directory's first)
devorch --resume abc123    # Resume a specific session by ID
devorch --version          # Print the version (-V)
devorch doctor             # Check your setup: providers, keys, permissions, project trust, terminal

# Non-interactive (scripting / CI)
devorch ask "explain this project"
devorch ask --skill commit
devorch run review "focus on security"
devorch edit src/auth.py "add input validation"

On first run, DevOrch walks you through provider selection and API key setup.

Features

13+ AI Providers

Cloud Local / Self-Hosted
OpenAI (GPT-4o, o1) Ollama (Llama, Mistral, CodeLlama)
Anthropic (Claude 4, 3.5) LM Studio (any GGUF model)
Google Gemini (2.0, 1.5 Pro) Custom (vLLM, TGI, llama.cpp)
Groq (ultra-fast Llama, Mixtral)
Mistral (Large, Codestral)
Together AI, OpenRouter, GitHub Copilot, DeepSeek, Kimi

Switch anytime with /providers (interactive) or /provider <name> (direct).

Built-in Tools

DevOrch can act on your system, not just talk about it:

Tool What it does
shell Execute commands (npm install, pytest, etc.)
git Structured, safe git: status, diff, log, show, branch, switch, add, commit
terminal_session Managed background processes with optional GUI window
filesystem Read, write, list files
search / grep Find files and search contents
edit Targeted find-and-replace edits
task Track progress on multi-step work
memory Persistent memory across conversations
websearch / webfetch Search the web, fetch URLs

Streaming

Replies render live as the model generates them (a spinner shows until the first token). Every provider streams. Streaming is only used in the interactive REPL; ask, run and --output json are unchanged.

Prompt Caching (Anthropic)

With the Anthropic provider, DevOrch marks the tool definitions + system prompt and the conversation so far as cacheable. Within a multi-step task each model call re-reads that prefix from Anthropic's cache at roughly a tenth of the normal input price instead of paying for it again, and /tokens shows the cached portion. Prompts below the model's minimum cacheable size (1024–2048 tokens) are simply not cached. The same markers are sent for anthropic/* models via OpenRouter. OpenAI, DeepSeek, Kimi and Gemini 2.5 cache repeated prefixes automatically on their side; DevOrch keeps the start of every request byte-identical (stable system prompt, no timestamps, volatile notes last) so those caches hit, and a test guards that.

Memory & Project Context

DevOrch maintains persistent memory so you never have to repeat context:

1. Per-Project Memory (Cross-Session Recall) Stored automatically per repository in ~/.devorch/projects/<project_id>/:

/memory                              # View active architectural decisions & session history
/memory add Use uv for package management   # Record an architectural decision
/memory pref Prefer clean async/await       # Record a coding style preference
/memory clear                        # Clear project memory for this repository

Accomplishments are automatically extracted and summarized on session exit with zero raw command leakage.

2. Global Memory (Across All Projects) Stored in ~/.devorch/memory/:

/remember I prefer tabs over spaces
/remember Use ruff for Python linting
/forget                              # Interactively choose a memory to remove

Skills

Reusable prompt templates for common workflows. Use them in chat or directly from the CLI:

# In chat
/commit       # Generate a descriptive git commit
/review       # Review code changes for bugs
/test         # Run tests and analyze results
/fix          # Fix the last error
/explain      # Explain project structure
/simplify     # Simplify recent code changes

# From the terminal (non-interactive)
devorch run commit
devorch run review "focus on auth module"
devorch run test

devorch skills              # List all available skills

Add your own in ~/.devorch/skills/:

# ~/.devorch/skills/deploy.yaml
name: deploy
description: Deploy to production
prompt: |
  Run the deploy script and verify it succeeds.
  Check the deploy logs for any errors.

Custom Slash Commands (Markdown)

Drop a Markdown file in ~/.devorch/commands/ (global) or <project>/.devorch/commands/ (project; overrides global and built-ins). The file name becomes the command:

<!-- .devorch/commands/pr.md  →  /pr 123 -->
---
description: Review a pull request
---
Review PR $ARGUMENTS: summarize the change, then list bugs and risks.

$ARGUMENTS is replaced with whatever follows the command; without the placeholder, arguments are appended to the prompt. Works in chat (/pr 123) and from the CLI (devorch run pr 123).

Terminal Sessions

Background processes that persist across DevOrch restarts:

# Headless — AI monitors output
> terminal_session start command="npm run dev"
  Session 'swift-fox-a3f2' started (PID 12345)

# With GUI — user gets a visible terminal, AI can still read output
> terminal_session start command="bash" gui=true
  Session 'calm-owl-b7e1' started in visible terminal

# Check output / send input / stop
> terminal_session read session_id="swift-fox-a3f2"
> terminal_session send session_id="swift-fox-a3f2" input="rs\n"
> terminal_session stop session_id="swift-fox-a3f2"

Hooks

Run your own shell commands before and after any tool call — block risky actions, auto-format, run linters. Configure in ~/.devorch/hooks.yaml (global) or <project>/.devorch/hooks.yaml (project hooks only run after devorch trust, since they execute shell commands):

hooks:
  PreToolUse:
    - matcher: "shell"            # regex on tool name; omit to match all tools
      command: "./scripts/guard.sh"
  PostToolUse:
    - matcher: "edit|filesystem"
      command: "ruff format ."
      timeout: 20                 # seconds, default 30

The hook gets a JSON payload on stdin (event, tool_name, tool_input, tool_output for post hooks, cwd). Exit 0 to continue; exit 2 to block a PreToolUse call (stderr is sent back to the model) or to feed stderr back after a PostToolUse; any other exit code is a non-blocking warning.

@file Mentions

Reference files or folders inline and DevOrch attaches their contents to the prompt:

> explain @core/agent.py
> why does @core/agent.py:100-140 loop?
> summarize @tools/

Mention an image (.png, .jpg, .gif, .webp; up to 5 MB) to send it to the model:

> why does the layout in @screenshots/bug.png look broken?
> devorch ask "describe @diagram.png"

Images work with OpenAI, Anthropic, Gemini, OpenRouter, Mistral, Groq, Together, GitHub Copilot, Kimi, and local/LM Studio/custom endpoints — provided the model is vision-capable (otherwise the provider returns an error). DeepSeek has no image support here, so images are dropped with a warning. Images stay in the current session's context but are not saved to the session database.

Token savings: only the 2 most recent image messages are re-sent on each call; older ones become a short text note (stored history is untouched). With Pillow installed (pip install "devorch[images]"), images larger than 1568px on the long side are downscaled before sending — typically several MB down to a few hundred KB, with no visible loss for the model.

Tab completes paths after @. Mentions only expand when the path exists (emails and handles are left alone); binary files are skipped, and large files are truncated.

Cost Estimates

/cost shows the estimated cost of the session per model; the per-turn line, /tokens, and the bottom bar show it too, and --output json adds usage.cost_usd. Each call is priced at the model that served it, so switching models mid-session stays correct, cached/cache-write tokens use their own rates, and sub-agent calls are included.

Prices are approximate list prices and go stale. Models not in the built-in table are never guessed: they show no price and are left out of the total (local Ollama / LM Studio are free). Add or override prices in ~/.devorch/config.yaml (USD per 1M tokens; the key is matched as a prefix of the model id):

pricing:
  claude-sonnet-4:
    input: 3.0
    output: 15.0
    cache_read: 0.30     # optional, defaults to the input price
    cache_write: 3.75    # optional, defaults to the input price

Continuing and resuming sessions

Every session remembers the directory it was started in. devorch --continue (-c) reopens the most recent non-empty conversation from the current directory; if there is none it tells you and starts a new one. A bare devorch --resume shows a picker of this directory's sessions (labelled by what you first asked) with an option to widen it to every directory, and /resume does the same without leaving DevOrch. Sessions created by earlier versions have no recorded directory, so --continue cannot find them, but they still appear in the picker's "all directories" view and can be resumed by ID. devorch sessions list --here lists only this directory's sessions.

Prompt Shortcuts

Key Action
Enter Send
Alt+Enter / Ctrl+J New line (Ctrl+J works in every terminal)
Shift+Tab Cycle mode: ASK → AUTO → PLAN
Tab / / / @ Complete commands, skills and file paths
↑ / Ctrl+R Previous prompts / search history
Ctrl+C Cancel the running turn (twice at an idle prompt to exit)

The input sits in an open box with a quiet grey border and gutter; only the mode label is coloured (blue ASK, amber AUTO, yellow PLAN), so the mode that decides whether tools run unasked is always visible without a loud frame. The gutter follows multi-line and wrapped input, and the placeholder and bottom bar fit your terminal width (the mode, model and token count are never clipped; the path, branch and key hints are dropped first on narrow terminals).

DevOrch clears the visible screen when the interactive REPL starts (your scrollback is kept). Set DEVORCH_NO_CLEAR=1 to turn that off.

The bottom bar shows the directory, git branch, model, mode, session tokens and how full the context window is (ctx 42% — compaction starts at 100%).

Cancelling a turn

Ctrl+C while DevOrch is working cancels just that turn (a running shell command is killed) and keeps your session; any tool call that was cut short is recorded as cancelled so the conversation stays valid. /undo reverts the turn's file changes. At an idle prompt, press Ctrl+C twice (or type exit) to quit. In ask / run, Ctrl+C exits with status 130 (--output json reports "error": "interrupted").

Checkpoints & Undo

Before the agent modifies a file with edit or filesystem write, DevOrch snapshots the original. /undo removes the last turn from the conversation and restores those files (files the agent created are deleted). /checkpoints lists what changed per turn. Changes made through shell commands are not tracked.

MCP (Model Context Protocol)

Extend DevOrch with external tool servers:

# ~/.devorch/config.yaml
mcp_servers:
  github:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-github"]
    env:
      GITHUB_TOKEN: "ghp_xxx"
  filesystem:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-filesystem", "/home/user"]

MCP tools appear alongside built-in tools automatically.

Manage MCP servers live in chat:

/mcp                          # Show connected servers and their tools
/mcp add github npx -y @modelcontextprotocol/server-github
/mcp start github             # Reconnect a server from config
/mcp stop github              # Disconnect and remove its tools

Filter MCP servers per CLI run:

devorch ask --mcp github "review open PRs"   # Use only the github server
devorch ask --mcp github --mcp filesystem "..."  # Use specific servers
devorch run commit --no-mcp                  # Skip MCP entirely

Project Settings

Commit shared defaults to your repo in <project>/.devorch/settings.yaml:

default_mode: ask                 # ask | auto | plan
default_provider: anthropic
providers:
  anthropic:
    default_model: claude-sonnet-4-20250514
mcp_servers:                      # merged over ~/.devorch/config.yaml
  github:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-github"]
permissions:
  shell:
    allow: ["pytest*", "ruff *"]
    deny: ["git push*"]

Precedence: CLI flags > project settings > ~/.devorch/config.yaml. The file is found from the current directory upward. API keys are never read from it, and project values are never written back to your global config.

Trust: a cloned repo must not be able to grant itself power. Project hooks.yaml is covered too and is ignored until trusted. Without trust, deny rules, provider/model and default_mode: ask|plan apply, but mcp_servers, allow rules, default_mode: auto and project hooks are ignored (you get a warning). Review the files and run devorch trust to enable them; trust is tied to a hash of settings.yaml + hooks.yaml, so any change to either needs devorch trust again. devorch untrust revokes it.

Modes

Mode Behavior
ASK (default) Asks permission before each tool execution
AUTO Executes tools automatically (dangerous commands still blocked)
PLAN Shows a plan before executing, asks for approval

Permission System

Fine-grained control over what DevOrch can do:

devorch permissions list                    # View current rules
devorch permissions set shell allow         # Always allow shell
devorch permissions allow shell "git *"     # Allow specific patterns
devorch permissions deny shell "rm -rf *"   # Block dangerous commands

Or use /auth in-chat to set API keys without restarting.

Non-Interactive CLI Commands

DevOrch works as a scriptable CLI too — no REPL needed:

# Ask a one-shot question
devorch ask "what does this codebase do?"
devorch ask --skill review "focus on security"
devorch ask --mode plan "refactor the auth module"

# Run a skill directly (shorthand for ask --skill)
devorch run commit
devorch run test "only unit tests"
devorch run review --no-mcp

# Edit a file with an instruction
devorch edit src/auth.py "add input validation to login"
devorch edit README.md "update the installation section"
devorch edit app/models.py "add created_at field" --mcp sqlite

# List available skills
devorch skills

# Browse providers and models directly from terminal
devorch providers               # View all 13 providers & configuration status
devorch models                  # View models for active provider
devorch models anthropic        # View models for a specific provider

# Inspect or manage project memory
devorch memory                  # View project decisions and recent accomplishments
devorch memory add "Use pytest" # Record a decision from the terminal
devorch memory clear            # Clear project memory

# Repository initialization
devorch init                    # Generate or update DEVORCH.md repository instructions

Machine-readable output

devorch ask --output json "list the TODOs in this repo" | jq .result
devorch run review --output stream-json    # NDJSON: one event per tool call, then the result

With --output json stdout contains a single JSON object (result, is_error, error, provider, model, duration_ms, usage, tool_calls); UI output goes to stderr and the exit code is non-zero on failure, so it is safe to use in scripts and CI. stream-json emits tool_call events as they happen followed by a final result event. Available on ask and run.

All non-interactive commands support --provider, --model, --mode, --mcp, --no-mcp and --dangerously-skip-permissions. devorch / devorch chat take --mode and --dangerously-skip-permissions too, so you can start the REPL in a given mode.

Skipping permission prompts

devorch --dangerously-skip-permissions        # start the REPL in AUTO mode
devorch ask --dangerously-skip-permissions "run the tests and fix failures"
devorch --mode plan                           # or start in plan / ask mode

--dangerously-skip-permissions is the same as --mode auto: no prompts at all, so the agent can edit files and run commands unasked. It is not a full bypass: the built-in dangerous-command blocks (rm -rf *, sudo, ...) and your own deny rules still apply, and project hooks still run. It conflicts with --mode ask|plan, and it overrides a project's default_mode. In the REPL, /auto and /ask switch the same behaviour on and off, and /permissions allow --session shell pytest* skips prompts for just one kind of command.

All Slash Commands

Command Description
/help Show categorized commands and shortcuts
/mode [plan|auto|ask] Show or switch execution mode
/plan /auto /ask Quick switch execution mode
/models Search and browse models with 15/page pagination
/model <name> Switch model directly or launch search
/providers Search and browse providers with interactive pagination
/provider <name> Switch provider directly or launch search
/tokens Show session token usage, prompt/completion split, and costs
/copy Copy last assistant response directly to clipboard
/paste Enter multi-line paste mode for large text or code (Alt+Enter also inserts newlines)
/status Show current provider, model, execution mode, and loaded context
/auth [provider] Set or update API key for any provider
/memory Show project memory (/memory add <dec>, /memory pref <p>, /memory clear)
/remember <text> Save a note or convention to global memory
/forget Delete a global memory interactively or by query
/init Generate or update a DEVORCH.md project context file
/skills List available skills
/skill <name> Run a skill directly
/commit /review /test /fix /explain /simplify Skill shortcuts
/session Current session ID, model, and message count
/history Full conversation history in this session
/clear Clear history (saves accomplishments to project memory)
/compact Summarize and compact conversation history to save tokens
/save Save conversation history to a file
/undo Undo last message and agent turn, restoring any files it edited
/checkpoints List files changed by the agent this session, per turn
/mcp Show MCP server status
/mcp add <name> <cmd> [args] Connect a new MCP server mid-session
/mcp start <name> Reconnect a server from config
/mcp stop <name> Disconnect a server and remove its tools
/config Show configuration settings
/permissions Show permissions; change them with /permissions allow|deny [--session] <tool> <pattern>, set <tool> <allow|deny|ask>, reset
/sessions list [n] [here], show <id>, delete <id>
/resume Switch to another saved session (/resume opens a picker, /resume <id> goes straight to it)
/doctor Check your setup (same as devorch doctor)
/hooks Show active hooks and whether project hooks are trusted
/trust / /untrust Trust (or stop trusting) this project's .devorch settings and hooks
/cost Estimated session cost per model
/exit Exit DevOrch (also exit, quit, or Ctrl+C twice)
/tasks Show multi-step task list and execution progress

Configuration

API Keys

# Secure keychain storage
devorch set-key openai
devorch set-key anthropic

# Or in-chat
/auth openai

# Or environment variables
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
export GOOGLE_API_KEY=...
export GROQ_API_KEY=gsk_...
export MISTRAL_API_KEY=...
export OPENROUTER_API_KEY=sk-or-...
export TOGETHER_API_KEY=...
export GITHUB_TOKEN=ghp_...
export DEEPSEEK_API_KEY=sk-...
export MOONSHOT_API_KEY=sk-...

Config File

# ~/.devorch/config.yaml
default_provider: openai

providers:
  openai:
    default_model: gpt-4o
  anthropic:
    default_model: claude-sonnet-4-20250514
  custom_vllm:
    default_model: meta-llama/Meta-Llama-3-70B-Instruct
    base_url: http://localhost:8000/v1

mcp_servers:
  github:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-github"]
    env:
      GITHUB_TOKEN: "ghp_xxx"

Directory Layout

~/.devorch/
├── config.yaml          # Provider settings, MCP servers
├── permissions.yaml     # Tool permission rules
├── sessions.db          # Chat history (SQLite)
├── memory/              # Persistent memories
│   ├── MEMORY.md
│   └── *.md
├── skills/              # Custom skill definitions
│   └── *.yaml
└── sessions/            # Terminal session logs
    ├── registry.json
    └── *.log

Contributing

Contributions are welcome! See CONTRIBUTING.md for the full guide (setup, workflow, how to add a provider, tool or slash command, testing notes). The short version:

git clone https://github.com/Amanbig/DevOrch.git
cd DevOrch
pip install -e ".[dev]"

ruff check . && ruff format .   # lint and format
pytest                          # tests (no network or API keys needed)
  • Keep PRs focused: one feature or fix per PR, with tests, and update the README/CHANGELOG for user-facing changes
  • Please follow the Code of Conduct
  • Security issues: report them privately, see SECURITY.md

Project Structure

DevOrch/
├── cli/
│   ├── main.py           # App wiring, REPL, sessions/config commands
│   ├── constants.py      # VERSION, banners, slash-command registry, styles
│   └── commands/
│       ├── _shared.py    # Shared helpers (agent builder, tool setup, etc.)
│       ├── ask.py        # devorch ask
│       ├── run.py        # devorch run
│       └── edit.py       # devorch edit
├── core/             # Agent, executor, memory, MCP, skills, modes
├── config/           # Settings, permissions
├── providers/        # AI provider implementations
├── tools/            # Built-in tools (shell, edit, search, etc.)
├── schemas/          # Pydantic models
├── utils/            # Logging, display helpers
└── tests/            # Test suite

Roadmap

  • Streaming responses
  • Image input
  • @file mentions (multi-file context)
  • Plugin marketplace
  • VS Code extension
  • Agent-to-agent delegation

Requirements

  • Python 3.10+
  • Works on Linux, macOS, and Windows

License

MIT


Built by Aman — star the repo if you find it useful!

Metadata

Release files for devorch 0.5.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 devorch 0.5.1
File Size Uploaded Provenance Actions
devorch-0.5.1.tar.gz 516.2 kB Without provenance Details for devorch-0.5.1.tar.gz

Built distribution (wheel)

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

Total release size: 703.5 kB

Release files / devorch-0.5.1.tar.gz

Download URL devorch-0.5.1.tar.gz
Size 516.2 kB
Tags Source
SHA-256 checksum
How to use checksums
a851bcc091f26d5731be1d8b325ab92741fbd4fe7fe793e34e072ba136c254ae
BLAKE2b-256 checksum
How to use checksums
ea783f26b45f5e21deffe6a134f602d4074d45da6c6cbef221c3de02afd5b250
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / devorch-0.5.1-py3-none-any.whl

Download URL devorch-0.5.1-py3-none-any.whl
Size 187.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
288b27cdafaf2fc31d6d77240b19dbbcdd3e747855c3203e83f3a20164e7c3dc
BLAKE2b-256 checksum
How to use checksums
aa6f8d7f8f19adde92af78eacf033dede3bd76b828db1a93a3bb2030b5c212bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for devorch 0.5.1

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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