Требования#
Node 22 или новее. Установите WEIGHTSAPI_API_KEY на ваш собственный ключ. Для доступа к ИИ требуется вход, одно подтвержденное пополнение на сумму не менее 100 USD, авторизованный ключ API и достаточный доступный кредит для запроса. Каждое последующее пополнение также имеет минимум 100 USD; меньшие остатки остаются пригодными для использования, если они покрывают запрос. Кредит требует проверки транзакции. Проверьте статус сервиса на доступность модели перед отправкой трафика.
Запустите рецепт#
// Node 22+. Save as server.mjs, set WEIGHTSAPI_API_KEY, then node server.mjs.
import http from "node:http";
const base = process.env.WEIGHTSAPI_BASE_URL || "https://weightsapi.com/v1";
http.createServer(async (req, res) => {
if (req.url !== "/stream") {
res.setHeader("Content-Type", "text/html");
return res.end('<button id="run">Run</button><pre id="out"></pre><script>run.onclick=async()=>{out.textContent="";const r=await fetch("/stream");const reader=r.body.getReader();const decoder=new TextDecoder();for(;;){const {value,done}=await reader.read();if(done)break;out.textContent+=decoder.decode(value,{stream:true});}}<\/script>');
}
try {
const upstream = await fetch(base+"/chat/completions", {method:"POST",
headers:{"Content-Type":"application/json",Authorization:"Bearer "+process.env.WEIGHTSAPI_API_KEY},
body:JSON.stringify({model:"Qwen/Qwen3-32B",messages:[{role:"user",content:"Explain SSE."}],stream:true,max_tokens:256})});
res.writeHead(upstream.status, {"Content-Type":upstream.headers.get("content-type")||"text/plain","Cache-Control":"no-store"});
for await (const chunk of upstream.body) res.write(chunk);
res.end();
} catch {res.writeHead(502);res.end("Upstream unavailable");}
}).listen(8080,"127.0.0.1");
Перед производственным использованием#
Ограничьте конкурентность и повторные попытки, проверяйте выходные данные и обрабатывайте ошибки, прежде чем предоставлять рабочий процесс пользователям.