How it works
- 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. - The platform validates the whole document. Any problem refuses the save with
400 invalid_instance_configand a list of issues. - Publishing revalidates the draft, runs the eval gate, and freezes it as a numbered version.
- Every turn stamps the config hash it ran under onto the messages it stores.
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
path of the field and a message. Fix every listed issue and save again.
The default config
Creating an instance without aconfig 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_sourcesand show whether each source is available in your org.
What you call (API)
- Get an instance returns the draft config and its
config_hash. - Update an instance replaces the draft config. Organization API keys only.
Versions and publish
Release the draft through the eval gate.
Client tools and confirmations
Run your own tools inside a turn.