Skip to main content

sagent🪄

PyPI version CI Python 3.12+ License: Apache-2.0 Discord

A coding-agent CLI and strongly-typed Python library -- self-mutating, hot-swapping, multi-provider, with async tool calls and bidirectional recursive spawn.

sagent logo

Tutorial · Concepts · Providers · Tools · CLI · Sessions · Security · Architecture · API · Streaming · Compaction · Self-hosted · Showcase

Quick Start

uvx sagent

See Install for additional details.

Features

  1. Async runtime.

    • Commands auto-background when you type or when long-lived.
    • Consequence: Your agent always responds as fast as your service provider.
    • Tell a stuck task to stop, or detach one and let it keep running.
  2. Hot self-mutation.

    • Conversationally change the model / service provider.
    • Conversationally have the model edit its own session.
  3. Every Provider, every auth.

    • Anthropic, OpenAI, Google, Moonshot, DashScope, MiniMax, OpenAI-compatible endpoints, self-hosted HuggingFace models, and a managed llama.cpp server, all behind one binary.
    • Subscriptions supported and terms-of-service compliant.
  4. Unified cost tracking.

    • One USD total across every provider in a session.
    • Pricing base don API costs when on sub.
    • Sub-agent costs roll up to the root. --max-budget-usd N caps the whole tree.
  5. Self-directing agent fleets.

    • Agents retune their own runtime -- provider, model, thinking, context -- mid-task.
    • A coordinator can do it to its workers over AgentSend: "switch to o1, crank thinking, recompact and drop the file reads."
  6. Recursive agent messaging.

    • Any spawned agent can spawn and AgentSend to any peer, so coordination is a tree, not a star.
    • Claude Code's experimental Agent Teams is flat (one lead, no nesting); Codex and Gemini have no peer messaging.
  7. Richer built-in tools.

    • WebSearch/Fetch use headed or headless chrome.
    • PaperSearch/PaperFetch walk citation graphs and fetch PDFs.
    • Multi-backend WebSearch, WebFetch with markdown extraction, atomic read/write tracking on file tools.
  8. Unix-aligned and pipeable.

    • stdin, stdout, exit codes, and --output-format json are first-class.
    • Pipe through jq, drop into ipython (same prompt_toolkit underneath).
  9. Misaligned Bash tool calls are auto promoted to dedicated types.

    • Example: ls files/ is auto-promoted to List(files/) tool call.
  10. Universal session format.

    • Convert claude/codex sessions to from sagent format and vice versa.
  11. All spawns' sessions (ancestors and/or descendants) can be focused.

  12. Send a message to parent to autocreate an autopiloting agent.

  13. Apache 2 license.

Uniquely also an API

  1. One runtime, every surface.

    • The same Agent class powers the CLI, your application code, and recursive sub-agents.
  2. Typed Python objects.

    • Agent, Tool, Model, Provider, and Message are protocols and dataclasses you import, compose, and unit-test.
    • Passes strict: basedpyright, pyrefly, and ty.

Example:

from sagent import tools
from sagent.agent import Agent
from sagent.lib.codec import immutable
from sagent.providers import Google

agent = Agent(
    model=Google.from_env().model("gemini-pro-3.1"),
    system="You are a scientist.",
    tools=[tools.Read(), tools.Glob(), tools.Grep()],
)
result = await agent.run(immutable({"prompt": "analyze the CSV in ./data/"}))
print(result.content)

Install

uv tool install sagent && sagent

If you're missing uvx/uv,

  • Mac
    brew install uv
    
  • Linux
    sudo apt install -y curl
    curl -LsSf https://astral.sh/uv/install.sh | sh
    

Optionally, for faster glob and grep,

  • Mac
    brew install fd ripgrep
    
  • Linux
    sudo apt install -y fd-find ripgrep
    

To add sagent to your own project as a library,

uv add sagent

Or run from a source checkout,

git clone --depth 1 https://github.com/rekursiv-ai/sagent.git
cd sagent
uv run sagent --help

Authorization

Sagent supports all subscriptions and API KEYs.

Provider Env variable / Command
Anthropic ANTHROPIC_API_KEY
AnthropicCLI sagent login --provider acli
OpenAI OPENAI_API_KEY
Google GOOGLE_API_KEY
GoogleCLI sagent login --provider gcli
Moonshot MOONSHOT_API_KEY
DashScope DASHSCOPE_API_KEY
MiniMax MINIMAX_API_KEY
SelfHosted
LlamaCpp LLAMA_CPP_MODEL + LLAMA_CPP_SERVER

See Providers for the provider matrix, inference rules, and OpenAI-compatible provider setup.

Self-Hosted

Install the local runtime extra from a checkout:

uv sync --extra selfhosted

Or add it to your project from PyPI:

uv add "sagent[selfhosted]"

Then pass a HuggingFace repo ID or local snapshot path:

sagent --provider SelfHosted --model Qwen/Qwen3.6-27B+bfloat16+cuda
sagent --provider SelfHosted --model Qwen/Qwen3.6-27B+cuda+bfloat16

For a small smoke test:

sagent --provider SelfHosted --model Qwen/Qwen3-0.6B+float16+cuda \
  --effort none --max-response-tokens 32 --max-tool-call-rounds 1

SelfHosted options use + suffixes after the model name. Device, dtype, and compile can appear in any order, but each category can appear once.

The LlamaCpp provider is a second local option: it manages a llama-server subprocess and talks to it over its OpenAI-compatible endpoint. Point LLAMA_CPP_SERVER at a built llama-server binary and LLAMA_CPP_MODEL at a .gguf file, then run sagent --provider LlamaCpp --model qwen3.6-27b-12gb.

See Self-hosted Models for options, local snapshot paths, and runtime requirements.

MCP

Sagent calls the tools of MCP servers. Manage them with sagent mcp, which takes the arguments claude mcp does; each command has --help, and each is also /mcp.COMMAND at the prompt:

sagent mcp add git -- uvx mcp-server-git                       # a local command
sagent mcp add -t http linear https://mcp.linear.app/mcp       # a remote URL
sagent mcp add -t http github https://api.githubcopilot.com/mcp/ \
  -H 'Authorization: Bearer ${GITHUB_TOKEN}'                   # read at connect
sagent mcp login linear    # OAuth sign-in to a remote server; --headless over ssh
sagent mcp list            # each server, and whether it connects
sagent mcp get linear      # one server
sagent mcp logout linear   # forget its sign-in
sagent mcp remove linear   # and the server

add writes this project's servers; -s user writes every project's. A session reads the servers it starts with; one already open keeps its own.

Each tool becomes mcp__<server>__<tool>. An on_demand server is one tool, mcp__<server>, that lists, describes, and runs its tools, so a large server costs no tokens until used. Its options beyond add's flags go in with add-json, as the entry another tool's mcpServers JSON holds:

sagent mcp add-json linear '{"url": "https://mcp.linear.app/mcp", "loading": "on_demand"}'

A remote server that signs users in with OAuth, as Linear and Notion do, needs one sign-in before it connects. One that takes a token instead, as GitHub's does, reads it from its header. Config copied from Claude Code, Cursor, or Pi works as it is: pass the file with --mcp-config PATH.

In code, open the servers and pass their tools:

from pathlib import Path

from sagent import tools
from sagent.agent import Agent
from sagent.providers import Google
from sagent.tools.mcp import McpSession, servers

model = Google.from_env().model("gemini-pro-3.1")
async with McpSession(servers(Path.cwd())) as mcp:
    async with Agent(model=model, tools=[tools.Read(), *mcp.tools()]) as agent:
        ...

See the sagent.tools.mcp docstring for every field.

Security and privacy

Sagent is an agent runtime, not a sandbox. Enabled tools run with the current process permissions: Bash executes local commands, file tools read and write accessible paths, and provider/network tools send data to their configured services. Sessions are plaintext local state and may contain prompts, model responses, tool results, file snippets, and paths.

Use narrow tool sets, pass --ephemeral for one-off sensitive prompts so sessions and auto-memory are disabled, and run Sagent inside your own OS/container sandbox when a task needs hard isolation. See Security.

Comparison

How Sagent compares to aider, LangChain, Claude Code, Codex CLI, Gemini CLI, and other adjacent projects

Not yet in Sagent: LSP, native sandboxing, desktop UI, tree-sitter repo map, hosted service, browser automation.

This comparison focuses on the runtime shape rather than every feature of each project.

Sagent aider LangChain OpenClaw Cline Claude Code Codex CLI Gemini CLI Flue Pi Attractor npcsh
Python library ✅ 🟡 ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅
Multi-provider ✅ ✅ ✅ ✅ ✅ ❌ ❌ ❌ ✅ ✅ ✅ ✅
Context compaction ✅ 🟡 🟡 ❌ 🟡 ✅ ✅ ✅ ❌ ✅ ✅ ❌
User-initiated backend swap ✅ ✅ ❌ ✅ ✅ ❌ ❌ ❌ ❌ ✅ ❌ ✅
Agent-initiated backend swap ✅ ❌ 🟡 ❌ ❌ ❌ ❌ ❌ ❌ ❌ 🟡 ❌
Agent self-mutation ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ 🟡 ❌ 🟡
Context hot-swap ✅ 🟡 🟡 🟡 🟡 ❌ ❌ ❌ 🟡 ✅ ✅ ❌
Recursive agent spawn ✅ ❌ ✅ 🟡 ❌ 🟡 🟡 ❌ ✅ 🟡 ✅ ✅
Multi-agent (fully detached) ✅ ❌ ✅ ✅ ❌ 🟡 🟡 ❌ ✅ 🟡 ✅ 🟡
GitHub stars (May 2026) -- 44.4k 135.8k 368.6k 61.4k -- 80.1k 103.2k 2.5k 48.6k 1.1k 388

✅ = yes, 🟡 = partial, ❌ = no. Corrections welcome -- open a PR.

How each project works

  • aider -- git-native pair programmer; markdown-diff edits (no structured tool calls), litellm transport, destructive mid-session /model swap, tree-sitter repo map, no multi-agent.
  • LangChain/LangGraph -- broad LLM-app framework; everything is possible but application-defined, not an opinionated agent loop.
  • OpenClaw -- TypeScript multi-platform personal assistant; multi-agent but end-user-oriented, no Python library.
  • Cline -- VS Code extension; multi-provider, single-agent, truncation-based context, not importable.
  • Claude Code (Anthropic) -- Anthropic-only vendor CLI; recursive sub-agents and compaction, but no provider swap and no Python library (JS SDK).
  • Codex CLI (OpenAI) -- OpenAI-only Rust CLI; sandboxed local execution, single-agent, no compaction, no API.
  • Gemini CLI (Google) -- Google-only TypeScript CLI; summarization compaction, single-agent, no API, no custom tools.
  • Flue (Astro) -- headless TypeScript harness; pluggable sandboxes, recursive session.task() delegation, model chosen per call (no agent-initiated swap), no UI/compaction.
  • Pi (earendil-works/pi) -- minimal TypeScript harness; branchable session tree, /reload soft self-mutation, sub-agents opt-in only.
  • npcsh -- Python agentic shell; filesystem-defined NPC personas, many built-in modes, hub-and-spoke sub-agents, rate-limit-fallback "compaction".
  • Attractor (StrongDM) -- a spec, not an implementation; DOT-graph pipeline where nodes are AI tasks and the graph is the workflow.

Name

sagent (noun, neologism) SAY-jent /ˈseɪ.dʒənt/

From sage + agent.

An AI assistant that confidently performs a task you didn't ask for while ignoring the one you did.

"I asked the sagent to fix one failing test -- it deleted the test and reported all green."

Contributing

See CONTRIBUTING.md for local validation and public contribution flow.

See also

Sibling projects in the rekursiv-ai family:

  • trackinizer — Centralized agent database for tracking inquiries, work, and the evidence behind conclusions.
  • wesearch — Web search, resilient page fetch, and scholarly-paper lookup without a browser stack.
  • madcatter — Rich-based Markdown renderer for the terminal; ships the mdcat CLI.
  • priml — Composable PyTorch building blocks: models, optimizers, losses, and a step-based training loop.
  • configgle — Hierarchical experiment configuration in typed pure-Python dataclasses instead of YAML.
  • copybarista — Bidirectional source sync for publishing OSS-ready trees from a monorepo.

Citing

If you find our work useful, please consider citing:

@misc{rekursivai2026sagent,
      title={Sagent - A coding-agent CLI and strongly-typed Python library -- self-mutating, hot-swapping, multi-provider, with async tool calls and bidirectional recursive spawn.},
      author={Joshua V. Dillon and Dan Kondratyuk},
      year={2026},
      howpublished={Github},
      url={https://github.com/rekursiv-ai/sagent},
}

Metadata

Release files for sagent 0.2.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 sagent 0.2.1
File Size Uploaded Provenance Actions
sagent-0.2.1.tar.gz 1.5 MB With provenance Details for sagent-0.2.1.tar.gz

Built distribution (wheel)

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

Total release size: 2.2 MB

Release files / sagent-0.2.1.tar.gz

Download URL sagent-0.2.1.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
7b8dcc9c6c18329417720cd14378fe1e50f88dd026542ab24525dd76feceeba0
BLAKE2b-256 checksum
How to use checksums
de2af1136056d22848976507032b776d2b31166ed1a9b18c1b7ce57b91ef8931
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 31, 2026.

Transparency log

Release files / sagent-0.2.1-py3-none-any.whl

Download URL sagent-0.2.1-py3-none-any.whl
Size 606.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1f905f3076215e0a1a31920ec02fc95bff9e0ddb9acceb5eb40b50bd1e02b455
BLAKE2b-256 checksum
How to use checksums
f0ffcc6a5b6f35e88de3cdfd1fa2447b0a5cfdfb1cc3609cda01c9f0c35f9bb4
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 31, 2026.

Transparency log

Security for sagent 0.2.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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for sagent-0.2.1.tar.gz

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 31, 2026.

Transparency log

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