sagent🪄
A coding-agent CLI and strongly-typed Python library -- self-mutating, hot-swapping, multi-provider, with async tool calls and bidirectional recursive spawn.
Tutorial · Concepts · Providers · Tools · CLI · Sessions · Security · Architecture · API · Streaming · Compaction · Self-hosted · Showcase
Quick Start
uvx sagent
See Install for additional details.
Features
-
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.
-
Hot self-mutation.
- Conversationally change the model / service provider.
- Conversationally have the model edit its own session.
-
Every Provider, every auth.
- Anthropic, OpenAI, Google, Moonshot, DashScope, MiniMax, OpenAI-compatible endpoints, self-hosted HuggingFace models, and a managed
llama.cppserver, all behind one binary. - Subscriptions supported and terms-of-service compliant.
- Anthropic, OpenAI, Google, Moonshot, DashScope, MiniMax, OpenAI-compatible endpoints, self-hosted HuggingFace models, and a managed
-
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 Ncaps the whole tree.
-
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."
-
Recursive agent messaging.
- Any spawned agent can spawn and
AgentSendto 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.
- Any spawned agent can spawn and
-
Richer built-in tools.
- WebSearch/Fetch use headed or headless chrome.
PaperSearch/PaperFetchwalk citation graphs and fetch PDFs.- Multi-backend
WebSearch,WebFetchwith markdown extraction, atomic read/write tracking on file tools.
-
Unix-aligned and pipeable.
stdin,stdout, exit codes, and--output-format jsonare first-class.- Pipe through
jq, drop intoipython(sameprompt_toolkitunderneath).
-
Misaligned Bash tool calls are auto promoted to dedicated types.
- Example:
ls files/is auto-promoted toList(files/)tool call.
- Example:
-
Universal session format.
- Convert claude/codex sessions to from sagent format and vice versa.
-
All spawns' sessions (ancestors and/or descendants) can be focused.
-
Send a message to parent to autocreate an autopiloting agent.
-
Apache 2 license.
Uniquely also an API
-
One runtime, every surface.
- The same
Agentclass powers the CLI, your application code, and recursive sub-agents.
- The same
-
Typed Python objects.
Agent,Tool,Model,Provider, andMessageare protocols and dataclasses you import, compose, and unit-test.- Passes strict:
basedpyright,pyrefly, andty.
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
/modelswap, 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,
/reloadsoft 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
mdcatCLI. - 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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.