import { TwilioRealtimeTransportLayer } from "@openai/agents-extensions"; import { RealtimeAgent, RealtimeSession } from "@openai/agents/realtime"; import { Agent, type Connection, type ConnectionContext, routeAgentRequest } from "agents"; export class MyAgent extends Agent { // don't use hibernation, the dependencies will manually add their own handlers static options = { hibernate: false }; async onConnect(connection: Connection, ctx: ConnectionContext) { if (ctx.request.url.includes("media-stream")) { const agent = new RealtimeAgent({ instructions: "You are a helpful assistant that starts every conversation with a creative greeting.", name: "Triage Agent" }); connection.send(`Welcome! You are connected with ID: ${connection.id}`); const twilioTransportLayer = new TwilioRealtimeTransportLayer({ twilioWebSocket: connection }); const session = new RealtimeSession(agent, { transport: twilioTransportLayer }); await session.connect({ apiKey: process.env.OPENAI_API_KEY as string }); session.on("history_updated", (history) => { this.setState({ history }); }); } } onMessage() {} // just a blank, the transport layer will add its own handlers onClose(connection: Connection) { connection.close(); } } export default { async fetch(request: Request, env: Env) { const url = new URL(request.url); const path = url.pathname; if (path === "/incoming-call" && request.method === "POST") { const twimlResponse = ` O.K. you can start talking! `.trim(); return new Response(twimlResponse, { headers: { "Content-Type": "text/xml" } }); } return ( (await routeAgentRequest(request, env, { cors: true })) || new Response("Not found", { status: 404 }) ); } } satisfies ExportedHandler;