Skip to content

Responses API request shape

POST /v1/responses accepts the OpenAI Responses request body. The goal is bit-for-bit compatibility with stock OpenAI clients — anything you’d send to OpenAI’s /v1/responses you can send to Kindo’s, with the same semantics.

This page documents what Kindo recognizes and how each field is forwarded.

Required fields

FieldTypeNotes
modelstringA model ID from GET /v1/models.
inputstring | array of input itemsPlain string for single-turn, or array for multi-message / tool round trips.

input array items

Each item is one of:

typeRequired fieldsNotes
messagerole, contentrole is user, system, assistant, or developer. developer is treated as a system-level instruction (matches OpenAI semantics).
function_callcall_id, name, argumentsAccepted for conversation-history round-tripping. Re-sending one does not re-execute it.
function_call_outputcall_id, outputReturns a function tool’s result; pair it with the originating function_call.call_id.

Standard fields

Every field below is forwarded verbatim unless a row says otherwise. Behavior matches OpenAI’s published spec.

FieldTypeForwarded?Notes
instructionsstringYesSystem-level instructions. Flow through unmodified by default.
toolsarrayYesMix function, mcp, and any kindo_* tools. Unknown types are forwarded verbatim.
tool_choicestring | objectYes"auto", "none", "required", {type: "function", name: "..."}, or {type: "allowed_tools", ...}.
streambooleanConsumed by the route handler to switch into SSE mode (see Streaming).
storebooleanYesWhen true, Kindo persists the response and returns a conversation.id. Default false.
previous_response_idstringNot yet supported. Rejected with 400 unsupported_parameter. Use conversation to continue an existing exchange.
conversationstringYesRequest-grouping tag for an existing Kindo-managed conversation ID. Prior turns must be re-sent in input on each request.
parallel_tool_callsbooleanYesForwarded to the upstream model.
prompt_cache_keystringYesForwarded; used by upstream providers that support prompt caching.
reasoningobjectYesOpenAI reasoning controls (e.g. effort).
textobjectYesOpenAI text-output controls (e.g. format, verbosity).
includearray of stringsYesRequest additional output items (e.g. encrypted reasoning content).
truncationstringYesOpenAI truncation policy.
backgroundbooleanYesOpenAI background-execution flag.
service_tierstringYesOpenAI service-tier hint.
max_output_tokensintegerYesStandard sampling control.
temperaturenumberYesStandard sampling control.
top_pnumberYesStandard sampling control.
nintegerYesStandard sampling control.
stopstring | arrayYesStandard sampling control.
metadataobjectStored onlyEchoed back in the response object. Not forwarded to the model layer.

Anything not listed above passes through Kindo’s schema verbatim, so new OpenAI-spec additions land at Kindo automatically when supported by the upstream model.

Stripped-on-ingress fields

Kindo strips these fields from the outgoing upstream request to prevent governance-metadata spoofing:

  • metadata
  • litellm_metadata
  • proxy_server_request

(metadata is stored and echoed back in the response; it is not forwarded to the model layer — see the row above.)

Response store pruning

When store: true, Kindo persists the response object so it can be fetched later via GET /v1/responses/{id}. Stored responses are not kept indefinitely — once a response is pruned (whether by retention policy expiry or explicit deletion), subsequent fetches by ID return 404 not_found with no error.code set. This is the same status the endpoint returns for IDs that never existed; the two cases are not distinguished in the response envelope.

If you need durable access to a response body, capture it from the original POST /v1/responses call rather than relying on the stored copy.

See the 404 row in the errors table for the matching error envelope.

Kindo extension fields

These are opt-in and documented in detail at Chat Actions extensions:

FieldTypeNotes
kindo.system_prompt"agent_default" | "off"When "agent_default", Kindo prepends its curated operational prompt to your instructions. Default "off".
tools[].type: "kindo_tools"sugar entryExpands at request time to the current set of individual kindo_<name> entries.
tools[].type: "kindo_<name>"individual hosted-tool entryE.g. kindo_shell, kindo_web_search. See Chat Actions extensions for the full list.

The kindo block and kindo_* tool types are the only Kindo-specific additions to the request body. Everything else on this page is stock OpenAI Responses.

Worked example

{
"model": "claude-sonnet-4-5-20250929",
"input": [
{
"type": "message",
"role": "developer",
"content": "You are a concise security assistant."
},
{ "type": "message", "role": "user", "content": "Summarize CVE-2024-3094." }
],
"tools": [
{
"type": "function",
"name": "lookup_cve",
"description": "Fetch CVE metadata.",
"parameters": {
"type": "object",
"properties": { "id": { "type": "string" } },
"required": ["id"]
}
}
],
"tool_choice": "auto",
"store": true,
"max_output_tokens": 512,
"temperature": 0.2
}

This request is stock OpenAI Responses. Kindo accepts it identically to OpenAI’s /v1/responses, plus persists the response and returns a conversation.id because store: true is set.

See also