Documentation

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
modela chat model id from GET /v1/models
inputa string, or an array of items (below)
instructionssystem prompt for this call
toolsfunction tools: {"type": "function", "name", "description", "parameters", "strict"}
tool_choiceauto, 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, useras in the OpenAI API
reasoning.effortnone, minimal or low turn Qwen 3's thinking pass off; anything else leaves the model default
streamtrue for the event stream below
chat_template_kwargsParalon extension, same as on chat completions; overrides reasoning

Input items:

  • {"role": "user" | "assistant" | "system" | "developer", "content": "..."} or with content parts input_text, output_text, input_image (image_url as a data URL or https URL).
  • {"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_id and server-side conversation state: nothing is stored; send the whole input each 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.