# Node.js：openaiパッケージをオープンウェイトモデルに向ける

> 公式のopenaiパッケージを使ってNode.jsからオープンウェイトLLMを呼び出します。1回の呼び出し、並列数を制限したバッチ、ストリーミング、残高の確認まで。コピー＆ペーストで使える例です。

- URL: https://llmwithcrypto.com/ja/docs/node/
- 最終更新: 2026-10-23
- 発行者: LLMwithCrypto (https://llmwithcrypto.com)

公式の`openai` npmパッケージはそのまま使えます。`baseURL`とAPIキーを指定するだけです。以下の例は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**は12のオープンウェイトモデルに対してOpenAI形式で`client.chat.completions.create()`に応答し、モデルが対応している場合はストリーミングとツール呼び出しにも対応します（2026年10月23日時点のドキュメント）。

## 必要なもの

| 属性 | 値 |
| --- | --- |
| Node.js | 18以降、ESモジュール（`.mjs`または`"type": "module"`） |
| パッケージ | `openai`（公式） |
| Base URL | `https://llmwithcrypto.com/api/v1` |
| キー | 環境変数 `LLMWITHCRYPTO_API_KEY` に設定し、コードやブラウザには決して置かないでください |

## 1回のリクエストはどのように送信しますか？

クライアントは起動時に1度作成し、すべての場所で再利用してください。キーはサーバー側に保管してください。ブラウザのコードに含めたキーは、ページを開いた誰でも読むことができます。そのため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');

```

## レート制限に達せずにバッチを実行するにはどうすればよいですか？

同時に実行するリクエスト数を固定します。以下の小さな `mapLimit` ヘルパーは4件を同時実行し、結果を順番どおりに返します。追加のパッケージは不要です。すべてのアカウントには1分あたりのリクエスト数とトークン数の上限があり、ダッシュボードに表示されます。サポートに依頼すれば引き上げられます。

*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`);
}

```

## 残りのクレジットを確認するにはどうすればよいですか？

credits エンドポイントは 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` にステータス、`err.code` にレスポンスボディの `code` が入ります。メッセージではなくコードを判定してください。`insufficient_balance` はチャージが必要、`model_not_found` は ID の誤り、`rate_limit_exceeded` は待って再試行を意味します。

SDK は一部のエラーを間隔をあけて2回まで自動再試行します（`maxRetries`）。長時間のバッチではこのデフォルトを維持し、前述のように同時実行数を制限し、断念した失敗はログに記録してください。[エラーページ](https://llmwithcrypto.com/ja/docs/errors/) にはすべてのステータスと、再試行する価値があるものが記載されています。失敗した呼び出しは料金がかかりません：残高からトークン単位で支払います。入力トークンと出力トークンはモデル自身のトークナイザーでカウントされ、そのモデルの100万トークンあたりの価格で請求されます。エラーで終わった呼び出しは無料です。

## 既存の OpenAI アプリを移行するにはどうすればよいですか？

クライアントのオプション `baseURL` と `apiKey` を変更し、すべての `gpt-…` モデル名を [models ページ](https://llmwithcrypto.com/ja/models/) の ID に置き換えてください。プロンプト、ストリーミングのコード、`choices` と `usage` のパースはそのまま使えます。トラフィックを切り替える前に、新しいモデルでテストを実行してください。tool calling と JSON 出力は各モデルがサポートする内容に従います。

## Node.js：よくある質問

### ブラウザから API を呼び出せますか？

技術的には可能ですが、ページにキーを置いてはいけません。サーバー、またはキーを保持するサーバーレス関数から呼び出してください。

### Vercel AI SDK は動作しますか？

OpenAI 互換のベース URL を受け付けるライブラリなら動作します。APIはOpenAI chat completions形式に対応しています。OpenAI SDK、LangChain、その他OpenAI互換のツールのベースURLを当社のベースURLに設定し、APIキーを指定して、モデル名を変更してください。

### クレジットがなくなるとどうなりますか？

呼び出しは `402 insufficient_balance` を返し、料金はかかりません。[エラーページ](https://llmwithcrypto.com/ja/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不要:本人確認書類、自撮り写真、証明書類は一切不要です。プロンプトと出力は保存されません。
