o
    zSoj                     @  s   d Z ddlmZ ddlmZmZ ddlmZmZ eG dd dZ	eG dd dZ
G d	d
 d
eZG dd deZeG dd dZG dd deZdS )z>Contrato del modelo de lenguaje (independiente del proveedor).    )annotations)ABCabstractmethod)	dataclassfieldc                   @  s   e Zd ZU ded< ded< dS )ChatMessagestrrolecontentN)__name__
__module____qualname____annotations__ r   r   7/var/www/html/bot-asterisk-ari/backend/llm/protocols.pyr   	   s   
 r   c                   @  s"   e Zd ZU ded< dZded< dS )LlmReplyr   textNdict | Noneraw)r   r   r   r   r   r   r   r   r   r      s   
 r   c                      (   e Zd ZdZddd fd	d
Z  ZS )LlmFatalErrorz:Error de LLM que no debe reintentarse (cuota, auth, etc.). codemessager   r   returnNonec                  s   t  | || _d S N)super__init__r   selfr   r   	__class__r   r   r      s   
zLlmFatalError.__init__r   r   r   r   r   r   r   r   r   __doc__r   __classcell__r   r   r"   r   r          r   c                      r   )LlmQuotaExceededz%Cuota / rate limit de OpenAI agotada.rate_limit_exceededr   r   r   r   r   r   c                  s   t  j||d d S )Nr   )r   r   r    r"   r   r   r       s   zLlmQuotaExceeded.__init__r$   r%   r   r   r"   r   r)      r(   r)   c                   @  sP   e Zd ZU dZded< dZded< dZded< dZded	< ee	d
Z
ded< dS )ConversationContextz&Contexto de la llamada para el prompt.r   call_idNz
str | Nonedocument_idcaller_numberr   poliza)default_factorydictextra)r   r   r   r&   r   r-   r.   r/   r   r1   r2   r   r   r   r   r+   $   s   
 r+   c                   @  sT   e Zd ZU dZded< edddddZddddddZdddZdddZ	dS )LanguageModeluu   Genera la respuesta conversacional del bot.

    Implementación actual: ``llm.openai_llm.OpenAiLanguageModel``.
    r   provider_nameN)contextmessageslist[ChatMessage]r5   ConversationContext | Noner   r   c                     d S r   r   )r!   r6   r5   r   r   r   reply8   s   zLanguageModel.reply)r5   
transcriptr;   list[str] | Noner   c                     dS )zExtrae resultado estructurado al fin de la llamada (json_schema).

        Default: no soportado. OpenAI Responses lo implementa con
        ``text.format.type=json_schema``.
        Nr   )r!   r6   r5   r;   r   r   r   extract_call_resultA   s   z!LanguageModel.extract_call_resultr   c                   r=   )z6Precarga el modelo (p. ej. Ollama). No-op por defecto.Nr   r!   r   r   r   warmupO   s   zLanguageModel.warmupc                   r9   r   r   r?   r   r   r   closeS   s   zLanguageModel.close)r6   r7   r5   r8   r   r   )r6   r7   r5   r8   r;   r<   r   r   )r   r   )
r   r   r   r&   r   r   r:   r>   r@   rA   r   r   r   r   r3   0   s   
 
r3   N)r&   
__future__r   abcr   r   dataclassesr   r   r   r   RuntimeErrorr   r)   r+   r3   r   r   r   r   <module>   s    