agent7
The simplest coding agent. ~1800 lines of Python, four tools, one loop.
A deliberately minimal harness — all-in on modern, carefully chosen model providers. Fast and precise. No seatbelt; hold on.
No orchestration: no plan mode, no subagents, no parallel tasks, no background jobs. You give it one sentence; it reads files, edits files, runs commands, then stops. Built for people who work on one thing at a time — you hold one task in your head, and so does it.
Features
- Deliberately minimal harness — four tools, one loop, no orchestration
- Complete CLI agent UX — streaming thinking + answer, tool lines with ✓/✗, edit/write preview, vi-mode REPL,
@pathcompletion, session resume - Slash commands —
/help/model/status/login/logout/compact - Markdown rendering — final replies rendered as Rich Markdown in the terminal, thanks rich.
- Paged final replies — interactive answers open in your system pager (usually
less); use the arrow keys/Space to scroll andqto continue. The rendered reply stays in the terminal after you quit. Redirected output is never paged. - Provider login — paste an API key for DeepSeek, Grok, or Kimi (
/loginor env); switch models in-session
Install
pip install agent7
# or: uv tool install agent7
# or from source: uv sync && uv run agent7
Auth
Paste an API key; there is no OAuth. Keys are stored in ~/.config/agent7/auth.json.
export DEEPSEEK_API_KEY=sk-... # or /login deepseek
export XAI_API_KEY=xai-... # Grok, from console.x.ai (or /login grok)
export KIMI_API_KEY=sk-... # Kimi Code, from the Kimi Code Console (or /login kimi)
# export AGENT7_MODEL=grok-4
You can also log in from inside the REPL:
/login deepseek
/login grok # xAI — Grok models
/login kimi # Kimi Code — kimi-for-coding and other available models
/model # list models for every logged-in provider
/model deepseek-flash
/model grok-4
/model kimi-for-coding
Usage
uv run agent7 "create hello.py that prints hi" # one-shot
uv run agent7 # new REPL session
uv run agent7 -r # resume this cwd's session
uv run agent7 -r "continue" # resume + one-shot
Each workspace keeps a single snapshot — starting without -r replaces it.
Sessions are saved automatically after tasks, commands, interruptions, and exit.
Snapshots contain resumable model context, not a separate full transcript; compaction is reflected
in the saved context. Files live in ${XDG_STATE_HOME:-~/.local/state}/agent7/sessions/ and do not
store API keys. Hard process kills can lose the in-progress turn.
REPL commands: /help /model /status /login /logout /compact.
Exit with Ctrl-D (or Ctrl-Z on Windows). Ctrl-C discards the current input or interrupts
the running turn, then returns to the prompt instead of exiting the REPL.
Reasoning models (DeepSeek, Grok, Kimi) stream their reasoning_content live: it shows up
dimmed under a thinking header, before the answer and above each tool line. It is
display only — reasoning is never replayed into the prompt or the saved session.
Type @ in the REPL to recursively complete files and directories from the cwd:
fix @agent7/agent.py.
Tab accepts, directories keep going (@agent7/ → @agent7/session.py), and spaces
are escaped (@my\ file.txt), so the path the model sees is the path it can read.
--cwd sets the working directory. --max-turns caps the loop at 200 model rounds
per task — high enough that ordinary work never hits it, low enough to stop a runaway.
The current model round and its tool calls finish before the run pauses. When it runs out,
a yellow notice explains that the task may be unfinished and how to recover. The session is
preserved: type continue in the REPL, run agent7 -r "continue" for a one-shot, or use
agent7 --max-turns 500 -r "continue" to resume with a higher cap. Reaching the cap never
silently starts a new session or extends the same run indefinitely.
The cap is per run, not per session: -r never pins you to the --max-turns an
already-saved session was created with. Precedence is --max-turns > $AGENT7_MAX_TURNS
A run that ends with no visible text never ends silently: you get either
# (stopped after N turns), # no text in the reply … or # … hit the output token limit ….
Tools
| Tool | What it does | Output budget |
|---|---|---|
read |
Read a file with line numbers | 200 lines per call by default; page with offset= |
write |
Create or overwrite a whole file | +N -M diff stats |
edit |
Precise replacements; one call may include multiple edits[] against the original file (no overlaps) |
+N -M diff stats |
bash |
Host shell in the cwd (bash / PowerShell / cmd) | ~12k chars |
That's it. No grep, no list_dir, no todo, no task.
Need more capability? Let the agent use bash.
On startup agent7 picks a shell from sys.platform: Git Bash → PowerShell → cmd on
Windows, bash elsewhere. The choice is written into the system prompt so the model
matches the host. Override with AGENT7_SHELL=bash|powershell|cmd|/path/to/shell.
Tools run serially, one after another — so the log always reads in order and you never get three outputs interleaved. Edits are applied without a confirmation prompt; you just get a one-line diff stat.
Context
At 75% context usage, old tool/assistant text is compacted automatically: the last
3 user turns are kept, or for one-shot tasks the last 4 tool results. /compact
triggers the same compaction manually.
Providers that never report usage are measured by an estimate, so compaction still
kicks in; if the server rejects a request as too long anyway, it compacts harder and
retries that turn once.
AGENT7_CONTEXT_LIMIT overrides the context limit.
When things go wrong
- 429 / 5xx / connection errors are retried up to 3 times (0.5s, 1.5s, 3s) — but
only while nothing has been printed yet, so you never see a reply twice. After that
you get
# error: …and, in the REPL, the prompt comes back instead of the process dying. - Ctrl-C in the middle of a tool batch answers every remaining tool call with
error: interrupted, so the next request is still valid. - Writes are atomic (temp file + rename): an interrupted
write/editleaves the original file untouched, and symlinks keep pointing where they did. - Large outputs are bounded:
readstreams the file and keeps only the window it returns;bashcaptures to temp files and reads back ~12k chars. A 100 MB log costs a few hundred KB of memory, not 300 MB.
What it is not
- Not an orchestrator: no branching, no subagents
- Not a parallel framework: single-threaded, one thing at a time
- Not a background service: work runs only in the foreground
- No sandbox: tools run as you, and
bashcan do anything your account can do
If that kind of "small" is exactly what you want, this is enough. If it's missing the abstraction you had in mind, that omission is probably the point — not an oversight.
Metadata
Release files for agent7 0.1.6
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 |
|---|---|---|---|---|
| agent7-0.1.6.tar.gz | 26.5 kB | With provenance | Details for agent7-0.1.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| agent7-0.1.6-py3-none-any.whl | Python 3 | none | any | Details for agent7-0.1.6-py3-none-any.whl |
Total release size: 57.0 kB
Release files / agent7-0.1.6.tar.gz
| Download URL | agent7-0.1.6.tar.gz |
|---|---|
| Size | 26.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
58e37a319413c1e7b56c556360a41a21784d24e057d98d0a65c00f6d458004e3
|
|
BLAKE2b-256 checksum How to use checksums |
2726d6cb675a4cd5f87431e5631c4f2334f0f22628d3b84851c310f752c73c79
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 4, 2026.
Transparency logRelease files / agent7-0.1.6-py3-none-any.whl
| Download URL | agent7-0.1.6-py3-none-any.whl |
|---|---|
| Size | 30.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e259894670df2b27b78f58483e4afc8a69a5e3117e2252755832bcdd775c86ea
|
|
BLAKE2b-256 checksum How to use checksums |
9662e1762df467d1ce95f85178f9259c1f0bc0c46e72dab628725e54bfb29b1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 4, 2026.
Transparency logSecurity for agent7 0.1.6
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 agent7-0.1.6.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 Nov 4, 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.