UNPKG

@maximai/maxim-js

Version:

Maxim AI JS SDK. Visit https://getmaxim.ai for more info.

158 lines • 5.92 kB
"use strict"; /** * Example: Text conversation with OpenAI Realtime API + Maxim logging * * Run with: npx ts-node src/lib/tests/openai/realtime_ex.ts * * Requires: * - OPENAI_API_KEY environment variable * - MAXIM_API_KEY environment variable * - MAXIM_LOG_REPO_ID environment variable * - ws package: npm install ws @types/ws */ Object.defineProperty(exports, "__esModule", { value: true }); const dotenv_1 = require("dotenv"); (0, dotenv_1.config)(); // Use OpenAIRealtimeWS for Node.js (requires 'ws' package) const ws_1 = require("openai/realtime/ws"); const index_1 = require("../../../../index"); const realtime_1 = require("../../logger/openai/realtime"); async function main() { const openAIKey = process.env["OPENAI_API_KEY"]; const maximApiKey = process.env["MAXIM_API_KEY"]; const repoId = process.env["MAXIM_LOG_REPO_ID"]; if (!openAIKey || !maximApiKey || !repoId) { console.error("Missing required environment variables:"); console.error("- OPENAI_API_KEY"); console.error("- MAXIM_API_KEY"); console.error("- MAXIM_LOG_REPO_ID"); process.exit(1); } // Initialize Maxim const maxim = new index_1.Maxim({ apiKey: maximApiKey, baseUrl: process.env["MAXIM_BASE_URL"], }); const logger = await maxim.logger({ id: repoId }); if (!logger) { console.error("Failed to create logger"); process.exit(1); } console.log("šŸš€ Starting OpenAI Realtime text conversation...\n"); // Create the realtime client const rt = new ws_1.OpenAIRealtimeWS({ model: "gpt-4o-realtime-preview-2024-12-17", }); // Wrap with Maxim logging const wrapper = (0, realtime_1.wrapOpenAIRealtime)(rt, logger, { "maxim-session-name": "Realtime Text Chat Example", "maxim-generation-name": "realtime-text-generation", }); console.log(`šŸ“ Session ID: ${wrapper.sessionId}\n`); // Track conversation state let responseComplete = false; // Handle socket connection rt.socket.on("open", () => { console.log("āœ… WebSocket connection opened\n"); // Configure session for text-only modality rt.send({ type: "session.update", session: { type: "realtime", // Required: 'realtime' for conversation sessions output_modalities: ["text"], // Use 'output_modalities' for response format model: "gpt-4o-realtime-preview-2024-12-17", instructions: "You are a helpful assistant. Keep responses concise and informative.", }, }); }); // Handle session created rt.on("session.created", (event) => { var _a, _b; console.log("šŸ“‹ Session created:", (_a = event.session) === null || _a === void 0 ? void 0 : _a.id); console.log(" Model:", (_b = event.session) === null || _b === void 0 ? void 0 : _b.model); console.log(""); // Send the first user message sendUserMessage("Hello! What are the three laws of robotics?"); }); // Handle session updated rt.on("session.updated", (event) => { var _a, _b; console.log("šŸ“‹ Session configured"); console.log(" Modalities:", (_b = (_a = event.session) === null || _a === void 0 ? void 0 : _a.modalities) === null || _b === void 0 ? void 0 : _b.join(", ")); console.log(""); }); // Handle text response deltas (streaming text) rt.on("response.output_text.delta", (event) => { process.stdout.write(event.delta); }); // Handle text response complete rt.on("response.output_text.done", (_event) => { console.log("\n"); console.log("─".repeat(50)); }); // Handle response completion rt.on("response.done", (event) => { const response = event.response; console.log("\nšŸ“Š Response stats:"); if (response.usage) { console.log(` Input tokens: ${response.usage.input_tokens}`); console.log(` Output tokens: ${response.usage.output_tokens}`); console.log(` Total tokens: ${response.usage.total_tokens}`); } console.log(""); // Check if this was the second response (follow-up) if (responseComplete) { // End the conversation console.log("šŸ‘‹ Conversation complete. Closing connection...\n"); setTimeout(() => { rt.close(); }, 100); } else { responseComplete = true; // Send a follow-up message setTimeout(() => { sendUserMessage("Interesting! Who created these laws?"); }, 500); } }); // Handle errors rt.on("error", (err) => { console.error("āŒ Error:", err.message || err); }); // Handle socket close rt.socket.on("close", async () => { console.log("šŸ”Œ Connection closed"); // Cleanup wrapper.cleanup(); await logger.flush(); await logger.cleanup(); await maxim.cleanup(); console.log("✨ Logs sent to Maxim. Check your dashboard!"); process.exit(0); }); // Handle socket errors rt.socket.on("error", (err) => { console.error("āŒ Socket error:", err); }); // Helper function to send user messages function sendUserMessage(text) { console.log(`šŸ‘¤ User: ${text}\n`); console.log("šŸ¤– Assistant: "); rt.send({ type: "conversation.item.create", item: { type: "message", role: "user", content: [{ type: "input_text", text }], }, }); rt.send({ type: "response.create" }); } } // Run the example main().catch((err) => { console.error("Fatal error:", err); process.exit(1); }); //# sourceMappingURL=realtime_ex.js.map