@maximai/maxim-js
Version:
Maxim AI JS SDK. Visit https://getmaxim.ai for more info.
158 lines ⢠5.92 kB
JavaScript
;
/**
* 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