Card 04Jobs

Job titles name inference eight times as often as pre-training

Open postings whose title names a stage of the model lifecycle, worldwide and in the US, on the Metix AI Platform on September 21, 2026.

8.2×

as many open postings name inference in the title as pre-training (516 to 63).

  • Inference and serving516
  • Post-training175
  • Pre-training63
  • Fine-tuning47

Inference outnumbers every other stage, 8.2 times pre-training

Open postings whose title names a model-lifecycle stage: the outline is the worldwide count, the fill is the part in the US

Inference 516, post-training 175, pre-training 63, fine-tuning 47.

  1. Inference and serving516 · 65% US
  2. Post-training175 · 79% US
  3. Pre-training63 · 56% US
  4. Fine-tuning47 · 66% US

What it shows

Worldwide, 516 open postings name inference or model serving in the title, 8.2 times the 63 that name pre-training. Post-training has 175 and fine-tuning 47. By job title, the hiring is about running models, not training them.

The stages differ in where they hire. Post-training is the most concentrated in the US, with 138 postings there, 79%; pre-training has 56%.

Method and limits

These counts read titles only. Many people at frontier labs hold generic titles such as "Member of Technical Staff", which none of these filters match, so every number is a lower bound. The comparison is about how postings are titled, not about the size of teams.

Source: Metix AI Platform, jobs, 2026-09-21.

Queriespre-training.json · post-training.json · fine-tuning.json · inference.json
POST /v1/jobs/query · queries/pre-training.json
{  "where": {    "all": [      {        "any": [          {            "field": "title",            "match": "pretraining"          },          {            "field": "title",            "match": "pre-training"          }        ]      },      {        "any": [          {            "field": "title",            "match": "research"          },          {            "field": "title",            "match": "engineer"          },          {            "field": "title",            "match": "scientist"          },          {            "field": "title",            "match": "llm"          },          {            "field": "title",            "match": "model"          },          {            "field": "title",            "match": "ai"          },          {            "field": "title",            "match": "ml"          },          {            "field": "title",            "match": "technical"          }        ]      },      {        "not": [          {            "field": "title",            "match": "sales"          },          {            "field": "title",            "match": "customer"          },          {            "field": "title",            "match": "teacher"          },          {            "field": "title",            "match": "trainer"          },          {            "field": "title",            "match": "doctoral"          },          {            "field": "title",            "match": "pharmacy"          },          {            "field": "title",            "match": "licensing"          },          {            "field": "title",            "match": "licensed"          },          {            "field": "title",            "match": "causal"          },          {            "field": "title",            "match": "statistical"          }        ]      }    ]  },  "size": 1}
POST /v1/jobs/query · queries/post-training.json
{  "where": {    "all": [      {        "any": [          {            "field": "title",            "match": "post-training"          },          {            "field": "title",            "match": "posttraining"          }        ]      },      {        "any": [          {            "field": "title",            "match": "research"          },          {            "field": "title",            "match": "engineer"          },          {            "field": "title",            "match": "scientist"          },          {            "field": "title",            "match": "llm"          },          {            "field": "title",            "match": "model"          },          {            "field": "title",            "match": "ai"          },          {            "field": "title",            "match": "ml"          },          {            "field": "title",            "match": "technical"          }        ]      },      {        "not": [          {            "field": "title",            "match": "sales"          },          {            "field": "title",            "match": "customer"          },          {            "field": "title",            "match": "teacher"          },          {            "field": "title",            "match": "trainer"          },          {            "field": "title",            "match": "doctoral"          },          {            "field": "title",            "match": "pharmacy"          },          {            "field": "title",            "match": "licensing"          },          {            "field": "title",            "match": "licensed"          },          {            "field": "title",            "match": "causal"          },          {            "field": "title",            "match": "statistical"          }        ]      }    ]  },  "size": 1}
POST /v1/jobs/query · queries/fine-tuning.json
{  "where": {    "all": [      {        "any": [          {            "field": "title",            "match": "fine-tuning"          },          {            "field": "title",            "match": "finetuning"          }        ]      },      {        "any": [          {            "field": "title",            "match": "research"          },          {            "field": "title",            "match": "engineer"          },          {            "field": "title",            "match": "scientist"          },          {            "field": "title",            "match": "llm"          },          {            "field": "title",            "match": "model"          },          {            "field": "title",            "match": "ai"          },          {            "field": "title",            "match": "ml"          },          {            "field": "title",            "match": "technical"          }        ]      },      {        "not": [          {            "field": "title",            "match": "sales"          },          {            "field": "title",            "match": "customer"          },          {            "field": "title",            "match": "teacher"          },          {            "field": "title",            "match": "trainer"          },          {            "field": "title",            "match": "doctoral"          },          {            "field": "title",            "match": "pharmacy"          },          {            "field": "title",            "match": "licensing"          },          {            "field": "title",            "match": "licensed"          },          {            "field": "title",            "match": "causal"          },          {            "field": "title",            "match": "statistical"          }        ]      }    ]  },  "size": 1}
POST /v1/jobs/query · queries/inference.json
{  "where": {    "all": [      {        "any": [          {            "field": "title",            "match": "inference"          },          {            "field": "title",            "match": "model serving"          },          {            "field": "title",            "match": "llm serving"          }        ]      },      {        "any": [          {            "field": "title",            "match": "research"          },          {            "field": "title",            "match": "engineer"          },          {            "field": "title",            "match": "scientist"          },          {            "field": "title",            "match": "llm"          },          {            "field": "title",            "match": "model"          },          {            "field": "title",            "match": "ai"          },          {            "field": "title",            "match": "ml"          },          {            "field": "title",            "match": "technical"          }        ]      },      {        "not": [          {            "field": "title",            "match": "sales"          },          {            "field": "title",            "match": "customer"          },          {            "field": "title",            "match": "teacher"          },          {            "field": "title",            "match": "trainer"          },          {            "field": "title",            "match": "doctoral"          },          {            "field": "title",            "match": "pharmacy"          },          {            "field": "title",            "match": "licensing"          },          {            "field": "title",            "match": "licensed"          },          {            "field": "title",            "match": "causal"          },          {            "field": "title",            "match": "statistical"          }        ]      }    ]  },  "size": 1}

Run it

Three ways in. Each says what it costs before you start.

1 API Credit buys 25 search results or 5 full records; $1 buys 30 API Credits.

Run it in your agent

56 to 64 API Credits$1.87 to $2.13Fits in the 100 free API Credits

Your agent stops and asks before spending more than 70 API Credits.

Your agent follows the prompt step by step: it reads the rules, runs the counts, checks the definitions the prompt asks it to check, and writes the files and charts. Use an agent that can write files, such as Claude Code or Codex.

Set up onceKey, connection, and a free check. Skip this if your agent already reaches the Platform.
  1. 1Get a key

    Create a key on the Metix AI Platform →

    New accounts get 100 API Credits once, valid for 30 days. Set the key in the shell you start your agent from, or add the line to ~/.zshrc or ~/.bashrc so every new terminal has it:

    Shell
    export METIX_KEY=metix_xxxxxxxx
  2. 2Connect your agent

    Claude Code

    Registers the Platform for every project. Start claude in any folder and the ten metix tools are there.

    Shell
    : "${METIX_KEY:?run step 1 first}" &&
    claude mcp add --scope user --transport http metix \
      https://mira-api.metix.ai/mcp \
      --header "Authorization: Bearer $METIX_KEY"
    MCP setup guide →

    Codex

    Registers the same server. The key stays in your environment instead of the config file.

    Shell
    codex mcp add metix \
      --url https://mira-api.metix.ai/mcp \
      --bearer-token-env-var METIX_KEY
    MCP setup guide →

    Skills

    Four skills that teach any agent the Platform's endpoints and query rules, for agents without MCP. The installer starts with none ticked: press space on each, then enter.

    Shell
    npx skills add MetixAI-Official/metix-skills
    Skills install guide →

    Other MCP

    Point the client at this endpoint over streamable HTTP with both headers; without the Accept header the server answers 406. Older clients use /sse on the same host.

    Endpoint and headers
    https://mira-api.metix.ai/mcp
    Authorization: Bearer <your key>
    Accept: application/json, text/event-stream
    MCP setup guide →
  3. 3Check the setup

    Ask this first. It reads your balance and the field list, runs no search, and costs nothing:

    Prompt for your agent
    Use the Metix AI Platform to check my key status and read the contract; both are free. Then tell me my API Credit balance and which datasets I can query. Do not run any search.

4Paste the prompt

Start your agent in an empty folder, then paste. It writes its files there.

The question

Answer one question with the Metix AI Platform: which stage of the model lifecycle do job titles name most often, and where is each stage hired? Work only through the public Platform (REST at https://mira-api.metix.ai, the MCP server, or the metix-skills) with the key in METIX_KEY, and never print the key.

  1. 01Read before querying

    Call GET /contract (free) and use only querySpecByEntity.job fields. A search costs ceil(returned IDs / 25) API Credits, so a count with size 1 costs 1 API Credit, and a search that returns nothing is free. Check the balance with GET /auth/key/status (free) at the start and at the end, and stop and ask before the run passes 70 API Credits.

  2. 02Stages

    Four title conditions: pre-training (pretraining, pre-training), post-training (post-training, posttraining), fine-tuning (fine-tuning, finetuning), and inference (inference, model serving, llm serving). Use one any node per stage.

  3. 03Guard every stage the same way

    match needs every word present but not next to each other, so "pre-training" also matches "Pre-licensed Training Provided". Require one machine-learning word in the title (research, engineer, scientist, llm, model, ai, ml, technical) and exclude sales, customer, teacher, trainer, doctoral, pharmacy, licensing, licensed, causal, statistical. Do not add "RLHF" to post-training: data-labelling reposts from staffing firms dominate it.

  4. 04Audit before trusting

    Read every title for the smallest stage (it is under 100) and 50 titles for each of the others. Report how many are off-topic; if more than 5% are, add exclusions, apply them to all four stages, and say what changed.

  5. 05Count

    For each stage, count worldwide and with location.country eq "United States", size 1 each. Eight API Credits in total.

  6. 06Clean

    Reposts are not collapsed here; say so rather than guessing a correction.

  7. 07Group

    The four stages are the groups; keep them in one file with their conditions.

  8. 08Outputs

    Write data/stages.json with "unit": "jobs", the snapshot date, and for each stage its worldwide count and US count. Report the balance from GET /auth/key/status (free) before and after as the cost.

  9. 09Chart

    One bar per stage, scaled to the largest, the inference bar highlighted, each labelled with its count and its US share. The headline number is the ratio of inference to pre-training, not a count.

  10. 10Limits

    Titles only: people at frontier labs often hold generic titles such as "Member of Technical Staff", so every count is a lower bound and the comparison is about how postings are titled, not about team size.

What you get

The aggregate files and the chart, a note on what the audits found and what they changed, and the API Credits the run spent, read from the balance before and after.

A call that returns 402 insufficient_quota means the key works and the balance is empty.

Reproduce the numbers

8 API Credits$0.27Fits in the 100 free API Credits

A short standard-library Python script sends the committed queries as counts and writes the aggregate files this page is built from. It needs Python and METIX_KEY set in the shell (step 1 of the agent path); your agent can run these lines for you as well.

Shell
curl -fsSL https://platform.metix.ai/casebook/source/model-lifecycle-titles-2026.tar.gz | tar xz
cd model-lifecycle-titles-2026
: "${METIX_KEY:?set METIX_KEY first}" && python3 cases/model-lifecycle-titles-2026/fetch.py

What you get

data/*.json and data/receipt.json. Run git diff cases/model-lifecycle-titles-2026/data to see what moved: the numbers should match, apart from what changed in the data since the snapshot.

Adapt it

Costs what your version reads. Write your own ceiling into step 1 of the prompt.

The prompt is the case. Change the parts in this table and your agent answers your question instead, with the same checks and the same way of reporting cost.

To change Edit For example
The stages Step 2 Add evaluation ("evals", "model evaluation") and audit it the same way
The guard Step 3 Tighten the machine-learning words for a noisier stage
The geography Step 5 Count by several countries instead of the US alone

What to ask before running it

  1. Which stages, and which title words stand for each?
  2. Titles only, or descriptions too? Descriptions are far noisier.
  3. Worldwide, or one country?
  4. How many API Credits may the audit spend reading titles?

Method and limits

How the population was defined, counted, and checked, and what the numbers cannot show.

Population

Open postings on the Metix AI Platform on September 21, 2026. Each stage is a set of title words: pre-training (pretraining, pre-training), post-training (post-training, posttraining), fine-tuning (fine-tuning, finetuning), and inference (inference, model serving, llm serving). Every stage also needs a machine-learning word in the title (research, engineer, scientist, llm, model, ai, ml, technical) and excludes sales, customer, teacher, trainer, doctoral, pharmacy, licensing, licensed, causal, and statistical.

Why the extra conditions

A match needs every word to appear but not next to each other, so "Pre-licensed Training Provided" (real estate) and "Pharmacy Technician in Training" both matched pre-training. The agent read all 72 pre-training titles, excluded that kind of posting, and read them again to check. Adding "RLHF" to post-training would have let one staffing firm's repeated data-labelling postings dominate the stage, so that word is not used. All four stages share the same conditions so the comparison is fair.

Counting

Two counts per stage (worldwide and US), one API Credit each, and no posting is read. Reposts of the same role are not collapsed. The conditions are in queries/.

Limits

Titles only, so every count is a lower bound. Postings measure demand, not headcount. This is one day, not a trend.

The last reproduction

What reproducing this case cost the last time the script ran, read from the Platform's own balance before and after.

Ran on
2026-09-21
Calls
8
Search results
8
Records read
0
API Credits
8

Search results are IDs returned by searches, one per count query and one per match on a full search. Records are postings or profiles read in full: this case reads none.

Making this case cost about 93 API Credits more: the agent's audits, trial queries, and earlier runs that the published replay replaced. You do not pay that again.