Fleeexdocs

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 400 naming 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 a 400 there would break an integration for no benefit.

Honored

Forwarded to the model, and billed accordingly.

ParameterNotes
modelA catalog id or an alias. See Choosing a model.
messagesRoles 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_choicetool_choice is 'auto', 'required', or { type: 'function', function: { name } }. See Function calling.
response_formatThe json_schema form. See Structured output.
max_completion_tokens / max_tokensInteger 1–32,768. Defaults to 1024. See below.
temperature0–2.
top_p0–1.
stopA string, or up to 4 strings.
streamtrue returns an SSE stream of iso-OpenAI chunks. See Streaming.
stream_options.include_usageAdds 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.

ParameterAccepted atWhy it changes nothing
userany stringThe billed pair is the verified API key plus x-fleeex-user. A body field must never designate a user.
metadataany bounded recordNot forwarded, not stored.
storetrue or falseFleeex retains no prompt or completion content and exposes no endpoint that could return one, so there is nothing for true to change.
n1 onlyOne completion per request.
logit_bias{} only
frequency_penalty0 onlyOpenAI's default, and the provider's behavior.
presence_penalty0 onlySame.
logprobsfalse only
response_format{ type: 'text' }OpenAI's default asks for nothing, so nothing is forwarded.
image_url.detail'auto' onlyOpenAI's default, and decorative.
json_schema.stricttrue or falseThe 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

ParameterWhy
an unsupported or disabled modelNot in the catalog. The message echoes the value you sent, not what an alias resolved to.
seedThe provider's inference config has no seed and no portable equivalent. Accepting it silently would advertise a reproducibility Fleeex cannot deliver.
n greater than 1Exactly one completion is produced per request.
a non-empty logit_biasWould change the output.
a non-zero frequency_penalty / presence_penaltySame.
logprobs: trueNot 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 toolsNothing to choose from.
function.strict, and any undeclared sub-field of a toolNot 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: URIFleeex 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: trueThe parameter only exists in the streaming wire.
anything undeclaredIncluding 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:

400 response
{
  "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 body1 MB (a larger body is a 413), nesting at most 32 levels deep
messages1–200 entries
content256,000 characters per message, or per text part; at most 20 parts
Imagesat most 8 per request, each decoding to at most 512 KB. See Vision
toolsat 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_callsat most 32 per message; each arguments at most 32,768 characters; tool_call_id at most 128
json_schemaname 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.