Skip to content

Responses API — Chat Actions extensions

By default, POST /v1/responses behaves like stock OpenAI Responses — no hidden system prompt, no auto-injected tools, no server-side state. Chat Actions are three orthogonal opt-ins layered on top:

  1. Curated system prompt — let Kindo prepend its operational prompt to your instructions.
  2. Kindo-hosted tools — call kindo_shell, kindo_web_search, and the rest of the Kindo tool catalog.
  3. Stateful conversations — let Kindo persist responses server-side so subsequent turns chain off them.

Each is independent. Mix and match.

1. Curated system prompt

{
"model": "claude-sonnet-4-5-20250929",
"input": "Investigate the crashloop on api-prod-2.",
"kindo": { "system_prompt": "agent_default" }
}
kindo.system_prompt valueBehavior
"agent_default"Kindo prepends its curated operational prompt to whatever you send in instructions.
"off" (default)No prepend. Your instructions flow through verbatim.

If you also pass instructions, Kindo prepends its prompt and your instructions flow after it. Use this when you want Kindo’s curated agent behavior on top of your own task guidance.

2. Kindo-hosted tools

You have two ways to opt in to Kindo’s hosted tools.

2a. The full bundle (kindo_tools sugar)

{
"model": "claude-sonnet-4-5-20250929",
"input": "...",
"tools": [{ "type": "kindo_tools" }]
}

{type: "kindo_tools"} is documented sugar. At request time Kindo expands it into the current set of individual kindo_<name> entries the model can call.

2b. Individual tools

Pick the ones you actually want:

{
"model": "claude-sonnet-4-5-20250929",
"input": "...",
"tools": [{ "type": "kindo_shell" }, { "type": "kindo_web_search" }]
}

The full hosted-tool catalog:

Tool typePurpose
kindo_shellRun a sandboxed shell command on a Kindo-managed agent workstation.
kindo_web_searchSearch the web.
kindo_browser_controlDrive a headless browser session.
kindo_browser_screenshotCapture a screenshot of the current page.
kindo_browser_list_network_requestsList network requests captured by the browser tool.
kindo_browser_export_request_as_curlExport a captured request as a runnable curl command.
kindo_file_readRead a file the agent has access to.
kindo_file_writeWrite to a file the agent has access to.
kindo_file_listList files in an accessible directory.
kindo_web_downloadDownload a URL to the agent workspace.
kindo_files_download_originalFetch the original binary of a previously stored file.
kindo_files_download_as_textFetch a previously stored file as decoded text.
kindo_file_share_with_userShare a file with a Kindo user.
kindo_vpn_connectConnect the agent’s network egress to an organization VPN.
kindo_vpn_disconnectDisconnect from the organization VPN.
kindo_dashboard_generateGenerate a Kindo dashboard.
kindo_dashboard_updateUpdate a Kindo dashboard.
kindo_knowledge_store_searchSearch a Kindo knowledge store.

Tool types not in this list are forwarded verbatim to LiteLLM (passthrough) — useful when a new upstream tool type ships before our docs do.

You can mix Kindo-hosted tools with stock OpenAI types (function, mcp, web_search, file_search, computer, …) in the same tools array. tool_choice (including allowed_tools) applies uniformly.

3. Stateful conversations

Stock OpenAI Responses on /v1/responses is stateless by default. Kindo currently offers one form of stateful continuation (conversation); previous_response_id is reserved for future support and rejected today with 400 unsupported_parameter.

conversation

{
"model": "claude-sonnet-4-5-20250929",
"input": "Continue the investigation.",
"store": true,
"conversation": "conv_xyz789"
}

conversation is the Kindo-managed equivalent and is what the existing /v1/responses flow returns in response.conversation.id.

Future: previous_response_id

previous_response_id is not yet supported. It is accepted by the schema for forward-compatibility, but the handler rejects it with 400 unsupported_parameter. Use conversation to continue an existing exchange.

conversation is the only supported continuation mechanism. It is a request-grouping tag — you must still re-send prior turns in input on each request. Use it when you have an existing Kindo-managed conversation ID; otherwise, start a new request without it and use the returned conversation.id for subsequent turns.

Putting it together

If you previously relied on tools: [{type: "kindo_tools"}] as a mode switch that implicitly turned on the curated prompt and statefulness, this is the equivalent explicit recipe:

{
"model": "claude-sonnet-4-5-20250929",
"input": "...",
"store": true,
"kindo": { "system_prompt": "agent_default" },
"tools": [{ "type": "kindo_tools" }]
}

Three opt-ins, all visible in the request body. None are implicit.

See also

  • Chat Actions overview — conceptual overview of the three opt-ins. /v1/chat/completions and /v1/messages are stock OpenAI / stock Anthropic and do not accept these extensions.
  • Quickstart — stock-OpenAI baseline, no extensions.
  • Request shape — every standard field, plus the kindo block.
  • Tool use — function-tool round trip; mixes with hosted tools in the same tools array.