Ë
    âß²jD  ã                   ó  — d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZ  ej                  e«      ZdZe› d�Z G d„ d	e«      Z G d
„ de«      Z edddddddeedd¬«      Z edddddddeedd¬«      Z e	e«        e	e«       y)uÉ   CommandCode provider profiles: ``commandcode`` (chat_completions) and
``commandcode-anthropic`` (anthropic_messages, Bearer auth â€” see
``agent/anthropic_adapter.py``). Same key and base URL for both.é    N)Úopen_credentialed_url)Úget_provider_profileÚregister_provider)ÚProviderProfileÚ_profile_user_agentz&https://api.commandcode.ai/provider/v1ú/modelsc            
       ó|   — e Zd ZdZddddœdedz  dedz  dedee   dz  fd	„Zddd
œdedz  dedz  de	eef   fd„Z
y)ÚCommandCodeProfileu<   CommandCode â€” OpenAI-compatible chat completions endpoint.Nç       @©Úapi_keyÚbase_urlÚtimeoutr   r   r   Úreturnc                óŽ  — |xs dj                  «       j                  d«      }|xr	 |t        k7  }|r|dz   nt        }	 t        j
                  j                  |«      }|j                  dd«       |j                  dt        «       «       t        ||¬«      5 }t        j                  |j                  «       j                  «       «      }	ddd«       	j                  d	g «      D �
cg c]  }
t        |
t         «      sŒd
|
v sŒ|
d
   ‘Œ c}
S # 1 sw Y   ŒBxY wc c}
w # t"        $ r }t$        j'                  d|«       Y d}~yd}~ww xY w)zŸPublic (unauthenticated) /models endpoint. The picker passes base_url
        unconditionally, so only a value differing from the default is a custom endpoint.Ú ú/r   ÚAcceptzapplication/jsonz
User-Agent)r   NÚdataÚidzfetch_models(commandcode): %s)ÚstripÚrstripÚ_COMMANDCODE_BASEÚ_COMMANDCODE_MODELS_URLÚurllibÚrequestÚRequestÚ
add_headerr   r   ÚjsonÚloadsÚreadÚdecodeÚgetÚ
isinstanceÚdictÚ	ExceptionÚloggerÚdebug)Úselfr   r   r   Úcaller_baseÚcustomÚ
models_urlÚreqÚrespr   ÚmÚexcs               úQ/home/ubuntu/.hermes/hermes-agent/plugins/model-providers/commandcode/__init__.pyÚfetch_modelszCommandCodeProfile.fetch_models   s  € ð
  ’~ 2×,Ñ,Ó.×5Ñ5°cÓ:ˆØÒA Ô0AÑ!AˆÙ06�[ 9Ò,Ô<Sˆ
ð		Ü—.‘.×(Ñ(¨Ó4ˆCØ�N‰N˜8Ð%7Ô8Ø�N‰N˜<Ô)<Ó)>Ô?Ü& s°GÔ<ð 8ÀÜ—z‘z $§)¡)£+×"4Ñ"4Ó"6Ó7�÷8à%)§X¡X¨f°bÓ%9Ö_ ¼ZÈÌ4Õ=PÐUYÐ]^ÒU^�A�d“GÒ_Ð_÷8ð 8üâ_øÜò 	Ü�L‰LÐ8¸#Ô>Üûð	úsH   ¿AD Â2D
Ã	D Ã%DÃ;DÄ DÄD Ä
DÄD Ä	EÄ$D?Ä?E©Úreasoning_configÚmodelr4   r5   c                óâ   — |xs dj                  «       }|j                  «       j                  d«      si i fS t        d«      }|€i i fS  |j                  d||j                  dd«      d   dœ|¤ŽS )uL  DeepSeek ids (``deepseek/deepseek-v4-flash``) get the native DeepSeek wire
        controls: DeepSeek V4+ defaults to thinking when ``thinking`` is omitted, so
        without them ``/reasoning`` never reaches the request (#95232). Other model
        families stay a no-op â€” CommandCode declares no reasoning vocabulary for them.r   z	deepseek/Údeepseekr   é   r3   © )r   ÚlowerÚ
startswithr   Úbuild_api_kwargs_extrasÚsplit)r)   r4   r5   Úcontextr/   Únatives         r1   r<   z*CommandCodeProfile.build_api_kwargs_extras*   sƒ   € ð Š[�b×ÑÓ!ˆØ�w‰w‹y×#Ñ# KÔ0Ø�r�6ˆMô & jÓ1ˆØˆ>Ø�r�6ˆMØ-ˆv×-Ñ-ð 
Ø-°Q·W±W¸SÀ!³_ÀQÑ5Gñ
ØKRñ
ð 	
ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚfloatÚlistr2   r%   Útupler<   r9   r@   r1   r
   r
      sz   „ ÙFð (,ÀDÐ[^òØ ™*ðØ7:¸T±zðØSXðà	ˆc‰�TÑ	óð* 26È4ò
Ø#'¨$¡;ð
Ø>AÀD¹jð
à	ˆt�TˆzÑ	ô
r@   r
   c            
       óV   ‡ — e Zd ZdZddddœdedz  dedz  dedee   dz  fˆ fd	„Zˆ xZS )
ÚCommandCodeAnthropicProfileu;   CommandCode â€” Anthropic Messages API-compatible endpoint.Nr   r   r   r   r   r   c                ó~   •— t         ‰| �  |||¬«      }|€dS |D �cg c]  }|j                  d«      sŒ|‘Œ c}S c c}w )z=Public /models endpoint, filtered to Anthropic-family models.r   Nzclaude-)Úsuperr2   r;   )r)   r   r   r   Ú
all_modelsr/   Ú	__class__s         €r1   r2   z(CommandCodeAnthropicProfile.fetch_modelsA   sF   ø€ ô ‘WÑ)°'ÀHÐV]Ð)Ó^ˆ
Ø!Ð)ˆtÐa¸:Ö/a°aÈÏÉÐV_ÕI`²Ò/aÐaùÒ/as   œ:³:)	rA   rB   rC   rD   rE   rF   rG   r2   Ú__classcell__)rN   s   @r1   rJ   rJ   >   sQ   ø„ ÙEð (,ÀDÐ[^òbØ ™*ðbØ7:¸T±zðbØSXðbà	ˆc‰�TÑ	÷bñ br@   rJ   Úcommandcode)zcommandcode-chatÚchat_completions)ÚCOMMANDCODE_API_KEYÚCOMMANDCODE_BASE_URLÚCommandCodeu4   CommandCode â€” 20+ models via OpenAI-compatible APIzhttps://commandcode.ai/)zdeepseek/deepseek-v4-proúdeepseek/deepseek-v4-flashzQwen/Qwen3.7-MaxzQwen/Qwen3.6-Pluszmoonshotai/Kimi-K2.6zzai-org/GLM-5.1zMiniMaxAI/MiniMax-M2.7zstepfun/Step-3.5-Flashzxiaomi/mimo-v2.5-prozgoogle/gemini-3.5-flashzgpt-5.5rU   )ÚnameÚaliasesÚapi_modeÚenv_varsÚdisplay_nameÚdescriptionÚ
signup_urlr   r,   Úfallback_modelsÚdefault_aux_modelzcommandcode-anthropic)zcommandcode-claudeÚanthropic_messages)rR   ÚCOMMANDCODE_ANTHROPIC_BASE_URLzCommandCode (Anthropic)u8   CommandCode â€” Claude models via Anthropic Messages API)zclaude-sonnet-4-6zclaude-opus-4-7úclaude-haiku-4-5-20251001ra   )rD   r   ÚloggingÚurllib.requestr   Úhermes_cli.urllib_securityr   Ú	providersr   r   Úproviders.baser   r   Ú	getLoggerrA   r'   r   r   r
   rJ   rP   Úcommandcode_anthropicr9   r@   r1   ú<module>ri      sÕ   ðñDó Û Û å <ß =ß ?à	ˆ×	Ñ	˜8Ó	$€à<Ð Ø.Ð/¨wÐ7Ð ô(
˜ô (
ôVbÐ"4ô bñ !Ø	Ð 5Ð@Rð =ØÐ,bØ(Ð3DÐQhðð
 3ô€ñ 4Ø	 Ð*AÐL`ØFØ*ØJØ(Ð3DÐQhØYØ1ôÐ ñ �+Ô Ù Ð'Õ (r@   