Loading repository data…
Loading repository data…
he-yufeng / repository
AI coding agent in your terminal. Works with any LLM - DeepSeek, Qwen, GPT-5, Claude, Gemini, Kimi, Ollama. 100+ models via litellm. ~1300 lines of Python.
Quick Start · Models · Tools · 中文
DeepSeek, Qwen, GPT-5, Claude, Gemini, Kimi, GLM, Ollama local models - pick your favorite and start coding.
$ anycoder -m deepseek
> read main.py and fix the broken import
Reading main.py
╭──────────────────────────────────────╮
│ [6 lines total] │
│ 1 from utils import halper │
│ ... │
╰──────────────────────────────────────╯
Editing main.py
╭──────────────────────────────────────╮
│ Edited main.py │
│ --- a/main.py │
│ +++ b/main.py │
│ @@ -1 +1 @@ │
│ -from utils import halper │
│ +from utils import helper │
╰──────────────────────────────────────╯
Fixed: halper → helper.
deepseek-chat | tokens: 1,247 | cost: $0.0004
Claude Code is the best AI coding tool out there, but it only works with Anthropic's API. Want to use DeepSeek (cheap and fast)? Qwen (great for Chinese devs)? A local model via Ollama? You're out of luck.
AnyCoder gives you the same experience - file editing, shell commands, codebase search, context management - with whatever LLM you want.
What it does:
rm -rf /, fork bombs, curl | bash, etc./save and --resume.env support - drop a .env in your project root and gopip install anycoder
# Set your API key (pick one)
export DEEPSEEK_API_KEY=sk-... # DeepSeek (default)
export OPENAI_API_KEY=sk-... # OpenAI
export ANTHROPIC_API_KEY=sk-... # Claude
export GEMINI_API_KEY=... # Gemini
# Use DeepSeek (default, cheap and fast)
anycoder
# Use Kimi K2.5
anycoder -m kimi
# Use Claude Sonnet 4.6
anycoder -m claude
# Use GPT-5.4
anycoder -m gpt5
# Use Qwen
anycoder -m qwen
# Use local Ollama, data never leaves your machine
anycoder -m ollama/qwen3:32b
# One-shot mode
anycoder "add error handling to the login function in auth.py"
anycoder -p "find all TODO comments and list them"
# Resume a saved session
anycoder --resume session_1712345678
Or use a .env file in your project root:
# .env
DEEPSEEK_API_KEY=sk-...
ANYCODER_MODEL=deepseek
Use short aliases or full litellm model names:
| Alias | Model | Provider |
|---|---|---|
deepseek | DeepSeek Chat (V3) | DeepSeek |
deepseek-r1 | DeepSeek Reasoner (R1) | DeepSeek |
gpt5 / gpt-5 | GPT-5.4 | OpenAI |
gpt4o | GPT-4o | OpenAI |
o4-mini | o4-mini | OpenAI |
claude | Claude Sonnet 4.6 | Anthropic |
claude-opus | Claude Opus 4.6 | Anthropic |
claude-haiku | Claude Haiku 4.5 | Anthropic |
gemini | Gemini 2.5 Flash | |
gemini-pro | Gemini 2.5 Pro | |
qwen | Qwen Plus | Alibaba |
qwen-max | Qwen Max | Alibaba |
kimi | Kimi K2.5 | Moonshot AI |
glm | GLM-4 Plus | Zhipu AI |
ollama serve
anycoder -m ollama/llama3.1
anycoder -m ollama/codestral
anycoder -m ollama/qwen3:32b
export ANYCODER_API_BASE=https://your-api.com/v1
export ANYCODER_API_KEY=your-key
anycoder -m your-model-name
AnyCoder has 6 built-in tools that the LLM calls automatically:
| Tool | What it does |
|---|---|
bash | Run shell commands with dangerous command blocking and cd tracking |
read_file | Read files with line numbers, offset/limit for large files |
write_file | Create new files or overwrite existing ones |
edit_file | Search-and-replace edits with uniqueness checking and diff output |
glob | Find files by pattern (**/*.py, src/**/*.ts) |
grep | Search file contents with regex |
You describe what you want in natural language. The agent decides which tools to use.
| Command | Description |
|---|---|
/model | Show current model |
/model <name> | Switch model mid-conversation |
/models | List all model aliases |
/tokens | Token usage and estimated cost |
/diff | Files modified this session |
/compact | Manually compress context |
/save [name] | Save session to disk (names are sanitized before they become filenames) |
/sessions | List saved sessions |
/clear | Clear conversation history |
/help | Show all commands |
/quit | Exit |
Input: Enter to send, Esc+Enter for newline (multiline input), Ctrl+C to cancel, Ctrl+D to exit.
~1,450 lines total. Here's how it's organized:
anycoder/
├── cli.py REPL + slash commands 258 lines
├── llm.py litellm streaming wrapper 184 lines
├── agent.py Agent loop + parallel tools 179 lines
├── context.py Two-phase compression 92 lines
├── config.py Env + .env + model aliases 86 lines
├── session.py Save/resume sessions 60 lines
├── prompts/system.py System prompt generation 50 lines
└── tools/
├── bash.py Shell + safety + cd tracking 114 lines
├── edit_file.py Search-replace + diff output 98 lines
├── grep_tool.py Regex search + skip binary 111 lines
├── read_file.py File reading + binary detect 70 lines
├── glob_tool.py File pattern search 48 lines
└── write_file.py File writing + tracking 39 lines
How the agent loop works:
Two-phase compression (inspired by Claude Code):
Environment variables or .env file:
| Variable | Description | Default |
|---|---|---|
ANYCODER_MODEL | Default model | deepseek/deepseek-chat |
ANYCODER_API_BASE | Custom API base URL | - |
ANYCODER_API_KEY | API key | - |
DEEPSEEK_API_KEY | DeepSeek API key | - |
OPENAI_API_KEY | OpenAI API key | - |
ANTHROPIC_API_KEY | Anthropic API key | - |
GEMINI_API_KEY | Google AI API key | - |
from anycoder import Agent, Config
config = Config(model="deepseek/deepseek-chat", api_key="sk-...")
agent = Agent(config)
agent.run("find all TODO comments in this project")
| Feature | Claude Code | Cline | Aider | AnyCoder |
|---|---|---|---|---|
| LLM support | Claude only | Multi | Multi | 100+ via litellm |
| Language | TypeScript (closed) | TypeScript | Python | Python (MIT) |
| Install | npm | VS Code ext | pip | pip |
| File editing | Search & replace | Diff | Diff | Search & replace |
| Context compression | Yes | No | Yes | Yes (two-phase) |
| Streaming | Yes | Yes | Yes | Yes |
| Session persistence | Yes | No | Yes | Yes |
| Code size | 512K lines | 100K+ | 50K+ | ~1,450 lines |
| Best for | Using it | Using it | Using it | Using it AND reading the source |
The point of AnyCoder is that the whole agent fits in your head, so the roadmap is about reach, not heft. Anything added has to stay readable in ~1,500 lines.
If a feature can't be added without making the source hard to read end to end, it doesn't belong here. That's the whole pitch.
git clone https://github.com/he-yufeng/AnyCoder.git
cd AnyCoder
pip install -e ".[dev]"
pytest tests/ -v
AnyCoder is one of my coding-agent projects. A few others worth a look:
MIT. Use it, fork it, build something better.
Built by Yufeng He · Agentic AI Researcher @ Moonshot AI (Kimi)