# Other clients

# Other OpenAI-compatible clients

Anything that speaks OpenAI Chat Completions works with Hyphen. The recipe is
always the same three values:

```
Base URL   https://api.hyphen-solution.com/v1
API key    sk-hy-...
Model      m2.5 · m2.7 · m3 · text
```

Get a key at [app.hyphen-solution.com](https://app.hyphen-solution.com)
(**Dashboard → API Keys → Create**), set those three, and you're done.

## Cursor

Settings → **Models** → enable **Custom OpenAI base URL**:

- **Base URL:** `https://api.hyphen-solution.com/v1`
- **API key:** `sk-hy-...`
- Add a model named `m3` (or another Hyphen model) and select it.

## Cline

In Cline's provider settings choose **OpenAI Compatible**:

- **Base URL:** `https://api.hyphen-solution.com/v1`
- **API key:** `sk-hy-...`
- **Model ID:** `m3`

## Aider

Pass the base URL and key as flags (or the matching env vars):

```bash
aider \
  --openai-api-base https://api.hyphen-solution.com/v1 \
  --openai-api-key sk-hy-... \
  --model m3
```

Equivalent environment variables:

```bash
export OPENAI_API_BASE="https://api.hyphen-solution.com/v1"
export OPENAI_API_KEY="sk-hy-..."
aider --model m3
```

## Continue

In `~/.continue/config.json` (or the YAML config), add an OpenAI-compatible
model:

```json
{
  "models": [
    {
      "title": "Hyphen m3",
      "provider": "openai",
      "model": "m3",
      "apiBase": "https://api.hyphen-solution.com/v1",
      "apiKey": "sk-hy-..."
    }
  ]
}
```

## OpenAI SDK (raw)

```python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hyphen-solution.com/v1",
    api_key="sk-hy-...",
)
resp = client.chat.completions.create(
    model="m3",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(resp.choices[0].message.content)
```

```typescript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.hyphen-solution.com/v1",
  apiKey: "sk-hy-...",
});
const resp = await client.chat.completions.create({
  model: "m3",
  messages: [{ role: "user", content: "Hello!" }],
});
console.log(resp.choices[0].message.content);
```

:::note[Verify for your client]
Exact setting names differ between tools and versions (e.g. `OPENAI_API_BASE`
vs `OPENAI_BASE_URL`, JSON vs YAML config). The three values above never change —
consult your client's docs for where to put them.
:::

## Hitting the cap

Every client sees the same [HTTP 429](/rate-limits) with the reset date when the
monthly budget is spent. No overage.
