Documentation
Responses API
POST /v1/responses — OpenAI's Responses API shape on open models: input items, instructions, function tools, structured output and streaming events.
POST https://paraloncloud.com/v1/responses accepts the request the OpenAI
SDK's client.responses.create() sends and answers in the Response shape,
served by the same open models as chat completions.
Tools that moved to the Responses API, the current OpenAI SDKs, n8n's
OpenAI nodes, agent frameworks running their own tool loop, work by
changing the base URL and the key.
Request
curl https://paraloncloud.com/v1/responses \
-H "Authorization: Bearer prlc_..." \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.8-27b",
"instructions": "You are a concise assistant.",
"input": "Explain what a vector database is in two sentences.",
"reasoning": {"effort": "low"}
}'
| field | |
|---|---|
model | a chat model id from GET /v1/models |
input | a string, or an array of items (below) |
instructions | system prompt for this call |
tools | function tools: {"type": "function", "name", "description", "parameters", "strict"} |
tool_choice | auto, none, required, or {"type": "function", "name": "..."} |
text.format | {"type": "text"}, {"type": "json_object"}, or {"type": "json_schema", "name", "schema", "strict"} |
max_output_tokens, temperature, top_p, metadata, user | as in the OpenAI API |
reasoning.effort | none, minimal or low turn Qwen 3's thinking pass off; anything else leaves the model default |
stream | true for the event stream below |
chat_template_kwargs | Paralon extension, same as on chat completions; overrides reasoning |
Input items:
{"role": "user" | "assistant" | "system" | "developer", "content": "..."}or with content partsinput_text,output_text,input_image(image_urlas a data URL orhttpsURL).{"type": "function_call", "call_id", "name", "arguments"}— a call the model made in an earlier response.{"type": "function_call_output", "call_id", "output"}— what your code returned for it.
Response
{
"id": "resp_9f3c...",
"object": "response",
"created_at": 1789338310,
"status": "completed",
"model": "qwen3.8-27b",
"output": [
{"type": "message", "id": "msg_...", "status": "completed", "role": "assistant",
"content": [{"type": "output_text", "text": "A vector database ...", "annotations": []}]}
],
"usage": {"input_tokens": 31, "output_tokens": 42, "total_tokens": 73,
"input_tokens_details": {"cached_tokens": 0}, "output_tokens_details": {"reasoning_tokens": 0}},
"text": {"format": {"type": "text"}}, "tools": [], "tool_choice": "auto",
"store": false, "metadata": {}, "error": null, "incomplete_details": null
}
A function call comes back as an output item of type function_call with
call_id, name and arguments (a JSON string); send its result in the
next request as a function_call_output item with the same call_id.
status is incomplete with incomplete_details.reason = "max_output_tokens" when the answer was cut by max_output_tokens.
The SDKs' response.output_text convenience property is computed on the
client from the output items; it works as usual.
Streaming
With "stream": true the endpoint sends server-sent events, each with an
event: line and a data: JSON that carries type and sequence_number,
in the OpenAI order: response.created, response.in_progress,
response.output_item.added, response.content_part.added, one
response.output_text.delta per token, response.output_text.done,
response.content_part.done, response.output_item.done, and finally
response.completed (or response.incomplete) with the full response and
usage. Function calls stream as response.output_item.added (type
function_call), response.function_call_arguments.delta,
response.function_call_arguments.done, response.output_item.done. An
interrupted generation ends with response.failed and an error event.
from openai import OpenAI
client = OpenAI(base_url="https://paraloncloud.com/v1", api_key="prlc_...")
with client.responses.stream(model="qwen3.8-27b", input="Count to five.",
reasoning={"effort": "low"}) as stream:
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="")
Not supported
These answer 400 invalid_request_error with the parameter named, rather
than being silently ignored:
previous_response_idand server-side conversation state: nothing is stored; send the wholeinputeach time, earlier items included.- Built-in tools:
web_search_preview,file_search,code_interpreter, computer use. Function tools only. background: true.
Billing and limits
Same as chat completions: input and output tokens at the model's price,
from the same credits, under the same per-minute and in-flight limits
(billing). Reasoning tokens count as output tokens; set
reasoning.effort to low when you do not need the thinking pass.