Ë
    âß²jI   ã                  óæ   — U d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
  ej                  d«      ZdZi Zded	<   d
Zdd„Zg d¢ZdddgdfdddgdfddedfddedfgZdd„Zd d!d„Zdd„Zd"d„Zy)#a  Kimi Code and Z.AI endpoint auto-detection, LM Studio base-URL normalization.

Re-exported from ``hermes_cli/auth.py`` (patch targets unchanged); origin helpers are imported
lazily per function so ``hermes_cli.auth.<helper>`` patches still intercept and no cycle forms.
é    )ÚannotationsN)ÚDictÚOptional)Úhttpxzhermes_cli.authi,  zDict[str, float]Ú_zai_probe_failed_untilzhttps://api.kimi.com/codingc                ó@   — |r|S | r| j                  d«      rt        S |S )zIKimi base URL from the key prefix; an explicit KIMI_BASE_URL always wins.zsk-kimi-)Ú
startswithÚKIMI_CODE_BASE_URL)Úapi_keyÚdefault_urlÚenv_overrides      ú=/home/ubuntu/.hermes/hermes-agent/hermes_cli/auth_zai_kimi.pyÚ_resolve_kimi_base_urlr      s'   € áØÐÙ�7×%Ñ% jÔ1Ü!Ð!ØÐó    )zglm-5.3zglm-5.3-flashzglm-5.2zglm-5.1zglm-5v-turbozglm-4.7Úglobalzhttps://api.z.ai/api/paas/v4zglm-5ÚGlobalÚcnz$https://open.bigmodel.cn/api/paas/v4ÚChinazcoding-globalz#https://api.z.ai/api/coding/paas/v4zGlobal (Coding Plan)z	coding-cnz+https://open.bigmodel.cn/api/coding/paas/v4zChina (Coding Plan)c                óx  — |\  }}}}|D ]€  }	 t        j                  |› d�d| › �ddœ|ddddd	œgd
œ|¬«      }|j                  dk(  r!t        j	                  d|||«       ||||dœc S t        j	                  d|||j                  «       Œ‚ y# t
        $ r"}	t        j	                  d|||	«       Y d}	~	Œªd}	~	ww xY w)zWProbe one Z.AI endpoint, trying its candidate models in order; None when none succeeds.z/chat/completionszBearer zapplication/json)ÚAuthorizationzContent-TypeFé   ÚuserÚping)ÚroleÚcontent)ÚmodelÚstreamÚ
max_tokensÚmessages)ÚheadersÚjsonÚtimeoutéÈ   z(Z.AI endpoint probe: %s (%s) model=%s OK)ÚidÚbase_urlr   Úlabelz,Z.AI endpoint probe: %s model=%s returned %sz+Z.AI endpoint probe: %s model=%s failed: %sN)r   ÚpostÚstatus_codeÚloggerÚdebugÚ	Exception)
r   Úendpointr"   Úep_idr%   Úprobe_modelsr&   r   ÚrespÚexcs
             r   Ú_probe_single_zai_endpointr1   1   sé   € à+3Ñ(€Eˆ8�\ 5Øò [ˆð	[Ü—:‘:Ø�*Ð-Ð.Ø,3°G°9Ð*=ÐOaÑbØ$°ÀQÐ^dÐqwÑUxÐTyÑzØô	ˆDð ×Ñ 3Ò&Ü—‘ÐGÈÐPXÐZ_Ô`Ø#°ÀEÐTYÑZÒZÜ�L‰LÐGÈÐPUÐW[×WgÑWgÕhð[ð øô ò 	[Ü�L‰LÐFÈÈuÐVY×ZÑZûð	[ús   ŽABÁ)"BÂ	B9ÂB4Â4B9c           	     ó"  ‡‡— ddl m}m}  |t        t        «      ¬«      }	 t        D �ci c]  }|j                  t        | ||«      |d   “Œ  }}|j                  «       D ��ci c]  \  }}||“Œ
 c}}Ši Šd	ˆˆfd„}	 ||«      D ]>  }
	 |
j                  «       }|�|‰||
   <    |	d¬«      }|€Œ*|c |j                  d¬«       S   |	d¬«      |j                  d¬«       S c c}w c c}}w # t        $ r Y ŒTw xY w# |j                  d¬«       w xY w)
z]Probe z.ai endpoints in parallel; first working one in ZAI_ENDPOINTS priority order, or None.r   )ÚThreadPoolExecutorÚas_completed)Úmax_workersc                ór   •— t         D ]-  }| r‰|d      j                  «       s y |d   ‰v sŒ%‰|d      c S  y )Nr   )ÚZAI_ENDPOINTSÚdone)Úrequire_doneÚepÚby_idÚresultss     €€r   Ú_first_readyz)detect_zai_endpoint.<locals>._first_readyO   sL   ø€ ô $ò *�Ù¨¨b°©e©×(9Ñ(9Ô(;ÙØ�a‘5˜GÒ#Ø" 2 a¡5™>Ò)ð	*ð
 r   T)r9   F)Úwait)r9   ÚboolÚreturnúOptional[Dict[str, str]])Úconcurrent.futuresr3   r4   Úlenr7   Úsubmitr1   ÚitemsÚresultr+   Úshutdown)r   r"   r3   r4   Úpoolr:   ÚfuturesÚfr-   r=   ÚfuturerF   Úwinnerr;   r<   s                @@r   Údetect_zai_endpointrM   E   s  ù€ çCá¬#¬mÓ*<Ô=€Dð"ÜboÖpÐ\^�4—;‘;Ô9¸7ÀBÈÓPÐRTÐUVÑRWÑWÐpˆÐpØ*1¯-©-«/×:™h˜a �˜‘Ó:ˆØ-/ˆö	ñ # 7Ó+ò 		ˆFðØŸ™›�ØÐ%Ø/5�G˜G F™OÑ,ñ "¨tÔ4ˆFØÑ!Ø‘ð 	�‰˜5ˆÕ!ð		ñ ¨Ô/à�‰˜5ˆÕ!ùò5 qùÛ:øô$ ò Ùðûð 	�‰˜5ˆÕ!úsX   ¢C: ª#C ÁC: Á"C%Á/C: ÂC+Â"C: Â.C: Ã	C: Ã C: Ã+	C7Ã4C: Ã6C7Ã7C: Ã:Dc                ó2  — ddl m}m}m}m}m}m} |r|S | s|S t        j                  | j                  «       «      j                  «       dd }	 | |«       d«      xs i }
|
j                  d«      }t        |t        «      rD|j                  d«      r3|j                  dd	«      |	k(  rt        j                  d
|d   «       |d   S t         j                  |	d«      t#        j"                  «       kD  r|S  || «      }|r|j                  d«      s:t        j                  d|«       t#        j"                  «       t$        z   t         |	<   |S |d   |j                  dd	«      |j                  dd	«      |j                  dd	«      |	dœ}	  |«       5   |«       } ||d«      xs i }||d<    ||d|d¬«        ||«       ddd«       t        j+                  d|d   |d   «       |d   S # 1 sw Y   Œ+xY w# t&        $ r }t        j)                  d|«       Y d}~ŒRd}~ww xY w)zÙZ.AI base URL by probing endpoints; an explicit GLM_BASE_URL always wins.

    The detected endpoint is cached in provider state (auth.json) keyed on a hash of the API key so
    subsequent starts skip the probe.
    r   )Ú_auth_store_lockÚ_load_auth_storeÚ_load_provider_stateÚ_save_auth_storeÚ_store_provider_staterM   Né   ÚzaiÚdetected_endpointr%   Úkey_hashÚ zZ.AI: using cached endpoint %sg        z.Z.AI: probe failed, falling back to default %sr$   r   r&   )r%   Úendpoint_idr   r&   rW   F)Ú
set_activezHZ.AI: could not persist detected endpoint (%s); will re-probe next startz$Z.AI: auto-detected endpoint %s (%s))Úhermes_cli.authrO   rP   rQ   rR   rS   rM   ÚhashlibÚsha256ÚencodeÚ	hexdigestÚgetÚ
isinstanceÚdictr)   r*   r   ÚtimeÚ_ZAI_PROBE_FAILURE_TTL_SECONDSr+   ÚwarningÚinfo)r   r   r   rO   rP   rQ   rR   rS   rM   rW   ÚstateÚcachedÚdetectedrV   Ú
auth_storeÚstate_under_lockr0   s                    r   Ú_resolve_zai_base_urlrl   h   s  € ÷ W÷  WÙØÐáØÐä�~‰~˜gŸn™nÓ.Ó/×9Ñ9Ó;¸C¸RÐ@€HÙ Ñ!1Ó!3°UÓ;ÒA¸r€EØ�Y‰YÐ*Ó+€FÜ�&œ$Ô F§J¡J¨zÔ$:¸v¿z¹zÈ*ÐVXÓ?YÐ]eÒ?eÜ�‰Ð5°v¸jÑ7IÔJØ�jÑ!Ð!ô ×"Ñ" 8¨SÓ1´D·I±I³KÒ?ØÐñ # 7Ó+€HÙ˜Ÿ™ jÔ1Ü�‰ÐEÀ{ÔSÜ,0¯I©I«KÔ:XÑ,XÔ Ñ)ØÐð ˜ZÑ(¸¿¹ÀdÈBÓ9OØ—‘˜g rÓ*°X·\±\À'È2Ó5NØñÐð	hÙÓñ 	)Ù)Ó+ˆJÙ3°JÀÓFÒLÈ"ÐØ4EÐÐ0Ñ1á! *¨eÐ5EÐRWÕXÙ˜ZÔ(÷	)ô ‡K�KÐ6¸ÀÑ8IÈ8ÐT^ÑK_Ô`Ø�JÑÐ÷	)ð 	)ûô ò hÜ�‰ÐaÐcf×gÑgûðhús0   ÆG- Æ	.G!Æ7G- Ç!G*Ç&G- Ç-	HÇ6HÈHc                óÜ   — t        | xs d«      j                  «       j                  d«      }dD ]3  }|j                  |«      sŒ|dt	        |«        j                  d«      } n |xs ddz   S )a  Return the OpenAI-compatible LM Studio runtime base URL.

    LM Studio's native management API lives under ``/api/v1`` while its OpenAI-compatible chat
    endpoint lives under ``/v1``; users paste either form, so normalize before the SDK appends
    ``/chat/completions``.
    rX   ú/)z/api/v1z/apiú/v1Nzhttp://127.0.0.1:1234ro   )ÚstrÚstripÚrstripÚendswithrC   )r%   ÚrootÚsuffixs      r   Ú$_normalize_lmstudio_runtime_base_urlrv   ›   st   € ô ˆxŠ~˜2Ó×$Ñ$Ó&×-Ñ-¨cÓ2€DØ,ò ˆØ�=‰=˜Õ Ø˜œ3˜v›;˜,Ð'×.Ñ.¨sÓ3ˆDÙðð Ò+Ð+¨uÑ4Ð4r   )r   rp   r   rp   r   rp   r@   rp   )r   rp   r,   Útupler"   Úfloatr@   rA   )g       @)r   rp   r"   rx   r@   rA   )r%   rp   r@   rp   )Ú__doc__Ú
__future__r   Úloggingr\   rc   Útypingr   r   Úhermes_cli.auth_constantsr   Ú	getLoggerr)   rd   r   Ú__annotations__r
   r   Ú_ZAI_CODING_PROBE_MODELSr7   r1   rM   rl   rv   © r   r   ú<module>r‚      s¶   ðòõ #ã Û Û ß !Ý +à	ˆ×	Ñ	Ð,Ó	-€ð "%Ð Ø,.Ð Ð)Ó .ð 3Ð óò iÐ ð Ð4¸g¸YÈ(ÐSØ	Ð<¸w¸iÈ7ÐSØÐ;Ð>VÐXnÐoØÐCÐE]Ð_tÐuð€óô( "óF0 ôf5r   