ffb.gateway.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {
  2. WebSocketGateway,
  3. WebSocketServer,
  4. OnGatewayInit,
  5. OnGatewayConnection,
  6. OnGatewayDisconnect,
  7. SubscribeMessage,
  8. MessageBody,
  9. ConnectedSocket,
  10. } from '@nestjs/websockets';
  11. import { Server, Socket } from 'socket.io';
  12. import { Logger, Inject, forwardRef } from '@nestjs/common';
  13. import { FFBLangChainService } from './services/ffb-langchain.service';
  14. @WebSocketGateway({
  15. cors: {
  16. origin: '*',
  17. },
  18. namespace: 'ffb',
  19. })
  20. export class FFBGateway
  21. implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
  22. @WebSocketServer() server: Server;
  23. private logger: Logger = new Logger('FFBGateway');
  24. constructor(
  25. @Inject(forwardRef(() => FFBLangChainService))
  26. private readonly langchainService: FFBLangChainService
  27. ) { }
  28. afterInit(server: Server) {
  29. this.logger.log('FFB Gateway Initialized');
  30. }
  31. handleConnection(client: Socket, ...args: any[]) {
  32. this.logger.log(`Client connected: ${client.id}`);
  33. this.langchainService.createSession(client.id);
  34. }
  35. handleDisconnect(client: Socket) {
  36. this.logger.log(`Client disconnected: ${client.id}`);
  37. this.langchainService.deleteSession(client.id);
  38. }
  39. @SubscribeMessage('chat')
  40. async handleChat(
  41. @MessageBody() data: { message: string },
  42. @ConnectedSocket() client: Socket,
  43. ) {
  44. this.logger.log(`Received chat from ${client.id}: ${data.message}`);
  45. const response = await this.langchainService.chat(client.id, data.message);
  46. client.emit('chat_response', { message: response });
  47. return { event: 'sent', data: response }; // Acknowledgement if needed
  48. }
  49. @SubscribeMessage('switch_model')
  50. handleSwitchModel(
  51. @MessageBody() data: { provider: 'openai' | 'gemini' },
  52. @ConnectedSocket() client: Socket,
  53. ) {
  54. this.logger.log(`Switching model for ${client.id} to ${data.provider}`);
  55. this.langchainService.switchModel(client.id, data.provider);
  56. }
  57. @SubscribeMessage('get_model')
  58. handleGetModel(@ConnectedSocket() client: Socket) {
  59. const model = this.langchainService.getCurrentModel(client.id);
  60. console.log(model)
  61. return { event: 'current_model', data: model };
  62. }
  63. emitThought(socketId: string, data: any) {
  64. this.server.to(socketId).emit('agent_thought', data);
  65. }
  66. }