mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-04-28 11:41:04 +00:00
Add optional branch configuration to specify which git branch to use for worktree creation. Features: - New branch config option to specify base branch (e.g., main, develop) - Each worktree creates a unique branch based on the specified branch (format: branch-run-id) - If branch is not specified, uses the repository default branch - Falls back gracefully when branch already exists Changes: - Add branch field to RunConfig dataclass - Update GitWorktreeManager.create() to accept branch parameter - Create unique branches for each worktree to avoid conflicts - Update load_config() to parse branch from config - Update config.example.json with branch option - Update README.md documentation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
139 lines
3.9 KiB
Markdown
139 lines
3.9 KiB
Markdown
# Qwen Concurrent Runner
|
||
|
||
A Python tool for executing multiple Qwen CLI tasks across different models concurrently using isolated git worktrees.
|
||
|
||
## Overview
|
||
|
||
This tool enables you to:
|
||
|
||
- Run multiple tasks against multiple models in parallel
|
||
- Create isolated git worktrees for each execution
|
||
- Track execution status in real-time
|
||
- Capture and store all outputs (stdout, stderr, and OpenAI logs)
|
||
- Resume or analyze results after completion
|
||
|
||
## Installation
|
||
|
||
```bash
|
||
# Install dependencies
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
## Usage
|
||
|
||
```bash
|
||
python runner.py config.json
|
||
```
|
||
|
||
## Configuration
|
||
|
||
Create a JSON configuration file (see `config.example.json`):
|
||
|
||
```json
|
||
{
|
||
"concurrency": 3,
|
||
"yolo": true,
|
||
"source_repo": ".",
|
||
"worktree_base": "~/.qwen/worktrees",
|
||
"outputs_dir": "./outputs",
|
||
"results_file": "./results.json",
|
||
"tasks": [
|
||
{
|
||
"id": "code-review",
|
||
"name": "Security Code Review",
|
||
"prompts": ["Review the codebase for security vulnerabilities."]
|
||
}
|
||
],
|
||
"models": ["claude-3-5-sonnet-20241022", "qwen3-coder-plus"]
|
||
}
|
||
```
|
||
|
||
### Configuration Options
|
||
|
||
| Option | Type | Default | Description |
|
||
| --------------- | ------ | ----------------- | --------------------------------------------- |
|
||
| `concurrency` | int | 4 | Maximum parallel executions |
|
||
| `yolo` | bool | true | Auto-approve all actions |
|
||
| `source_repo` | string | . | Source git repository path |
|
||
| `branch` | string | null | Git branch to checkout (uses default if null) |
|
||
| `worktree_base` | string | ~/.qwen/worktrees | Base directory for git worktrees |
|
||
| `outputs_dir` | string | ./outputs | Directory for captured output |
|
||
| `results_file` | string | ./results.json | JSON file for run tracking |
|
||
| `tasks` | array | [] | List of task definitions |
|
||
| `models` | array | [] | List of model identifiers |
|
||
|
||
### Task Definition
|
||
|
||
Each task has:
|
||
|
||
- `id`: Unique identifier
|
||
- `name`: Human-readable name
|
||
- `prompts`: Array of prompt strings (joined with newlines)
|
||
|
||
## Output Structure
|
||
|
||
Each run creates an isolated output directory:
|
||
|
||
```
|
||
outputs/
|
||
├── {run_id}/
|
||
│ ├── stdout.txt # CLI stdout
|
||
│ ├── stderr.txt # CLI stderr
|
||
│ └── logs/ # OpenAI API logs
|
||
│ └── openai-*.json
|
||
```
|
||
|
||
## results.json
|
||
|
||
```json
|
||
{
|
||
"updated_at": "2026-01-28T10:30:00",
|
||
"runs": [
|
||
{
|
||
"run_id": "abc123",
|
||
"task_id": "code-review",
|
||
"task_name": "Security Code Review",
|
||
"model": "qwen3-coder-plus",
|
||
"status": "succeeded",
|
||
"worktree_path": "~/.qwen/worktrees/run-abc123",
|
||
"output_dir": "outputs/abc123",
|
||
"logs_dir": "outputs/abc123/logs",
|
||
"started_at": "2026-01-28T10:00:00",
|
||
"ended_at": "2026-01-28T10:05:00",
|
||
"exit_code": 0,
|
||
"stdout_file": "outputs/abc123/stdout.txt",
|
||
"stderr_file": "outputs/abc123/stderr.txt"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## Execution Flow
|
||
|
||
1. **Generate Matrix**: Create N×M run combinations (tasks × models)
|
||
2. **Create Worktree**: Git worktree add from source repo
|
||
3. **Initialize**: npm install && npm run build
|
||
4. **Execute**: Run qwen CLI with captured output (logs go to run-specific folder)
|
||
5. **Cleanup**: Remove git worktree (always executed)
|
||
|
||
## Status Values
|
||
|
||
- `queued`: Waiting to start
|
||
- `preparing`: Creating git worktree
|
||
- `initializing`: Running npm install + build
|
||
- `running`: Executing qwen CLI
|
||
- `succeeded`: Completed successfully
|
||
- `failed`: Error occurred
|
||
|
||
## Requirements
|
||
|
||
- Python 3.10+
|
||
- Git repository (for worktree operations)
|
||
- Node.js and npm (for build step)
|
||
- `qwen` CLI in PATH
|
||
|
||
## Exit Codes
|
||
|
||
- 0: All runs succeeded
|
||
- 1: One or more runs failed
|
||
- 130: Interrupted by user (Ctrl+C)
|