o
    BW:i                     @   s   d Z ddlmZmZmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ G dd deZG d	d
 d
eZG dd dZe ZdS )z
AI Service Factory for ElevenLabs WebSocket Service (Service Type 4)
Simplified to only support service type 4 for better performance
    )OptionalDictAny)ABCabstractmethod)Config)Log)ElevenLabsWebSocketServicec                   @   sz   e Zd ZdZeddedededee fddZed	edee	 fd
dZ
edefddZedeeef fddZdS )AIServiceInterfacezm
    Abstract interface for AI services.
    Ensures consistent interface across different AI providers.
    N
user_inputsystem_promptconversation_historyreturnc                       dS )z'Generate text response from user input.N selfr   r   r   r   r   M/home/vmc/milan/call_management/calls/homebook/services/ai_service_factory.pygenerate_response      z$AIServiceInterface.generate_responsetextc                    r   )zConvert text to speech audio.Nr   r   r   r   r   r   text_to_speech   r   z!AIServiceInterface.text_to_speechc                    r   )z!Handle conversation interruption.Nr   r   r   r   r   handle_interruption   r   z&AIServiceInterface.handle_interruptionc                 C   s   dS )zGet service information.Nr   r   r   r   r   get_service_info#   s   z#AIServiceInterface.get_service_infoN)__name__
__module____qualname____doc__r   strlistr   r   bytesr   boolr   r   r   r   r   r   r   r   r
      s    "r
   c                
   @   s   e Zd ZdZdeeef fddZddededed	e	e fd
dZ
ded	e	e fddZd	efddZd	eeef fddZd	efddZdS )ElevenLabsWebSocketWrapperz
    Wrapper for ElevenLabs WebSocket service to implement AIServiceInterface.
    Note: ElevenLabs WebSocket works with real-time audio streaming, not text-based methods.
    
bot_configc                 C   sD   |r| dnd}|sttdrtjnd}t|d| _td dS )z
        Initialize ElevenLabs WebSocket wrapper.
        
        Args:
            bot_config: Bot configuration dictionary (may contain agent_id)
        elevenlabs_agent_idNELEVENLABS_AGENT_ID)agent_idu0   🎙️ ElevenLabs WebSocket wrapper initialized)gethasattrr   r(   r	   elevenlabs_servicer   info)r   r&   r)   r   r   r   __init__2   s
   z#ElevenLabsWebSocketWrapper.__init__Nr   r   r   r   c                       t d dS )z
        Generate response using ElevenLabs WebSocket.
        Note: This is a placeholder - ElevenLabs WebSocket works with real-time audio.
        T   🎙️ ElevenLabs WebSocket doesn't use this method - it works with real-time audioNr   debugr   r   r   r   r   A      
z,ElevenLabsWebSocketWrapper.generate_responser   c                    r/   )z
        Text-to-speech using ElevenLabs WebSocket.
        Note: This is a placeholder - ElevenLabs WebSocket works with real-time audio.
        r0   Nr1   r   r   r   r   r   I   r3   z)ElevenLabsWebSocketWrapper.text_to_speechc              
      s   z+t | dr| jjstd W dS | j I dH }|r%td |W S td |W S  tyR } ztd|  ddl	}t|
  W Y d}~dS d}~ww )	z
        Handle conversation interruption by sending an interrupt signal to ElevenLabs.
        
        Returns:
            bool: True if interruption was handled successfully
        r,   u;   ⚠️ Cannot handle interruption - WebSocket not connectedFNu0   ✅ Successfully sent interruption to ElevenLabsu0   ⚠️ Failed to send interruption to ElevenLabsu"   ❌ Error in handle_interruption: r   )r+   r,   	connectedr   warningsend_interruptionr-   	Exceptionerror	traceback
format_exc)r   successer9   r   r   r   r   X   s$   


z.ElevenLabsWebSocketWrapper.handle_interruptionc                 C   s   dddddS )z*
        Get service information.
        Zelevenlabs_websocketT	200-500ms)service_typeZsupports_interruptionlatencyZ	real_timer   r   r   r   r   r   s   s
   z+ElevenLabsWebSocketWrapper.get_service_infoc                 C   s   | j S )z%Get the underlying WebSocket service.)r,   r   r   r   r   get_websocket_service~   s   z0ElevenLabsWebSocketWrapper.get_websocket_servicer   )r   r   r   r    r   r!   r   r.   r"   r   r   r#   r   r$   r   r   r	   r@   r   r   r   r   r%   ,   s     r%   c                   @   sf   e Zd ZdZededeeef de	fddZ
ededefddZededeeef fd	d
ZdS )AIServiceFactoryzG
    Factory class for creating AI services based on service_type.
    r>   r&   r   c              
   C   sj   | dkrd|  }t d|  t|z
t d t|W S  ty4 } z	t d|   d}~ww )a  
        Create AI service - only service type 4 (ElevenLabs WebSocket) is supported.
        
        Args:
            service_type: Service type (must be 4)
            bot_config: Bot configuration dictionary
            
        Returns:
            AI service instance (ElevenLabsWebSocketWrapper)
            
        Raises:
            ValueError: If service_type is not 4
           z>Only service_type 4 (ElevenLabs WebSocket) is supported. Got: u   ❌ u-   🎙️ Creating ElevenLabs WebSocket serviceu1   ❌ Error creating ElevenLabs WebSocket service: N)r   r8   
ValueErrorr-   r%   r7   )r>   r&   	error_msgr<   r   r   r   create_ai_service   s   


z"AIServiceFactory.create_ai_servicec                 C   s   | dkrdS d|  dS )z
        Get human-readable service name.
        
        Args:
            service_type: Service type number (must be 4)
            
        Returns:
            Service name string
        rB   zElevenLabs WebSocketzUnsupported Service (z$) - Only service type 4 is supportedr   r>   r   r   r   get_service_name   s   z!AIServiceFactory.get_service_namec                 C   s   | dkrddddddS i S )z
        Get service capabilities information.
        
        Args:
            service_type: Service type number (must be 4)
            
        Returns:
            Dictionary with capabilities
        rB   Tr=   ZMediumZ	Excellent)Zreal_time_interruptionr?   costqualityZsupports_streamingr   rF   r   r   r   get_service_capabilities   s   z)AIServiceFactory.get_service_capabilitiesN)r   r   r   r    staticmethodintr   r!   r   r
   rE   rG   rJ   r   r   r   r   rA      s      rA   N)r    typingr   r   r   abcr   r   configr   services.log_utilsr   %services.elevenlabs_websocket_servicer	   r
   r%   rA   Zai_service_factoryr   r   r   r   <module>   s    W
F