§
    »«j-  ã                  ó”   — d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
mZmZmZ  ej        d¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚAny)ÚAiModelSpecÚAiProviderTypeÚ
AiResponseÚAiTextRequestÚAiVisionRequestzdscons.ai.adapter.openrouterc                  ó0   — e Zd ZdZ	 	 ddd„Zdd„Zdd„ZdS )ÚOpenRouterAdapterz9High-Availability Cloud Adapter for OpenRouter endpoints.úhttps://openrouter.ai/api/v1ç     €A@Úapi_keyÚstrÚbase_urlÚtimeout_secondsÚfloatÚreturnÚNonec                óV   — || _         |                     d¦  «        | _        || _        d S )Nú/)Ú_api_keyÚrstripÚ	_base_urlÚ_timeout)Úselfr   r   r   s       úLc:\Projects\DSCons\app\core\ai\infrastructure\adapters\openrouter_adapter.pyÚ__init__zOpenRouterAdapter.__init__   s)   € ð  ˆŒØ!Ÿš¨Ñ-Ô-ˆŒØ'ˆŒˆˆó    Úrequestr   Úspecr   r   c              ƒ  ó^  K  — t          j        ¦   «         }g }|j        r|                     d|j        dœ¦  «         |j        r|                     |j        ¦  «         n$|j        r|                     d|j        dœ¦  «         |j        ||j        |j	        p|j
        dœ}|j        r|                     |j        ¦  «         d| j        › �dddd	œ}t          j        | j        ¬
¦  «        4 ƒd{V —†}|                     | j        › d�||¬¦  «        ƒ d{V —†}|                     ¦   «          |                     ¦   «         }	ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |	d         d         }
|
                     di ¦  «                             d¦  «        pd}|st-          d|j        › d�¦  «        ‚|	                     di ¦  «        }t          j        ¦   «         |z
  dz  }t/          ||j        t2          j        ||                     dd¦  «        |                     dd¦  «        ¬¦  «        S )z,Executes text generation through OpenRouter.Úsystem©ÚroleÚcontentÚuser©ÚmodelÚmessagesÚtemperatureÚ
max_tokensúBearer úapplication/jsonúhttps://dscons.vnúDSCons ERP AI Gateway©ÚAuthorizationzContent-TypezHTTP-RefererzX-Title©ÚtimeoutNú/chat/completions©ÚjsonÚheadersÚchoicesr   Úmessager%   Ú z0Empty text completion received from OpenRouter (ú).Úusageç     @�@Úprompt_tokensÚcompletion_tokens©r%   Ú
model_usedÚprovider_usedÚ
latency_msr>   r?   )ÚtimeÚperf_counterÚsystem_promptÚappendr)   ÚextendÚpromptÚprovider_model_idr*   r+   Úmax_output_tokensÚ
extra_bodyÚupdater   ÚhttpxÚAsyncClientr   Úpostr   Úraise_for_statusr6   ÚgetÚ
ValueErrorr   Úcanonical_idr   Ú
OPENROUTER)r   r   r    Út0r)   Úpayloadr7   ÚclientÚresÚdataÚchoicer%   r<   Úlatencys                 r   Úgenerate_textzOpenRouterAdapter.generate_text"   s  è è € õ ÔÑ Ô ˆØ)+ˆàÔ ð 	RØ�OŠO X¸'Ô:OÐPÐPÑQÔQÐQàÔð 	IØ�OŠO˜GÔ,Ñ-Ô-Ð-Ð-ØŒ^ð 	IØ�OŠO V¸¼ÐGÐGÑHÔHÐHð Ô+Ø Ø"Ô.Ø!Ô,ÐF°Ô0Fð	
ð 
ˆð Ôð 	/Ø�NŠN˜7Ô-Ñ.Ô.Ð.ð 7 t¤}Ð6Ð6Ø.Ø/Ø.ð	
ð 
ˆõ Ô$¨T¬]Ð;Ñ;Ô;ð 	ð 	ð 	ð 	ð 	ð 	ð 	¸vØŸšØ”>Ð4Ð4Ð4¸7ÈGð $ñ ô ð ð ð ð ð ð ˆCð × Ò Ñ"Ô"Ð"Ø—8’8‘:”:ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð �i” Ô#ˆØ—*’*˜Y¨Ñ+Ô+×/Ò/°	Ñ:Ô:Ð@¸bˆØð 	lÝÐjÐPTÔPfÐjÐjÐjÑkÔkÐkØ—’˜ "Ñ%Ô%ˆåÔ$Ñ&Ô&¨Ñ+¨vÑ5ˆÝØØÔ(Ý(Ô3ØØŸ)š) O°QÑ7Ô7Ø#ŸišiÐ(;¸QÑ?Ô?ð
ñ 
ô 
ð 	
s   Ã/AEÅ
EÅEr	   c              ƒ  óZ  K  — t          j        ¦   «         }|j        }|s@|j        r9t	          j        |j        ¦  «                             d¦  «        }d|j        › d|› �}|st          d¦  «        ‚|j	        dd|j
        dœdd	|id
œgdœg|j        t          |j        d¦  «        dœ}d| j        › �ddddœ}t          j        | j        ¬¦  «        4 ƒd{V —†}|                     | j        › d�||¬¦  «        ƒ d{V —†}	|	                     ¦   «          |	                     ¦   «         }
ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |
d         d         }|                     di ¦  «        }|                     d¦  «        p|                     d¦  «        pd}|st          d|j	        › d�¦  «        ‚|
                     di ¦  «        }t          j        ¦   «         |z
  d z  }t/          ||j        t2          j        ||                     d!d¦  «        |                     d"d¦  «        ¬#¦  «        S )$z8Executes multimodal vision inference through OpenRouter.Úasciizdata:z;base64,z1No image payload or data_uri provided for vision.r&   Útext)Útyper`   Ú	image_urlÚurl)ra   rb   r#   i,  r'   r,   r-   r.   r/   r0   r2   Nr4   r5   r8   r   r9   r%   Ú	reasoningr:   z2Empty vision completion received from OpenRouter (r;   r<   r=   r>   r?   r@   )rD   rE   Údata_uriÚimage_bytesÚbase64Ú	b64encodeÚdecodeÚ
image_mimerS   rJ   rI   r*   Úmaxr+   r   rN   rO   r   rP   r   rQ   r6   rR   r   rT   r   rU   )r   r   r    rV   re   Úb64rW   r7   rX   rY   rZ   r[   Úmsgr%   r<   r\   s                   r   Úanalyze_visionz OpenRouterAdapter.analyze_visionX   s  è è € õ ÔÑ Ô ˆØÔ#ˆàð 	A˜GÔ/ð 	AÝÔ" 7Ô#6Ñ7Ô7×>Ò>¸wÑGÔGˆCØ@˜wÔ1Ð@Ð@¸3Ð@Ð@ˆHàð 	RÝÐPÑQÔQÐQð Ô+ð #à!'°´Ð@Ð@Ø!,¸EÀ8Ð;LÐMÐMð ðð ðð #Ô.Ý˜gÔ0°#Ñ6Ô6ð
ð 
ˆð  7 t¤}Ð6Ð6Ø.Ø/Ø.ð	
ð 
ˆõ Ô$¨T¬]Ð;Ñ;Ô;ð 	ð 	ð 	ð 	ð 	ð 	ð 	¸vØŸšØ”>Ð4Ð4Ð4¸7ÈGð $ñ ô ð ð ð ð ð ð ˆCð × Ò Ñ"Ô"Ð"Ø—8’8‘:”:ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð �i” Ô#ˆØ�jŠj˜ BÑ'Ô'ˆØ—'’'˜)Ñ$Ô$ÐB¨¯ª°Ñ(<Ô(<ÐBÀˆØð 	nÝÐlÐRVÔRhÐlÐlÐlÑmÔmÐmØ—’˜ "Ñ%Ô%ˆåÔ$Ñ&Ô&¨Ñ+¨vÑ5ˆÝØØÔ(Ý(Ô3ØØŸ)š) O°QÑ7Ô7Ø#ŸišiÐ(;¸QÑ?Ô?ð
ñ 
ô 
ð 	
s   ÃAD7Ä7
EÅEN)r   r   )r   r   r   r   r   r   r   r   )r   r   r    r   r   r   )r   r	   r    r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r]   rn   © r   r   r   r      sd   € € € € € ØCÐCð
 7Ø!%ð	(ð (ð (ð (ð (ð4
ð 4
ð 4
ð 4
ðl:
ð :
ð :
ð :
ð :
ð :
r   r   )Ú
__future__r   rg   ÚloggingrD   Útypingr   rN   Úapp.core.ai.domain.modelsr   r   r   r   r	   Ú	getLoggerÚloggerr   rs   r   r   ú<module>rz      sä   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	Ð9Ñ	:Ô	:€ð}
ð }
ð }
ð }
ð }
ñ }
ô }
ð }
ð }
ð }
r   