§
    3ø¾jÍ%  ã                  ó  — U 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mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ  ej        d¦  «        Z  G d„ de¦  «        Z!da"de#d<   dd„Z$dS )é    )ÚannotationsN)ÚAny)ÚAiCapabilityÚAiModelSpecÚAiProviderTypeÚ
AiResponseÚAiStructuredRequestÚAiTextRequestÚAiVisionRequest)ÚAiGatewayPort)ÚAntigravitySdkAdapter)ÚLmStudioAdapter)ÚOpenRouterAdapter)ÚProviderCircuitBreaker)ÚCanonicalModelRegistry)ÚSettingsÚget_settingszdscons.ai.gatewayc                  óT   — e Zd ZdZddd„Zdd„Zdd„Zdd„Zdd„Z	 d d!d„Z		 d d"d„Z
dS )#ÚEnterpriseAiGatewayzJHexagonal Architecture Gateway Orchestrator with Plug-and-Play Resilience.NÚsettingsúSettings | NoneÚreturnÚNonec                ó   — |pt          ¦   «         | _        t          ¦   «         | _        t	          t          | j        dd¦  «        pt          j                             dd¦  «        ¬¦  «        | _	        t          t          | j        dd¦  «        pt          j                             dd¦  «        t          | j        dd¦  «        ¬	¦  «        | _        t          t          | j        d
d¦  «        t          | j        dd¦  «        ¬¦  «        | _        d S )NÚgemini_api_keyÚ ÚGEMINI_API_KEY)Úapi_keyÚopenrouter_api_keyÚOPENROUTER_API_KEYÚopenrouter_base_urlzhttps://openrouter.ai/api/v1)r   Úbase_urlÚlmstudio_base_urlzhttp://127.0.0.1:1234/v1Úlmstudio_api_keyz	lm-studio)r"   r   )r   Ú	_settingsr   Ú_circuit_breakerr   ÚgetattrÚosÚenvironÚgetÚ_antigravity_adapterr   Ú_openrouter_adapterr   Ú_lmstudio_adapter)Úselfr   s     ú8C:\Projects\DSCons\app\core\ai\infrastructure\gateway.pyÚ__init__zEnterpriseAiGateway.__init__%   s	  € Ø!Ð3¥\¡^¤^ˆŒÝ 6Ñ 8Ô 8ˆÔÝ$9Ý˜DœNÐ,<¸bÑAÔAð 4ÝŒz�~Š~Ð.°Ñ3Ô3ð%
ñ %
ô %
ˆÔ!õ $5Ý˜DœNÐ,@À"ÑEÔEð 8ÝŒz�~Š~Ð2°BÑ7Ô7ÝØ”Ø%Ø.ñô ð$
ñ $
ô $
ˆÔ õ "1ÝØ”Ð 3Ð5Oñô õ ˜DœNÐ,>ÀÑLÔLð	"
ñ "
ô "
ˆÔÐÐó    Úproviderr   r   c                ó€   — |t           j        t           j        fv r| j        S |t           j        k    r| j        S | j        S )z*Resolves the appropriate adapter instance.)r   ÚANTIGRAVITYÚGEMINI_DIRECTr+   ÚLMSTUDIOr-   r,   )r.   r2   s     r/   Ú_get_adapterz EnterpriseAiGateway._get_adapter<   sA   € à�Ô2µNÔ4PÐQÐQÐQØÔ,Ð,Ø�Ô0Ò0Ð0ØÔ)Ð)ØÔ'Ð'r1   Úrequestr
   r   c              ƒ  ó2  K  — |j         pt          | j        dd¦  «        }|j        t          j        k    rd|                     ¦   «         v rd}nX|j        t          j        k    rd}n@|j        t          j        k    r+| 	                    d¦  «        sd|› �t          j        v rd|› �}t          j        |¦  «        }|g}t          j        |¦  «        }|r3||vr/|                     |¦  «         t          j        |¦  «        }|r||v°/d}|D ]û}|j        }| j                             |¦  «        s!t$                               d|j        ¦  «         ŒD|                      |¦  «        }		 |	                     ||¦  «        ƒ d{V —†}
| j                             |¦  «         ||k    rd|
_        |
c S # t2          $ rN}|}| j                             ||¦  «         t$                               d	|j        |j        |¦  «         Y d}~Œôd}~ww xY w|r|‚t9          d
¦  «        ‚)z1Executes text completion with automatic failover.Úllm_model_nameúopenrouter/gemini-2.5-flashÚgeminizlfm-2.5-2.6bzopenrouter/Nz:[AI_GATEWAY] Circuit is OPEN for %s, skipping to fallback.TzV[AI_GATEWAY] Text generation with %s (%s) failed: %s. Initiating resilient failover...z3All configured AI providers failed text generation.)Úcanonical_model_idr'   r%   Úpreferred_providerr   r4   Úlowerr6   Ú
OPENROUTERÚ
startswithr   Ú_MODELSÚresolve_specÚget_fallback_specÚappendÚprovider_typer&   Úcan_attemptÚloggerÚwarningÚvaluer7   Úgenerate_textÚrecord_successÚis_fallbackÚ	ExceptionÚrecord_failureÚcanonical_idÚRuntimeError)r.   r8   Útarget_modelÚspecÚattemptsÚfb_specÚ
last_errorÚcurrent_specr2   ÚadapterÚresponseÚes               r/   rK   z!EnterpriseAiGateway.generate_textD   sš  è è € àÔ1ð 
µWØŒNÐ,Ð.Kñ6
ô 6
ˆð Ô&­.Ô*DÒDÐDØ˜L×.Ò.Ñ0Ô0Ð0Ð0à8ˆLˆLØÔ'­>Ô+BÒBÐBØ)ˆLˆLàÔ&­.Ô*CÒCÐCØ ×+Ò+¨MÑ:Ô:ð Dð ,˜\Ð+Ð+Õ/EÔ/MÐMÐMØ;¨\Ð;Ð;�å%Ô2°<Ñ@Ô@ˆà�6ˆÝ(Ô:¸4Ñ@Ô@ˆØð 	H˜'¨Ð1Ð1Ø�OŠO˜GÑ$Ô$Ð$Ý,Ô>¸wÑGÔGˆGð ð 	H˜'¨Ð1Ð1ð ˆ
Ø$ð 	ð 	ˆLØ#Ô1ˆHØÔ(×4Ò4°XÑ>Ô>ð Ý—’ØPØ”Nñô ð ð à×'Ò'¨Ñ1Ô1ˆGðØ!(×!6Ò!6°wÀÑ!MÔ!MÐMÐMÐMÐMÐMÐM�ØÔ%×4Ò4°XÑ>Ô>Ð>Ø 4Ò'Ð'Ø+/�HÔ(Ø���øÝð ð ð Ø�
ØÔ%×4Ò4°X¸qÑAÔAÐAÝ—’ØlØ Ô-Ø”NØñ	ô ð ð ð ð ð ð øøøøðøøøð ð 	ØÐÝÐPÑQÔQÐQs   Å$AF+Æ+
HÆ5AG>Ç>Hr   c              ƒ  ó   K  — t          j        |j        pd¦  «        }|g}t          j        |¦  «        }|rF||vrBt          j        |j        v r|                     |¦  «         t          j        |¦  «        }|r||v°Bd}|D ]û}|j        }| j	         
                    |¦  «        s!t                               d|j        ¦  «         ŒD|                      |¦  «        }	 |                     ||¦  «        ƒ d{V —†}	| j	                             |¦  «         ||k    rd|	_        |	c S # t$          $ rN}
|
}| j	                             ||
¦  «         t                               d|j        |j        |
¦  «         Y d}
~
Œôd}
~
ww xY w|r|‚t+          d¦  «        ‚)zHExecutes multimodal vision analysis prioritizing native Antigravity SDK.r;   Nz;[AI_GATEWAY] Circuit is OPEN for %s, bypassing vision call.TzL[AI_GATEWAY] Vision analysis with %s (%s) failed: %s. Attempting fallback...z'All vision-capable AI providers failed.)r   rC   r=   rD   r   ÚMULTIMODAL_VISIONÚcapabilitiesrE   rF   r&   rG   rH   rI   rJ   r7   Úanalyze_visionrL   rM   rN   rO   rP   rQ   )r.   r8   rS   rT   rU   rV   rW   r2   rX   rY   rZ   s              r/   r^   z"EnterpriseAiGateway.analyze_vision~   s   è è € å%Ô2ØÔ&ÐGÐ*Gñ
ô 
ˆð �6ˆÝ(Ô:¸4Ñ@Ô@ˆØð 	H˜'¨Ð1Ð1ÝÔ-°Ô1EÐEÐEØ—’ Ñ(Ô(Ð(Ý,Ô>¸wÑGÔGˆGð ð 	H˜'¨Ð1Ð1ð
 ˆ
Ø$ð 	ð 	ˆLØ#Ô1ˆHØÔ(×4Ò4°XÑ>Ô>ð Ý—’ØQØ”Nñô ð ð à×'Ò'¨Ñ1Ô1ˆGðØ!(×!7Ò!7¸ÀÑ!NÔ!NÐNÐNÐNÐNÐNÐN�ØÔ%×4Ò4°XÑ>Ô>Ð>Ø 4Ò'Ð'Ø+/�HÔ(Ø���øÝð ð ð Ø�
ØÔ%×4Ò4°X¸qÑAÔAÐAÝ—’ØbØ Ô-Ø”NØñ	ô ð ð ð ð ð ð øøøøðøøøð ð 	ØÐÝÐDÑEÔEÐEs   ÃAD"Ä"
E:Ä,AE5Å5E:r	   údict[str, Any]c              ƒ  ó°  K  — d}|j         r dt          j        |j         dd¬¦  «        › d�}t          |j        › d|› �|j        |j        |j        |j        |j	        ¬¦  «        }|  
                    |¦  «        ƒ d	{V —†}|j                             ¦   «         }|                     d
¦  «                             d¦  «                             d¦  «                             ¦   «         }t          j        |d¬¦  «        }t#          |t$          ¦  «        r|S 	 t          j        |¦  «        }t#          |t$          ¦  «        r|S n# t(          $ r Y nw xY wd|j        iS )zAExecutes structured JSON inference with robust schema guarantees.r   u    
Cáº¤U TRÃšC JSON Báº®T BUá»˜C:
Fé   )Úensure_asciiÚindentu$   
Chá»‰ tráº£ vá»� JSON thuáº§n tÃºy.ú
)ÚpromptÚsystem_promptr=   r>   Ú
agent_codeÚtemperatureNz```jsonz```T)Úreturn_objectsÚraw_content)Úschema_dictÚjsonÚdumpsr
   re   rf   r=   r>   rg   rh   rK   ÚcontentÚstripÚremoveprefixÚremovesuffixÚjson_repairÚrepair_jsonÚ
isinstanceÚdictÚloadsrN   )r.   r8   Úschema_hintÚtext_reqÚrespÚcleanedÚparsedÚvals           r/   Úgenerate_structuredz'EnterpriseAiGateway.generate_structuredª   s‘  è è € ð ˆØÔð 	dð d½t¼zÈ'ÔJ]ÐlqÐz{Ð?|Ñ?|Ô?|ð  dð  dð  dˆKå Ø”nÐ5Ð5¨Ð5Ð5Ø!Ô/Ø&Ô9Ø&Ô9ØÔ)ØÔ+ð
ñ 
ô 
ˆð ×'Ò'¨Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1ˆØ”,×$Ò$Ñ&Ô&ˆØ×&Ò& yÑ1Ô1×>Ò>¸uÑEÔE×RÒRÐSXÑYÔY×_Ò_ÑaÔaˆåÔ(¨ÀÐFÑFÔFˆÝ�f�dÑ#Ô#ð 	ØˆMð	Ý”*˜WÑ%Ô%ˆCÝ˜#�tÑ$Ô$ð Ø�
ðøåð 	ð 	ð 	ØˆDð	øøøð ˜tœ|Ð,Ð,s   Ä*D? Ä?
EÅEç      N@ÚtimeoutÚfloatc                ó²  ‡ ‡— ddl }ddl}d	ˆˆ fd„}	 |                     ¦   «         }n# t          $ r d}Y nw xY w|r€|                     ¦   «         rl|j                             d¬¦  «        5 }|                     |j         |¦   «         ¦  «         	                    |¬¦  «        cddd¦  «         S # 1 swxY w Y   dS |                      |¦   «         ¦  «        S )
zLSynchronous wrapper for generate_text with thread safety across event loops.r   Nr   r   c               “  ó>   •K  — ‰                      ‰ ¦  «        ƒ d {V —†S ©N)rK   ©r8   r.   s   €€r/   Ú_runz4EnterpriseAiGateway.generate_text_sync.<locals>._runÓ   s-   øè è € Ø×+Ò+¨GÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4r1   é   ©Úmax_workers©r   ©r   r   ©
ÚasyncioÚconcurrent.futuresÚget_running_looprQ   Ú
is_runningÚfuturesÚThreadPoolExecutorÚsubmitÚrunÚresult©r.   r8   r   rŒ   Ú
concurrentr…   ÚloopÚpools   ``      r/   Úgenerate_text_syncz&EnterpriseAiGateway.generate_text_syncÌ   sg  øø€ ð 	ˆˆˆØ!Ð!Ð!Ð!ð	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð	Ø×+Ò+Ñ-Ô-ˆDˆDøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð ð 	'�D—O’OÑ%Ô%ð 	'ØÔ#×6Ò6À1Ð6ÑEÔEð PÈØ—{’{ 7¤;°°±´Ñ7Ô7×>Ò>ÀwÐ>ÑOÔOðPð Pð Pð Pñ Pô Pð Pð Pð Pð Pð Pð Pøøøð Pð Pð Pð Pð Pð Pð —;’;˜t˜t™vœvÑ&Ô&Ð&ó   “( ¨7¶7Á+7B/Â/B3Â6B3c                ó²  ‡ ‡— ddl }ddl}d	ˆˆ fd„}	 |                     ¦   «         }n# t          $ r d}Y nw xY w|r€|                     ¦   «         rl|j                             d¬¦  «        5 }|                     |j         |¦   «         ¦  «         	                    |¬¦  «        cddd¦  «         S # 1 swxY w Y   dS |                      |¦   «         ¦  «        S )
zMSynchronous wrapper for analyze_vision with thread safety across event loops.r   Nr   r   c               “  ó>   •K  — ‰                      ‰ ¦  «        ƒ d {V —†S rƒ   )r^   r„   s   €€r/   r…   z5EnterpriseAiGateway.analyze_vision_sync.<locals>._runè   s-   øè è € Ø×,Ò,¨WÑ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5r1   r†   r‡   r‰   rŠ   r‹   r•   s   ``      r/   Úanalyze_vision_syncz'EnterpriseAiGateway.analyze_vision_syncá   sg  øø€ ð 	ˆˆˆØ!Ð!Ð!Ð!ð	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð	Ø×+Ò+Ñ-Ô-ˆDˆDøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð ð 	'�D—O’OÑ%Ô%ð 	'ØÔ#×6Ò6À1Ð6ÑEÔEð PÈØ—{’{ 7¤;°°±´Ñ7Ô7×>Ò>ÀwÐ>ÑOÔOðPð Pð Pð Pñ Pô Pð Pð Pð Pð Pð Pð Pøøøð Pð Pð Pð Pð Pð Pð —;’;˜t˜t™vœvÑ&Ô&Ð&rš   rƒ   )r   r   r   r   )r2   r   r   r   )r8   r
   r   r   )r8   r   r   r   )r8   r	   r   r_   )r~   )r8   r
   r   r€   r   r   )r8   r   r   r€   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   r7   rK   r^   r}   r™   r�   © r1   r/   r   r   "   sÊ   € € € € € ØTÐTð
ð 
ð 
ð 
ð 
ð.(ð (ð (ð (ð8Rð 8Rð 8Rð 8Rðt*Fð *Fð *Fð *FðX -ð  -ð  -ð  -ðF 8<ð'ð 'ð 'ð 'ð 'ð, :>ð'ð 'ð 'ð 'ð 'ð 'ð 'r1   r   zEnterpriseAiGateway | NoneÚ_GLOBAL_AI_GATEWAYr   c                 ó:   — t           €t          ¦   «         a t           S )z1Returns singleton Enterprise AI Gateway instance.)r£   r   r¢   r1   r/   Úget_ai_gatewayr¥   ú   s   € õ Ð!Ý0Ñ2Ô2ÐÝÐr1   )r   r   )%Ú
__future__r   rl   Úloggingr(   Útypingr   rr   Úapp.core.ai.domain.modelsr   r   r   r   r	   r
   r   Úapp.core.ai.domain.portsr   Ú7app.core.ai.infrastructure.adapters.antigravity_adapterr   Ú4app.core.ai.infrastructure.adapters.lmstudio_adapterr   Ú6app.core.ai.infrastructure.adapters.openrouter_adapterr   Ú*app.core.ai.infrastructure.circuit_breakerr   Ú#app.core.ai.infrastructure.registryr   Úapp.core.settingsr   r   Ú	getLoggerrH   r   r£   Ú__annotations__r¥   r¢   r1   r/   ú<module>r³      sÉ  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð à Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 3Ð 2Ð 2Ð 2Ð 2Ð 2ðð ð ð ð ð ð QÐ PÐ PÐ PÐ PÐ Pðð ð ð ð ð ð NÐ MÐ MÐ MÐ MÐ MØ FÐ FÐ FÐ FÐ FÐ FØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4à	ˆÔ	Ð.Ñ	/Ô	/€ðR'ð R'ð R'ð R'ð R'˜-ñ R'ô R'ð R'ðj 26Ð Ð 5Ð 5Ð 5Ñ 5ðð ð ð ð ð r1   