Copy // Authentication
async function handleLogin(email, password) {
try {
const response = await fetch('https://torooc-liku-api.med2lab.com/api/liku/authentication/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify({
email: email,
password: password
})
});
if (response.ok) {
const data = await response.json();
if (data.token_key) {
return data.token_key;
} else {
throw new Error('Invalid response format from server');
}
} else {
throw new Error('Authentication failed');
}
} catch (error) {
console.error('Login error:', error);
throw error;
}
}
// Get connection data
async function getConnectionData(token, topicId, faceId, likuId, language) {
try {
let url = `/api/init-websocket?token=${encodeURIComponent(token)}&topic_id=${encodeURIComponent(topicId)}`;
// Add optional parameters if they exist
if (faceId) url += `&face_id=${encodeURIComponent(faceId)}`;
if (likuId) url += `&liku_id=${encodeURIComponent(likuId)}`;
if (language) url += `&language=${encodeURIComponent(language)}`;
const response = await fetch(url);
if (!response.ok) {
const error = await response.json();
throw new Error(error.detail || 'Failed to get init data');
}
return await response.text();
} catch (error) {
console.error('Error getting init websocket data:', error);
throw error;
}
}
// Initialize WebSocket
async function initWebSocket(connectionData) {
const url = 'wss://voice-liku-chat.med2lab.com/chat-stream';
const websocket = new WebSocket(url);
websocket.binaryType = 'arraybuffer';
websocket.onopen = function() {
const message = JSON.stringify({
connection_data: connectionData
});
websocket.send(message);
};
websocket.onmessage = function(event) {
if (typeof event.data === 'string') {
try {
const jsonData = JSON.parse(event.data);
if (jsonData.type === 'user_transcript') {
console.log('User said:', jsonData.text);
} else if (jsonData.type === 'assistant_transcript' || jsonData.type === 'assistant_message') {
console.log('Assistant said:', jsonData.text);
}
} catch (e) {
console.log('Received text message:', event.data);
}
} else {
// Handle binary audio data
playAudio(event.data);
}
};
websocket.onclose = function(event) {
console.log('WebSocket connection closed:', event.code, event.reason);
if (event.code === 4000) {
console.error('Connection closed due to invalid connection data');
}
};
websocket.onerror = function(error) {
console.error('WebSocket error:', error);
};
return websocket;
}
// Save transcript to server
async function saveTranscriptToServer(token, connectionData, topicId, conversationId) {
try {
const response = await fetch('https://voice-liku-chat.med2lab.com/api/save-transcript', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Token ${token}`
},
body: JSON.stringify({
connection_data: connectionData,
topic_id: topicId,
conversation_id: conversationId
})
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.detail || 'Failed to save transcript');
}
return await response.json();
} catch (error) {
console.error('Error saving transcript:', error);
throw error;
}
}