
    PL
j#                         U d Z ddlZddlmZ ddlmZ ddlmZ  ej        e	          Z
daee         dz  ed<    G d de          Z ed	d
ddddddd	  	        Z ee           dS )zOpenRouter provider profile.    N)Any)register_provider)ProviderProfile_CACHEc                        e Zd ZdZddddedz  dedee         dz  f fdZdd	d
edz  dede	eef         fdZ
dddddde	dz  dededz  d
edz  dedee	eef         e	eef         f         fdZ xZS )OpenRouterProfileuM   OpenRouter aggregator — provider preferences, reasoning config passthrough.Ng       @api_keytimeoutr
   r   returnc                    t           t           S 	 t                                          d|          }||a |S # t          $ r&}t                              d|           Y d}~dS d}~ww xY w)u|  Fetch from public OpenRouter catalog — no auth required.

        Note: Tool-call capability filtering is applied by hermes_cli/models.py
        via fetch_openrouter_models() → _openrouter_model_supports_tools(), not
        here. The picker early-returns via the dedicated openrouter path before
        reaching this method, so filtering here would be unreachable.
        Nr	   zfetch_models(openrouter): %s)r   superfetch_models	Exceptionloggerdebug)selfr
   r   resultexc	__class__s        O/home/kuhnn/.hermes/hermes-agent/plugins/model-providers/openrouter/__init__.pyr   zOpenRouterProfile.fetch_models   s     M	WW))$)HHF!M 	 	 	LL7===44444	s   (: 
A*A%%A*)
session_idr   contextc                @   i }|                     d          }|r||d<   |                     d          pd}|dk    rb|                     d          }|K|dk    rE	 t          |          }n# t          t          f$ r d }Y nw xY w|d|cxk    rdk    rn n	d	|d
g|d<   |S )Nprovider_preferencesprovidermodel zopenrouter/pareto-codeopenrouter_min_coding_scoreg        g      ?zpareto-router)idmin_coding_scoreplugins)getfloat	TypeError
ValueError)r   r   r   bodyprefsr   scorescore_fs           r   build_extra_bodyz"OpenRouterProfile.build_extra_body*   s      "233 	%$D W%%+,,,KK =>>E Ub[[##EllGG!:. # # #"GGG#&3'+@+@+@+@S+@+@+@+@+@.GLL'DO s   A* *B ?B F)reasoning_configsupports_reasoningr   r   r,   r-   r   c                    i }|r|t          |          |d<   nddd|d<   i }|r|r|                    d          r||d<   ||rd|ini fS )	a  OpenRouter passes the full reasoning_config dict as extra_body.reasoning.

        For xAI Grok models routed through OpenRouter, attach the
        ``x-grok-conv-id`` header so that xAI's prompt cache stays pinned to
        the same backend server across turns.
        N	reasoningTmedium)enabledeffort)z
x-ai/grok-z	xai/grok-zx-grok-conv-idextra_headers)dict
startswith)r   r,   r-   r   r   r   
extra_bodyr3   s           r   build_api_kwargs_extrasz)OpenRouterProfile.build_api_kwargs_extrasD   s     &(
 	P+*./?*@*@
;''6:h*O*O
;'(* 	9% 	9E$4$45P$Q$Q 	9.8M*+}TO];;RTTT    )__name__
__module____qualname____doc__strr$   listr   r   r4   r+   booltupler7   __classcell__)r   s   @r   r   r      se       WW
 #	   t 	
 
cT	     4 +/   4Z;>	c3h   : )-#( !%U U U +U !	U
 TzU $JU U 
tCH~tCH~-	.U U U U U U U Ur8   r   
openrouter)or)OPENROUTER_API_KEY
OpenRouteru*   OpenRouter — unified API for 200+ modelszhttps://openrouter.ai/keyszhttps://openrouter.ai/api/v1z#https://openrouter.ai/api/v1/models)zanthropic/claude-sonnet-4.6zopenai/gpt-5.4zdeepseek/deepseek-chatzgoogle/gemini-3-flash-previewzqwen/qwen3-plus)	namealiasesenv_varsdisplay_namedescription
signup_urlbase_url
models_urlfallback_models)r<   loggingtypingr   	providersr   providers.baser   	getLoggerr9   r   r   r>   r=   __annotations__r   rB    r8   r   <module>rV      s   " " "        ' ' ' ' ' ' * * * * * *		8	$	$S	D   PU PU PU PU PU PU PU PUf 	$<++4  
$  *     r8   