Skip to content

Differences from OpenAI

Nodea runs open models on your own devices, so some behavior differs from OpenAI’s hosted API. If you’re moving code from OpenAI, check this list.

  • Only Chat Completions and Models. There’s no Responses API, legacy Completions, embeddings, images, audio, files, batches or fine-tuning.
  • Text only. Image, audio and file inputs and audio output aren’t supported.
  • The models are the ones you enable. OpenAI model names like gpt-4o don’t exist. Use a model name from your Models page.
  • stop keeps the stop text. OpenAI cuts the output just before the stop sequence; Nodea includes it at the end. Strip it yourself if needed.
  • seed is ignored. Use temperature: 0 for repeatable output.
  • usage can be missing. Token counts come from the device. If it doesn’t report them, usage is left out rather than estimated. With n > 1, completion_tokens counts one choice, not all of them.
  • refusal is always null, and there’s no content moderation, so finish_reason is never "content_filter".
  • tool_choice supports "auto" and "none". "required" and naming a specific function return 400.
  • parallel_tool_calls: false isn’t supported. The model may return several tool calls at once.
  • With tool_choice: "none", some models still write out a tool call as plain text in content.
  • Alongside a correct tool call, content may contain leftover formatting from the model’s chat template. Rely on tool_calls, not content, when finish_reason is "tool_calls".
  • In streaming, tool calls arrive complete in one chunk instead of incrementally.
  • How well tools work depends on the model. Smaller models are less reliable.
  • With response_format set to json_schema, the output is constrained to the schema during generation, so it always matches.
  • Generation can continue past the end of the JSON until it hits the token limit, giving finish_reason: "length" even though the JSON is complete. Set a reasonable max_completion_tokens.
  • logit_bias token ids refer to the model’s own tokenizer. Bias maps built for OpenAI’s tokenizer won’t do what you expect.
  • reasoning_effort accepts only "low", "medium" and "high".
  • Fields Nodea ignores are listed in the x-nodea-ignored-params response header. See Ignored.
  • One response at a time per device. To handle more requests at once, add devices. See How devices get models.
  • Requests can wait for a device. If no device is serving the model, a request waits up to 120 seconds before failing with 503 model_unavailable.
  • No rate limits, so no 429 responses or x-ratelimit-* headers.
  • Completions aren’t stored. store and metadata are ignored, and there’s no API to retrieve past completions.