Configuration Guide
Curator config controls task discovery and task generation: which repositories
to collect from, how PRs are filtered, which LLM endpoint is used, and how many
verified tasks each language should produce. Most runs only need a few
runtime_info.input fields. Leave meta_info, repository pins, environment
paths, and output declarations alone unless you are changing the block contract
itself.
Common fields
| Area | Edit when | Main fields |
|---|---|---|
| PR collection | You want to change languages, collection scale, or repository/PR filters. | pr_collection.languages, repo_num, max_prs_per_repo, filters |
| LLM endpoint | You want Curator to call a different PR model or Claude Code proxy. | llm_api.api_key, api_base_url, pr_model, task_model |
| GitHub tokens | You want faster or more stable PR collection. | github_token TXT path, GITHUB_TOKENS |
| Language generation | You want to enable languages or change generation caps. | languages.<lang>.enabled, n_concurrent, max_verified_tasks |
| Remote machine | You want Curator to run on another server instead of the current host. | meta_info.resources.ip, user, pwd, directory |
| Tracer handoff | You need Tracer to consume verified tasks from Curator. | output.merged_tasks_dir, dependencies.to.merged_tasks_dir |
An example reference
Start with a modest PR collection target, one private LLM endpoint, and a small per-language task cap. This gives you a practical first run without asking Curator to exhaust every collected candidate.
runtime_info: input: pr_collection: enabled: true languages: [python, javascript, typescript] repo_num: 10 max_prs_per_repo: 20 output_dir: artifacts/collected_prs token_limit: 32 filters: min_stars: 30 min_merged_prs: 5 max_files_changed: 25 max_lines_changed: 1500 llm_api: api_key: <YOUR_API_KEY> api_base_url: https://your-openai-compatible-endpoint/v1 pr_model: Qwen3.6-35B-A3B task_model: claude-sonnet-4-6 cc_provider_mode: openai_proxy anthropic_base_url: http://127.0.0.1:4010 cc_proxy_port: 4010 github_token: scripts/gh_token.txt languages: py: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 4, max_verified_tasks: 10 } } js: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 4, max_verified_tasks: 10 } } ts: { enabled: true, params: { timeout: 3600, cc_timeout: 3000, n_concurrent: 4, max_verified_tasks: 10 } }Use /curator:check after editing. It checks token access, model endpoint
settings, repository pins, language configuration, and the local environment
before /curator:collect-prs or /curator:create-tasks starts real work.
Configuration breakdown
Remote execution
Curator runs locally by default. If you want the block skill to log into a
remote CPU/Docker server and run the task collection or creation workflow there,
fill meta_info.resources. Use local when the block should run on the current
machine.
meta_info: resources: ip: 203.0.113.12 # local = current machine; otherwise SSH target user: ubuntu # SSH user for the remote server pwd: null # prefer SSH keys or your private secret channel directory: /home/ubuntu/LegoFlow/blocks/curator public_storage: nullThe remote directory should already contain the repository checkout, or be the
place where your setup workflow will prepare it. Keep secrets out of tracked
config.yaml; use your SSH agent, key files, or ignored private config for
credentials.
PR collection
Curator first collects candidate PRs from GitHub. The languages list controls
which ecosystems are searched, while the filters control how strict the
repository and PR selection should be.
runtime_info: input: pr_collection: enabled: true languages: [c, cpp, go, java, javascript, typescript, python, rust] repo_num: 100 max_prs_per_repo: 50 output_dir: artifacts/collected_prs token_limit: 32 filters: min_stars: 30 min_merged_prs: 5 max_files_changed: 25 max_lines_changed: 1500For a quick check, reduce repo_num, max_prs_per_repo, and the language list.
For production, keep broad language coverage and prepare multiple GitHub tokens
so collection does not stall on rate limits.
LLM and Claude Code Proxy
Curator uses one model for PR analysis and instruction generation, then uses
Claude Code for task creation. Keep tracked config.yaml free of real keys and
private endpoints; put those values in environment variables or a private local
profile.
runtime_info: input: llm_api: api_key: <YOUR_API_KEY> api_base_url: https://your-openai-compatible-endpoint/v1 pr_model: Qwen3.6-35B-A3B task_model: claude-sonnet-4-6 cc_provider_mode: openai_proxy anthropic_base_url: http://127.0.0.1:4010 cc_proxy_port: 4010Use cc_provider_mode: openai_proxy when Claude Code should call your
OpenAI-compatible gateway through the local proxy. Use native only when you
are intentionally using Anthropic-compatible credentials directly.
Language generation
After PR collection, Curator generates and validates tasks per language. Each language has its own timeout, Claude Code timeout, concurrency, and verified task cap.
runtime_info: input: languages: py: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 24, max_verified_tasks: 256 } } js: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 16, max_verified_tasks: 128 } } rust: { enabled: true, params: { timeout: 3600, cc_timeout: 3000, n_concurrent: 16, max_verified_tasks: 128 } }Use small caps like 10 for a first run. Use "all" only when you are ready to
consume all collected candidates for that language.
Handoff with neighboring blocks
Curator has no upstream task source. Its main downstream handoff is the merged verified task directory that Tracer reads in local mode.
Produce Tracer tasks
merged_tasks_dir is the flattened task directory produced from all verified
per-language outputs. Tracer reads this path through task_source.dataset_name.
meta_info: dependencies: to: merged_tasks_dir: to: tracer.input.task_source.dataset_name when: {tracer.input.task_source.provider: local}runtime_info: output: merged_tasks_dir: path: artifacts/merged_swe_tasks extract_command: python scripts/extract_verified_tasks.pyAfter task creation, make sure artifacts/merged_swe_tasks exists before moving
to Tracer.
Field reference
| Field | Required? | Default | When to change |
|---|---|---|---|
pr_collection.enabled | Yes | true | Disable only when you already have collected PR inputs. |
pr_collection.languages | Yes | 8 languages | Narrow for debugging; expand for production coverage. |
pr_collection.repo_num | Yes | 100 | Lower for smoke runs; raise for larger data collection. |
pr_collection.max_prs_per_repo | Yes | 50 | Lower when collection is too broad or expensive. |
pr_collection.filters.* | Yes | Quality filters | Tune difficulty, recency, repo quality, and PR size. |
llm_api.api_key | Yes | human | Put the real key in env/private config. Never commit it. |
llm_api.api_base_url | Yes | human | Point Curator at your OpenAI-compatible endpoint. |
llm_api.pr_model | Yes | Qwen3.6-35B-A3B | Change the model used for PR filtering and instruction work. |
llm_api.task_model | Yes | claude-sonnet-4-6 | Change the Claude Code-visible model alias for task creation. |
llm_api.cc_proxy_port | Yes | 4010 | Change only if the local proxy port is occupied. |
github_token | No | "" | TXT path relative to the Curator block; token env vars override it. |
languages.<lang>.enabled | Yes | true | Toggle a language for the current run. |
languages.<lang>.params.n_concurrent | Yes | language-specific | Tune for API rate limits and machine capacity. |
languages.<lang>.params.max_verified_tasks | Yes | language-specific | Lower for smoke runs; raise or use "all" for production. |
meta_info.resources.ip | No | local | Set a host/IP when Curator should run on a remote server. |
meta_info.resources.user | For remote | null | SSH user for the remote server. |
meta_info.resources.directory | For remote | null | Block working directory on the remote server. |
meta_info.resources.public_storage | No | null | Optional public artifact location for dashboards or sharing. |
Complete config.yaml
Use this as the complete reference after you understand the few fields above.
blocks/curator/config.yaml
meta_info: name: curator label: "Curator" description: Converts GitHub PRs into verified SWE-Bench tasks across 8 programming languages (Python, JavaScript, TypeScript, Go, C, C++, Java, Rust). parent: legoflow blocks: {} dependencies: from: {} # task source block; no upstream to: merged_tasks_dir: to: tracer.input.task_source.dataset_name when: {tracer.input.task_source.provider: local} repos: legoflow-curator: name: legoflow-curator commit_id: 53faa328fcfc000c258e0d4b47dd609a887fc23a role: core pipeline - CLI, task generation, validation, scoring environment: venv_name: legoflow-curator-env venv_path: artifacts/envs/legoflow-curator-env requirements: repos/legoflow-curator/pyproject.toml python_version: "3.12+" description: Virtual environment for legoflow-curator CLI and dependencies resources: ip: local # CPU-only; runs on any node with Docker available # user / pwd / directory apply only when ip is a remote IP (SSH target). # They are ignored for local execution — the block runs from its own dir. user: null pwd: null directory: null description: CPU node with Docker; runs locally by default. public_storage: nullruntime_info: input: pr_collection: enabled: true languages: [c, cpp, go, java, javascript, typescript, python, rust] repo_num: 100 # repos WITH qualifying PRs per language max_prs_per_repo: 50 output_dir: artifacts/collected_prs token_limit: 32 # first N combined file + env tokens (0 = all) filters: min_stars: 30 min_merged_prs: 5 min_language_percentage: 0.4 max_days_since_push: 1095 min_issue_body_length: 10 min_files_changed: 1 max_files_changed: 25 max_lines_changed: 1500 # Private values are read from environment variables when possible: # OPENAI_API_KEY / ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN # OPENAI_API_BASE_URL / ANTHROPIC_BASE_URL # Keep tracked config.yaml free of real keys and private endpoints. llm_api: api_key: human # never commit a real key; prefer env/.env api_base_url: human # OpenAI-compatible endpoint (PR eval + instruction gen) pr_model: Qwen3.6-35B-A3B # model for PR filtering/instruction generation task_model: claude-sonnet-4-6 # Claude Code-visible alias for task creation cc_provider_mode: openai_proxy # native | openai_proxy anthropic_base_url: http://127.0.0.1:4010 cc_proxy_port: 4010 github_token: "" # supplied via GITHUB_TOKENS/GITHUB_TOKEN or gh_token.txt; never commit a token # max_verified_tasks: N = stop after N verified tasks; "all" = no cap, consume all collected PRs. languages: py: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 24, max_verified_tasks: 256 } } js: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 16, max_verified_tasks: 128 } } ts: { enabled: true, params: { timeout: 3600, cc_timeout: 3000, n_concurrent: 16, max_verified_tasks: 128 } } go: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 16, max_verified_tasks: 128 } } c: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 16, max_verified_tasks: 128 } } cpp: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 16, max_verified_tasks: 128 } } java: { enabled: true, params: { timeout: 3200, cc_timeout: 2400, n_concurrent: 16, max_verified_tasks: 128 } } rust: { enabled: true, params: { timeout: 3600, cc_timeout: 3000, n_concurrent: 16, max_verified_tasks: 128 } } output: swe_tasks_dir: path: artifacts/swe_tasks description: Per-language task directories ({lang}-cc/), each with verifiable_tasks.txt listing verified task IDs structure: "artifacts/swe_tasks/{lang}-cc/{task_id}/ with instruction.md, environment/, solution/, tests/" merged_tasks_dir: path: artifacts/merged_swe_tasks description: Optional flattened directory containing all verified tasks from all languages (populated by scripts/extract_verified_tasks.py) structure: "artifacts/merged_swe_tasks/{task_id}/ with instruction.md, environment/, solution/, tests/" extract_command: python scripts/extract_verified_tasks.py logs: path: artifacts/logs/legoflow-curator-create description: "Per-language create logs: cc_<lang>_March.txt"