> For clean Markdown of any page, append `.md` to the page URL. > For a complete documentation index, see https://docs.sarvam.ai/llms.txt. > For full documentation content in one file, see https://docs.sarvam.ai/llms-full.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.sarvam.ai/_mcp/server. # Responses API > Create stateless text, reasoning, structured-output, and tool-calling responses with Sarvam's OpenAI-compatible Responses API. The Responses API provides an OpenAI-compatible interface for text generation, reasoning, structured output, and tool calling. **Streaming is optional**: the same pattern as [Chat Completion V2](/api-reference/chat/chat-completions-v2): omit `stream` or set it to `false` for one JSON response (default). > **Note** > > The Responses API is available in **beta** with `sarvam-105b`, `glm5.3`, `gemma4`, and > `deepseekv4-flash`. Access is granted per API key, [contact us](/api/getting-started/help) to request access. ## Create a response Use [`POST /v2/responses`](/api-reference/responses/create). The endpoint is **stateless**: send the complete conversation in `input` on every request. Omit `store` or set it to `false` (`true` returns **`400`**). Nothing is stored for later retrieval, `GET /v2/responses/{id}` returns **`404`**. `GET /v2/responses` and `DELETE /v2/responses/{id}` return **`405`** (documented in the [API Reference](/api-reference/responses/create) alongside `POST /v2/responses`). #### Python ```python from sarvamai import SarvamAI client = SarvamAI(api_subscription_key="YOUR_SARVAM_API_KEY") response = client.responses.create( model="glm5.3", input="Explain database indexing in three short points.", store=False, ) print(response.output) ``` #### JavaScript ```javascript import { SarvamAIClient } from "sarvamai"; const client = new SarvamAIClient({ apiSubscriptionKey: "YOUR_SARVAM_API_KEY", }); async function main() { const response = await client.responses.create({ model: "glm5.3", input: "Explain database indexing in three short points.", store: false, }); console.log(response.output); } main(); ``` #### cURL ```bash curl -X POST https://api.sarvam.ai/v2/responses \ -H "api-subscription-key: $SARVAM_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "glm5.3", "input": "Explain database indexing in three short points.", "store": false }' ``` > **Note** > > The examples above do **not** set `stream`. That returns a single JSON body (**HTTP 200**), > same as Chat Completion V2 when `stream` is omitted. Only add `"stream": true` when you > want server-sent events. ## Stream a response (optional) Set `stream` to `true` when you want named server-sent events instead of one JSON body. Streams end with `response.completed`, `response.incomplete`, or `response.failed`; they do **not** emit a `[DONE]` sentinel. On `glm5.3`, streamed items can **nest**: pair events by `item_id`. Usage appears on the terminal event (there is no `stream_options`). #### Python ```python from sarvamai import SarvamAI client = SarvamAI(api_subscription_key="YOUR_SARVAM_API_KEY") stream = client.responses.create( model="glm5.3", input="Explain database indexing in three short points.", store=False, stream=True, ) for event in stream: print(event.type) ``` #### JavaScript ```javascript import { SarvamAIClient } from "sarvamai"; const client = new SarvamAIClient({ apiSubscriptionKey: "YOUR_SARVAM_API_KEY", }); async function main() { const stream = await client.responses.create({ model: "glm5.3", input: "Explain database indexing in three short points.", store: false, stream: true, }); for await (const event of stream) { console.log(event.type); } } main(); ``` #### cURL ```bash curl -N -X POST https://api.sarvam.ai/v2/responses \ -H "api-subscription-key: $SARVAM_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "glm5.3", "input": "Explain database indexing in three short points.", "store": false, "stream": true }' ``` ## Continue a conversation The endpoint does not store response state. To continue a conversation, send the prior messages and outputs again in `input`. Do not use `previous_response_id` or `conversation` , both return **`400`**. ```python from sarvamai import SarvamAI client = SarvamAI(api_subscription_key="YOUR_SARVAM_API_KEY") response = client.responses.create( model="gemma4", input=[ {"role": "user", "content": "Name one advantage of a B-tree index."}, {"role": "assistant", "content": "It keeps lookups efficient as data grows."}, {"role": "user", "content": "When should I avoid one?"}, ], store=False, ) ``` For message parts in `input`, text uses `{"type": "input_text", "text": "…"}` (not chat completions' `{"type": "text"}`). ## Reasoning (`glm5.3`, `deepseekv4-flash`) Both reasoning models support three modes, `low`, `high`, and `max`, and Chat Completion V2 accepts all three directly for both. On this route (Responses), the two models differ: | Model | Accepted `reasoning.effort` values on this route | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | | `glm5.3` | `"low"` or `"high"` only. To get `max`-level reasoning, omit the `reasoning` field entirely, the literal string `"max"` returns `400`. | | `deepseekv4-flash` | `"low"`, `"high"`, or `"max"`, all three work directly, same as on chat. | **Chat trace:** `choices[].message.reasoning_content`. **Responses trace:** on `glm5.3`, a **`reasoning` item** is always in `output`. Read **`summary[0].text`** (`content` is **`null`**). Optional **`reasoning.summary`**: `auto` or `detailed`. Reasoning tokens count toward **`max_output_tokens`**, which has **no default cap** on this route, omitting it means unbounded generation. On chat, the equivalent budget is **`max_tokens`**, which does default to `2048` when omitted. See the [Chat Completion V2 API Reference](/api-reference/chat/chat-completions-v2). ## Defaults when omitted (`glm5.3`) | Field | Default when omitted | | ------------------- | -------------------------------- | | `temperature` | `1` | | `top_p` | `0.95` | | `max_output_tokens` | No default, unbounded generation | | `stream` | `false` | ## Parameters | Parameter | Required | Description | | --------------------- | -------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `model` | Yes | `sarvam-105b`, `glm5.3`, `gemma4`, or `deepseekv4-flash`. | | `input` | Yes | A prompt string or the complete conversation as input items. | | `stream` | No | Optional, omit or `false` for one JSON body (default **`false`** on `glm5.3`); `true` for named SSE events, same pattern as chat completions. | | `max_output_tokens` | No | Cap on generated tokens including reasoning. **No default**: omitting it means unbounded generation. Always set this explicitly in production. | | `temperature` | No | `0`–`2`; default **`1`** on `glm5.3`. | | `top_p` | No | Default **`0.95`** on `glm5.3`; must be > `0`. | | `top_k` | No | Omit or `-1` to disable on `glm5.3`; `0` is rejected. | | `reasoning` | No | Optional on reasoning models; on `glm5.3` a reasoning item is always returned regardless. `effort` accepts `"low"` or `"high"` on `glm5.3` (omit for `max`, the string `"max"` is `400`), or all three values directly on `deepseekv4-flash`. `summary` accepts `"auto"` or `"detailed"`. | | `text` | No | Output format (`text`, `json_object`, `json_schema`). If you send `text`, `format` is required. | | `tools` | No | **Flat** function tools (`name` at the top level). Nested chat tool shape is **`400`**. | | `tool_choice` | No | `auto`, `none`, `required`, or a named function. | | `parallel_tool_calls` | No | Not currently enforced on this route for any tool-calling model. **`false`** is accepted without error but does not force one call at a time. | | `n` | No | **Ignored**: Responses always returns one output (SDK compatibility only). | | `store` | No | Must be omitted or `false`. | ### Refused or unsupported on this route These return **`400`** (the error names the field): `store: true`, `background: true`, `previous_response_id`, `conversation`, `max_tool_calls`, `prompt`, `item_reference`. On Responses, `logprobs`, `top_logprobs`, `min_p`, and `repetition_penalty` may be accepted and echoed without changing output. On Chat Completion V2, `logprobs` and `top_logprobs` are supported on `sarvam-105b` and `gemma4`. They aren't supported on `glm5.3`, which returns a clean `400`, or on `deepseekv4-flash`, which returns a `503 model_overloaded` instead of a clean rejection, omit the field for that model. See [Chat Completion V2](/api-reference/chat/chat-completions-v2) for details. See the [Responses API Reference](/api-reference/responses/create) for the complete request, response, error, and streaming-event schemas. Model-specific limits for `glm5.3` are also summarized on the [GLM-5.3 model page](/api/getting-started/models/openweight/glm-5-3). > Create stateless text, reasoning, structured-output, and tool-calling responses with Sarvam's OpenAI-compatible Responses API.