AsyncAPI 2.6 description of SUTRA's **chat completion streaming** surface. Two AI (Numeric) does not publish a WebSocket API for SUTRA. The only asynchronous / event-style transport documented at https://docs.two.ai/docs/getting-started and the SUTRA-V2 guide is **HTTP Server-Sent Events (SSE)** delivered over the same OpenAI-compatible REST endpoint (`POST /chat/completions`) when the request body sets `stream: true`. The docs instruct clients to send an `Accept: text/event-stream` header when streaming. SSE is a one-way, server-to-client HTTP streaming channel; it is **not** WebSocket. This AsyncAPI document models only the streamed events emitted by SUTRA's SSE response. The request body itself (model, messages, max_tokens, temperature, presence_penalty, stream) is modeled in the companion OpenAPI document at `openapi/sutra-ai-openapi.yml`.
View SpecView on GitHubArtificial IntelligenceLLMMultilingualInferenceReasoningAsyncAPIEventsWebhooksServer-Sent Events
Channels
/chat/completions
subscribestreamChatCompletionChunks
Subscribe to streamed chat completion chunks (SSE).
Chat completion SSE stream. The client opens this channel by issuing `POST /chat/completions` with `Content-Type: application/json`, `Accept: text/event-stream`, and a JSON body containing `stream: true`. The server responds with `Content-Type: text/event-stream` and emits a sequence of `data:` lines, each carrying one JSON-serialized `chat.completion.chunk` object, followed by a final `data: [DONE]` line.
Messages
✉
ChatCompletionChunk
Streamed chat completion chunk
A single SSE `data:` event carrying one JSON `chat.completion.chunk` object. Many of these are emitted per request, in order.
✉
StreamDone
Stream terminator
The literal SSE event `data: [DONE]` that marks end of stream. Not JSON; the payload is the string `[DONE]`.
Servers
https
sutraapi.two.ai/v2
SUTRA's OpenAI-compatible REST base (also documented as api.numeric.tech/v2). Chat completion streaming is delivered as HTTP Server-Sent Events over this base when `stream: true` is set on the JSON request body. AsyncAPI 2.6 does not define a dedicated SSE protocol identifier; `https` is used here and the SSE transport is documented in `info.x-transport-notes` and on each channel.
asyncapi: '2.6.0'
id: 'urn:ai:two:sutra:v2:chat-completions:sse'
info:
title: SUTRA Chat Completions Streaming (HTTP + SSE)
version: '1.0.0'
description: |
AsyncAPI 2.6 description of SUTRA's **chat completion streaming** surface.
Two AI (Numeric) does not publish a WebSocket API for SUTRA. The only
asynchronous / event-style transport documented at
https://docs.two.ai/docs/getting-started and the SUTRA-V2 guide is **HTTP
Server-Sent Events (SSE)** delivered over the same OpenAI-compatible REST
endpoint (`POST /chat/completions`) when the request body sets
`stream: true`. The docs instruct clients to send an
`Accept: text/event-stream` header when streaming. SSE is a one-way,
server-to-client HTTP streaming channel; it is **not** WebSocket.
This AsyncAPI document models only the streamed events emitted by SUTRA's
SSE response. The request body itself (model, messages, max_tokens,
temperature, presence_penalty, stream) is modeled in the companion OpenAPI
document at `openapi/sutra-ai-openapi.yml`.
contact:
name: API Evangelist
email: kin@apievangelist.com
url: https://apievangelist.com
license:
name: API documentation - Two AI
url: https://www.two.ai
x-transport-notes:
transport: HTTP Server-Sent Events (SSE)
protocol: https
direction: server-to-client (one-way)
mediaType: text/event-stream
triggeredBy: 'POST https://api.two.ai/v2/chat/completions with request body { "stream": true }'
terminator: 'data: [DONE]'
notWebSocket: true
source: https://docs.two.ai/docs/getting-started
defaultContentType: text/event-stream
servers:
sutra:
url: api.two.ai/v2
protocol: https
description: |
SUTRA's OpenAI-compatible REST base (also documented as
api.numeric.tech/v2). Chat completion streaming is delivered as HTTP
Server-Sent Events over this base when `stream: true` is set on the JSON
request body. AsyncAPI 2.6 does not define a dedicated SSE protocol
identifier; `https` is used here and the SSE transport is documented in
`info.x-transport-notes` and on each channel.
security:
- bearerAuth: []
channels:
/chat/completions:
description: |
Chat completion SSE stream. The client opens this channel by issuing
`POST /chat/completions` with `Content-Type: application/json`,
`Accept: text/event-stream`, and a JSON body containing `stream: true`.
The server responds with `Content-Type: text/event-stream` and emits a
sequence of `data:` lines, each carrying one JSON-serialized
`chat.completion.chunk` object, followed by a final `data: [DONE]` line.
bindings:
http:
type: request
method: POST
bindingVersion: '0.3.0'
x-sse:
mediaType: text/event-stream
eventField: 'data'
terminator: '[DONE]'
subscribe:
operationId: streamChatCompletionChunks
summary: Subscribe to streamed chat completion chunks (SSE).
description: |
After `POST /chat/completions` is issued with `stream: true`, the
server emits an ordered sequence of SSE `data:` events. Each `data:`
line either carries a JSON-serialized `ChatCompletionChunk` or the
literal sentinel `[DONE]` marking end of stream.
bindings:
http:
type: response
bindingVersion: '0.3.0'
message:
oneOf:
- $ref: '#/components/messages/ChatCompletionChunk'
- $ref: '#/components/messages/StreamDone'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: 'SUTRA API key'
description: |
SUTRA bearer token. Set the `Authorization: Bearer <YOUR_SUTRA_API_KEY>`
header on the `POST /chat/completions` request that opens the SSE
stream.
messages:
ChatCompletionChunk:
name: ChatCompletionChunk
title: Streamed chat completion chunk
summary: |
A single SSE `data:` event carrying one JSON `chat.completion.chunk`
object. Many of these are emitted per request, in order.
contentType: application/json
description: |
Sent as `data: {json}\n\n` on the SSE stream. The JSON object's
`object` field is always the literal string `chat.completion.chunk`.
Shape follows the OpenAI-compatible streaming response that SUTRA
implements.
payload:
$ref: '#/components/schemas/ChatCompletionChunk'
examples:
- name: openingChunk
summary: First chunk - establishes role
payload:
id: chatcmpl-abc123
object: chat.completion.chunk
created: 1750464000
model: sutra-v2
choices:
- index: 0
delta:
role: assistant
content: ''
finish_reason: null
- name: contentChunk
summary: Token delta
payload:
id: chatcmpl-abc123
object: chat.completion.chunk
created: 1750464000
model: sutra-v2
choices:
- index: 0
delta:
content: 'नमस्ते'
finish_reason: null
- name: finalChunk
summary: Final chunk - finish_reason set
payload:
id: chatcmpl-abc123
object: chat.completion.chunk
created: 1750464000
model: sutra-v2
choices:
- index: 0
delta: {}
finish_reason: stop
StreamDone:
name: StreamDone
title: Stream terminator
summary: |
The literal SSE event `data: [DONE]` that marks end of stream. Not
JSON; the payload is the string `[DONE]`.
contentType: text/plain
description: |
Clients must stop reading the stream when this sentinel is observed.
payload:
$ref: '#/components/schemas/StreamDoneSentinel'
examples:
- name: done
summary: End-of-stream sentinel
payload: '[DONE]'
schemas:
StreamDoneSentinel:
type: string
enum:
- '[DONE]'
description: |
End-of-stream sentinel. The full SSE line is `data: [DONE]`. The
payload value modeled here is the string literal `[DONE]`.
ChatCompletionChunk:
type: object
description: |
Represents a streamed chunk of a chat completion response (OpenAI
compatible).
required:
- choices
- created
- id
- model
- object
properties:
id:
type: string
description: A unique identifier for the chat completion. Each chunk has the same ID.
choices:
type: array
description: A list of chat completion choices.
items:
$ref: '#/components/schemas/ChatCompletionChunkChoice'
created:
type: integer
description: Unix timestamp (seconds) of when the chat completion was created.
model:
type: string
description: The model used to generate the completion (e.g. sutra-v2, sutra-r0).
object:
type: string
enum:
- chat.completion.chunk
description: The object type, which is always `chat.completion.chunk`.
ChatCompletionChunkChoice:
type: object
required:
- delta
- finish_reason
- index
properties:
index:
type: integer
description: The index of the choice in the list of choices.
delta:
$ref: '#/components/schemas/ChatCompletionStreamResponseDelta'
finish_reason:
type: string
nullable: true
enum:
- stop
- length
description: |
Reason the model stopped generating tokens. `stop` for natural
stop; `length` if `max_tokens` was reached. Null on all chunks
except the final chunk.
ChatCompletionStreamResponseDelta:
type: object
description: A chat completion delta generated by streamed model responses.
properties:
role:
type: string
enum:
- system
- user
- assistant
description: Role of the author of this message. Typically only emitted on the first chunk.
content:
type: string
nullable: true
description: The contents of the chunk message (token slice).
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.