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
| 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ź.
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ść.
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.
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ść.
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 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. 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 pokazuje, jak zareagować.