Resposta rápida
Como chamo LLMwithCrypto a partir do Node.js?
Instale o pacote oficial com npm install openai e crie o cliente com baseURL: "https://llmwithcrypto.com/api/v1" e apiKey: process.env.LLMWITHCRYPTO_API_KEY. LLMwithCrypto responde client.chat.completions.create() no formato da OpenAI para 12 modelos de pesos abertos, com streaming e tool calls onde o modelo suportar, conforme documentado em 23 de outubro de 2026.
O que você precisa
| Node.js | 18 ou superior, ES modules (.mjs ou "type": "module") |
|---|---|
| Pacote | openai (oficial) |
| URL base | https://llmwithcrypto.com/api/v1 |
| Chave | Na variável de ambiente LLMWITHCRYPTO_API_KEY, nunca no código ou no navegador |
Como envio uma requisição?
Crie o client uma vez na inicialização e reutilize-o em todo lugar. Mantenha a chave no servidor: uma chave embutida no código do navegador pode ser lida por qualquer pessoa que abra a página, então chame a API do seu backend e envie apenas a resposta para o navegador.
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');
Como executo um lote sem estourar o rate limit?
Execute um número fixo de requisições por vez. O pequeno helper mapLimit abaixo mantém quatro em andamento e retorna os resultados em ordem; nenhum pacote extra é necessário. Toda conta tem um limite de requisições e de tokens por minuto, mostrado no dashboard; peça ao suporte e ele pode ser aumentado.
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));
Como faço streaming da resposta?
Passe stream: true e use for await no resultado. Cada chunk traz um trecho de texto em choices[0].delta.content; com stream_options: { include_usage: true } o último chunk tem a contagem de tokens.
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`);
}
Como consulto os créditos restantes?
O endpoint de créditos não faz parte do SDK da OpenAI, então chame-o com fetch. É gratuito; chame antes de um lote grande para garantir que o saldo cobre o lote.
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');
Como trato os erros?
O SDK lança um OpenAI.APIError para cada erro HTTP, com o status em err.status e o code do corpo em err.code. Teste o código, não a mensagem: insufficient_balance significa recarregar, model_not_found significa id errado, rate_limit_exceeded significa esperar e tentar de novo.
O SDK já tenta alguns erros duas vezes com uma pausa (maxRetries). Para lotes longos, mantenha esse padrão, limite a concorrência como acima e registre as falhas que você desistir de tentar. A página de erros lista cada status e quais valem uma nova tentativa. Chamadas com falha não custam nada: Você paga por token a partir do seu saldo: tokens de entrada e de saída são contados pelo tokenizer do próprio modelo e cobrados ao preço daquele modelo por 1M de tokens. Uma chamada que termina em erro não custa nada.
Como migro um app OpenAI existente?
Altere as opções do client, baseURL e apiKey, e substitua cada nome de modelo gpt-… por um id da página de modelos. Prompts, código de streaming e o parsing de choices e usage continuam iguais. Rode seus testes no novo modelo antes de trocar o tráfego: tool calling e saída JSON seguem o que cada modelo suporta.
Node.js: perguntas frequentes
Posso chamar a API do navegador?
Tecnicamente sim, mas nunca com sua chave na página. Chame do seu servidor, ou de uma função serverless que guarda a chave.
O Vercel AI SDK funciona?
Qualquer biblioteca que aceite uma base URL compatível com OpenAI funciona. A API fala o formato de chat completions da OpenAI: aponte o SDK da OpenAI, o LangChain ou qualquer ferramenta compatível com OpenAI para a nossa base URL com a sua chave e troque o nome do modelo.
O que acontece quando os créditos acabam?
As chamadas retornam 402 insufficient_balance e não custam nada. A página de erros mostra como reagir.