§
    øžyj5  ã                  óÔ   — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	  ej
        d¦  «        Zdd„Zdd„Zdd„Z G d„ de	¦  «        Z eddddddddd¬¦	  «	        Z ee¦  «         dS )uÁ  ZAI / GLM provider profile.

Z.AI's GLM-4.5-and-later chat models default to thinking-mode ON when the
request omits ``thinking``.  Hermes' ``reasoning_config = {"enabled": False}``
was previously a silent no-op on this route â€” the base profile emits nothing,
so users who turned thinking off (desktop toggle, ``/reasoning none``,
``reasoning_effort: none``/``false`` in config.yaml) kept burning thinking
tokens on every turn.

:meth:`ZaiProfile.build_api_kwargs_extras` translates the Hermes reasoning
config into the wire shape Z.AI's OpenAI-compat endpoint expects:

    {"extra_body": {"thinking": {"type": "enabled" | "disabled"}}}

When no reasoning preference is set (``reasoning_config is None``) the field
is omitted so the server default applies, matching prior behavior.  GLM
models before 4.5 (e.g. ``glm-4-9b``) don't accept ``thinking`` and are left
untouched.

GLM-5.2 additionally exposes a native ``reasoning_effort`` knob with exactly
two enabled levels â€” ``high`` and ``max`` â€” on the OpenAI-compatible endpoint
(per Z.AI / BigModel docs).  Hermes' richer effort scale is collapsed onto
those two so the user's effort preference actually reaches the model instead
of being silently dropped.
é    )ÚannotationsN)ÚAny)Úregister_provider)ÚProviderProfilez^glm-(\d+)(?:\.(\d+))?Úmodelú
str | NoneÚreturnÚboolc                ó*  — | pd                      ¦   «                              ¦   «         }t                               |¦  «        }|sdS t	          |                     d¦  «        ¦  «        }t	          |                     d¦  «        pd¦  «        }||fdk    S )uH   GLM thinking-capable model families: glm-4.5 and later (4.5, 4.6, 5â€¦).Ú Fé   é   r   )é   é   )ÚstripÚlowerÚ_GLM_VERSION_REÚmatchÚintÚgroup)r   Úmr   ÚmajorÚminors        úJ/home/ragecks/.hermes/hermes-agent/plugins/model-providers/zai/__init__.pyÚ_model_supports_thinkingr   &   s…   € à	ˆ�"×ÒÑÔ×#Ò#Ñ%Ô%€AÝ×!Ò! !Ñ$Ô$€EØð ØˆuÝ�—’˜A‘”ÑÔ€EÝ�—’˜A‘”Ð# !Ñ$Ô$€EØ�5ˆ>˜VÒ#Ð#ó    c                ó’   ‡— | pd                      ¦   «                              ¦   «         Š‰sdS t          ˆfd„dD ¦   «         ¦  «        S )a
  Detect GLM-5.2 across the alias spellings providers use.

    Covers the canonical ``glm-5.2`` plus the ``glm-5-2`` / ``glm-5p2``
    variants seen on relays (Fireworks ``glm-5p2``, etc.) and any
    vendor-prefixed form (``z-ai/glm-5.2``, ``zai-org-glm-5-2``).
    r   Fc              3  ó    •K  — | ]}|‰v V — Œ	d S )N© )Ú.0Útokenr   s     €r   ú	<genexpr>z_is_glm_5_2.<locals>.<genexpr>;   s'   øè è € ÐIÐI˜eˆu˜ˆzÐIÐIÐIÐIÐIÐIr   )úglm-5.2zglm-5-2zglm-5p2)r   r   Úany)r   r   s    @r   Ú_is_glm_5_2r%   1   sW   ø€ ð 
ˆ�"×ÒÑÔ×#Ò#Ñ%Ô%€AØð ØˆuÝÐIÐIÐIÐIÐ'HÐIÑIÔIÑIÔIÐIr   Úreasoning_configúdict | Nonec                óü   — t          | t          ¦  «        sdS |                      d¦  «        du rdS |                      d¦  «        pd                     ¦   «                              ¦   «         }|r|dk    rdS |dv rdS d	S )
a~  Map Hermes reasoning effort onto GLM-5.2's native ``high``/``max``.

    GLM-5.2 only supports two enabled effort levels. ``xhigh``/``max``/``ultra``
    request the top tier; everything else that is enabled requests ``high``
    (its minimum thinking level). When reasoning is explicitly disabled, or
    no effort preference is supplied, the server default is left untouched.
    NÚenabledFÚeffortr   Únone>   ÚmaxÚultraÚxhighr,   Úhigh)Ú
isinstanceÚdictÚgetr   r   )r&   r*   s     r   Ú_glm_5_2_reasoning_effortr3   >   s—   € õ Ð&­Ñ-Ô-ð ØˆtØ×Ò˜IÑ&Ô&¨%Ð/Ð/Øˆtà×"Ò" 8Ñ,Ô,Ð2°×9Ò9Ñ;Ô;×AÒAÑCÔC€FØð �V˜vÒ%Ð%ØˆtàÐ*Ð*Ð*Øˆuàˆ6r   c                  ó"   — e Zd ZdZdddœdd
„ZdS )Ú
ZaiProfileuE   Z.AI / GLM â€” extra_body.thinking on/off + GLM-5.2 reasoning_effort.N)r&   r   r&   r'   r   r   r	   ú%tuple[dict[str, Any], dict[str, Any]]c               ó  — i }i }t          |¦  «        st          |¦  «        s||fS t          |t          ¦  «        r"|                     d¦  «        du}d|rdndi|d<   t          |¦  «        rt          |¦  «        }|�||d<   ||fS )Nr)   FÚtypeÚdisabledÚthinkingÚreasoning_effort)r   r%   r0   r1   r2   r3   )Úselfr&   r   ÚcontextÚ
extra_bodyÚ	top_levelr)   r*   s           r   Úbuild_api_kwargs_extrasz"ZaiProfile.build_api_kwargs_extrasX   s¸   € ð &(ˆ
Ø$&ˆ	å'¨Ñ.Ô.ð 	)µ{À5Ñ7IÔ7Ið 	)Ø˜yÐ(Ð(õ Ð&­Ñ-Ô-ð 	TØ&×*Ò*¨9Ñ5Ô5¸UÐBˆGØ&,¸7Ð.R¨i¨iÈ
Ð%SˆJ�zÑ"å�uÑÔð 	7Ý.Ð/?Ñ@Ô@ˆFØÐ!Ø06�	Ð,Ñ-à˜9Ð$Ð$r   )r&   r'   r   r   r	   r6   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   r   r   r   r5   r5   U   s?   € € € € € ØOÐOð 26È4ð%ð %ð %ð %ð %ð %ð %ð %r   r5   Úzai)Úglmzz-aizz.aiÚzhipu)ÚGLM_API_KEYÚZAI_API_KEYÚZ_AI_API_KEYz
Z.AI (GLM)u   Z.AI / GLM â€” Zhipu AI modelszhttps://z.ai/)r#   zglm-5zglm-4-9bzhttps://api.z.ai/api/paas/v4zglm-4.5-flash)	ÚnameÚaliasesÚenv_varsÚdisplay_nameÚdescriptionÚ
signup_urlÚfallback_modelsÚbase_urlÚdefault_aux_model)r   r   r	   r
   )r&   r'   r	   r   )rD   Ú
__future__r   ÚreÚtypingr   Ú	providersr   Úproviders.baser   Úcompiler   r   r%   r3   r5   rE   r   r   r   ú<module>rZ      s.  ððð ð4 #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø *Ð *Ð *Ð *Ð *Ð *à�"”*Ð6Ñ7Ô7€ð$ð $ð $ð $ð
Jð 
Jð 
Jð 
Jðð ð ð ð.%ð %ð %ð %ð %�ñ %ô %ð %ð4 €jØ	Ø,Ø;ØØ0Øðð
 ,Ø%ðñ ô €ð  Ð �#Ñ Ô Ð Ð Ð r   