Untitled

 avatar
unknown
javascript
13 days ago
3.0 kB
0
No Index
in a day
const SYSTEM_MESSAGE = 'You are a helpful and bubbly AI assistant'
const VOICE = 'ash'

export default defineWebSocketHandler({
    async open(peer) {
        
        // Connect to OpenAI Realtime API
        const openAiWs = new WebSocket('wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview', {
            headers: {
                Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
                "OpenAI-Beta": "realtime=v1"
            }
        })
        console.log("[ws] OpenAI Realtime socket opened")

        let streamSid = null

        const sendInitialSessionUpdate = () => {
            const sessionUpdate = {
                type: 'session.update',
                session: {
                    turn_detection: { type: 'semantic_vad' },
                    input_audio_format: 'g711_ulaw',
                    output_audio_format: 'g711_ulaw',
                    voice: VOICE,
                    instructions: SYSTEM_MESSAGE,
                    modalities: ["text", "audio"],
                    temperature: 0.8,
                    max_response_output_tokens: 150,
                }
            }

            console.log('Sending session update:', JSON.stringify(sessionUpdate))
            openAiWs.send(JSON.stringify(sessionUpdate))

            // Send initial greeting
            const initialConversationItem = {
                type: 'conversation.item.create',
                item: {
                    type: 'message',
                    role: 'user',
                    content: [
                        {
                            type: 'input_text',
                            text: `Greet the user with "Hello! I'm an AI voice assistant`
                        }
                    ]
                }
            }

            openAiWs.send(JSON.stringify(initialConversationItem))
            openAiWs.send(JSON.stringify({ type: 'response.create' }))
        }

        // Handle OpenAI WebSocket connection
        openAiWs.onopen = () => {
            console.log('Connected to OpenAI Realtime API')
            peer.activeResponse = false // Track if a response is active
            setTimeout(sendInitialSessionUpdate, 100) // Ensure connection stability
        }

        openAiWs.onmessage = (event) => {
            const response = JSON.parse(event.data)
            console.log(`Received event: ${response.type}`)
        }

        // Handle WebSocket close and errors
        openAiWs.onclose = () => {
            console.log('Disconnected from OpenAI Realtime API')
        }

        openAiWs.onerror = (error) => {
            console.error('Error in OpenAI WebSocket:', error)
        }

        // Store the OpenAI WebSocket on the peer for cleanup
        peer.openAiWs = openAiWs
    },

    async message(peer, message) {
        const data = JSON.parse(message.text())
    },

    async close(peer) {
        console.log("[ws] OpenAI Realtime socket closed")
    }
})
Editor is loading...