# Config reference

> The JSON structure of a prompt, field by field, with a complete example.

You don't have to write this JSON by hand. Turn on **Prompt Designer** in the agent's settings and the agent writes it with you from a description of the Dimensions you want, or you can paste JSON in this shape into that chat and ask the agent to save it. Saved prompts are listed on the **Prompts** tab. See [Design custom Dimensions](/dimensions/custom#getting-started).

A prompt is a JSON object with four top-level fields. It is shaped like a function definition: a name, a description, the instructions, and the fields to fill in.

| Field | Required | What it is |
|---|---|---|
| `name` | Yes | A function-style name, such as `extract_support_ticket_info` |
| `description` | Yes | One sentence on what the prompt extracts. Metadata only. |
| `context` | Yes | The instructions sent with every conversation. See [Write the context](/dimensions/custom#write-the-context). |
| `parameters` | Yes | `{ "type": "object", "properties": { ... }, "required": [ ... ] }` |

## Dimensions inside `parameters.properties`

Each key is a Dimension name in `snake_case`. Each value has a `description` and a `type`:

| [Output type](/dimensions#output-types) | JSON |
|---|---|
| Fixed category | `"type": "string", "enum": ["billing", "delivery", "none_detected"]` |
| Dynamic label | `"type": "string"` |
| Verbatim quote | `"type": "string"` |
| Score | `"type": "integer"` |
| Boolean | `"type": "boolean"` |

List every Dimension in `required`, scores included. For a score, say in its description when to leave it empty, for example *"Leave empty if there is not enough signal"*. See [Predicted scores](/dimensions/predicted-scores#leave-it-empty-never-zero).

## Rules

- Valid strict JSON. A line break typed inside a string value makes the file invalid; write `\n` instead.
- Every category list ends with `none_detected`, with no duplicates, in `snake_case`.
- Every Dimension in `properties` is also in `required`.

## Example

```json
{
  "name": "extract_support_ticket_info",
  "description": "Why customers contact support, whether the issue was resolved, and their own words.",
  "context": "Input:\nEach record is one support ticket thread between a customer and our agents.\n\nRules:\n- Use only what the text states.\n- If there is no signal, return 'none_detected'.",
  "parameters": {
    "type": "object",
    "properties": {
      "issue_category": {
        "description": "The customer's main issue.\n- 'billing': charges, refunds, invoices.\n- 'technical': the product is not working.\n- 'account_access': login, password, locked account.\n- 'none_detected': no issue stated.",
        "type": "string",
        "enum": ["billing", "technical", "account_access", "none_detected"]
      },
      "resolved": {
        "description": "true if the thread ends with the issue fixed or the question answered.",
        "type": "boolean"
      },
      "effort_1to5": {
        "description": "How hard the customer had to work to get help, 1 = effortless, 5 = very hard.",
        "type": "integer"
      },
      "issue_verbatim": {
        "description": "The customer's own words describing the issue, copied exactly, at most 30 words. If none, return 'none_detected'.",
        "type": "string"
      }
    },
    "required": ["issue_category", "resolved", "effort_1to5", "issue_verbatim"]
  }
}
```
