---
license: agpl-3.0
language:
- en
base_model:
- Qwen/Qwen3-Coder-30B-A3B-Instruct
---
# Coding agent
A simple coding agent built with Qwen_Distilled_Coder (via OpenRouter) that can view/edit files and execute bash commands—all in ~200 lines.
```mermaid
flowchart TD
Start([Start]) --> UserInput[Get User Input]
UserInput --> Qwen_Distilled_Coder[Send to Qwen_Distilled_Coder]
Qwen_Distilled_Coder --> NeedsTools{Needs Tools?}
NeedsTools -->|No| ShowResponse[Show Response]
NeedsTools -->|Yes| ExecuteTools[Execute Tools]
ExecuteTools --> SendResults[Send Results to Qwen_Distilled_Coder]
SendResults --> Qwen_Distilled_Coder
ShowResponse --> UserInput
ExecuteTools -.-> Tools
```
## Quick start
1. **Create virtual environment and install dependencies**:
```bash
# Option 1: uv installed
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv sync
# Option 2: Without uv
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip3 install uv
uv sync
```
2. **Setup environment & add API key**:
```bash
cp .env.example .env
```
Be sure to add your OpenRouter API key! You can get one from [OpenRouter](https://openrouter.ai/keys).
3. **Run the CLI agent**:
```bash
uv run simple_agent.py
```
Note: `uv` and an appropriate virtualenv are prerequisites—our agent will use uv to execute Python scripts
## Using OpenRouter with Qwen Distilled Coder
This agent uses the [OpenRouter](https://openrouter.ai/) API to access the Qwen_Distilled_Coder model. OpenRouter provides a unified API for accessing various AI models, including those from Anthropic, OpenAI, and others.
To use this agent:
1. Sign up for an account at [OpenRouter](https://openrouter.ai/)
2. Create an API key at [OpenRouter Keys](https://openrouter.ai/keys)
3. Add your API key to the `.env` file
4. Run the agent with `uv run simple_agent.py`
The agent uses the OpenAI client library but points it to the OpenRouter API endpoint, allowing it to access the Qwen_Distilled_Coder model.
## What it does
- **Fix broken files**: `"can you help me fix broken_file.py?"`
- **Research and implement**: `"research new Python 3.13 features and write a file that demonstrates a simple example"`
- **Create new code**: `"write a simple tip splitting calculator Python file"`
## Architecture
The agent follows a straightforward pattern with three core components:
### Prompt structure
```xml
You are an expert software engineering assistant...
Before taking any action, think through the problem step by step...
When working with code:
1. Understanding First: Always examine existing files...
2. Targeted Changes: Use precise `str_replace` operations...
```
**Best practices:**
- Split system prompt (role) from user instructions for better caching
- Use XML tags for structured prompts and interpretability
- Include chain-of-thought reasoning with `` blocks
- Cache tools, system prompt, and first user message for cost optimization
### Tool execution router
```python
def execute_tool(tool_name: str, tool_input: dict) -> dict:
"""Execute a tool and return structured result with error handling."""
try:
if tool_name == "view":
# Handle file/directory viewing
elif tool_name == "str_replace":
# Handle targeted file edits
elif tool_name == "bash":
# Handle command execution with timeout
# ...
except Exception as e:
return {"content": f"Error: {str(e)}", "is_error": True}
```
**Best practices:**
- Return structured responses with `is_error` flag for Qwen_Distilled_Coder
- Use proper timeout protection (30s default for bash)
- Include detailed error logging and handling
- Support both file operations and bash commands
### Agent loop
```python
while True:
response = client.messages.create(
model=ANTHROPIC_MODEL,
system=[{"type": "text", "text": system_prompt}],
messages=messages,
tools=ANTHROPIC_TOOLS,
)
if response.stop_reason == "tool_use":
# Execute tools in parallel when possible
# Return results to Qwen_Distilled_Coder for continued processing
else:
# Handle final response
break
```
**Best practices:**
- Handle all stop reasons robustly (tool_use, end_turn, etc.)
- Execute multiple tools in parallel when possible
- Maintain conversation state through message history
- Use low temperature (0.2) for consistent, focused responses
## Files
- `simple_agent.py` - CLI version
- `prompt.md` - System prompt and instructions
## Requirements
- Python 3.13+
- OpenRouter API key