DEEIX Chat splits model capability exposure into three independent controls: the model's default options, the option pass-through policy, and provider-native tools. This page shows the exact JSON fields, the real filter order, and how to verify each layer before rollout.
Where to find it#
- Model defaults, controls, and native tools: Admin console > Models > create or edit a model > Model capabilities.
- Parameter pass-through: Admin console > Conversation > Option passthrough.
- Native tool billing: Admin console > Billing > Tool pricing.
Configure in that order. A control can only render what the model declares, and a declared option can only reach the provider if the pass-through policy allows its path.
How an option reaches the model#
Every chat request runs the same filter. The backend applies the steps in this order:
- Read the pass-through mode. If it is Disabled, stop here: neither user options nor model defaults are sent.
- Start from the model's
defaultOptionsand merge the user's saved options on top. - For each path in
lockedOptionPaths, overwrite the merged value with the value fromdefaultOptions. A locked path without a default value is ignored. - Pull
toolsout of the merged options. Keep only tools that match an enabled entry innativeTools(or the legacynativeToolKeys) for the active protocol. - Apply the policy. Allowlist copies only paths from
defaultplus the active protocol key. Denylist keeps everything that remains. - Delete every system-blocked path. In Denylist mode, also delete the paths in
model_option_denied_paths. - Sanitize values. OpenAI
service_tierkeeps onlydefault,flex, orpriority; imagepartial_imageskeeps only 0–3; xAI video fields are normalized. - Reattach the filtered native tools under
tools.
Two consequences matter. First, optionControls is read only by the chat page to draw the parameter panel; the backend never sends it. Second, a model's defaultOptions still passes through the policy, so in allowlist mode a default is dropped unless its path is also allowlisted.
Model capabilities JSON#
The visual editor writes these fields into the model's capabilities JSON.
| Field | Type | Meaning |
|---|---|---|
defaultOptions | object | Default request parameters, nested by path. Used when the user has no saved value; the pass-through policy still applies. |
optionControls | array | Parameter panel controls. Each item is {path, type, label?, description?, options?}. type is text, select, number, or boolean; a select should include options. |
lockedOptionPaths | array | Paths locked to the defaultOptions value. The user cannot change them. |
nativeTools | array | Allowed provider-native tools. Each item is {key, protocols, type, label, enabled, defaultEnabled, payload}. |
nativeToolKeys | array | Legacy shorthand for catalog tools by key. Still read by the backend; the visual editor deletes it on save. |
promptCache | object | OpenAI prompt-cache settings: enabled, mode (implicit or explicit), and ttl (30m for explicit). Only for OpenAI Chat Completions and Responses routes. |
image.stream | boolean | Image streaming. false disables it for image routes; the default is on. |
Configure defaults and controls#
- Open Models, then create a model or edit one.
- In the model form, open Model capabilities and choose Visual config (Recommended).
- On the Parameters tab, add a row per option.
- Fill Parameter with the real option path, for example
temperature,reasoning.effort, orgenerationConfig.temperature. - Fill Default value with a JSON value. It is written to
defaultOptionsand is also used as the request default. - Fill Label and Description so the control is readable in chat.
- Choose a Type. For
select, add comma-separated Options. - Turn on Locked only when the value must stay fixed. A locked row must have a default value; the editor drops locked rows without one.
To set a default without showing a control, fill the default value and clear the label. To expose a control without a default, leave the default empty.
Use Advanced JSON only when you paste a full configuration or need a structure the form cannot express. If the model generates images, Image streaming calls toggles image.stream.
Configure native tools#
- Open Model capabilities > Official tools.
- Select a catalog tool and turn it on, or choose Custom official tool to add one.
- Fill the fields below.
| Field | Meaning |
|---|---|
| Tool key | Unique identifier, for example openai.web_search. |
| Applicable protocols | One or more protocols this definition applies to. |
| Type | Tool type sent upstream, for example web_search or code_interpreter. Required unless payload already contains type. |
| Payload JSON | Provider tool object. Must be a JSON object. |
| Default on | Adds the tool to the model's default request options. |
| Configure | Expands payload editing for the row. |
The built-in catalog covers OpenAI web_search, web_search_preview, shell, image_generation, and code_interpreter; Anthropic web_search, web_fetch, code_execution, advisor, and tool_search; xAI web_search, x_search, and code_interpreter; and Google google_search, code_execution, and url_context.
If the page warns that the current route protocol is not adapted, the definition may not fit the model's source protocol. Force enabling passes the administrator configuration, so test it before release.
When a user hand-writes options.tools, only administrator-allowed official tools are preserved. Parameters on an allowed tool pass through; unknown tools and MCP or function-style tools cannot be injected through JSON. External tools belong in MCP, not here.
Configure the pass-through policy#
Open Conversation > Option passthrough.
| Policy | Behavior | When to use |
|---|---|---|
| Allowlist | Only listed paths pass; everything else is dropped. | Production default. |
| Denylist | Everything passes except the denylist and the system blocklist. | Trusted internal users or debugging. |
| Disabled | No user options and no model defaults are sent. | Strict cost or compliance control. |
model_option_allowed_paths and model_option_denied_paths are JSON objects. Each key is a protocol; default applies to every protocol, and a protocol key adds paths for that protocol only. Paths use dot notation for nested fields, for example thinking.type or provider.order. A path with a space or an empty segment is ignored.
The system blocklist is always removed, in every mode, and cannot be allowlisted:
model, messages, input, instructions, prompt, system, systemInstruction, headers, api_key, apiKey, base_url, baseURL, stream, previous_response_id, prompt_cache_key, prompt_cache_options, prompt_cache_breakpoint, prompt_cache_retention.
Before saving, read Live preview. It lists the paths that pass (matched allowlist) and the paths that are filtered (matched denylist or system blocked). In denylist mode it shows the remaining fields as passed because they are not on the denylist.
Protocol keys#
The policy is evaluated per protocol. The current keys are:
| Key | Applies to |
|---|---|
default | Every protocol. |
openai_chat_completions | OpenAI Chat Completions. |
openai_responses | OpenAI Responses. |
openai_image_generations | OpenAI image generation. |
openai_image_edits | OpenAI image editing. |
anthropic_messages | Anthropic Messages. |
gemini_generate_content | Google Generate Content. |
google_image_generation | Google image generation. |
gemini_interactions | Google Interactions. |
xai_responses | xAI Responses. |
xai_image | xAI image generation. |
xai_image_edits | xAI image editing. |
xai_video | xAI video generation. |
xai_video_extensions | xAI video extension. |
openrouter_chat_completions | OpenRouter Chat Completions. |
openrouter_responses | OpenRouter Responses. |
openrouter_images | OpenRouter Images. |
Put a path under default only when every protocol accepts it. Otherwise scope it to the protocol. Image routes commonly allow size, quality, background, input_fidelity, output_format, and resolution; chat routes commonly allow temperature, top_p, max_tokens, and reasoning.effort.
OpenAI service_tier accepts only default, flex, or priority. Any other value is omitted before the request is sent.
Configure native tool billing#
Open Billing > Tool pricing. Turn on Native tool billing, then set a per-call price per tool.
- Prices are per call. A price of
0disables billing for that tool but still records usage. - Only successfully executed tool calls are billed; failed calls are not.
- Self-use mode records usage only.
- Free models are exempt from native tool billing, but not from MCP tool pricing.
- Model input and output produced around a tool call still follow model pricing.
- If the upstream does not report a tool call count, no separate tool charge is created.
The switch and prices are stored in billing.native_tool_billing_enabled and billing.native_tool_pricing_json.
Verify the configuration#
- In Models, run Test on the model to confirm the platform model and its sources work.
- Sign in as a normal user, start a conversation, and select the model.
- Open Model configuration and confirm the parameter controls, labels, and defaults.
- Change an allowed parameter, send a message, and confirm the result changes.
- Change a locked parameter and confirm it stays at the administrator default.
- Enable a native tool, send a message, and confirm the model can use it.
- Check the Logs and Billing for model usage, tool usage, and cost records.
For a team rollout, open a small set of low-risk paths and one or two tools first, then widen after the logs look correct.
Troubleshooting#
| Symptom | Cause | Fix |
|---|---|---|
| A parameter is missing in chat | The model has no matching optionControls, or the model is not visible to the user. | Add the control and check model status and availability. |
| A parameter is visible but has no effect | Its path is not allowed by the policy. | Check the allowlist or denylist and confirm with Live preview. |
| A model default is not sent | In allowlist mode the default path is not allowlisted. | Add the path to model_option_allowed_paths. |
| A locked parameter changes | The path has no defaultOptions value. | Give the locked path a default value. |
| A native tool is missing in chat | The tool is off, not Default on, or its protocol does not match. | Check Official tools, Applicable protocols, and Default on. |
| A tool works but is not billed | Billing is off, the price is 0, the model is free, or no tool count was returned. | Enable billing, set a price, and check usage records. |
| A user-written tool is ignored | It is not an allowed official tool, or it is MCP/function style. | Enable the official tool in the model, or configure it under MCP. |
Reference#
| Item | Key or field |
|---|---|
| Pass-through mode | chat.model_option_policy_mode (allowlist, denylist, disabled) |
| Allowlist | chat.model_option_allowed_paths |
| Denylist | chat.model_option_denied_paths |
| Native tool billing switch | billing.native_tool_billing_enabled |
| Native tool prices | billing.native_tool_pricing_json |
| Capability JSON | defaultOptions, optionControls, lockedOptionPaths, nativeTools, nativeToolKeys, promptCache, image.stream |