unbiased ai

Run the same code change across many repos

A deprecated call sits in a dozen repos, each imported a little differently, so find and replace breaks half of them. Write the change once as a prompt, loop a headless coding agent over the repos, and let your own test run decide what gets committed. Pareto is Unbiased’s model: it selects frontier and open models for each request and blends their outputs into one answer.

Tested live with Codex 0.162.1, Droid 0.245.0 and Claude Code 2.1.30550M tokens a week

A replay of the Codex loop below running on Pareto, recreated from a real run. Not a screenshot.

Tools that do this

Each of these talks to Pareto with a base URL, an API key and the model string pareto. Pick the one you already use.

The recipe: one prompt, one loop, your tests decide

Each script below runs its tool once per repo with the same prompt, then checks the result itself: the tests must pass with deprecation warnings turned into errors, and no old call may be left. Only then does the script commit. The example migrates Python code off datetime.utcnow() and datetime.utcfromtimestamp(), which Python deprecated in 3.12.

  1. Get an Unbiased API key

    Choose a plan, then create a key in the Unbiased platform. New accounts are reviewed and approved by a person before the key works.

  2. Point your coding agent at Pareto

    Codex reads a provider from ~/.codex/config.toml, Droid reads a custom model from ~/.factory/settings.json, and Claude Code reads environment variables. Type pareto as the model by hand: Unbiased does not list models at /v1/models.

  3. Write the change as one prompt

    Name the old call, the new call and the command that proves it worked. Say “change nothing else” so the agent leaves the tests and the rest of the file alone.

  4. Give the agent just enough permission

    Headless modes start read-only. Codex needs --sandbox workspace-write, Droid needs --auto medium to run tests, and Claude Code needs --permission-mode acceptEdits plus an allow rule for the test command.

  5. Let the script, not the agent, decide what ships

    After each run, the loop runs the tests and searches for the old call itself. A repo that passes gets a commit you can review; a repo that fails is listed with its log.

Tested on October 20, 2026Codex CLI 0.162.1, Factory Droid 0.245.0 and Claude Code 2.1.305 on Python 3.15.0, model pareto. Each loop script made the same datetime migration in three Python repos and committed all three with tests passing, 3 runs out of 3 for Codex, Droid and Claude Code. Run record.

OpenAI Codex CLI

codex exec runs the prompt in the repo named by --cd and exits. --ephemeral skips saving a session file per repo, and --json writes a log with token counts.

  • Tested with Codex CLI 0.162.1
  • < /dev/null stops Codex from waiting on stdin inside a script
  • Codex may print that model metadata for pareto was not found; the run continues
migrate-codex.sh
#!/bin/sh
# One headless Codex run per repo. A repo counts only if its tests pass
# and no deprecated call is left; then the change is committed.
PROMPT='Migrate this repo off the deprecated datetime.utcnow() and datetime.utcfromtimestamp(). Use timezone-aware UTC datetimes, such as datetime.now(timezone.utc) and datetime.fromtimestamp(ts, timezone.utc), and fix the imports. Change nothing else. Then run: python3 -W error::DeprecationWarning -m unittest'
mkdir -p logs

for repo in repos/*/; do
  name=$(basename "$repo")
  codex exec --cd "$repo" --sandbox workspace-write --ephemeral --json "$PROMPT" \
    < /dev/null > "logs/$name.jsonl" 2> "logs/$name.err"
  if (cd "$repo" && python3 -W error::DeprecationWarning -m unittest -q 2>/dev/null) &&
     ! grep -rqE 'utcnow|utcfromtimestamp' --include='*.py' "$repo"; then
    git -C "$repo" commit -qam "Use timezone-aware UTC datetimes" && echo "ok    $name"
  else
    echo "FAIL  $name  (see logs/$name.err)"
  fi
done
~/.codex/config.toml
model = "pareto"
model_provider = "unbiased"

[model_providers.unbiased]
name = "Unbiased"
base_url = "https://api.unbiased.ai/v1"
env_key = "UNBIASED_API_KEY"
wire_api = "responses"
Shell
export UNBIASED_API_KEY=your-unbiased-api-key
sh migrate-codex.sh
Output from our run (all three scripts)
ok    auth
ok    billing
ok    reports

All three tools wrote the same diffs in every run, for example dt.utcfromtimestamp(unix_ts) to dt.fromtimestamp(unix_ts, timezone.utc) with the timezone import added. Each script expects your repos under ./repos/; point the loop at any list of folders.

What it costs on Pareto

A coding agent reads files, edits, runs tests and reads the output, so one repo is several requests, and each request re-sends the conversation so far. Most of those tokens are cached input.

Personal at $10/monthFor one person
50M
tokens a week, 20 requests a minute
Personal Max at $100/monthFor one person
600M
tokens a week, 60 requests a minute

Measured on October 20, 2026: one small repo took 33,860 to 95,230 tokens as the tools reported them, input plus output, across 27 repos (Droid 33,860 to 51,955, Codex 35,907 to 65,651, Claude Code 53,860 to 95,230). Our repos were tiny, so treat these as a floor: bigger files and longer test output cost more. This page makes no per-repo price. Rates, including the cached input rate, are on Pricing. Run record.

One key for every tool on this page

Pick a monthly allowance, or pay per token on Team.

Personal

$10/month

  • 50M tokens a week
  • 20 requests per minute
  • For one person
Choose Personal

Personal Max

$100/month

  • 600M tokens a week
  • 60 requests per minute
  • For one person
Choose Personal Max

Team

Pay as you go

  • Prepaid credits at published rates
  • 300 requests per minute
  • No weekly token cap
Get started with Team

Subscriptions are for one person and are not unlimited. New API accounts are reviewed by a person before access turns on, and commercial or production use needs a separate written agreement. Rates and limits are on Pricing.

Questions about this recipe

Why run the agent once per repo instead of one big session?

Each repo gets a fresh context, so a mistake in one cannot leak into the next, and a failure stops at that repo. The loop also gets an exit code and a log per repo. In our test Droid and Claude Code reported 6 to 17 seconds per repo, and each loop over three repos took 24 to 41 seconds.

Why does the script run the tests if the agent already did?

Because the agent’s summary is a claim, and the test run is evidence. Our scripts only commit after they have run the tests themselves and searched for the old call. Put the same check in your own loop: your test command plus a search for the pattern you are removing.

Can I run the repos in parallel?

Yes, but each repo is several requests: Droid reported 4 to 6 turns per repo and Claude Code 5 to 12. Your plan’s request rate is shared across all of them, 20 requests per minute on Personal, and requests over the limit return HTTP 429. Factory’s docs show xargs -P 4 for parallel droid exec runs. We ran our loops one repo at a time.

What permissions does each tool get?

Only what the job needs. codex exec starts read-only and --sandbox workspace-write lets it write inside the repo. droid exec starts read-only, --auto low allows edits and --auto medium adds builds, tests and local git commands, not push. claude -p with acceptEdits writes files, and other shell commands need an allow rule. The scripts do the commit, and nothing pushes.

Can I loop over files instead of repos?

Yes. The pattern is the same with a file list in place of the folder list. Factory’s own example pipes find src -name "*.ts" into xargs droid exec --auto low, one file per run. We tested the per-repo loop on this page, not a per-file one.

Do I need an OpenAI, Factory or Anthropic account?

Not for these runs. With the settings above, all three tools sent requests to Unbiased with your Unbiased key, and your Unbiased plan pays for them. Droid ran without a Factory login in our test. The tools speak the OpenAI and Anthropic API formats, and compatibility is not a promise that every feature works, so tell us if one doesn’t.

What happens when I hit the weekly allowance?

Requests over your plan’s limits return an HTTP 429 error. Personal includes 50M tokens a week and 20 requests per minute. Personal Max raises that to 600M a week and 60 requests per minute for $100/month. Team uses prepaid pay-as-you-go credits with no weekly token cap.

Do I choose between models?

No. You send every request to one model string, pareto. Pareto selects frontier and open models for each request and blends their outputs into one answer.

Is my code kept?

Personal and Personal Max are not our zero data retention tier: prompts and responses may be kept up to 30 days, as section 5(c) of the Terms explains. For work that must not be kept, ask about the Zero Data Retention API on the Private AI page.

Same key, same model string, different job. See every use case. Or find your tool on Works with.

Product names belong to their owners. Unbiased is not affiliated with or endorsed by the makers of the tools on this page.

Hand Pareto the migration nobody has time for

One prompt, one loop and an API key. Pareto starts at $10 a month for 50M tokens a week.