Perplexica/src/websocket/connectionManager.ts

48 lines
1.4 KiB
TypeScript
Raw Normal View History

2024-04-09 16:21:05 +05:30
import { WebSocket } from 'ws';
import { handleMessage } from './messageHandler';
2024-04-20 11:18:52 +05:30
import { getAvailableProviders } from '../lib/providers';
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
import type { Embeddings } from '@langchain/core/embeddings';
import type { IncomingMessage } from 'http';
2024-04-30 12:18:18 +05:30
import logger from '../utils/logger';
2024-04-09 16:21:05 +05:30
export const handleConnection = async (
ws: WebSocket,
request: IncomingMessage,
) => {
const searchParams = new URL(request.url, `http://${request.headers.host}`)
.searchParams;
2024-04-20 11:18:52 +05:30
const models = await getAvailableProviders();
const provider =
searchParams.get('chatModelProvider') || Object.keys(models)[0];
const chatModel =
searchParams.get('chatModel') || Object.keys(models[provider])[0];
2024-04-20 09:32:19 +05:30
2024-04-20 11:18:52 +05:30
let llm: BaseChatModel | undefined;
let embeddings: Embeddings | undefined;
if (models[provider] && models[provider][chatModel]) {
llm = models[provider][chatModel] as BaseChatModel | undefined;
embeddings = models[provider].embeddings as Embeddings | undefined;
}
if (!llm || !embeddings) {
ws.send(
JSON.stringify({
type: 'error',
data: 'Invalid LLM or embeddings model selected',
}),
);
ws.close();
}
2024-04-20 09:32:19 +05:30
2024-04-09 16:21:05 +05:30
ws.on(
'message',
2024-04-20 09:32:19 +05:30
async (message) =>
await handleMessage(message.toString(), ws, llm, embeddings),
2024-04-09 16:21:05 +05:30
);
2024-04-30 12:18:18 +05:30
ws.on('close', () => logger.debug('Connection closed'));
2024-04-09 16:21:05 +05:30
};