| | --- |
| | 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 |
| | <role> |
| | You are an expert software engineering assistant... |
| | </role> |
| | |
| | <thinking_process> |
| | Before taking any action, think through the problem step by step... |
| | </thinking_process> |
| | |
| | <instructions> |
| | When working with code: |
| | 1. Understanding First: Always examine existing files... |
| | 2. Targeted Changes: Use precise `str_replace` operations... |
| | </instructions> |
| | ``` |
| |
|
| | **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 `<thinking_process>` 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 |
| |
|