§
    5…›jA  ã                  ó”   — d dl mZ d dlZd dlZd dlmZ d dlmZ ddlm	Z	m
Z
 ddlmZ  ej        d¦  «        Z G d	„ d
e
e¦  «        ZdS )é    )ÚannotationsN)ÚAny)ÚSettingsé   )ÚHAS_MLXÚMlxBackendMixin)ÚOpenAiBackendMixinzdscons.llm.servicec                  óF   — e Zd ZdZdd„Zdddddd	œdd„Zdddddd	œdd„ZdS )Ú	LLMClientzNMulti-backend LLM client supporting local MLX and OpenAI-compatible endpoints.Úsettingsr   ÚreturnÚNonec                ó8  — || _         |j        | _        |j        | _        |j        | _        |j        | _        |j	         
                    d¦  «        | _        |j        | _        d| _        d| _        | j        dk    rt           rdnd| _        dS | j        | _        dS )z0Initialize the client with application settings.ú/NÚautoÚmlxÚopenai_compatible)Ú	_settingsÚrequest_timeout_secondsÚ_timeoutÚllm_model_nameÚ_model_pathÚllm_max_tokensÚ_default_max_tokensÚllm_providerÚ	_providerÚllm_api_base_urlÚrstripÚ_api_base_urlÚllm_api_keyÚ_api_keyÚ_modelÚ
_tokenizerr   Ú_active_provider)Úselfr   s     ú@C:\Projects\DSCons\app\modules\agents\application\llm\service.pyÚ__init__zLLMClient.__init__   s™   € à!ˆŒØ Ô8ˆŒØ#Ô2ˆÔØ#+Ô#:ˆÔ Ø!Ô.ˆŒØ%Ô6×=Ò=¸cÑBÔBˆÔØ Ô,ˆŒØˆŒØˆŒàŒ>˜VÒ#Ð#Ý-4Ð$M E EÐ:MˆDÔ!Ð!Ð!à$(¤NˆDÔ!Ð!Ð!ó    Nçš™™™™™É?©ÚmodelÚtemperatureÚ
max_tokensÚ
extra_bodyÚ
agent_codeÚmessagesúlist[dict[str, str]]r+   ú
str | Noner,   Úfloatr-   ú
int | Noner.   údict[str, Any] | Noner/   údict[str, Any]c             ƒ  ó   K  — |                       |¦  «        }|                     d| j        ¦  «        }|p|                     d| j        ¦  «        }	|dk    r|                      ||||¬¦  «        ƒ d{V —†S ddlm}
m} ddlm	} d}|d	v r|
j
        }n|d
k    r|
j        }n|dk    r|
j        } |¦   «         } |||	|||dk    r|n|                     dd¦  «        |p|                     d| j        ¦  «        |¬¦  «        }	 |                     |¦  «        ƒ d{V —†}dd|j        iig|j        |j        |j        dœdœS # t&          $ rF}t(                               d|¦  «         |                      ||	||||¬¦  «        ƒ d{V —†cY d}~S d}~ww xY w)zGGenerate a chat completion using the configured Plug and Play provider.Úproviderr+   r   )r,   r-   r/   Nr   )ÚAiProviderTypeÚAiTextRequest)Úget_ai_gateway)ÚantigravityÚantigravity_sdkÚ
openrouterÚlmstudior)   r,   r-   )r0   Úcanonical_model_idÚpreferred_providerr/   r,   r-   r.   ÚmessageÚcontent)Úprompt_tokensÚcompletion_tokens)Úchoicesr+   Úusagez[[LLM_CLIENT] EnterpriseAiGateway call failed (%s). Falling back to legacy OpenAI backend...r*   )Úget_provider_for_agentÚgetr$   r   Ú_generate_mlxÚapp.core.ai.domain.modelsr9   r:   Ú"app.core.ai.infrastructure.gatewayr;   ÚANTIGRAVITYÚ
OPENROUTERÚLMSTUDIOr   Úgenerate_textrC   Ú
model_usedrD   rE   Ú	ExceptionÚloggerÚwarningÚ_generate_openai_compatible)r%   r0   r+   r,   r-   r.   r/   Úprovider_infoÚprovider_strÚeffective_modelr9   r:   r;   Úpref_providerÚgatewayÚreqÚrespÚes                     r&   Úcreate_chat_completionz LLMClient.create_chat_completion&   s“  è è € ð ×3Ò3°JÑ?Ô?ˆØ$×(Ò(¨°TÔ5JÑKÔKˆØÐO =×#4Ò#4°W¸dÔ>NÑ#OÔ#Oˆà˜5Ò Ð Ø×+Ò+ØØ'Ø%Ø%ð	 ,ñ ô ð ð ð ð ð ð ð ð 	LÐKÐKÐKÐKÐKÐKÐKØEÐEÐEÐEÐEÐEàˆØÐ=Ð=Ð=Ø*Ô6ˆMˆMØ˜\Ò)Ð)Ø*Ô5ˆMˆMØ˜ZÒ'Ð'Ø*Ô3ˆMà �.Ñ"Ô"ˆØˆmØØ.Ø,Ø!à˜cÒ!Ð!ð $˜à×"Ò" =°#Ñ6Ô6Ø!ð IØ× Ò  ¨tÔ/GÑHÔHØ!ð
ñ 
ô 
ˆð	Ø ×.Ò.¨sÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3ˆDà&¨°D´LÐ(AÐBÐCØœà%)Ô%7Ø)-Ô)?ðð ðð ð øõ ð 	ð 	ð 	Ý�NŠNØmØñô ð ð ×9Ò9ØØ%Ø'Ø%Ø%Ø%ð :ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øøøøð	øøøs   Ä <D= Ä=
FÅ;FÆFÆFÚstrc             ƒ  ó  K  — |                       ||||||¬¦  «        ƒ d{V —†}t          | d¦  «        sd| _        dddœ| _        |                     di ¦  «        }|                     dd¦  «        }	|                     d	d¦  «        }
| j        d
xx         |	z  cc<   | j        dxx         |
z  cc<   |                     d|pd¦  «                             ¦   «         }d|v r|	dz  |
dz  z   dz  }nGd|v r|	dz  |
dz  z   dz  }n4d|v r|	dz  |
dz  z   dz  }n!d|v r|	dz  |
dz  z   dz  }n|	dz  |
dz  z   dz  }| xj        |z  c_        t                               d|› d|	› d|
› d|d ›d!| j        d ›�
¦  «         |                     d"g ¦  «        }|sd#S |d                              d$i ¦  «        }|                     d%d#¦  «        }|sd&|v r|                     d&d#¦  «        }t          |t          ¦  «        r|nt          |¦  «        S )'zBReturn the assistant text content from a chat completion response.r*   NÚsession_cost_usdg        r   )ÚpromptÚ
completionrG   rD   rE   rb   rc   r+   ÚunknownÚopusg      .@g     ÀR@i@B Úfableg      @Úsolg      @g      $@zdeepseek-v4-progìQ¸…ëÁ?gìQ¸…ëÑ?g      à?g      ø?ú[z] Used z	 prompt, z comp tokens. Cost: $z.6fz. Session Total: $rF   Ú rB   rC   Úreasoning_content)
r^   Úhasattrra   Úsession_tokensrI   ÚlowerrS   ÚinfoÚ
isinstancer_   )r%   r0   r+   r,   r-   r.   r/   ÚdatarG   ÚptÚctrX   ÚcostrF   rB   rC   s                   r&   ÚchatzLLMClient.chatn   sÛ  è è € ð ×0Ò0ØØØ#Ø!Ø!Ø!ð 1ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ �tÐ/Ñ0Ô0ð 	AØ$'ˆDÔ!Ø-.¸aÐ"@Ð"@ˆDÔà—’˜ "Ñ%Ô%ˆØ�YŠY�¨Ñ*Ô*ˆØ�YŠYÐ*¨AÑ.Ô.ˆØÔ˜HÐ%Ð%Ô%¨Ñ+Ð%Ð%Ñ%ØÔ˜LÐ)Ð)Ô)¨RÑ/Ð)Ð)Ñ)àŸ(š( 7¨EÐ,>°YÑ?Ô?×EÒEÑGÔGˆØ�_Ð$Ð$Ø˜‘I  T¡	Ñ)¨WÑ4ˆDˆDØ˜Ð'Ð'Ø˜‘H˜r D™yÑ(¨GÑ3ˆDˆDØ�oÐ%Ð%Ø˜‘H˜r D™yÑ(¨GÑ3ˆDˆDØ /Ð1Ð1Ø˜‘I  T¡	Ñ)¨WÑ4ˆDˆDà˜‘H˜r C™xÑ'¨7Ñ2ˆDàÐÔ Ñ%ÐÔÝ�Šð F�ð  Fð  F¨ð  Fð  F°Rð  Fð  FÈdð  Fð  Fð  FÐjnÔjð  Fð  Fð  Fñ	
ô 	
ð 	
ð
 —(’(˜9 bÑ)Ô)ˆØð 	Ø�2Ø˜!”*—.’. ¨BÑ/Ô/ˆØ—+’+˜i¨Ñ,Ô,ˆØð 	;Ð.°'Ð9Ð9Ø—k’kÐ"5°rÑ:Ô:ˆGÝ$ W­cÑ2Ô2ÐDˆwˆw½¸G¹¼ÐDr(   )r   r   r   r   )r0   r1   r+   r2   r,   r3   r-   r4   r.   r5   r/   r2   r   r6   )r0   r1   r+   r2   r,   r3   r-   r4   r.   r5   r/   r2   r   r_   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r^   rt   © r(   r&   r   r      sž   € € € € € ð YÐXð3ð 3ð 3ð 3ð* !Ø Ø!%Ø,0Ø!%ðFð Fð Fð Fð Fð FðX !Ø Ø!%Ø,0Ø!%ð8Eð 8Eð 8Eð 8Eð 8Eð 8Eð 8Eð 8Er(   r   )Ú
__future__r   ÚasyncioÚloggingÚtypingr   Úapp.core.settingsr   Úmlx_backendr   r   Úopenai_backendr	   Ú	getLoggerrS   r   ry   r(   r&   ú<module>r‚      sÖ   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø .Ð .Ð .Ð .Ð .Ð .à	ˆÔ	Ð/Ñ	0Ô	0€ðWEð WEð WEð WEð WEØØñWEô WEð WEð WEð WEr(   