in websocket-server/src/sessionManager.ts [154:209]
function handleModelMessage(data: RawData) {
const event = parseMessage(data);
if (!event) return;
jsonSend(session.frontendConn, event);
switch (event.type) {
case "input_audio_buffer.speech_started":
handleTruncation();
break;
case "response.audio.delta":
if (session.twilioConn && session.streamSid) {
if (session.responseStartTimestamp === undefined) {
session.responseStartTimestamp = session.latestMediaTimestamp || 0;
}
if (event.item_id) session.lastAssistantItem = event.item_id;
jsonSend(session.twilioConn, {
event: "media",
streamSid: session.streamSid,
media: { payload: event.delta },
});
jsonSend(session.twilioConn, {
event: "mark",
streamSid: session.streamSid,
});
}
break;
case "response.output_item.done": {
const { item } = event;
if (item.type === "function_call") {
handleFunctionCall(item)
.then((output) => {
if (session.modelConn) {
jsonSend(session.modelConn, {
type: "conversation.item.create",
item: {
type: "function_call_output",
call_id: item.call_id,
output: JSON.stringify(output),
},
});
jsonSend(session.modelConn, { type: "response.create" });
}
})
.catch((err) => {
console.error("Error handling function call:", err);
});
}
break;
}
}
}