OpenAI ends fine-tuning by January 6, 2027, sooner for orgs new to it. Migrate to models you own while you can still retrain.

Same answers, smaller bill, proven by evals.

No company asks a senior manager to classify email all day. They train an apprentice. Apprentice runs that loop: your verified examples in, a fine-tuned small model out. It takes over only when it passes your eval gate.

Free first run · one callback to install · no traffic moves until your evals pass

console.runapprentice.com · receipt-extraction · compare
receipt-extractionSucceeded
GPT-5.4-mini · baseline72.92
GPT-5.4-mini · GEPA-optimized79.58
Apprentice 4B · fine-tuned89.17

The 4B you own beat GPT-5.4-mini, even with its prompt optimized.

Same task, same 60-row held-out slice200 verified examplesMeasured
01

The manager works.

Your frontier model keeps answering. One callback turns every real call into training data.

02

The apprentice learns.

Your team verifies rows into a gold set. Generated rows never promote themselves.

03

The gate decides.

Only a model that beats your held-out bar takes traffic. If it slips, the manager steps back in.

Evidence

Proven on a public run. Rerun it yourself.

Before: every request at frontier prices. After: a small model you own, scoring higher on your own eval set.

Two public runs, the largest on 200 real scanned receipts with a 60-row held-out slice the optimizer never saw: honest, and yours to rerun. In a pilot we run the same loop on your data.

Receipts: full write-up · rerun every number · the MI300X-trained adapter · runapprentice on PyPI

Our public benchmark

Cheaper to serve.

Apprentice 4B
3.7×
GPT-5.4-mini
vs GPT-5.4-mini · $0.20 vs $0.75 input / $4.50 output per 1M · published pricingRun it yourself → GitHub, ~40 min
Integration

One line to connect.

Add one callback to your existing call and Apprentice captures every request, your code unchanged. Eval-gated routing, promotion, and rollback are coming soon, through the same one line.

Before$3.85 / 1k
# direct frontier call from openai import OpenAI client = OpenAI() response = client.chat.completions.create( model="gpt-4o", messages=[{ "role": "user", "content": prompt }] )
After$0.42 / 1k when ready
# one line added, everything else unchanged from langchain.chat_models import init_chat_model from runapprentice.langchain import ApprenticeCallback model = init_chat_model( "gpt-4o", # your model, unchanged callbacks=[ApprenticeCallback("ticket-triage", client)], # ← the line )

Install: uv add 'runapprentice[langchain]' · Works with the LangChain chat models you already use; the direct OpenAI SDK is supported too.

Works withOpenAI SDKLangChain
Process

Watch. Learn. Take over.

Capture real calls. Prove quality on gold rows. Traffic shifts only after the gate passes.

Even the frontier labs document this: OpenAI Model Distillation and Google Research show a smaller model can match a frontier model on a task at lower cost.

01

No dataset? Generate a starter set

A model drafts realistic examples from the rows and instructions you give it. Every generated row lands as raw and earns gold only in review, so the score is never inflated by generated data.

Apprentice console Dataset page: Generate examples panel that added 7 synthetic rows as raw awaiting review, with tier counts and three freshly generated documents including a refund, a delivery notice, and an invoice
02

Share the review with your experts

Verifying does not have to be your job. Invite a subject-matter expert by email, choose whether they can only verify or also write corrections, and whether they see your production prompt. Their verdicts build the gold set.

Apprentice console Reviewers page: invite a subject-matter expert by email with per-reviewer permissions, prompt visibility, and expiry, above a list of current reviewers with one active reviewer who verified 200 rows
03

Verify rows into a gold set

One keystroke per verdict. The rows you verify become the examples this task learns from, and the held-out slice it is judged on.

Apprentice console Review queue: a dataset row pending verdict with Verify as gold, Reject, Flag, and Corrected output controls, session at 140 of 200 rows with 139 verified
04

Optimize the prompt, prove it

GEPA rewrites your prompt and scores both versions on held-out gold rows: 72.92 to 79.58 on the receipts benchmark. You see the exact diff that earned it. How the optimization step works.

Apprentice console Compare view: GPT-5.4-mini baseline prompt scores 72.92, GEPA-optimized prompt scores 79.58 on the 60-row held-out gold set, with the split prompt diff below
05

Train, gate, take over

The fine-tuned 4B beats the optimized teacher, 89.17 vs 79.58 on the same held-out rows. Only a model that passes your gate can take over, and rollback is one click.

Apprentice console Models page: fine-tuned Qwen3.5-4B passed the eval gate scoring 89.17 against the frontier champion at 79.58, with a Promote to champion button
Every number from one public run. Rerun it yourself: apprentice-benchmark
Deploy

Same fine-tune. Three places to run it.

All three speak the OpenAI API: point OPENAI_BASE_URL at the new endpoint and keep your LangChain code unchanged. Rollback is one env var.

Your Mac

One command, apprentice train --local, fine-tunes on device with MLX and scores a held-out slice. Your data never leaves the laptop.

How the Mac path works →

Your cluster

The agent skill writes the vLLM Deployment and Service into your own repo, mirroring your manifests. Traffic never leaves your Kubernetes cluster.

How the cluster path works →

Managed coming soon

We run the GPU behind api.runapprentice.com. You point at the endpoint.

Safety model

Built for the teams that can't afford to be wrong.

Every traffic shift requires your gates to pass. No exceptions. All three guarantees ship with model replacement coming soon

01

Eval-gated rollout.

Nothing reaches production unless it passes your gold set. You set the thresholds. We fail closed.

Continuous eval on every fine-tuning run
Configurable thresholds per task, per team
Auto-demote on fallback spike, no pages needed
02

Instant rollback.

One click. Traffic flips back to the frontier model in under a second. Every rollback is permanent audit log with a metrics snapshot.

Sub-second traffic revert, zero downtime
Audit log on every promotion and rollback
Frontier model always on hot standby
03

Your data, your cloud.

Fine-tuning runs inside your VPC. Model weights never leave your infrastructure. We see traffic shape, not content.

Bring-your-own compute (AWS, GCP, Azure)
No training data leaves your perimeter
We never train on your data
Questions

Before you ask.

The things engineering leaders check before they trust a takeover.

Will a smaller model actually hold quality?

It only goes live if it passes your eval gate. Every replacement is scored against your own gold set, and below the bar your frontier model keeps serving. You see the held-out number before anything ships.

What happens to our data?

By default, captured content is sent to the Apprentice API. Redact it client-side before it leaves your process: the redact hook runs in your code, so sensitive fields never reach us. We never train shared models on your data. With model replacement, coming soon, fine-tuning runs in your own VPC and model weights never leave your infrastructure.

Are we locked in?

No. Capture is one callback you can remove any time, and the optimized prompt is plain text you keep. With model replacement, coming soon, your frontier model stays on hot standby with one-click rollback, and the tuned model is an open-weights Qwen derivative you keep and run anywhere.

How is this different from fine-tuning it ourselves?

You bring the golden set; Apprentice runs the loop. Today that is prompt optimization with an honest held-out score. Coming soon, the same loop trains a small model, gates it on your evals, and routes traffic with instant rollback. The takeover stays measured, not a leap of faith.

Which tasks does this work for?

Repeatable tasks with checkable outputs. JSON extraction and classification are the first classes: the loop needs answers your team can verify as right or wrong. Open-ended chat is a poor fit today.

How fast do we see a result?

Same day. Capture or upload one dataset, verify rows, run optimize, and you see the held-out score next to your baseline. No number is shown that a run did not produce.

What does a pilot involve?

Trying Apprentice is free: upload one dataset and see your score change the same day. The migration itself runs as a design partnership with a small number of teams: one workflow, a written success metric, and a hard end date.

Developer resources

Everything you need to run it yourself.

Works where your agent works

One skill, three agents: a Claude Code plugin, a Codex plugin, and a bare skill folder that GitHub Copilot CLI picks up. It never calls an API and never touches your code.

/plugin marketplace add singhabhishekkk/apprentice-skill/plugin install apprentice@apprentice
apprentice-skill →
OpenAI stops new fine-tuning jobs on January 6, 2027. Move to open models while you can still iterate.

Start your first task.
See your score move today.

Teams spending $20k+/month on frontier APIs are exactly who this is for. Trying it is free. The migration runs as a design partnership: one workflow, a written success metric, a hard end date.

Sources: Menlo Ventures, 2025 State of Generative AI in the Enterprise and a16z, 100 Enterprise CIOs 2025

Migrating from OpenAI fine-tuning? Read the migration guide →

Apprentice: prompt optimization + eval-gated fine-tuning