Create Adapter logo

Create Adapter

Organization
evolving-machines-lab
create-adapter

Convert an existing benchmark into a folder of Harbor-format tasks ready for `evolve dataset publish`. Use when the user wants to port, adapt, or import a benchmark (a paper's task set, a repository of problems, a leaderboard's dataset) onto Evolve. Guides the conversion and its verification with evolve check.

Overview

Publisherevolving-machines-lab
Repositoryevolve
Skill namecreate-adapter
Stars
76
Forks
5
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by evolving-machines-lab on GitHub. Read the source before you install it.

Installation

Install the Create Adapter AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/evolving-machines-lab/evolve.git /tmp/evolve
mkdir -p .claude/skills
cp -r /tmp/evolve/skills/create-adapter .claude/skills/create-adapter
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Create Adapter in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Create Adapter on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Create Adapter is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Create Adapter

An adapter is a small program that reads an existing benchmark and writes one task directory per task, in the Harbor task format. Its output is a folder of tasks, ready for evolve dataset publish. This skill guides the conversion; evolve skills get create-task has the task format in full, and evolve skills get publish every publish option.

Authoritative reference

The conversion rules below are Harbor's, from its adapter guide, and Evolve runs the task format unchanged. For the full guide, read https://github.com/laude-institute/harbor/blob/main/docs/content/docs/datasets/adapters.mdx (its steps on parity experiments, the registry and pull requests are Harbor's own process and do not apply here). The task format itself is at https://docs.harborframework.com/core-concepts/tasks/overview.

Do not invent structure, field names, or workflow beyond what the guide specifies.

Prerequisites

  • The evolve CLI: npm install -g @evolvingmachines/evolve (evolve --version succeeds).
  • EVOLVE_API_KEY exported, from the dashboard's API keys page (https://dashboard.evolvingmachines.ai/api-keys); evolve auth status prints who you are.
  • Docker, to build and enter a task's environment locally (optional).
  • The upstream benchmark's repository, cloned.

Workflow

1. Understand the original benchmark

Identify these four components for every task in the benchmark:

ComponentWhat to find
InstructionsHow tasks are described; what information agents receive
EnvironmentsDocker setup, system dependencies, file structures
TestsEvaluation method: deterministic unit tests, LLM-as-a-Judge, etc.
SolutionsOracle/reference solutions; if none exist, whether LLM generation is feasible

Study the benchmark's repository, documentation, and code structure.

Step complete when: you can describe, for each task, the instruction text, environment setup, test/verification method, and reference solution.

2. Gather benchmark context from the user

Collect the following before writing code. If the user has not provided an item, ask before proceeding.

FieldWhy it matters
Adapter nameLowercase, hyphen-separated. Must match the benchmark's common identifier (e.g., swe-bench, aider-polyglot). Becomes the dataset name on Evolve and, with dashes turned to underscores, the Python package name.
Human-readable nameAppears in the README.
Upstream repo URLNeeded for step 1 (benchmark analysis) and for the README.
Reference solutions available?If the benchmark ships reference solutions, use them. If not, they must be written, with LLM help, before the tasks can be checked.
SubsetAdapting a subset of tasks is acceptable (e.g., only a verified split). Document every exclusion in the README.

3. Write the converter

The evolve CLI has no adapter scaffold; create this layout by hand:

<adapter-name>/
├── README.md                  # final documentation (step 6)
├── pyproject.toml             # Python package config
└── src/
    └── <adapter_name>/        # adapter-name with dashes → underscores
        ├── __init__.py
        ├── adapter.py         # main logic: parse benchmark, generate task dirs
        ├── main.py            # CLI entry point
        └── task-template/     # template files copied into each task
            ├── task.toml
            ├── instruction.md
            ├── environment/
            │   └── Dockerfile
            ├── solution/
            │   └── solve.sh
            └── tests/
                └── test.sh

main.py must support --output-dir (where generated tasks are written), --limit, --overwrite, and --task-ids. Run it as uv run python -m <adapter_name>.main --output-dir <path>.

Each generated task directory must contain at minimum task.toml, instruction.md, environment/Dockerfile, solution/solve.sh, and tests/test.sh:

<output-dir>/
└── <task-id>/
    ├── task.toml              # task configuration and metadata
    ├── instruction.md         # task instructions for the agent
    ├── environment/
    │   └── Dockerfile         # container environment definition
    ├── solution/
    │   └── solve.sh           # reference solution script
    └── tests/
        ├── test.sh            # test execution script
        └── test_*.py          # (optional) pytest test files

task.toml: every task must include it. Adjust timeouts to match your benchmark's complexity.

toml
schema_version = "1.4"

[task]
name = "<adapter-name>/<task-id>"
version = "1.0.0"

[metadata]
author_name = "Original benchmark authors' names"
author_email = "benchmark-authors@email.com"
difficulty = "medium"
category = "programming"
tags = ["debugging", "python"]

[agent]
timeout_sec = 1800.0

[verifier]
timeout_sec = 120.0

[environment]
build_timeout_sec = 600.0
cpus = 1
memory_mb = 2048
storage_mb = 10240

For LLM-as-a-Judge verifiers, request the judge credential in [verifier.env]; on Evolve you never put a real key in the task, the credential is supplied at run time (evolve skills get rewardkit has the details):

toml
[verifier.env]
OPENAI_API_KEY = "${OPENAI_API_KEY}"

tests/test.sh: must write a numeric reward (integer or float, 0 to 1) to /logs/verifier/reward.txt, or named numbers to /logs/verifier/reward.json. /logs/verifier/ exists at run time. Use the same metrics as the original benchmark.

bash
#!/bin/bash
pytest /tests/test_*.py
if [ $? -eq 0 ]; then
  echo 1 > /logs/verifier/reward.txt
else
  echo 0 > /logs/verifier/reward.txt
fi

instruction.md: write agent-actionable instructions, not raw benchmark descriptions. Include the goal, constraints, expected output location, and any files the agent should modify. Do not include test answers or reference solutions. Prompt modifications (e.g., "write files in place without asking") are acceptable if you apply them to both the original benchmark and the adapter, and document them.

environment/Dockerfile: set up the container the agent will work in. Install system and Python dependencies, copy any benchmark-specific data files, and set the working directory. The agent and the verifier both run inside this container unless the task declares a separate verifier environment.

dockerfile
FROM python:3.13-slim
WORKDIR /workspace

RUN apt-get update && apt-get install -y \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install benchmark-specific dependencies
# RUN pip install --no-cache-dir <packages>

# Copy task-specific files
# COPY . /workspace/

GPU tasks: set gpus (and optionally gpu_types) under [environment] in task.toml. After publishing, evolve dataset show prints which sandbox providers can run each task.

Step complete when: main.py produces a valid task directory for each task.

4. Keep task names right

  • Every task directory name is the task's name on Evolve. Letters, digits, ., _ and -, at most 128 characters, starting with a letter or digit; use lowercase (Harbor's convention). Put the same identifier in [task] name as <adapter-name>/<task-id>. A [metadata] task_id, when present, must equal the directory name.
  • Task names must be unique within the dataset and stable across adapter runs. An unstable name makes the same task look like a different one on republish. If upstream lacks stable identifiers, mint a deterministic scheme in adapter code (e.g., {dataset}-1, {dataset}-2, ...) derived from a reproducible sort of upstream tasks.
  • Sanitize upstream identifiers before using them as names: lowercase, replace spaces/slashes/special characters with hyphens, avoid leading/trailing separators.
  • Treat main.py as the source of truth for task names. Do not hand-edit generated task directories; fix the converter and regenerate.
  • Use schema_version = "1.4" at the top of task.toml; [task].version is the task's own version and is distinct from it.

5. Verify the conversion

Check the generated tasks. The check reads each task and, when it can, runs its environment, its solution/solve.sh and its verifier, then rules on every criterion of a rubric; every task should come back no_problem_found with executed true.

bash
evolve check "<output-dir>" --watch
evolve check show <check-id>

A failing check usually means one of three things, in this order:

  1. Adaptation error: the instruction, environment or test does not match upstream.
  2. A broken reference solution: run the solution on the original benchmark side too, to tell a wrong solution from a wrong adaptation. If the fix is simple, propose it upstream and document it in the README; exclude tasks that cannot be reliably fixed.
  3. Environment error: a Dockerfile that does not build or a test that cannot run makes the task impossible for every agent, so catch it here.

Where Harbor is installed, harbor run -p "<output-dir>" -a oracle runs every reference solution locally (optional); the reward should be 1.0 on every task.

Benchmarks without reference solutions: write them, with LLM help, before publishing. A cheap agent and model can take a first pass over all the tasks; complete the rest with a stronger model plus human review.

Step complete when: every task passes evolve check.

6. Document and publish

Write the README with: what the benchmark measures and a link to it; the subset adapted and every exclusion; benchmark bugs found and how they were handled; prompt modifications, environment adjustments and other deviations from the original, with the reason; known limitations; the exact commands to regenerate the tasks and to run them.

Then publish the output folder as a dataset (evolve skills get publish has every option):

bash
evolve dataset check "<output-dir>"
evolve dataset publish --dir "<output-dir>" --name "<adapter-name>" --version 1.0 --watch
evolve run -d "<adapter-name>@1.0" -a codex -m gpt-5.5 --watch

To see how faithful the conversion is, run a job with the same agent and model the benchmark's own leaderboard reports, and compare the scores.

Reference adapters by shape

Harbor's repository holds one adapter per benchmark, public at https://github.com/laude-institute/harbor/tree/main/adapters. When implementation questions come up, read the one that matches the benchmark's shape:

ShapeExample adapter
Repository-level coding tasks with unit-test verifiersadapters/swebench/
Many small tasks from one dataset fileadapters/evoeval/
Data-analysis tasks with a custom datasetadapters/bixbench/
LLM-as-a-Judge verificationadapters/financeagent/
GPU tasksadapters/featurebench/

What this skill does NOT do

  • Implement adapter.py, main.py, or the task-template files. Those are the contributor's work, guided by the rules above.
  • Run evolve check or publish on its own. Both act on the user's account and need the user's explicit intent; a check spends credits (it runs a checker model).

Failure modes

SymptomLikely causeAction
evolve: command not foundThe CLI is not installednpm install -g @evolvingmachines/evolve.
evolve dataset check refuses a task by nameIts task.toml breaks a rule (a field, a value, a name)Fix the converter, regenerate, check again. The refusal names the field.
A task check comes back has_a_problemOne criterion failedevolve check show <check-id> prints the criterion, its explanation and its evidence.
Every task fails the check the same wayAn error in the task templateFix task-template/ in the converter, not the generated tasks.

Frequently asked questions

What does the Create Adapter AI skill do?

Convert an existing benchmark into a folder of Harbor-format tasks ready for `evolve dataset publish`. Use when the user wants to port, adapt, or import a benchmark (a paper's task set, a repository of problems, a leaderboard's dataset) onto Evolve. Guides the conversion and its verification with evolve check.

Why use Create Adapter on TypingMind?

Because you install it once and use it with any model. Create Adapter is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Create Adapter in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/evolving-machines-lab/evolve/tree/main/skills/create-adapter. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Create Adapter?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Create Adapter?

As many as you like. As long as a model supports skills, you can use Create Adapter with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Create Adapter AI skill free?

Yes. It is published on GitHub by evolving-machines-lab under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇