o
    @bojX                     @  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Zded< dZded	< dS )
LlmReplyr   textNdict | Nonerawr   intprompt_tokenscompletion_tokens)r   r   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   r0   r1   r2   r   r4   r5   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]r8   ConversationContext | Noner   r   c                     d S r    r   )r$   r9   r8   r   r   r   reply:   s   zLanguageModel.reply)r8   
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$   r9   r8   r>   r   r   r   extract_call_resultC   s   z!LanguageModel.extract_call_resultr   c                   r@   )z6Precarga el modelo (p. ej. Ollama). No-op por defecto.Nr   r$   r   r   r   warmupQ   s   zLanguageModel.warmupc                   r<   r    r   rB   r   r   r   closeU   s   zLanguageModel.close)r9   r:   r8   r;   r   r   )r9   r:   r8   r;   r>   r?   r   r   )r   r   )
r   r   r   r)   r   r   r=   rA   rC   rD   r   r   r   r   r6   2   s   
 
r6   N)r)   
__future__r   abcr   r   dataclassesr   r   r   r   RuntimeErrorr   r,   r.   r6   r   r   r   r   <module>   s    