Chat completions
POST /v1/chat/completions — generate a model response for a conversation. OpenAI-compatible request and response shapes.
Cura 1T is a research model, not a medical service, and not a substitute for a clinician. Benchmark scores do not establish safety for unsupervised clinical use.
Parameters
| Name | Type | Description | |
|---|---|---|---|
| model | string | required | Model id. Use "actava/cura-soar". |
| messages | array | required | Conversation so far. content is a string, or an array of parts for multimodal input (see Vision below). |
| temperature | number | optional | Sampling temperature. Defaults to 1. |
| max_tokens | integer | optional | Cap on generated tokens for this response — reasoning plus answer. Defaults to 32768, the model's output ceiling; larger values are accepted but capped, not rejected. |
| stream | boolean | optional | When true, responds with server-sent events (see Streaming). |
| thinking | object | optional | Reasoning controls: {"type": "enabled" | "disabled", "keep": null | "all"}. On by default (see the Thinking mode guide). |
| tools | array | optional | Function definitions the model may call (see Tool calling). |
| tool_choice | string | object | optional | "auto" (default), "none", or a specific function. |
| response_format | object | optional | {"type": "json_object"} constrains output to valid JSON (see the JSON mode guide). |
Vision
Cura 1T reasons over clinical images natively. Pass images as image_url content parts — a data: URI (base64) or an https URL.
{ "model": "actava/cura-soar", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe the abnormality in this chest X-ray." }, { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } } ] } ]}Tool calling
Declare functions with the OpenAI tools shape; the model responds with tool_calls when it decides to invoke one. Return results as tool-role messages. Cura 1T is trained for EHR/FHIR tool workflows (MedAgentBench).
{ "model": "actava/cura-soar", "messages": [{ "role": "user", "content": "Order a CBC panel for patient 1234." }], "tools": [ { "type": "function", "function": { "name": "create_lab_order", "description": "Create a lab order in the EHR", "parameters": { "type": "object", "properties": { "patient_id": { "type": "string" }, "panel": { "type": "string", "description": "e.g. CBC, BMP" } }, "required": ["patient_id", "panel"] } } } ]}Response
Cura 1T reasons before answering, and thinking is on by default: message.content carries the final answer and message.reasoning_content the chain of thought. Reasoning tokens are billed as output and count toward max_tokens — see the Thinking mode guide for disabling reasoning and preserving it across turns. usage.prompt_tokens_details.cached_tokens counts prompt tokens served from cache. Note: if generation is cut off while the model is still reasoning (finish_reason "length"), the partial trace is returned in content and reasoning_content is absent — check finish_reason before showing content to users.
{ "id": "chatcmpl-...", "object": "chat.completion", "model": "actava/cura-soar", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "...", "reasoning_content": "..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 1204, "completion_tokens": 310, "total_tokens": 1514, "prompt_tokens_details": { "cached_tokens": 1024 } }}Streaming
With "stream": true, the response is a server-sent-event stream of chat.completion.chunk objects, terminated by data: [DONE]. Deltas carry reasoning_content first, then content.
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"}}]}data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"reasoning_content":"The"}}]}data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Escalate"}}]}data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}data: [DONE]Errors
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key. |
| 404 | Unknown model id or route. |
| 429 | Rate limit exceeded — back off and retry. |
| 500 | Server error — retry with backoff. |
{ "error": { "message": "Invalid or expired API key", "type": "invalid_request_error", "param": null, "code": "invalid_api_key" }}