# SDK와 프레임워크

NezhaGate는 OpenAI 호환 API와 Anthropic API를 모두 제공하므로, 공식 SDK는 기본 URL과 키만 새로 설정하면 됩니다.

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

## 두 가지 기본 URL

| 프로토콜 | Base URL | 용도 |
| --- | --- | --- |
| OpenAI | `https://nezhagate.com/v1` | 모든 채팅 모델, 그리고 이미지·영상 엔드포인트 |
| Anthropic | `https://nezhagate.com/anthropic` | Claude 모델(Anthropic SDK가 `/v1/messages`를 자동으로 붙입니다) |

예제는 `NEZHAGATE_API_KEY` 환경 변수에서 키를 읽습니다. 키를 코드에 직접 적지 마세요.

## 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);
```

OpenAI SDK는 `OPENAI_BASE_URL`과 `OPENAI_API_KEY` 환경 변수도 읽습니다. `client.responses.create(...)`는 Responses API를 호출하며, 이 API는 GPT 모델만 제공합니다.

## 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);
```

`base_url`은 `/v1` 없이 `/anthropic`까지만 지정하세요. `ANTHROPIC_BASE_URL`과 `ANTHROPIC_API_KEY` 환경 변수도 쓸 수 있습니다.

## 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은 일부 GPT 모델이나 특정 파라미터가 있는 요청을 자동으로 Responses API로 전환합니다. `use_responses_api=False`(JavaScript는 `useResponsesApi: false`)로 설정하면 채팅 엔드포인트를 그대로 씁니다. 사용자 지정 `base_url`을 쓸 때는 `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);
```

AI SDK 5부터는 `gw("model-id")`가 Responses API를 사용합니다. `gw.chat("model-id")`는 채팅 엔드포인트를 사용하며 모든 모델에서 동작합니다. `@ai-sdk/anthropic`을 쓸 때는 baseURL을 `https://nezhagate.com/anthropic/v1`(`/v1` 포함)로 설정하세요.

## 자주 나오는 오류

**OpenAI SDK에서 404가 날 때**

`base_url`에 `/v1`이 빠졌습니다. `https://nezhagate.com/v1`이어야 합니다.

**Anthropic SDK에서 404가 날 때**

`base_url`이 `/v1`로 끝나서 요청이 `/anthropic/v1/v1/messages`로 전송됩니다. `/anthropic`까지만 입력하세요.

**프레임워크를 통한 호출에서 GPT가 아닌 모델이 실패할 때**

프레임워크가 GPT 모델만 제공하는 Responses API로 전환되었을 수 있습니다. LangChain에서는 `use_responses_api=False`를 설정하고, Vercel AI SDK에서는 `gw.chat(...)`을 쓰세요.
