# @aparte/provider-openai-compat

**One** adapter for every OpenAI-compatible `/chat/completions` endpoint — OpenAI, Mistral,
OpenRouter, Z.ai, Groq, Together, LM Studio, Ollama (`/v1`) and friends all speak the same
wire format, so they share a single, **zero-dependency** format adapter. Vendors differ only
by data (base URL, auth header, branding), passed as config or picked from `presets`.

```bash
npm install @aparte/provider-openai-compat @aparte/core
```

`@aparte/core` is the only **peer dependency**; this adapter itself has none.

```ts
import { createOpenAICompatProvider, presets } from '@aparte/provider-openai-compat';
import { aparteGlobalConfig } from '@aparte/core';

aparteGlobalConfig.registerAIProvider(createOpenAICompatProvider(presets.OPENROUTER));
// …or any compat endpoint, no preset needed:
aparteGlobalConfig.registerAIProvider(createOpenAICompatProvider({ id: 'groq', baseURL: 'https://api.groq.com/openai/v1' }));
```

`@aparte/core` is a **peer dependency**. For vendors outside the OpenAI-compat family
(Anthropic, Gemini, …) use [`@aparte/provider-ai-sdk`](../ai-sdk) instead.

**Works on the server too.** Nothing here touches the DOM, and core resolves its DOM-free
entry under Node's export condition — so you can reuse this adapter from a backend, an
Electron main process or an SSR pass instead of re-writing one. Pair `buildRequest` /
`parseStream` with your own `fetch` when you already own the request (your `AbortSignal`,
your headers), or hand it to `createAparteChatHandler` from core.

> Part of the [aparté](https://github.com/apartejs/aparte) monorepo. ESM-only.
> See the **Providers** guide in the docs for the full usage.
