Node.js Client Example
import WebSocket from "ws";
const URL = "wss://chat-proxy.bitseek.ai/v2/chat?apikey=<API-KEY>";
let ws;
let reconnectTimeout = 1000;
function connect() {
ws = new WebSocket(URL);
ws.on("open", () => {
console.log("✅ Connected");
reconnectTimeout = 1000;
ws.send(JSON.stringify({ event: "ping" }));
console.log("📤 Sending message...");
ws.send(
JSON.stringify({
event: "gen",
data: {
prompt: "Hello, please introduce quantum mechanics",
temperature: 0.2,
enableWebSearch: true,
webSearch: {
enabled: true,
mode: "force",
maxResults: 5,
freshness: "week",
lang: "auto",
},
tools: [
{
type: "function",
function: {
name: "get_weather",
description: "Get weather by city",
parameters: {
type: "object",
properties: {
city: { type: "string" }
},
required: ["city"]
}
}
}
]
}
})
);
});
ws.on("message", (msg) => {
const res = JSON.parse(msg);
switch (res.event) {
case "auth-connect-complete":
console.log("Auth successful:", res.data);
break;
case "set-model-complete":
console.log("Set model complete:", res.data);
break;
case "conv-message":
console.log("Conversation message:", res.data);
break;
case "message":
process.stdout.write(res.data.output);
if (res.data.stop) console.log("\n--- Stream End ---");
break;
case "pong":
console.log("📍 Pong received:", res.data);
break;
case "error":
console.error("❌ Error:", res.data.error);
break;
default:
console.log("📨 Unknown event:", res.event, res.data);
break;
}
});
ws.on("close", (code, reason) => {
console.warn(`⚠️ Connection closed: ${code} - ${reason}`);
attemptReconnect();
});
ws.on("error", (err) => {
console.error("❌ WebSocket error:", err.message);
ws.close();
});
}
function attemptReconnect() {
console.log(`🔄 Attempting reconnect in ${reconnectTimeout / 1000}s...`);
setTimeout(() => {
reconnectTimeout = Math.min(reconnectTimeout * 2, 30000);
connect();
}, reconnectTimeout);
}
connect();
Notes
- Send chat requests with
event: "gen" (not event: "message").
event: "gen" supports temperature, tools, enableWebSearch, and webSearch.
- The server sends
conv-message with conversationId and messageId before stream chunks.
- Stream completion is
event: "message" with data.stop === true.