# OpenAI compatibility

> What Lyber supports from the OpenAI API, and what it rejects.

Source: https://www.lyber.ai/docs/api/compatibility/ · Markdown: https://www.lyber.ai/docs/md/api/compatibility.md

Lyber rejects what it doesn't support with `400` instead of ignoring it, so a request never silently runs differently from what you asked.

## Features

| Feature | Support |
| --- | --- |
| Chat Completions | Yes |
| Streaming | Yes. Usage with `stream_options.include_usage`. |
| Tool calling | Yes. Function tools only. |
| Reasoning effort | Yes. Values differ per model. |
| Image inputs | Accepted (preview). Image understanding isn't qualified yet. |
| Responses API | Preview, stateless. |
| Structured outputs and JSON mode (`response_format`) | No |
| Prompt caching | No. Every input token bills at the input rate. |
| Web search, web fetch and other hosted tools | No |
| Embeddings, audio, image generation | No |
| Legacy Completions (`/v1/completions`) | No |
| Anthropic Messages (`/v1/messages`) | No |
| Token counting | No endpoint. `usage` reports the counts after each request. |

## Chat Completions parameters

| Accepted | Rejected with 400 |
| --- | --- |
| `model` `messages` `max_tokens` `max_completion_tokens` `temperature` `top_p` `stop` `stream` `stream_options` `tools` `tool_choice` `reasoning_effort` `thinking_token_budget` (DeepSeek) `max_cost_micro_usdc` | `n` `seed` `logprobs` `top_logprobs` `presence_penalty` `frequency_penalty` `logit_bias` `user` `response_format` `parallel_tool_calls` `prompt_cache_key` and any other field |
