const ENGINE_URL = process.env.ENGINE_URL ?? "http://localhost:8000";
const ENGINE_KEY = process.env.ENGINE_KEY;
if (!ENGINE_KEY) {
console.error("Set ENGINE_KEY in your environment.");
process.exit(1);
}
async function execute(message, taskId) {
const resp = await fetch(`${ENGINE_URL}/execute`, {
method: "POST",
headers: {
"X-Engine-Key": ENGINE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ message, task_id: taskId }),
});
if (!resp.ok) {
throw new Error(`Engine returned ${resp.status}: ${await resp.text()}`);
}
const reader = resp.body.getReader();
const decoder = new TextDecoder();
let buffer = "";
while (true) {
const { value, done } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
// SSE messages are separated by a blank line.
let messageEnd;
while ((messageEnd = buffer.indexOf("\n\n")) !== -1) {
const raw = buffer.slice(0, messageEnd);
buffer = buffer.slice(messageEnd + 2);
handleMessage(raw);
}
}
process.stdout.write("\n");
}
function handleMessage(raw) {
let eventType = null;
let data = null;
for (const line of raw.split("\n")) {
if (line.startsWith("event:")) eventType = line.slice(6).trim();
else if (line.startsWith("data:")) data = JSON.parse(line.slice(5).trim());
}
if (!data) return;
if (data.text) process.stdout.write(data.text);
}
await execute("Say hello in one short sentence.", "demo-001");