Supported parameters
The wire is iso-OpenAI and the parameter surface is a documented subset. What is honored, what is accepted and inert, and what is a 400 naming itself.
chat.completions.create takes OpenAI's own request type, so TypeScript will let you set
any field OpenAI declares. What the Fleeex proxy accepts inside that request is narrower:
a large subset, but a subset. This page is the list.
It fails loudly rather than quietly. One rule decides which way a parameter goes:
A parameter that would change the answer, the billing, or a guarantee Fleeex would be implying is a
400naming that parameter, because silently dropping it would hand you a wrong answer you could not detect. A parameter that changes nothing observable is accepted and ignored, because a400there would break an integration for no benefit.
Honored
Forwarded to the model, and billed accordingly.
| Parameter | Notes |
|---|---|
model | A catalog id or an alias. See Choosing a model. |
messages | Roles system, user, assistant, tool. content is a string or an array of text / image_url parts. Includes tool_call_id on a tool message and tool_calls replayed on an assistant message. |
tools, tool_choice | tool_choice is 'auto', 'required', or { type: 'function', function: { name } }. See Function calling. |
response_format | The json_schema form. See Structured output. |
max_completion_tokens / max_tokens | Integer 1–32,768. Defaults to 1024. See below. |
temperature | 0–2. |
top_p | 0–1. |
stop | A string, or up to 4 strings. |
stream | true returns an SSE stream of iso-OpenAI chunks. See Streaming. |
stream_options.include_usage | Adds the trailing usage chunk. Requires stream: true. See Streaming usage. |
Accepted and inert
Validated, then ignored, because they change nothing observable. The OpenAI SDK, LangChain, LiteLLM and the Vercel AI SDK all send several of these by default, which is why rejecting them would cost an integration and buy nothing.
| Parameter | Accepted at | Why it changes nothing |
|---|---|---|
user | any string | The billed pair is the verified API key plus x-fleeex-user. A body field must never designate a user. |
metadata | any bounded record | Not forwarded, not stored. |
store | true or false | Fleeex retains no prompt or completion content and exposes no endpoint that could return one, so there is nothing for true to change. |
n | 1 only | One completion per request. |
logit_bias | {} only | |
frequency_penalty | 0 only | OpenAI's default, and the provider's behavior. |
presence_penalty | 0 only | Same. |
logprobs | false only | |
response_format | { type: 'text' } | OpenAI's default asks for nothing, so nothing is forwarded. |
image_url.detail | 'auto' only | OpenAI's default, and decorative. |
json_schema.strict | true or false | The provider constrains the output unconditionally, since it has no non-strict mode, so strict: false gets a stronger guarantee than OpenAI promises, never a weaker one. |
A field that is decorative only at one value pins that value rather than being waved
through: n: 1 is decorative, n: 2 asks for two completions that are not produced, and
returning one would be both a wrong answer and a billing question.
An explicit null reads as "unset" on every optional field. That is how several OpenAI
clients serialize a field they did not set, so it is normalized away rather than
forwarded.
Rejected: a 400 naming the parameter
| Parameter | Why |
|---|---|
an unsupported or disabled model | Not in the catalog. The message echoes the value you sent, not what an alias resolved to. |
seed | The provider's inference config has no seed and no portable equivalent. Accepting it silently would advertise a reproducibility Fleeex cannot deliver. |
n greater than 1 | Exactly one completion is produced per request. |
a non-empty logit_bias | Would change the output. |
a non-zero frequency_penalty / presence_penalty | Same. |
logprobs: true | Not produced. |
tool_choice: 'none' | The provider has no way to expose the tools while forbidding their use. Dropping the tools would change both the answer and the input tokens billed; ignoring the field would let the model call a tool you forbade. Send the request without tools instead. |
tool_choice without tools | Nothing to choose from. |
function.strict, and any undeclared sub-field of a tool | Not implemented; see json_schema.strict above, which is a different field. |
response_format: { type: 'json_object' } | There is no schema-less JSON mode to map onto, and every approximation is undetectably dishonest. Send a json_schema, as the message says. |
an image_url.url that is not a data: URI | Fleeex would have to fetch it server-side on the billing path. Send data:image/png;base64,…. See Vision. |
an image_url.detail other than 'auto' | low and high select a different image tokenization: they would change the answer and the tokens billed. |
stream_options without stream: true | The parameter only exists in the streaming wire. |
| anything undeclared | Including an unknown key nested inside stream_options, a tool, or json_schema. |
The message names every rejected parameter and lists the accepted ones, read off the request schema itself, so none of this has to be discovered by trial and error:
{
"error": {
"code": "BAD_REQUEST",
"message": "Unsupported parameter: 'seed'. Accepted: model, messages, max_completion_tokens, …",
"correlationId": "…"
}
}max_completion_tokens sizes the reservation
max_completion_tokens is OpenAI's current name and max_tokens the deprecated one.
Both are accepted, and the new name wins when you send both. Neither is only a cap on the
model: this number also sizes the wallet reservation Fleeex places before calling the
provider, so a needlessly large value can turn into a 402 on a wallet that would have
covered the real answer. It defaults to 1024.
Bounds
Size limits, so no single field can be arbitrarily large. All of them are a 400.
| Bound | |
|---|---|
| Request body | 1 MB (a larger body is a 413), nesting at most 32 levels deep |
messages | 1–200 entries |
content | 256,000 characters per message, or per text part; at most 20 parts |
| Images | at most 8 per request, each decoding to at most 512 KB. See Vision |
tools | at most 128; name at most 64 characters on [A-Za-z0-9_-]; description at most 4,096; parameters a JSON object, at most 16,384 serialized characters and 10 levels deep |
tool_calls | at most 32 per message; each arguments at most 32,768 characters; tool_call_id at most 128 |
json_schema | name at most 64 characters on [A-Za-z0-9_-]; schema a JSON object, at most 16,384 serialized characters and 10 levels deep; description at most 4,096 |
The always-current version
This page tracks the route's own OpenAPI description, POST /v1/chat/completions, which
is generated from the request schema and is therefore authoritative. If the two ever
disagree, the route wins.