
    i                        U d Z ddlmZ ddlZddlmZ ddlZddlZddlm	Z	  e	              G d de          Z
 G d d	          Z G d
 d          ZdddZded<   ddZdS )z3LLM client abstraction layer with Protocol pattern.    )annotationsN)Protocol)load_dotenvc                      e Zd ZdZd	dZdS )
	LLMClientz+Protocol defining the LLM client interface.systemstrmessageslist[dict[str, str]]returnc                    dS )z=Send a chat request and return the assistant's text response.N )selfr   r
   s      5/root/projects/multi-agents-meeting/src/llm_client.pychatzLLMClient.chat   s        Nr   r	   r
   r   r   r	   )__name__
__module____qualname____doc__r   r   r   r   r   r      s.        55     r   r   c                  R    e Zd ZdZddZedd	            Zedd
            ZddZdS )AnthropicClientz&LLM client wrapping the Anthropic SDK.clientanthropic.Anthropicmodelr	   r   Nonec                "    || _         || _        d S N_client_modelr   r   r   s      r   __init__zAnthropicClient.__init__       r   c                    | j         S z)Expose underlying SDK client for testing.r!   r   s    r   r   zAnthropicClient.client        |r   c                    | j         S zExpose model name for testing.r"   r)   s    r   r   zAnthropicClient.model#        {r   r   r
   r   c                v    | j         j                            | j        d||          }|j        d         j        S )z&Send a chat request via Anthropic API.i   )r   
max_tokensr   r
   r   )r!   r
   creater"   contenttext)r   r   r
   responses       r   r   zAnthropicClient.chat(   sB    <(//+	 0 
 
 "''r   N)r   r   r   r	   r   r   )r   r   r   r	   r   	r   r   r   r   r$   propertyr   r   r   r   r   r   r   r      s        00       X    X( ( ( ( ( (r   r   c                  R    e Zd ZdZddZedd	            Zedd
            ZddZdS )OpenAIClientz#LLM client wrapping the OpenAI SDK.r   openai.OpenAIr   r	   r   r   c                "    || _         || _        d S r   r    r#   s      r   r$   zOpenAIClient.__init__6   r%   r   c                    | j         S r'   r(   r)   s    r   r   zOpenAIClient.client:   r*   r   c                    | j         S r,   r-   r)   s    r   r   zOpenAIClient.model?   r.   r   r   r
   r   c                    d|dg|}| j         j        j                            | j        |          }|j        d         j        j        S )z#Send a chat request via OpenAI API.r   )roler2   )r   r
   r   )r!   r   completionsr1   r"   choicesmessager2   )r   r   r
   full_messagesr4   s        r   r   zOpenAIClient.chatD   sW    "*v>>JJ<$077+" 8 
 
 "*22r   N)r   r:   r   r	   r   r   )r   r:   r5   r   r6   r   r   r   r9   r9   3   s        --       X    X3 3 3 3 3 3r   r9   zclaude-sonnet-4-20250514zgpt-4o)	anthropicopenaizdict[str, str]_DEFAULT_MODELSr   AnthropicClient | OpenAIClientc                    t           j                            dd          } t           j                            dt                              | d                    }| dk    r$t	          j                    }t          ||          S | dk    rZt           j                            d          }|rt          j        |          nt          j                    }t          ||          S t          d	|  d
          )zCreate an LLM client based on environment variables.

    Env vars:
        LLM_PROVIDER: "anthropic" (default) or "openai"
        LLM_MODEL: model name (optional, has sensible defaults)
    LLM_PROVIDERrD   	LLM_MODEL )r   r   rE   OPENAI_BASE_URL)base_urlzUnknown LLM provider: z. Use 'anthropic' or 'openai'.)osenvirongetrF   rD   	Anthropicr   rE   OpenAIr9   
ValueError)providerr   
sdk_clientrM   s       r   create_clientrV   T   s     z~~nk::HJNN;(;(;Hb(I(IJJE;(**
j>>>>	X		:>>"3449AVV]H5555v}
:U;;;;Z(ZZZ[[[r   )r   rG   )r   
__future__r   rN   typingr   rD   rE   dotenvr   r   r   r9   rF   __annotations__rV   r   r   r   <module>r[      s3   9 9 9 " " " " " " 				                         ( ( ( ( ( ( ( (83 3 3 3 3 3 3 38 ,# #    \ \ \ \ \ \r   