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. (If you find yourself combining all three to recreate one of your stored agents, invoke the agent itself instead: model: "agent/<agent-id>" — see Invoke Kindo agents.)

{
"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.

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

{
"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.

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. Note that mcp tools require the stateful path (store: true or conversation — see Stateful conversations); stateless requests including them are rejected with 400 unsupported_tool_type.

Stock OpenAI Responses on /v1/responses is stateless by default. Kindo offers two forms of stateful continuation: conversation (the Kindo-managed conversation ID) and previous_response_id (chain from a previous stored response, as the OpenAI SDK and Codex do by default). They are mutually exclusive — two spellings of the same continuation intent.

{
"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.

{
"model": "claude-sonnet-4-5-20250929",
"input": "Continue the investigation.",
"previous_response_id": "resp_xyz789_1"
}

Pass the id of a previous stored response (one created with store: true or conversation) to continue the conversation that produced it — this is how the OpenAI SDK and Codex chain turns by default. It is equivalent to passing that conversation’s ID via conversation, and the two parameters are mutually exclusive (400 mutually_exclusive_parameters if both are set). Unknown, inaccessible, or unstored response IDs return 404 previous_response_not_found — stateless responses are never persisted, so their IDs cannot be chained. Kindo conversations are linear: chaining from an older response continues the full conversation history rather than forking at that response.

With either continuation mechanism the full prior history is loaded server-side and sent to the model — send only the new turn in input. Use conversation when you have a Kindo-managed conversation ID; use previous_response_id when you have the last response’s ID (the OpenAI-native pattern); otherwise start a new request with store: true and use the returned conversation.id or response id for subsequent turns.

Long stored conversations are compacted automatically. When the accumulated history approaches the model’s context window, Kindo summarizes earlier turns server-side before sending the conversation to the model, so a long-running stored conversation keeps working without manual truncation on your side. Compaction is applied transparently — it does not change the response shape or emit a separate streaming event.

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.

  • 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.