Skip to content

Job description

job_description.json defines your task in words. The teacher reads it when it’s evaluated and when it writes training data, and the judge reads it when it scores a prediction.

This page is the full field reference. For what to put in it when you’re preparing a particular kind of input, see Trace inputs or Seed dataset overview.

Unknown fields are rejected at validation, so the fields below are the whole surface.

Field Classification Question answering Chat completion
task_description required required required
classes_description required - -
tools - - optional / required
llm_as_a_judge_instructions rejected optional optional
synthetic_data_generation_instructions optional optional optional
trace_processing_instructions optional optional optional

The chat completion column covers chat-completion, where tools is optional, and chat-completion-agentic, where it’s required.

There’s no system-prompt field: task_description is rendered into the system prompt the model trains and serves with, so write it as one.

Classification is scored by label accuracy, so it has no judge to instruct, and a job description with llm_as_a_judge_instructions fails the create.

Goes into every teacher prompt: evaluation, generation and judging. It defines what a correct answer is.

Derive it from the system prompt of the system you’re replacing, with the same care: the output format with an example, the include and exclude rules, the edge cases.

It stays matched to that production prompt and unchanged across iterations. To improve results, change the teacher or the data, not this field: because it also feeds the judge, changing it changes what “correct” means everywhere at once, and earlier scores stop being comparable.

Maps each class name to a description of when it applies.

{
  "classes_description": {
    "billing": "questions about invoices, charges, refunds or payment methods",
    "technical": "the product is not working as documented"
  }
}

These descriptions define the label space and directly shape the data that gets generated, so a vague class description produces vague examples of that class.

The label sets in train.jsonl, test.jsonl and classes_description have to be identical, or validation fails.

A list of tool schemas in the OpenAI function-calling format, with unique names. chat-completion-agentic needs at least one tool. chat-completion may omit the field (or pass null or []) for a tool-free conversational model; data with tool calls and no declared tools fails validation (Chat completion).

{
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Look up the current weather for a city",
        "parameters": {
          "type": "object",
          "properties": { "city": { "type": "string" } },
          "required": ["city"]
        }
      }
    }
  ]
}

Parameter schemas can declare default values. The tool_call_equivalence metric treats an argument left at its default as equal to omitting it.

Every tool call in your training and test data validates against these schemas.

What the judge is told when it scores a prediction, for both judge metrics (Metrics). State the pass and fail criteria: what a correct answer must contain, and what to ignore, such as ordering, whitespace or paraphrasing.

A shape that works:

Output ‘good’ if the prediction correctly completes the task, otherwise output ‘bad’.

followed by the criteria that decide it.

Vague criteria make every number noisy, and teacher, base and tuned scores all come from this judge. The judge sees the full prefix, including the question.

Extra guidance injected into every generation prompt, and read during generation only. Use it to describe what the generated inputs should look like: formats, domains, register, noise. For a reasoning student, see Reasoning models.

Because it is read during generation and nowhere else, it changes the inputs without redefining the task. See Synthetic data generation.

Task-specific guidance added to the instructions the teacher follows when it relabels traces, in both trace jobs: test set from traces and trace processing. It does nothing when you start from a seed dataset.

Use it when the edits have to respect something unusual about your traces:

This is a live phone call; preserve the caller’s interruptions and any cut-off utterances verbatim.

See Trace processing.