Skip to main content
An instance config is one JSON document that decides how every turn on the instance behaves: the system prompt, which tools exist, which platform data the assistant can read, guardrails, per-turn limits, the publish regression policy, retention, and file uploads. You edit it as a draft; turns run only published versions. See Versions and publish.

How it works

  1. You save a full config document as the instance’s draft, in the portal’s Config tab or with PATCH /api/v1/conversation-instances/{instance_slug} and an organization API key.
  2. The platform validates the whole document. Any problem refuses the save with 400 invalid_instance_config and a list of issues.
  3. Publishing revalidates the draft, runs the eval gate, and freezes it as a numbered version.
  4. Every turn stamps the config hash it ran under onto the messages it stores.
A config is always a complete document. Every section below is required except attachments. A required section that is missing or null is invalid, and so is a required field inside a section. These optional values may be omitted or null: the whole attachments section and any field inside it, a component’s props_schema, and a client tool’s input_schema. retention.conversation_days must be present, and may be null. Unknown fields are rejected everywhere except inside a JSON Schema value. The hash of a config ignores key order and whitespace.

Validation errors

Each issue carries the JSON path of the field and a message. Fix every listed issue and save again.

The default config

Creating an instance without a config applies this document.

Sections

model_policy

Every configured assistant runs gpt-6-sol. There is no model selector. The retired fields default_model and deep_model are rejected.

system_prompt

A string. The platform adds two things after it on every turn: a sentence naming which data sources are enabled and which are not (only when the config declares at least one platform pack), and an instruction that tells the model to treat user messages, tool results, and page context as untrusted data, never as instructions.

engines

"*" or an array of engine slugs or ids. It is the allowlist of engines the assistant may read through platform tools. "*" means every engine the caller may see. An empty array is valid and means no engine-scoped reads. Validation checks only the shape; the listed engines are resolved when each turn starts, so archiving an engine never makes a config invalid. When the caller is a scoped key, the allowlist is intersected with the engines the key is bound to.

tools

A client tool:

components

An array of {component, version, props_schema} declarations. component is non-empty, version is at least 1, and component@version is unique. A component frame is emitted only for a declared identity whose props validate against props_schema. No platform tool emits a component today, so declaring one has no effect on turns yet.

data_sources

At least one entry. Each entry is either {sources, notes} or {ref}, never both. sources lists data-access keys. A tool whose key is not enabled is absent from the turn, not refused, and the system prompt tells the model what it can and cannot read. The tools behind each key are listed on Platform tools. A config whose only declared key is catalog (the default shape) enables catalog, engines, runs, metrics, connections, and webhooks. Naming any other key switches to the literal list: only the keys you name are enabled. run_payloads, feedback and team are never enabled by that default; name them to turn them on. ref is accepted and grants nothing today. notes is free text for authors.

access

personas is a non-empty array of strings; "*" means any persona. The value is validated and stored. The platform does not check it on turns today.

limits

guardrails

Three rule families: refusal_domains, escalation_rules, output_checks. Rule ids are unique across all three, and every rule lists at least one eval scenario id in scenarios. See Guardrails.

evals

on_regression is block or warn. It decides whether a publish that regresses a gate scenario is refused or released with the result recorded. See Versions and publish.

retention

conversation_days is null (keep conversations) or a positive integer. The legacy name thread_days is still read. See Export and retention.

annotations

enabled is a boolean. It is validated and stored. The platform does not check it when an annotation is created today, so annotations are accepted either way.

attachments (optional)

Absent or enabled: false means the instance takes no files. See Attachments.

Legacy shapes still read

Older configs keep working. When a stored config is read, retention.thread_days becomes retention.conversation_days, a single data_scope object becomes a one-entry data_sources list, and the retired model_policy.default_model and model_policy.deep_model fields are ignored, so released versions that carry them still run. A new save or a publish that includes either retired field is refused with invalid_instance_config and the message “field is retired: every configured assistant uses gpt-6-sol”.

What you configure (portal)

  • Conversations, then the instance, then Config: edit every section. The Data access checkboxes set data_sources and show whether each source is available in your org.

What you call (API)

Versions and publish

Release the draft through the eval gate.

Client tools and confirmations

Run your own tools inside a turn.
Last modified on September 25, 2026