Personal
$10/month
- 50M tokens a week
- 20 requests per minute
- For one person
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
Each of these talks to Pareto with a base URL, an API key and the model string pareto. Pick the one you already use.
codex exec runs one task without the TUI. --cd picks the repo and --sandbox workspace-write lets it edit files there.Pareto in OpenAI Codex CLI: setup guide →droid exec is Factory’s headless mode. --auto medium lets it edit files and run your tests, and Pareto is a custom model.Pareto in Factory Droid: setup guide →claude -p runs one prompt and exits. acceptEdits plus an allow rule for your test command keeps it unattended.Pareto in Claude Code: setup guide →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.
Choose a plan, then create a key in the Unbiased platform. New accounts are reviewed and approved by a person before the key works.
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.
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.
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.
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.
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.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.
< /dev/null stops Codex from waiting on stdin inside a scriptpareto was not found; the run continues#!/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
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"
export UNBIASED_API_KEY=your-unbiased-api-key sh migrate-codex.sh
droid exec runs the prompt and exits with a non-zero code if it fails. --model custom:Pareto-0 picks the first custom model, and -o json writes a log with token counts.
--cwd with a relative path failed with “Working directory does not exist”--auto low edits files but cannot run your tests#!/bin/sh # One droid exec 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") (cd "$repo" && droid exec --auto medium --model custom:Pareto-0 -o json "$PROMPT") \ > "logs/$name.json" 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
{
"customModels": [
{
"model": "pareto",
"displayName": "Pareto",
"baseUrl": "https://api.unbiased.ai/v1",
"apiKey": "${UNBIASED_API_KEY}",
"provider": "generic-chat-completion-api",
"maxOutputTokens": 32000
}
]
}export UNBIASED_API_KEY=your-unbiased-api-key sh migrate-droid.sh
claude -p runs one prompt in the current folder and exits. acceptEdits lets it write files, and Bash(python3 *) lets it run the tests without a prompt nobody is there to answer.
pareto; the run continuesBash(npm test *), for other test commands#!/bin/sh # One claude -p 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") (cd "$repo" && claude -p "$PROMPT" --permission-mode acceptEdits \ --allowedTools "Bash(python3 *)" --output-format json) \ > "logs/$name.json" 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
export ANTHROPIC_BASE_URL=https://api.unbiased.ai export ANTHROPIC_AUTH_TOKEN=your-unbiased-api-key export ANTHROPIC_MODEL=pareto export ANTHROPIC_DEFAULT_HAIKU_MODEL=pareto export ANTHROPIC_DEFAULT_SONNET_MODEL=pareto export ANTHROPIC_DEFAULT_OPUS_MODEL=pareto unset ANTHROPIC_API_KEY sh migrate-claude.sh
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.
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.
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.
Pick a monthly allowance, or pay per token on Team.
$10/month
$100/month
Pay as you go
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
One prompt, one loop and an API key. Pareto starts at $10 a month for 50M tokens a week.