# Node.js: paket openai diarahkan ke model open-weight

> Panggil LLM open-weight dari Node.js dengan paket openai resmi: satu panggilan, batch dengan batas konkurensi, dan streaming. Contoh siap copy-paste.

- URL: https://llmwithcrypto.com/id/docs/node/
- Terakhir diperbarui: 2026-10-23
- Penerbit: LLMwithCrypto (https://llmwithcrypto.com)

Paket npm `openai` resmi berfungsi tanpa perubahan: beri `baseURL` kami dan API key Anda. Contoh di bawah adalah ES module untuk Node.js 18 atau lebih baru, yang sudah punya `fetch` dan `await` top-level bawaan.

**Jawaban singkat — Bagaimana cara memanggil LLMwithCrypto dari Node.js?**

Instal paket resmi dengan `npm install openai`, lalu buat client dengan `baseURL: "https://llmwithcrypto.com/api/v1"` dan `apiKey: process.env.LLMWITHCRYPTO_API_KEY`. **LLMwithCrypto** menjawab `client.chat.completions.create()` dalam format OpenAI untuk 12 model open-weight, dengan streaming dan tool call di mana model mendukungnya, sebagaimana didokumentasikan pada 23 Oktober 2026.

## Yang Anda butuhkan

| Atribut | Nilai |
| --- | --- |
| Node.js | 18 atau lebih baru, ES module (`.mjs` atau `"type": "module"`) |
| Paket | `openai` (resmi) |
| Base URL | `https://llmwithcrypto.com/api/v1` |
| Key | Di environment variable `LLMWITHCRYPTO_API_KEY`, jangan pernah di kode atau di browser |

## Bagaimana cara mengirim satu request?

Buat client sekali saat start-up dan gunakan kembali di mana-mana. Simpan key di server: key yang dikirim dalam kode browser bisa dibaca siapa saja yang membuka halaman, jadi panggil API dari backend Anda dan kirim hanya jawabannya ke browser.

*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');

```

## Bagaimana cara menjalankan batch tanpa terkena rate limit?

Jalankan sejumlah request tetap pada satu waktu. Helper kecil `mapLimit` di bawah ini menjaga empat request berjalan bersamaan dan mengembalikan hasilnya sesuai urutan; tidak perlu paket tambahan. Setiap akun memiliki batas permintaan dan token per menit yang ditampilkan di dashboard; hubungi support dan batas itu dapat dinaikkan.

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

```

## Bagaimana cara streaming jawabannya?

Lewatkan `stream: true` dan gunakan `for await` pada hasilnya. Setiap chunk membawa sepotong teks di `choices[0].delta.content`; dengan `stream_options: { include_usage: true }` chunk terakhir berisi jumlah token.

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

```

## Bagaimana cara membaca sisa kredit?

Endpoint credits bukan bagian dari OpenAI SDK, jadi panggil dengan `fetch`. Gratis; panggil sebelum batch besar untuk memastikan kreditnya cukup.

*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');

```

## Bagaimana cara menangani error?

SDK melempar `OpenAI.APIError` untuk setiap HTTP error, dengan status di `err.status` dan `code` dari body di `err.code`. Uji kodenya, bukan pesannya: `insufficient_balance` berarti top up, `model_not_found` berarti id salah, `rate_limit_exceeded` berarti tunggu dan coba lagi.

SDK sudah mencoba ulang beberapa error dua kali dengan jeda (`maxRetries`). Untuk batch panjang, pertahankan default itu, batasi konkurensi seperti di atas, dan catat kegagalan yang Anda serah. [Halaman errors](https://llmwithcrypto.com/id/docs/errors/) mencantumkan setiap status dan mana yang layak dicoba ulang. Panggilan yang gagal tidak memakan biaya: Anda membayar per token dari saldo Anda: token input dan output dihitung oleh tokenizer model itu sendiri dan ditagih sesuai harga model tersebut per 1M token. Panggilan yang berakhir dengan error tidak dikenai biaya.

## Bagaimana cara memindahkan aplikasi OpenAI yang sudah ada?

Ubah opsi client, `baseURL` dan `apiKey`, lalu ganti setiap nama model `gpt-…` dengan id dari [halaman models](https://llmwithcrypto.com/id/models/). Prompt, kode streaming, serta parsing `choices` dan `usage` tetap sama. Jalankan tes Anda pada model baru sebelum mengalihkan traffic: tool calling dan output JSON mengikuti apa yang didukung setiap model.

## Node.js: pertanyaan umum

### Bisakah saya memanggil API dari browser?

Secara teknis bisa, tapi jangan pernah dengan key Anda di halaman. Panggil dari server Anda, atau dari serverless function yang menyimpan key.

### Apakah Vercel AI SDK bisa dipakai?

Library apa pun yang menerima base URL kompatibel OpenAI bisa dipakai. API ini berbicara dalam format chat completions OpenAI: arahkan OpenAI SDK, LangChain, atau alat apa pun yang kompatibel dengan OpenAI ke base URL kami dengan API key Anda, lalu ubah nama modelnya.

### Apa yang terjadi saat kredit habis?

Panggilan mengembalikan `402 insufficient_balance` dan tidak memakan biaya. [Halaman errors](https://llmwithcrypto.com/id/docs/errors/) menunjukkan cara bereaksi.

---

LLMwithCrypto: LLMwithCrypto adalah LLM API yang kompatibel dengan OpenAI untuk model open-weight — 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 — dibayar per token dari saldo kripto prabayar, 5% di bawah harga median host publik. Tanpa KYC: tanpa ID, tanpa selfie, tanpa dokumen. Prompt dan output tidak disimpan.
