Risposta rapida
Come chiamo LLMwithCrypto da Node.js?
Installa il pacchetto ufficiale con npm install openai, poi crea il client con baseURL: "https://llmwithcrypto.com/api/v1" e apiKey: process.env.LLMWITHCRYPTO_API_KEY. LLMwithCrypto risponde client.chat.completions.create() nel formato OpenAI per 12 modelli open-weight, con streaming e tool call dove il modello li supporta, come documentato il 23 ottobre 2026.
Cosa ti serve
| Node.js | 18 o superiore, ES modules (.mjs o "type": "module") |
|---|---|
| Pacchetto | openai (ufficiale) |
| Base URL | https://llmwithcrypto.com/api/v1 |
| Chiave | Nella variabile d'ambiente LLMWITHCRYPTO_API_KEY, mai nel codice o nel browser |
Come invio una singola richiesta?
Crea il client una volta all'avvio e riutilizzalo ovunque. Tieni la chiave sul server: una chiave inserita nel codice del browser può essere letta da chiunque apra la pagina, quindi chiama l'API dal tuo backend e invia al browser solo la risposta.
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');
Come eseguo un batch senza incorrere nel rate limit?
Esegui un numero fisso di richieste alla volta. Il piccolo helper mapLimit qui sotto ne mantiene quattro in corso e restituisce i risultati in ordine; non serve alcun pacchetto aggiuntivo. Ogni account ha un limite di richieste e di token al minuto, mostrato nella dashboard; chiedi al supporto e può essere alzato.
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));
Come faccio lo streaming della risposta?
Passa stream: true e usa for await sul risultato. Ogni chunk contiene un pezzo di testo in choices[0].delta.content; con stream_options: { include_usage: true } l'ultimo chunk ha il conteggio dei token.
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`);
}
Come leggo i crediti rimanenti?
L'endpoint dei crediti non fa parte dell'SDK di OpenAI, quindi chiamalo con fetch. È gratuito; chiamalo prima di un batch grande per assicurarti che i crediti bastino.
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');
Come gestisco gli errori?
L'SDK lancia un OpenAI.APIError per ogni errore HTTP, con lo status in err.status e il code del body in err.code. Controlla il codice, non il messaggio: insufficient_balance significa ricaricare, model_not_found significa un id sbagliato, rate_limit_exceeded significa aspettare e riprovare.
L'SDK ritenta già alcuni errori due volte con una pausa (maxRetries). Per i batch lunghi, mantieni questo default, limita la concorrenza come sopra e registra nei log i fallimenti a cui rinunci. La pagina degli errori elenca ogni status e quali vale la pena ritentare. Le chiamate fallite non costano nulla: Paghi per token dal tuo saldo: i token di input e di output vengono contati dal tokenizer del modello stesso e addebitati al prezzo di quel modello per 1M di token. Una chiamata che termina con un errore non costa nulla.
Come migro un'app OpenAI esistente?
Cambia le opzioni del client, baseURL e apiKey, e sostituisci ogni nome di modello gpt-… con un id dalla pagina dei modelli. I prompt, il codice di streaming e il parsing di choices e usage restano come sono. Esegui i tuoi test sul nuovo modello prima di spostare il traffico: il tool calling e l'output JSON seguono ciò che supporta ogni modello.
Node.js: domande frequenti
Posso chiamare l'API dal browser?
Tecnicamente sì, ma mai con la tua chiave nella pagina. Chiamala dal tuo server, o da una funzione serverless che conserva la chiave.
Il Vercel AI SDK funziona?
Qualsiasi libreria che accetta un base URL compatibile con OpenAI funziona. L'API parla il formato chat completions di OpenAI: punta l'SDK di OpenAI, LangChain o qualsiasi strumento compatibile con OpenAI alla nostra base URL con la tua chiave e cambia il nome del modello.
Cosa succede quando i crediti finiscono?
Le chiamate restituiscono 402 insufficient_balance e non costano nulla. La pagina degli errori mostra come reagire.