# Node.js: pakiet openai skierowany na modele open-weight

> Wywołuj modele LLM open-weight z Node.js przez pakiet openai: jedno wywołanie, partia ze współbieżnością i streaming. Przykłady do skopiowania.

- URL: https://llmwithcrypto.com/pl/docs/node/
- Ostatnia aktualizacja: 2026-10-23
- Wydawca: LLMwithCrypto (https://llmwithcrypto.com)

Oficjalny pakiet npm `openai` działa bez zmian: podaj mu nasz `baseURL` i swój klucz. Poniższe przykłady to moduły ES dla Node.js 18 lub nowszego, który ma wbudowane `fetch` i top-level `await`.

**Krótka odpowiedź — Jak wywołać LLMwithCrypto z Node.js?**

Zainstaluj oficjalny pakiet przez `npm install openai`, a następnie utwórz klienta z `baseURL: "https://llmwithcrypto.com/api/v1"` i `apiKey: process.env.LLMWITHCRYPTO_API_KEY`. **LLMwithCrypto** odpowiada `client.chat.completions.create()` w formacie OpenAI dla 12 modeli open-weight, ze streamingiem i wywołaniami narzędzi tam, gdzie model je obsługuje, zgodnie z dokumentacją z 23 października 2026.

## Czego potrzebujesz

| Atrybut | Wartość |
| --- | --- |
| Node.js | 18 lub nowszy, moduły ES (`.mjs` lub `"type": "module"`) |
| Pakiet | `openai` (oficjalny) |
| Base URL | `https://llmwithcrypto.com/api/v1` |
| Klucz | W zmiennej środowiskowej `LLMWITHCRYPTO_API_KEY`, nigdy w kodzie ani w przeglądarce |

## Jak wysłać jedno zapytanie?

Utwórz klienta raz przy starcie i używaj go wszędzie. Trzymaj klucz na serwerze: klucz wysłany w kodzie przeglądarki może odczytać każdy, kto otworzy stronę, więc wywołuj API z backendu i wysyłaj do przeglądarki tylko odpowiedź.

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

```

## Jak uruchomić batch bez trafiania w rate limit?

Uruchamiaj stałą liczbę zapytań naraz. Mały helper `mapLimit` poniżej utrzymuje cztery w locie i zwraca wyniki w kolejności; nie trzeba dodatkowego pakietu. Każde konto ma limit zapytań i tokenów na minutę, widoczny w dashboardzie; poproś support, a można go podnieść.

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

```

## Jak streamować odpowiedź?

Przekaż `stream: true` i użyj `for await` na wyniku. Każdy chunk niesie fragment tekstu w `choices[0].delta.content`; z `stream_options: { include_usage: true }` ostatni chunk ma liczby tokenów.

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

```

## Jak odczytać pozostałe kredyty?

Endpoint kredytów nie jest częścią OpenAI SDK, więc wywołaj go przez `fetch`. Jest darmowy; wywołaj go przed dużym batchem, żeby upewnić się, że kredyty pokryją całość.

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

```

## Jak obsługiwać błędy?

SDK rzuca `OpenAI.APIError` przy każdym błędzie HTTP, ze statusem w `err.status` i `code` z body w `err.code`. Testuj kod, nie komunikat: `insufficient_balance` oznacza doładowanie, `model_not_found` oznacza błędny id, `rate_limit_exceeded` oznacza poczekaj i ponów.

SDK sam ponawia niektóre błędy dwa razy z pauzą (`maxRetries`). Przy długich batchach zostaw to domyślne zachowanie, ogranicz współbieżność jak wyżej i loguj niepowodzenia, które odpuszczasz. [Strona błędów](https://llmwithcrypto.com/pl/docs/errors/) wymienia każdy status i które z nich warto ponowić. Nieudane wywołania nic nie kosztują: Płacisz za token z salda: tokeny wejściowe i wyjściowe są liczone przez tokenizer danego modelu i rozliczane według ceny tego modelu za 1M tokenów. Wywołanie zakończone błędem nic nie kosztuje.

## Jak przenieść istniejącą aplikację OpenAI?

Zmień opcje klienta, `baseURL` i `apiKey`, i zamień każdą nazwę modelu `gpt-…` na id ze [strony modeli](https://llmwithcrypto.com/pl/models/). Prompty, kod streamowania i parsowanie `choices` oraz `usage` zostają bez zmian. Uruchom testy na nowym modelu, zanim przełączysz ruch: tool calling i wyjście JSON działają zgodnie z tym, co obsługuje dany model.

## Node.js: najczęstsze pytania

### Czy mogę wywoływać API z przeglądarki?

Technicznie tak, ale nigdy z kluczem na stronie. Wywołuj je z serwera lub z funkcji serverless, która trzyma klucz.

### Czy Vercel AI SDK działa?

Każda biblioteka, która przyjmuje bazowy URL zgodny z OpenAI, działa. API mówi w formacie OpenAI chat completions: skieruj OpenAI SDK, LangChain lub dowolne narzędzie zgodne z OpenAI na nasz base URL ze swoim kluczem i zmień nazwę modelu.

### Co się dzieje, gdy kredyty się skończą?

Wywołania zwracają `402 insufficient_balance` i nic nie kosztują. [Strona błędów](https://llmwithcrypto.com/pl/docs/errors/) pokazuje, jak zareagować.

---

LLMwithCrypto: LLMwithCrypto to zgodne z OpenAI API LLM dla modeli z otwartymi wagami — 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 — płatne za token z przedpłaconego salda kryptowalutowego, o 5% poniżej mediany ceny publicznych hostów. Bez KYC: bez dowodu, bez selfie, bez dokumentów. Prompty i odpowiedzi nie są przechowywane.
