trustgraph/ai-context/trustgraph-client/test-streaming.js

111 lines
3.3 KiB
JavaScript
Executable file

#!/usr/bin/env node
/**
* Test script for TrustGraph streaming APIs
* Tests both streaming and non-streaming text completion
*
* Usage:
* node test-streaming.js
*
* Requirements:
* - TrustGraph backend running on http://localhost:8088
* - Built client library in ./dist/
*/
import { createTrustGraphSocket } from './dist/index.esm.js';
const USER = "test-user";
const SYSTEM_PROMPT = "You are a helpful AI assistant.";
const TEST_PROMPT = "Explain what streaming is in one paragraph.";
const SOCKET_URL = "ws://localhost:8888/api/socket";
console.log("=".repeat(80));
console.log("TrustGraph Streaming API Test");
console.log("=".repeat(80));
console.log(`Connecting to: ${SOCKET_URL}`);
console.log(`User: ${USER}`);
console.log("=".repeat(80));
// Create client connection with explicit WebSocket URL for Node.js
const client = createTrustGraphSocket(USER, undefined, SOCKET_URL);
// Wait a bit for connection to establish
await new Promise(resolve => setTimeout(resolve, 1000));
console.log("\n[1/2] Testing NON-STREAMING text completion...");
console.log("-".repeat(80));
try {
const flowApi = client.flow("default");
const response = await flowApi.textCompletion(SYSTEM_PROMPT, TEST_PROMPT);
console.log("✓ Non-streaming response received:");
console.log(response);
} catch (error) {
console.error("✗ Non-streaming failed:", error.message);
}
console.log("\n[2/2] Testing STREAMING text completion...");
console.log("-".repeat(80));
try {
const flowApi = client.flow("default");
let accumulated = "";
let chunkCount = 0;
const startTime = Date.now();
await new Promise((resolve, reject) => {
flowApi.textCompletionStreaming(
SYSTEM_PROMPT,
TEST_PROMPT,
(chunk, complete, metadata) => {
chunkCount++;
accumulated += chunk;
// Show progress indicator
if (chunk) {
process.stdout.write(chunk);
}
if (complete) {
const duration = Date.now() - startTime;
console.log("\n");
console.log("-".repeat(80));
console.log(`✓ Streaming complete!`);
console.log(` Chunks received: ${chunkCount}`);
console.log(` Total length: ${accumulated.length} chars`);
console.log(` Duration: ${duration}ms`);
console.log(` First chunk: ~${(startTime - Date.now() + duration) / chunkCount}ms`);
// Display token usage and model info if available
if (metadata) {
console.log("\n Metadata:");
if (metadata.model) console.log(` Model: ${metadata.model}`);
if (metadata.in_token !== undefined) console.log(` Input tokens: ${metadata.in_token}`);
if (metadata.out_token !== undefined) console.log(` Output tokens: ${metadata.out_token}`);
if (metadata.in_token && metadata.out_token) {
console.log(` Total tokens: ${metadata.in_token + metadata.out_token}`);
}
}
resolve();
}
},
(error) => {
console.error("\n✗ Streaming error:", error);
reject(new Error(error));
}
);
});
} catch (error) {
console.error("✗ Streaming failed:", error.message);
}
console.log("\n" + "=".repeat(80));
console.log("Test complete!");
console.log("=".repeat(80));
// Close connection
client.close();
process.exit(0);