# Node.js: 오픈 가중치 모델을 향하도록 설정한 openai 패키지

> 공식 openai 패키지로 Node.js에서 오픈 가중치 LLM을 호출하세요: 단일 호출, 동시성 제한 배치, 스트리밍, 남은 크레딧까지. 복사-붙여넣기 예제.

- URL: https://llmwithcrypto.com/ko/docs/node/
- 마지막 업데이트: 2026-10-23
- 발행자: LLMwithCrypto (https://llmwithcrypto.com)

공식 `openai` npm 패키지는 변경 없이 작동합니다: `baseURL`과 키를 전달하기만 하면 됩니다. 아래 예제는 Node.js 18 이상용 ES 모듈이며, 이 버전에는 `fetch`과 최상위 `await`이 내장되어 있습니다.

**빠른 답변 — Node.js에서 LLMwithCrypto을 어떻게 호출하나요?**

`npm install openai`으로 공식 패키지를 설치한 다음, `baseURL: "https://llmwithcrypto.com/api/v1"`과 `apiKey: process.env.LLMWITHCRYPTO_API_KEY`로 클라이언트를 생성하세요. **LLMwithCrypto**는 2026년 10월 23일 기준 문서화된 대로, 12개의 오픈 가중치 모델에 대해 OpenAI 형식으로 `client.chat.completions.create()`에 응답하며, 모델이 지원하는 경우 스트리밍과 툴 호출도 제공합니다.

## 필요한 것

| 속성 | 값 |
| --- | --- |
| Node.js | 18 이상, ES 모듈 (`.mjs` 또는 `"type": "module"`) |
| 패키지 | `openai` (공식) |
| Base URL | `https://llmwithcrypto.com/api/v1` |
| Key | 코드나 브라우저가 아니라 환경 변수 `LLMWITHCRYPTO_API_KEY`에 넣으세요 |

## 요청 하나는 어떻게 보내나요?

클라이언트는 시작할 때 한 번만 만들고 어디서든 재사용하세요. 키는 서버에 두세요. 브라우저 코드에 넣은 키는 페이지를 연 사람 누구나 읽을 수 있으므로, 백엔드에서 API를 호출하고 브라우저에는 답변만 보내세요.

*one-call.mjs*

```javascript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://llmwithcrypto.com/api/v1',
  apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});

const resp = await client.chat.completions.create({
  model: 'deepseek-v4-pro',
  messages: [
    { role: 'system', content: 'Answer in two sentences.' },
    { role: 'user', content: 'What is a context window?' },
  ],
  max_tokens: 200,
});
console.log(resp.choices[0].message.content);
console.log(resp.usage.prompt_tokens, 'in,', resp.usage.completion_tokens, 'out');

```

## rate limit에 걸리지 않고 배치는 어떻게 실행하나요?

한 번에 정해진 수의 요청만 실행하세요. 아래의 작은 `mapLimit` 헬퍼는 동시에 네 개를 유지하고 결과를 순서대로 반환하며, 추가 패키지가 필요하지 않습니다. 모든 계정에는 분당 요청 및 토큰 한도가 있으며 대시보드에 표시됩니다. 지원팀에 요청하면 한도를 올릴 수 있습니다.

*batch.mjs*

```javascript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://llmwithcrypto.com/api/v1',
  apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});

async function translate(text) {
  const resp = await client.chat.completions.create({
    model: 'qwen3-235b-a22b-instruct-2507',
    messages: [
      { role: 'system', content: 'Translate into Spanish. Reply with the translation only.' },
      { role: 'user', content: text },
    ],
    max_tokens: 200,
  });
  return resp.choices[0].message.content;
}

// at most 4 requests in flight
async function mapLimit(items, limit, fn) {
  const out = new Array(items.length);
  let next = 0;
  async function worker() {
    while (next < items.length) {
      const i = next++;
      out[i] = await fn(items[i]);
    }
  }
  await Promise.all(Array.from({ length: limit }, worker));
  return out;
}

const lines = ['Your order has shipped.', 'Your payment was received.', 'Your key was revoked.'];
console.log(await mapLimit(lines, 4, translate));

```

## 답변은 어떻게 스트리밍하나요?

`stream: true`을 전달하고 결과에 `for await`을 사용하세요. 각 청크는 `choices[0].delta.content`에 텍스트 조각을 담고, `stream_options: { include_usage: true }`을 쓰면 마지막 청크에 토큰 수가 들어 있습니다.

*stream.mjs*

```javascript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://llmwithcrypto.com/api/v1',
  apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});

const stream = await client.chat.completions.create({
  model: 'deepseek-v4.1-flash',
  messages: [{ role: 'user', content: 'Write a haiku about latency.' }],
  stream: true,
  stream_options: { include_usage: true },
  max_tokens: 120,
});
for await (const chunk of stream) {
  const text = chunk.choices[0]?.delta?.content;
  if (text) process.stdout.write(text);
  if (chunk.usage) console.log(`\n${chunk.usage.prompt_tokens} in, ${chunk.usage.completion_tokens} out`);
}

```

## 남은 크레딧은 어떻게 확인하나요?

크레딧 endpoint는 OpenAI SDK에 포함되어 있지 않으므로 `fetch`로 호출하세요. 이 호출은 무료이며, 큰 배치 전에 호출하면 크레딧으로 감당할 수 있는지 확인할 수 있습니다.

*credits.mjs*

```javascript
const res = await fetch('https://llmwithcrypto.com/api/v1/credits', {
  headers: { Authorization: `Bearer ${process.env.LLMWITHCRYPTO_API_KEY}` },
});
const credits = await res.json();
console.log('credit left:', credits.balance_usd, 'USD');

```

## 오류는 어떻게 처리하나요?

SDK는 모든 HTTP 오류에 대해 `OpenAI.APIError`를 발생시키며, 상태 코드는 `err.status`에, 본문의 `code`는 `err.code`에 담깁니다. 메시지가 아니라 코드를 확인하세요. `insufficient_balance`은 충전하라는 뜻이고, `model_not_found`은 잘못된 id라는 뜻이며, `rate_limit_exceeded`은 기다렸다가 재시도하라는 뜻입니다.

SDK는 이미 일부 오류를 잠시 멈춘 뒤 두 번 재시도합니다(`maxRetries`). 긴 배치에서는 이 기본값을 유지하고, 위처럼 동시성을 제한하며, 포기한 실패는 로그로 남기세요. [errors 페이지](https://llmwithcrypto.com/ko/docs/errors/)에는 모든 상태 코드와 재시도할 가치가 있는 항목이 정리되어 있습니다. 실패한 호출에는 비용이 들지 않습니다: 잔액에서 토큰 단위로 결제합니다. 입력 및 출력 토큰은 모델 자체의 tokenizer로 계산되며, 해당 모델의 1M 토큰당 가격으로 청구됩니다. 오류로 끝난 호출은 비용이 들지 않습니다.

## 기존 OpenAI 앱은 어떻게 옮기나요?

클라이언트 옵션인 `baseURL`과 `apiKey`을 바꾸고, 모든 `gpt-…` 모델 이름을 [models 페이지](https://llmwithcrypto.com/ko/models/)에 있는 id로 교체하세요. 프롬프트, 스트리밍 코드, `choices`와 `usage` 파싱은 그대로 둡니다. 트래픽을 전환하기 전에 새 모델에서 테스트를 실행하세요. tool calling과 JSON 출력은 각 모델이 지원하는 사양을 따릅니다.

## Node.js: 자주 묻는 질문

### 브라우저에서 API를 호출할 수 있나요?

기술적으로는 가능하지만, 페이지에 키를 넣어서는 절대 안 됩니다. 서버에서 호출하거나, 키를 보관하는 서버리스 함수에서 호출하세요.

### Vercel AI SDK는 동작하나요?

OpenAI 호환 base URL을 받는 라이브러리라면 모두 동작합니다. API는 OpenAI chat completions 형식을 따릅니다. OpenAI SDK, LangChain 또는 OpenAI 호환 도구의 base URL을 우리 base URL로 지정하고 키를 넣은 뒤 모델 이름만 바꾸면 됩니다.

### 크레딧이 소진되면 어떻게 되나요?

호출은 `402 insufficient_balance`을 반환하며 비용이 들지 않습니다. [errors 페이지](https://llmwithcrypto.com/ko/docs/errors/)에 대응 방법이 나와 있습니다.

---

LLMwithCrypto: LLMwithCrypto는 오픈 웨이트 모델을 위한 OpenAI 호환 LLM API입니다 — DeepSeek V4 Pro, DeepSeek V4.1 Flash, DeepSeek R1, Qwen3.5 397B A17B, Qwen3 235B A22B Instruct, gpt-oss-120b, gpt-oss-20b, GLM-4.7, Llama 3.3 70B Instruct, Gemma 4 31B, Mistral Large 3, Mistral Small 4 — 충전해 둔 암호화폐 잔액에서 토큰 단위로 결제하며, 공개 호스트 가격 중앙값보다 5% 저렴합니다. KYC 없이: 신분증도, 셀피도, 서류도 필요하지 않습니다. 프롬프트와 출력은 저장되지 않습니다.
