# SDKs and frameworks

NezhaGate serves both an OpenAI-compatible API and an Anthropic API, so the official SDKs only need a new base URL and key.

> https://nezhagate.com/en/docs/integrations/sdks

## Two base URLs

| Protocol | Base URL | For |
| --- | --- | --- |
| OpenAI | `https://nezhagate.com/v1` | Every chat model, plus the image and video endpoints |
| Anthropic | `https://nezhagate.com/anthropic` | Claude models (the Anthropic SDK adds `/v1/messages` itself) |

The examples read the key from the `NEZHAGATE_API_KEY` environment variable; never put a key in code.

## OpenAI SDK

```
import os
from openai import OpenAI

client = OpenAI(base_url="https://nezhagate.com/v1", api_key=os.environ["NEZHAGATE_API_KEY"])
r = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "Hello"}],
)
print(r.choices[0].message.content)
```

```
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nezhagate.com/v1", apiKey: process.env.NEZHAGATE_API_KEY });
const r = await client.chat.completions.create({
  model: "gpt-5.5",
  messages: [{ role: "user", content: "Hello" }],
});
console.log(r.choices[0].message.content);
```

The OpenAI SDK also reads the `OPENAI_BASE_URL` and `OPENAI_API_KEY` environment variables. `client.responses.create(...)` calls the Responses API, which serves the GPT models only.

## Anthropic SDK

```
import os
from anthropic import Anthropic

client = Anthropic(base_url="https://nezhagate.com/anthropic", api_key=os.environ["NEZHAGATE_API_KEY"])
m = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
)
print(next(b.text for b in m.content if b.type == "text"))
```

```
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({ baseURL: "https://nezhagate.com/anthropic", apiKey: process.env.NEZHAGATE_API_KEY });
const msg = await client.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Hello" }],
});
const first = msg.content[0];
if (first.type === "text") console.log(first.text);
```

Point `base_url` at `/anthropic`, without `/v1`. The `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY` environment variables work too.

## LangChain

```
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-5.5",
    base_url="https://nezhagate.com/v1",
    api_key=os.environ["NEZHAGATE_API_KEY"],
    use_responses_api=False,
    stream_usage=True,
)
print(llm.invoke("Hello").content)
```

```
import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
  model: "gpt-5.5",
  apiKey: process.env.NEZHAGATE_API_KEY,
  configuration: { baseURL: "https://nezhagate.com/v1" },
  useResponsesApi: false,
});
console.log((await llm.invoke("Hello")).content);
```

LangChain switches some GPT models, or requests with certain parameters, to the Responses API on its own; `use_responses_api=False` (`useResponsesApi: false` in JavaScript) keeps it on the chat endpoint. With a custom `base_url`, streaming returns no usage unless you set `stream_usage=True`.

## Vercel AI SDK

```
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";

const gw = createOpenAI({ baseURL: "https://nezhagate.com/v1", apiKey: process.env.NEZHAGATE_API_KEY });
const { text } = await generateText({ model: gw.chat("gpt-5.5"), prompt: "Hello" });
console.log(text);
```

Since AI SDK 5, `gw("model-id")` uses the Responses API; `gw.chat("model-id")` uses the chat endpoint and works with every model. With `@ai-sdk/anthropic`, set baseURL to `https://nezhagate.com/anthropic/v1` (with `/v1`).

## Troubleshooting

**404 from the OpenAI SDK**

`base_url` is missing `/v1`; it should be `https://nezhagate.com/v1`.

**404 from the Anthropic SDK**

`base_url` ends in `/v1`, so requests go to `/anthropic/v1/v1/messages`. Stop at `/anthropic`.

**A non-GPT model fails through a framework**

The framework may have switched to the Responses API, which serves GPT models only: set `use_responses_api=False` in LangChain, or use `gw.chat(...)` in the Vercel AI SDK.
