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:
- Curated system prompt — let Kindo prepend its operational
prompt to your
instructions. - Kindo-hosted tools — call
kindo_shell,kindo_web_search, and the rest of the Kindo tool catalog. - 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.)
1. Curated system prompt
Section titled “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 value | Behavior |
|---|---|
"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
Section titled “2. Kindo-hosted tools”You have two ways to opt in to Kindo’s hosted tools.
2a. The full bundle (kindo_tools sugar)
Section titled “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
Section titled “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 type | Purpose |
|---|---|
kindo_shell | Run a sandboxed shell command on a Kindo-managed agent workstation. |
kindo_web_search | Search the web. |
kindo_browser_control | Drive a headless browser session. |
kindo_browser_screenshot | Capture a screenshot of the current page. |
kindo_browser_list_network_requests | List network requests captured by the browser tool. |
kindo_browser_export_request_as_curl | Export a captured request as a runnable curl command. |
kindo_file_read | Read a file the agent has access to. |
kindo_file_write | Write to a file the agent has access to. |
kindo_file_list | List files in an accessible directory. |
kindo_web_download | Download a URL to the agent workspace. |
kindo_files_download_original | Fetch the original binary of a previously stored file. |
kindo_files_download_as_text | Fetch a previously stored file as decoded text. |
kindo_file_share_with_user | Share a file with a Kindo user. |
kindo_vpn_connect | Connect the agent’s network egress to an organization VPN. |
kindo_vpn_disconnect | Disconnect from the organization VPN. |
kindo_dashboard_generate | Generate a Kindo dashboard. |
kindo_dashboard_update | Update a Kindo dashboard. |
kindo_knowledge_store_search | Search 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.
3. Stateful conversations
Section titled “3. Stateful conversations”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.
conversation
Section titled “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.
previous_response_id
Section titled “previous_response_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.
Putting it together
Section titled “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
Section titled “See also”- Chat Actions overview — conceptual
overview of the three opt-ins.
/v1/chat/completionsand/v1/messagesare stock OpenAI / stock Anthropic and do not accept these extensions. - Quickstart — stock-OpenAI baseline, no extensions.
- Request shape — every standard field, plus
the
kindoblock. - Tool use — function-tool round trip; mixes with
hosted tools in the same
toolsarray.