Ë
    áß²j’‚ ã            ,       óDH  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	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mZmZmZmZmZmZmZ ddlmZmZmZ ddlmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&m'Z' dd	l(m)Z*m+Z,m-Z.m/Z0 dd
l1m2Z2 ddl3m4Z4 erddl5m6Z6 da7ee8   e9d<   de8fd„Z: G d„ d«      Z; e;«       Z6 e
jx                  «       Z= G d„ d«      Z>de?fd„Z@ej‚                  d„ «       ZBddlCmDZD ddlEmFZFmGZG ddlHmIZI ddlJmKZK ddlLmMZMmNZNmOZOmPZP ddlQmRZRmSZSmTZTmUZUmVZV ddlWmXZXmYZY ddlZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZa  ejÄ                  ec«      Zd ee«       Zfeee9d<    ee«       Zgeee9d<    ee«       Zheee9d <    ee«       Zieee9d!<   d"eej   defd#„Zkd$ald$d%œd"eej   d&e?deejef   fd'„Zmd(ejd"ejd)edefd*„Zn e
jx                  «       Zo G d+„ d,ep«      Zqde?fd-„Zrde?fd.„Zsej‚                  �düd0e?fd1„«       Ztdeeg ef      fd2„Zud3eg ef   de?fd4„Zv G d5„ d6«      Zw e
jx                  «       Zx e
jx                  «       Zy e
jx                  «       Zz e
jx                  «       Z{d7e
jx                  d8ejddfd9„Z|�dýd:„Z}�dýd;„Z~�dýd<„Z�dýd=„Z€de?fd>„Z��dþd?ed@ejdAedefdB„Z‚dCede?fdD„Zƒdeegdf   fdE„Z„dFZ…ej‚                  d7e
jx                  fdG„«       Z†ej‚                  dH„ «       Z‡deeˆ   fdI„Z‰ej‚                  dJeeˆ   fdK„«       ZŠdLee‹ejef   gef   d)e‹ejef   defdM„ZŒdNedOejde?fdP„Z�d?edQede?fdR„ZŽdSejfdT„Z�d$a�dUdUdUdUdUdVœZ‘da’eeejejf      e9dW<   deejejf   fdX„Z“dYeej   dejfdZ„Z” e•«       Z–e•e9d[<   d\eej   dejfd]„Z—d\eej   de?fd^„Z˜d\eej   de?fd_„Z™d`ZšdaZ›�dþd\eej   dYeej   de?fdb„Zœd\eej   dYeej   deej   fdc„Z��dþd\eej   dYeej   de?fdd„Zžd\eej   de?fde„ZŸ ee«       Z eee9df<   dYeej   d"eej   dgeejef   dhepddf
di„Z¡	 �dÿd\eej   d"eej   dYeej   ddjfdk„Z¢	 �dþd/dlœd\eej   dYeej   dme?deeˆ   fdn„Z£doZ¤e¥e9dp<   dqZ¦e¥e9dr<   dsejde¥fdt„Z§duejdejfdv„Z¨d$dwœduejdxe?dejfdy„Z©dzd{d|d}d|d~dd€d�d‚dƒd„d…d…d†œZªeejejf   e9d‡<   eªZ«eejejf   e9dˆ<    e¬d‰h«      Z­e¬e9dŠ<   d‹eej   de?fdŒ„Z®d�dŽd�œZ¯eejejf   e9d�<   dYejdeej   fd‘„Z° e¬d’d“h«      Z±e¬e9d”<   d•d–d—d˜œZ²d™e‹dz  de‹dz  fdš„Z³�dþd›e‹dz  de‹fdœ„Z´d�džiZµd"ejdz  de‹fdŸ„Z¶dd l·m¸Z¹ d•d–d¡e¹› �d¢œZºdd£l»m¼Z½ de‹fd¤„Z¾d$a¿e?e9d¥<   d¦ZÀdƒZÁd§ZÂd¨ZÃ eI«       d©z  ZÄeÄZÅdª„ ZÆd«ZÇd¬ZÈdSejde?fd­„ZÉd"ejdejfd®„ZÊ�d dYejd°ejdee   fd±„ZËdYejdee?ee   f   fd²„ZÌ�dþdYejd³edee   fd´„ZÍdµedejfd¶„ZÎ�d dµed·ejdejfd¸„ZÏ e¬d¹h«      ZÐdSejde?fdº„ZÑdeÒfd»„ZÓd¼ejdejfd½„ZÔd¾edeeej   ee   ef   fd¿„ZÕdÀedÁeej   ddfdÂ„ZÖ G dÃ„ dÄ«      Z× G dÅ„ dÆ«      ZØ G dÇ„ dÈ«      ZÙ G dÉ„ dÊ«      ZÚ G dË„ dÌ«      ZÛeÚZÜ G dÍ„ dÎ«      ZÝ G dÏ„ dÐeÛ«      ZÞdÑeejef   dÒeddfdÓ„Zß G dÔ„ dÕ«      Zà G dÖ„ d×«      Zá G dØ„ dÙeÛ«      Zâ G dÚ„ dÛ«      Zã G dÜ„ dÝ«      Zä G dÞ„ dßeÛ«      Zåd"ejde?fdà„Zæ	 �dþdNed\ejd(ejd"ejdáeej   defdâ„Zçdee‹   fdã„ZèdYe‹dejfdä„Zéd$dåœdæe?dee¥ejejf      fdç„Zêd$ddèœdæe?déeej   dee¥ejejf      fdê„Zëdëeejef   deeejejf      fdì„Zìdeeejejf      fdí„Zídeej   fdî„Zîdeee6   eej   f   fdï„Zïd$d$dðœd"ejdYejdñe?dòe?dee‹   f
dó„ZðdYejdee‹   fdô„Zñ ee«       Zòeee9dõ<   d\eej   de?fdö„Zódee?ejf   fd÷„Zôd\ejddfdø„Zõ�dÿdùeeejeg ejf   f      d\ejdeee6   eej   f   fdú„Zö�dþd\ejdejfdû„Z÷�ddüe?deee6   eej   f   fdý„Zødüe?dþeej   deej   fdÿ„Zùd$�d œ�dej�de?�de?dejf�d„Zú e�jö                  eúd\d/�¬«      Zü e�jö                  eúdYd/d/�¬«      Zý e�jö                  eúd(d$�¬«      Zþ e�jö                  eúd"d$�¬«      Zÿ�deej   deeej   eej   f   f�d„�Z dejf�d	„�Z�d
ejdejf�d„�Zd¯�aeje9�d<   d¯�aeje9�d<   d¯�aeje9�d<   d¯�aee9�d<   d¯�aeje9�d<   d¯�aeje9�d<    e�j                  �dd�¬«      �Z
e�j                  eeejef         e9�d<    e�j                  �dd�¬«      �Ze�j                  eeejef         e9�d<   ej‚                  �de¥d)e‹f�d„«       �Z�d„ �Z�d„ �ZdYejdz  d\ejdz  dáejdz  ddf�d„�Z�deeejejf      dYeej   d\eej   ddf�d„�Zdd�dœdYejdz  dáejdz  de¥ejeje‹ejef   f   dz  f�d„�Zddd�d œ�d!ed)e‹ejef   dYejdz  dáejdz  �d"ee‹ejef   gef   dz  def�d#„�Zddd�d œ�d!ed)e‹ejef   dYejdz  dáejdz  �d"ee‹ejef   gef   dz  def�d$„�Zdd�dœ�d!ed)e‹ejef   dYejdz  dáejdz  def
�d%„�Z�d&�aee�d'f   e9�d(<    e
�j,                  «       �Z�d)ee�d'f   ddf�d*„�Zdeeejef      f�d+„�Z�dejdef�d,„�Zd¯d¯d¯d¯d¯d¯d¯�d-œdYejd\ej�d.ejd"ejd(edáej�d/ej�d0ej�d1ejde�j6                  f�d2„�Z�d3e�j6                  ddf�d4„�Zej‚                  �d5eeejef      f�d6„«       �Z�dý�d7„�Zdeeej   eej   eej   f   f�d8„�Z dejf�d9„�Z!�dý�d:„�Z"d"ejddf�d;„�Z#deee   eej   f   f�d<„�Z$d\ejdeee   eej   f   f�d=„�Z%dejf�d>„�Z&d\ejdeee   eej   f   f�d?„�Z'dddd�d@œd\eej   dùeej   �dAeej   dáeej   deee   eej   f   f
�dB„�Z(�dþdùeeejeg ejf   f      deee   eej   f   f�dC„�Z)�dD�Z*�e*�dEz   �Z+�d5eeejef      deejef   f�dF„�Z,dee¥   f�dG„�Z-�dH�Z.i �Z/eeeˆf   e9�dI<   i �Z0eeeˆf   e9�dJ<   i �Z1eeejf   e9�dK<   �dL�dM�dN�dN�dO�dO�dPœ�Z2dYejdejf�dQ„�Z3�dR�Z4	 �dþd�e4e�jj                  �dSœdYej�dTeeˆ   d"eej   �dUej�dVeÒddf�dW„�Z6�dþd8ejd"eej   de?f�dX„�Z7	 �dþd�dYœd8ejd‹eej   d"eej   ddf�dZ„�Z8�dý�d[„�Z9�d\ej�d]eej�d'f   de?f�d^„�Z:e�d_z   �Z;�d`�e<de?f�da„�Z=de?f�db„�Z>�dc�Z?�dd�Z@�d`�e<de?f�de„�ZA�d`�e<de?f�df„�ZB�d`�e<de?f�dg„�ZC�d`�e<de?f�dh„�ZD�d`�e<de?f�di„�ZE�dj�ZF�dk�ZGdeÒf�dl„�ZH�d`�e<de?f�dm„�ZI�d`�e<�dnejde?f�do„�ZJ�d`�e<de?f�dp„�ZKd)e‹dee‹   f�dq„�ZL�d`�e<de?f�dr„�ZM�d`�e<de?f�ds„�ZNd)e‹dee‹   f�dt„�ZO�d`�e<de?f�du„�ZP�d`�e<de?f�dv„�ZQ�d`�e<de?f�dw„�ZR e¬h �dx£«      �ZSd‹eej   �d`�e<de?f�dy„�ZTdYejddf�dz„�ZUdÀede?f�d{„�ZV�dþd³edµedejf�d|„�ZWd�d}œdYej�d5eeejef      dejf�d~„�ZX�d�ZY�d€�ZZd"ej�d�eeejejf   �d'f   deej   f�d‚„�Z[	 �dþ�dƒej�d!e�d5eeejef      deej   f�d„„�Z\d¯�d…œdYej�d`�e<�d†ejde?f�d‡„�Z]d�dˆœd‹eej   �dƒej�d‰eej   �dŠeej   �d‹eej   �dŒeej   �d5eeejef      �d�eej   �dŽ�e^�d�eeˆ   �d�eeÒ   �d‘e�e^   �d’eˆ�d“e‹�d”ee‹   d&e?�d•eeejejf      deeeejef   f   f$�d–„�Z_�dƒej�dŒeej   d‹eej   def�d—„�Z`�dƒej�dŒeej   d‹eej   def�d˜„�Zadëeejef   de?f�d™„�Zbde?f�dš„�Zcde?f�d›„�Zdde?f�dœ„�Ze�d �d†ejde?f�d�„�Zfde?f�dž„�Zgde?f�dŸ„�Zh�ec�ed�ee�ef�eg�eh�d œ�Zieeje�d'e?f   f   e9�d¡<   d¯�d…œdYej�d†ejde?f�d¢„�Zj	 �d �dƒeej   �d£ej�d¤ejdejf�d¥„�Zkd‹eej   �d¦ejdeeejef      f�d§„�Zl�d¨edeeˆ   f�d©„�Zmd‹eej   �d¦ejdeeˆ   f�dª„�Znd8ejdejf�d«„�Zo G �d¬„ �d­e«      �ZpdYejd"ejdáeej   d\eej   d�epf
�d®„�Zqdµeejef   �d¯e�d°eej   d�epf�d±„�Zrd‹eej   �d¯e�d°eej   �d¦ejd�epf
�d²„�Zs�dŽ�e^�d‘e�e^   �d³�epde¥�e^�e^f   f�d´„�Zt�d³�epd‹eej   �dŽ�e^�d‘e�e^   �d�eeˆ   �d�eeÒ   �d’eˆ�d“e‹�d”ee‹   �dµe‹�d¶e‹�d·e?deejef   f�d¸„�Zu�d¯e�d°eej   �d¦ejd‹eej   �d’eˆ�d·e?de�epeejef   eejeeej   geejef   f   f   f�d¹„�Zvd¯d¯d�dºœd‹eej   �d¦ej�d»ej�d¼�e<d"ej�d½ej�dUeej   ddf�d¾„�Zwd¯�d…œ�d³�ep�d¿eejeeej   ge�epeejef   f   f   d&e?�d†ejdeejeeeeejef   �epf      f   f
�dÀ„�Zx�d¯e�d°eej   �d¦ejd‹eej   �dŽ�e^�d�eeˆ   �d�eeÒ   �d‘e�e^   �d’eˆ�d“e‹�d”ee‹   dee   f�dÁ„�Zy�d¯e�d°eej   �d¦ejd‹eej   �dŽ�e^�d�eeˆ   �d�eeÒ   �d‘e�e^   �d’eˆ�d“e‹�d”ee‹   dee   f�dÂ„�Zz	 �dd¯dd�dÄœ�dÅejd‹ej�dUej�dÆej�dÇe�d5eeejef      deee   eej   ejf   f�dÈ„�Z{d¯d�dÉœ�dÅej�dÊeej   �dÆej�dÇede�d'e?f   f
�dË„�Z|	 	 �d�dÅejd‹ej�dUej�dÊeej   �dÆej�dÇedeee   eej   ejf   f�dÌ„�Z}d‹eej   deeÒ   f�dÍ„�Z~�ddYejd\ejd"ejd(ejdeeÒ   f
�dÎ„�Zd$�dÏœdµeejef   dYejd\ej�dÐeeÒ   d‹eej   d8ej�dÑe?deej   f�dÒ„�Z€	 �dd¯d�dÉœd‹ej�dÅej�dUej�dÊeej   �dÆej�dÇedeee   eej   ejf   f�dÓ„�Z�d‹eej   �dÅejdeee   eej   ejf   f�dÔ„�Z‚dµeejef   deej   f�dÕ„�Zƒdµeejef   deee   eej   f   f�dÖ„�Z„	 �ddd¯d�d×œd‹eej   �dÅej�dUej�dÊeej   �dÆej�dÇedeee   eej   ejf   f�dØ„�Z…�dÙejddf�dÚ„�Z†�dÛeejef   d‹eej   deejejejeejf   f�dÜ„�Z‡�dÝej�dÞej�dßej�dàe�dáejdeeeejejf      f�dâ„�Zˆ�dþ�dÝejd‹eej   de?f�dã„�Z‰deee6   eej   ejf   f�dä„�ZŠ	 �dÿ�d5eeejef      d‹eej   deee6   eej   ejf   f�då„�Z‹�d!ed·ejdejf�dæ„�ZŒ�dd\ejdñe?f�dç„�Z��dèeej   dYejdeej   f�dé„�ZŽ�dêeejef   dYej�dëejdef�dì„�Z�dYejd\eej   �díe?deee   eej   f   f�dî„�Z�dYejd\eej   deee   eej   f   f�dï„�Z‘ G �dð„ �dñe«      �Z’eee   eej   f   �Z“�d¨edeejeg ejf   f   f�dò„�Z”�dóeed@e�dôej�deddf
�dõ„�Z•�dö�e’d"ejde?f�d÷„�Z–	 �d�dö�e’dNe�døej�dùej�dúejf
�dû„�Z—dYejdeej   f�dü„�Z˜�dö�e’dNe�døeej   d�e“f�dý„�Z™�dö�e’�d!edAeej   �dþej�ded�e“f�dÿ„�Zš�dö�e’d�e“f�d „�Z›�dö�e’d�e“f�d„�Zœ�dö�e’d�e“f�d„�Z��dö�e’d�e“f�d„�Zž�dö�e’d�e“f�d„�ZŸ�dö�e’d�e“f�d„�Z �dþ�dëej�de�d•eeejejf      f�d„�Z¡�dö�e’de�e“   f�d„�Z¢�dö�e’d�e“f�d	„�Z£dYej�d
ededz  f�d„�Z¤�dö�e’�de�ded�e“f�d„�Z¥�dö�e’dëeejef   d�e“f�d„�Z¦�dö�e’d�e“f�d„�Z§�e›�eœ�e��ež�eŸ�e �dœ�Z¨eeje�e’g�e“f   f   e9�d<   	 	 	 	 �ddYejd\ejd&e?�díe?�dAejdùeeejeg ejf   f      dáej�d5eeejef      dñe?d‹eej   deee   eej   f   f�d„�Z©�d d�d}œd‹ej�d5eeejef      deee6   eej   f   f�d„�Zª�d�Z«dYejd\eej   de?f�d„�Z¬dYeej   dejf�d„�Z­d\eej   deee   eej   f   f�d„�Z®�d„ �d„ �d„ �d„ �d„ �e®�d„ �dœ�Z¯eejeeej   geee   eej   f   f   f   e9�d <   �dþdYejd\eej   deee   eej   f   f�d!„�Z°deej   f�d"„�Z±�dƒej�d#e�d$eej   �d‰eej   d&e?deeej   ee   eej   f   f�d%„�Z²�dÝej�dÞej�dÛeejef   �d‰eej   �dŒeej   deee   eej   f   f�d&„�Z³�dÛeejef   �d‰eej   �dŒeej   d&e?deeej   ee   eej   f   f
�d'„�Z´�d(�Zµ	 �dÿddd$d�d)œdYeej   d\eej   d"eej   d(eej   d&e?�d5eeejef      deeej   ee   eej   f   f�d*„�Z¶de‹f�d+„�Z·d�d,œ�d-eÒd\eej   de‹f�d.„�Z¸i �Z¹ee¥e¥f   e9�d/<    e
�j,                  «       �Zº�d0�Z» G �d1„ �d2«      �Z¼�dej�d-edef�d3„�Z½ddddd$dd�d4œdYejd&e?d"eej   d(eej   dáeej   �d5eeejef      dñe?d‹eej   d\eej   de¥f�d5„�Z¾def�d6„�Z¿d�d7œ�d8e¥�d!e�d$eej   �d9eddf
�d:„�ZÀddddd$dd�d;œ�d<ejd\eej   d&e?d"eej   d(eej   dáeej   �d5eeejef      dñe?�d=eej   �d>eej   deee   eej   f   f�d?„�ZÁ�dý�d@„�ZÂ�d!eddf�dA„�ZÃ�dBe�d!eddf�dC„�ZÄd$�dDœ�d!e�dEe?ddf�dF„�ZÅ�dý�dG„�ZÆ�dý�dH„�ZÇ�d!ed\eej   �dIeej   deej   f�dJ„�ZÈ	 	 	 �ddYejd\ejd&e?d"ejd(ejdáej�d5eeejef      dñe?d‹eej   deee   eej   f   f�dK„�ZÉ�dLej�dMeej   deejeej   f   f�dN„�ZÊ�dLeej   de?f�dO„�ZË	 	 �d	d‹ejdYejd\ejd"eej   d(eej   deejeej   eej   eej   eej   f   f�dP„�ZÌ�dQ�ZÍ�dR�ZÎd‹ejdeejef   f�dS„�ZÏ G �dT„ �dUe«      �ZÐ�dVeejef   de¥ejeje?f   f�dW„�ZÑddd�dXœ�dYej�dZeej   �d.eej   �d[eej   �d\eeejef      d�eÐf�d]„�ZÒ�dVeejef   de?f�d^„�ZÓd‹ejdz  �dYej�dZejdz  �d.ejdz  �d[ejdz  �d\eejef   �d_eejef   �d�eÒdz  �d`eejef   de¥eÒdz  eejef   f   f�da„�ZÔd‹ejdeeˆ   f�db„�ZÕ�eÍfd‹ejdAeˆdeˆf�dc„�ZÖd‹ej�ddeeˆ   deˆf�de„�Z×d‹ejdeejef   f�df„�ZØi �ZÙeeejejf   eeÒe
�j´                  f   f   e9�dg<   i �ZÛeeejejeÒf   eeÒef   f   e9�dh<    e
�j,                  «       �ZÜd‹eej   deeÒ   f�di„�ZÝ�dje‹d@e�dkeÒ�dleeÒgef   def
�dm„�ZÞd‹eej   dee
�j´                     f�dn„�Zßd‹eej   f�do„�Zà�dý�dp„�Zá e¬h �dq£«      �ZâdYejd"ejde?f�dr„�Zã�ds�dt�duœ�Zä�dŽ�e^d�e^f�dv„�Zåh �dw£�Zæ�d-ede?f�dx„�Zç e¬h �dy£«      �Zè�dzejd\ejde?f�d{„�Zéh �d|£�Zêh �d}£�Zë�dzej�d~ejde?f�d„�ZìdYej�dzejd\ej�d~ejd‹eej   de?f�d€„�Zí�d‘�e^dYejd\ejd�e^f�d�„�Zî G �d‚„ �dƒe«      �Zï�dzejde?f�d„„�ZðdYej�dzejd\ej�d~ej�d”ee‹   d�eïf�d…„�Zñ�d`ee‹   �d†�eï�d”ee‹   �dzejdeejef   f
�d‡„�Zò	 	 	 	 	 �d
dYejd\ej�dŽ�e^�d�eeˆ   �d�eeÒ   �d‘e�e^   �ddeˆ�d`ee‹   �d”ee‹   d"eej   d‹eej   �dˆeeˆ   de‹f�d‰„�Zó	 �d�dŠed‹eej   dYeej   d"eej   def
�d‹„�Zô�dŒ�d�œ�dŽejddf�d�„�Zõ�dý�d�„�Zö�dŠedee   f�d‘„�Z÷�dŠedejf�d’„�Zø�d“�Zù�d”�Zú�d’eeˆ   deˆf�d•„�Zû�d!ede?f�d–„�Zü�d—�Zý�d˜�aþ�d™e9�dš<   dejf�d›„�Zÿd"eej   de?f�dœ„�Z dYejd"eej   de?f�d�„�Z e	�j                  �dže	�j                  «      �Z�dŸ�Z�d0�Z�d`�e<deeÒ   f�d „�Z	 �dþd$�d¡œ�d!ed)eejef   d‹eej   �d¢e?def
�d£„�Zd)eejef   d�d¤f�d¥„�Z		 �dþd$�d¡œ�d!ed)eejef   d‹eej   �d¢e?def
�d¦„�Z
d$�d§œ�d¨e�d©e?def�dª„�Zd¯d�d«œ�d¨ed\ej�d¬eeˆ   def�d­„�Z�d®�Z G �d¯„ �d°«      �Zd¯d�d«œ�d¨ed\ej�d¬eeˆ   def�d±„�Z�dþ�d!ed)eejef   d‹eej   def�d²„�Z�d!ede?f�d³„�Z	 �dþd$�d¡œ�d!ed)eejef   d‹eej   �d¢e?def
�d´„�Z e�dµ�d!ef�d�eej   f�dƒejf�d¤ejfg«      �Zd‹eej   dYeej   d\eej   d"eej   d(eej   �dƒej�d‰eej   �dŠeej   �d‹eej   �dŒeej   �d5eeejef      d&e?d�ef�d¶„�Z e�d·�d!ef�d�eej   fd)eejef   f�dƒejf�d¸ejf�d‰eej   f�dŠeej   f�d‹eej   f�dŒeej   f�d’eˆf�d“eejef   f�d¹ejfg«      �Zd‹eej   dYeej   d\eej   d"eej   d(eej   �d5eejef   �dŽ�e^�d�eeˆ   �d�eeÒ   �d‘e�e^   �ddeeˆ   �d`ee‹   �d”ee‹   �d•eeejejf      dáeej   �deeejejf      d&e?d�ef$�dº„�Z G �d»„ �d¼e«      �Z�eI�d½f�e=�dÃf�eB�d¾f�eQ�d¿f�eR�dÀf�eC�dÁf�eD�dÂff�Zeee�e<ge?f   ejf   �d'f   e9�dÃ<   �dÄ�d¼�dÅe�e<ge?f   f�dÆ„�Z�d`�e<de?f�dÇ„�Z�d`�e<de?f�dÈ„�Z e�dÉ�d!efd‹eej   f�d½ejfd&e?f�d¹ejf�dƒejf�d‰eej   f�dŠeej   f�d‹eej   f�dŒeej   f�d�eej   f�d5eeejef      f�deeejejf      f�ddeeˆ   fg«      �Zd)e‹dee‹   f�dÊ„�Zd)e‹de‹f�dË„�Z�d`�e<�d!ede?f�dÌ„�Z�d!e�d�eeÒ   de¥f�dÍ„�Z �dÎ�e<�dÏ�ed)eejef   �d�eeÒ   f�dÐ„�Z!�dÏ�ed)eejef   �dÑejde�e   f�dÒ„�Z"�dÎ�e<�dÏ�ed)eejef   �dÓe?f�dÔ„�Z#�dÎ�e<�dÏ�ed)eejef   �dÓe?f�dÕ„�Z$d$�dÖœd‹eej   �dƒej�d×e?�dÏ�e�dÊeej   �dÇe�dØe?deee   eej   ejf   f�dÙ„�Z%�dÎ�e<�dÏ�ef�dÚ„�Z&�dÎ�e<�d!ed)eejef   d‹eej   d&e?�d¹ej�dƒej�d‰eej   �dŠeej   �d‹eej   �dŒeej   �d�eej   �d�eeÒ   �d5eeejef      �deeejejf      f�dÛ„�Z'�dÜe�egef   def�dÝ„�Z(�dÜe�egef   def�dÞ„�Z)�dþ�dßeˆ�dàeeˆ   deÒf�dá„�Z*�dâeeejeÒf      d@ej�dßeˆddf�dã„�Z+�e	 �dþdddddddddddddd$ddd�däœd‹ejdYejd\ejd"ejd(ej�d5eeejef      �dŽ�e^�d�eeˆ   �d�eÒ�d‘�e^�ddeˆ�d`e‹�d”ee‹   �d•eeejejf      dáej�dåe?�dæe‹�deeejejf      �dâeeejeÒf      def(�dç„«       �Z,�dåe�dèe
�j´                  f�dé„�Z-d‹eej   d&e?dYeej   d\eej   d"eej   d(eej   �d5eeejef      �dŽ�e^�d�eeˆ   �d�eeÒ   �d‘e�e^   �ddeeˆ   �d`ee‹   �d”ee‹   �d•eeejejf      dáeej   �deeejejf      de�eeejef   eejef   f   f$�dê„�Z.d‹eej   �d`�e<�d½ejde?f�dë„�Z/�dÄ�e�dö�e�dìeejef   �díeejef   deeje¥eejef   f   f
�dî„�Z0�dÎ�e<�dö�e�dìeejef   d‹eej   d&e?�deeejejf      f�dï„�Z1	 �dþdddddddddddddd$dd�dðœd‹ejdYejd\ejd"ejd(ej�d5eeejef      �dŽ�e^�d�eeˆ   �d�eÒ�d‘�e^�ddeˆ�d`e‹�d”ee‹   �d•eeejejf      dáej�dåe?�dæe‹�deeejejf      def&�dñ„�Z2�dò„ �Z3�dó„ �Z4d�dôœ�dõeÒdz  dejf�dö„�Z5�e	 �dþdddddddddddd�d÷œd‹ejdYejd\ejd"ejd(ej�d5eeejef      �dŽ�e^�d�eeˆ   �d�eÒ�d‘�e^�ddeˆ�d`e‹�d”ee‹   �deeejejf      def�dø„«       �Z6	 �dþdddddddddddd�d÷œd‹ejdYejd\ejd"ejd(ej�d5eeejef      �dŽ�e^�d�eeˆ   �d�eÒ�d‘�e^�ddeˆ�d`e‹�d”ee‹   �deeejejf      def�dù„�Z7d�dú�l8�m9�Z9 dd�l:�Z: e¾«       �Z;�d d�d}œd‹ej�d5eeejef      f�dû„�Z<y(  uV  Shared auxiliary client router for side tasks (compression, search, vision, ...).

Text auto chain: main provider+model â†’ OpenRouter â†’ Nous Portal â†’ custom endpoint â†’
native Anthropic â†’ direct API-key providers â†’ None. Vision auto chain: main
provider (if a supported vision backend) â†’ OpenRouter â†’ Nous â†’ Anthropic â†’ custom.
``auxiliary.free_only`` restricts the OpenRouter lane to ``:free`` SKUs. Codex OAuth is
in neither chain (undocumented, shifting allow-list): main provider or explicit
``auxiliary.<task>.provider`` only. HTTP 402 in call_llm() falls through the chain.
é    N)ÚSimpleNamespace)	ÚAnyÚCallableÚDictÚListÚ
NamedTupleÚOptionalÚTupleÚTYPE_CHECKINGÚUnion)ÚurlparseÚparse_qsÚ
urlunparse)Ú_BILLING_PATTERNSÚ_OVERLOADED_PATTERNSÚUNSUPPORTED_PARAM_MARKERSÚis_reasoning_field_rejectionÚis_reasoning_required_rejection)Úremember_reasoning_floorÚwith_reasoning_floor)Ú$remember_structured_output_rejection)ÚCODEX_AUX_BASE_URLÚapply_required_codex_headersÚcodex_cloudflare_headersÚis_official_codex_base_url)Ú_codex_event_has_content)Ú!bypass_chat_sdk_request_transform©ÚOpenAIÚ_OPENAI_CLS_CACHEÚreturnc                  ó*   — t         €ddlm}  | a t         S )z#Import and cache ``openai.OpenAI``.r   r   )r    Úopenair   )Ú_clss    ú;/home/ubuntu/.hermes/hermes-agent/agent/auxiliary_client.pyÚ_load_openai_clsr&   6   s   € ô Ð Ý)Ø ÐÜÐó    c                   ó&   — e Zd ZdZdZd„ Zd„ Zd„ Zy)Ú_OpenAIProxyzbLazy stand-in for ``openai.OpenAI``: forwards calls and isinstance checks, importing on first use.© c                 ó"   —  t        «       |i |¤ŽS ©N)r&   )ÚselfÚargsÚkwargss      r%   Ú__call__z_OpenAIProxy.__call__C   s   € Ø!ÔÓ! 4Ð2¨6Ñ2Ð2r'   c                 ó*   — t        |t        «       «      S r,   )Ú
isinstancer&   )r-   Úobjs     r%   Ú__instancecheck__z_OpenAIProxy.__instancecheck__F   s   € Ü˜#Ô/Ó1Ó2Ð2r'   c                  ó   — y)Nz<lazy openai.OpenAI proxy>r*   ©r-   s    r%   Ú__repr__z_OpenAIProxy.__repr__I   s   € Ø+r'   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r0   r4   r7   r*   r'   r%   r)   r)   ?   s   „ ÙlØ€Iò3ò3ó,r'   r)   c                   óF   — e Zd ZdZdZddededdfd„Zdedefd	„Zdefd
„Z	y)Ú_AuxProbeClientStubzENon-functional placeholder returned while `aux_probe_mode` is active.©Úapi_keyÚbase_urlr@   rA   r!   Nc                 ó    — || _         || _        y r,   r?   )r-   r@   rA   s      r%   Ú__init__z_AuxProbeClientStub.__init__Z   s   € ØˆŒØ ˆ�r'   Únamec                 ó    — t        d|›d�«      ‚)Nz5_AuxProbeClientStub used as a real client (attribute z1); aux_probe_mode is for availability checks only)ÚRuntimeError)r-   rD   s     r%   Ú__getattr__z_AuxProbeClientStub.__getattr__^   s!   € äØCÀDÀ8ð L=ð =ó>ð 	>r'   c                  ó   — y)Nz$<aux availability-probe client stub>r*   r6   s    r%   r7   z_AuxProbeClientStub.__repr__d   s   € Ø5r'   ©Ú rJ   )
r8   r9   r:   r;   r<   ÚstrrC   r   rG   r7   r*   r'   r%   r>   r>   V   sC   „ ÙOØ'€Iñ! ð !°Cð !Àó !ð> ð >¨ó >ð6˜#ô 6r'   r>   c                  ó6   — t        t        t        dd«      «      S ©NÚactiveF)ÚboolÚgetattrÚ_aux_probe_stater*   r'   r%   Ú_aux_probe_activerR   h   s   € Ü”Ô(¨(°EÓ:Ó;Ð;r'   c               #   ó„   K  — t        t        dd«      } dt        _        	 d–— | t        _        y# | t        _        w xY w­w)zDResolve provider availability without constructing real SDK clients.rN   FTN)rP   rQ   rN   )Úprevs    r%   Úaux_probe_moderU   l   s:   è ø€ ô Ô# X¨uÓ5€DØ"ÔÔð'Ûà"&ÔÕø $ÔÕüs   ‚A  0 ¤A °=½A )Ú	load_pool)ÚMINIMUM_CONTEXT_LENGTHÚget_model_context_length)Úget_hermes_home)Ú_canonical_api_mode)Ú_custom_health_base_urlÚ_unhealthy_cache_keyÚ!fallback_candidate_quarantine_ttlÚ%fallback_candidate_unavailable_reason)ÚAuxiliaryClientUnavailableÚclear_nous_credential_failureÚ$missing_provider_credentials_messageÚnous_credential_failure_detailÚrecord_nous_credential_failure)ÚOPENROUTER_BASE_URLÚhermes_home_key)Úbase_url_host_matchesÚbase_url_hostnameÚbase_url_originÚ	env_floatÚis_truthy_valueÚ"model_forces_max_completion_tokensÚnormalize_proxy_env_varsÚ_LOGGED_UNKNOWN_PROVIDER_KEYSÚ_LOGGED_UNHANDLED_AUTHTYPE_KEYSÚ _LOGGED_UNSUPPORTED_EXTPROC_KEYSÚ_LOGGED_UNSUPPORTED_OAUTH_KEYSrA   c                 óâ   — 	 ddl m} ddlm}m}  |t        | xs d«       |«       ¬«      } ||j                  d«      |j                  d«      t        | xs d«      ¬«      S # t        $ r Y y	w xY w)
uÈ   httpx ``verify`` for an aux base_url, mirroring the main client (per-provider ``ssl_ca_cert`` /
    ``ssl_verify``, ``HERMES_CA_BUNDLE`` / ``SSL_CERT_FILE``); any failure â†’ httpx default (``True``).r   )Úresolve_httpx_verify)Ú get_custom_provider_tls_settingsÚload_config_readonlyrJ   ©ÚconfigÚssl_ca_certÚ
ssl_verify)Ú	ca_bundlerx   rA   T)Úagent.ssl_verifyrr   Úhermes_cli.configrs   rt   rK   ÚgetÚ	Exception)rA   rr   rs   rt   Útlss        r%   Ú_resolve_aux_verifyr   �   sm   € ðÝ9ß\Ù.¬s°8²>¸rÓ/BÑK_ÓKaÔbˆÙ#Ø—g‘g˜mÓ,¸¿¹ÀÓ9NÔY\Ð]eÒ]kÐikÓYlônð 	nøäò Ùðús   ‚AA" Á"	A.Á-A.F©Ú
async_moder�   c                óÊ   — 	 ddl m}  |t        | xs d«      |t        | «      ¬«      }|�d|iS i S # t        t
        f$ r" t        sdat        j                  d«       d}Y Œ8w xY w)	zKInject keepalive httpx client with env-only proxy (not macOS system proxy).r   )Úbuild_keepalive_http_clientrJ   )r�   ÚverifyTuä   agent.process_bootstrap.build_keepalive_http_client is unavailable â€” mixed/stale install detected (#64333). Falling back to the SDK default HTTP client. Run `hermes update` (or reinstall the Desktop app) to resync the runtime.NÚhttp_client)	Úagent.process_bootstraprƒ   rK   r   ÚImportErrorÚAttributeErrorÚ_WARNED_KEEPALIVE_IMPORT_SKEWÚloggerÚwarning)rA   r�   rƒ   Úclients       r%   Ú_openai_http_client_kwargsr�       s~   € ðÝGÙ,Ü�’˜BÓ¨JÔ?RÐS[Ó?\ô^ˆð '-Ð&8ˆM˜6Ð"Ð@¸bÐ@øô œÐ(ò õ -Ø,0Ð)Ü�N‰NðDôEð
 Šðús   ‚'1 ±.A"Á!A"r@   r/   c                 óª   — t        «       rt        | |¬«      S i t        |«      ¥|¥}t        || |¬«       |j	                  dd«       t        d| |dœ|¤ŽS )Nr?   ©Úaccess_tokenrA   Úmax_retriesr   r*   )rR   r>   r�   Ú_apply_required_codex_headersÚ
setdefaultr   )r@   rA   r/   s      r%   Ú_create_openai_clientr”   µ   s]   € ÜÔä"¨7¸XÔFÐFØ?Ô*¨8Ó4Ð?¸Ð?€FÜ! &°wÈÕRð ×Ñ�m QÔ'ÜÐ?˜'¨HÑ?¸Ñ?Ð?r'   c                   ó(   ‡ — e Zd ZdZdZdˆ fd„Zˆ xZS )ÚAuxiliaryExplicitCancellationa-  Frozen signal that an auxiliary attempt was explicitly hard-cancelled. ``BaseException`` so broad
    ``except Exception`` retry/fallback code never treats a host stop as a transport failure; ``cause``
    is immutable class data so nothing re-queries a mutable host Event after the transport unwound.Úexplicit_host_cancelc                 ó$   •— t         ‰| �  d«       y )Nz.auxiliary request explicitly cancelled by host)ÚsuperrC   )r-   Ú	__class__s    €r%   rC   z&AuxiliaryExplicitCancellation.__init__Ú   s   ø€ Ü‰ÑÐIÕJr'   ©r!   N)r8   r9   r:   r;   ÚcauserC   Ú__classcell__)rš   s   @r%   r–   r–   Ô   s   ø„ ñgð #€E÷Kñ Kr'   r–   c                  ó6   — t        t        t        dd«      «      S rM   )rO   rP   Ú_aux_interrupt_protectionr*   r'   r%   Ú_aux_interrupt_protectedr    Þ   s   € Ü”Ô1°8¸UÓCÓDÐDr'   c                  ó4   — t        «       } | �t        | «      S dS )z@Return whether an explicit host cancel overrides aux protection.F)Ú_capture_aux_cancel_checkÚ_captured_aux_cancel_requested)Úchecks    r%   Ú_aux_interrupt_cancel_requestedr¥   â   s    € ä%Ó'€EØ49Ð4EÔ)¨%Ó0ÐPÈ5ÐPr'   TrN   c              #   ó’  K  — t        t        dd«      }t        t        dd«      }t        t        dd«      }| t        _        t        |«      r|t        _        |�!t        t        |dd«      «      r|t        _        	 d–— |t        _        |t        _        |t        _        y# |t        _        |t        _        |t        _        w xY w­w)zÄMark this thread's aux LLM call interrupt-protected (re-entrant-safe). ``cancel_check`` /
    ``cancel_event`` keep an explicit host hard-cancel path (Event preferred); nested scopes inherit both.rN   FÚcancel_checkNÚcancel_eventÚis_set)rP   rŸ   rN   Úcallabler§   r¨   )rN   r§   r¨   rT   Úprev_cancel_checkÚprev_cancel_events         r%   Úaux_interrupt_protectionr­   è   s²   è ø€ ô Ô,¨h¸Ó>€DÜÔ 9¸>È4ÓPÐÜÔ 9¸>È4ÓPÐØ'-ÔÔ$Ü�ÔØ1=Ô!Ô.ØÐ¤H¬W°\À8ÈTÓ-RÔ$SØ1=Ô!Ô.ðCÛà+/Ô!Ô(Ø1BÔ!Ô.Ø1BÔ!Õ.øð ,0Ô!Ô(Ø1BÔ!Ô.Ø1BÔ!Õ.üs   ‚A8CÁ;B! Á?"CÂ!#CÃCc                  ó”   — t        t        t        dd«      dd«      } t        | «      r| S t        t        dd«      }t        |«      r|S dS )zHCapture the current explicit-cancel source on the owning request thread.r¨   Nr©   r§   )rP   rŸ   rª   )r©   r¤   s     r%   r¢   r¢   ü   sH   € ä”WÔ6¸ÈÓMÈxÐY]Ó^€FÜ�ÔØˆäÔ-¨~¸tÓD€EÜ˜U”Oˆ5Ð-¨Ð-r'   r§   c                 óp   — 	 t         | «       «      S # t        $ r t        j                  dd¬«       Y yw xY w)zGRead a request-thread cancellation source without leaking its failures.z captured aux cancel check failedT©Úexc_infoF)rO   r}   rŠ   Údebug©r§   s    r%   r£   r£     s7   € ðÜ‘L“NÓ#Ð#øÜò Ü�‰Ð7À$ˆÔGÙðús   ‚ ’ 5´5c                   óB   — e Zd ZdZdeg ef   ddfd„Zdefd„Zdefd„Z	y)Ú_AuxiliaryCancellationDecisionzHAtomically choose explicit cancellation or provider timeout per attempt.Úsource_cancel_checkr!   Nc                 óR   — || _         t        j                  «       | _        d| _        y )NrN   )Ú_source_cancel_checkÚ	threadingÚLockÚ_lockÚ_outcome)r-   r¶   s     r%   rC   z'_AuxiliaryCancellationDecision.__init__  s   € Ø$7ˆÔ!Ü—^‘^Ó%ˆŒ
Ø ˆ�r'   c                 óº   — | j                   5  | j                  dk(  rt        | j                  «      rd| _        | j                  dk(  cd d d «       S # 1 sw Y   y xY w)NrN   Ú	cancelled©r»   r¼   r£   r¸   r6   s    r%   r0   z'_AuxiliaryCancellationDecision.__call__  sK   € Ø�Z‰Zñ 	0Ø�}‰} Ò(Ô-KÈD×LeÑLeÔ-fØ +�”Ø—=‘= KÑ/÷	0÷ 	0ò 	0ús   �:AÁAc                 óÂ   — | j                   5  | j                  dk(  r t        | j                  «      }|rdnd| _        | j                  dk(  cddd«       S # 1 sw Y   yxY w)z@Return whether timeout won and destructive cleanup is permitted.rN   r¾   Ú	timed_outNr¿   )r-   r¾   s     r%   Úbegin_timeout_cleanupz4_AuxiliaryCancellationDecision.begin_timeout_cleanup  sQ   € à�Z‰Zñ 	0Ø�}‰} Ò(Ü:¸4×;TÑ;TÓU�	Ù/8¡¸k�”Ø—=‘= KÑ/÷		0÷ 	0ò 	0ús   �>AÁA)
r8   r9   r:   r;   r   r   rC   rO   r0   rÂ   r*   r'   r%   rµ   rµ     s9   „ ÙRð!¨H°R¸°WÑ,=ð !À$ó !ð
0˜$ó 0ð0 tô 0r'   rµ   ÚlocalÚlabelc                 ó‚   — t        | dd«      }|€y	  |«        y# t        $ r t        j                  d|d¬«       Y yw xY w)zHCall the thread-local hook installed on ``local``, if any. Never raises.ÚhookNzaux %s hook failedTr°   )rP   r}   rŠ   r²   )rÃ   rÄ   rÆ   s      r%   Ú
_tick_hookrÇ   9  sG   € ä�5˜& $Ó'€DØ€|ØðAÙ�øÜò AÜ�‰Ð)¨5¸4ˆÖ@ðAús   ’ š!>½>c                  ó$   — t        t        d«       y)z1Tick the installed forward-progress hook, if any.ÚprogressN)rÇ   Ú_aux_progressr*   r'   r%   Ú_notify_aux_progressrË   D  ó   € äŒ}˜jÕ)r'   c                  ó$   — t        t        d«       y)zFRecord an actual provider dispatch without claiming response progress.ÚdispatchN)rÇ   Ú_aux_dispatchr*   r'   r%   Ú_notify_aux_dispatchrÐ   I  rÌ   r'   c                  ó$   — t        t        d«       y)z—Record a content-free frame (keepalive/empty delta): counts toward
    ``time_to_first_progress_ms`` but must not reset a compression inactivity fence.zprovider responseN)rÇ   Ú_aux_provider_responser*   r'   r%   Ú_notify_aux_timing_responserÓ   N  s   € ô Ô%Ð':Õ;r'   c                  ó,   — t        «        t        «        y)zDRecord a provider response/chunk, then preserve the liveness signal.N)rÓ   rË   r*   r'   r%   Ú_notify_aux_provider_responserÕ   T  s   € äÔ!ÜÕr'   c                  ó(   — t        t        dd «      d uS )NrÆ   )rP   rÊ   r*   r'   r%   Ú_aux_progress_activer×   Z  s   € Ü”= &¨$Ó/°tÐ;Ð;r'   r3   ÚkeyÚdefaultc                 ój   — t        | t        «      r| j                  |«      nt        | |d«      }|€|S |S )zOField access for wire objects that may be dicts or SDK/SimpleNamespace objects.N©r2   Údictr|   rP   )r3   rØ   rÙ   Úvals       r%   Ú_fieldrÞ   ^  s2   € ä$ S¬$Ô/ˆ#�'‰'�#Œ,´W¸SÀ#ÀtÓ5L€CØ�kˆ7Ð* sÐ*r'   Úeventc                 óÖ   ‡‡— t        | d«      }|dk(  r t        | d«      Št        ˆfd„dD «       «      S |dk(  r1t        | d«      Št        ‰d«      dk(  xr t        ˆfd	„d
D «       «      S y)z>Whether an Anthropic stream event carries a non-empty payload.ÚtypeÚcontent_block_deltaÚdeltac              3   óH   •K  — | ]  }t        t        ‰|«      «      –— Œ y ­wr,   ©rO   rÞ   )Ú.0Úfrã   s     €r%   ú	<genexpr>z/_anthropic_event_has_content.<locals>.<genexpr>i  s   øè ø€ Òq¨a”4œ˜u aÓ(×)Ñqùó   ƒ")ÚtextÚthinkingÚpartial_jsonÚ	signatureÚcitationÚcontent_block_startÚcontent_blockÚtool_usec              3   óH   •K  — | ]  }t        t        ‰|«      «      –— Œ y ­wr,   rå   )ræ   rç   Úblocks     €r%   rè   z/_anthropic_event_has_content.<locals>.<genexpr>l  s   øè ø€ Ò:jÐVW¼4ÄÀuÈaÓ@P×;QÑ:jùré   )ÚidrD   F)rÞ   Úany)rß   Ú
event_typeró   rã   s     @@r%   Ú_anthropic_event_has_contentr÷   d  sq   ù€ ä˜˜vÓ&€JØÐ*Ò*Ü�u˜gÓ&ˆÜÓqÐ3pÔqÓqÐqØÐ*Ò*Ü�u˜oÓ.ˆÜ�e˜VÓ$¨
Ñ2Òj´sÓ:jÐ[iÔ:jÓ7jÐjØr'   c                  ód   ‡‡— t        «       Št        j                  «       Šdt        ddfˆˆfd„} | S )a  Per-event callback for the Anthropic aux wire: progress only for substantive payloads
    (keepalives must not keep a stalled summary alive), stop at the host deadline or explicit
    cancel. The ``TimeoutError`` text must say "timed out" so ``_is_timeout_error`` classifies it.rß   r!   Nc                 óì   •— t        | «      rt        «        n
t        «        t        «       r
t	        «       ‚‰�=t        j                  «       ‰k\  r%t        dt        j                  «       ‰z
  d›d�«      ‚y y )NzLAnthropic auxiliary stream timed out at the host compression deadline after ú.0fz&s (the caller already stopped waiting))r÷   rÕ   rÓ   r¥   r–   ÚtimeÚ	monotonicÚTimeoutError)rß   Úhost_deadlineÚstarteds    €€r%   Ú	_on_eventz3_anthropic_aux_stream_event_hook.<locals>._on_eventw  st   ø€ Ü'¨Ô.Ü)Õ+ä'Ô)Ü*Ô,Ü/Ó1Ð1ØÐ$¬¯©Ó)9¸]Ò)JÜð"Ü"&§.¡.Ó"2°WÑ"<¸SÐ!AÐAgðiójð jð *KÐ$r'   )Ú_current_aux_stream_deadlinerû   rü   r   )r   rþ   rÿ   s    @@r%   Ú _anthropic_aux_stream_event_hookr  p  s7   ù€ ô 1Ó2€MÜ�n‰nÓ€Gð
jœð 
j ö 
jð Ðr'   ç      N@c              #   ó~   K  — t        | dd«      }t        |«      r|n|| _        	 d–— || _        y# || _        w xY w­w)zXInstall one thread-local hook, restoring the prior on exit (non-callable = passthrough).rÆ   N)rP   rª   rÆ   )rÃ   rÆ   Úpreviouss      r%   Ú_aux_thread_local_hookr  ‹  s;   è ø€ ô �u˜f dÓ+€HÜ! $œ‘¨X€E„JðÛàˆ�
ø�Xˆ�
üs   ‚"=¥1 ©=±	:º=c              #   ó^   K  — t        t        | «      5  d–— ddd«       y# 1 sw Y   yxY w­w)zZInstall *hook* as the current thread's aux forward-progress callback (None = passthrough).N)r  rÊ   )rÆ   s    r%   Úaux_progress_hookr  –  s)   è ø€ ô 
 ¤¨tÓ	4ñ Û÷÷ ñ üs   ‚-“!˜	-¡*¦-c                  ó$   — t        t        dd«      S )zDThe waiting host's absolute monotonic deadline, if one is installed.ÚvalueN)rP   Ú_aux_stream_deadliner*   r'   r%   r  r  �  s   € äÔ'¨°$Ó7Ð7r'   Údeadlinec              #   ó´   K  — t        t        dd«      }t        | t        t        f«      r| n|t        _        	 d–— |t        _        y# |t        _        w xY w­w)u6  Publish the host's absolute ``time.monotonic()`` deadline to the stream consumer.

    ``None`` is a passthrough; re-entrant-safe. Host->worker return leg of the progress hook:
    without it the isolated provider daemon streams to its own ceiling after the host stopped
    waiting, billing a summary the commit fence refuses.

    ``8207862212`` releases the compression OWNER when the fence is cancelled, but the isolated provider
    daemon (:func:`_run_protected_sync_provider_call`) that holds the socket keeps streaming to its own
    ``_aux_stream_total_ceiling`` budget â€” >= the host's ceiling by construction â€” billing an abandoned
    summary the commit fence is already guaranteed to refuse, and stacking one fresh orphan per turn on a
    session that compression never managed to shrink. See #99692.
    r
  N)rP   r  r2   ÚintÚfloatr
  )r  r  s     r%   Úaux_stream_deadliner  ¢  sJ   è ø€ ô Ô+¨W°dÓ;€HÜ-7¸Ä3ÌÀ,Ô-O¡ÐU]ÔÔð.Ûà%-ÔÕ"ø XÔÕ"üs   ‚5A¸A ¼AÁAÁAÚcallbackc           
      ó®  ‡ ‡‡‡‡‡	‡
‡‡— t        «       }t        «       rt        |«      s ‰ ‰«      S t        |«      Š ‰«       r
t	        «       ‚t        t        dd«      Št        t        dd«      Št        t        dd«      Št        «       Š	t        j                  «       }t        j                  «       Ši Š
d
ˆ ˆˆˆˆ	ˆˆ
ˆˆf	d„}t        j                  |j                  |fdd¬«      j!                  «        	 t#        ‰«      r
t	        «       ‚‰j%                  d«      sŒ(t#        ‰«      r
t	        «       ‚‰
j'                  d«      }|�|‚‰
j'                  d	«      S )aÙ  Run one protected provider callback in an attempt-isolated daemon thread.

    Aux clients are process-shared and cannot be closed to wake one request, so the callback (incl.
    stream aggregation) runs in a daemon while the owner polls cancellation; on cancel the owner
    unwinds at once and the daemon finishes under the provider timeout in ``kwargs`` (it owns no
    transcript/commit state, never holds the session lock). Unprotected / no cancel source: direct.
    rÆ   Nc            
      óô  •	— 	 t        ‰«      5  t        t        ‰«      5  t        t        ‰	«      5  t	        ‰«      5  t        ‰¬«      5   ‰‰«      ‰d<   d d d «       d d d «       d d d «       d d d «       d d d «       ‰j                  «        y # 1 sw Y   Œ:xY w# 1 sw Y   Œ>xY w# 1 sw Y   ŒBxY w# 1 sw Y   ŒFxY w# 1 sw Y   ŒJxY w# t        $ r} | ‰d<   Y d } ~ Œ`d } ~ ww xY w# ‰j                  «        w xY w)Nr³   ÚresultÚ	exception)r  r  rÏ   rÒ   r  r­   ÚBaseExceptionÚset)
Úexcr  r§   Údispatch_hookÚdonerþ   r/   ÚoutcomeÚprogress_hookÚprovider_response_hooks
    €€€€€€€€€r%   Ú_provider_workerz;_run_protected_sync_provider_call.<locals>._provider_workerÕ  sè   ø€ ð	ä! -Ó0ñ5ä&¤}°mÓDñ5ô 'Ô'=Ð?UÓVñ5ô $ MÓ2ñ	5ô
 )°lÔCñ5ñ %-¨VÓ$4�˜Ñ!÷5÷ 5÷ 5÷ 5÷ 5ð �H‰H�J÷5ð 5ú÷ 5ð 5ú÷ 5ð 5ú÷ 5ð 5ú÷ 5ð 5ûô ò 	'Ø#&ˆG�KÖ ûð	'ûð �H‰H�Jús�   ƒC
 ŽB>ŸB2°B&¼B	Á	BÁB	ÁB&Á%B2Á-B>Á5C
 ÂBÂB	ÂB#ÂB&Â&B/Â+B2Â2B;	Â7B>Â>CÃC
 Ã
	C"ÃCÃC% ÃC"Ã"C% Ã%C7zhermes-protected-aux-providerT)Útargetr.   rD   Údaemong{®Gáz”?r  r  r›   )r¢   r    rª   rµ   r–   rP   rÊ   rÏ   rÒ   r  ÚcontextvarsÚcopy_contextr¹   ÚEventÚThreadÚrunÚstartr£   Úwaitr|   )r  r/   r¶   Úprovider_contextr  r  r§   r  r  rþ   r  r  r  s   ``    @@@@@@@r%   Ú!_run_protected_sync_provider_callr)  ¸  s.  ÿø€ ô 4Ó5ÐÜ#Ô%¬XÐ6IÔ-JÙ˜ÓÐô 2Ð2EÓF€LÙ„~Ü+Ó-Ð-ô œM¨6°4Ó8€MÜœM¨6°4Ó8€MÜ$Ô%;¸VÀTÓJÐÜ0Ó2€Mô #×/Ñ/Ó1ÐÜ�?‰?Ó€DØ €G÷õ ô ×ÑØ×#Ñ#Ð+;Ð*=ÐDcØôç‘U”WØ
ô *¨,Ô7Ü/Ó1Ð1Ø�y‰y˜ŒØÜ)¨,Ô7Ü/Ó1Ð1Ø—K‘K Ó,ˆ	ØÐ ØˆOØ�{‰{˜8Ó$Ð$r'   Ú
client_objÚflagc                 óN   — 	 t        t        | |d«      «      S # t        $ r Y yw xY w)uÕ   Whether ``client_obj`` (or its class) sets ``flag`` truthy; absent â†’ False. Capability declaration,
    not isinstance, so out-of-tree clients can opt out of wrappers unimported (cf. SUPPORTS_HERMES_TOOL_CALLS).F)rO   rP   r}   )r*  r+  s     r%   Ú_client_declaresr-  ö  s-   € ðÜ”G˜J¨¨eÓ4Ó5Ð5øÜò Ùðús   ‚ ˜	$£$Ú
maybe_typec                 ó:   — 	 t        | |«      S # t        $ r Y yw xY w)zDReturn False instead of raising when a patched symbol is not a type.F)r2   Ú	TypeError)r3   r.  s     r%   Ú_safe_isinstancer1  ÿ  s&   € ðÜ˜#˜zÓ*Ð*øÜò Ùðús   ‚ Ž	™Úurlc                 óî   — t        | «      }|j                  rUt        |j                  d¬«      «      t	        |j                  «      j                  «       D ��ci c]  \  }}||d   “Œ c}}fS | dfS c c}}w )zNExtract query params from URL, return (clean_url, default_query dict or None).rJ   )Úqueryr   N)r   r4  r   Ú_replacer   Úitems)r2  ÚparsedÚkÚvs       r%   Ú_extract_url_query_paramsr:    si   € ä�c‹]€FØ‡|‚|Ü˜&Ÿ/™/°˜/Ó3Ó4Ì8ÐTZ×T`ÑT`ÓKa×KgÑKgÓKi×6jÁ4À1Àa°q¸!¸A¹$±wÓ6jÐjÐjØ�ˆ9Ðùó 7ks   ÁA1Úcustom)ÚollamaÚvllmÚllamacppz	llama.cppz	llama-cppÚ_ALIAS_TABLEc                  óÆ   — t         €Jt        t        «      } t        j                  t
        «      5  ddlm} | j                  |«       ddd«       | a t         S # 1 sw Y   ŒxY w)u�  The same alias table the main provider path resolves against (hermes_cli.auth).

    A hand-copied mirror here rots silently every time auth grows a family â€” the local
    servers (#106010) and the OpenCode entries were both missed that way. Local-server
    names stay pinned on top: that set doubles as the guard for the /v1 tail and the
    no-key-borrow rule in the custom branch below.
    Nr   )Ú_PROVIDER_ALIASES)	r?  rÜ   Ú_LOCAL_SERVER_ALIASESÚ
contextlibÚsuppressr}   Úhermes_cli.authrA  Úupdate)ÚmergedÚ_auth_tables     r%   Ú_provider_alias_tablerI    sT   € ô ÐÜ!%Ô&;Ó!<ˆÜ× Ñ ¤Ó+ñ 	'ÝHØ�M‰M˜+Ô&÷	'ð ˆÜÐ÷		'ð 	'ús   ¯AÁA Úproviderc                 óh  — | xs dj                  «       j                  «       }|j                  d«      r(|j                  dd«      d   j                  «       }|sy|}|dk(  ry|dk(  r3t	        «       xs d	j                  «       j                  «       }|r|d
v ry|}t        «       j                  ||«      S )NÚautoúcustom:ú:é   r;  Úcodexúopenai-codexÚmainrJ   >   rL  rR  )ÚstripÚlowerÚ
startswithÚsplitÚ_read_main_providerrI  r|   )rJ  Ú
normalizedÚsuffixÚ	main_provs       r%   Ú_normalize_aux_providerr[  /  s²   € ØÒ$˜f×+Ñ+Ó-×3Ñ3Ó5€JØ×Ñ˜YÔ'Ø×!Ñ! # qÓ)¨!Ñ,×2Ñ2Ó4ˆÙØØˆ
Ø�WÒØØ�VÒä(Ó*Ò0¨b×7Ñ7Ó9×?Ñ?ÓAˆ	Ù˜IÐ)9Ñ9ØØˆ
Ü Ó"×&Ñ& z°:Ó>Ð>r'   ÚOMIT_TEMPERATUREÚmodelc                 ól   — | xs dj                  «       j                  «       j                  dd«      d   S )z;Lowercased model slug with any ``vendor/`` prefix stripped.rJ   ú/rO  éÿÿÿÿ)rS  rT  Úrsplit©r]  s    r%   Ú_bare_modelrc  F  s0   € àŠK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Ñ;Ð;r'   c                 óH   — t        | «      }|j                  d«      xs |dk(  S )zHTrue for any Kimi / Moonshot model that manages temperature server-side.zkimi-Úkimi©rc  rU  ©r]  Úbares     r%   Ú_is_kimi_modelri  K  s$   € ä�uÓ€DØ�?‰?˜7Ó#Ò5 t¨v¡~Ð5r'   c                 ó   — t        | «      dk(  S )zATrue for Arcee Trinity Large Thinking (direct or via OpenRouter).ztrinity-large-thinking)rc  rb  s    r%   Ú_is_arcee_trinity_thinkingrk  Q  s   € ä�uÓÐ!9Ñ9Ð9r'   g333333ë?gffffffæ?c                 ó†   ‡— t        | |«      Š‰€yddlm}  |‰«      ryd‰v rd‰vS ‰dk(  xs t        ˆfd„dD «       «      S )	aã  True for gpt-5.4/5.5/5.6, gpt-6 Sol/Terra/Luna, gpt-6 Astra (and the Daybreak Sol alias) on the Codex OAuth route only.

    Other routes expose a larger window for the same slug and keep the user's threshold.
    Prefix-matched so ``-pro`` and dated snapshots track every 272K-capped family; ``-900k``
    picker variants are excluded. Astra is substring-matched (any slug containing ``astra``
    without ``900k``). Name kept for the ``compression.codex_gpt55_autoraise`` key.
    Fr   )Úis_codex_context_variantÚastraÚ900kzgpt-daybreak-blue-latestc              3   ó€   •K  — | ]5  }‰|k(  xs* ‰j                  |d z   «      xs ‰j                  |dz   «      –— Œ7 y­w)ú-ú.N©rU  )ræ   Úfamrh  s     €r%   rè   z+_is_codex_gpt54_or_gpt55.<locals>.<genexpr>m  sF   øè ø€ ò 5`àð 	�‰ÒO�t—‘ s¨S¡yÓ1ÒO°T·_±_ÀSÈ3ÁYÓ5OÓOñ5`ùs   ƒ;>)zgpt-5.4zgpt-5.5zgpt-5.6z	gpt-6-solzgpt-6-terraz
gpt-6-luna)Ú_codex_route_bare_modelÚagent.model_metadatarm  rõ   )r]  rJ  rm  rh  s      @r%   Ú_is_codex_gpt54_or_gpt55rw  ]  se   ø€ ô # 5¨(Ó3€DØ€|ØÝ=Ù Ô%ØØ�$�Ø˜TÐ!Ð!ØÐ-Ñ-ò `´ó 5`à^ô5`ó 2`ð `r'   c                 óf   — |xs dj                  «       j                  «       dk(  rt        | «      S dS )zQLowercased bare model slug when ``provider`` is the Codex OAuth route, else None.rJ   rQ  N)rS  rT  rc  ©r]  rJ  s     r%   ru  ru  r  s0   € à"*¢.¨b×!7Ñ!7Ó!9×!?Ñ!?Ó!AÀ^Ò!SŒ;�uÓÐ]ÐY]Ð]r'   c                 ó    — t        | |«      dk(  S )zYTrue for ``gpt-5.3-codex-spark`` on the Codex OAuth route (the slug exists nowhere else).zgpt-5.3-codex-spark)ru  ry  s     r%   Ú_is_codex_sparkr{  w  s   € ä" 5¨(Ó3Ð7LÑLÐLr'   c                 ób   — t        | «      }|j                  d«      xr |j                  d«       S )zñTrue for OpenAI reasoning families that 400 (``unsupported_value``) on any non-default
    ``temperature``: gpt-5.x (incl. dated snapshots, ``-pro``, ``-codex``), o1/o3/o4. The
    ``gpt-5-chat`` non-reasoning line still accepts it (#51083).)zgpt-5Úo1Úo3Úo4z
gpt-5-chatrf  rg  s     r%   Ú#_is_openai_default_temperature_onlyr€  |  s0   € ô �uÓ€DØ�?‰?Ð6Ó7Ò]ÀÇÁÐP\Ó@]Ð<]Ð]r'   Ú_TEMPERATURE_REJECTED_ROUTESÚrejected_kwargsÚerrorc                 ó|   — ddl m} t        j                   || |«      t	        |j                  d«      «      f«       y )Nr   ©Ú
_route_keyr]  )Ú!agent.auxiliary_structured_outputr†  r�  Úaddrc  r|   )rJ  rA   r‚  rƒ  r†  s        r%   Úremember_temperature_rejectionr‰  ‰  s3   € õ =Ü ×$Ñ$¡j°¸8Ó&DÄkÐRa×ReÑReÐfmÓRnÓFoÐ%pÕqr'   zOptional[float] | objectc                 ó4  — t        | «      rt        j                  d| «       t        S t	        | «      rt        j                  d| «       t        S ddlm}  |||«      t        | «      ft        v rt        j                  d| «       t        S t        | «      rdS dS )z“``OMIT_TEMPERATURE`` (drop the key; Kimi/Moonshot, OpenAI reasoning families, routes that
    already rejected it), a fixed ``float``, or ``None``.z7Omitting temperature for Kimi model %r (server-managed)z6Omitting temperature for %r (accepts only the default)r   r…  z7Omitting temperature for %r (route rejected it earlier)g      à?N)
ri  rŠ   r²   r\  r€  r‡  r†  rc  r�  rk  )r]  rA   rJ  r†  s       r%   Ú_fixed_temperature_for_modelr‹  �  s„   € ô
 �eÔÜ�‰ÐNÐPUÔVÜÐÜ*¨5Ô1Ü�‰ÐMÈuÔUÜÐÝ<Ù�8˜XÓ&¬°EÓ(:Ð;Ô?[Ñ[Ü�‰ÐNÐPUÔVÜÐÜ,¨UÔ3ˆ3Ð=¸Ð=r'   )Úallow_codex_gpt55_autoraiserŒ  c                óh   — t        | «      ry|rt        | |«      rt        S t        | |«      rt        S y)u.  Per-model/route compression threshold override (fraction of context used), or None.

    Arcee Trinity Large Thinking â†’ 0.75 (preserve reasoning context); Codex-route gpt-5.4/5.5/5.6/Astra
    â†’ 0.85, gated by ``allow_codex_gpt55_autoraise``; Codex-route gpt-5.3-codex-spark â†’ 0.70, ungated.
    g      è?N)rk  rw  Ú'_CODEX_GPT54_GPT55_COMPACTION_THRESHOLDr{  Ú!_CODEX_SPARK_COMPACTION_THRESHOLD)r]  rJ  rŒ  s      r%   Ú _compression_threshold_for_modelr�  ¢  s5   € ô " %Ô(ØÙ"Ô'?ÀÀxÔ'PÜ6Ð6Ü�u˜hÔ'Ü0Ð0Ør'   )zgpt-mini-latestzgpt-nano-latestzclaude-haiku-latestzgemini-flash-latestzgpt-5.4-nanozgpt-5.4-miniz
gpt-5-miniz	haiku-4.5úgemini-3.6-flashz
flash-litez-nanoz-miniz-flashÚhaikuÚ_FAST_MODEL_FAMILIES)rë   Úreasonz-r1Úminilmz:batchú:freezo1-zo3-zo4-rP  Úaudioz-vlÚembedz-ttsz-transcribez	-realtimez-imagez-search-previewÚ_FAST_MODEL_EXCLUDEÚmodel_idc           
      ó|   — t        d„ t        t        j                  d| j	                  «       «      «      D «       «      S )z­Sort key putting a family's newest release first: digit runs compare numerically (plain
    string order picks ``gpt-3.5-mini`` over ``gpt-5.4-mini`` and breaks at 9 vs 10).c              3   óV   K  — | ]!  \  }}|r|d z  rdt        |«      dfndd|f–— Œ# y­w)é   rO  rJ   r   ç        N)r  )ræ   ÚindexÚparts      r%   rè   z%_model_recency_key.<locals>.<genexpr>É  s=   è ø€ ò ^áˆE�4ÑX\ð !&¨¢	ˆŒE�$‹K˜Ñ°°3¸¨~Ó=ñ^ùs   ‚')z(\d+(?:\.\d+)?))ÚtupleÚ	enumerateÚrerV  rT  )rš  s    r%   Ú_model_recency_keyr¤  Å  s:   € ô ñ ^ä$¤R§X¡XÐ.@À(Ç.Á.ÓBRÓ%SÓTô^ó ^ð ^r'   Úprovider_idc                 ód  ‡— | j                  «       j                  «       dk(  }	 ddlm} ddlm} ddlm} d\  }}	  || «      xs i }t        |j                  dd«      «      j                  «       }t        |j                  d	d«      «      j                  «       }|s|r	 ddlm}  |«       \  }}|s t        t         || «      d	d«      xs d«      }|j                  d«      }|sy|j!                  d«      r|dd }i }	|rddlm}
 d|
dœ}	 |d|xs d|ddœ|	¤Žxs i }t%        d„ |D «       t&        d¬«      }|r	 ddlm}m}  || |«       «      }t,        D ]<  }|D ]5  }|j                  «       Š|‰v sŒt/        ˆfd„t0        D «       «      rŒ1|c c S  Œ> y# t        $ r t        j                  d
| d¬«       Y �Œ w xY w# t        $ r t        j                  dd¬«       Y �Œ2w xY w# t        $ r t        j                  d| d¬«       Y yw xY w# t        $ r t        j                  dd¬«       Y ŒÞw xY w)z÷Newest ``_FAST_MODEL_FAMILIES`` match from the provider's live (cached) catalog.

    "" when the catalog is unavailable or holds no small model (caller falls through to the
    curated default). Never raises; the fetch is memory+disk cached.
    Únousr   )Ú$resolve_api_key_provider_credentials)Úfetch_models_with_pricing©Úget_provider_profilerI   r@   rJ   rA   zNo credentials for %s catalogTr°   )Ú!_resolve_nous_pricing_credentialszNo Nous credentials for catalogr_  ú/v1Néýÿÿÿ)Ú_NOUS_CATALOG_TTL_SECONDS)Úinclude_sale_originalÚcache_ttl_secondsg      @)r@   rA   Útimeoutz'Fast-model catalog lookup failed for %sc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr,   )rK   )ræ   Úms     r%   rè   z+_fast_model_from_catalog.<locals>.<genexpr>ü  s   è ø€ Ò*˜Q”#�a—&Ñ*ùó   ‚)rØ   Úreverse©Únous_policy_allowed_idsÚrestrict_to_nous_policyzNous policy filter unavailablec              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr,   r*   )ræ   ÚxÚlowereds     €r%   rè   z+_fast_model_from_catalog.<locals>.<genexpr>  s   øè ø€ Ò,W¸a¨Q°'¬\Ñ,Wùó   ƒr*   )rS  rT  rE  r¨  Úhermes_cli.models_pricingr©  Ú	providersr«  rK   r|   r}   rŠ   r²   r¬  rP   ÚrstripÚendswithr¯  Úsortedr¤  r¸  r¹  r“  rõ   r™  )r¥  Úis_nousr¨  r©  r«  r@   rA   Úcredsr¬  Ú_nous_kwargsr¯  ÚcatalogÚidsr¸  r¹  Úfamilyrš  r¼  s                    @r%   Ú_fast_model_from_catalogrÉ  Î  sX  ø€ ð ×ÑÓ!×'Ñ'Ó)¨VÑ3€Gð&ÝHÝGÝ2ð #Ñˆ�ð	VÙ8¸ÓEÒKÈˆEÜ˜%Ÿ)™) I¨rÓ2Ó3×9Ñ9Ó;ˆGÜ˜5Ÿ9™9 Z°Ó4Ó5×;Ñ;Ó=ˆHñ ™7ðOÝWÙ$EÓ$GÑ!�˜ñ Üœ7Ñ#7¸Ó#DÀjÐRTÓUÒ[ÐY[Ó\ˆHØ—?‘? 3Ó'ˆÙØØ×Ñ˜UÔ#Ø  �}ˆHð ˆÙÝKØ59ÐPiÑjˆLÙ+ð UØ’O˜t¨hÀñUØGSñUò [ØXZð 	ô
 Ñ* 'Ô*Ô0BÈDÔ
Q€CÙð	JßbÙ)¨#Ñ/FÓ/HÓIˆCô 'ò  ˆØò 	 ˆHØ—n‘nÓ&ˆGØ˜Ò ¬Ó,WÔCVÔ,WÕ)WØ”ñ	 ð ð
 øôS ò 	Vä�L‰LÐ8¸+ÐPTˆL×Uð	Vûô ò OÜ—‘Ð>È�×NðOûô" ò Ü�‰Ð>ÀÐVZˆÔ[Ùðûô ò 	JÜ�L‰LÐ9ÀDˆLÖIð	Júsq   ¤G% ¼AF ÂG% ÂF> Â/5G% Ã%9G% Ä:H Æ!F;Æ7G% Æ:F;Æ;G% Æ> G"ÇG% Ç!G"Ç"G% Ç%!H	ÈH	È H/È.H/©Úprefer_fastrË  c                óZ  — d}t        j                  t        «      5  ddlm}  || «      }ddd«       d}|r$t        | «      }|s|�	 |j                  «       xs d}|s|�|j                  r|j                  }|st        j                  | d«      }|r@| j                  «       j                  «       dk(  r	 dd	lm}m}  |«       }|r ||g|«      sy|S |S # 1 sw Y   Œ©xY w# t        $ r t        j                  d| d¬«       Y Œ§w xY w# t        $ r t        j                  d
d¬«       Y |S w xY w)a:  Cheap auxiliary model for a provider.

    Ladder: (``prefer_fast`` only) live-catalog family match, then ``ProviderProfile.resolve_aux_model``;
    then ``default_aux_model`` (curated); then the legacy dict. ``prefer_fast`` is opt-in (titling)
    so other callers keep their static behaviour and cache keys.
    Nr   rª  rJ   zresolve_aux_model failed for %sTr°   r§  r·  zNous policy check unavailable)rC  rD  r}   r¿  r«  rÉ  Úresolve_aux_modelrŠ   r²   Údefault_aux_modelÚ%_API_KEY_PROVIDER_AUX_MODELS_FALLBACKr|   rS  rT  r¾  r¸  r¹  )r¥  rË  Úprofiler«  Úpickedr¸  r¹  Úalloweds           r%   Ú_get_aux_model_for_providerrÓ    s:  € ð €GÜ	×	Ñ	œYÓ	'ñ 4Ý2Ù& {Ó3ˆ÷4ð €FÙÜ)¨+Ó6ˆÙ˜'Ð-ð\Ø ×2Ñ2Ó4Ò:¸�ñ �gÐ)¨g×.GÒ.GØ×*Ñ*ˆÙÜ6×:Ñ:¸;ÈÓKˆñ �+×#Ñ#Ó%×+Ñ+Ó-°Ò7ð	IßbÙ-Ó/ˆGÙÑ6¸°xÀÔIØð €Mˆ6€M÷34ð 4ûô ò \Ü—‘Ð>ÀÐVZ�Ö[ð\ûô ò 	IÜ�L‰LÐ8À4ˆLÕHØ€Mð	Iús/   œCÁC Â3D ÃCÃ!DÄDÄ D*Ä)D*r‘  zglm-4.5-flashzkimi-k2-turbo-previewzstep-3.5-flashz$google/gemini-3.1-flash-lite-previewúclaude-haiku-4-5-20251001zgoogle/gemini-3-flashzgemini-3-flashzglm-5zgoogle/gemini-3.6-flashznemotron-3-nano:30bzhy4-preview)ÚgeminiÚzaiúkimi-codingÚstepfunúkimi-coding-cnÚgmiÚ	anthropicz
ai-gatewayzopencode-zenzopencode-goÚkilocodezollama-cloudztencent-tokenhubztencent-tokenplanrÏ  Ú_API_KEY_PROVIDER_AUX_MODELSÚtitle_generationÚ_FAST_MODEL_TASKSÚtaskc                 ó`   — | t         v xr% t        t        | «      j                  d«      d¬«      S )zHReturn whether an eligible task explicitly opts into fast-model routing.Úprefer_fast_modelF©rÙ   )rß  rj   Ú_get_auxiliary_task_configr|   ©rà  s    r%   Ú_task_prefers_fast_modelræ  D  s5   € àÔ$Ð$ò R¬Ü" 4Ó(×,Ñ,Ð-@ÓAÈ5ô*Rð Rr'   z	mimo-v2.5zglm-5.3-flash)ÚxiaomirÖ  Ú_PROVIDER_VISION_MODELSc                 ó˜   — t         j                  | «      }|r|S 	 ddlm}  || «      }|�|j	                  «       S dS # t
        $ r Y yw xY w)z³Provider default vision model id, or None: static ``_PROVIDER_VISION_MODELS`` (vision-only
    names absent from any catalog) win, else ``ProviderProfile.default_vision_model()``.r   rª  N)rè  r|   r¿  r«  Údefault_vision_modelr}   )rJ  Ústaticr«  rÐ  s       r%   Ú _resolve_provider_vision_defaultrì  R  sY   € ô %×(Ñ(¨Ó2€FÙØˆðÝ2Ù& xÓ0ˆØ18Ð1Dˆw×+Ñ+Ó-ÐNÈ$ÐNøÜò Ùðús   ›= »= ½	A	ÁA	r×  rÙ  Ú_PROVIDERS_WITHOUT_VISIONz%https://hermes-agent.nousresearch.comzHermes Agentzproductivity,cli-agent)úHTTP-RefererúX-TitlezX-OpenRouter-CategoriesÚheadersc           
      ó®  — 	 ddl m}m}  |«       } ||dd«      } ||dd«      }t        |t        «      r|ri t        |t        «      r|ni ¥|¥}t        |t        «      r|s| S t	        | xs i «      }|j                  |j                  «       D ��ci c]  \  }}|€Œ	t        |«      t        |«      “Œ c}}«       |xs | S # t
        $ r | cY S w xY wc c}}w )a-  Merge user ``model.default_headers`` onto resolved headers (user wins; ``model.extra_headers``
    alias wins over both). Mirrors ``AIAgent._apply_user_default_headers`` so a custom endpoint behind a
    WAF rejecting ``User-Agent`` / ``X-Stainless-*`` works for aux calls. SECURITY: never log values.r   ©Úcfg_getÚload_configr]  Údefault_headersÚextra_headers)	r{   ró  rô  r2   rÜ   r}   rF  r6  rK   )	rð  ró  rô  Ú_cfgÚuser_headersÚalias_headersrG  r8  r9  s	            r%   Ú_apply_user_default_headersrú  l  sÑ   € ðß:Ù‹}ˆÙ˜t WÐ.?Ó@ˆÙ  g¨Ó?ˆÜ�m¤TÔ*©}Øh¬z¸,ÌÔ/M™|ÐSUÐhÐZgÐhˆLô �l¤DÔ)±ØˆÜ�'’-˜RÓ €FØ
‡M�M¨l×.@Ñ.@Ó.B×T¡d a¨ÀaÁm”3�q“6œ3˜q›6‘>ÓTÔUØÒ�WÐøô ò ØŠðüó
 Us   ‚AC  Â
C
ÂC
Ã CÃCÚ	or_configc                 óÀ  — t        t        «      }| €	 ddlm}  |«       j	                  di «      } t        j                  j	                  dd«      j                  «       j                  «       }|r|dv s|S | j	                  dd«      s|S d	|d
<   t        j                  j	                  dd«      j                  «       }|rA|j                  «       r/dt        |«      cxk  rdk  rn |S t        t        |«      «      |d<   |S | j	                  dd«      }t        |t        t        f«      r&d|cxk  rdk  rn |S t        t        |«      «      |d<   |S # t
        $ r i } Y �Œ,w xY w)a4  OpenRouter headers, plus response-cache headers when enabled.

    Precedence env > config > default: ``HERMES_OPENROUTER_CACHE`` overrides
    ``openrouter.response_cache``; ``HERMES_OPENROUTER_CACHE_TTL`` (1-86400 s) overrides
    ``openrouter.response_cache_ttl``. ``or_config=None`` reads from disk.
    r   ©rt   Ú
openrouterÚHERMES_OPENROUTER_CACHErJ   >   Ú1ÚonÚyesÚtrueÚresponse_cacheFr  zX-OpenRouter-CacheÚHERMES_OPENROUTER_CACHE_TTLrO  i€Q zX-OpenRouter-Cache-TTLÚresponse_cache_ttli,  )rÜ   Ú_OR_HEADERS_BASEr{   rt   r|   r}   ÚosÚenvironrS  rT  Úisdigitr  rK   r2   r  )rû  rð  rt   Ú	env_cacheÚenv_ttlÚttls         r%   Úbuild_or_headersr  €  sP  € ô Ô#Ó$€GØÐð	Ý>Ù,Ó.×2Ñ2°<ÀÓDˆIô —
‘
—‘Ð8¸"Ó=×CÑCÓE×KÑKÓM€IÙ7@ˆIÐ3Ñ3Øˆð GPÇmÁmÐTdÐfkÔFlØˆØ$*€GÐ Ñ!Ü�j‰j�n‰nÐ:¸BÓ?×EÑEÓG€GÙØ�?‰?Ô ¤c¨'£lÔ!;°eÔ!;ð €Nô 14´C¸³LÓ0AˆGÐ,Ñ-ð
 €Nð �m‰mÐ0°#Ó6ˆÜ�cœC¤˜<Ô(¨Q°#Ô->¸Ô->à€Nô 14´C¸³H³ˆGÐ,Ñ-Ø€Nøô ò 	Ø‹Ið	ús   “E ÅEÅEzX-BILLING-INVOKE-ORIGINÚHermesAgentc                 óV   — t        t        | xs d«      d«      rt        t        «      S i S )zIReturn NVIDIA NIM cloud attribution headers for build.nvidia.com traffic.rJ   úintegrate.api.nvidia.com)rf   rK   rÜ   Ú_NVIDIA_NIM_CLOUD_HEADERS©rA   s    r%   Úbuild_nvidia_nim_headersr  ¡  s(   € ä.CÄCÈÊÐTVÓDWÐYsÔ.tŒ4Ô)Ó*Ð|Ðz|Ð|r'   )Ú__version__zHermesAgent/)rî  rï  ú
User-Agent)Únous_portal_tagsc                  ó   — dt        «       iS )zTFresh Nous Portal ``extra_body`` (per call, so a hot-reloaded version is reflected).Útags)Ú_nous_portal_tagsr*   r'   r%   Ú_nous_extra_bodyr  ´  s   € àÔ%Ó'Ð(Ð(r'   Úauxiliary_is_nousz&nvidia/nemotron-3-ultra-550b-a55b:freez)https://inference-api.nousresearch.com/v1zhttps://api.anthropic.comz	auth.jsonc                  óB   — ddl m}  t        t        k7  rt        S  | «       S )a	  Active profile's ``auth.json`` at call time (a patched ``_AUTH_JSON_PATH`` still wins). The
    import-time constant is the LAUNCH profile's; under multiplexing a secondary's auxiliary calls
    would otherwise authenticate to Nous with the default profile's token.r   ©Ú_auth_file_path)rE  r  Ú_AUTH_JSON_PATHÚ_AUTH_JSON_PATH_AT_IMPORTr  s    r%   Ú_auth_json_pathr"  Ç  s   € õ 0Ü-Ô1JÒJŒ?ÐaÑP_ÓPaÐar'   )z
minimax.iozminimax.chatzminimaxi.com)zapi.minimax.c                 óÖ   ‡— 	 t        | «      j                  xs dj                  «       Št	        ˆfd„t
        D «       «      xs t	        ˆfd„t        D «       «      S # t        $ r Y yw xY w)zGTrue when the URL's host is a known dual-surface (MiniMax-family) host.rJ   Fc              3   óT   •K  — | ]  }‰|k(  xs ‰j                  d |z   «      –— Œ! y­w)rr  N)rÁ  )ræ   rY  Úhosts     €r%   rè   z2_is_dual_surface_anthropic_host.<locals>.<genexpr>Ú  s/   øè ø€ ò Ø:@ˆ�‰Ò5˜$Ÿ-™-¨¨f©Ó5Ó5ñùs   ƒ%(c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr,   rs  )ræ   Úprefixr%  s     €r%   rè   z2_is_dual_surface_anthropic_host.<locals>.<genexpr>Ü  s   øè ø€ ÒY¨ˆT�_‰_˜V×$ÑYùs   ƒ)r   ÚhostnamerT  Ú
ValueErrorrõ   Ú%_DUAL_SURFACE_ANTHROPIC_HOST_SUFFIXESÚ%_DUAL_SURFACE_ANTHROPIC_HOST_PREFIXES)r2  r%  s    @r%   Ú_is_dual_surface_anthropic_hostr,  Ô  sk   ø€ ðÜ˜“×&Ñ&Ò,¨"×3Ñ3Ó5ˆô ó ÜDiôó ò Zä	ÓYÔ3XÔYÓ	YðZøô ò Ùðús   ƒ'A Á	A(Á'A(c                 óP  — t        | xs d«      j                  «       j                  d«      }t        |«      dk(  rddlm}  ||«      S |j                  d«      r‘t        |d«      st        |d«      r+|d	t        d«        d
z   }t        j                  d||«       |S t        |«      r+|d	t        d«        dz   }t        j                  d||«       |S t        j                  d|«       |S t        |d«      r/|j                  d«      r|dz   }t        j                  d||«       |S |S )uQ  Normalize dual-surface Anthropic URLs to their OpenAI-compatible sibling.

    MiniMax-family: ``/anthropic`` â†’ ``/v1``; ZAI Coding Plan â†’ ``/coding/paas/v4`` (the general
    endpoint bills separately); Kimi Code ``/coding`` â†’ ``/coding/v1`` (the OpenAI SDK path 404s
    without it). Anthropic-only gateways keep their path.
    rJ   r_  zapi.actual.incr   ©Únormalize_actual_base_urlú
/anthropiczopen.bigmodel.cnzapi.z.aiNz/coding/paas/v4u0   Auxiliary client: rewrote ZAI base URL %s â†’ %sr­  u9   Auxiliary client: rewrote dual-surface base URL %s â†’ %szQAuxiliary client: keeping Anthropic-only base URL %s (no dual-surface host match)úapi.kimi.comú/codingu1   Auxiliary client: rewrote Kimi base URL %s â†’ %s)rK   rS  rÀ  rg   rE  r/  rÁ  rf   ÚlenrŠ   r²   r,  )rA   r2  r/  Ú	rewrittens       r%   Ú_to_openai_base_urlr5  ß  s%  € ô ˆhŠn˜"Ó
×
#Ñ
#Ó
%×
,Ñ
,¨SÓ
1€CÜ˜ÓÐ!1Ò1Ý=Ù(¨Ó-Ð-Ø
‡|�|�LÔ!Ü  Ð&8Ô9Ô=RÐSVÐXbÔ=cØÐ0œs <Ó0Ð0Ð1Ð4EÑEˆIÜ�L‰LÐKÈSÐR[Ô\ØÐÜ*¨3Ô/ØÐ0œs <Ó0Ð0Ð1°EÑ9ˆIÜ�L‰LÐTÐVYÐ[dÔeØÐÜ�‰Ø_Ðadô	fàˆ
Ü˜S .Ô1°c·l±lÀ9Ô6MØ˜%‘Kˆ	Ü�‰ÐHÈ#ÈyÔYØÐØ€Jr'   rJ   Únotec                 ó¢   — 	 t        | «      }|r|j	                  «       r|S dS # t        $ r"}t        j                  d| ||«       Y d}~yd}~ww xY w)zJ``load_pool(provider)`` when it has credentials, else None (never raises).z2Auxiliary client: could not load pool for %s%s: %sN)rV   r}   rŠ   r²   Úhas_credentials)rJ  r6  Úpoolr  s       r%   Ú_load_pool_with_credentialsr:  ý  sU   € ðÜ˜Ó"ˆñ ˜D×0Ñ0Ô2ˆ4Ð<¸Ð<øô ò Ü�‰ÐIÈ8ÐUYÐ[^Ô_Üûðús   ‚# £	A¬A	Á	Ac                 óž   — t        | «      }|€y	 d|j                  «       fS # t        $ r!}t        j	                  d| |«       Y d}~yd}~ww xY w)z2Return (pool_exists_for_provider, selected_entry).N©FNTz8Auxiliary client: could not select pool entry for %s: %s)TN)r:  Úselectr}   rŠ   r²   )rJ  r9  r  s      r%   Ú_select_pool_entryr>    sP   € ä& xÓ0€DØ€|ØðØ�T—[‘[“]Ð"Ð"øÜò Ü�‰ÐOÐQYÐ[^Ô_Üûðús   �" ¢	A«AÁAr9  c                 ó  — |€t        | d«      }|€y	 t        |dd«      }t        |«      r |«       nd}|�|S t        |dd«      }t        |«      r |«       S 	 y# t        $ r!}t        j                  d| |«       Y d}~yd}~ww xY w)z’Best-effort current/next pool entry without mutating selection order.

    ``pool`` skips the disk re-read when the caller already loaded it.
    Nz (peek)ÚcurrentÚpeekz6Auxiliary client: could not peek pool entry for %s: %s)r:  rP   rª   r}   rŠ   r²   )rJ  r9  Ú
current_fnr@  Úpeek_fnr  s         r%   Ú_peek_pool_entryrD    s    € ð
 €|Ü*¨8°YÓ?ˆØ€|Øð	^Ü˜T 9¨dÓ3ˆ
Ü"*¨:Ô"6‘*”,¸DˆØÐØˆNÜ˜$ ¨Ó-ˆÜ�GÔÙ“9Ðð ð øô ò ^Ü�‰ÐMÈxÐY\×]Ð]Øûð^ús   “$A ¸A Á	BÁ"A>Á>BÚentryc                 ót   — t        | dd «      xs t        | dd«      }t        |xs d«      j                  «       S )NÚruntime_api_keyr�   rJ   )rP   rK   rS  )rE  rØ   s     r%   Ú_pool_runtime_api_keyrH  )  s7   € ä
�%Ð*¨DÓ
1Ò
W´W¸UÀNÐTVÓ5W€CÜˆsŠy�b‹>×ÑÓ!Ð!r'   Úfallbackc                 óV  — | €,t        |xs d«      j                  «       j                  d«      S t        | dd «      dk(  rddlm}  |«       }|r|S t        | dd «      xs  t        | dd «      xs t        | d	d «      xs |}t        |xs d«      j                  «       j                  d«      S )
NrJ   r_  rJ  r§  r   )Ú_nous_inference_env_overrideÚruntime_base_urlÚinference_base_urlrA   )rK   rS  rÀ  rP   rE  rK  )rE  rI  rK  Úenv_urlr2  s        r%   Ú_pool_runtime_base_urlrO  /  s­   € Ø€}Ü�8’>˜rÓ"×(Ñ(Ó*×1Ñ1°#Ó6Ð6Üˆu�j $Ó'¨6Ò1å@Ù.Ó0ˆÙØˆNä�5Ð,¨dÓ3ò ;´w¸uÐFZÐ\`Ó7aò ;Ü�e˜Z¨Ó.ò;Ø2:ð äˆsŠy�b‹>×ÑÓ!×(Ñ(¨Ó-Ð-r'   úapi.anthropic.comc                 ód  — | sy	 t        | «      }|j                  xs dj                  «       j                  «       j	                  d«      t
        v ry|j                  xs dj	                  d«      j                  «       }|j                  d«      xs |j                  d«      S # t        $ r Y yw xY w)a  True for native Anthropic hosts and gateways serving Messages under a ``/anthropic`` path
    (same convention as runtime_provider / ``_wrap_if_needed``), so a configured ``model.base_url``
    whose gateway holds auth is not discarded. A bare non-Anthropic base_url is False.FrJ   rr  Tr_  r0  ú/anthropic/v1)	r   r(  rS  rT  rÀ  Ú_ANTHROPIC_COMPATIBLE_HOSTSÚpathrÁ  r}   )r2  r7  rT  s      r%   Ú_is_anthropic_compatible_hostrU  C  s›   € ñ ØðÜ˜#“ˆØ�O‰OÒ!˜r×(Ñ(Ó*×0Ñ0Ó2×9Ñ9¸#Ó>ÔB]Ñ]ØØ—‘Ò!˜r×)Ñ)¨#Ó.×4Ñ4Ó6ˆØ�}‰}˜\Ó*ÒL¨d¯m©m¸OÓ.LÐLøÜò Ùðús   …AB# ÁAB# Â#	B/Â.B/c            	      ó€   — 	 t        dt        t        j                  dd«      «      «      S # t        t
        f$ r Y yw xY w)Né<   ÚHERMES_NOUS_MIN_KEY_TTL_SECONDSÚ1800i  )Úmaxr  r  Úgetenvr0  r)  r*   r'   r%   Ú_nous_min_key_ttl_secondsr\  S  s<   € ðÜ�2”sœ2Ÿ9™9Ð%FÈÓOÓPÓQÐQøÜ”zÐ"ò Ùðús   ‚(+ «=¼=rD   c                 ób  — | syt        j                  t        «      5  ddlm}m} t        j                  |«      5   || «      xs dj                  «       cddd«       cddd«       S # 1 sw Y   nxY w	 ddd«       n# 1 sw Y   nxY wt        j                  | «      xs dj                  «       S )a  Read a provider API key (or its paired base-URL) env var through the profile secret scope.

    In agent turns the scope's verdict is authoritative (a scoped miss must not borrow another
    profile's key); unscoped startup/CLI paths fall back to os.environ.
    rJ   r   )ÚUnscopedSecretErrorÚ
get_secretN)	rC  rD  r}   Úagent.secret_scoper^  r_  rS  r  r[  )rD   r^  r_  s      r%   Ú_scoped_key_envra  Z  sœ   € ñ ØÜ	×	Ñ	œYÓ	'ñ 4ßFÜ× Ñ Ð!4Ó5ñ 	4Ù˜tÓ$Ò*¨×1Ñ1Ó3÷	4ð 	4÷4ñ 4÷	4ð 	4úð 	4÷4÷ 4ñ 4úô �I‰I�d‹OÒ!˜r×(Ñ(Ó*Ð*s"   �A>»A(Á	A>Á(A1	Á-A>Á>BÚfinalc                 óR  ‡	— g }g }t        | dd«      xs g D ]Ç  }t        |d«      }|dk(  ret        |d«      xs g D ]Q  }t        |d«      }|dv r|j                  t        |dd«      «       Œ0|d	k(  sŒ6|j                  t        |d	d«      «       ŒS Œy|d
k(  sŒ|j                  t        t        |dd«      dt        t        |dd«      t        |dd«      ¬«      ¬«      «       ŒÉ d}t        | dd«      Š	‰	r2dt        dt
        fˆ	fd„}t         |d«       |d«       |d«      ¬«      }|||fS )zbSplit a completed Responses object into (text_parts, tool_calls, usage) in chat.completions shape.ÚoutputNrá   ÚmessageÚcontent>   rê   Úoutput_textrê   rJ   ÚrefusalÚfunction_callÚcall_idÚfunctionrD   Ú	argumentsz{}©rD   rl  ©rô   rá   rk  ÚusagerØ   r!   c                 ój   •— t        ‰| d«      xs$ t        ‰t        «      r‰j                  | d«      S dS ©Nr   )rP   r2   rÜ   r|   )rØ   Ú
resp_usages    €r%   Ú_uz'_parse_codex_final_response.<locals>._u�  s3   ø€ Ü˜: s¨AÓ.ÒqÌZÐXbÔdhÔMi°:·>±>À#ÀqÓ3IÐqÐopÐqr'   Úinput_tokensÚoutput_tokensÚtotal_tokens©Úprompt_tokensÚcompletion_tokensrv  )rP   rÞ   Úappendr   rK   r  )
rb  Ú
text_partsÚtool_calls_rawÚitemÚ	item_typer   Ú	part_typero  rs  rr  s
            @r%   Ú_parse_codex_final_responser€  j  sX  ø€ à€JØ "€NÜ˜ ¨$Ó/Ò5°2ò `ˆÜ˜4 Ó(ˆ	Ø˜	Ò!Ü  iÓ0Ò6°Bò C�Ü" 4¨Ó0�	ØÐ 7Ñ7Ø×%Ñ%¤f¨T°6¸2Ó&>Õ?Ø )Ó+ð ×%Ñ%¤f¨T°9¸bÓ&AÕBñCð ˜/Ó)Ø×!Ñ!¤/Ü˜$ 	¨2Ó.°ZÜ(Ü  f¨bÓ1¼VÀDÈ+ÐW[Ó=\ô^ô#_õ `ð`ð  €EÜ˜ ¨Ó.€JÙð	r”Cð 	rœCõ 	räÙ˜^Ó,ÁÀ?Ó@SÙ˜NÓ+ô-ˆð �~ uÐ,Ð,r'   r  Úfailure_notec                 óœ   — t        | dd«      }t        |«      r		  |«        yy# t        $ r |rt        j	                  d|d¬«       Y yY yw xY w)zhCall ``target.close()`` if present; a failure is debug-logged under ``failure_note`` (silent when None).ÚcloseNzCodex auxiliary: %sTr°   )rP   rª   r}   rŠ   r²   )r  r�  rƒ  s      r%   Ú_close_quietlyr„  ‰  sU   € ä�F˜G TÓ*€EÜ�„ð	QÙ�Gð øô ò 	QÙÜ—‘Ð2°LÈ4�ÖPñ ð	Qús   š# £#AÁ
Ac                   óØ   — e Zd ZdZ	 ddedee   dee   fd„Zdefd„Zde	fd	„Z
d
eddfd„Zd
eddfd„Zdeddfd„Zdd„Zdefd„Zdd„Zdd„Zdd„Zdeddfd„Zdd„Zdeddfd„Zdd„Zy)Ú_CodexStreamGuarda3  Progress-aware deadline + FD-safe timeout watchdog for one Codex aux stream attempt.

    (1) The first substantive payload must arrive within ``no_progress_timeout`` or we fail fast into
    the caller's retry/fallback chain (a dead or keepalive-only zombie must not hold the budget);
    (2) each substantive event re-arms that window (keepalive/lifecycle frames do NOT, mirroring
    commit-fence gating) so a live stream is never killed by an absolute total; (3) a hard ceiling
    from ``_aux_stream_total_ceiling`` still terminates a pathological drip.
    NrŒ   Útotal_timeoutÚno_progress_timeoutc                 ó°  — || _         || _        t        j                  «       | _        t        |t        t        f«      r|dkD  rt        |«      | _        nt        | _        |�$t        | j                  t        |«      «      | _        | j                  t        |«      z   | _        t        «       }t        |t        t        f«      r|| j                  k  rt        |«      | _        t        j                  «       | _        | j                  | j                  z   | _        t        j$                  «       | _        t        j$                  «       | _        t        j$                  «       | _        t        j$                  «       | _        d | _        t1        «       r
t3        «       nd | _        t        j                  «       | _        d | _        t        j:                  «       | _        y rq  )Ú_clientr‡  rû   rü   Ú_startr2   r  r  rˆ  Ú'_AUX_STREAM_NO_PROGRESS_TIMEOUT_SECONDSÚminÚ_aux_stream_total_ceilingÚhard_deadliner  r¹   rº   Ú_deadline_lockÚ_progress_deadliner#  Úsaw_contentrÁ   Útimeout_release_pendingÚstream_finishedÚ_timerr    r¢   Ú_protected_cancel_checkÚ_attempt_stream_lockÚ_attempt_streamÚ	get_identÚ
_owner_tid)r-   rŒ   r‡  rˆ  rþ   s        r%   rC   z_CodexStreamGuard.__init__ž  se  € ð ˆŒØ*ˆÔÜ—n‘nÓ&ˆŒô Ð)¬C´¨<Ô8Ð=PÐSTÒ=TÜ',Ð-@Ó'AˆDÕ$ä'NˆDÔ$ð Ð$Ü'*¨4×+CÑ+CÄUÈ=ÓEYÓ'ZˆDÔ$Ø!Ÿ[™[Ô+DÀ]Ó+SÑSˆÔô 5Ó6ˆÜ�m¤c¬5 \Ô2°}Àt×GYÑGYÒ7YÜ!& }Ó!5ˆDÔÜ'Ÿn™nÓ.ˆÔØ"&§+¡+°×0HÑ0HÑ"HˆÔÜ$Ÿ?™?Ó,ˆÔÜ"Ÿ™Ó*ˆŒô (1§¡Ó'8ˆÔ$Ü(Ÿ™Ó0ˆÔØˆŒô G_ÔF`Ô'@Ô'BÐfjˆÔ$Ü$-§N¡NÓ$4ˆÔ!Ø$(ˆÔä#×-Ñ-Ó/ˆ�r'   r!   c                 ó†   — | j                   5  t        | j                  | j                  «      cd d d «       S # 1 sw Y   y xY wr,   )r�  r�  r�  r‘  r6   s    r%   Úeffective_deadlinez$_CodexStreamGuard.effective_deadlineÒ  s:   € Ø× Ñ ñ 	DÜ�t×)Ñ)¨4×+BÑ+BÓC÷	D÷ 	Dò 	Dús	   � 7·A c                 óJ   — | j                   }t        |«      xr t        |«      S )zITrue when the frozen hard-cancel source says the owner already cancelled.)r–  rª   r£   )r-   r¤   s     r%   Úcancel_requestedz"_CodexStreamGuard.cancel_requestedÖ  s"   € à×,Ñ,ˆÜ˜‹ÒHÔ#AÀ%Ó#HÐHr'   Ústreamc                 óT   — | j                   5  || _        d d d «       y # 1 sw Y   y xY wr,   )r—  r˜  ©r-   rŸ  s     r%   Úadopt_streamz_CodexStreamGuard.adopt_streamÛ  s(   € Ø×&Ñ&ñ 	*Ø#)ˆDÔ ÷	*÷ 	*ñ 	*ús   �ž'c                 ól   — t        |d«       | j                  5  d| _        ddd«       y# 1 sw Y   yxY w)z<Owner-side: close the attempt stream silently and forget it.N)r„  r—  r˜  r¡  s     r%   Úrelease_streamz _CodexStreamGuard.release_streamß  s2   € ä�v˜tÔ$Ø×&Ñ&ñ 	(Ø#'ˆDÔ ÷	(÷ 	(ñ 	(ús   ™*ª3r�  c                 óv   — | j                   5  | j                  }ddd«       t        |«       y# 1 sw Y   ŒxY w)uF   Closes only this attempt's stream â€” never the process-shared client.N)r—  r˜  r„  )r-   r�  rŸ  s      r%   Úclose_attempt_streamz&_CodexStreamGuard.close_attempt_streamå  s5   € à×&Ñ&ñ 	*Ø×)Ñ)ˆF÷	*ä�v˜|Õ,÷	*ð 	*ús   �/¯8c                 ó’   — | j                   5  t        j                  «       | j                  z   | _        ddd«       y# 1 sw Y   yxY w)zQSubstantive payload re-arms the no-progress window; the hard ceiling never moves.N)r�  rû   rü   rˆ  r‘  r6   s    r%   Úrecord_progressz!_CodexStreamGuard.record_progressë  s>   € à× Ñ ñ 	RÜ&*§n¡nÓ&6¸×9QÑ9QÑ&QˆDÔ#÷	R÷ 	Rñ 	Rús	   �'=½Ac                 ón  — t        j                  «       | j                  z
  }t        j                  «       | j                  k\  rd| j                  | j                  z
  d›d�S | j                  j                  «       sdt        | j                  «      d›d|d›d�S dt        | j                  «      d›d|d›d�S )	Nz*Codex auxiliary Responses stream exceeded z.1fzs hard ceilingz;Codex auxiliary Responses stream produced no output within zs (no-progress timeout, z
s elapsed)z<Codex auxiliary Responses stream stalled: no new output for zs ()rû   rü   r‹  r�  r’  r©   r  rˆ  )r-   Úelapseds     r%   Útimeout_messagez!_CodexStreamGuard.timeout_messageð  sÅ   € Ü—.‘.Ó" T§[¡[Ñ0ˆÜ�>‰>Ó˜t×1Ñ1Ò1Ø?À×@RÑ@RÐUY×U`ÑU`Ñ@`ÐadÐ?eÐesÐtÐtØ×Ñ×&Ñ&Ô(ðÜ × 8Ñ 8Ó9¸#Ð>Ð>VÐW^Ð_bÐVcÐcmðoðpðÜ˜×1Ñ1Ó2°3Ð7°s¸7À3¸-ÀzðSð	Tr'   c                 óÐ  — t        | j                  dd «      }t        |«      rt         |«       «      }n| j	                  «        }| j
                  j                  «        |s| j                  d«       y | j                  j                  «        t        j                  «       | j                  k(  rt        | j                  d«       n@	 ddlm}  || j                  «      }t         j#                  d|«       | j                  d
«       	 t)        | j                  «       y # t$        $ r t         j'                  dd¬	«       Y ŒJw xY w# t$        $ r t         j'                  dd¬	«       Y y w xY w)NrÂ   z4cancelled attempt stream close during timeout failedz"client close during timeout failedr   )Úforce_close_tcp_socketsz]Codex auxiliary client aborted (timeout, tcp_force_closed=%d, deferred_close=stranger_thread)z3Codex auxiliary: client abort during timeout failedTr°   z:attempt stream close during stranger-thread timeout failedz1Codex auxiliary: cache eviction on timeout failed)rP   r–  rª   rO   rž  rÁ   r  r¦  r“  r¹   r™  rš  r„  rŠ  Úagent.agent_runtime_helpersr­  rŠ   Úinfor}   r²   Ú_evict_cached_client_instance)r-   rÂ   Útimeout_wonr­  Úshutdown_counts        r%   Ú_close_client_on_timeoutz*_CodexStreamGuard._close_client_on_timeoutü  s<  € Ü '¨×(DÑ(DÐF]Ð_cÓ dÐÜÐ)Ô*ÜÑ4Ó6Ó7‰Kà"×3Ñ3Ó5Ð5ˆKð 	�‰×ÑÔÙð ×%Ñ%Ð&\Ô]Øð 	×$Ñ$×(Ñ(Ô*Ü×ÑÓ  D§O¡OÒ3Ü˜4Ÿ<™<Ð)MÕNðcÝOÙ!8¸¿¹Ó!F�Ü—‘ð6Ø7EôGð ×%Ñ%Ð&bÔcð	]ô *¨$¯,©,Õ7øô ò cÜ—‘ÐRÐ]a�Öbðcûô ò 	]Ü�L‰LÐLÐW[ˆLÖ\ð	]ús$   Ã.D ÄE Ä D?Ä>D?Å E%Å$E%c                 óŒ  — | j                   �ht        j                  «       | j                  «       k\  rC| j                  j                  «       s| j                  «        t        | j                  «       «      ‚	 ddl	m
} t        «       r
t        «       ‚ |«       rt        «       st        d«      ‚y y # t        $ r ‚ t        $ r Y y w xY w)Nr   )Úis_interruptedz,Codex auxiliary Responses stream interrupted)r‡  rû   rü   rœ  rÁ   r©   r³  rý   r«  Útools.interruptrµ  r¥   r–   r    ÚInterruptedErrorr}   )r-   rµ  s     r%   Úcheck_cancelledz!_CodexStreamGuard.check_cancelled-  s®   € Ø×ÑÐ)¬d¯n©nÓ.>À$×BYÑBYÓB[Ò.[Ø—>‘>×(Ñ(Ô*Ø×-Ñ-Ô/Ü˜t×3Ñ3Ó5Ó6Ð6ð	Ý6ô /Ô0Ü3Ó5Ð5ñ ÔÔ(@Ô(BÜ&Ð'UÓVÐVð )CÐøäò 	ØÜò 	áð	ús   Á66B. Â.CÃCc                 ó  — | j                  «       t        j                  «       z
  }|dkD  rF| j                  j	                  «       s+| j
                  j	                  «       s| j                  |«       y | j                  «        y rq  )rœ  rû   rü   rÁ   r©   r”  Ú
_arm_timerr³  )r-   Ú	remainings     r%   Ú_watchdog_firez _CodexStreamGuard._watchdog_fireB  sa   € ð ×+Ñ+Ó-´·±Ó0@Ñ@ˆ	Ø�qŠ=Ø—N‘N×)Ñ)Ô+¨t×/CÑ/C×/JÑ/JÔ/LØ—‘ 	Ô*ØØ×%Ñ%Õ'r'   Údelayc                 ó€   — t        j                  || j                  «      x| _        }d|_        |j                  «        y ©NT)r¹   ÚTimerr¼  r•  r   r&  )r-   r½  Úts      r%   rº  z_CodexStreamGuard._arm_timerL  s/   € Ü#Ÿ/™/¨%°×1DÑ1DÓEÐEˆŒ�aØˆŒØ	�‰�	r'   c                 ó¸   — | j                   r>| j                  t        | j                  «       t	        j
                  «       z
  d«      «       | j                  «        y)zNArm the watchdog (when a total timeout exists) and run the first cancel check.rž  N)r‡  rº  rZ  rœ  rû   rü   r¸  r6   s    r%   r&  z_CodexStreamGuard.startQ  s?   € à×ÒØ�O‰OœC × 7Ñ 7Ó 9¼D¿N¹NÓ<LÑ LÈcÓRÔSØ×ÑÕr'   Ú_eventc                 ó¸   — t        |«      r5| j                  «        | j                  j                  «        t	        «        n
t        «        | j                  «        y r,   )r   r¨  r’  r  rÕ   rÓ   r¸  )r-   rÃ  s     r%   Úon_eventz_CodexStreamGuard.on_eventW  sB   € ô $ FÔ+Ø× Ñ Ô"Ø×Ñ× Ñ Ô"Ü)Õ+ä'Ô)Ø×ÑÕr'   c                 óæ   — | j                   j                  «        | j                  �| j                  j                  «        | j                  j                  «       rt        | j                  d«       yy)z^Owner ``finally``: stop the watchdog and release FDs a stranger-thread timeout only shut down.Nz'owner-thread close after timeout failed)r”  r  r•  Úcancelr“  r©   r„  rŠ  r6   s    r%   Úfinishz_CodexStreamGuard.finishe  sV   € à×Ñ× Ñ Ô"Ø�;‰;Ð"Ø�K‰K×ÑÔ ð ×'Ñ'×.Ñ.Ô0Ü˜4Ÿ<™<Ð)RÕSð 1r'   r,   r›   )r8   r9   r:   r;   r   r	   r  rC   rœ  rO   rž  r¢  r¤  rK   r¦  r¨  r«  r³  r¸  r¼  rº  r&  rÅ  rÈ  r*   r'   r%   r†  r†  ”  sÝ   „ ñð 04ñ20Øð20Ø*2°5©/ð20à% e™_ó20ðhD Eó DðI $ó Ið
* 3ð *¨4ó *ð( Sð (¨Tó (ð-°ð -¸ó -óRð

T ó 
Tó/]óbó*(ð ð ¨$ó ó
ð˜sð  tó ôTr'   r†  c                   ó\   — e Zd ZdZdedefd„Zdeeef   de	eeef   eef   fd„Z
defd„Zy	)
Ú_CodexCompletionsAdapterzXDrop-in shim routing chat.completions.create() kwargs through Codex Responses streaming.Úreal_clientr]  c                 ó    — || _         || _        y r,   )rŠ  Ú_model©r-   rË  r]  s      r%   rC   z!_CodexCompletionsAdapter.__init__s  s   € Ø"ˆŒØˆ�r'   r/   r!   c                 ó	  — ddl m}m}m}m}m} ddlm} |j                  d| j                  «      } ||«      }	t        t        | j                  dd«      xs d«      }
t        |
d«      } |t        d|
¬	«      «      }|j                  }|j                   }|j                  d
«      }|r=	 ddl}ddlm}m} |j+                  t-        |«      «      } ||«      \  }} ||«      \  }} | ||«      t        | j                  dd«      xs d|
d	œ|«      \  }}|j5                  «       D ��ci c]  \  }}||“Œ
 }}}d}g }|j                  dg «      D ]×  }|j                  d«      xs d}|j                  dd«      dk(  rt7        |t        «      r|n
t        |«      }ŒK|rz|j                  d«      rii |¥d|d   D �cg c]T  }t7        |t8        «      r@|j                  d«      xs i j                  d«      |v ri |¥di |d   ¥d||d   d      i¥i¥n|‘ŒV c}i¥}|j;                  |«       ŒÙ  ||| |d7d|
i|j=                  «       ¤Ž|	d¬«      }|	||xs dddœgddœ} |j                  d«      }!|!�|!| d<   t7        |j                  d«      t8        «      r|d   rt9        |d   «      | d<   |j                  d«      xs i }"t7        |"t8        «      rÕ|"j                  d«      }#t7        |#t        «      r%|#j?                  «       r|s|#j?                  «       | d<   |"j                  d«      }$t7        |$t8        «      rndd l m!}% dd!lm"}&  |&||
|jF                  ¬"«      }'|'r>|$j                  d#«      dur+ |%|$j                  d$«      xs d%|'«      }(|(d&d'œ| d<   d(g| d)<   nd*|'v r	|sd$d*i| d<   |r|| d
<   |r|| d+<   	 dd,lm$})m%}* dd-lm&}+ |sG|sEd.| vrA |)tO        d/«      xs tO        d0«      «      }, |*| d1   | j                  d
«      |,«      }-|-r|-| d.<   d2| vr |+||
«      }.|.r|.| d2<   dd6lm)}/  |/| ||
«       | ||!fS # t.        $ r!}t0        j3                  d|«       Y d}~�Œod}~ww xY wc c}}w c c}w # t.        $ r t0        jQ                  d3d4¬5«       Y Œow xY w)8ut   chat.completions kwargs â†’ Responses API kwargs, ``(resp_kwargs, model, timeout)``; mirrors codex.py::build_kwargs.r   )Ú!_chat_messages_to_responses_inputÚ_classify_responses_issuerÚ_responses_toolsÚ_wire_model_identityÚclassify_responses_route)Ú_alias_wire_toolsr]  rA   rJ   úgithubcopilot.comN©rJ  rA   Útools)Ústrip_pattern_and_formatÚstrip_slash_enumzRAuxiliary client: failed to sanitize tool schemas for Codex/xAI Responses path: %sÚ_hermes_aux_effective_providerzYou are a helpful assistant.Úmessagesrf  ÚroleÚuserÚsystemÚ
tool_callsrk  rD   F)Úis_github_responsesÚcurrent_issuer_kindÚcurrent_issuer_modelÚnative_compaction_eligible)rÝ  rf  )r]  ÚinstructionsÚinputÚstorer²  rö  Ú
extra_bodyÚservice_tierÚ	reasoning)Úclamp_effort)Ú_codex_efforts_for_route)Úis_codex_backendÚenabledÚeffortÚmediumrL  )rï  Úsummaryzreasoning.encrypted_contentÚincludeÚnoneÚ_wire_aliases)Ú_cache_scope_from_session_idÚ_content_cache_key)Ú+_default_prompt_cache_retention_for_requestÚprompt_cache_keyÚcache_scopeÚ
session_idrå  Úprompt_cache_retentionz4Codex auxiliary: prompt_cache_key derivation skippedTr°   )Ú_sanitize_astra_request_kwargsr*   )*Úagent.codex_responses_adapterrÐ  rÑ  rÒ  rÓ  rÔ  Úagent.transports.codexrÕ  r|   rÍ  rK   rP   rŠ  rf   r   Úis_xai_responsesrá  ÚcopyÚtools.schema_sanitizerrÙ  rÚ  ÚdeepcopyÚlistr}   rŠ   r‹   r6  r2   rÜ   rz  Ú_asdictrS  Úagent.reasoning_effortrë  rì  rí  rõ  rö  r÷  Ú_runtime_main_valuer²   rü  )0r-   r/   rÐ  rÑ  rÒ  rÓ  rÔ  rÕ  r]  Ú
wire_modelr%  Ú
is_copilotÚrouteÚis_xaiÚ	is_githubrØ  Ú_copyrÙ  rÚ  Ú_r  Ú
wire_toolsÚwire_aliasesÚaliasÚoriginalÚrenamedrå  Úreplay_messagesÚmsgrf  ÚtcÚinput_itemsÚresp_kwargsr²  rè  ré  Úreasoning_cfgrë  rì  Ú	supportedrï  rõ  rö  r÷  ÚscopeÚ	cache_keyÚcache_retentionrü  s0                                                   r%   Ú_build_responses_kwargsz0_CodexCompletionsAdapter._build_responses_kwargsw  sñ  € ÷	
õ 	
õ 	=Ø—
‘
˜7 D§K¡KÓ0ˆÙ)¨%Ó0ˆ
Ü”7˜4Ÿ<™<¨°RÓ8Ò>¸BÓ?ˆÜ*¨4Ð1DÓEˆ
á(¬À$ÐQUÔ)VÓWˆØ×'Ñ'ˆØ×-Ñ-ˆ	Ø—
‘
˜7Ó#ˆÙð
Û$ß]ØŸ™¤t¨E£{Ó3�Ù3°EÓ:‘��qÙ+¨EÓ2‘��qñ $5Ù˜UÓ#Ü  §¡Ð/OÐQSÓTÒ\ÐX\ÐjnÑoØó$
Ñ ˆ
�Lð
 ;G×:LÑ:LÓ:N×O¡ u¨h�8˜U‘?ÐOˆÑOð 6ˆØ02ˆØ—:‘:˜j¨"Ó-ò 	(ˆCØ—g‘g˜iÓ(Ò.¨BˆGØ�w‰w�v˜vÓ&¨(Ò2Ü*4°W¼cÔ*B™wÌÈGË�Øá˜3Ÿ7™7 <Ô0ð˜ð ˜lð " ,Ñ/ö-ð ô " "¤dÔ+°·±¸
Ó1CÒ1IÀr×0NÑ0NÈvÓ0VÐZaÑ0að d�rÐc˜:Ð'b¨"¨Z©.Ð'b¸&À'È"ÈZÉ.ÐY_ÑJ`ÑBaÑ'bÒcØgiñjò-ñ �ð
 ×"Ñ" 3Õ'ð	(ñ( 8Ø°Ù :Ñ \ÀDÐ \ÈEÏMÉMËOÑ \Ø!+Èô
ˆð  °Ø ÒE¨fÀÑ%DÐ$EÐPUñ'
ˆð —*‘*˜YÓ'ˆØÐØ%,ˆK˜	Ñ"ô �f—j‘j Ó1´4Ô8¸VÀOÒ=TÜ+/°°Ñ0GÓ+HˆK˜Ñ(à—Z‘Z Ó-Ò3°ˆ
Ü�j¤$Ô'à%Ÿ>™>¨.Ó9ˆLÜ˜,¬Ô,°×1CÑ1CÔ1EÉfØ.:×.@Ñ.@Ó.B�˜NÑ+Ø&ŸN™N¨;Ó7ˆMÜ˜-¬Ô.õ
 @ÝKÙ4°U¸DÐSX×SiÑSiÔj�	Ù ×!2Ñ!2°9Ó!=ÀUÑ!Já)¨-×*;Ñ*;¸HÓ*EÒ*QÈÐS\Ó]�FØ:@ÈVÑ/T�K Ñ,Ø.KÐ-L�K 	Ò*Ø˜yÑ(±Ø08¸&Ð/A�K Ñ,ÙØ#-ˆK˜Ñ ÙØ+7ˆK˜Ñ(ð
	`÷ `ÝZÙ™iÐ-?À{Ñ-RÙ4Ü'¨Ó6Ò[Ô:MÈlÓ:[ó�ñ /¨{¸>Ñ/JÈKÏOÉOÐ\cÓLdÐfkÓl�	ÙØ6?�KÐ 2Ñ3Ø'¨{Ñ:Ù"MÈeÐUYÓ"Z�Ù"Ø<K�KÐ 8Ñ9õ 	JÙ& {°E¸4Ô@Ø˜E 7Ð*Ð*øôc ò Ü—‘ð3Ø47÷ò ûðüó Pùò-øô` ò 	`Ü�L‰LÐOÐZ^ˆLÖ_ð	`ús8   Â(<P. Ä&QÆ5AQ!
Î.A+Q& Ð.	QÐ7QÑQÑ& R	ÒR	c           
      ó  — ddl m}  |t        | j                  dd«      t	        t        | j                  dd«      xs d«      «      rt        d«      ‚| j                  |«      \  }}}|j                  dd «      xs i }t        |t        t        f«      r|dkD  r|nd }t        | j                  ||j                  d«      ¬	«      }	 |j                  «        dd
lm}	 ddlm}
  |
i |¥ddi¥«      } | j                  j$                  j&                  di |¤Ž}|j)                  |«       |j*                  j-                  «       r!|j/                  «       r|j1                  d«       	 t3        |d«      r|}n1 |	|t	        |j                  d«      xs |«      |j4                  ¬«      }|j7                  |«       |€t9        d«      ‚t;        |«      \  }}}|xs dD ]C  }|j<                  j>                  |v sŒ||j<                  j>                     |j<                  _        ŒE 	 |jK                  «        tM        ddjO                  |«      jQ                  «       xs d |xs d ¬«      }tM        d||sdnd¬«      }tM        |g||¬«      S # |j7                  |«       w xY w# t@        $ rP}|j*                  j-                  «       rtC        |jE                  «       «      |‚tF        jI                  d|«       ‚ d }~ww xY w# |jK                  «        w xY w)Nr   ©Úis_actual_routerÛ  rJ   rA   zFActual requests require Chat Completions; refusing to call /responses.rô  rˆ  )rˆ  )Ú_consume_codex_event_stream)Úbypass_sdk_request_transformrŸ  Tz*late cancelled attempt stream close failedrd  r]  )r]  rÅ  z@Codex auxiliary Responses stream did not return a final responser*   z-Codex auxiliary Responses API call failed: %sÚ	assistant)rÝ  rf  rà  Ústoprà  ©rŸ  re  Úfinish_reason©Úchoicesr]  ro  ))Úhermes_cli.providersr   rP   rŠ  rK   r)  r  Úpopr2   r  r  r†  r|   r&  Úagent.codex_runtimer!  Úagent.sdk_transform_bypassr"  Ú	responsesÚcreater¢  rÁ   r©   rž  r¦  ÚhasattrrÅ  r¤  rF   r€  rk  rD   r}   rý   r«  rŠ   r²   rÈ  r   ÚjoinrS  )r-   r/   r   r  r]  r²  r  r‡  Úguardr!  r"  Ústream_kwargsÚevent_streamrb  r{  r|  ro  r  r  re  Úchoices                        r%   r.  z_CodexCompletionsAdapter.create  s¹  € Ý8áÜ�D—L‘LÐ"BÀBÓGÜ”˜Ÿ™ j°"Ó5Ò;¸Ó<ô
ô ØXóð ð '+×&BÑ&BÀ6Ó&JÑ#ˆ�U˜GØ"—‘ ¸Ó=ÒCÀˆÜ#-¨g¼¼U°|Ô#DÈÐSTÊ™ÐZ^ˆÜ! $§,¡,°ÐSY×S]ÑS]Ð^sÓStÔuˆð$	Ø�K‰KŒMÝGÝOá8Ð9X¸KÐ9XÈÐSWÑ9XÓYˆMØ8˜4Ÿ<™<×1Ñ1×8Ñ8ÑI¸=ÑIˆLØ×Ñ˜|Ô,ð �‰×%Ñ%Ô'¨E×,BÑ,BÔ,DØ×*Ñ*Ð+WÔXð
3ô ˜<¨Ô2Ø(‘Eá7Ø$¬C°·±ÀÓ0HÒ0QÈEÓ,RÐ]b×]kÑ]kô�Eð ×$Ñ$ \Ô2Øˆ}Ü"Ð#eÓfÐfÜ0KÈEÓ0RÑ-ˆJ˜¨à$Ò*¨ò F�Ø—;‘;×#Ñ# |Ò3Ø'3°B·K±K×4DÑ4DÑ'E�B—K‘KÕ$ñFð �L‰LŒNä!Ø b§g¡g¨jÓ&9×&?Ñ&?Ó&AÒ&IÀTØ%Ò-¨ô
ˆô !Ø˜WÁ.±FÐVbô
ˆô ¨ x°uÀEÔJÐJøð/ ×$Ñ$ \Õ2ûô ò 	Ø�‰×%Ñ%Ô'Ü" 5×#8Ñ#8Ó#:Ó;ÀÐDÜ�L‰LÐHÈ#ÔNØûð		ûð �L‰L�NúsF   ÃBJ Å!A I? Æ!AJ Ç0*J É?JÊJ Ê	K.ÊAK)Ë)K.Ë.K1 Ë1LN)r8   r9   r:   r;   r   rK   rC   r   r   r
   r  r.  r*   r'   r%   rÊ  rÊ  p  s\   „ Ùbð Fð °3ó ðW+¨d°3¸°8©nð W+ÀÀtÈCÐQTÈHÁ~ÐWZÐ\_ÐG_ÑA`ó W+ðr>K #ô >Kr'   rÊ  c                   ó   — e Zd ZdZdefd„Zy)Ú	_ChatShimzJExposes ``client.chat.completions.create()`` over a sync or async adapter.Úadapterc                 ó   — || _         y r,   )Úcompletions)r-   r7  s     r%   rC   z_ChatShim.__init__T  s
   € Ø"ˆÕr'   N©r8   r9   r:   r;   r   rC   r*   r'   r%   r6  r6  Q  s   „ ÙTð# ô #r'   r6  c                   ó(   — e Zd ZdZdefd„Zdefd„Zy)Ú_AsyncCompletionsAdapterzJAsync adapter: runs the sync adapter's ``create`` via asyncio.to_thread().Úsync_adapterc                 ó   — || _         y r,   )Ú_sync)r-   r=  s     r%   rC   z!_AsyncCompletionsAdapter.__init__[  s	   € Ø!ˆ�
r'   r!   c              ‹   ót   K  — dd l } |j                  | j                  j                  fi |¤Žƒ d {  –—† S 7 Œ­wrq  )ÚasyncioÚ	to_threadr?  r.  )r-   r/   rA  s      r%   r.  z_AsyncCompletionsAdapter.create^  s1   è ø€ ÛØ&�W×&Ñ& t§z¡z×'8Ñ'8ÑC¸FÑC×CÐCÐCús   ‚/8±6²8N)r8   r9   r:   r;   r   rC   r.  r*   r'   r%   r<  r<  X  s   „ ÙTð" Só "ðD¨ô Dr'   r<  c                   ó   — e Zd ZdZdefd„Zy)Ú_AsyncAuxiliaryClientBasezùAsync-compatible wrapper matching AsyncOpenAI.chat.completions.create().

    Mirrors ``_real_client`` (when the sync wrapper has one) so cache eviction by
    leaf OpenAI client drops this async entry too instead of reusing a closed transport.
    Úsync_wrapperc                 óÞ   — t        t        |j                  j                  «      «      | _        |j                  | _        |j
                  | _        t        |d«      r|j                  | _        y y )NÚ_real_client)r6  r<  Úchatr9  r@   rA   r/  rG  )r-   rE  s     r%   rC   z"_AsyncAuxiliaryClientBase.__init__j  sY   € ÜÔ6°|×7HÑ7H×7TÑ7TÓUÓVˆŒ	Ø#×+Ñ+ˆŒØ$×-Ñ-ˆŒÜ�< Ô0ð !-× 9Ñ 9ˆDÕð 1r'   Nr:  r*   r'   r%   rD  rD  c  s   „ ñð
: Sô 
:r'   rD  c                   ó&   — e Zd ZdZdedefd„Zd„ Zy)ÚCodexAuxiliaryClientzpOpenAI-client-compatible wrapper routing through the Codex Responses API (.api_key/.base_url for introspection).rË  r]  c                 óŠ   — || _         t        t        ||«      «      | _        |j                  | _        |j
                  | _        y r,   )rG  r6  rÊ  rH  r@   rA   rÎ  s      r%   rC   zCodexAuxiliaryClient.__init__}  s8   € Ø'ˆÔÜÔ6°{ÀEÓJÓKˆŒ	Ø"×*Ñ*ˆŒØ#×,Ñ,ˆ�r'   c                 ó8   — | j                   j                  «        y r,   )rG  rƒ  r6   s    r%   rƒ  zCodexAuxiliaryClient.closeƒ  s   € Ø×Ñ×ÑÕ!r'   N)r8   r9   r:   r;   r   rK   rC   rƒ  r*   r'   r%   rJ  rJ  z  s   „ Ùzð- Fð -°3ó -ó"r'   rJ  c                   ó   — e Zd Zy)ÚAsyncCodexAuxiliaryClientN©r8   r9   r:   r*   r'   r%   rN  rN  ‡  ó   „ Ør'   rN  Úanthropic_kwargsÚresponse_formatc                 ó   — t        |t        «      sy|j                  d«      }|dk(  r,|j                  d«      }t        |t        «      rd|vry|d   }n|dk(  rddi}ny| j                  d«      }t        |t        «      si }|| d<   d|dœ|d	<   y)
zAMerge an OpenAI response format into Anthropic ``output_config``.Nrá   Újson_schemaÚschemaÚjson_objectÚobjectÚoutput_config)rá   rU  Úformat)r2   rÜ   r|   )rQ  rR  Úformat_typerT  rU  rX  s         r%   Ú$_translate_anthropic_response_formatr[  ‹  s£   € ä�o¤tÔ,ØØ!×%Ñ% fÓ-€KØ�mÒ#Ø%×)Ñ)¨-Ó8ˆÜ˜+¤tÔ,°ÀÑ0KØØ˜XÑ&‰Ø	˜Ò	%à˜(Ð#‰àØ$×(Ñ(¨Ó9€MÜ�m¤TÔ*ØˆØ,9Ð˜Ñ)Ø'4ÀÑG€M�(Òr'   c            
       ó<   — e Zd ZdZd
dededededz  fd„Zdefd	„Zy)Ú_AnthropicCompletionsAdapterz<OpenAI-client-compatible adapter for Anthropic Messages API.NrË  r]  Úis_oauthrA   c                 ó&  — || _         || _        || _        |xs d | _        | j                  sYt	        t        |dd«      xs d«      xs d }|r8t        j                  t        «      5  ddl	m
}  ||«      r|| _        d d d «       y y y # 1 sw Y   y xY w)NrA   rJ   r   )Ú_is_nous_portal_endpoint)rŠ  rÍ  Ú	_is_oauthÚ	_base_urlrK   rP   rC  rD  r}   Úagent.anthropic_endpointsr`  )r-   rË  r]  r^  rA   Ú	candidater`  s          r%   rC   z%_AnthropicCompletionsAdapter.__init__¤  s�   € Ø"ˆŒØˆŒØ!ˆŒð "Ò) TˆŒØ�~Š~ÜœG K°¸RÓ@ÒFÀBÓGÒOÈ4ˆIÙÜ×(Ñ(¬Ó3ñ 3ÝRÙ/°	Ô:Ø)2˜œ÷3ð 3ð ð ÷3ð 3ús   Á&BÂBr!   c           
      óÄ  — ddl m}m} ddlm} |j                  d| j                  «      }|j                  dd«      rd }n$|j                  d«      xs |j                  d«      }|j                  d	«      }|j                  d
«      }|€F|j                  d«      }	t        |	t        «      r|	j                  d«      nd }
t        |
t        «      r|
}|j                  d«      }t        |t        «      rYt        |j                  dd«      «      j                  «       }|dk(  r"|j                  di «      j                  d«      }n|dv r|nd }nt        |t        «      sd } |||j                  dg «      |j                  d«      |||| j                  | j                  ¬«      }|�ddl m}  ||«      s||d	<   t        |j                  d«      t        «      r$|d   ri |j                  d«      xs i ¥|d   ¥|d<   |j                  d«      }|�t        ||«       |j                  d«      }|ržt        |t        «      rŽt        ||j                  d«      «       |j!                  «       D ��ci c]&  \  }}|dvrt        |«      j#                  d«      s||“Œ( }}}|r0|j                  d«      xs i }t        |t        «      si }i |¥|¥|d<    || j$                  |t'        «       r
t)        «       nd ¬«      } |d«      j+                  || j                  ¬«      }d }t-        |d«      rl|j.                  r`t1        |j.                  dd«      xs d}t1        |j.                  d d«      xs d}t3        ||t1        |j.                  d!d«      xs ||z   ¬"«      }t3        dt3        |j4                  |j6                  |j8                  ¬#«      |j:                  ¬$«      }t3        |g||¬%«      S c c}}w )&Nr   )Úbuild_anthropic_kwargsÚcreate_anthropic_message)Úget_transportr]  Ú_skip_zai_max_tokensFÚ
max_tokensÚmax_completion_tokensÚtemperatureÚ_reasoning_configrè  rê  Útool_choicerá   rJ   rk  rD   >   rL  ró  ÚrequiredrÜ  rØ  )r]  rÜ  rØ  rj  Úreasoning_configrn  r^  rA   ©Ú_forbids_sampling_paramsrö  rR  >   rê  rR  r  )Úon_stream_eventÚanthropic_messages)Ústrip_tool_prefixro  rt  ru  rv  rw  )rf  rà  rê  r%  r'  )Úagent.anthropic_adapterrf  rg  Úagent.transportsrh  r|   rÍ  r*  r2   rÜ   rK   rT  ra  rb  rr  r[  r6  rU  rŠ  r×   r  Únormalize_responser/  ro  rP   r   rf  rà  rê  r&  )r-   r/   rf  rg  rh  r]  rj  rl  r  Ú_ebÚ_rcrn  Úchoice_typerQ  rr  Útop_level_response_formatÚcaller_extra_bodyr8  r9  ÚpassthroughÚexistingÚresponseÚ_nrro  rx  ry  r4  s                              r%   r.  z#_AnthropicCompletionsAdapter.create³  s°  € ß\Ý2Ø—
‘
˜7 D§K¡KÓ0ˆð �:‰:Ð,¨eÔ4Ø‰JàŸ™ LÓ1ÒX°V·Z±ZÐ@WÓ5XˆJØ—j‘j Ó/ˆð Ÿ
™
Ð#6Ó7ˆØÐ Ø—*‘*˜\Ó*ˆCÜ*4°S¼$Ô*?�#—'‘'˜+Ô&ÀTˆCÜ˜#œtÔ$Ø #�à—j‘j Ó/ˆÜ�k¤4Ô(Ü˜kŸo™o¨f°bÓ9Ó:×@Ñ@ÓBˆKØ˜jÒ(Ø)Ÿo™o¨j¸"Ó=×AÑAÀ&ÓI‘à-8Ð<XÑ-X™kÐ^b‘Ü˜K¬Ô-ØˆKÙ1Ø &§*¡*¨Z¸Ó"<ÀFÇJÁJÈwÓDWØ!°MÈ{Ø—^‘^ð —^‘^ô
Ðð Ð"ÝHÙ+¨EÔ2Ø2=Ð  Ñ/ô �f—j‘j Ó1´4Ô8¸VÀOÒ=Tð1Ø#×'Ñ'¨Ó8Ò>¸Bð1à˜Ñ)ð1Ð˜_Ñ-ð %+§J¡JÐ/@Ó$AÐ!Ø$Ð0Ü0Ð1AÐC\Ô]Ø"ŸJ™J |Ó4ÐÙ¤Ð,=¼tÔ!DÜ0Ð1AÐCT×CXÑCXÐYjÓCkÔlà!2×!8Ñ!8Ó!:÷Ù˜˜AØÐ<Ñ<ÄSÈÃV×EVÑEVÐWZÔE[ð �1‘ðˆKñ ñ Ø+×/Ñ/°Ó=ÒCÀ�Ü! (¬DÔ1Ø!�HØ1L°HÐ1LÀÐ1LÐ  Ñ.Ù+Ø�L‰LØô DXÔCYÔ=Ô?Ð_cô
ˆñ Ð0Ó1×DÑDÀXÐae×aoÑaoÐDÓpˆØˆÜ�8˜WÔ%¨(¯.ª.Ü# H§N¡N°NÀAÓFÒKÈ!ˆMÜ '¨¯©¸ÈÓ KÒ PÈqÐÜ#Ø+Ð?PÜ$ X§^¡^°^ÀQÓGÒnÈMÐ\mÑLmôˆEô
 !ØÜ#¨C¯K©KÀCÇNÁNÐ^a×^kÑ^kÔlØ×+Ñ+ô
ˆô
 ¨ x°uÀEÔJÐJùóAs   É%+Or<  )	r8   r9   r:   r;   r   rK   rO   rC   r.  r*   r'   r%   r]  r]  ¡  s=   „ ÙFñ3 Cð 3°ð 3¸tð 3ÐWZÐ]aÑWaó 3ð^K #ô ^Kr'   r]  c                   ó4   — e Zd ZdZd
dededededef
d„Zd„ Zy	)ÚAnthropicAuxiliaryClientz@OpenAI-client-compatible wrapper over a native Anthropic client.rË  r]  r@   rA   r^  c                 óh   — || _         t        t        ||||¬«      «      | _        || _        || _        y )N)r^  rA   )rG  r6  r]  rH  r@   rA   )r-   rË  r]  r@   rA   r^  s         r%   rC   z!AnthropicAuxiliaryClient.__init__  s2   € Ø'ˆÔÜÔ:¸;ÈÐX`ÐksÔtÓuˆŒ	ØˆŒØ ˆ�r'   c                 óX   — t        | j                  dd «      }t        |«      r |«        y y )Nrƒ  )rP   rG  rª   )r-   Úclose_fns     r%   rƒ  zAnthropicAuxiliaryClient.close  s(   € Ü˜4×,Ñ,¨g°tÓ<ˆÜ�HÔÙ�Jð r'   N©F)	r8   r9   r:   r;   r   rK   rO   rC   rƒ  r*   r'   r%   rƒ  rƒ    s3   „ ÙJñ! Cð !°ð !¸cð !ÈSð !Ð\`ó !ór'   rƒ  c                   ó   — e Zd Zy)ÚAsyncAnthropicAuxiliaryClientNrO  r*   r'   r%   r‰  r‰  #  rP  r'   r‰  c                   ó,   — e Zd ZdZdedefd„Zdefd„Zy)Ú_BedrockCompletionsAdapterzGTranslates ``chat.completions.create(**kwargs)`` into Bedrock Converse.Úregionr]  c                 ó    — || _         || _        y r,   )Ú_regionrÍ  ©r-   rŒ  r]  s      r%   rC   z#_BedrockCompletionsAdapter.__init__*  s   € ØˆŒØˆ�r'   r!   c                 óp  — ddl m} |j                  d| j                  «      }|j                  d«      xs |j                  d«      }|j                  d«      }t	        |t
        «      r|g}|j                  d«      �%t        j                  d|j                  d«      «       |j                  d	«      rt        j                  d
|«        || j                  ||j                  dg «      |j                  d«      |rt        |«      nd |j                  d«      |j                  d«      |¬«      }t        «        |S )Nr   )Úcall_converser]  rj  rk  r$  rn  uV   BedrockAuxiliaryClient: tool_choice=%r not supported by the Converse shim â€” ignored.rŸ  u›   BedrockAuxiliaryClient: stream=True requested for %s â€” returning a complete response (Converse shim does not stream); caller downgrades to non-streaming.rÜ  rØ  rl  Útop_p)rŒ  r]  rÜ  rØ  rj  rl  r’  Ústop_sequences)Úagent.bedrock_adapterr‘  r|   rÍ  r2   rK   rŠ   r²   rŽ  r  rÕ   )r-   r/   r‘  r]  rj  r$  r€  s          r%   r.  z!_BedrockCompletionsAdapter.create.  s  € Ý7Ø—
‘
˜7 D§K¡KÓ0ˆØ—Z‘Z Ó-ÒT°·±Ð<SÓ1Tˆ
à�z‰z˜&Ó!ˆÜ�dœCÔ Ø�6ˆDØ�:‰:�mÓ$Ð0ä�L‰Lð-Ø.4¯j©j¸Ó.Gôð �:‰:�hÔô �L‰LðWØX]ôñ !Ø—<‘< u°v·z±zÀ*ÈbÓ7QÐY_×YcÑYcÐdkÓYlñ +5”s˜:”¸$ÈFÏJÉJÐWdÓLeØ—*‘*˜WÓ%°dô
ˆô 	&Ô'Øˆr'   N)r8   r9   r:   r;   rK   rC   r   r.  r*   r'   r%   r‹  r‹  '  s$   „ ÙQð˜sð ¨3ó ð #ô r'   r‹  c                   ó&   — e Zd ZdZdedefd„Zd„ Zy)ÚBedrockAuxiliaryClientz?OpenAI-client-compatible wrapper over AWS Bedrock Converse API.rŒ  r]  c                 óx   — || _         || _        t        t        ||«      «      | _        d| _        d|› d�| _        y )Núaws-sdkúhttps://bedrock-runtime.ú.amazonaws.com)rŽ  rÍ  r6  r‹  rH  r@   rA   r�  s      r%   rC   zBedrockAuxiliaryClient.__init__S  s;   € ØˆŒØˆŒÜÔ8¸ÀÓGÓHˆŒ	Ø ˆŒØ2°6°(¸.ÐIˆ�r'   c                  ó   — y r,   r*   r6   s    r%   rƒ  zBedrockAuxiliaryClient.closeZ  s   € Ør'   N)r8   r9   r:   r;   rK   rC   rƒ  r*   r'   r%   r–  r–  P  s    „ ÙIðJ˜sð J¨3ó Jór'   r–  c                   ó   — e Zd Zy)ÚAsyncBedrockAuxiliaryClientNrO  r*   r'   r%   r�  r�  ^  rP  r'   r�  c                 ó  — | xs dj                  «       j                  «       j                  d«      }|syt        |«      j                  j                  d«      j                  d«      ryt        |«      }|dk(  xs t        |dk(  xr d|v «      S )	a   True if ``base_url`` speaks Anthropic Messages, not OpenAI chat.completions.

    Mirrors ``hermes_cli.runtime_provider._detect_api_mode_for_url`` so aux and main agree: any
    ``/anthropic`` URL (MiniMax, Zhipu, LiteLLM), ``api.kimi.com/coding`` (chat 404s), ``api.anthropic.com``.
    rJ   r_  F)r0  rR  TrP  r1  r2  )rS  rT  rÀ  r   rT  rÁ  rg   rO   )rA   rX  r(  s      r%   Ú#_endpoint_speaks_anthropic_messagesrŸ  b  s‰   € ð ’.˜b×'Ñ'Ó)×/Ñ/Ó1×8Ñ8¸Ó=€JÙØÜ�
Ó× Ñ ×'Ñ'¨Ó,×5Ñ5Ð6UÔVØÜ  Ó,€HØÐ*Ñ*Òj¬d°8¸~Ñ3MÒ3iÐR[Ð_iÐRiÓ.jÐjr'   Úapi_modec                 óÐ  — t        | t        «      s't        | t        t        t
        f«      st        | d«      r| S |dk7  r|st        |«      s| S 	 ddlm	} 	  |||«      }t        j                  d||r|dd	 nd
|xs d«       t        ||||d¬«      S # t        $ r t        j                  d|«       | cY S w xY w# t        $ r#}t        j                  d||«       | cY d}~S d}~ww xY w)aq  Rewrap a plain OpenAI client in ``AnthropicAuxiliaryClient`` when the endpoint speaks Anthropic Messages.

    Single transport-correction chokepoint at the end of every ``resolve_provider_client`` branch; returns
    ``client_obj`` unchanged for probe stubs/specialized adapters, OpenAI-wire, explicit non-Anthropic
    ``api_mode``, or missing ``anthropic`` SDK.
    ÚHERMES_SKIP_TRANSPORT_WRAPrt  r   ©Úbuild_anthropic_clientu   Endpoint %s speaks Anthropic Messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire (will likely 404).uT   Failed to build Anthropic client for %s (%s) â€” falling back to OpenAI-wire client.NzeAuxiliary transport: wrapping client in AnthropicAuxiliaryClient (model=%s, base_url=%s, api_mode=%s)rW  rJ   úauto-detectedF©r^  )r2   r>   r1  rƒ  r–  rJ  r-  rŸ  rv  r¤  r‡   rŠ   r‹   r}   r²   )r*  r]  r@   rA   r   r¤  rË  r  s           r%   Ú_maybe_wrap_anthropicr§  q  s  € ô 	�:Ô2Ô3Ü˜JÔ)AÔCYÔ[oÐ(pÔqÜ˜JÐ(DÔEàÐàÐ'Ò'©XÔ=`ÐaiÔ=jØÐðÝBðÙ,¨W°hÓ?ˆô ‡L�Lð	/à¡ˆx˜˜‰}¨b°(Ò2M¸oôô
 $ K°¸ÀÐTYÔZÐZøô) ò Ü�‰ðOàô	
ð
 Òðûô ò Ü�‰ð"Ø#+¨Sô	
ð Õûðús0   ÁB Á	B9 Â!B6Â5B6Â9	C%ÃC ÃC%Ã C%c                  óˆ  — t        d«      \  } }| rj|€yt        |dd«      t        |dd«      t        |dd«      t        |t        «      t        |dd«      t        |dd«      t        |d	d«      t        |d
d«      ddœ	S 	 t	        «       }|j                  «       syt        j                  |j                  d¬«      «      }|j                  d«      dk7  ry|j                  di «      j                  di «      }|j                  d«      s|j                  d«      sy|S # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zkNous provider state dict from the credential pool or ~/.hermes/auth.json; None when not active with tokens.r§  Nr�   rJ   Úrefresh_tokenÚ	agent_keyÚportal_base_urlÚ	client_idr  Ú
token_typeÚBearerr9  )	r�   r©  rª  rM  r«  r¬  r  r­  Úsourcez	utf-8-sig©ÚencodingÚactive_providerr¿  zCould not read Nous auth: %s)r>  rP   rO  Ú_NOUS_DEFAULT_BASE_URLr"  Úis_fileÚjsonÚloadsÚ	read_textr|   r}   rŠ   r²   )Úpool_presentrE  Ú	auth_pathÚdatarJ  r  s         r%   Ú_read_nous_authr»  Ÿ  s4  € ä,¨VÓ4Ñ€L�%ÙØˆ=Øä# E¨>¸2Ó>Ü$ U¨O¸TÓBÜ  ¨°TÓ:Ü"8¸Ô@VÓ"WÜ& uÐ.?ÀÓFÜ  ¨°TÓ:Ü˜U G¨TÓ2Ü! %¨°xÓ@Øñ

ð 
	
ðÜ#Ó%ˆ	Ø× Ñ Ô"ØÜ�z‰z˜)×-Ñ-°{Ð-ÓCÓDˆØ�8‰8Ð%Ó&¨&Ò0ØØ—8‘8˜K¨Ó,×0Ñ0°¸Ó<ˆà�|‰|˜KÔ(°·±¸nÔ1MØØˆøÜò Ü�‰Ð3°SÔ9Üûðús+   Á<D Â9D ÃAD ÄD Ä	EÄ!D<Ä<Ec                 óâ   — ddl m} dD ]d  \  }}| j                  |«      }t        |t        «      r|j                  «       sŒ8 ||| j                  d«      | j                  |«      ¬«      sŒb|c S  y)z;Extract a usable Nous inference JWT from stored auth state.r   )Ú_nous_invoke_jwt_is_usable))rª  Úagent_key_expires_at)r�   Ú
expires_atr  )r  r¿  rJ   )rE  r½  r|   r2   rK   rS  )rJ  r½  Ú	token_keyÚ
expiry_keyÚtokens        r%   Ú_nous_api_keyrÃ  Á  sh   € å:Ø!hò Ñˆ	�:Ø—‘˜YÓ'ˆÜ˜%¤Ô%¨U¯[©[¬]ØÙ% e°8·<±<ÀÓ3HÐU]×UaÑUaÐblÓUmÖnØŠLðð r'   ©Úforce_refreshrÅ  c                 ól  — 	 ddl m} t        d«      }|r|j                  «       sy	 |j                  «       }|€ydt        dt        t        t        f   fd	„}| s | ||«      t        «       «      s	 |j                  «       }|€y|}t         ||«      «      }t        |t        «      }|r|sy||fS # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w# t        $ r"}t        j                  d
|«       d}Y d}~Œ­d}~ww xY w)z@Resolve Nous auxiliary credentials from the selected pool entry.r   )Ú_agent_key_is_usabler§  z4Auxiliary Nous pool credential resolution failed: %sNz(Auxiliary Nous pool selection failed: %sÚer!   c           	      óD   — dD �ci c]  }|t        | |d «      “Œ c}S c c}w )N)rª  r¾  r�   r¿  r  )rP   )rÈ  r8  s     r%   Ú_entry_statez4_resolve_nous_pool_runtime_api.<locals>._entry_stateß  s3   € ð1Xö Y¨1�”7˜1˜a Ó&Ñ&ò Yð 	Yùò Ys   …z&Auxiliary Nous pool refresh failed: %s)rE  rÇ  rV   r}   rŠ   r²   r8  r=  r   r   rK   r\  Útry_refresh_currentrÃ  rO  r³  )	rÅ  rÇ  r9  r  rE  rÊ  Ú	refreshedr@   rA   s	            r%   Ú_resolve_nous_pool_runtime_apirÍ  Í  s5  € ðÝ8Ü˜Ó ˆñ �t×+Ñ+Ô-ØðØ—‘“ˆð €}ØðYœð Y¤¤S¬# X¡ó Yñ Ñ0±¸eÓ1DÔF_ÓFaÔbð	Ø×0Ñ0Ó2ˆIð ÐØØˆÜ™L¨Ó/Ó0€GÜ% eÔ-CÓD€HÙ™(ØØ�HÐÐøô= ò Ü�‰ÐKÈSÔQÜûðûô ò Ü�‰Ð?ÀÔEÜûðûô ò 	Ü�L‰LÐAÀ3ÔGØ�Iûð	úsF   ‚B0 §C Á1D Â0	CÂ9CÃCÃ	DÃ%D Ä DÄ	D3ÄD.Ä.D3©rÅ  Ústale_access_tokenrÏ  c                 óÎ   — t        | ¬«      }|�|S 	 ddlm}  |t        dd«      | |xs d¬«      }t        «        t        |«      S # t        $ r}t        |«       Y d}~yd}~ww xY w)u,  Fresh Nous runtime credentials (pool first, then auth store + JWT refresh) â€” mirrors the main
    agent's 401 recovery. ``stale_access_token`` is the bearer that just 401'd; with ``force_refresh``
    it lets the auth store adopt a sibling process's rotation instead of re-POSTing the shared grant.rÄ  Nr   ©Ú resolve_nous_runtime_credentialsÚHERMES_NOUS_TIMEOUT_SECONDSé   )Útimeout_secondsrÅ  rÏ  )rÍ  rE  rÒ  ri   r}   rc   r`   Ú_creds_pair)rÅ  rÏ  ÚpooledrÒ  rÄ  r  s         r%   Ú_resolve_nous_runtime_apirØ  ó  ss   € ô ,¸-ÔH€FØÐØˆðÝDÙ0Ü%Ð&CÀRÓHØ'Ø1Ò9°Tô
ˆô "Ô#Ü�uÓÐøô ò ô 	' sÔ+Üûð	ús   ’A Á	A$ÁAÁA$rÄ  c                 óâ   — t        | j                  d«      xs d«      j                  «       }t        | j                  d«      xs d«      j                  «       j                  d«      }|r|sy||fS )zX``(api_key, base_url)`` from a runtime-credentials dict, or None when either is missing.r@   rJ   rA   r_  N)rK   r|   rS  rÀ  )rÄ  r@   rA   s      r%   rÖ  rÖ    sb   € ä�%—)‘)˜IÓ&Ò,¨"Ó-×3Ñ3Ó5€GÜ�5—9‘9˜ZÓ(Ò.¨BÓ/×5Ñ5Ó7×>Ñ>¸sÓC€HÙ™(ØØ�HÐÐr'   c            	      ó„  — 	 ddl m} m} t        d«      }|rº|j	                  «       rª|j                  «       }|�˜t        t        |dd«      xs t        |dd«      xs d«      j                  «       }d„ } | |t        d	«      «      xs;  |t        d
«      «      xs(  |t        |dd«      «      xs  |t        |dd«      «      | ¬«      }|r|r||fS 	 ddl m}  |«       }	t        |	«      S # t        $ r }t        j                  d|«       Y d}~Œ=d}~ww xY w# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)z®Fresh xAI OAuth (api_key, base_url) for aux clients, or None.

    Pool first (some xAI OAuth logins exist only as pool entries), then the singleton auth-store resolver.
    r   )ÚDEFAULT_XAI_OAUTH_BASE_URLÚ _xai_validate_inference_base_urlú	xai-oauthNrG  r�   rJ   c                 óZ   — t        | xs d«      j                  «       j                  d«      S )NrJ   r_  )rK   rS  rÀ  )r9  s    r%   ú<lambda>z,_resolve_xai_oauth_for_aux.<locals>.<lambda>#  s"   € ¤ Q¢W¨"£×!3Ñ!3Ó!5×!<Ñ!<¸SÓ!A€ r'   ÚHERMES_XAI_BASE_URLÚXAI_BASE_URLrL  rA   )rI  z9Auxiliary xAI OAuth pool credential resolution failed: %s©Ú%resolve_xai_oauth_runtime_credentialsz<Auxiliary xAI OAuth runtime credential resolution failed: %s)rE  rÛ  rÜ  rV   r8  r=  rK   rP   rS  ra  r}   rŠ   r²   rã  rÖ  )
rÛ  rÜ  r9  rE  r@   Ú_urlrA   r  rã  rÄ  s
             r%   Ú_resolve_xai_oauth_for_auxrå    sH  € ð
Wß`Ü˜Ó%ˆÙ�D×(Ñ(Ô*Ø—K‘K“MˆEØÐ ÜÜ˜EÐ#4°dÓ;Òg¼wÀuÈnÐ^`Ó?aÒgÐegóç‘%“'ð ñ B�Ù;ÙœÐ)>Ó?Ó@ò >ÙœO¨NÓ;Ó<ò>áœG EÐ+=¸tÓDÓEò>ñ œG E¨:°tÓ<Ó=Ø7ô�ñ ™xØ" HÐ,Ð,ðÝIÙ5Ó7ˆô �uÓÐøô ò WÜ�‰ÐPÐRU×VÑVûðWûô
 ò Ü�‰ÐSÐUXÔYÜûðús0   ‚CC* ÃD Ã*	DÃ3DÄDÄ	D?ÄD:Ä:D?c                  ó–  — t        d«      \  } }| rt        |«      }|r|S 	 ddlm}  |«       j	                  di «      j	                  d«      }t        |t        «      r|j                  «       sy	 ddl}|j                  d«      d   }|d	t        |«       d
z  z  z  }t        j                  |j                  |«      «      j	                  dd«      }|r.t        j                  «       |kD  rt        j!                  d|«       y|j                  «       S # t"        $ r Y Œw xY w# t"        $ r }t        j!                  d|«       Y d}~yd}~ww xY w)zkValid, non-expired Codex OAuth access token; an exhausted pool falls back to the profile's auth.json token.rQ  r   )Ú_read_codex_tokensÚtokensr�   Nrr  rO  ú=é   Úexpz-Codex access token expired (exp=%s), skippingz2Could not read Codex auth for auxiliary client: %s)r>  rH  rE  rç  r|   r2   rK   rS  Úbase64rV  r3  rµ  r¶  Úurlsafe_b64decoderû   rŠ   r²   r}   )	r¸  rE  rÂ  rç  r�   rì  Úpayloadrë  r  s	            r%   Ú_read_codex_access_tokenrï  8  s-  € ä,¨^Ó<Ñ€L�%ÙÜ% eÓ,ˆÙØˆLðÝ6Ù)Ó+×/Ñ/°¸"Ó=×AÑAÀ.ÓQˆÜ˜,¬Ô,°L×4FÑ4FÔ4HØð		ÛØ"×(Ñ(¨Ó-¨aÑ0ˆGØ�sœs 7›|˜m¨aÑ/Ñ0Ñ0ˆGÜ—*‘*˜V×5Ñ5°gÓ>Ó?×CÑCÀEÈ1ÓMˆCÙ”t—y‘y“{ SÒ(Ü—‘ÐLÈcÔRØð ×!Ñ!Ó#Ð#øô ò 	Ùð	ûô ò Ü�‰ÐIÈ3ÔOÜûðús=   ¡AD Á/BD Ä D Ä	DÄD ÄDÄD Ä	EÄ(EÅEc                  ó’  — 	 ddl m} m} | j                  «       D �]ì  \  }}|j                  dk7  rŒt        |«      rt        j                  d|«       Œ9|dk(  rGt        j                  t        «      5  ddl m}  |d«      s
	 d	d	d	«       Œp	 d	d	d	«       t        «       c S |d
k(  r;t        j                  t        «      5  ddl m}  |d
«      s
	 d	d	d	«       Œ¼	 d	d	d	«       t        |«      xs d	}|€Œ×t        |«      \  }}|r5t        |«      }|sŒõt!        ||j"                  «      xs |j"                  }	d}
n} ||«      }t%        |j'                  dd«      «      j)                  «       }|s�ŒQt%        |j'                  dd«      «      j)                  «       j+                  d«      xs |j"                  }	d}
t-        d	«      }|j'                  d«      |k(  rP|j'                  d«      r?|d   j+                  d«      }	t/        |j'                  d«      t$        «      r
|d   r|d   }d}
t        j                  d|j0                  ||
«       t3        |	«      }|dk(  rddlm}m}  ||«      r |||¬«      |fc S t;        |d«      rddi}n=t;        |d«      rddlm}  |«       }n#t;        |d«      rtA        |«      }ntC        |«      }|rd|ini }tE        |j'                  d«      «      }|r||d<   tG        d||dœ|¤Ž}tI        ||||	«      |fc S  y# t        $ r t        j                  d«       Y yw xY w# 1 sw Y   �Œ¦xY w# 1 sw Y   �ŒgxY w)zVTry each API-key provider in PROVIDER_REGISTRY order; (client, model) or (None, None).r   )ÚPROVIDER_REGISTRYr¨  z7Could not import PROVIDER_REGISTRY for API-key fallback©NNr@   z2Auxiliary api-key chain: %s is unhealthy, skippingrÛ  )Ú!is_provider_explicitly_configuredNÚcopilotz	 via poolrJ   rA   r_  rJ  z (session endpoint)z Auxiliary text client: %s (%s)%srÕ  ©ÚGeminiNativeClientÚis_native_gemini_base_urlr?   r1  r  úclaude-code/0.1.0rÖ  )Úcopilot_default_headersr  rõ  r*   )%rE  rñ  r¨  r‡   rŠ   r²   r6  Ú	auth_typeÚ_is_provider_unhealthyrC  rD  ró  Ú_try_anthropicrÓ  r>  rH  rO  rM  rK   r|   rS  rÀ  Ú_normalize_main_runtimer2   rD   r5  Úagent.gemini_native_adapterrö  r÷  rf   Úhermes_cli.modelsrù  r  Ú_profile_default_headersrú  r”   r§  )rñ  r¨  r¥  Úpconfigró  r]  r¸  rE  r@   Úraw_base_urlÚviarÄ  ÚruntimerA   rö  r÷  rð  rù  ÚextrarG  rŒ   s                        r%   Ú_resolve_api_key_providerr  U  s/  € ðß[ð !2× 7Ñ 7Ó 9ó ARÑˆ�WØ×Ñ 	Ò)ØÜ! +Ô.Ü�L‰LÐMÈ{Ô[ØØ˜+Ò%ä×$Ñ$¤[Ó1ñ ÝMÙ8¸ÔEØ÷ð àE÷ô "Ó#Ò#Ø˜)Ò#ä×$Ñ$¤[Ó1ñ ÝMÙ8¸ÔCØ÷ð àC÷ô ,¨KÓ8Ò@¸DˆØˆ=ØÜ0°Ó=Ñˆ�eÙÜ+¨EÓ2ˆGÙØÜ1°%¸×9SÑ9SÓTÒrÐX_×XrÑXrˆLØ‰Cá8¸ÓEˆEÜ˜%Ÿ)™) I¨rÓ2Ó3×9Ñ9Ó;ˆGÙÙÜ˜uŸy™y¨°RÓ8Ó9×?Ñ?ÓA×HÑHÈÓMÒkÐQX×QkÑQkˆLØˆCô *¨$Ó/ˆØ�;‰;�zÓ" kÒ1°g·k±kÀ*Ô6MØ" :Ñ.×5Ñ5°cÓ:ˆLÜ˜'Ÿ+™+ iÓ0´#Ô6¸7À9Ò;MØ! )Ñ,�Ø'ˆCÜ�‰Ð7¸¿¹ÀuÈcÔRä& |Ó4ˆØ˜(Ò"ßaÙ(¨Ô2Ù)°'ÀHÔMÈuÐTÒTÜ  ¨>Ô:Ø#Ð%8Ð9‰GÜ" 8Ð-@ÔAÝAÙ-Ó/‰GÜ" 8Ð-GÔHÜ.¨xÓ8‰Gä.¨{Ó;ˆGÙ07Ð" GÑ,¸RˆÜ,¨U¯Y©YÐ7HÓ-IÓJˆÙØ'-ˆEÐ#Ñ$Ü&ÐS¨wÀÑSÈUÑSˆÜ$ V¨U°G¸\ÓJÈEÐQÒQðCARðD øôK ò Ü�‰ÐNÔOÙðú÷ñ ú÷ñ ús)   ‚L Á1L/Â=L<ÌL,Ì+L,Ì/L9	Ì<M	©Ú	is_visionÚxair  r	  c                ó@  — t        | d«      rddi}n{t        | d«      rddlm} t         |d|¬«      «      }nUt        | d	«      rt        t	        | «      «      }n4|r#t        | d
«      rddlm} t         |«       «      }nt        |«      xs i }t        |xs d«      xs dS )aZ  Provider-specific client headers by endpoint host, merged with user ``model.default_headers``.

    Kimi Code needs the claude-code User-Agent; Copilot needs its request headers
    (``is_vision`` adds Copilot-Vision-Request); NVIDIA NIM and (optionally) xAI have
    their own fingerprints; anything else falls back to the provider profile.
    r1  r  rø  rÖ  r   )Úcopilot_request_headersT)Úis_agent_turnr  r  zx.ai©Úhermes_xai_default_headersN)	rf   Úhermes_cli.copilot_authr  rÜ   r  Útools.xai_httpr  r   rú  )rA   rJ  r  r	  rð  r  r  s          r%   Ú_endpoint_default_headersr  ¡  s•   € ô ˜X ~Ô6Ø%Ð':Ð;‰Ü	˜xÐ)<Ô	=ÝCÜÑ.¸TÈYÔWÓX‰Ü	˜xÐ)CÔ	DÜÔ/°Ó9Ó:‰Ù	Ô& x°Ô8Ý=ÜÑ1Ó3Ó4‰ä*¨8Ó4Ò:¸ˆÜ& w¢°$Ó7Ò?¸4Ð?r'   c                 óÚ   — | syt        j                  t        «      5  ddlm}  || «      }|r*|j
                  rt        |j
                  «      cddd«       S ddd«       y# 1 sw Y   yxY w)zZClient-level attribution headers from the provider profile (e.g. GMI User-Agent), or None.Nr   rª  )rC  rD  r}   r¿  r«  rõ  rÜ   ©rJ  r«  rÐ  s      r%   r   r   ¹  s`   € áØÜ	×	Ñ	œYÓ	'ñ 1Ý2Ù& xÓ0ˆÙ�w×.Ò.Ü˜×/Ñ/Ó0÷	1÷ 1ñ 1ð
 ÷1ð
 ús   �1A!Á!A*Ú_paid_lane_warnedc                 ó‚   — | syt        | «      j                  «       }|j                  d«      xs |j                  d«      S )uh   True when ``model`` is a free SKU (``:free`` suffix or ``stealth/`` prefix) â€” naming-convention trust.Fr–  zstealth/)rK   rS  rÁ  rU  )r]  rX  s     r%   Ú_is_free_modelr  Ê  s;   € áØÜ�U“×!Ñ!Ó#€JØ×Ñ˜wÓ'ÒL¨:×+@Ñ+@ÀÓ+LÐLr'   c                  ó  — 	 ddl m} m}  |«       }t         | |ddd¬«      «      } | |dd«      }t	        |t
        «      r |j                  «       r|j                  «       nt        }||fS # t        $ r dt        fcY S w xY w)zVRead (free_only, openrouter_model) from config; (False, _OPENROUTER_MODEL) on failure.r   )ró  rt   Ú	auxiliaryÚ	free_onlyFrã  Úopenrouter_model)	r{   ró  rt   rO   r2   rK   rS  Ú_OPENROUTER_MODELr}   )ró  rt   Úcfgr  rÝ   r]  s         r%   Ú_aux_openrouter_settingsr  Ò  s{   € ð(ßCÙ"Ó$ˆÜ™  k°;ÈÔNÓOˆ	Ù�c˜;Ð(:Ó;ˆÜ)¨#¬sÔ3¸¿	¹	¼�—	‘	”ÔIZˆØ˜%ÐÐøÜò (ØÔ'Ð'Ò'ð(ús   ‚A'A* Á*A>Á=A>c                 ól   — | t         v ryt         j                  | «       t        j                  d| «       y)zDLog a WARNING the first time a non-free OpenRouter model is engaged.Nu  Auxiliary client: PAID lane engaged for auxiliary task â€” OpenRouter fallback model %r is not a :free SKU and may incur real spend. Set auxiliary.free_only: true to restrict auxiliary fallbacks to free models, or auxiliary.openrouter_model to a :free model.)r  rˆ  rŠ   r‹   rb  s    r%   Ú_warn_paid_lane_oncer  ß  s1   € àÔ!Ñ!ØÜ×Ñ˜%Ô Ü
‡N�Nð	TàUZõr'   Úexplicit_api_keyc                 ód  — t        «       \  }}|xs |}|r"t        |«      st        j                  d|«       yt        |«      st	        |«       t        d«      \  }}|rk| xs t        |«      }|rEt        |t        «      xs t        }t        j                  d«       t        ||t        «       ¬«      |fS t        j                  d«       | xs t        d«      }|s't        ddt        |«      t        j                   ¬	«       yt        j                  d
«       t        |t        t        «       ¬«      |fS )Nu  Auxiliary client: auxiliary.free_only is enabled but the OpenRouter fallback model %r is not a :free SKU â€” skipping the OpenRouter fallback. Set auxiliary.openrouter_model to a :free model (e.g. nvidia/nemotron-3-ultra-550b-a55b:free) or disable auxiliary.free_only.rò  rþ  z%Auxiliary client: OpenRouter via pool©r@   rA   rõ  zFAuxiliary client: OpenRouter pool exhausted, trying OPENROUTER_API_KEYÚOPENROUTER_API_KEYrW  ©r  r”  ÚlevelzAuxiliary client: OpenRouter)r  r  rŠ   r‹   r  r>  rH  rO  rd   r²   r”   r  ra  Ú_mark_provider_unhealthyÚ _describe_openrouter_unavailableÚloggingÚDEBUG)	r   r]  r  Ú	cfg_modelÚor_modelr¸  rE  Úor_keyrA   s	            r%   Ú_try_openrouterr-  ë  s&  € Ü3Ó5Ñ€IˆyØÒ!˜	€HÙœ¨Ô1Ü�‰ðhð ô		
ð Ü˜(Ô#Ü˜XÔ&Ü,¨\Ó:Ñ€L�%ÙØ!ÒAÔ%:¸5Ó%AˆÙÜ-¨eÔ5HÓIÒ`ÔM`ˆHÜ�L‰LÐ@ÔAÜ(Ø¨ÔCSÓCUôàðð ô 	�‰Ð]Ô^ØÒF¤Ð1EÓ!F€FÙÜ Ø˜bÔ)IÈ(Ó)SÔ[b×[hÑ[hõ	jàÜ
‡L�LÐ/Ô0Ü ØÔ!4ÔFVÓFXôàðð r'   c                 ó¦   — t        «       \  }}| xs |}|rt        |«      sd|›d�S t        d«      \  }}|r|€yt        |«      syt	        d«      syy)	zBReturn the policy or credential reason OpenRouter was unavailable.z,auxiliary.free_only rejected non-free model z=; the request was skipped before provider availability checksrþ  zOOpenRouter credential pool has no usable entries (credentials may be exhausted)z=OpenRouter credential pool entry is missing a runtime API keyr#  zOPENROUTER_API_KEY not setz&no usable OpenRouter credentials found)r  r  r>  rH  ra  )r]  r  r*  r+  r¸  rE  s         r%   r'  r'  	  sr   € ä3Ó5Ñ€IˆyØÒ!˜	€HÙœ¨Ô1à:¸8¸,ð GJð Jð	
ô -¨\Ó:Ñ€L�%ÙØˆ=ØdÜ$ UÔ+ØRÜÐ/Ô0Ø+Ø3r'   Úvisionc                 óð  — t        «       }t        d¬«      }|€5|s3t        j                  d«       t	        dddt
        j                  ¬«       y|€|rt        j                  d	«       |�|\  }}n†t        |xs i «      }|s3t        j                  d
«       t	        dddt
        j                  ¬«       yt        |xs i j                  d«      xs t        d«      xs t        «      j                  d«      }t        j                  t         «      5  ddlm} ddlm}  |d|«      } ||¬«      }|�P|dkD  rKt        j                  d|«       t	        d|rt+        |d«      n|dt
        j,                  ¬«       	 d d d «       yd d d «       | rdnd}	ddlm}
m}  ||«      r(dat        j                  d|	|
«       t5        ||¬«      |
fS dat        j                  d«       t6        }t9        «       sC	 ddlm}  || ¬«      }|r|}t        j                  d|	|«       nt        j                  d |	|«       t5        ||¬«      |fS # 1 sw Y   ŒÀxY w# t         $ r"}t        j                  d!|	||«       Y d }~ŒAd }~ww xY w)"NFrÄ  zSAuxiliary Nous client unavailable: no Nous authentication found (run: hermes auth).r§  rW  zno Nous authentication foundr$  rò  zLAuxiliary Nous: runtime JWT refresh failed; checking stored auth.json token.z]Auxiliary Nous client unavailable: no usable inference JWT found (run: hermes auth add nous).zno usable Nous inference JWTrM  ÚNOUS_INFERENCE_BASE_URLr_  r   )Únous_rate_limit_remaining)Úis_anonymous_request)Ú	anonymousz?Auxiliary: skipping Nous Portal (rate-limited, resets in %.0fs)r  zNous Portal rate-limitedr/  rê   )ÚGUEST_MODELÚroute_is_welcome_hostTz&Auxiliary/%s: Nous free tier; using %sr?   zAuxiliary client: Nous Portal©Úget_nous_recommended_aux_model©r/  z/Auxiliary/%s: using Portal-recommended model %sz:Auxiliary/%s: no Portal recommendation, falling back to %szGAuxiliary/%s: recommended-models lookup failed (%s); falling back to %s)r»  rØ  rŠ   r‹   r&  r(  r)  r²   rÃ  rK   r|   ra  r³  rÀ  rC  rD  r}   Úagent.nous_rate_guardr2  Úhermes_cli.anon_authr3  r�  ÚINFOr5  r6  r  r”   Ú_NOUS_MODELrR   rÿ  r8  )r/  r§  r  r@   rA   r2  r3  r4  r»  Úlaner5  r6  r]  r8  Úrecommendedr  s                   r%   Ú	_try_nousr@  "	  sR  € ÜÓ€DÜ'°eÔ<€GØ€™tÜ�‰ÐlÔmÜ  ¨RÐ8VÔ^e×^kÑ^kÕlØØ€™4Ü�‰ÐcÔdØÐØ#Ñˆ‘ä ¢
¨Ó+ˆÙÜ�N‰Nð/ôô % V°Ð<ZÔbi×boÑboÕpØÜØŠZ�R×ÑÐ1Ó2Òz´oÐF_Ó6`ÒzÔdzó
ç
‰&�‹+ð 	ô 
×	Ñ	œYÓ	'ñ ÝCÝ=Ù(¨°Ó9ˆ	Ù-¸	ÔBˆ	ØÐ  Y°¢]Ü�L‰LÐZÐ\eÔfô %Ø±IœC 	¨4Ô0À9Ø1¼¿¹õGð ÷÷ ð ñ ‰8 6€D÷
 Há˜XÔ&Ø ÐÜ�‰Ð=¸tÀ[ÔQÜ$¨W¸xÔHÈ+ÐUÐUØÐÜ
‡L�LÐ0Ô1ô €EÜÔð	ÝHÙ8ÀÔGˆKÙØ#�Ü—‘ÐNÐPTÐV[Õ\ä—‘ÐYÐ[_ÐafÔgô !¨¸8ÔDÀeÐKÐK÷[ð ûôN ò 	Ü�L‰Lð%à�c˜5÷ñ ûð	ús&   ÄA(H>Ç-AI
 È>IÉ
	I5ÉI0É0I5Ústale_modelc                 ór  — |xs dj                  «       j                  «       }d}	 ddlm}  || d¬«      }|r#|j                  «       j                  «       |k7  r|S t        j                  «       j                  «       |k7  rt        S dS # t        $ r%}t
        j                  d|t        «       Y d}~Œ{d}~ww xY w)zÜFresh Portal recommended model after a stale-model 404 (long-lived processes pin dropped models).

    Returns the fresh recommendation, else ``_NOUS_MODEL``, whichever differs from ``stale_model``; None if neither.
    rJ   Nr   r7  T)r/  rÅ  z<Nous recommended-model refresh failed (%s); using default %s)rS  rT  rÿ  r8  r}   rŠ   r²   r=  )r/  rA  ÚstaleÚfreshr8  r  s         r%   Ú_refresh_nous_recommended_modelrE  i	  s¨   € ð
 Ò˜B×%Ñ%Ó'×-Ñ-Ó/€EØ€EðgÝDÙ.°fÈDÔQˆñ �—‘“×$Ñ$Ó&¨%Ò/ØˆÜ%×+Ñ+Ó-×3Ñ3Ó5¸Ò>Œ;ÐHÀDÐHøô	 ò gÜ�‰ÐSÐUXÔZe×fÑfûðgús   ¦B Â	B6ÂB1Â1B6)rT  ÚfieldÚreadonlyrT  c                óÔ  — t        | «      }t        |t        «      r4|j                  «       r$|j                  «       }|r|j	                  «       S |S t        j                  t        «      5  ddlm	}  |r|j                  n|j                  «       }|j                  di «      }| dk(  r9t        |t        «      r)|j                  «       r|j                  «       cddd«       S t        |t        «      rf|j                  | dk(  rdn| d«      }t        |t        «      r=|j                  «       r-|j                  «       }|r|j	                  «       n|cddd«       S ddd«       y# 1 sw Y   yxY w)a6  Main ``model.<field>``: runtime override (``set_runtime_main``) first, then config.yaml.

    The override wins so "active main model" gates see the live CLI/gateway runtime, not the persisted
    default. ``readonly`` picks ``load_config_readonly`` (model/provider) vs ``load_config`` (api_key/base_url).
    r   ru   r]  NrÙ   rJ   )r  r2   rK   rS  rT  rC  rD  r}   Ú
hermes_clirv   rt   rô  r|   rÜ   )rF  rG  rT  Úoverrider
  Ú_cfg_modr  Ú	model_cfgs           r%   Ú_read_main_fieldrM  z	  s  € ô # 5Ó)€HÜ�(œCÔ  X§^¡^Ô%5Ø—‘Ó ˆÙ %ˆu�{‰{‹}Ð0¨5Ð0Ü	×	Ñ	œYÓ	'ñ 
9Ý1ØR±ˆx×,Ò,¸h×>RÑ>RÓUˆØ—G‘G˜G RÓ(ˆ	Ø�GÒ¤
¨9´cÔ :¸y¿¹Ô?PØ—?‘?Ó$÷
9ñ 
9ô �i¤Ô&Ø—M‘M¨u¸Ò/?¡)ÀUÈBÓOˆEÜ˜%¤Ô%¨%¯+©+¬-ØŸ™›�Ù(-�u—{‘{”}°5÷
9÷ 
9ñ 
9ð ÷
9ð ús   Á)A,EÃA,EÅE')rG  )rG  rT  Úpreset_namec                 óÆ  — 	 ddl m} ddlm}  | |«       j	                  d«      xs i | xs d«      }|j	                  d«      xs i }t        |j	                  d«      xs d«      j                  «       }t        |j	                  d	«      xs d«      j                  «       }|r|r|j                  «       dk7  r||fS y# t        $ r t        j                  d
| d¬«       Y yw xY w)uÙ   MoA preset â†’ aggregator (provider, model); (None, None) if unresolvable. None/"" = default preset.

    "moa" is virtual â€” aux tasks skip the fan-out and use the aggregator slot; shared so lookup can't drift.
    r   ©rô  )Úresolve_moa_presetÚmoaNÚ
aggregatorrJ  rJ   r]  z.MoA aggregator resolution failed for preset %rTr°   rò  )r{   rô  Úhermes_cli.moa_configrQ  r|   rK   rS  rT  r}   rŠ   r²   )rN  rô  rQ  ÚpresetÚaggÚagg_providerÚ	agg_models          r%   Ú_resolve_moa_aggregatorrY  š	  sÖ   € ð

cÝ1Ý<Ù#¡K£M×$5Ñ$5°eÓ$<Ò$BÀÀKÒDWÐSWÓXˆØ�j‰j˜Ó&Ò,¨"ˆÜ˜3Ÿ7™7 :Ó.Ò4°"Ó5×;Ñ;Ó=ˆÜ˜Ÿ™ Ó(Ò.¨BÓ/×5Ñ5Ó7ˆ	Ù™I¨,×*<Ñ*<Ó*>À%Ò*GØ Ð*Ð*ð øô ò cÜ�‰ÐEÀ{Ð]aˆÕbØðcús   ‚B8B< Â<!C ÃC c                  óœ   — t        «       } t        «       xs dj                  «       j                  «       dk(  rt	        | «      \  }}|xs dS | S )zpMain model with MoA presets unwrapped to the aggregator's model; "" when unresolvable (a preset name would 400).rJ   rR  )Ú_read_main_modelrW  rS  rT  rY  )r]  r  rX  s      r%   Ú_read_main_model_for_auxr\  ­	  sI   € äÓ€EÜÓÒ# ×*Ñ*Ó,×2Ñ2Ó4¸Ò=Ü.¨uÓ5‰ˆˆ9ØŠ˜BÐØ€Lr'   Úaux_base_urlc                 ó^   — t        | «      }|r|t        t        «       «      k7  ryt        «       S )uË   Main api_key only when *aux_base_url* shares the main base_url's host.

    Unconditional inheritance would leak the credential to any misconfigured host; mismatch keeps ``no-key-required`` â†’ 401.
    rJ   )rg   Ú_read_main_base_urlÚ_read_main_api_key)r]  Úaux_hosts     r%   Ú_read_main_api_key_if_same_hostrb  ¶	  s.   € ô
 ! Ó.€HÙ�xÔ#4Ô5HÓ5JÓ#KÒKØÜÓÐr'   Ú_RUNTIME_MAIN_PROVIDERÚ_RUNTIME_MAIN_MODELÚ_RUNTIME_MAIN_BASE_URLÚ_RUNTIME_MAIN_API_KEYÚ_RUNTIME_MAIN_API_MODEÚ_RUNTIME_MAIN_AUTH_MODEÚauxiliary_runtime_mainrã  Ú_RUNTIME_MAIN_CONTEXTÚauxiliary_relay_callÚ_RELAY_AUX_CALL_CONTEXTr.   c           
   #   óh  K  — | r| d   n|j                  d«      }t        j                  t        |xs d«      dt	        j
                  «       j                  › �ddddddœ«      }	 d–— 	 t        j                  |«       y# t        $ r t        «        ‚ w xY w# t        j                  |«       w xY w­w)	zXBind a fresh relay call context for one auxiliary call; mark it failed on any exception.r   rà  Úunknownzaux-rJ   NÚchat_completions)rà  Ú
request_idÚattempt_countrJ  r]  Úresponse_modelr   )
r|   rl  r  rK   ÚuuidÚuuid4Úhexr  Ú_fail_relay_auxiliary_callÚreset)r.   r/   rà  rÂ  s       r%   Ú_relay_aux_call_scoperx  Ò	  s¨   è ø€ ñ ˆ4�Š7 §
¡
¨6Ó 2€DÜ#×'Ñ'Ü�DÒ%˜IÓ&ØœTŸZ™Z›\×-Ñ-Ð.Ð/ØØØØØ&ñ)ó €Eð-Üô
 	 ×%Ñ% eÕ,øô	 ò Ü"Ô$Øðûô 	 ×%Ñ% eÕ,üs*   ‚A"B2Á%B  Á*B2Â BÂB ÂB/Â/B2c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )zHGive every physical retry in one auxiliary call a shared Relay identity.c                  óX   •— t        | |«      5   ‰| i |¤Žcd d d «       S # 1 sw Y   y xY wr,   ©rx  ©r.   r/   r  s     €r%   Úwrappedz&_relay_auxiliary_call.<locals>.wrappedê	  s/   ø€ ä" 4¨Ó0ñ 	-Ù˜TÐ, VÑ,÷	-÷ 	-ò 	-ús   Ž  )©Ú	functoolsÚwraps©r  r}  s   ` r%   Ú_relay_auxiliary_callr‚  è	  s%   ø€ ä‡_�_�XÓó-ó ð-ð €Nr'   c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )z3Async counterpart to :func:`_relay_auxiliary_call`.c               Ÿ   ót   •K  — t        | |«      5   ‰| i |¤Žƒ d {  –—† cd d d «       S 7 Œ# 1 sw Y   y xY w­wr,   r{  r|  s     €r%   r}  z,_relay_auxiliary_call_async.<locals>.wrappedó	  s>   øè ø€ ä" 4¨Ó0ñ 	3Ù! 4Ð2¨6Ñ2×2÷	3ñ 	3Ø2ø÷	3ð 	3üs    ƒ8�,œ*�, 
8ª,¬5±8r~  r�  s   ` r%   Ú_relay_auxiliary_call_asyncr…  ñ	  s%   ø€ ä‡_�_�XÓó3ó ð3ð €Nr'   c                 ó¨   — t         j                  «       }|€y t        | xs d«      |d<   t        |xs d«      |d<   d |d<   t        |xs d«      |d<   y )Nr  rJ  rn  r]  rr  ro  r   )rl  r|   rK   )rJ  r]  r   Úcontexts       r%   Ú_set_relay_auxiliary_routerˆ  ú	  s`   € Ü%×)Ñ)Ó+€GØ€ØÜ˜hÒ5¨+Ó6€GˆJÑÜ˜5Ò- IÓ.€GˆGÑØ $€GÐÑÜ˜hÒ<Ð*<Ó=€GˆJÒr'   Ú
route_infoc                 ó.   — | �|xs d| d<   |xs d| d<   yy)z:Expose the concrete route selected for one auxiliary call.NrL  rJ  rÙ   r]  r*   )r‰  rJ  r]  s      r%   Ú_record_route_infor‹  
  s-   € ð ÐØ!)Ò!3¨Vˆ
�:ÑØ#Ò0 yˆ
�7Òð r'   ©rJ  r   c           
      óŽ  — t         j                  «       }|€y t        |j                  d«      xs d«      }|dz   |d<   t        | xs |j                  d«      xs d«      }t        |j                  d«      xs d«      }||t        |xs |j                  d«      xs d	«      t        |d
   «      d|d   › �|t        |d   «      dœfS )Nrq  r   rO  rJ  r  r]  rn  r   ro  rp  z
auxiliary:rà  )r   Úapi_request_idÚ	call_roleÚretry_countÚauxiliary_task)rl  r|   r  rK   )rJ  r   r‡  rq  Úprovider_nameÚ
model_names         r%   Ú_relay_auxiliary_metadatar”  
  sÑ   € ô &×)Ñ)Ó+€GØ€ØÜ˜Ÿ™ OÓ4Ò9¸Ó:€MØ,¨qÑ0€GˆOÑÜ˜ÒJ G§K¡K°
Ó$;ÒJ¸{ÓK€MÜ�W—[‘[ Ó)Ò6¨YÓ7€JØ˜*Ü˜ÒQ G§K¡K°
Ó$;ÒQÐ?QÓRÜ˜g lÑ3Ó4Ø! '¨&¡/Ð!2Ð3Ø$Ü˜g f™oÓ.ñ'ð ð r'   ©rJ  r   r.  rŒ   r.  c                óv  ‡ ‡‡	‡
‡‡‡— ddl m}  |‰ ‰«      Š|xs ˆ fd„Š	t        ||¬«      }|€t        ‰	‰«      S |\  Š}Š
ddlmŠ ddlm} t        ‰j                  d«      xs |«      Š |ˆ	ˆˆ
ˆˆˆfd„t        ‰
j                  d	«      xs d
«      ‰
‰ ‰‰‰t        ‰
j                  d«      xs d
«      ¬«      S )Nr   ©Úprepare_chat_messagesc                 ó   •— t        ‰| «      S r,   )Ú_create_with_progress©ÚrequestrŒ   s    €r%   rß  z(_relay_sync_completion.<locals>.<lambda>)
  s   ø€ Ô*?ÀÈÓ*P€ r'   rŒ  ©Ú	relay_llm©Úrun_with_aux_hooksr]  c                  ó8   •— ‰j                  ‰ˆ fd„‰‰‰d¬«      S )Nc                 ó   •— t        ‰| «      S r,   )r)  )rœ  r  s    €r%   rß  z:_relay_sync_completion.<locals>.<lambda>.<locals>.<lambda>5
  s   ø€ Ô$EÀhÐPWÓ$X€ r'   T©rD   r“  ÚmetadataÚdefer_logical_completion)Úexecute_current©r  r/   r¤  r“  r’  rž  s   €€€€€€r%   rß  z(_relay_sync_completion.<locals>.<lambda>4
  s'   ø€ �	×)Ñ)ØÓXØ¨:ÀØ%)ð *ó 
€ r'   r‘  rJ   r   ©Úaux_taskr¤  rŒ   r/   rJ  r]  r   )
Úagent.auxiliary_wirer˜  r”  r)  Úagentrž  Úagent.auxiliary_hooksr   rK   r|   )rŒ   r/   rJ  r   r.  r˜  r	  Úfallback_modelr   r  r¤  r“  r’  rž  s   ``       @@@@@r%   Ú_relay_sync_completionr®   
  s¾   þ€ õ ;á" 6¨6Ó2€Fð ÒQÓP€HÜ%¨xÀ(ÔK€Eð €}Ü0°¸6ÓBÐBØ.3Ñ+€M�> 8ÝÝ8Ü�V—Z‘Z Ó(Ò:¨NÓ;€JÙ÷	
ð 	
ô
 �X—\‘\Ð"2Ó3Ò9°rÓ:ÀXÐV\ÐekØ j¼3¸x¿|¹|ÈJÓ?WÒ?]Ð[]Ó;^ôð r'   c             ƒ   óž  ‡ ‡‡	‡
‡‡‡K  — ddl m}  |‰ ‰«      Š|xs ˆ fd„Š	t        ||¬«      }|€ ‰	‰«      ƒ d {  –—† S |\  Š}Š
ddlmŠ ddlm} t        ‰j                  d«      xs |«      Š |ˆ	ˆˆ
ˆˆˆfd„t        ‰
j                  d	«      xs d
«      ‰
‰ ‰‰‰t        ‰
j                  d«      xs d
«      ¬«      ƒ d {  –—† S 7 ŒŒ7 Œ­w)Nr   r—  c                 ó   •— t        ‰| «      S r,   ©Ú_acreate_with_progressr›  s    €r%   rß  z)_relay_async_completion.<locals>.<lambda>F
  s   ø€ Ô*@ÀÈÓ*Q€ r'   rŒ  r�  )Úarun_with_aux_hooksr]  c                  ó2   •— ‰j                  ‰‰ ‰‰‰d¬«      S )NTr£  )Úexecute_current_asyncr§  s   €€€€€€r%   rß  z)_relay_async_completion.<locals>.<lambda>O
  s%   ø€ �	×/Ñ/Ø�H =¸ZØ¸ð 0ó 
€ r'   r‘  rJ   r   r¨  )	rª  r˜  r”  r«  rž  r¬  r³  rK   r|   )rŒ   r/   rJ  r   r.  r˜  r	  r­  r³  r  r¤  r“  r’  rž  s   ``       @@@@@r%   Ú_relay_async_completionr¶  >
  sÏ   þè ø€ õ ;á" 6¨6Ó2€FàÒRÓQ€HÜ%¨xÀ(ÔK€EØ€}Ù˜fÓ%×%Ð%Ø.3Ñ+€M�> 8ÝÝ9Ü�V—Z‘Z Ó(Ò:¨NÓ;€JÙ$÷	
ð 	
ô �X—\‘\Ð"2Ó3Ò9°rÓ:ÀXÐV\ÐekØ j¼3¸x¿|¹|ÈJÓ?WÒ?]Ð[]Ó;^ô÷ ð ð &øð
ús"   ‰3C¼C	½BCÃCÃCÃCc                óh  ‡ ‡‡‡	‡
‡‡— ddl m}  |‰ ‰«      Šˆ fd„Št        ||¬«      }|€ ‰‰«      S |\  Š}Š	ddlmŠ ddlm} t        ‰j                  d«      xs |«      Š
 |ˆˆˆ	ˆ
ˆˆfd„t        ‰	j                  d	«      xs d
«      ‰	‰ ‰‰‰
t        ‰	j                  d«      xs d
«      d¬«	      S )Nr   r—  c                 ód   •—  ‰j                   j                  j                  di t        | ‰«      ¤ŽS )Nr*   )rH  r9  r.  r   r›  s    €r%   rß  z$_relay_sync_stream.<locals>.<lambda>`
  s,   ø€ Ð;˜VŸ[™[×4Ñ4×;Ñ;ÑqÔ>_Ð`gÐioÓ>pÑq€ r'   rŒ  r�  rŸ  r]  c            	      ó>   •— ‰j                  ‰‰ ‰‰t        ‰d„ ¬«      S )Nc                 ó   — t        | d«      S )Nr(  )r/  ©r
  s    r%   rß  z6_relay_sync_stream.<locals>.<lambda>.<locals>.<lambda>k
  s   € Ì'ÐRWÐYbÓJc€ r'   )rD   r“  Ú	finalizerr¤  Úcompleted_response_predicate)Ústream_currentrÜ   )r.  r/   r¤  r“  r’  rž  s   €€€€€€r%   rß  z$_relay_sync_stream.<locals>.<lambda>i
  s)   ø€ �	×(Ñ(Ø�F ¸:ÔQUØÑ<cð )ó 
€ r'   r‘  rJ   r   T)r©  r¤  rŒ   r/   rJ  r]  r   Ú	streaming)	rª  r˜  r”  r«  rž  r¬  r   rK   r|   )rŒ   r/   rJ  r   r˜  r	  r­  r   r.  r¤  r“  r’  rž  s   ``      @@@@@r%   Ú_relay_sync_streamrÀ  X
  s·   þ€ õ ;á" 6¨6Ó2€Fó r€FÜ%¨xÀ(ÔK€EØ€}Ù�f‹~ÐØ.3Ñ+€M�> 8ÝÝ8Ü�V—Z‘Z Ó(Ò:¨NÓ;€JÙ÷	
ð 	
ô �X—\‘\Ð"2Ó3Ò9°rÓ:ÀXÐV\ÐekØ j¼3¸x¿|¹|ÈJÓ?WÒ?]Ð[]Ó;^Ðjnôð r'   ©rJ   rJ   rJ   rJ   rJ   rJ   .Ú_RUNTIME_MAIN_COMPAT_SNAPSHOTÚvaluesc                 ób   — t         5  | \  aaaaaat        | «      addd«       y# 1 sw Y   yxY w)z[Write the legacy globals + compat snapshot (``_MAIN_RUNTIME_FIELDS`` order) under the lock.N)	Ú_RUNTIME_MAIN_COMPAT_LOCKrc  rd  re  rf  rg  rh  r¡  rÂ  ©rÃ  s    r%   Ú_publish_runtime_main_mirrorsrÇ  v
  sA   € ô 
#ñ 6àSYñ	QÐ	Ð!4Ð6LØ	Ð 6Ð8OÜ(-¨f«Ð%÷6÷ 6ñ 6ús   ‡%¥.c                  óÚ   — t        j                  «       t        j                  «       uryt        t        t
        t        t        t        f} | t        k(  ryt        t        t        | «      «      S )zØExpose deliberately patched legacy globals as a main context.

    Mirrors must never become runtime inputs: a direct patch counts only when it differs from
    the mirrored snapshot and only on the main thread.
    N)r¹   Úcurrent_threadÚmain_threadrc  rd  re  rf  rg  rh  rÂ  rÜ   ÚzipÚ_MAIN_RUNTIME_FIELDSrÆ  s    r%   Ú_compat_runtime_mainrÍ  €
  sZ   € ô ×ÑÓ!¬×)>Ñ)>Ó)@Ñ@ØÜ$Ô&9Ô;QÜ#Ô%;Ô=TðV€FàÔ.Ò.ØÜ”Ô(¨&Ó1Ó2Ð2r'   c                 ó�   — t         j                  «       }|€
t        «       }t        |t        «      r|j                  | «      xs dS dS )zERead one runtime field through context-local/controlled legacy state.rJ   )rj  r|   rÍ  r2   rÜ   )rF  r  s     r%   r  r  �
  s?   € ä#×'Ñ'Ó)€GØ€Ü&Ó(ˆÜ)3°G¼TÔ)BˆG�K‰K˜ÓÒ$ "ÐJÈÐJr'   )Úrequested_providerrA   r@   r   Ú	auth_moderú  rù  rÏ  rÐ  rú  rù  c          
      ó  ‡
— | xs dj                  «       j                  «       |xs dj                  «       j                  «       |xs dj                  «       |xs dj                  «       t        |«      |xs dj                  «       |xs dj                  «       j                  «       |xs dj                  «       |xs dj                  «       dœ	Š
t        j	                  ‰
«      }	t        t        ˆ
fd„t        D «       «      «       |	S )uS  Record the current context's live main runtime for auxiliary routing.

    Context-local so concurrent gateway sessions don't clobber each other; legacy mirrors are
    updated for old readers. ``cache_scope`` is the rotation-stable logical cache scope,
    preferred over ``session_id`` for prompt_cache_key derivation.

    ``cache_scope`` is the rotation-stable logical cache scope (compression- lineage root â€”
    agent/prompt_cache_scope.py) resolved once per turn by turn_context; auxiliary Responses calls prefer it
    over ``session_id`` for prompt_cache_key derivation (#79017).
    rJ   )	rJ  rÏ  r]  rA   r@   r   rÐ  rú  rù  c              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wr,   r*   )ræ   rF  r  s     €r%   rè   z#set_runtime_main.<locals>.<genexpr>³
  s   øè ø€ Ò'Y¸5¨°­Ñ'Yùs   ƒ)rS  rT  Ú_normalize_api_keyrj  r  rÇ  r¡  rÌ  )rJ  r]  rÏ  rA   r@   r   rÐ  rú  rù  rÂ  r  s             @r%   Úset_runtime_mainrÔ  —
  sÝ   ø€ ð  ’^ ×*Ñ*Ó,×2Ñ2Ó4Ø1Ò7°R×>Ñ>Ó@×FÑFÓHØ’+˜2×$Ñ$Ó&Ø’^ ×*Ñ*Ó,Ü% gÓ.Ø’^ ×*Ñ*Ó,Ø’o 2×,Ñ,Ó.×4Ñ4Ó6Ø!Ò' R×.Ñ.Ó0Ø#Ò) r×0Ñ0Ó2ñ
€Gô "×%Ñ% gÓ.€EÜ!¤%Ó'YÔDXÔ'YÓ"YÔZØ€Lr'   rÂ  c                 ó`   — | €y	 t         j                  | «       y# t        t        f$ r Y yw xY w)z:Restore the runtime binding that preceded one scoped turn.N)rj  rw  rF   r)  )rÂ  s    r%   Úreset_runtime_mainrÖ  ·
  s4   € à€}ØðÜ×#Ñ# EÕ*øÜœ*Ð%ò Ùðús   … ›-¬-Úmain_runtimec              #   ó¼   K  — t        | «      }t        j                  |xs d«      }	 |–— t        j                  |«       y# t        j                  |«       w xY w­w)zETemporarily bind an explicit runtime without touching legacy mirrors.N)rý  rj  r  rw  )r×  r  rÂ  s      r%   Úscoped_runtime_mainrÙ  Á
  sM   è ø€ ô & lÓ3€GÜ!×%Ñ% g¢o°Ó6€Eð+ØŠä×#Ñ# EÕ*øÔ×#Ñ# EÕ*üs   ‚%A¨A ¬AÁAÁAc                  óD   — t         j                  d«       t        d«       y)z2Clear the runtime override in the current context.NrÁ  )rj  r  rÇ  r*   r'   r%   Úclear_runtime_mainrÛ  Ì
  s   € ä×Ñ˜dÔ#Ü!Ð":Õ;r'   c                  óö  — 	 ddl m}  ddlm}  |d¬«      }t        |t        «      s+t        d
«      j                  d«      }|sy|t        d«      dœ}|j                  d«      }|j                  d«      }|j                  d«      }t        |t        «      r|j                  «       sy|j                  «       j                  d«      }t        |d«      ryt        |t        «      r|j                  «       sd}t        |t        «      r|j                  «       sd}||j                  «       |fS #  $ r }t        j                  d|«       Y d}~yd}~wt        $ r#}t        j                  d	|«       d}Y d}~�Œ\d}~ww xY w)z`Resolve the active custom/main endpoint like the main CLI (env OPENAI_BASE_URL or config-saved).r   ©Ú	AuthError©Úresolve_runtime_providerr;  )Ú	requestedz3Auxiliary client: no custom endpoint configured: %sN©NNNz6Auxiliary client: custom runtime resolution failed: %sÚOPENAI_BASE_URLr_  ÚOPENAI_API_KEY©rA   r@   rA   r@   r   úopenrouter.aiúno-key-required)rE  rÞ  Úhermes_cli.runtime_providerrà  rŠ   r²   r}   r2   rÜ   ra  rÀ  r|   rK   rS  rf   )rÞ  rà  r  r  Úopenai_baseÚcustom_baseÚ
custom_keyÚcustom_modes           r%   Ú_resolve_custom_runtimerí  Ò
  sF  € ðÝ-ÝHÙ*°XÔ>ˆô �gœtÔ$ä%Ð&7Ó8×?Ñ?ÀÓDˆÙØ#Ø*´ÐGWÓ7XÑYˆØ—+‘+˜jÓ)€KØ—‘˜YÓ'€JØ—+‘+˜jÓ)€KÜ�k¤3Ô'¨{×/@Ñ/@Ô/BØØ×#Ñ#Ó%×,Ñ,¨SÓ1€KÜ˜[¨/Ô:Øô �j¤#Ô&¨j×.>Ñ.>Ô.@Ø&ˆ
Ü�k¤3Ô'¨{×/@Ñ/@Ô/BØˆØ˜
×(Ñ(Ó*¨KÐ7Ð7øð= ò  ô 	�‰ÐJÈCÔPÜûÜò Ü�‰ÐMÈsÔSØŽûðús#   ‚D) Ä)E8Ä.E	Å	E8ÅE3Å3E8c                  ó*   — t        «       \  } }}| xs dS ©NrJ   )rí  )rê  r  s     r%   Ú_current_custom_base_urlrð  ù
  s   € Ü/Ó1Ñ€K��AØÒ˜"Ðr'   c            	      ó6  — ddl m}  t        «        dD ]`  }t        t        j
                  j                  |«      xs d«      j                  «       }|sŒ@	  | |«      }|j                  r|j                  }Œb y# t        $ r}t        d|› d|›d�«      |‚d}~ww xY w)	z�Fail fast on malformed proxy env URLs (a shell typo like ``:6153export`` otherwise surfaces as a cryptic httpx ``Invalid port``).r   ©r   )ÚHTTPS_PROXYÚ
HTTP_PROXYÚ	ALL_PROXYÚhttps_proxyÚ
http_proxyÚ	all_proxyrJ   z%Malformed proxy environment variable ré  z1. Fix or unset your proxy settings and try again.N)Úurllib.parser   rl   rK   r  r	  r|   rS  ÚschemeÚportr)  rF   )r   rØ   r
  r7  r  r  s         r%   Ú_validate_proxy_env_urlsrü  þ
  s¢   € å%ÜÔØcò ˆÜ”B—J‘J—N‘N 3Ó'Ò-¨2Ó.×4Ñ4Ó6ˆÙØð	Ù˜e“_ˆFØ�}Š}Ø—K‘K�øñøô ò 	ÜØ7¸°u¸A¸e¸Yð GBð Bóð ðûð	ús   Á A7Á7	BÂ BÂBc                 óü   — ddl m} t        | xs d«      j                  «       }|r|j	                  d«      ry	  ||«      }|j
                  dv r|j                  }yy# t        $ r}t        d|›d�«      |‚d}~ww xY w)	zEReject obviously broken custom endpoint URLs before they reach httpx.r   rò  rJ   zacp://N>   ÚhttpÚhttpszMalformed custom endpoint URL: zJ. Run `hermes setup` or `hermes model` and enter a valid http(s) base URL.)	rù  r   rK   rS  rU  rú  rû  r)  rF   )rA   r   rd  r7  r  r  s         r%   Ú_validate_base_urlr     sŽ   € å%Ü�H’N Ó#×)Ñ)Ó+€IÙ˜	×,Ñ,¨XÔ6ØðÙ˜)Ó$ˆØ�=‰=Ð-Ñ-Ø—‘‰Að .øäò ÜØ-¨i¨]ð ;Wð Wó
ð ð	ûðús   ¹"A Á	A;Á&A6Á6A;c            
      ó¬  — t        «       } t        | «      dk(  rg | ¢d ‘­n| \  }}}|r|sy|j                  «       j                  t	        j                  «       «      ryt        «       xs d}t        j                  d||xs d«       t        |«      \  }}|rd|ini }t        d «      }|r||d<   |dk(  rt        d||d	œ|¤Ž}	t        |	|«      |fS |d
k(  r/	 ddlm}
 ddlm}  |
||«      }	t%        |	||| |||«      ¬«      |fS t        d||d	œ|¤Ž}t'        |||||«      |fS # t         $ r( t        j#                  d«       t        d||d	œ|¤Ž|fcY S w xY w)Nr�  rò  úgpt-4o-miniz3Auxiliary client: custom endpoint (%s, api_mode=%s)ro  Údefault_queryrõ  Úcodex_responsesr?   rt  r   r£  ©Úanthropic_route_is_oauthu|   Custom endpoint declares api_mode=anthropic_messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire.r¦  r*   )rí  r3  rT  rU  Ú_CODEX_AUX_BASE_URLr\  rŠ   r²   r:  rú  r”   rJ  rv  r¤  Úagent.anthropic_credentialsr  r‡   r‹   rƒ  r§  )r  rê  rë  rì  r]  Ú_clean_baseÚ_dqÚ_extraÚ_custom_headersrË  r¤  r  Ú_fallback_clients                r%   Ú_try_custom_endpointr  "  s¨  € Ü%Ó'€GÜ?BÀ7»|ÈqÒ?PÐ+;¨WÐ+;°dÒ+;ÐV]Ñ(€K�˜[Ù™jØØ×ÑÓ×%Ñ%Ô&9×&?Ñ&?Ó&AÔBØÜ$Ó&Ò7¨-€EÜ
‡L�LÐFÈÈ{ÒOpÐ^pÔqÜ0°Ó=Ñ€K�Ù'*ˆo˜sÑ#°€Fä1°$Ó7€OÙØ$3ˆÐ Ñ!ØÐ'Ò'Ü+Ð_°JÈÑ_ÐX^Ñ_ˆÜ# K°Ó7¸Ð>Ð>ØÐ*Ò*ð		dÝFÝLÙ0°¸[ÓIˆKô (¨°U¸JÈÙ1IÈ+ÐWaÓ1bôdØejðkð 	kô -Ð`°ZÈ+Ñ`ÐY_Ñ`ÐÜ Ð!1°5¸*ÀkÐS^Ó_ÐafÐfÐføô ò 	dÜ�N‰NðRôô )Ð\°ÀkÑ\ÐU[Ñ\Ð^cÐcÒcð	dús   ÃD" Ä".EÅEc                 óÐ   — | st         j                  d«       yt        «       }|€y|\  }}t         j                  d| «       ddlm} t        || |«       ¬«      }t        || «      | fS )uÀ   CodexAuxiliaryClient for xAI Grok OAuth (Responses API); (None, None) if not authed.

    Caller must pass an explicit model â€” a pinned Grok default would rot as xAI's allowlist drifts.
    zuAuxiliary client: xai-oauth requested without a model; pass model explicitly (auxiliary.<task>.model in config.yaml).rò  z2Auxiliary client: xAI OAuth (%s via Responses API)r   r  r"  )rŠ   r‹   rå  r²   r  r  r”   rJ  )r]  Úresolvedr@   rA   r  rË  s         r%   Ú_build_xai_oauth_aux_clientr  H  st   € ñ
 Ü�‰ðMô	
ð Ü)Ó+€HØÐØØ Ñ€GˆXÜ
‡L�LÐEÀuÔMÝ9Ü'Ø (Ñ<VÓ<Xô€Kô   ¨UÓ3°UÐ:Ð:r'   c                  ó6   — t        d«      j                  d«      S )z´Profile-scoped ``HERMES_CODEX_BASE_URL`` (same read as the API-key env vars: under a
    multiplexer the routed profile's .env decides the endpoint, never a sibling's process env).ÚHERMES_CODEX_BASE_URLr_  )ra  rÀ  r*   r'   r%   Ú_codex_base_url_overrider  _  s   € ô Ð2Ó3×:Ñ:¸3Ó?Ð?r'   c                 óf  — | st         j                  d«       yt        d«      \  }}|rt        |«      nd}t	        «       }|r|xs t        |t        «      xs t        }nt        «       }|sy|xs t        }t         j                  d| «       t        ||t        ||¬«      ¬«      }t        || «      | fS )z°CodexAuxiliaryClient for an explicit model; (None, None) without a Codex OAuth token.

    No auto-selected default: the Codex model allow-list is undocumented and drifts.
    zxAuxiliary client: openai-codex requested without a model; pass model explicitly (auxiliary.<task>.model in config.yaml).rò  rQ  Nz4Auxiliary client: Codex OAuth (%s via Responses API)r  r"  )rŠ   r‹   r>  rH  r  rO  r  rï  r²   r”   Ú_codex_cloudflare_headersrJ  )r]  r¸  rE  Úcodex_tokenÚcodex_overriderA   rË  s          r%   Ú_build_codex_clientr  e  sµ   € ñ
 Ü�‰ðMô	
ð Ü,¨^Ó<Ñ€L�%Ù2>Ô'¨Ô.ÀD€KÜ-Ó/€NÙØ!ÒnÔ%;¸EÔCVÓ%WÒnÔ[n‰ä.Ó0ˆÙØØ!Ò8Ô%8ˆÜ
‡L�LÐGÈÔOÜ'Ø hÜ1°+ÈÔQô€Kô   ¨UÓ3°UÐ:Ð:r'   ©r]  r   Úexplicit_base_urlr   r  c                 óœ  — 	 ddl m} ddlm} ddlm} 	  |«       }t        |t        «      r|j                  d«      ni }t        |t        «      si }	  |d|||| ¬«      }	|	j                  d«      }t        |	j                  dd«      xs d«      }|xs |	j                  d«      xs d}t        |«      s|r|syt        | xs t        |j                  d«      xs d«      d«      }|s't        j                  d| |j                  d«      «       yt!        |«      \  }}|rd|ini }t#        d||dœ|¤Ž}|dk(  rt%        ||«      |fS |dk(  rt'        |||||«      |fS ||fS # t        $ r Y yw xY w# t        $ r i }Y �Œ*w xY w# |$ r }
t        j                  d	|
«       Y d
}
~
yd
}
~
wt        $ r }
t        j                  d|
«       Y d
}
~
yd
}
~
ww xY w)zÑAzure Foundry aux client via the main agent's ``_resolve_azure_foundry_runtime`` (api_key vs Entra
    callable bearer, per-model api_mode, base_url overrides). Returns ``(client, model)`` or ``(None, None)``.r   )Ú_resolve_azure_foundry_runtimerÝ  rý  rò  r]  úazure-foundry)rÏ  rL  r   r  Útarget_modelzAuxiliary azure-foundry: %sNz)Auxiliary azure-foundry runtime error: %sr@   rA   rJ   r   ro  rÙ   zAAuxiliary azure-foundry: no model resolved (model=%r, default=%r)r  r?   r  rt  r*   )rè  r  rE  rÞ  r{   rt   r‡   r2   rÜ   r|   r}   rŠ   r²   rK   rª   Ú_normalize_resolved_modelr:  r”   rJ  r§  )r]  r   r  r   r  rÞ  rt   r  rL  r  r  r@   rA   Úruntime_api_modeÚfinal_modelr	  r
  r  rŒ   s                      r%   Ú_try_azure_foundryr#  ‚  sâ  € ðÝNÝ-Ý:ðÙ"Ó$ˆÜ(2°3¼Ô(=�C—G‘G˜GÔ$À2ˆ	Ü˜)¤TÔ*ØˆIðÙ0Ø.¸)Ø-ÐARØô
ˆð �k‰k˜)Ó$€GÜ�7—;‘;˜z¨2Ó.Ò4°"Ó5€HØÒP 7§;¡;¨zÓ#:ÒPÐ>PÐä�WÔ¡±ØÜ+¨EÒ,X´S¸¿¹ÀyÓ9QÒ9WÐUWÓ5XÐZiÓj€KÙä�‰ØOØ�9—=‘= Ó+ô	
ð ä0°Ó:Ñ€K�Ù69˜_¨cÑ2¸r€EÜ"ÐR¨7¸[ÑRÈEÑR€FØÐ,Ò,Ü# F¨KÓ8¸+ÐEÐEØÐ/Ò/ä$ V¨[¸'À8ÐM]Ó^Ð`kÐkÐkØ�;ÐÐøôY ò Ùðûô ò Ø‹	ðûð ò Ü�‰Ð2°CÔ8ÜûÜò Ü�‰Ð@À#ÔFÜûðúsF   ‚E •<E- ÁE? Å	E*Å)E*Å-E<Å;E<Å?GÆFÆGÆ+GÇGc                 óx  — 	 ddl m} ddlm} t        d«      \  }}|r|�| xs t        |«      }nd }| xs  |«       }|sy|rt        |t        «      nt        }t        j                  t        «      5  ddlm}  |«       }|j                  d«      }	t        |	t         «      r€t#        |	j                  d«      xs d	«      j%                  «       j'                  «       }
|
dk(  rA|	j                  d
«      xs d	j%                  «       j)                  d«      }|rt+        |«      r|}d d d «       ddlm}  ||«      }t/        d«      xs d}t1        «       rt3        d	|¬«      |fS t4        j7                  d|||«       	  |||«      }t9        |||||¬«      |fS # t        $ r Y yw xY w# 1 sw Y   Œ‚xY w# t        $ r Y yw xY w)Nr   r£  )Úresolve_anthropic_tokenrò  rÛ  rý  r]  rJ  rJ   rA   r_  )Ú_is_oauth_tokenrÔ  r?   z8Auxiliary client: Anthropic native (%s) at %s (oauth=%s)r¦  )rv  r¤  r  r%  r‡   r>  rH  rO  Ú_ANTHROPIC_DEFAULT_BASE_URLrC  rD  r}   r{   rt   r|   r2   rÜ   rK   rS  rT  rÀ  rU  r&  rÓ  rR   r>   rŠ   r²   rƒ  )r   r¤  r%  r¸  rE  rÂ  rA   rt   r  rL  Úcfg_providerÚcfg_base_urlr&  r^  r]  rË  s                   r%   rü  rü  »  s¹  € ðÝBÝGô -¨[Ó9Ñ€L�%Ù˜Ð)Ø Ò@Ô$9¸%Ó$@‰ð ˆØ Ò=Ñ$;Ó$=ˆÙØñ NZÔ% eÔ-HÔIÔ_z€HÜ	×	Ñ	œYÓ	'ñ 	,Ý:Ù"Ó$ˆØ—G‘G˜GÓ$ˆ	Ü�i¤Ô&Ü˜yŸ}™}¨ZÓ8Ò>¸BÓ?×EÑEÓG×MÑMÓOˆLØ˜{Ò*Ø )§¡¨jÓ 9Ò ?¸R×FÑFÓH×OÑOÐPSÓT�ÙÔ$AÀ,Ô$OØ+�H÷	,õ <Ù˜uÓ%€HÜ'¨Ó4ÒSÐ8S€EÜÔä"¨2¸ÔAÀ5ÐHÐHÜ
‡L�LÐKÈUÐT\Ð^fÔgðÙ,¨U°HÓ=ˆô $ K°¸¸xÐRZÔ[Ð]bÐbÐbøôG ò Ùðú÷	,ð 	,ûô& ò Ùðús0   ‚F Á1B/F!Å7	F- Æ	FÆFÆ!F*Æ-	F9Æ8F9)rJ  r]  rA   r@   r   rÐ  )rÏ  rú  rù  c                 óØ  — | € t         j                  «       } | €
t        «       } t        | t        «      si S i }t
        D ]n  }| j                  |«      }|dk(  r!t        |«      rt        |t        «      s|||<   Œ:t        |t        «      sŒK|j                  «       sŒ\|j                  «       ||<   Œp dD ]7  }|j                  |«      }t        |t        «      sŒ%|j                  «       ||<   Œ9 |S )uÝ   Return a sanitized copy of a live main-runtime override.

    ``api_key`` may be a zero-arg callable (Entra ID token provider, accepted by the OpenAI SDK)
    â€” preserved as-is so aux clients share main-agent auth.
    r@   )rJ  rÏ  )
rj  r|   rÍ  r2   rÜ   Ú_MAIN_RUNTIME_CONTEXT_FIELDSrª   rK   rS  rT  )r×  rX  rF  r
  Úidentity_fieldÚidentitys         r%   rý  rý  ë  sÞ   € ð Ðä,×0Ñ0Ó2ˆØÐÜ/Ó1ˆLÜ�l¤DÔ)Øˆ	Ø!#€JÜ-ò .ˆØ× Ñ  Ó'ˆØ�IÒ¤(¨5¤/¼*ÀUÌCÔ:PØ %ˆJ�uÒÜ˜œsÕ#¨¯©­Ø %§¡£ˆJ�uÒð.ð =ò :ˆØ—>‘> .Ó1ˆÜ�h¤Õ$Ø)1¯©Ó)9ˆJ�~Ò&ð:ð Ðr'   c                  ó>   — dt         fdt        fdt        fdt        fgS )zÀOrdered provider detection chain, built at call time so ``_try_*`` patches are picked up.

    ``openai-codex`` is deliberately absent (shifting allow-list breaks guessed-model fallback).
    rþ  r§  úlocal/customzapi-key)r-  r@  r  r  r*   r'   r%   Ú_get_provider_chainr0    s.   € ð 
”Ð'¨&´)Ð)<Ø	Ô-Ð.°Ô<UÐ0Vðð r'   éX  Ú_aux_unhealthy_untilÚ_aux_unhealthy_logged_atÚ_aux_unhealthy_reasonrþ  r§  r/  rQ  )rþ  r§  r;  r/  rQ  rP  c                 ó‚   — | syt        | «      j                  «       j                  «       }t        j	                  ||«      S )u_   resolved_provider â†’ chain label; unknown API-key providers fall back to the lowercased input.rJ   )rK   rS  rT  Ú_AUX_UNHEALTHY_LABEL_ALIASESr|   )rJ  Úps     r%   Ú_normalize_chain_labelr8    s6   € áØÜˆH‹×ÑÓ×#Ñ#Ó%€AÜ'×+Ñ+¨A¨qÓ1Ð1r'   zpayment / credit error)rA   r”  r%  r  r”  r%  c                ó2  — t        | «      }|syt        ||«      }|€t        n|}t        j                  «       |z   }|t        |<   |t
        |<   t        j                  |d|t        |«      |t        j                  dt        j                  |«      «      «       y)u!  Hide one provider endpoint until the TTL expires. ``reason`` is what the log says and what the
    skip line echoes: absent credentials are an expected state (DEBUG), a confirmed 402 is a fault
    (WARNING) â€” the old fixed payment wording sent local-only users chasing billing (#64144).Nz_Auxiliary: marking %s unhealthy for %ds (%s). Subsequent auxiliary calls will skip it until %s.z%H:%M:%S)r8  r\   Ú_AUX_UNHEALTHY_TTL_SECONDSrû   r2  r4  rŠ   Úlogr  ÚstrftimeÚ	localtime)rJ  r  rA   r”  r%  rÄ   rØ   r¿  s           r%   r&  r&  )  s‡   € ô # 8Ó,€EÙØÜ
˜u hÓ
/€CØ(+¨Õ
$¸€CÜ—‘“˜sÑ"€JØ *Ô˜ÑØ!'Ô˜#ÑÜ
‡J�JØð	<àŒs�3‹x˜¤§¡¨z¼4¿>¹>È*Ó;UÓ!Võ	r'   c                 ó  — | syt        | |«      }t        j                  |«      }|€yt        j                  «       |k\  rCt        j	                  |d«       t
        j	                  |d«       t        j	                  |d«       yy)zZTrue iff this provider endpoint is unhealthy and unexpired; lazily evicts expired entries.FNT)r\   r2  r|   rû   r*  r3  r4  )rÄ   rA   rØ   r¿  s       r%   rû  rû  @  sq   € áØÜ
˜u hÓ
/€CÜ%×)Ñ)¨#Ó.€JØÐØÜ‡y�yƒ{�jÒ Ü× Ñ   dÔ+Ü ×$Ñ$ S¨$Ô/Ü×!Ñ! # tÔ,ØØr'   r  c                óR  — t        j                   «       }t        | |«      }|t        j                  |d«      z
  dk\  rk|t        |<   t        j                  ||«      }t
        j                  d|xs d| t        j                  |t        «      t        dt        ||z
  «      «      «       yy)zCLog a skipped unhealthy provider at most once per minute per label.rž  rW  z,Auxiliary %s: skipping %s (%s, retry in %ds)Úcallr   N)rû   r\   r3  r|   r2  rŠ   r¯  r4  Ú_AUX_UNHEALTHY_PAYMENT_REASONrZ  r  )rÄ   rà  rA   ÚnowrØ   r¿  s         r%   Ú_log_skip_unhealthyrC  P  s•   € ô �)‰)‹+€CÜ
˜u hÓ
/€CØ
Ô%×)Ñ)¨#¨sÓ3Ñ3°rÒ9Ø(+Ô  Ñ%Ü)×-Ñ-¨c°3Ó7ˆ
Ü�‰Ø:ØŠN�F˜EÔ#8×#<Ñ#<¸SÔB_Ó#`Ü�”3�z CÑ'Ó(Ó)õ	
ð :r'   c                  ó|   — t         j                  «        t        j                  «        t        j                  «        y)z8Clear the unhealthy cache (tests / explicit user reset).N)r2  Úclearr3  r4  r*   r'   r%   Ú_reset_aux_unhealthy_cacherF  `  s&   € ä×ÑÔ Ü×"Ñ"Ô$Ü×ÑÕ!r'   rê   Úneedlesc                 ó,   ‡ — t        ˆ fd„|D «       «      S )z0True when any needle is a substring of ``text``.c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr,   r*   )ræ   Úkwrê   s     €r%   rè   z _contains_any.<locals>.<genexpr>i  s   øè ø€ Ò,˜bˆr�TŒzÑ,ùr½  )rõ   )rê   rG  s   ` r%   Ú_contains_anyrK  g  s   ø€ äÓ, GÔ,Ó,Ð,r'   )Úcreditsúinsufficient fundsúcan only affordÚbillingú isn't available on the free tierzkey limit exceededzbudget limitzrequires a subscriptionzupgrade for accesszupgrade for higher limitsz reached your session usage limitzquota exceededÚquota_exceededztoo many tokens per dayzdaily limitztokens per dayzdaily quotazresource exhaustedÚresource_exhaustedzresource-exhaustedÚresourceexhaustedzweekly usage limitzweekly limitr  c                 ó„   — t        | dd«      }|dk(  xs- |dv xr' t        t        | «      j                  «       t        «      S )z\Payment/credit/quota exhaustion: HTTP 402, or a billing/quota body on 403/404/429/no-status.Ústatus_codeNé’  >   Né“  é”  é­  )rP   rK  rK   rT  Ú_PAYMENT_KEYWORDS©r  Ústatuss     r%   Ú_is_payment_errorr]  }  sB   € ä�S˜-¨Ó.€FØ�S‰=ò ØÐ'Ð'Ò^¬M¼#¸c»(¿.¹.Ó:JÔL]Ó,^ðr'   c                  ó’   — 	 ddl m}   | d¬«      j                  du S # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zMReturn True only when the fresh Nous account API says paid access is allowed.r   )Úget_nous_portal_account_infoT)Úforce_freshz8Auxiliary Nous paid-entitlement refresh check failed: %sNF)Úhermes_cli.nous_accountr_  Úpaid_service_accessr}   rŠ   r²   )r_  r  s     r%   Ú*_nous_portal_account_has_fresh_paid_accessrc  …  sD   € ðÝHÙ+¸Ô=×QÑQÐUYÐYÐYøÜò Ü�‰ÐOÐQTÔUÜûðús   ‚ �	A¦AÁA)ú
rate limitÚ
rate_limitztoo many requestsz	try againzretry afterz	resets in)rL  rM  rO  úpayment requiredrN  úout of fundszrun out of fundsÚbalance_depletedúno usable creditsÚ model_not_supported_on_free_tierúnot available on the free tierrP  c                 óP   — t        t        | «      j                  «       t        «      S )u¶   Server busy, credential fine ("at capacity upstream â€¦ not your API key's rate limit"): back off,
    never bench the credential (#108349). Same phrase table as the main classifier.)rK  rK   rT  r   ©r  s    r%   Ú_is_overloaded_errorrn  ™  s   € ô œ˜S›Ÿ™Ó)Ô+?Ó@Ð@r'   c                 óÎ   — t        | «      j                  dk(  ryt        | dd«      dk7  ryt        | «      j	                  «       }t        |t        «      xs t        |t        «       S )u×   429 rate limit (not billing/quota, which _is_payment_error owns).

    OpenAI's RateLimitError may omit .status_code â€” matched by class name. A generic 429 without
    billing keywords counts as a rate limit.
    ÚRateLimitErrorTrU  NrY  F)rá   r8   rP   rK   rT  rK  Ú_RATE_LIMIT_KEYWORDSÚ_RATE_LIMIT_BILLING_KEYWORDS)r  Ú	err_lowers     r%   Ú_is_rate_limit_errorrt  Ÿ  s\   € ô ˆCƒy×ÑÐ-Ò-ØÜˆs�M 4Ó(¨CÒ/ØÜ�C“—‘Ó €IÜ˜Ô$8Ó9ÒwÄÈyÔZvÓAwÐ=wÐwr'   c                 ó   — t        j                  t        «      5  ddlm} t        | |«      r
	 ddd«       y	 ddd«       dt        | «      j                  v xs dt        | «      j                  «       v S # 1 sw Y   Œ=xY w)zåFull-budget request timeout, distinct from a fast connection drop.

    A timeout burns the whole ``timeout`` budget, so a same-provider retry on the compression
    path doubles wall time; fast drops stay on the retry path.
    r   )ÚAPITimeoutErrorNTÚTimeoutú	timed out)
rC  rD  r‡   r#   rv  r2   rá   r8   rK   rT  )r  rv  s     r%   Ú_is_timeout_errorry  ®  sp   € ô 
×	Ñ	œ[Ó	)ñ Ý*Ü�c˜?Ô+Ø÷ð à+÷ð œ˜S›	×*Ñ*Ð*ÒM¨k¼SÀ»X¿^¹^Ó=MÐ.MÐM÷	ð ús   šA4Á4A=c                 ó&  — t        j                  t        «      5  ddlm}m} t        | ||f«      r
	 ddd«       y	 ddd«       t        t        | «      j                  d«      ryt        t        | «      j                  «       d«      S # 1 sw Y   ŒLxY w)zSConnection/network errors (endpoint unreachable), as opposed to 4xx/5xx API errors.r   )ÚAPIConnectionErrorrv  NT)Ú
Connectionrw  ÚDNSÚSSL)zconnection refusedzname or service not knownzno route to hostznetwork is unreachablerx  zconnection resetzincomplete chunked readzpeer closed connectionzresponse ended prematurelyzunexpected eofÚremoteprotocolerrorÚlocalprotocolerror)rC  rD  r‡   r#   r{  rv  r2   rK  rá   r8   rK   rT  )r  r{  rv  s      r%   Ú_is_connection_errorr�  »  s�   € ä	×	Ñ	œ[Ó	)ñ ß>Ü�cÐ.°Ð@ÔAØ÷ð àA÷ô ”T˜#“Y×'Ñ'Ð)PÔQØÜœ˜S›Ÿ™Ó)ð ,ó ð ÷ð ús   šBÂBc                 óº   — t        | «      ryt        | dd«      xs t        t        | dd«      dd«      }t        |t        «      xr |dk(  xs d|cxk  xr dk  S c S )zßOne-off transport blip worth retrying on the SAME provider: connection/stream-close errors plus pure 5xx/408.

    Deliberately narrow: payment/auth/rate-limit errors switch provider, refresh creds, or rotate the pool.
    TrU  Nr€  i˜  iô  r1  )r�  rP   r2   r  r[  s     r%   Ú_is_transient_transport_errorrƒ  Ì  sb   € ô
 ˜CÔ ØÜ�S˜-¨Ó.Òn´'¼'À#ÀzÐSWÓ:XÐZgÐimÓ2n€FÜ�fœcÓ"ÒM¨°#©Ò(L¸ÀÖ9LÈÑ9LÐMÑ9LÐMr'   r�  g      ð?c                  óª   — 	 ddl m} m}  |  |«       dd«      }|€t        S t	        dt        t        |«      d«      «      S # t        $ r	 t        cY S w xY w)zšSame-provider retries for a transient blip: ``auxiliary.transient_retries``
    (default 2), clamped to [0, 6]; config-read failures fall back to default.r   rò  r  Útransient_retriesé   )r{   ró  rô  Ú_DEFAULT_TRANSIENT_RETRIESrZ  r�  r  r}   )ró  rô  rÝ   s      r%   Ú_transient_retry_countrˆ  Û  sS   € ð*ß:Ù‘k“m [Ð2EÓFˆØ-0¨[Ô)ÐV¼cÀ!ÄSÌÈSËÐSTÓEUÓ>VÐVøÜò *Ü)Ò)ð*ús   ‚A  ¡A  Á AÁAc                 óÐ   — t        | dd«      }|dk(  ryt        | «      j                  «       }d|v s%dt        | «      j                  j                  «       v ryd|v xr |dk(  xs d	|v S )
z<Auth failures that should trigger provider-specific refresh.rU  Né‘  Tzerror code: 401Úauthenticationerrorzbad-credentialsrW  Úunauthenticated)rP   rK   rT  rá   r8   ©r  r\  rs  s      r%   Ú_is_auth_errorrŽ  æ  sp   € ä�S˜-¨Ó.€FØ�‚}ØÜ�C“—‘Ó €IØ˜IÑ%Ð)>Ä$ÀsÃ)×BTÑBT×BZÑBZÓB\Ñ)\Øà 	Ð)Ò_¨v¸©}Ò/^Ð@QÐU^Ð@^Ð_r'   Úparamc                 óŽ   — |xs dj                  «       }|syt        | «      j                  «       }||v xr t        |t        «      S )zªProvider 400 for an unsupported request parameter: the parameter name plus a generic
    unsupported/unknown/unrecognized marker, so call sites can retry without the key.rJ   F)rT  rK   rK  r   )r  r�  Úparam_lowerrs  s       r%   Ú_is_unsupported_parameter_errorr’  ò  sD   € ð ’;˜B×%Ñ%Ó'€KÙØÜ�C“—‘Ó €IØ˜)Ð#Ò[¬°iÔAZÓ([Ð[r'   c                 óè   — t        | dd«      }|�|dvryt        | «      j                  «       }t        |d«      ryd|v r	d|v sd	|v ryd|v rd
|v ryd|v rd|v ryt	        | d«      xs t	        | d	«      S )a:  Provider 400/422 rejecting the structured-output field, on either wire: OpenAI ``response_format``
    (incl. vLLM's ``guided_grammar``/xgrammar failures) or Anthropic ``output_config.format`` ("Extra inputs
    are not permitted"). Callers tolerate an unconstrained reply, so the reaction is one retry without it.rU  N¾   é¦  é�  F)Úguided_grammarÚxgrammarÚcompile_grammar_errorTzextra inputs are not permittedrR  rX  ÚunavailablerT  )rP   rK   rT  rK  r’  r�  s      r%   Ú_is_structured_output_rejectionr›  ü  s�   € ô �S˜-¨Ó.€FØÐ˜f¨JÑ6ØÜ�C“—‘Ó €Iä�YÐ WÔXØØ'¨9Ñ4Ø˜YÑ&¨/¸YÑ*FàØ˜IÑ%¨-¸9Ñ*DØð
 ˜IÑ%¨-¸9Ñ*DØÜ*¨3Ð0AÓBÒ{ÔFeÐfiÐkzÓF{Ð{r'   c                 ó,  — t        | «      }|j                  dd«      du}|j                  d«      }t        |t         «      rId|v rE|j	                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}|r||d<   n|j                  dd«       d}|r|S dS c c}}w )zœCopy *kwargs* without ``response_format`` (top-level and ``extra_body``); None when nothing was
    removed, so call sites don't retry an unchanged request.rR  Nrè  T)rÜ   r*  r|   r2   r6  ©r/   Úretry_kwargsÚchangedrè  r8  r9  r»  s          r%   Ú!_without_structured_output_formatr     s¨   € ô ˜“<€LØ×ÑÐ0°$Ó7¸tÐC€GØ×!Ñ! ,Ó/€JÜ�*œdÔ#Ð(9¸ZÑ(GØ&0×&6Ñ&6Ó&8×S™d˜a ¸AÐARÓ<R�Q˜‘TÐSˆ	ÑSÙØ)2ˆL˜Ò&à×Ñ˜\¨4Ô0ØˆÙ"ˆ<Ð,¨Ð,ùó Ts   ÁBÁ&Bc                 óR   — t        | dd«      }|�|dvryt        t        | «      «      S )aß  Provider 400 rejecting a reasoning wire control by name (``reasoning_effort``, ``reasoning``,
    ``thinking``/``think``). Chat-only models behind OpenAI-compatible relays reject the top-level
    ``reasoning_effort: none`` a disabled ``reasoning_config`` projects on the custom profile
    ("Unrecognized request argument supplied: reasoning_effort", #112781); the route default is
    the right answer for such a model, so the reaction is one retry without any reasoning field.rU  Nr”  F)rP   r   rK   r[  s     r%   Ú_is_reasoning_field_rejectionr¢  &  s1   € ô �S˜-¨Ó.€FØÐ˜f¨JÑ6ØÜ'¬¨C«Ó1Ð1r'   c                 óR   — t        | dd«      }|�|dvryt        t        | «      «      S )a!  Provider 400 refusing to switch reasoning OFF ("Reasoning is mandatory for this endpoint and cannot
    be disabled"): the field is understood, only the disable is refused, so the rung steps the effort up to
    the floor instead of dropping the field (agent/auxiliary_reasoning_floor.py).rU  Nr”  F)rP   r   rK   r[  s     r%   Ú _is_reasoning_required_rejectionr¤  2  s1   € ô �S˜-¨Ó.€FØÐ˜f¨JÑ6ØÜ*¬3¨s«8Ó4Ð4r'   c                 óÒ  — t        | «      }|j                  dd«      du}|j                  dd«      duxs |}|j                  d«      }t        |t         «      r„|j	                  «       D ��ci c]6  \  }}t        |«      j                  «       j                  «       t        vsŒ4||“Œ8 }}}t        |«      t        |«      k7  r|r||d<   n|j                  dd«       d}|r|S dS c c}}w )zúCopy *kwargs* without reasoning wire controls (top-level ``reasoning_effort``, the adapter's
    private ``_reasoning_config`` and every ``extra_body`` reasoning key); None when nothing was
    removed, so call sites don't retry an unchanged request.Úreasoning_effortNrm  rè  T)
rÜ   r*  r|   r2   r6  rK   rS  rT  Ú_PROFILE_REASONING_KEYSr3  r�  s          r%   Ú_without_reasoning_fieldsr¨  <  sà   € ô ˜“<€LØ×ÑÐ1°4Ó8ÀÐD€GØ×ÑÐ2°DÓ9ÀÐEÒPÈ€GØ×!Ñ! ,Ó/€JÜ�*œdÔ#Ø&0×&6Ñ&6Ó&8×r™d˜a ¼CÀ»F¿L¹L»N×<PÑ<PÓ<RÔZqÒ<q�Q˜‘TÐrˆ	ÑrÜˆy‹>œS ›_Ò,ÙØ-6�˜\Ò*à× Ñ  ¨tÔ4ØˆGÙ"ˆ<Ð,¨Ð,ùó ss   Á,5C#Â"C#c                 óŠ   — t        | dd«      }t        | «      j                  «       }t        |d«      ry|dvryt        |d«      S )u»   "Requested model doesn't exist" (404 / invalid model) â€” typically a long-lived process pinned a
    since-dropped model. Excludes billing keywords, which :func:`_is_payment_error` owns.rU  N)	rL  rM  rO  rg  rh  ri  ú	free tierú	free-tierrk  F>   Nr–  rX  )	zmodel does not existz#does not exist in our configurationzopenrouter catalogzis not a valid modelzno such modelzmodel not foundzthe model `Úmodel_not_foundzunknown model)rP   rK   rT  rK  r�  s      r%   Ú_is_model_not_found_errorr­  O  sV   € ô �S˜-¨Ó.€FÜ�C“—‘Ó €IÜ�Yð !ô ð ØÐ%Ñ%ØÜ˜ð %ó ð r'   c                 ó¢   — t        | dd«      }|dvryt        | «      j                  «       }t        | «      ryt	        |d«      ryt	        |d«      S )a  "This route cannot serve this model" 400 (capability mismatch, e.g. a Codex/ChatGPT-account
    fallback asked to run a non-OpenAI model). Auth/payment predicates don't fire, so this keeps the
    chain going instead of aborting. Excludes billing 400s and not-found 400s.rU  N>   Nr–  F)rL  rM  rO  rg  rh  ri  rf  rª  r«  rk  rj  Úquota)zis not supported when usingzmodel is not supportedznot supported with thisznot supported for this accountÚmodel_not_supportedzdoes not support this modelzunsupported model)rP   rK   rT  r­  rK  r�  s      r%   Ú_is_model_incompatible_errorr±  c  s`   € ô �S˜-¨Ó.€FØ�[Ñ ØÜ�C“—‘Ó €IÜ  Ô%Øä�Yð !ô ð
 Ü˜ð %ó ð r'   c                 óv   — t        | t        «      syt        | «      j                  «       }d|v xr
 d|v xr d|v S )ud   HTTP-200 empty/malformed ChatCompletions â€” a capability failure routed like model incompatibility.Fz
auxiliary zllm returned invalid responsezchoices[0].message)r2   rF   rK   rT  )r  r  s     r%   Ú_is_invalid_aux_response_errorr³  {  sA   € ä�cœ<Ô(ØÜ
ˆc‹(�.‰.Ó
€CØ˜3ÐÒiÐ#BÀcÐ#IÒiÐNbÐfiÐNiÐir'   >   r/  ÚcompressionrÞ  c                 óJ   — | t         v xr t        |«      xr dt        |«      vS )uH  True when a transient error on a critical-path task should go straight to fallback.

    Carve-out: a fast first-token fail (dead stream within the no-progress window, zero output â€”
    see ``_timeout_message``) is cheap and keeps the same-provider retry; mid-stream stalls and
    hard-ceiling timeouts skip to fallback.
    zno-progress timeout)Ú_TIMEOUT_NO_RETRY_TASKSry  rK   )rà  r  s     r%   Ú _should_skip_same_provider_retryr·  �  s-   € ð Ô*Ð*ÒoÔ/@ÀÓ/EÒoÐJ_ÔgjÐknÓgoÐJoÐor'   c           
      ó  — t        | «      }t        «       }t        5  t        D �cg c]&  }|d   |k(  rt        t	        |d   «      «      |k(  r|‘Œ( c}D ]  }t        j                  |d«       Œ 	 ddd«       yc c}w # 1 sw Y   yxY w)a\  Drop this profile's cached auxiliary clients for a provider so fresh creds are used.

    Scoped to the calling profile (``hermes_home_key()`` is the first key slot): a rotation in
    one profile must not drop another profile's client for the same provider in a multiplexing
    gateway, since that profile's credentials did not change. Entries are popped, not closed:
    a concurrent caller may be mid-request on the shared client (closing it raises ReadError /
    "client has been closed" for them); the dropped client is retired by GC like the FIFO
    overflow path in ``_get_cached_client``.
    r   rO  N)r[  re   Ú_client_cache_lockÚ_client_cacherK   r*  )rJ  rX  ÚhomerØ   s       r%   Ú_evict_cached_clientsr¼  —  s�   € ô )¨Ó2€JÜÓ€DÜ	ñ )Ü#0ö ^˜CØ˜1‘v ’~Ô*AÄ#ÀcÈ!ÁfÃ+Ó*NÐR\Ò*\ò ò ^ò 	)ˆCä×Ñ˜c 4Õ(ñ	)÷)ð )ùò^÷)ð )ús   œ	A=¥+A8ÁA=Á8A=Á=Bc                 óæ   — | €yd}t         5  t        t        j                  «       «      D ].  \  }}|�|d   nd}|€Œ|| u st	        |dd«      | u sŒ&t        |= d}Œ0 	 ddd«       |S # 1 sw Y   |S xY w)a"  Drop cache entries whose stored client (or its ``_real_client``) is *target*; True if any evicted.

    Used when a cached client is poisoned (closed transport after a timeout). Async wrappers must
    expose the same ``_real_client`` as their sync sibling or the async entry survives.
    NFr   rG  T)r¹  r  rº  r6  rP   )r  ÚevictedrØ   rE  Úcacheds        r%   r°  r°  ©  s�   € ð €~ØØ€GÜ	ñ Üœ}×2Ñ2Ó4Ó5ò 	‰JˆC�Ø!&Ð!2�U˜1’X¸ˆFØÑ! v°Ñ'7¼7À6È>Ð[_Ó;`ÐdjÒ;jÜ! #Ð&Ø‘ñ		÷ð €N÷ð €Nús   Œ/A&¼A&ÁA&Á&A0c                 óê  — |�t        |«      fD �cg c]  }|sŒ|‘Œ	 c}ng }|s?	 t        | dd«      }t        |«      r |«       ng }t        d„ d„ |xs dD «       D «       «      }|syt        j                  d¬	«      }|D ]3  }|j                  |j                  d
«      «       |j                  d«       Œ5 |j                  «       S c c}w # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)a'  Secret-safe digest over the runtime key(s) backing the cache hint.

    When ``entry`` (the peeked selection) carries a key, only THAT key is digested: rotating a
    sibling account must not churn this entry's cached client. Otherwise every pool entry
    contributes, taken WITHOUT availability filters (``pool.entries()``, not ``peek()``): an entry
    benched by a per-model cooldown still counts, so a token rotated while the cooldown is active
    changes the digest too (#113022 point 5). Only the blake2b of the keys enters the cache key.
    NÚentriesz<Auxiliary client: could not list pool entries for digest: %srJ   c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr,   r*   )ræ   r8  s     r%   rè   z*_pool_credential_digest.<locals>.<genexpr>Ì  s   è ø€ ÒX˜AÒVW”aÑXùs   ‚Šc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr,   )rH  )ræ   rÈ  s     r%   rè   z*_pool_credential_digest.<locals>.<genexpr>Ì  s   è ø€ Ò!R¸qÔ"7¸×":Ñ!Rùrµ  r*   é   ©Údigest_sizeúutf-8ó    )rH  rP   rª   r}   rŠ   r²   rÂ  ÚhashlibÚblake2brF  ÚencodeÚ	hexdigest)	r9  rE  r8  ÚkeysÚ
entries_fnrÁ  r  ÚdigestrØ   s	            r%   Ú_pool_credential_digestrÐ  »  sê   € ð AFÐ@QÔ-¨eÓ4Ð6Ö<�!º!ŠAÓ<ÐWY€DÙð	Ü   y°$Ó7ˆJÜ&.¨zÔ&:‘j”lÀˆGô ÑXÑ!RÀGÂMÈrÔ!RÔXÓXˆÙØÜ�_‰_¨Ô,€FØò ˆØ�‰�c—j‘j Ó)Ô*Ø�‰�eÕðð ×ÑÓÐùò =øô
 ò 	Ü�L‰LÐWÐY\Ô]Üûð	ús!   ‘C™C¥!C	 Ã		C2ÃC-Ã-C2©r×  c                óR  — t        | «      }|dk(  r1t        |«      }t        |j                  d«      xs
 t        «       «      }|dv ryt	        |d«      }|€yt        ||«      }t        ||«      }|�(t        t        |dd«      xs d«      j                  «       nd}|s|sy|› d|› d|› �S )aó  Return a cache discriminator that follows the pooled credential, not just its entry id.

    ``<provider>:<entry id>:<digest of that entry's key>`` when ``peek()`` names an entry,
    ``<provider>::<digest of every entry's key>`` when every entry is filtered out (cooldown)
    but keyed entries exist. A token rotated or
    refreshed by another process yields a new client instead of a 401 round trip on the cached
    one; the stale entry ages out through the non-closing FIFO cap (#113022).
    rL  rJ  >   rJ   rL  r;  rJ   z (cache hint)rô   rN  )
r[  rý  r|   rW  r:  rD  rÐ  rK   rP   rS  )rJ  r×  rX  r  r9  rE  rÏ  Úentry_ids           r%   Ú_pool_cache_hintrÔ  Ö  s¼   € ô )¨Ó2€JØ�VÒÜ)¨,Ó7ˆÜ,¨W¯[©[¸Ó-DÒ-]ÔH[ÓH]Ó^ˆ
ØÐ+Ñ+ØÜ& z°?ÓC€DØ€|ØÜ˜Z¨Ó.€EÜ$ T¨5Ó1€FØ>CÐ>OŒs”7˜5 $¨Ó+Ò1¨rÓ2×8Ñ8Ô:ÐUW€HÙ™FØØˆ\˜˜8˜* A f XÐ.Ð.r'   )©zchatgpt.comrQ  )ræ  rþ  ©úinference-api.nousresearch.comr§  ©rP  rÛ  )rÖ  rô  )r1  r×  ©zapi.x.airÝ  ))úapi.githubcopilot.comrô  rÕ  rØ  rÖ  rÙ  Útablec                 ó8   — |D ]  \  }}t        | |«      sŒ|c S  y)zGFirst provider in ``table`` whose host matches ``base_url``, else None.N)rf   )rA   rÛ  r%  rJ  s       r%   Ú_provider_for_hostrÝ  ÿ  s)   € àò ‰ˆˆhÜ  ¨4Õ0ØŠOðð r'   Úresolved_providerc                 ó¨  — t        | «      }t        t        |dd«      xs d«      }t        |«      }t        |j	                  d«      xs d«      }|j	                  d«      }t        |dd«      }|ro|rm||j	                  d«      k(  rYt        |t        «      rI|rG||k(  rBt        |«      t        |«      k7  r+t        j                  d|t        |«      t        |«      «       y|dvr|S t        |t        «      }	|	�|	S |rÍt        |«      }|j	                  dd«      }
|
r®|
dvrªt        j                  t        «      5  dd	lm} |j	                  |
«      }|rnt        |d
d«      dk(  r^t        |j	                  d«      xs t        |dd«      xs d«      j#                  d«      }|r t%        |t        |«      «      r|
cddd«       S ddd«       yy# 1 sw Y   yxY w)u@  Infer which provider pool can recover the current auxiliary client.
    None when the client targets a different host than the session's configured endpoint for that
    provider: a rejection there says nothing about the key, so rotating/quarantining it would kill a
    working credential (Miho report â€” proxy users).rA   rJ   r@   NrJ  u’   Auxiliary: %s rejected the session key at %s, but the session's endpoint is %s â€” endpoint mismatch, not a dead key; skipping credential rotation>   rJ   rL  r;  r   )rñ  rú  rM  r_  )r[  rK   rP   rý  r|   r2   rh   rŠ   r¯  rg   rÝ  Ú_POOL_PROVIDER_BY_HOSTrC  rD  r}   rE  rñ  rÀ  rf   )rÞ  rŒ   r×  rX  Úbaser  Úrt_baseÚrt_keyÚ
client_keyÚknownÚrt_providerrñ  r  s                r%   Ú_recoverable_pool_providerrç    sÃ  € ô )Ð):Ó;€JÜŒw�v˜z¨2Ó.Ò4°"Ó5€DÜ% lÓ3€GÜ�'—+‘+˜jÓ)Ò/¨RÓ0€GØ�[‰[˜Ó#€FÜ˜ ¨DÓ1€Jñ 	‘˜Z¨7¯;©;°zÓ+BÒBÜ˜6¤3Ô'©F°zÀVÒ7KÜ Ó%¬¸Ó)AÒAÜ�‰ð VàÔ 1°$Ó 7Ô9JÈ7Ó9Sô	Uð ØÐ/Ñ/ØÐÜ˜tÔ%;Ó<€EØÐØˆñ Ü)¨,Ó7ˆØ—k‘k *¨bÓ1ˆÙ˜;Ð.DÑDÜ×$Ñ$¤YÓ/ñ 	+Ý=Ø+×/Ñ/°Ó<�Ùœw w°¸TÓBÀiÒOô " '§+¡+¨jÓ"9Ò"m¼WÀWÐNbÐdfÓ=gÒ"mÐkmÓn×uÑuÐvyÓz�GÙÔ#8¸Ô?PÐQXÓ?YÔ#ZØ*÷	+÷ 	+ñ 	+ñ ÷	+ð ús   Ä6A>GÇG©Úfailed_api_keyré  c                óÂ  ‡‡‡‡‡— t        | «      Š	 t        ‰«      Š‰r‰j                  «       syt        ‰dd«      Šdt        dt        fˆˆˆˆˆfd„}t        ‰«      r$‰j                  «       �t        ‰«       y |d	«      S t        ‰«      r |d
«      S t        ‰«      rt        ‰«      s |d«      S y# t        $ r!}t        j	                  d‰|«       Y d}~yd}~ww xY w)zàTry same-provider credential-pool recovery for auxiliary calls.

    ``failed_api_key`` lets mark_exhausted_and_rotate identify the right pool entry even if
    another process already rotated (current() would be None).
    z9Auxiliary client: could not load pool for %s recovery: %sNFrU  Úfallback_statusr!   c                 ó‚   •— dt        ‰«      i}‰�‰|d<   ‰j                  ‰�‰n| |‰xs d ¬«      }|€yt        ‰«       y)Nre  rU  )rU  Úerror_contextÚapi_key_hintFT)rK   Úmark_exhausted_and_rotater¼  )rë  rí  Ú
next_entryr  ré  rX  r9  rU  s      €€€€€r%   Ú_rotatez'_recover_provider_pool.<locals>._rotateF  s`   ø€ Ø)2´C¸³HÐ(=ˆØÐ"Ø+6ˆM˜-Ñ(Ø×3Ñ3Ø'2Ð'>™ÀOØ'°nÒ6LÈð 4ó 
ˆ
ð ÐØÜ˜jÔ)Ør'   TrŠ  rV  rY  )r[  rV   r}   rŠ   r²   r8  rP   r  rO   rŽ  rË  r¼  r]  rt  rn  )rJ  r  ré  Úload_excrñ  rX  r9  rU  s    ``  @@@r%   Ú_recover_provider_poolró  6  sÜ   ü€ ô )¨Ó2€JðÜ˜Ó$ˆñ �t×+Ñ+Ô-ØÜ˜#˜}¨dÓ3€Kð¤ð ¬÷ ñ ô �cÔØ×#Ñ#Ó%Ð1Ü! *Ô-ØÙ�s‹|ÐÜ˜ÔÙ�s‹|ÐÜ˜CÔ Ô)=¸cÔ)BÙ�s‹|ÐØøô; ò Ü�‰ÐPÐR\Ð^fÔgÜûðús   ’B4 Â4	CÂ=CÃC)rö  Úresolved_modelÚresolved_base_urlÚresolved_api_keyÚresolved_api_moder"  rÜ  rl  rj  rØ  Úeffective_timeoutÚeffective_extra_bodyrp  rö  c                 ó‚  — | dk(  rt        |||||¬«      \  }}}n!t        |||||||¬«      \  }}t        ||«      }|€t        d| xs d› d|› d�«      ‚t	        t        |dd	«      xs d	«      }t        |xs ||xs |||	|
|||||xs || ¬
«      }|rt        |«      |d<   t        ||«      rt        |d   «      |d<   ||fS )zURebuild (client, request kwargs) for a same-provider retry after credential recovery.r/  )rJ  r]  rA   r@   r�   )r�   rA   r@   r   r×  ú
Auxiliary r@  z: provider z$ could not be rebuilt after recoveryrA   rJ   ©rl  rj  rØ  r²  rè  rp  rA   rà  rö  rÜ  )
Úresolve_vision_provider_clientÚ_get_cached_clientÚ_effective_provider_for_clientrF   rK   rP   Ú_build_call_kwargsrÜ   Ú_is_anthropic_compat_endpointÚ#_convert_openai_images_to_anthropic)rà  rÞ  rô  rõ  rö  r÷  r×  r"  rÜ  rl  rj  rØ  rø  rù  rp  r�   rö  Úeffective_providerÚretry_clientÚretry_modelÚ
retry_baserž  s                         r%   Ú_prepare_same_provider_retryr  _  s  € ð ˆxÒÜ8VØ&¨kÐDUØ$°ô9
Ñ5Ð˜L©+ô
 %7Ø˜~¸*ÐO`Ø$Ð/@È|ô%
Ñ!ˆ�kô <¸LÐJ[Ó\ÐØÐÜØ˜š Ð(¨Ð4EÐ3FÐFjÐkó
ð 	
ô ”W˜\¨:°rÓ:Ò@¸bÓA€JÜ%ØÒ/Ð/°Ò1KÀÈXØ¨J¸eÐM^Ø'Ð:JØÒ0Ð0°tô	€Lñ ô
 )-¨]Ó(;ˆ�_Ñ%Ü$Ð%6¸
ÔCÜ#FÀ|ÐT^ÑG_Ó#`ˆ�ZÑ Ø˜Ð%Ð%r'   c                 óZ   — t        d|| |ddœ|¤Ž\  }}t        t        ||| |¬«      |«      S )NF©rà  rÞ  r÷  r�   rŒ  r*   )r  Ú_validate_llm_responser®  ©rÞ  r÷  rà  Úprepr  rž  s         r%   Ú_retry_same_provider_syncr  ‹  sL   € Ü!=ð "ØÐ%6ÐJ[Ðhmñ"Øquñ"Ñ€L�,ô "Ü˜|¨\ÐDUÐ`qÔrÐtxóð r'   c              ‹   óv   K  — t        d|| |ddœ|¤Ž\  }}t        t        ||| |¬«      ƒ d {  –—† |«      S 7 Œ	­w)NTr	  rŒ  r*   )r  r
  r¶  r  s         r%   Ú_retry_same_provider_asyncr  ”  sV   è ø€ Ü!=ð "ØÐ%6ÐJ[Ðhlñ"Øptñ"Ñ€L�,ô "Ü% l°LÐK\ÐgxÔy×yØóð Øyús   ‚+9­7®
9c                 ón   — t        t        | j                  dd«      xs d«      j                  «       «      S )Nr@   rJ   )rO   rK   r|   rS  )rÄ  s    r%   Ú_creds_have_api_keyr  ž  s+   € Ü”�E—I‘I˜i¨Ó,Ò2°Ó3×9Ñ9Ó;Ó<Ð<r'   c                  ó¬   — ddl m} m}m}m}  |«       \  }}t        |xs d«      j                  «       sy| j                   ||«      d «        ||«       y)Nr   )Ú
_jwt_cacheÚ_token_fingerprintÚexchange_copilot_tokenÚresolve_copilot_tokenrJ   FT)r  r  r  r  r  rK   rS  r*  )r  r  r  r  Ú	raw_tokenÚ_sources         r%   Ú_refresh_copilot_credentialsr  ¢  sL   € ßuÓuÙ.Ó0Ñ€IˆwÜˆyŠ˜BÓ×%Ñ%Ô'ØØ‡N�NÑ% iÓ0°$Ô7Ù˜9Ô%Ør'   c                  ó2   — ddl m}  t         | d¬«      «      S )Nr   ©Ú!resolve_codex_runtime_credentialsTrÄ  )rE  r  r  r  s    r%   Ú_refresh_codex_credentialsr  ¬  s   € ÝAÜÑ@ÈtÔTÓUÐUr'   c                  óH   — ddl m}  t         | t        dd«      d¬«      «      S )Nr   rÑ  rÓ  rÔ  T)rÕ  rÅ  )rE  rÒ  r  ri   rÑ  s    r%   Ú_refresh_nous_credentialsr  ±  s(   € Ý@ÜÑ?Ü!Ð"?ÀÓDÐTXô ó ð r'   c                 ó  — ddl m}m} | }|syt        d«      }|j	                  |«      r|j                  |¬«      d uS  |«       }t        |t        «      r6|j                  d«      |k(  r"|j                  d«      rt         ||«      «      S y)Nr   )Úread_claude_code_credentialsÚ_refresh_oauth_tokenFrÛ  )rî  ÚaccessTokenÚrefreshToken)
r  r!  r"  rV   Úentry_id_for_api_keyÚtry_refresh_matchingr2   rÜ   r|   rO   )ré  r!  r"  rÂ  r9  rÄ  s         r%   Ú_refresh_anthropic_credentialsr'  ¸  sƒ   € ß^Ø€EÙØÜ�[Ó!€DØ× Ñ  Ô'Ø×(Ñ(°eÐ(Ó<ÀDÐHÐHÙ(Ó*€Eä�%œÔ 5§9¡9¨]Ó#;¸uÒ#DÈÏÉÐSaÔIbÜÑ(¨Ó/Ó0Ð0Ør'   c                  ó  — t        d«      } | r[| j                  «       rK| j                  «        | j                  «       }|�)t	        t        |dd«      xs d«      j                  «       ryddlm} t         |d¬«      «      S )zAPool-level refresh first, then the singleton auth-store resolver.rÝ  rG  rJ   Tr   râ  rÄ  )
rV   r8  r=  rË  rK   rP   rS  rE  rã  r  )r9  rÌ  rã  s      r%   Ú_refresh_xai_oauth_credentialsr)  Ç  so   € ä�[Ó!€DÙ�×$Ñ$Ô&Ø�‰ŒØ×,Ñ,Ó.ˆ	ØÐ ¤S¬°Ð<MÈrÓ)RÒ)XÐVXÓ%Y×%_Ñ%_Ô%aØÝEÜÑDÐSWÔXÓYÐYr'   c                  óÀ   — ddl m}   | «       \  }}t        t        |t        «      xr4 |j                  «       xr" t        |t        «      xr |j                  «       «      S )z¦Mirrors run_agent's Vertex refresh; the cache key ignores the rotating bearer, so
    without the eviction that follows, a ~1h-expired aux Vertex client 401s forever.r   )Úget_vertex_config)Úagent.vertex_adapterr+  rO   r2   rK   rS  )r+  rÂ  rA   s      r%   Ú_refresh_vertex_credentialsr-  Ó  sL   € õ 7Ù'Ó)�O€Eˆ8Ü”
˜5¤#Ó&Òk¨5¯;©;«=Òk¼ZÈÔRUÓ=VÒkÐ[c×[iÑ[iÓ[kÓlÐlr'   )rô  rQ  r§  rÛ  rÝ  ÚvertexÚ_CREDENTIAL_REFRESHERSc                óè   — t        | «      }t        j                  |«      }|€y	 |dk(  r	 ||«      s	y |«       syt        |«       y# t        $ r!}t
        j                  d||«       Y d}~yd}~ww xY w)zERefresh short-lived credentials for OAuth-backed auxiliary providers.NFrÛ  Tz7Auxiliary provider credential refresh failed for %s: %s)r[  r/  r|   r¼  r}   rŠ   r²   )rJ  ré  rX  Ú	refresherr  s        r%   Ú_refresh_provider_credentialsr2  ã  sy   € ä(¨Ó2€JÜ&×*Ñ*¨:Ó6€IØÐØðØ-7¸;Ò-F‘	˜.Ô)Øñ MVÌKØÜ˜jÔ)ØøÜò Ü�‰ÐNÐPZÐ\_Ô`Üûðús!   ¥A ³A »A Á	A1ÁA,Á,A1Úclient_base_urlr  c                 ó€   — t        | «      }|r|dk7  r|S t        |t        «      }|r|t        |«      › d�k(  r|S |xs |S )z¨Provider whose short-lived credentials should be refreshed; auto-routed calls keep
    ``resolved_provider == "auto"``, so infer the backend from the client's base URL.rL  z-oauth)r[  rÝ  Ú_AUTH_REFRESH_PROVIDER_BY_HOST)rÞ  r3  r  rX  Úhost_providers        r%   Ú _auth_refresh_provider_for_router7  ó  sY   € ô
 )Ð):Ó;€JÙ�j FÒ*ØÐÜ& Ô8VÓW€Mñ ˜Ô-DÐEWÓ-XÐ,YÐY_Ð*`Ò`ØÐØÒ&˜JÐ&r'   Úfb_labelc                 ó  — | r|syt        j                  d|«      }|sy	 t        | «      j                  d«      }t	        |t
        «      r|t        |j                  d«      «         nd}t	        |t        «      r|S dS # t        $ r Y yw xY w)z»Resolve the ``fallback_chain`` entry a ``fallback_chain[<i>](<provider>)`` label points at,
    or None when the label is not a configured-chain candidate or the index no longer resolves.Nzfallback_chain\[(\d+)\]Úfallback_chainrO  )
r£  Úmatchrä  r|   r2   r  r  Úgroupr}   rÜ   )rà  r8  r´  ÚchainrE  s        r%   Ú_fallback_chain_entryr>    s‰   € ñ ‘xØÜ
�‰Ð+¨XÓ6€AÙØðÜ*¨4Ó0×4Ñ4Ð5EÓFˆÜ*4°U¼DÔ*A�”c˜!Ÿ'™' !›*“oÒ&Àtˆô ˜u¤dÔ+ˆ5Ð5°Ð5øô ò Ùðús    A	A= Á=	B	ÂB	Úrawc                 óp   — t        | t        t        f«      r t        | t        «      s| dkD  rt        | «      S y)zYCoerce a config ``timeout`` to a positive float, or None (rejects bools, which are ints).r   N)r2   r  r  rO   ©r?  s    r%   Ú_coerce_positive_timeoutrB    s,   € ä�#œœU�|Ô$¬Z¸¼TÔ-BÀsÈQÂwÜ�S‹zÐØr'   c                 ó^   — t        | |«      }t        |r|j                  d«      «      S d«      S )uZ  Per-entry ``timeout`` for a configured fallback candidate, or None (keep the task-level
    timeout). Inheriting the primary's deadline used to kill healthy-but-slower fallbacks.

    A fallback candidate previously inherited the exact timeout the primary provider was called with. When
    that deadline was tuned for the primary (or the primary simply consumed its whole budget before failing
    over), the fallback aborted on the same clock even when independently healthy â€” a 163k-token compression
    that needs ~90s on the fallback died at the primary's 30s deadline every turn (#62452).
    r²  N)r>  rB  r|   )rà  r8  rE  s      r%   Ú_fallback_entry_timeoutrD    s.   € ô " $¨Ó1€EÜ#¹E E§I¡I¨iÓ$8ÓLÐLÀtÓLÐLr'   c                 ó²   — t        j                  d| xs d«      }|r|j                  d«      j                  «       S t	        | xs d«      j                  «       S )z>Recover the provider identifier from a fallback display label.zJ(?:fallback_chain\[\d+\]|fallback_providers\[\d+\]|main-agent)\(([^)]+)\)$rJ   rO  )r£  r;  r<  rS  rK   )rÄ   r;  s     r%   Ú_fallback_provider_from_labelrF  '  sJ   € ä�H‰HÐbÐdiÒdoÐmoÓp€EÙ%*ˆ5�;‰;�q‹>×ÑÓ!ÐH´°E²K¸RÓ0@×0FÑ0FÓ0HÐHr'   c                   óB   — e Zd ZU eed<   eed<   ee   ed<   ee   ed<   y)Ú_FallbackDestinationrJ  rA   r   r]  N)r8   r9   r:   rK   Ú__annotations__r	   r*   r'   r%   rH  rH  -  s    … ØƒMØƒMØ�s‰mÓØ�C‰=Ôr'   rH  c                 ó,  — |syt        |«      rd}nkt        j                  t        «      5  ddlm}  || |xs d |xs d¬«      }t        |j                  d«      xs d«      j                  «       xs d }d d d «       t        | |||«      S # 1 sw Y   ŒxY w)Nrt  r   rß  rJ   )rá  r  r  r   )
rŸ  rC  rD  r}   rè  rà  rK   r|   rS  rH  )rJ  rA   r   r]  rà  r  s         r%   Ú_complete_fallback_destinationrK  4  s–   € ñ Ü.¨xÔ8Ø+‰Hä×$Ñ$¤YÓ/ñ NÝPÙ2Ø&¸(Ò:JÀdÐY^ÒYdÐbdô�ô ˜wŸ{™{¨:Ó6Ò<¸"Ó=×CÑCÓEÒMÈ�÷Nô   ¨(°H¸eÓDÐD÷Nð Nús   ªA
B
Â
BÚ	fb_clientÚfb_modelc                 óÚ  — t        | j                  d«      xs d«      j                  «       }t        | j                  d«      xs t        |dd«      xs d«      j                  «       }t        | j                  d«      xs | j                  d«      xs d«      j                  «       xs d }|xs0 t        | j                  d«      xs d«      j                  «       xs d }t	        ||||«      S )NrJ  rJ   rA   r   Ú	transportr]  )rK   r|   rS  rP   rK  )rE  rL  rM  rJ  rA   r   r]  s          r%   Ú _fallback_destination_from_entryrP  D  sÆ   € ô �5—9‘9˜ZÓ(Ò.¨BÓ/×5Ñ5Ó7€HÜ�5—9‘9˜ZÓ(ÒT¬G°I¸zÈ2Ó,NÒTÐRTÓU×[Ñ[Ó]€HÜ�5—9‘9˜ZÓ(ÒH¨E¯I©I°kÓ,BÒHÀbÓI×OÑOÓQÒYÐUY€HØÒEœ˜EŸI™I gÓ.Ò4°"Ó5×;Ñ;Ó=ÒEÀ€EÜ)¨(°H¸hÈÓNÐNr'   c           
      óÔ   — t        |dd«      }t        |t        «      r|S t        | |«      }|�t	        |||«      S t        t        |«      t        t        |dd«      xs d«      d|«      S )z^Route identity of a fallback request: attached destination, else configured entry, else label.Ú_hermes_fallback_destinationNrA   rJ   )rP   r2   rH  r>  rP  rK  rF  rK   )rà  rL  rM  r8  ÚattachedrE  s         r%   Ú_fallback_destinationrT  N  sv   € ô �yÐ"@À$ÓG€HÜ�(Ô0Ô1ØˆÜ! $¨Ó1€EØÐÜ/°°yÀ(ÓKÐKÜ)Ü% hÓ/´´W¸YÈ
ÐTVÓ5WÒ5]Ð[]Ó1^Ð`dÐfnóð r'   Údestinationc          
      óš   — ddl m}m}  || ||j                  |j                  |j
                  xs d|j                  xs d |«       ¬«      S )zEStrip source decoration and plan one synchronous destination locally.r   )Úconfigured_cache_ttlÚ#plan_cache_sections_for_destinationrJ   )rJ  rA   r   r]  Ú	cache_ttl)r®  rW  rX  rJ  rA   r   r]  )rÜ  rØ  rU  rW  rX  s        r%   Ú"_replan_synchronous_cache_sectionsrZ  ]  sK   € ÷ fÙ.Ø�% +×"6Ñ"6À×AUÑAUØ×%Ñ%Ò+¨°;×3DÑ3DÒ3JÈá&Ó(ô	ð r'   Úfallback_entryÚtask_configÚapply_fast_lanec                ó.  — ||}}|rIt        || j                  | j                  |	j                  d«      |	j                  d«      |	|
||¬«	      \  }}t	        ||| ¬«      \  }}t        | j                  | j                  |||||||| j                  |¬«      }|S )zYBuild request kwargs for one fallback destination (cache-section replan + fast-lane cap).rJ  r]  ©Úactual_providerÚactual_modelrÏ  Úrequested_modelÚroute_configÚleak_guard_configrj  rè  )rU  rü  )Ú_compression_fast_lane_controlsrJ  r]  r|   rZ  r   rA   )rU  rà  rÜ  rØ  rl  rj  rø  rù  rp  r[  r\  r]  Úfallback_max_tokensÚfallback_extra_bodyÚfallback_messagesÚfallback_toolsÚ	fb_kwargss                    r%   Ú_fallback_request_kwargsrk  j  sº   € ð 0:Ð;OÐ,ÐÙÜ3RØ +×"6Ñ"6À[×EVÑEVØ-×1Ñ1°*Ó=Ø*×.Ñ.¨wÓ7ÀnØ)°jÐMaô	4
Ñ0ÐÐ0ô )KÈ8ÐUZÐhsÔ(tÑ%Ð�~Ü"Ø×Ñ˜k×/Ñ/Ð1BØÐ,?À~Ð_pØ&Ð9IÐT_×ThÑThÐosôu€Ið Ðr'   c                óŠ  ‡‡— t        ||«      }|�$||k7  rt        j                  d|xs d|||«       |}t        || ||«      Š|dk(  rt	        |«      ni }t        ||«      xs i }	t        d
|||	||dœ|¤ŽŠdt        dt        dt        t           dt        t        t        t        t        f   f   fˆˆfd	„}
‰t        ‰fi ‰¤Ž|
fS )a<  Resolve the destination + first-attempt kwargs for a fallback candidate.

    Returns ``(destination, kwargs, rebuild)`` where ``rebuild(provider, client, model)`` produces
    kwargs for the credential-refreshed retry destination. A configured-chain entry's own
    ``timeout`` overrides ``effective_timeout``.
    zJAuxiliary %s: %s using its configured timeout %.0fs (task-level was %.0fs)r@  r´  )rà  rø  r[  r\  r]  rJ  rŒ   r]  r!   c           
      ó¸   •— t        | ‰j                  xs t        t        |dd«      xs d«      ‰j                  |xs ‰j
                  «      }|t        |fi ‰¤ŽfS )NrA   rJ   )rH  rA   rK   rP   r   r]  rk  )rJ  rŒ   r]  Úretry_destinationÚcommonrU  s       €€r%   Ú_rebuildz*_plan_fallback_candidate.<locals>._rebuild›  sb   ø€ Ü0Ø�k×*Ñ*ÒX¬c´'¸&À*ÈbÓ2QÒ2WÐUWÓ.XØ× Ñ  %Ò"<¨;×+<Ñ+<ó
Ðð !Ô":Ð;LÑ"WÐPVÑ"WÐWÐWr'   r*   )rD  rŠ   r¯  rT  rä  r>  rÜ   rK   r   r	   r
   rH  r   rk  )rL  rM  r8  rà  rø  r]  rœ  Ú
fb_timeoutr\  r[  rp  ro  rU  s              @@r%   Ú_plan_fallback_candidaterr  �  sü   ù€ ô )¨¨xÓ8€JØÐ *Ð0AÒ"AÜ�‰ð%àŠN�F˜H jÐ2Cô	
ð
 'ÐÜ'¨¨i¸À8ÓL€KØ6:¸mÒ6KÔ,¨TÔ2ÐQS€KÜ*¨4°Ó:Ò@¸b€NÜð ØÐ%6À~Ø°ñàDKñ€Fð
Xœ3ð X¬ð X´H¼S±Mð XÄeÔL`ÔbfÔgjÔloÐgoÑbpÐLpÑFqö Xð Ô0°ÑGÀÑGÈÐQÐQr'   ©rA   Útagr”  Úfb_providerÚfb_errrt  c                ó”   — t        |xs |t        |«      ||xs d¬«       |rd|› d�nd}t        j                  d| xs d||||«       y)	a%  The candidate cannot serve this walk (``reason`` = its ``_FALLBACK_REASONS`` capacity label,
    None = dead token): mark it unhealthy so the ordered re-walk skips it and the caller moves on to
    the next entry. Transient classes get a short hold, payment/quota and dead tokens the long one.zstale fallback credential)r  rA   r”  zis out of capacity (ú)z$has a stale/unrefreshable credentialuK   Auxiliary %s%s: fallback candidate %s %s (%s) â€” skipping to next fallbackr@  N)r&  r]   rŠ   r‹   )rà  r8  ru  rv  rA   rt  r”  Úwhys           r%   Ú_quarantine_fallback_candidaterz  ¥  s\   € ô ØÒ�xÔ%FÀvÓ%NØ &Ò"GÐ,GõIñ /5Ð   ¨Ñ
*Ð:`€CÜ
‡N�NÐ`Ø’>˜6 3¨°#°võ?r'   Úrebuildc                ó&  — t        | j                  | j                  «      }|dk(  rd|ini }|dvr_t        |fi |¤ŽrSt	        || j
                  fi |rddini ¤| j                  xs d| j                  dœ¤Ž\  }}|� ||||«      \  }}	|||	|ffS |dfS )z»After an auth error on a fallback candidate: refresh credentials and rebuild the request.
    Returns ``(refresh_provider, retry)``; ``retry`` = ``(client, kwargs, destination)`` or None.rÛ  ré  >   NrJ   rL  r�   TN)rA   r   )r7  rJ  rA   r2  rþ  r]  r   )
rU  r{  r�   ré  ru  Úrefresh_kwargsr  r  rn  rž  s
             r%   Ú_plan_fallback_auth_retryr~  ´  sÊ   € ô 3°;×3GÑ3GÈ×I]ÑI]Ó^€KØ;FÈ+Ò;UÐ&¨Ñ7Ð[]€NØÐ,Ñ,Ô1NÈ{Ñ1mÐ^lÒ1mÜ$6Ø˜×*Ñ*ñ%
ÙGQ°¸dÑ/CÐWYð%
à ×)Ñ)Ò1¨T¸K×<PÑ<Pó%
Ñ!ˆ�kð Ð#Ù.5°kÀ<ÐQ\Ó.]Ñ+Ð˜|Ø ¨|Ð=NÐ OÐOÐOØ˜ÐÐr'   c                ó²  ‡‡‡— t        | ||‰|d|||||	|
¬«      \  }}}dt        dt        t        t        f   dt        dt        fˆfd„Šdd	lmŠ dt        dt        t        t        f   dt        dt        fˆˆˆfd
„}	  || ||«      S # t        $ rÅ}t        |«      s8t        |«      }|€‚ t        ‰||j                  ||j                  |¬«       Y d}~yt        ||dt        | dd«      ¬«      \  }}|}|�=|d   }	  ||Ž cY d}~S # t        $ r!}t        |«      st        |«      €‚ Y d}~nd}~ww xY wt        ‰||||j                  ¬«       Y d}~yd}~ww xY w)a¾  Call one fallback candidate with stale-credential recovery: on an auth error refresh its
    credentials and retry once with a rebuilt client; if that also auth-fails, quarantine the
    provider and return None so the caller moves on. A capacity error (quota/rate-limit 429, 402,
    connection, route-incompatible model, malformed response) also quarantines and returns None so
    the ordered chain advances to the next configured entry (#106367); other errors raise.

    ``effective_timeout`` is the task-level deadline; a configured-chain candidate with its own ``timeout``
    entry gets that instead, so a fallback tuned differently from the primary is allowed its own budget
    (#62452).
    T©	rà  rø  r]  rÜ  rØ  rl  rj  rù  rp  rŒ   Úrequest_kwargsÚdestr!   c                 ón   •‡ ‡— t        t        ‰ |‰j                  ‰j                  ˆ ˆˆfd„¬«      ‰«      S )Nc           	      ó^   •— t        ‰| ‰t        ‰j                  ‰j                  «      ¬«      S ©N©Úforce_stream)rš  Ú_provider_requires_streamrJ  rA   )rœ  rŒ   r‚  rà  s    €€€r%   rß  z>_call_fallback_candidate_sync.<locals>._send.<locals>.<lambda>ã  s&   ø€ Ô'<Ø˜G TÜ!:¸4¿=¹=È$Ï-É-Ó!Xô(€ r'   r•  )r
  r®  rJ  r   ©rŒ   r�  r‚  rà  s   ` `€r%   Ú_sendz,_call_fallback_candidate_sync.<locals>._sendß  s3   ú€ Ü%Ü"Ø˜°·±ÈÏÉõôð ó	
ð 		
r'   r   )Úsend_with_parameter_rungsc                 ó&   •‡—  ‰ˆˆfd„| |‰¬«      S )Nc                 ó   •—  ‰| |‰«      S r,   r*   ©ÚcrJ  rŠ  r‚  s     €€r%   rß  zI_call_fallback_candidate_sync.<locals>._send_recovering.<locals>.<lambda>î  ó   ø€ ™%  2 tÓ,€ r'   rå  r*   )rŒ   r�  r‚  rŠ  r‹  rà  s     `€€€r%   Ú_send_recoveringz7_call_fallback_candidate_sync.<locals>._send_recoveringì  s   ù€ Ù(Ü,¨f°nÈ4ôQð 	Qr'   N)rA   r”  Fr@   rJ   ©r�   ré  r�  r  )rr  r   r   rK   rH  Ú!agent.auxiliary_fallback_recoveryr‹  r}   rŽ  r^   rz  rJ  rA   r~  rP   )rL  rM  r8  rà  rÜ  rl  rj  rØ  rø  rù  rp  rU  rj  r{  r‘  rv  Úcapacityru  ÚretryÚfailed_destinationÚ	retry_errrŠ  r‹  s      `                 @@r%   Ú_call_fallback_candidate_syncr˜  É  sŽ  ú€ ô '?Ø�8˜X¨DÐDUØ x°uÈ+ØÐ4HØ)ô	'Ñ#€K�˜Gð

”cð 

¬4´´S°©>ð 

ÔAUð 

ÔZ]õ 

õ LðQ¤ð Q´d¼3Ä¸8±nð QÔL`ð QÔeh÷ QðÙ 	¨9°kÓBÐBøÜò Ü˜fÔ%Ü<¸VÓDˆHØÐØÜ*Ø�h × 4Ñ 4°fÀ{×G[ÑG[Øõ!ô Ü6Ø˜¨UÄ7È9ÐV_ÐacÓCdôfÑˆ�Uà(ÐØÐØ!& q¡ÐðÙ'¨Ð/Õ/øÜò Ü% iÔ0Ô5ZÐ[dÓ5eÐ5mØÿøðúô 	'Ø�(˜K¨Ð:L×:UÑ:Uõ	
ô ûð-úsH   Á>	B Â	EÂ>EÃ&EÃ;DÃ?EÄ	D/ÄD*Ä%EÄ*D/Ä/EÅEc             ƒ   óä  ‡‡‡K  — t        | ||‰|d|||||	|
¬«      \  }}}dt        dt        t        t        f   dt        dt        fˆfd„Šdd	lmŠ dt        dt        t        t        f   dt        dt        fˆˆˆfd
„}	  || ||«      ƒ d{  –—† S 7 Œ# t        $ rÐ}t        |«      s9t        |«      }|€‚ t        ‰||j                  ||j                  d|¬«       Y d}~yt        ||dt        | dd«      ¬«      \  }}|}|�F|d   }	  ||Ž ƒ d{  –—†7  cY d}~S # t        $ r!}t        |«      st        |«      €‚ Y d}~nd}~ww xY wt        ‰||||j                  d¬«       Y d}~yd}~ww xY w­w)zVAsync mirror of :func:`_call_fallback_candidate_sync` (no fast-lane cap on this wire).Fr€  rŒ   r�  r‚  r!   c              “   óz   •K  — t        t        | ||j                  |j                  ¬«      ƒ d {  –—† ‰«      S 7 Œ	­w)NrŒ  )r
  r¶  rJ  r   r‰  s      €r%   rŠ  z-_call_fallback_candidate_async.<locals>._send  s6   øè ø€ Ü%Ü)¨&°.È4Ï=É=Ðcg×cpÑcpÔq×qØó
ð 	
Øqús   ƒ,;¯9°
;r   )Úsend_with_parameter_rungs_asyncc              “   óB   •‡K  —  ‰ˆˆfd„| |‰¬«      ƒ d {  –—† S 7 Œ­w)Nc                 ó   •—  ‰| |‰«      S r,   r*   rŽ  s     €€r%   rß  zJ_call_fallback_candidate_async.<locals>._send_recovering.<locals>.<lambda>   r�  r'   rå  r*   )rŒ   r�  r‚  rŠ  r›  rà  s     `€€€r%   r‘  z8_call_fallback_candidate_async.<locals>._send_recovering  s+   ùè ø€ Ù4Ü,¨f°nÈ4ôQ÷ Qð 	Qð Qús   „˜™Nú (async)rs  Tr@   rJ   r’  r�  )rA   rt  )rr  r   r   rK   rH  r“  r›  r}   rŽ  r^   rz  rJ  rA   r~  rP   )rL  rM  r8  rà  rÜ  rl  rj  rØ  rø  rù  rp  rU  rj  r{  r‘  rv  r”  ru  r•  r–  r—  rŠ  r›  s      `                 @@r%   Ú_call_fallback_candidate_asyncrŸ  
  s¡  úè ø€ ô '?Ø�8˜X¨DÐDUØ¨¸È;ØÐ4HØ)ô	'Ñ#€K�˜Gð
œCð 
´´c¼3°h±ð 
ÔG[ð 
Ô`cõ 
õ
 RðQ¤sð Q¼DÄÄcÀ¹Nð QÔRfð QÔkn÷ QðÙ% i°¸KÓH×HÐHÐHùÜò Ü˜fÔ%Ü<¸VÓDˆHØÐØÜ*Ø�h × 4Ñ 4°fÀ{×G[ÑG[Ø xõ1ô Ü6Ø˜¨TÄ'È)ÐU^Ð`bÓBcôeÑˆ�Uà(ÐØÐØ!& q¡ÐðÙ-¨uÐ5×5Ð5Õ5øÜò Ü% iÔ0Ô5ZÐ[dÓ5eÐ5mØÿøðúô 	'Ø�(˜K¨Ø'×0Ñ0°jõ	
ô ûð/üsŠ   …A:E0Â B ÂBÂB ÂE0ÂB Â	E-Â?E(ÃE0Ã!&E(ÄDÄDÄDÄE-ÄE0Ä	EÄ$E Ä;E(Å EÅE(Å#E0Å(E-Å-E0úpayment error)Úfailed_base_urlÚfailure_scoper×  Úfailed_providerr¡  r¢  c          
      ó  — | j                  «       j                  «       }t        |«      j                  d«      xs
 t	        «       }t        ||«      sy|h}|r1|j                  «       |v r|j                  |j                  «       «       |D �	ch c]  }	t        |	«      ’Œ }
}	t        | d||¬«      }g }t        «       D ]–  \  }}t        |«      }|s||
v s
 ||d|«      rŒ"t        ||«      r#t        |||¬«       |j                  |› d�«       ŒQ |«       \  }}|�)t        j                  d|xs d|| ||xs d	«       |||fc S |j                  |«       Œ˜ t        j!                  d
|xs d|| dj#                  |«      «       yc c}	w )zÜTry the auto-detection chain after a payment/credit or connection error, skipping the failed
    provider (and the main-provider path when it maps to the same backend). Returns (client, model, label) or (None, None, "").rJ  ©NNrJ   N©r¡  r¢  r  ú (unhealthy)u2   Auxiliary %s: %s on %s â€” falling back to %s (%s)r@  rÙ   z<Auxiliary %s: %s on %s and no fallback available (tried: %s)ú, )rT  rS  rý  r|   rW  Ú_discovery_chain_allowedrˆ  r8  Ú_failed_backend_skipr0  r[   rû  rC  rz  rŠ   r¯  r‹   r0  )r£  rà  r”  r¡  r¢  r×  ÚskipÚmain_providerÚskip_labelsÚsÚskip_chain_labelsÚskip_backendÚtriedrÄ   Útry_fnÚcandidate_base_urlrŒ   r]  s                     r%   Ú_try_payment_fallbackr´  =  s—  € ð × Ñ Ó"×(Ñ(Ó*€Dô ,¨LÓ9×=Ñ=¸jÓIÒbÔM`ÓMb€MÜ# M°4Ô8ØØ�&€KÙ˜×,Ñ,Ó.°$Ñ6Ø�‰˜×+Ñ+Ó-Ô.Ø<GÖH°qÔ/°Õ2ÐHÐÐHÜ'Ø˜¨Èmô]€Là€EÜ,Ó.ò ‰ˆˆvÜ4°UÓ;ÐÙ EÐ->Ñ$>Á<Ø�tÐ/ôD1àÜ! %Ð);Ô<Ü  tÐ6HÕIØ�L‰L˜E˜7 ,Ð/Ô0ØÙ›‰ˆ�ØÐÜ�K‰KÐLØš ¨°ÀÈÒHZÐQZô\à˜5 %Ð'Ò'Ø�‰�UÕðô ‡N�NÐQØ’>˜6 6¨?¸D¿I¹IÀeÓ<LôNàùò+ Is   ÂFr¦  Úfailed_modelc          	      ó$  ‡‡‡‡	— ddl mŠm}mŠ	 |xs dj	                  «       j                  «       xs d}‰j                  | ||¬«      Š‰xs |r|j                  n|j                  Šddt        dt        t           dt        d	t        fˆˆˆˆ	fd
„}|S )u  Predicate ``skip(provider, model, base_url="")`` â†’ True when a candidate must be skipped for the failed
    route. Scope: ``failed_model`` â†’ model-scoped (only that deployment; timeout/connection/rate-limit);
    None â†’ credential-wide (whole provider; auth/payment).r   )ÚBackendIdentityÚFailureScopeÚshould_skip_candidaterJ   N©rJ  r]  rA   rJ  r]  rA   r!   c                 ó<   •—  ‰‰j                  | ||¬«      ‰‰«      S )Nrº  )Úbuild)rJ  r]  rA   r·  Úfailed_identr¢  r¹  s      €€€€r%   Ú_skipz#_failed_backend_skip.<locals>._skipq  s+   ø€ Ù$Ø×!Ñ!¨8¸5È8Ð!ÓTÐVbÐdqó
ð 	
r'   ©rJ   )Úagent.backend_identityr·  r¸  r¹  rS  rT  r¼  ÚMODELÚ
CREDENTIALrK   r	   rO   )
r£  rµ  r¡  r¢  r¸  Ú
skip_modelr¾  r·  r½  r¹  s
      `   @@@r%   rª  rª  d  s•   û€ ÷ \Ñ[ØÒ$ "×+Ñ+Ó-×3Ñ3Ó5Ò=¸€JØ"×(Ñ(Ø ¨
¸_ð )ó N€Là!Òd¹J l×&8Ò&8ÈL×LcÑLc€Mñ
œð 
¤H¬S¡Mð 
¼Sð 
Ì$÷ 
ð 
ð €Lr'   c           	      ó†  — t        «       xs dj                  «       }t        «       xs dj                  «       }|j                  «       dk(  rt	        |«      \  }}	|r|	sy||	}}|r|r|j                  «       dv ry|dk(  r-|t
        v st        ||«      st        j                  d|| |«       yt        |«      }
 t        | |||¬«      |||
«      ryt        ||
«      rt        |||
¬«       y	 t        ||¬	«      \  }}|€yd|› d�}t        j                  d|xs d|| ||xs |«       ||xs ||fS # t        $ r d
\  }}Y ŒDw xY w)a@  Last-resort fallback to the main agent provider + model after the configured chain is exhausted.
    ``failed_model`` scoping per ``_failed_backend_skip``; same-URL custom endpoints serve many models,
    so a hung aux model says nothing about the main model's health. Returns (client, model, label) or (None, None, "").rJ   rR  r¥  >   rJ   rL  r/  u^   Auxiliary vision: %s on %s â€” main agent provider %s accepts no image input, not falling backr¦  r  )rJ  r]  rò  zmain-agent(rx  uC   Auxiliary %s: %s on %s â€” falling back to main agent model %s (%s)r@  )rW  rS  r[  rT  rY  rí  Ú_main_model_supports_visionrŠ   r¯  r[   rª  rû  rC  Úresolve_provider_clientr}   )r£  rà  r”  rµ  r¡  r¢  r¬  Ú
main_modelÚ_agg_providerÚ
_agg_modelÚmain_base_urlrŒ   rô  rÄ   s                 r%   Ú_try_main_agent_model_fallbackrË  x  s~  € ô )Ó*Ò0¨b×7Ñ7Ó9€MÜ"Ó$Ò*¨×1Ñ1Ó3€JØ×ÑÓ Ò%ä$;¸JÓ$GÑ!ˆ�zÙ¡JØ!Ø$1°:�zˆÙ¡
¨m×.AÑ.AÓ.CÀ|Ñ.SØØˆxÒØÔ6Ñ6Ô>YÐZgÐisÔ>tô 	�‰ÐtØ˜O¨]ô	<àÜ+¨MÓ:€Mð)ÔØ˜\¸?Ø'ô)à)6¸
ÀMôSð Ü˜m¨]Ô;Ü˜M¨4¸-ÕHØð,Ü!8À-ÐWaÔ!bÑˆ�ð €~ØØ˜-˜¨Ð*€EÜ
‡K�KÐUØ’˜ ¨¸ÀÒ@\ÐR\ô^à�>Ò/ Z°Ð6Ð6øô ò ,Ø!+Ñˆ’ð,ús   Ã+D/ Ä/E Ä?E c                 ó   — | dk(  rt         S dS )z]Minimum context length for an auxiliary task; None = no floor (only ``compression`` has one).r´  N)rW   rå  s    r%   Ú_task_minimum_context_lengthrÍ  ³  s   € à%)¨]Ò%:Ô!ÐDÀÐDr'   c                 ó¶   — |sy	 t        |||| ¬«      }t	        |t
        «      r|dkD  r|S dS # t        $ r"}t        j                  d| ||«       Y d}~yd}~ww xY w)zpBest-effort context window for a fallback candidate; ``None`` = unknown (never raises; callers pass it through).N)rA   r@   rJ  zBAuxiliary fallback: could not resolve context window for %s/%s: %sr   )rX   r}   rŠ   r²   r2   r  )rJ  r]  rA   r@   Úctxr  s         r%   Ú_candidate_context_windowrÐ  ¸  se   € áØðÜ& u°xÈÐ[cÔdˆô ˜S¤#Ô&¨3°ª7ˆ3Ð<¸Ð<øô ò Ü�‰ÐYÐ[cÐejÐloÔpÜûðús   …- ­	A¶AÁA)Ú
name_modelÚmin_ctxrÑ  c          	      ó  — |€yt        ||t        | j                  d«      xs d«      t        | «      xs d¬«      }|�||k\  ry|rt        j                  d|||||«       nt        j                  d|xs d|||«       |› d|› d	|› d
�S )zaScreen one fallback candidate by context window; returns the ``tried`` note when it is too small.NrA   rJ   rå  zDAuxiliary %s: skipping %s (%s context=%d < min=%d), continuing chainzAAuxiliary %s: skipping %s (context=%d < min=%d), continuing chainr@  z (context too small: ú<rx  )rÐ  rK   r|   Ú_fallback_entry_api_keyrŠ   r¯  )rE  rJ  r]  rÒ  rà  rÄ   rÑ  Úfb_ctxs           r%   Ú_context_too_smallr×  Ä  s¤   € ð
 €ØÜ&Ø�%¤# e§i¡i°
Ó&;Ò&A¸rÓ"BÔLcÐdiÓLjÒLpÐnpôr€Fà€~˜ 7Ò*ØÙÜ�‰ÐZØ˜% ¨°õ	9ô 	�‰ÐWØ’N˜F E¨6°7ô	<àˆWÐ)¨&¨°°7°)¸1Ð=Ð=r'   c          
      óÎ  — | syt        | «      j                  d«      }|rt        |t        «      syt	        ||||¬«      }g }t        | «      }	t        |«      D �]N  \  }
}t        |t        «      sŒt        |j                  dd«      «      j                  «       }|sŒDt        |j                  dd«      «      j                  «       }t        ||j                  d«      «      } ||||«      rŒ“t        ||«      r't        || |¬«       |j                  d	|
› d
|› d�«       ŒÆ|xs d}d	|
› d
|› d�}	 t        |«      \  }}|�X|rt!        ||||	| |d¬«      nd}|r|j                  |«       �Œt"        j%                  d| ||||xs |xs d«       ||xs ||fc S |j                  |«       �ŒQ |r&t"        j'                  d| dj)                  |«      «       y# t        $ r d\  }}Y Œ§w xY w)a9  Try auxiliary.<task>.fallback_chain entries in order (each needs ``provider``; model/base_url/api_key optional).
    ``failed_model`` scoping per ``_failed_backend_skip`` (sibling models on the same provider still
    run after a model-scoped failure). Returns (client, model, provider_label) or (None, None, "").r¥  r:  r¦  rJ  rJ   r]  rA   r  zfallback_chain[ú](z) (unhealthy)Nrx  rò  T)rà  rÄ   rÑ  u9   Auxiliary %s: %s on %s â€” configured fallback to %s (%s)rÙ   z=Auxiliary %s: configured fallback_chain exhausted (tried: %s)r¨  )rä  r|   r2   r  rª  rÍ  r¢  rÜ   rK   rS  r[   rû  rC  rz  Ú_resolve_fallback_entryr}   r×  rŠ   r¯  r²   r0  )rà  r£  r”  rµ  r¡  r¢  r=  r«  r±  rÒ  ÚirE  ru  Úfb_model_rawÚfb_base_urlrM  rÄ   rL  rô  Ú	too_smalls                       r%   Ú_try_configured_fallback_chainrß  Ø  s  € ñ ØÜ& tÓ,×0Ñ0Ð1AÓB€EÙœ
 5¬$Ô/ØÜØ˜°ÐVcôe€Dà€EÜ*¨4Ó0€GÜ˜eÓ$ó ‰ˆˆ5Ü˜%¤Ô&ØÜ˜%Ÿ)™) J°Ó3Ó4×:Ñ:Ó<ˆÙØÜ˜5Ÿ9™9 W¨bÓ1Ó2×8Ñ8Ó:ˆÜ-¨k¸5¿9¹9ÀZÓ;PÓQˆÙ�˜\¨;Ô7ØÜ! +¨{Ô;Ü ¨T¸KÕHØ�L‰L˜?¨1¨#¨R°¨}¸MÐJÔKØØÒ' 4ˆØ! !  B { m°1Ð5ˆð	3Ü(?ÀÓ(FÑ%ˆI�~ð Ð ñ  ô +Ø�{ N°GÀ$ÈeÐ`dõà%)ð ñ Ø—‘˜YÔ'ÙÜ�K‰KÐSØ˜f o°u¸nÒ>eÐPXÒ>eÐ\eôgà˜nÒ8°¸%Ð?Ò?Ø�‰�UÖð=ñ> Ü�‰ÐTÐVZÐ\`×\eÑ\eÐfkÓ\lÔmØøô ò 	3Ø(2Ñ%ˆI’~ð	3ús   Ä.GÇG$Ç#G$c                 ót   — |xs dj                  «       j                  «       }| r|r|dv ryt        | |d¬«      S )uº   Task fallback_chain when an explicit aux provider cannot build a client (no key/OAuth/pool creds);
    stops at the per-task chain â€” the main-agent model stays the runtime last resort.rJ   >   rL  r¥  zprovider unavailable©r”  )rS  rT  rß  )rà  r£  Úexplicits      r%   Ú/_try_configured_fallback_for_unavailable_clientrã    s?   € ð
  Ò% 2×,Ñ,Ó.×4Ñ4Ó6€HÙ‘x 8¨xÑ#7ØÜ)¨$°ÐAWÔXÐXr'   c                 ó   — ddl m}  || «      S )zoResolve inline or env-backed API key via the secret-scope-aware resolver (no raw os.getenv under multiplexing).r   )Úresolve_entry_api_key)Úhermes_cli.fallback_configrå  )rE  rå  s     r%   rÕ  rÕ    s   € å@Ù  Ó'Ð'r'   c                 ót  — t        | j                  d«      xs d«      j                  «       }t        | j                  d«      xs d«      j                  «       xs d}|r|syt        ||t        | j                  d«      xs d«      j                  «       xs dt	        | «      t        | j                  d«      xs | j                  d«      xs d«      j                  «       xs d¬	«      \  }}|�8t        j                  t        «      5  t        | ||«      |_	        ddd«       ||fS ||fS # 1 sw Y   ||fS xY w)
z?Resolve one fallback entry through the central provider router.rJ  rJ   r]  Nrò  rA   r   rO  )r]  r  r   r   )
rK   r|   rS  rÆ  rÕ  rC  rD  r}   rP  rR  )rE  rJ  r]  rŒ   rô  s        r%   rÚ  rÚ    s!  € ä�5—9‘9˜ZÓ(Ò.¨BÓ/×5Ñ5Ó7€HÜ�—	‘	˜'Ó"Ò( bÓ)×/Ñ/Ó1Ò9°T€EÙ™5ØÜ4Ø˜´°U·Y±Y¸zÓ5JÒ5PÈbÓ1Q×1WÑ1WÓ1YÒ1aÐ]aÜ0°Ó7Ü�U—Y‘Y˜zÓ*ÒJ¨e¯i©i¸Ó.DÒJÈÓK×QÑQÓSÒ[ÐW[ôÑ€FˆNð
 ÐÜ× Ñ ¤Ó+ñ 	rÜ2RÐSXÐZ`ÐbpÓ2qˆFÔ/÷	rà�>Ð!Ð!ˆ6�>Ð!Ð!÷	rà�>Ð!Ð!ús   ÄD+Ä+D7)rµ  r¡  r¢  c          
      ó¬  — 	 ddl m} ddlm}  | |«       «      }|syt        ||||¬«      }
g }t        | «      }t        |«      D �]x  \  }}t        |t        «      sŒt        |j                  d	«      xs d
«      j                  «       }t        |j                  d«      xs d
«      j                  «       }|r|sŒu|j                  «       }d|› d|› d�}t!        ||j                  d«      «      }|dk(  s
 |
|||«      r|j#                  |› d�«       ŒÍt%        ||«      r#t'        || |¬«       |j#                  |› d�«       Œü	 t)        |«      \  }}|�[t+        |||xs ||| |¬«      }|r|j#                  |«       �Œ7t
        j-                  d| xs d||xs d||xs |«       ||xs ||fc S |j#                  |«       �Œ{ |r*t
        j                  d| xs ddj/                  |«      «       y# t        $ r%}	t
        j                  d| xs d|	«       Y d}	~	yd}	~	ww xY w# t        $ r+}	t
        j                  d| xs d||	«       d\  }}Y d}	~	Œþd}	~	ww xY w)a   Top-level main-agent fallback chain for a ``provider: auto`` auxiliary call: auto tasks honour the
    user's main fallback policy before the built-in discovery chain; read via ``get_fallback_chain`` so
    ``fallback_providers`` and legacy ``fallback_model`` keep the main agent's order.r   rý  )Úget_fallback_chainz4Auxiliary %s: could not load main fallback chain: %sr@  Nr¥  r¦  rJ  rJ   r]  zfallback_providers[rÙ  rx  rA   rL  z
 (skipped)r  r§  z4Auxiliary %s: main fallback %s failed to resolve: %srò  )rà  rÄ   u9   Auxiliary %s: %s on %s â€” main fallback chain to %s (%s)z7Auxiliary %s: main fallback chain exhausted (tried: %s)r¨  )r{   rt   ræ  ré  r}   rŠ   r²   rª  rÍ  r¢  r2   rÜ   rK   r|   rS  rT  r[   rz  rû  rC  rÚ  r×  r¯  r0  )rà  r£  r”  rµ  r¡  r¢  rt   ré  r=  r  r«  r±  rÒ  rÛ  rE  ru  rM  Úfb_normrÄ   rÝ  rL  rô  rÞ  s                          r%   Ú_try_main_fallback_chainrë  .  sk  € ðÝ:ÝAÙ"Ñ#7Ó#9Ó:ˆñ ØÜØ˜°ÐVcôe€Dà€EÜ*¨4Ó0€GÜ˜eÓ$ó  ‰ˆˆ5Ü˜%¤Ô&ØÜ˜%Ÿ)™) JÓ/Ò5°2Ó6×<Ñ<Ó>ˆÜ�u—y‘y Ó)Ò/¨RÓ0×6Ñ6Ó8ˆÙ¡(ØØ×#Ñ#Ó%ˆØ% a S¨¨;¨-°qÐ9ˆÜ-¨k¸5¿9¹9ÀZÓ;PÓQˆØ�fÒ¡ [°(¸KÔ HØ�L‰L˜E˜7 *Ð-Ô.ØÜ! '¨;Ô7Ü ¨¸ÕDØ�L‰L˜E˜7 ,Ð/Ô0Øð	3Ü(?ÀÓ(FÑ%ˆI�~ð Ð Ü*Ø�{ NÒ$>°hÀÈdÐZ_ôˆIñ Ø—‘˜YÔ'ÙÜ�K‰KÐSØš ¨°Ò0IÀ6È5ÐR`ÒRlÐdlônà˜nÒ8°¸+ÐEÒEØ�‰�UÖðA ñB Ü�‰ÐNÐPTÒP^ÐX^Ð`d×`iÑ`iÐjoÓ`pÔqØøôY ò Ü�‰ÐKÈTÊ^ÐU[Ð]`ÔaÜûðûô8 ò 	3Ü�L‰LÐOÐQUÒQ_ÐY_ÐafÐhkÔlØ(2Ñ%ˆI•~ûð	3ús/   ‚G. ÅHÇ.	HÇ7HÈHÈ	IÈ(!IÉIÚruntime_providerc                 óä   — t         ryt        j                  dd«      j                  «       }| xs
 t	        «       }|r5|r2|dk7  r,|j                  d«      st        j                  d||«       da yyyyy)zšWarn once when OPENAI_BASE_URL is set but config.yaml names a non-custom provider (a stale
    ~/.hermes/.env value after `hermes model` poisons routing).Nrã  rJ   r;  rM  zºOPENAI_BASE_URL is set (%s) but model.provider is '%s'. Auxiliary clients may route to the wrong endpoint. Run: hermes model to reconfigure, or remove OPENAI_BASE_URL from ~/.hermes/.envT)Ú_stale_base_url_warnedr  r[  rS  rW  rU  rŠ   r‹   )rì  Ú	_env_baseÚ_cfg_providers      r%   Ú_warn_stale_openai_base_urlrñ  h  sz   € õ ØÜ—	‘	Ð+¨RÓ0×6Ñ6Ó8€IØ$Ò=Ô(;Ó(=€MÙ‘m¨¸Ò(AÈ-×JbÑJbÐclÔJmÜ�‰ð2ð �}ô	
ð "&Ñð KnÐ(A�mˆ	r'   r  c                 ó  — t        | j                  dd«      xs t        «       xs d«      }t        | j                  d«      xs t        «       xs d«      }t        | j                  d«      xs d«      }| j                  dd«      }t        | j                  d«      xs d«      }t	        |«      r4|r2|dvr.t        |d¬	«      }|r||k7  rt        j                  d
|||«       |}|dk(  rt        |«      \  }}	|r|	r
||	}}dx}x}}|||||fS )z—Step-1 target: (provider, model, base_url, api_key, api_mode) of the main runtime, after the
    fast-model opt-in and the MoA aggregator substitution.rJ  rJ   r]  rA   r@   r   >   rJ   rL  TrÊ  z>Auxiliary task %s: preferring fast model %s over main model %srR  )	rK   r|   rW  r[  ræ  rÓ  rŠ   r²   rY  )
r  rà  r¬  rÇ  rL  rG  r!  Ú
fast_modelrÈ  rÉ  s
             r%   Ú_main_route_targetrô  {  s  € ô ˜Ÿ™ J°Ó3ÒRÔ7JÓ7LÒRÐPRÓS€MÜ�W—[‘[ Ó)ÒEÔ-=Ó-?ÒEÀ2ÓF€JÜ˜7Ÿ;™; zÓ2Ò8°bÓ9ÐØ—k‘k )¨RÓ0€OÜ˜7Ÿ;™; zÓ2Ò8°bÓ9Ðô   Ô%©-¸MÐQ]Ñ<]Ü0°ÈDÔQˆ
Ù˜*¨
Ò2Ü�L‰LÐYØ˜z¨:ô7à#ˆJð ˜ÒÜ$;¸JÓ$GÑ!ˆ�zÙ™ZØ(5°z˜:ˆMØDFÐFÐÐF˜Ð1AØ˜*Ð&6¸ÐIYÐYÐYr'   r¬  rÇ  rL  rG  r!  c                 óú  — | r|r| dvsy| }|xs d}t        | |«      }d}|r| dk(  r|xs d}n^| j                  d«      rId}	t        j                  t        «      5  ddlm}
  |
| «      du}	ddd«       |	rd}n|r	d}|xs d}n	|r|}n|r|}t        |«      }|rt        ||«      rt        ||¬«       yt        |||||xs d¬	«      \  }}|€yt        j                  d
| |xs |«       ||xs ||fS # 1 sw Y   Œ‡xY w)zHStep 1: route aux onto the main provider + main model; None if unusable.>   rJ   rL  Nr;  rM  Fr   ©Ú_get_named_custom_providerr  )r  r   r   z2Auxiliary auto-detect: using main provider %s (%s))r[   rU  rC  rD  r‡   rè  r÷  r8  rû  rC  rÆ  rŠ   r¯  )r¬  rÇ  rL  rG  r!  rÞ  r  Úhealth_base_urlr   Ú_has_named_entryr÷  Úmain_chain_labelrŒ   r  s                 r%   Ú_try_main_provider_routerû  •  sO  € ñ ™j¨]À,Ñ-NØØ%ÐØ(Ò0¨DÐÜ-¨mÐ=NÓO€OØÐÙ˜M¨XÒ5à*Ò2¨dÑØ	×	!Ñ	! )Ô	,à ÐÜ× Ñ ¤Ó-ñ 	UÝNÙ9¸-ÓHÐPTÐTÐ÷	Uñ ð !%ÑÙð !)ÐØ.Ò6°$ÑÙØ.ÑÙ	à*Ðä-Ð.?Ó@ÐÙÔ2Ð3CÀ_ÔUÜÐ,°ÕGØÜ.Ø˜:Ð9JØ)Ð4DÒ4LÈôÑ€FˆHð €~ØÜ
‡K�KÐDÀmÐU]ÒUkÐakÔlØ�8Ò)˜zÐ+<Ð<Ð<÷;	Uð 	Uús   ÁC1Ã1C:c                 ó„   — | xs dj                  «       j                  «       dv ryt        j                  d|xs d| «       y)u´  The built-in discovery chain is a convenience for installs with NO selected main provider.
    Once the user picked one, every auxiliary route must be a provider they configured (main,
    ``auxiliary.<task>``, ``fallback_providers``); guessing "whatever else is logged in" bills an
    account they never pointed this session at (xAI OAuth session with a dead token â†’ every
    compression silently charged to a Nous Portal balance).rJ   >   rJ   rL  TuÐ   Auxiliary %s: main provider %s is unavailable and no fallback_chain / fallback_providers is configured â€” refusing to guess another logged-in provider. Re-authenticate (`hermes model`) or declare a fallback.r@  F)rS  rT  rŠ   r‹   )r¬  rà  s     r%   r©  r©  Å  sF   € ð 	Ò˜×"Ñ"Ó$×*Ñ*Ó,°Ñ<ØÜ
‡N�Nð	!à"&¢.¨&°-ôAð r'   c            	      óÂ  — g } t        «       D ]«  \  }}t        |«      }t        ||«      r"t        ||¬«       | j	                  |› d�«       Œ? |«       \  }}|�P| r,t
        j                  d||xs ddj                  | «      «       nt
        j                  d||xs d«       |||fc S | j	                  |«       Œ­ t
        j                  ddj                  | «      «       y)	zJStep 3: hardcoded aggregator/fallback chain, skipping unhealthy providers.r  r§  u4   Auxiliary auto-detect: using %s (%s) â€” skipped: %srÙ   r¨  z$Auxiliary auto-detect: using %s (%s)z·Auxiliary auto-detect: no provider available (tried: %s). Compression, summarization, and memory flush will not work. Set OPENROUTER_API_KEY or configure a local model in config.yaml.r¥  )	r0  r[   rû  rC  rz  rŠ   r¯  r0  r‹   )r±  rÄ   r²  r³  rŒ   r]  s         r%   Ú_try_discovery_chainrþ  Ô  sè   € à€EÜ,Ó.ò ‰ˆˆvÜ4°UÓ;ÐÜ! %Ð);Ô<Ü Ð0BÕCØ�L‰L˜E˜7 ,Ð/Ô0ØÙ›‰ˆ�ØÐÙÜ—‘ÐRØ! 5Ò#5¨I°t·y±yÀÓ7GõIô —‘ÐBÀEÈ5ÒK]ÐT]Ô^Ø˜5 %Ð'Ò'Ø�‰�UÕðô ‡N�Nð WàX\×XaÑXaÐbgÓXhôjð r'   c                 óT  — da t        | «      }t        |j                  dd«      «       t	        ||«      \  }}}}}t        |||||«      }|�|S |r&t        ||xs dd¬«      \  }	}
}|	�|	|
t        |«      fS t        ||xs dd¬«      \  }	}
}|	�|	|
|fS t        ||«      syt        «       S )u¾  Full auto-detection chain, including the selected provider identity. Priority: (1) main provider +
    main model, regardless of provider type ("auto" means "my main model for side tasks too"; explicit
    per-task overrides still win); (2) configured fallback policy â€” task chain, then the main agent's
    top-level chain; (3) OpenRouter â†’ Nous â†’ custom â†’ Codex â†’ API-key providers, only with no policy
    and no working main client.FrJ  rJ   rL  zmain provider unavailablerá  r¥  )r  rý  rñ  r|   rô  rû  rß  rF  rë  r©  rþ  )r×  rà  r  r¬  rÇ  rA   r@   r   ÚroutedrL  rM  r8  s               r%   Ú_resolve_auto_router  ì  sá   € ð ÐÜ% lÓ3€GÜ §¡¨J¸Ó ;Ô<Ü=OÐPWÐY]Ó=^Ñ:€M�:˜x¨°(Ü% m°ZÀÈ7ÐT\Ó]€FØÐØˆÙÜ(FØ�-Ò) 6Ð2Mô)OÑ%ˆ	�8˜XàÐ Ø˜hÔ(EÀhÓ(OÐOÐOÜ$<ØˆmÒ%˜vÐ.Iô%KÑ!€Iˆx˜àÐØ˜( HÐ,Ð,Ü# M°4Ô8ØÜÓ!Ð!r'   c                 ób   — t        | dd«      }t        |t        «      r|r|S t        |xs d«      S )z@Return the concrete provider selected for an auto-routed client.rÛ  rJ   )rP   r2   rK   )rŒ   rI  r  s      r%   rÿ  rÿ  
  s5   € ä  Ð)IÈ2ÓNÐÜÐ$¤cÔ*Ñ/AØ!Ð!ÜˆxŠ~˜2ÓÐr'   c                 ó¸  — ddl m} t        | t        «      r| |fS t        | t        «      rt        | «      |fS t        | t        «      rt        | «      |fS t        | t        «      rt        | «      |fS t        j                  t        «      5  ddlm}m} t        | |«      r || «      |fcddd«       S 	 ddd«       t!        | d«      r| |fS t#        | j$                  «      }ddlm}m}  || «      |dœ}	t-        |d«      rt/        t1        «       «      }
nNt3        |«      r!t/        t5        | j6                  |¬	«      «      }
n"	 dd
lm}  ||«      xs d}t?        |||d¬«      }
i |
xs i ¥ || «      ¥}
|
r|
|	d<   tA        |	| j6                  |¬«       i tC        |d¬«      ¥|	¥}	|	jE                  dd«        |di |	¤Ž|fS # 1 sw Y   �ŒxY w# t<        $ r d}Y Œ…w xY w)uk   Sync client â†’ async counterpart, preserving Codex routing (``is_vision`` adds the Copilot vision header).r   )ÚAsyncOpenAI)rö  ÚAsyncGeminiNativeClientNÚHERMES_SKIP_ASYNC_WRAP)Úasync_api_keyÚconfigured_default_headersr?   ræ  r  )Ú_infer_provider_from_urlrJ   Tr  rõ  r�   r€   r‘   r*   )#r#   r  r2   r>   rJ  rN  rƒ  r‰  r–  r�  rC  rD  r‡   rþ  rö  r  r-  rK   rA   Úagent.auxiliary_async_rebuildr  r  rf   rú  r  Ú_is_official_codex_base_urlr  r@   rv  r	  r}   r  r’   r�   r“   )Úsync_clientr]  r  r  rö  r  Úsync_base_urlr  r  Úasync_kwargsrð  r	  Úinferreds                r%   Ú_to_async_clientr    sä  € å"Ü�+Ô2Ô3Ø˜EÐ!Ð!Ü�+Ô3Ô4Ü(¨Ó5°uÐ<Ð<Ü�+Ô7Ô8Ü,¨[Ó9¸5Ð@Ð@Ü�+Ô5Ô6Ü*¨;Ó7¸Ð>Ð>Ü	×	Ñ	œ[Ó	)ñ ?ß[Ü�kÐ#5Ô6Ù*¨;Ó7¸Ð>÷?ñ ?à6÷?ô
 ˜Ð%=Ô>Ø˜EÐ!Ð!Ü˜×,Ñ,Ó-€M÷
 XÙ,¨[Ó9À}ÑU€LÜ˜]¨OÔ<Ü-Ô.>Ó.@ÓA‰Ü	$ ]Ô	3Ü-Ô.GÈ×H[ÑH[ÐfsÔ.tÓu‰ð	ÝEÙ/°Ó>ÒDÀ"ˆHô ,¨M¸8ÈyÐ^bÔcˆØL�'’-˜RÐLÑ$>¸{Ó$KÐL€GÙØ*1ˆÐ&Ñ'Ü! ,¸[×=PÑ=PÐ[hÕiØaÔ0°È4ÔPÐaÐT`Ða€Lð ×Ñ˜M¨1Ô-ÙÑ&˜Ñ&¨Ð-Ð-÷E?ñ ?ûô. ò 	ØŠHð	ús   ÂF>ÅG Æ>GÇGÇGr“  c                 óL   — | s| S 	 ddl m}  || |«      S # t        $ r | cY S w xY w)zANormalize a resolved model for the provider that will receive it.r   )Únormalize_model_for_provider)Úhermes_cli.model_normalizer  r}   )r“  rJ  r  s      r%   r   r   F  s5   € áØÐðÝKÙ+¨J¸ÓAÐAøÜò ØÒðús   † •#¢#Úcustom_entryrê  c                 ó†  — | j                  d«      xs dj                  «       }| j                  d«      xs | j                  d«      xs dj                  «       }|s|rt        |«      }t        | j                  dd«      xs d«      j                  «       }|r&ddlm}  ||| j                  d«      xs |«      xs |}|sât        j                  t        «      5  dd	l	m
} | j                  d
«      xs | j                  d«      xs |} |||«      D ]†  }		 t        |	«      }
|
j                  «       sŒ |
j                  «       }|€Œ3t        |dd«      xs t        |dd«      xs d}t        |«      j                  «       sŒmt        |«      j                  «       } n ddd«       |xs dS # t        $ r Y Œ¢w xY w# 1 sw Y   ŒxY w)u  Credential for a named custom provider: inline api_key â†’ key_env â†’ key_cmd â†’ credential pool â†’ placeholder.
    Aux resolves named custom providers here, not via _resolve_named_custom_runtime, so key_cmd must be
    honoured at the same precedence or every aux call 401s.r@   rJ   Úkey_envÚapi_key_envÚkey_cmdr   )Úbuild_command_token_providerrD   )Ú#custom_provider_pool_key_candidatesÚprovider_keyNrG  r�   rç  )r|   rS  ra  rK   Úagent.command_token_sourcer  rC  rD  r}   Úagent.credential_poolr  rV   r8  r=  rP   )r  rJ  rê  rë  Úcustom_key_envÚcustom_key_cmdr  r  Ú	pool_nameÚpool_keyr9  Ú
pool_entryÚpool_api_keys                r%   Ú_named_custom_api_keyr$  Q  s·  € ð $×'Ñ'¨	Ó2Ò8°b×?Ñ?ÓA€JØ"×&Ñ& yÓ1ÒZ°\×5EÑ5EÀmÓ5TÒZÐXZ×aÑaÓc€NÙ™.Ü$ ^Ó4ˆ
Ü˜×)Ñ)¨)°RÓ8Ò>¸BÓ?×EÑEÓG€NÙÝKÙ1°.À,×BRÑBRÐSYÓBZÒBfÐ^fÓgÒuÐkuˆ
ÙÜ× Ñ ¤Ó+ñ 	ÝQØ$×(Ñ(¨Ó8Ò`¸L×<LÑ<LÈVÓ<TÒ`ÐX`ˆIÙ?ÀÈYÓWò �ðÜ$ XÓ.�Dð ×+Ñ+Ô-ØØ!Ÿ[™[›]�
ØÐ%ØÜ& zÐ3DÀdÓKÒ|ÌwÐWaÐcqÐsuÓOvÒ|Ðz|�Ü�|Ó$×*Ñ*Õ,Ü!$ \Ó!2×!8Ñ!8Ó!:�JÙð÷	ð" Ò*Ð*Ð*øô !ò Ùðú÷	ð 	ús7   Ã;F7ÄF(Ä AF7Å>F7Æ(	F4Æ1F7Æ3F4Æ4F7Æ7G Ú	raw_codexc                óÌ  — 	 ddl m}m}m}m}m}m}m}	 ddlm	}
  |«       st        j                  d«       y |«       }d}t        |xs || «      xs |} ||«      rR |«       xs d ||«      d	œ} |	|«       t        di |¤Ž}t        j                  d
||«       |r||fS t!        ||«      |fS d|› d�} ||«      r3	  |
|«      }t#        ||d|¬	«      }t        j                  d||«       ||fS t%        ||«      }t        j                  d||«       ||fS # t        $ r t        j                  d«       Y yw xY w# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)u»   AWS Bedrock: Claude â†’ Anthropic Bedrock SDK (prompt caching, thinking); OpenAI models
    (GPT-5.5/5.6) â†’ Bedrock Mantle's OpenAI Responses endpoint; everything else â†’ Converse API.r   )Úhas_aws_credentialsÚis_anthropic_bedrock_modelÚresolve_bedrock_runtime_regionÚis_openai_bedrock_modelÚbedrock_openai_base_urlÚresolve_bedrock_bearer_tokenÚ&configure_bedrock_openai_client_kwargs)Úbuild_anthropic_bedrock_clientzbresolve_provider_client: bedrock requested but boto3, httpx/openai, or anthropic SDK not installedrò  zGresolve_provider_client: bedrock requested but no AWS credentials foundz(anthropic.claude-haiku-4-5-20251001-v1:0r˜  r?   z0resolve_provider_client: bedrock-openai (%s, %s)r™  rš  z9resolve_provider_client: cannot create Bedrock client: %sNz3resolve_provider_client: bedrock anthropic (%s, %s)z2resolve_provider_client: bedrock converse (%s, %s)r*   )r”  r'  r(  r)  r*  r+  r,  r-  rv  r.  r‡   rŠ   r‹   r²   r   r   rJ  rƒ  r–  )rJ  r]  r%  r'  r(  r)  r*  r+  r,  r-  r.  rŒ  Údefault_modelr"  Úclient_kwargsrŒ   rA   rË  r  s                      r%   Ú_build_bedrock_clientr1  r  s�  € ð	÷	
÷ 	
ñ 	
õ
 	Kñ Ô Ü�‰Ð^Ô_Øñ ,Ó-€FØ>€MÜ+¨EÒ,B°]ÀHÓMÒ^ÐQ^€KÙ˜{Ô+ñ 4Ó5ÒB¸Ù/°Ó7ñ)
ˆñ 	/¨}Ô=ÜÑ(˜-Ñ(ˆÜ�‰ÐGÈÐV\Ô]Ù#�ÐU`Ð`Ð`Ô)=¸fÀkÓ)RÐU`Ð`Ð`Ø)¨&¨°Ð@€HÙ! +Ô.ð	Ù8¸Ó@ˆKô *¨+°{ÈIÐ`hÔiˆÜ�‰ÐJÈKÐY_Ô`ð �;ÐÐô (¨°Ó<ˆÜ�‰ÐIÈ;ÐX^Ô_Ø�;ÐÐøôE ò Ü�‰Ð{Ô|Ùðûô4 ò 	Ü�N‰NÐVÐX[Ô\Üûð	ús)   ‚D Â=D: ÄD7Ä6D7Ä:	E#ÅEÅE#c                 ó¬  — 	 ddl m}m}  |«       st        j                  d«       y |«       \  }}|r|st        j                  d«       yt        |xs d| «      }	 ddlm	}  |||¬	«      }t        j                  d|«       ||fS # t        $ r t        j                  d«       Y yw xY w# t        $ r }	t        j                  d
|	«       Y d}	~	yd}	~	ww xY w)zkGoogle Vertex AI: Gemini via the OpenAI-compatible endpoint with an OAuth2 bearer (standard OpenAI client).r   )r+  Úhas_vertex_credentialszGresolve_provider_client: vertex requested but google-auth not installedrò  zFresolve_provider_client: vertex requested but no GCP credentials foundzTresolve_provider_client: vertex requested but could not mint token / resolve projectzgoogle/gemini-3-flash-previewr   r?   z8resolve_provider_client: cannot create Vertex client: %sNz$resolve_provider_client: vertex (%s))r,  r+  r3  r‡   rŠ   r‹   r²   r   r#   r   r}   )
rJ  r]  r+  r3  rÂ  rA   r"  Ú_VertexOpenAIrŒ   r  s
             r%   Ú_build_vertex_clientr5  ¡  sË   € ðßRñ "Ô#Ü�‰Ð]Ô^ØÙ'Ó)�O€Eˆ8Ù™Ü�‰ÐmÔnØÜ+¨EÒ,TÐ5TÐV^Ó_€Kðå2Ù u°xÔ@ˆô ‡L�LÐ7¸ÔEØ�;ÐÐøô' ò Ü�‰Ð`ÔaÙðûô ò Ü�‰ÐQÐSVÔWÜûðús)   ‚B ÁB* ÂB'Â&B'Â*	CÂ3CÃCc                   óÂ   — e Zd ZU dZeed<   eed<   ee   ed<   eed<   eed<   ee   ed<   eeee	g ef   f      ed<   ee   ed	<   ee
eef      ed
<   eed<   ee   ed<   y)Ú_ResolveRequestzYNormalized resolve_provider_client() arguments shared by the per-provider branch helpers.rJ  Úoriginal_providerr]  r�   r%  r  r   r   r×  r  rà  N)r8   r9   r:   r;   rK   rI  r	   rO   r   r   r   r   r*   r'   r%   r7  r7  »  sy   … ÙcØƒMØÓØ�C‰=ÓØÓØƒOØ ‘}Ó$Ø˜u S¨(°2°s°7Ñ*;Ð%;Ñ<Ñ=Ó=Ø�s‰mÓØ˜4  S ™>Ñ*Ó*ØƒOØ
�3‰-Ôr'   r7  c                 ó€   — t        | «      rt        | t        «      s| S t        | t        «      r| j                  «       S dS )z\A key_cmd/Entra callable passes through uncalled; strings are stripped; anything else is ''.rJ   )rª   r2   rK   rS  rA  s    r%   rÓ  rÓ  Í  s1   € ä�„}œZ¨¬SÔ1Øˆ
Ü$ S¬#Ô.ˆ3�9‰9‹;Ð6°BÐ6r'   Úseenr  c                 ó\   — || vr(| j                  |«       t        j                  |g|¢­Ž  yy)zQDebug-log ``msg`` the first time ``key`` is seen so per-call retries stay silent.N)rˆ  rŠ   r²   )r:  rØ   r  r.   s       r%   Ú_log_once_debugr<  Ô  s*   € à
�$�Ø�‰�ŒÜ�‰�SÐ ˜4Ô ð r'   Úreqc                 óB  — ddl m} ddlm} ddlm}  || j                  |«      ryt        | j                  «      }t        |xrX  ||j                  dd«      |j                  dd«      «      xr-  | ||«      «       | ||j                  dd«      «      «      k(  «      S )	Nr   r.  r  )Únormalize_route_base_urlTrJ  rJ   rA   )rE  r/  r)  r   Úhermes_cli.route_identityr?  rJ  rý  r×  rO   r|   )r=  rA   r/  r   r?  r  s         r%   Ú_is_actual_auxiliary_routerA  Û  s•   € Ý9Ý4ÝBá�s—|‘| XÔ.ØÜ% c×&6Ñ&6Ó7€GÜØò 	
Ù˜GŸK™K¨
°BÓ7¸¿¹ÀZÐQSÓ9TÓUò	
á$Ñ%>¸xÓ%HÓIÙ#Ù% g§k¡k°*¸bÓ&AÓBó
ñ
óð r'   Úfinal_model_strÚbase_url_strÚapi_key_strc                 óv  — t        | |«      r't        |t        «      r|j                  n|}d|_        |S ddlm}  || j                  ||«      \  }}|r| j                  |¬«      |}} t        |t        «      xs | j                   xrF | j                  dk(  xs5 | j                   xr& t        |«      dk(  xr d|xs dj                  «       v }	|	r9t        j                  d	| j                  xs d
||r|dd nd«       t        ||«      S | j                  xs t        | j                  «      }
t!        |||||
«      S )uq  Wrap a plain OpenAI client in the right transport adapter; specialized wrappers pass through.
    Codex (Responses API): explicit ``api_mode=codex_responses``, else â€” with no
    explicit api_mode â€” api.openai.com + codex model. Anthropic (Messages): ``api_mode=anthropic_messages``,
    any ``/anthropic`` suffix, ``api.kimi.com/coding``, or ``api.anthropic.com``.Úactualr   ©Úopencode_transport)r   r  úapi.openai.comrP  rJ   zeresolve_provider_client: wrapping client in CodexAuxiliaryClient (api_mode=%s, model=%s, base_url=%s)r¥  NrW  )rA  r2   rJ  rG  rÛ  Úagent.opencode_affinityrH  rJ  r5  r%  r   rg   rT  rŠ   r²   Ú_profile_declared_messages_wirer§  )r=  r*  rB  rC  rD  rŒ   rH  Ú_oc_modeÚ_oc_baseÚneeds_codexr   s              r%   Ú_wrap_transportrO  í  sR  € ô " # |Ô4ô ˜*Ô&:Ô;ð ×#Ò#àð 	ð
 19ˆÔ-Øˆõ ;Ù+¨C¯L©L¸/È<ÓXÑ€HˆhÙØŸL™L°(˜LÓ;¸Xˆ\ˆä�:Ô3Ó4ÒE¸¿¹ðò 	ð 	�‰Ð)Ñ)ò 	
à—‘Ðò ;Ü! ,Ó/Ð3CÑCò;à˜OÒ1¨r×8Ñ8Ó:Ð:ð ñ Ü�‰ð <à—\‘\Ò4 _°oÑ\hÀ|ÐTWÐUWÑGXÐnpô	rô $ J°Ó@Ð@ð �|‰|ÒLÔ>¸s¿|¹|ÓL€HÜ  ¨_¸kÈ<ÐYaÓbÐbr'   c                 óš   — ddl m}  |t        | xs d«      j                  «       j	                  «       «      }|�|j
                  dk(  rdS dS )zW``"anthropic_messages"`` when the registered profile declares that api_mode, else None.r   rª  rJ   Nrt  )r¿  r«  rK   rS  rT  r   r  s      r%   rK  rK    sJ   € å.Ù"¤3 x¢~°2Ó#6×#<Ñ#<Ó#>×#DÑ#DÓ#FÓG€GØ#*Ð#6¸7×;KÑ;KÐOcÒ;cÐÐmÐimÐmr'   c                 óR   — | j                   rt        ||| j                  ¬«      S ||fS )zPReturn (client, model), converting to the async wrapper when ``req.async_mode``.©r  )r�   r  r  )r=  r*  rB  s      r%   Ú_route_clientrS    s'   € à
‡~‚~Ü 
¨OÀsÇ}Á}ÔUÐUØ�Ð&Ð&r'   Úunavailable_msgc                 ó’   — |€t        j                  |g|¢­Ž  yt        | |t        | j                  xs || j
                  «      «      S )zpRoute ``client`` on ``req.model or default``; warn and return (None, None) when the provider produced no client.rò  )rŠ   r‹   rS  r   r]  rJ  )r=  rŒ   rÙ   rT  r.   s        r%   Ú_route_or_warnrV  $  sB   € à€~Ü�‰�Ð.¨Ó.ØÜ˜˜fÔ&?ÀÇ	Á	Ò@TÈWÐVY×VbÑVbÓ&cÓdÐdr'   c                 ó”  — t        | j                  | j                  ¬«      \  }}}|€y| j                  }|r#d|v r|rd|vrt        j                  d||«       d}t        | ||xs |«      \  }}|�|r	 t        |d|«       ||fS ||fS # t        t        f$ r0 t        j                  dt        |«      j                  |«       Y ||fS w xY w)zmAuto: try all providers in priority order; tag the client with the effective provider (survives cache reuse).)r×  rà  Nrò  r_  z\Dropping OpenRouter-format model %r for non-OpenRouter auxiliary provider (using %r instead)rÛ  z7Auxiliary client %s cannot retain effective provider %s)r  r×  rà  r]  rŠ   r²   rS  Úsetattrrˆ   r0  rá   r8   )r=  rŒ   r  r  r]  Úrouted_clientÚrouted_models          r%   Ú_resolve_auto_branchr[  ,  sô   € ä+>ÈC×L\ÑL\Ðcf×ckÑckÔ+lÑ(€FˆHÐ(Ø€~ØØ�I‰I€Eñ �˜‘¡(¨s¸(Ñ/BÜ�‰ð =Ø>CÀXô	OàˆÜ"/°°V¸UÒ=NÀhÓ"OÑ€M�<ØÐ Ñ%7ð	KÜ�MÐ#CÐEWÔXð ˜,Ð&Ð&ˆ=˜,Ð&Ð&øô ¤	Ð*ò 	KÜ�L‰LÐRÜ˜mÓ,×5Ñ5Ð7IõKà˜,Ð&Ð&ð	Kús   Á3B Â9CÃCc                 ó  — t        | j                  | j                  ¬«      \  }}|€+t        j	                  dt        | j                  ¬«      «       yt        | |t        | j                  xs || j                  «      «      S )zOpenRouter.)r   r]  z4resolve_provider_client: openrouter requested but %srb  rò  )	r-  r   r]  rŠ   r‹   r'  rS  r   rJ  ©r=  rŒ   rÙ   s      r%   Ú_resolve_openrouter_branchr^  B  sj   € ä%°s×7KÑ7KÐSV×S\ÑS\Ô]�O€FˆGØ€~Ü�‰ÐMÜ7¸c¿i¹iÔHô	JàÜ˜˜fÔ&?ÀÇ	Á	Ò@TÈWÐVY×VbÑVbÓ&cÓdÐdr'   c                 óÞ  — | j                   }t        | j                  xs= |t        j	                  «       v xs% |xs dj                  «       j                  «       dk(  ¬«      \  }}|€t        j                  d«       yt        |xs || j                  «      }ddlm} t        ||t        t        |dd«      xs d«      t        t        |d	d«      xs d«       ||«      «      }t!        | ||«      S )
zNous Portal (OAuth).rJ   zmimo-v2-omnir9  zYresolve_provider_client: nous requested but Nous Portal not configured (run: hermes auth)rò  r   ©Únous_api_moder@   rA   )r]  r@  r  rè  rÃ  rS  rT  rŠ   r‹   r   rJ  r)  ra  r§  rK   rP   rS  )r=  r]  rŒ   rÙ   r"  ra  s         r%   Ú_resolve_nous_branchrb  L  sÜ   € à�I‰I€Eä¨¯©ò )[¸ÔBY×B`ÑB`ÓBbÐ9bò )[Ø,1ªK°R×+>Ñ+>Ó+@×+FÑ+FÓ+HÈNÑ+Zô]�O€FˆGà€~Ü�‰ÐrÔsØÜ+¨EÒ,<°W¸c¿l¹lÓK€Kõ 3Ü"Ø�œS¤¨°¸BÓ!?Ò!EÀ2ÓFÜŒG�F˜J¨Ó+Ò1¨rÓ2±MÀ+Ó4Nó€Fô ˜˜f kÓ2Ð2r'   c                 óh  — | j                   }|st        j                  d«       yd}| j                  ret	        «       }|st        j                  |«       yt        «       xs t        }t        ||t        ||¬«      ¬«      }|t        || j                  «      fS t        |«      \  }}t        | |||«      S )u'   OpenAI Codex (OAuth â†’ Responses API).z¬resolve_provider_client: openai-codex requested without a model; pass model explicitly (e.g. model.model in config.yaml or auxiliary.<task>.model for per-task aux routing).rò  zbresolve_provider_client: openai-codex requested but no Codex OAuth token found (run: hermes model)r  r"  )r]  rŠ   r‹   r%  rï  r  r  r”   r  r   rJ  r  rV  )r=  r]  Úno_token_msgr  rA   Ú
raw_clientrŒ   rÙ   s           r%   Ú_resolve_openai_codex_branchrf  `  s«   € à�I‰I€EÙÜ�‰ð Nô 	Oð Øw€LØ
‡}‚}ä.Ó0ˆÙÜ�N‰N˜<Ô(ØÜ+Ó-ÒDÔ1DˆÜ*°;ÈÜ;TÐU`ÐksÔ;tôvˆ
àÔ4°U¸C¿L¹LÓIÐIÐIÜ)¨%Ó0�O€FˆGÜ˜#˜v w°Ó=Ð=r'   c                 óN   — t        | j                  «      \  }}t        | ||d«      S )uÎ   xAI Grok OAuth (device code â†’ Responses API). Without this branch xai-oauth falls to the generic
    oauth_external arm, returns (None, None), and silently re-routes every aux task to the Step-2 fallback.uˆ   resolve_provider_client: xai-oauth requested but no xAI OAuth token found (run: hermes model -> xAI Grok OAuth â€” SuperGrok / Premium+))r  r]  rV  r]  s      r%   Ú_resolve_xai_oauth_branchrh  w  s1   € ô 2°#·)±)Ó<�O€FˆGÜ˜#˜v wðmónð nr'   c                 ó$  — | j                   | j                  | j                  }}}dx}x}}| j                  �r t	        | j                  «      j                  «       }| j                  t        v r8t        |«      j                  j                  d«      s|j                  d«      dz   }| j                  dk(  r-| j                  xs dj                  «       j                  d«      }| j                  t        v rt        | j                  «      xs d}n3t        | j                  «      xs t        d«      xs t        |«      xs d}|sut         j#                  d«       y|r]t%        |j'                  d	«      xs d«      j                  «       j                  d«      }t        |j'                  d
«      «      }|r|r||}}|r§|r¥t)        | |«      rddlm}	  |	|«      }t/        |xs |r|j'                  d«      ndxs d|«      }
i }t1        |«      \  }}|r||d<   t3        ||| j4                  ¬«      }|r||d<   t7        d||dœ|¤Ž}t9        | ||
|xs ||«      }t;        | ||
«      S t<        t>        fD ]�  } |«       \  }}|€Œt/        |xs ||«      }
tA        |d
d«      }tC        |«      rtE        |t$        «      sdnt%        |xs d«      }t9        | ||
t%        tA        |d	d«      xs d«      |«      }t;        | ||
«      c S  t         j#                  d«       y)z3Custom endpoint (OPENAI_BASE_URL + OPENAI_API_KEY).rJ   r_  r­  rt  rç  rä  zQresolve_provider_client: explicit custom endpoint requested but base_url is emptyrò  rA   r@   r   r.  r]  Nr  r  rR  rõ  r?   zPresolve_provider_client: custom/main requested but no endpoint credentials foundr*   )#rJ  r]  r×  r  r5  rS  r8  rB  r   rT  rÀ  r   rÓ  r   ra  rb  rŠ   r‹   rK   r|   rA  rE  r/  r   r:  r  r  r”   rO  rS  r  r  rP   rª   r2   )r=  rJ  r]  r×  rê  rë  Ú	wrap_baseÚ
_main_baseÚ	_main_keyr/  r"  r  r	  r
  r  rŒ   r²  rÙ   Ú	_raw_ckeyÚ_ckeys                       r%   Ú_resolve_custom_branchro  €  s
  € à$'§L¡L°#·)±)¸S×=MÑ=M�\ˆe€Hð ,.Ð-€KÐ-�*˜yØ
×ÓÜ)¨#×*?Ñ*?Ó@×FÑFÓHˆð × Ñ Ô$9Ñ9Ä(È;ÓBW×B\ÑB\×BbÑBbÐcfÔBgØ%×,Ñ,¨SÓ1°EÑ9ˆKØ�<‰<Ð/Ò/Ø×.Ñ.Ò4°"×;Ñ;Ó=×DÑDÀSÓIˆIØ× Ñ Ô$9Ñ9ô ,¨C×,@Ñ,@ÓAÒVÐEV‰Jô # 3×#7Ñ#7Ó8ò %Ü"Ð#3Ó4ò%ä2°;Ó?ò%ð %ð	 ñ Ü�N‰NÐnÔoØÙ	ô
 ˜×)Ñ)¨*Ó5Ò;¸Ó<×BÑBÓD×KÑKÈCÓPˆ
Ü& |×'7Ñ'7¸	Ó'BÓCˆ	Ù™)Ø&0°)˜ˆKÙ‘zÜ% c¨;Ô7ÝAÙ3°KÓ@ˆKÜ/ØÒ[±<�l×&Ñ& wÔ/ÀTÒ[ÈmÐ]eó
ˆð ˆÜ4°[ÓAÑˆ�SÙØ%(ˆE�/Ñ"Ü3°KÀÐUX×UbÑUbÔcˆÙØ'6ˆEÐ#Ñ$Ü&ÐY¨zÀKÑYÐSXÑYˆÜ   f¨k¸9Ò;SÈÐU_Ó`ˆÜ˜S &¨+Ó6Ð6ô (Ô)BÐCò 	;ˆÙ ›(‰ˆ�ØÑÜ3°EÒ4D¸WÀhÓOˆKô   ¨	°2Ó6ˆIÜ# IÔ.´zÀ)ÌSÔ7Q‘BÔX[Ð\eÒ\kÐikÓXlˆEÜ$ S¨&°+¼sÄ7È6ÐS]Ð_aÓCbÒChÐfhÓ?iÐkpÓqˆFÜ   f¨kÓ:Ò:ð	;ô ‡N�NÐeÔfØr'   rë  c                 ó˜   — t        t        | «      «      \  }}|rd|ini }t        d«      }|r
i |xs i ¥|¥}|r||d<   t        d||dœ|¤ŽS )a  Plain OpenAI client on the /v1 equivalent of a named custom entry's base URL.

    ``extra_headers`` is the entry's own header block (gateway routing tags, proxy auth): the main
    runtime lifts it onto every request, so aux must too (#109595). SECURITY: never log the values.r  Nrõ  r?   r*   )r:  r5  rú  r”   )rê  rë  rö  r	  r
  r  Ú_headerss          r%   Ú _named_custom_openai_wire_clientrr  È  sj   € ô
 1Ô1DÀ[Ó1QÓRÑ€K�Ù'*ˆo˜sÑ#°€FÜ*¨4Ó0€HÙØ8�x’~ 2Ð8¨-Ð8ˆÙØ$,ˆÐ Ñ!Ü ÐT¨¸kÑTÈVÑTÐTr'   c                 ón  — ddl m} | j                  }d}| j                  r!| j                  |k7  r || j                  «      }|€ ||«      }|sy| j                  xs |j                  d«      xs dj                  «       }t        | j                  «      xs t        |||«      }|dk(  r)t        j                  d|j                  d«      xs |«       | j                  xs |j                  d	«      xs dj                  «       }t        | |«      rdd
lm}  ||«      }d}|st        j                  d|«       yddlm}  ||j                  d«      «      }	t%        | j&                  xsL |j                  d«      xs9 | j(                  r| j(                  j                  d«      ndxs t+        «       xs d|«      }
ddlm}  |||
|«      \  }}|r||}}t        j1                  d||
|xs d«       |dk(  rL	 ddlm} ddlm}  |||«      }|	r|j;                  |	¬«      }t?        | tC        ||
|| |||«      ¬«      |
«      S tA        |||	«      }|dk(  rtE        ||
«      }ntG        | ||
||«      }t?        | ||
«      S # t<        $ r1 t        j                  d|«       t?        | tA        |||	«      |
«      cY S w xY w)zeNamed custom provider (config.yaml providers dict / custom_providers list); None if no entry matches.r   rö  NrA   rJ   rç  u­   resolve_provider_client: named custom provider %r has no resolvable api_key â€” request will be sent with placeholder no-key-required and will 401 on auth-required endpointsrD   r   r.  ro  zAresolve_provider_client: named custom provider %r has no base_urlrò  )Únormalize_extra_headersrö  r]  r  rG  zCresolve_provider_client: named custom provider %r (%s, api_mode=%s)rt  r£  r  )rõ  u…   Named custom provider %r declares api_mode=anthropic_messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire.r¦  r  )$rè  r÷  rJ  r8  r  r|   rS  rÓ  r   r$  rŠ   r‹   r   rA  rE  r/  r{   rt  r   r]  r×  r\  rJ  rH  r²   rv  r¤  r  r  Úwith_optionsr‡   rS  rr  rƒ  rJ  rO  )r=  r÷  rJ  r  rê  rë  Úentry_api_moder/  rt  Úentry_headersr"  rH  rL  rM  r¤  r  rË  rŒ   s                     r%   Ú_resolve_named_custom_branchrx  ×  sÞ  € åFØ�|‰|€Hð €LØ
×Ò ×!6Ñ!6¸(Ò!BÙ1°#×2GÑ2GÓHˆØÐÙ1°(Ó;ˆÙØð ×(Ñ(ÒN¨L×,<Ñ,<¸ZÓ,HÒNÈB×UÑUÓW€KÜ# C×$8Ñ$8Ó9ÒwÔ=RÐS_ÐaiÐkvÓ=w€JØÐ&Ò&Ü�‰ð AàBN×BRÑBRÐSYÓBZÒBfÐ^fô	hð —l‘lÒH l×&6Ñ&6°zÓ&BÒHÀb×OÑOÓQ€NÜ! # {Ô3Ý=Ù/°Ó<ˆØ+ˆÙÜ�‰ÐZÐ\dÔeØÝ9Ù+¨L×,<Ñ,<¸_Ó,MÓN€MÜ+Ø�	‰	ò 	Ø×Ñ˜GÓ$ò	à-0×-=Ò-=ˆC×Ñ× Ñ  Ô)À4ò	ô $Ó%ò	ð Øó€Kõ ;Ù+¨H°kÀ;ÓOÑ€HˆhÙØ&.°˜ˆÜ
‡L�LÐVØ˜;¨Ò(LÐ:LôNð
 Ð-Ò-ð	}ÝFÝLÙ0°¸[ÓIˆKÙð *×6Ñ6À}Ð6ÓU�ô
 ØÔ)¨+°{ÀJÐP[Ù3KÈKÐYcÓ3dôfØgrótð 	tô .¨k¸:À}ÓU€FàÐ*Ò*Ü% f¨kÓ:‰ä   f¨k¸;È
ÓSˆÜ˜˜f kÓ2Ð2øô ò 	}Ü�N‰Nð OØPXôZä  Ô&FÀ{ÐT^Ð`mÓ&nÐp{Ó|Ò|ð	}ús   Ç4)I: É:7J4Ê3J4c                 ó’   — t        | j                  | j                  | j                  | j                  ¬«      \  }}t        | ||d«      S )zÔAzure Foundry via the runtime resolver: the generic PROVIDER_REGISTRY path only knows the static
    AZURE_FOUNDRY_API_KEY env var, missing ``auth_mode: entra_id`` (callable bearer) and config base_url overrides.r  zsresolve_provider_client: azure-foundry requested but runtime resolution failed (run: hermes doctor for diagnostics))r#  r]  r   r  r   rV  )r=  rŒ   r/  s      r%   Ú_resolve_azure_foundry_branchrz  %  sP   € ô /°S·Y±YÐQT×QeÑQeØAD×AVÑAVÐad×amÑamôoÑ€FˆMä˜#˜v }ð[ó\ð \r'   r0  c                 ó¸   — 	 ddl m}  || «      }|€y	  |j                  di |¤ŽS # t        $ r Y yw xY w# t        $ r t        j                  d| d¬«       Y yw xY w)uô  Registered profile's own client for an ``api_key`` aux route, or ``None``.

    Same registration seam as ``agent_runtime_helpers._provider_supplied_client`` (main agent)
    and the ``external_process`` branch below: a profile whose wire protocol is not
    OpenAI-over-HTTP overrides ``ProviderProfile.create_client()`` to supply its transport.
    A profile that raises is logged and skipped â€” a third-party plugin can only fail to
    provide a client, never take the auxiliary resolution down.r   rª  Nz{resolve_provider_client: provider profile %r failed to create an auxiliary client; falling back to the standard client pathTr°   r*   )r¿  r«  r}   Úcreate_clientrŠ   r‹   )rJ  r0  r«  rÐ  s       r%   Ú _api_key_profile_supplied_clientr}  /  s~   € ðÝ2Ù& xÓ0ˆð €ØðØ$ˆw×$Ñ$Ñ5 }Ñ5Ð5øô ò Ùðûô ò Ü�‰ð Tà¨$ð 	ô 	0ñ ð	ús   ‚& ”5 ¦	2±2µ!AÁAr  Úresolve_credsc                 ó¤  — | j                   }|dk(  r't        | j                  ¬«      \  }}t        | ||d«      S  ||«      }t	        |j                  dd«      «      j                  «       }t        | j                  «      xs |}t	        |j                  dd«      «      j                  «       j                  d«      xs |j                  }| j                  r)| j                  j                  «       j                  d«      }|dk(  r@t        j                  t        «      5  d	d
lm}	m}
m}  ||«      }|s
 |
|«      r|	}ddd«       |sGt%        |j&                  «      |dk(  rdgng z   }t(        j+                  d|dj-                  |«      «       yt/        |«      }| j                  r7|dk7  r2t/        | j                  j                  «       j                  d«      «      }t1        | j2                  xs t5        |«      |«      }t7        |||¬«      }|�$t(        j+                  d||«       t9        | ||«      S |dk(  r>d	dlm}m}  ||«      r. |||¬«      }t(        j+                  d||«       t9        | ||«      S tA        ||| jB                  d¬«      }tE        d||dœ|rd|ini ¤Ž}|dk(  r`|r^| jF                  sRt        j                  tH        «      5  d	dl%m&}  ||«      r"t(        j+                  d|«       tO        ||«      }ddd«       tQ        | ||||«      }t(        j+                  d||«       t9        | ||«      S # 1 sw Y   �Œ xY w# 1 sw Y   ŒIxY w)zgPROVIDER_REGISTRY ``api_key`` providers (Anthropic via its own resolver), honouring explicit overrides.rÛ  )r   zOresolve_provider_client: anthropic requested but no Anthropic credentials foundr@   rJ   rA   r_  rF  r   )ÚACTUAL_LOCAL_NOAUTH_PLACEHOLDERÚis_actual_local_base_urlr/  Nrô  zgh auth tokenzJresolve_provider_client: provider %s has no API key configured (tried: %s)r¨  rò  r?   zDresolve_provider_client: %s native client from provider profile (%s)rÕ  rõ  ú resolve_provider_client: %s (%s)Tr  rõ  )Ú!_should_use_copilot_responses_apiud   resolve_provider_client: copilot model %s needs Responses API â€” wrapping with CodexAuxiliaryClientr*   ))rJ  rü  r   rV  rK   r|   rS  rÓ  rÀ  rM  r  rC  rD  r}   rE  r€  r�  r/  r  Úapi_key_env_varsrŠ   r²   r0  r5  r   r]  rÓ  r}  rS  rþ  rö  r÷  r  r  r”   r%  r‡   rÿ  rƒ  rJ  rO  )r=  r  r~  rJ  rŒ   r/  rÄ  r@   r  r€  r�  r/  Útried_sourcesrA   r"  Úprofile_clientrö  r÷  rð  rƒ  s                       r%   Ú_resolve_api_key_branchr‡  G  s  € à�|‰|€HØ�;ÒÜ .À×@TÑ@TÔ UÑˆ�Ü˜c 6¨=Øoóqð 	qá˜(Ó#€EÜ�%—)‘)˜I rÓ*Ó+×1Ñ1Ó3€Gô ! ×!5Ñ!5Ó6ÒA¸'€GÜ�u—y‘y ¨RÓ0Ó1×7Ñ7Ó9×@Ñ@ÀÓEÒcÈ×IcÑIc€LØ
×ÒØ×,Ñ,×2Ñ2Ó4×;Ñ;¸CÓ@ˆØ�8ÒÜ× Ñ ¤Ó+ñ 	:÷ñ ñ 5°\ÓBˆLÙÑ7¸ÔEØ9�÷	:ñ Ü˜W×5Ñ5Ó6ÈxÐ[dÒOd¸?Ñ:KÐjlÑmˆÜ�‰ÐaØ˜tŸy™y¨Ó7ô	9àÜ" <Ó0€Hà
×Ò ¨XÒ!5Ü& s×'<Ñ'<×'BÑ'BÓ'D×'KÑ'KÈCÓ'PÓQˆÜ+¨C¯I©IÒ,^Ô9TÐU]Ó9^Ð`hÓi€Kä5°hÈÐZbÔc€NØÐ!Ü�‰Ð[Ð]eÐgrÔsÜ˜S .°+Ó>Ð>Ø�8Òß]Ù$ XÔ.Ù'°À(ÔKˆFÜ�L‰LÐ;¸XÀ{ÔSÜ   f¨kÓ:Ð:Ü'¨°(ÀcÇmÁmÐY]Ô^€GÜ"Ð{¨7¸XÑ{ÑjqÐK\Ð^eÑJfÐwyÑ{€Fð �9Ò¡°S·]²]Ü× Ñ ¤Ó-ñ 	CÝKÙ0°Ô=Ü—‘ð TØU`ôbä-¨f°kÓB�÷	Cô ˜S &¨+°|ÀWÓM€FÜ
‡L�LÐ3°X¸{ÔKÜ˜˜f kÓ2Ð2÷W	:ñ 	:ú÷B	Cð 	Cús   ÄL9Ë1MÌ9MÍMc           
      ó†  — | j                   }t        | j                  xs5 | j                  r| j                  j	                  d«      ndxs
 t        «       |«      }	 ddlm}  ||«      }|��	t        |j	                  dd«      «      j                  «       }t        |j	                  dd«      «      j                  «       }|st        j                  d|«       y	|r|st        j                  d
|«       y		 |j                  ||t        |j	                  dd«      «      j                  «       xs dt        |j	                  d«      xs g «      ¬«      }|�$t        j                  d||«       t!        | ||«      S t#        t$        |d|«       y	# t        $ r d}Y �Œ-w xY w# t        $ r t        j                  d|d¬«       d}Y Œpw xY w)zVPROVIDER_REGISTRY ``external_process`` providers, served via their registered profile.r]  Nr   rª  r@   rJ   rA   zMresolve_provider_client: %s requested but no model was provided or configuredrò  zUresolve_provider_client: %s requested but external process credentials are incompleteÚcommandr.   )r@   rA   r‰  r.   zOresolve_provider_client: profile %r failed to create an external-process clientTr°   r‚  zLresolve_provider_client: external-process provider %s not directly supported)rJ  r   r]  r×  r|   r\  r¿  r«  r}   rK   rS  rŠ   r‹   r|  r  r²   rS  r<  ro   )	r=  rÄ  rJ  r"  Ú_get_provider_profileÚ_extproc_profiler@   rA   rŒ   s	            r%   Ú _resolve_external_process_branchrŒ  …  s¯  € à�|‰|€HÜ+Ø�	‰	Òp°s×7GÒ7G�c×&Ñ&×*Ñ*¨7Ô3ÈTÒpÔVnÓVpØó€Kð ÝKÙ0°Ó:Ðð Ñ#Ü�e—i‘i 	¨2Ó.Ó/×5Ñ5Ó7ˆÜ�u—y‘y ¨RÓ0Ó1×7Ñ7Ó9ˆÙÜ�N‰NÐjÐltÔuØÙ™hÜ�N‰NÐrÐt|Ô}Øð	Ø%×3Ñ3Ø¨(Ü˜EŸI™I i°Ó4Ó5×;Ñ;Ó=ÒEÀÌDÐQV×QZÑQZÐ[aÓQbÒQhÐfhÓLið 4ó kˆFð ÐÜ�L‰LÐ;¸XÀ{ÔSÜ   f¨kÓ:Ð:ÜÔ4°hð)Ø*2ô4ð øô3 ò  ØÓð ûô ò 	Ü�N‰NÐlØ#¨dð ô 4àŠFð	ús%   ÁF Ã3AF ÆFÆFÆ#G Æ?G c                 ó@  — | j                   }	 ddlm}m}m} |j                  |«      }|€t        t        |d|«       y|j                  }|dk(  rt        | ||«      S |dk(  rt        |  ||«      «      S |dk(  rt        || j                  «      \  }}nX|d	k(  r&t!        || j                  | j"                  ¬
«      \  }}n-|dv rt        t$        |d|«       yt        t&        ||fd||«       y|�t)        | ||«      S dS # t
        $ r t        j                  d|«       Y yw xY w)zUPROVIDER_REGISTRY providers, dispatched on ``auth_type``; unknown providers log once.r   )rñ  r¨  Ú-resolve_external_process_provider_credentialsz-hermes_cli.auth not available for provider %srò  z,resolve_provider_client: unknown provider %rr@   Úexternal_processr.  Úaws_sdk)r%  >   Úoauth_externalÚoauth_device_codezMresolve_provider_client: OAuth provider %s not directly supported, try 'auto'z6resolve_provider_client: unhandled auth_type %s for %s)rJ  rE  rñ  r¨  rŽ  r‡   rŠ   r²   r|   r<  rm   rú  r‡  rŒ  r5  r]  r1  r%  rp   rn   rS  )	r=  rJ  rñ  r¨  rŽ  r  rú  rŒ   r"  s	            r%   Ú_resolve_registry_branchr“  ­  sK  € à�|‰|€Hð÷	
ñ 	
ð  ×#Ñ# HÓ-€GØ€ÜÔ5°xØFÈô	RàØ×!Ñ!€IØ�IÒÜ& s¨GÐ5YÓZÐZØÐ&Ò&Ü/°Ñ5bÐckÓ5lÓmÐmØ�HÒÜ2°8¸S¿Y¹YÓGÑˆ‘Ø	�iÒ	Ü3°H¸c¿i¹iÐSV×S`ÑS`ÔaÑˆ‘Ø	Ð=Ñ	=äÔ6¸ð9Ø:Bô	Dð ô 	Ô7¸)ÀXÐ9NØPØ! 8ô	-ð Ø6<Ð6HŒ=˜˜f kÓ2ÐZÈlÐZøô; ò Ü�‰ÐDÀhÔOÙðús   Ž
C; Ã;DÄD)rL  rþ  r§  rQ  rÝ  r;  Ú_EXPLICIT_PROVIDER_BRANCHESc
                 ó  — t        «        | xs dj                  «       j                  «       }
t        | «      } t	        t        |xs d«      «      j                  «       xs d}| dk(  rkt        |«      \  }}|r[|rY|j                  «       j                  «       }
t        |«      } |}|r,t        |«      j                  «       j                  d«      rd}d}|s'| dk7  r"| dk(  r|st        | «      xs t        «       xs |}t        | |
|||||||||	«      }t        j                  | «      }|
j                  d«      }|�|t        v r	 t        |«      }|�|S |� ||«      S | dk(  rt#        |«      S t%        |«      S # t         $ r d}Y Œ6w xY w)	uv  Central router: return a configured client (auth, base URL, API format) for a provider + optional model.
    The client always exposes ``.chat.completions.create()``; Codex/Responses providers get an adapter.
    ``provider``: built-in name, ``custom:<name>``, "custom" (OPENAI_BASE_URL + OPENAI_API_KEY) or "auto"
    (full auto-detection chain). ``model=None`` â†’ provider's default aux model. ``raw_codex`` â†’ bare OpenAI
    client for ``responses.stream()`` callers. ``api_mode`` forces "codex_responses"/"chat_completions"/
    "anthropic_messages" instead of auto-detect. Returns (client, resolved_model) or (None, None).rJ   NrR  zmoa://rL  r§  rM  r  )rü  rS  rT  r[  rZ   rK   rY  rU  rÓ  r\  r7  r”  r|   ÚremoveprefixrB  rx  r‡   rz  r“  )rJ  r]  r�   r%  r  r   r   r×  r  rà  r8  rÈ  rÉ  r=  ÚbranchÚalias_identityr  s                    r%   rÆ  rÆ  á  s©  € ô Ôð "š R×.Ñ.Ó0×6Ñ6Ó8ÐÜ& xÓ0€HÜ"¤3 x¢~°2Ó#6Ó7×=Ñ=Ó?ÒGÀ4€Hð �5ÒÜ$;¸EÓ$BÑ!ˆ�zÙ™ZØ -× 3Ñ 3Ó 5× ;Ñ ;Ó =ÐÜ.¨}Ó=ˆHØˆEá ¤SÐ):Ó%;×%AÑ%AÓ%C×%NÑ%NÈxÔ%XØ$(Ð!Ø#'Ð ñ
 �X Ò'°¸VÒ1CÉ	ô0 ,¨HÓ5Ò\Ô9QÓ9SÒ\ÐW\ˆÜ
ØÐ# U¨J¸	ØÐ+¨X°|ÀYÐPTó€Cô )×,Ñ,¨XÓ6€FØ&×3Ñ3°IÓ>€Nð €~˜Ô+@Ñ@ð	Ü1°#Ó6ˆFð ÐØˆMØÐÙ�c‹{ÐØ�?Ò"Ü,¨SÓ1Ð1Ü# CÓ(Ð(øô ò 	ØŠFð	ús   ÅE5 Å5FÆFc                óN   — t        | xs d«      \  }}}}}t        ||||||¬«      S )ziReturn (client, default_model_slug) for text-only aux tasks; ``task`` selects auxiliary.<task> overrides.N)r]  r  r   r   r×  ©Ú_resolve_task_provider_modelrÆ  ©rà  r×  rJ  r]  rA   r@   r   s          r%   Úget_text_auxiliary_clientr�  5  s9   € ä3OÐPTÒP\ÐX\Ó3]Ñ0€Hˆe�X˜w¨Ü"Ø˜°ÈGØ¨ôð r'   )rþ  r§  Ú	deepinfrac                 ó–   — 	 ddl m} ddlm} 	  || | |«       «      }|€dS t        |«      S # t        $ r Y yw xY w# t
        $ r Y yw xY w)up   True when ``provider``/``model`` is known to accept image input; unknown capability â†’ True (attempt the call).r   )Ú_lookup_supports_visionrý  T)Úagent.image_routingr   r{   rt   r‡   r}   rO   )rJ  r]  r   rt   Úsupportss        r%   rÅ  rÅ  A  sa   € ðÝ?Ý:ðÙ*¨8°UÑ<PÓ<RÓSˆð Ð#ˆ4Ð7¬¨h«Ð7øô ò Ùðûô ò Ùðús   ‚- �< ­	9¸9¼	AÁAc                 ó   — t        | «      S r,   )r[  )rJ  s    r%   Ú_normalize_vision_providerr¤  O  s   € Ü" 8Ó,Ð,r'   c                 ól   — | xs t        d«      }|st        j                  d«       yt        d|d¬«      S )ziDeepInfra vision: default model is discovered live via default_vision_model() so no hardcoded id can rot.rž  ub   Vision auto-detect: deepinfra catalog unreachable or returned no vision-tagged models â€” skippingrò  TrR  )rì  rŠ   r²   rÆ  )r]  Úvision_models     r%   Ú _deepinfra_strict_vision_backendr§  S  s4   € àÒIÔ<¸[ÓI€LÙÜ�‰ÐyÔzØÜ" ;°ÈÔMÐMr'   c                 ó   — t        d| d¬«      S )Nrô  TrR  ©rÆ  rb  s    r%   rß  rß  `  s   € Ô4°YÀÐQUÔV€ r'   c                 ó   — t        | ¬«      S )Nrb  )r-  rb  s    r%   rß  rß  a  s   € ¤°eÔ <€ r'   c                 ó   — t        d| d¬«      S )Nr§  TrR  r©  rb  s    r%   rß  rß  b  s   € Ô1°&¸%È4ÔP€ r'   c                 ó   — t        d| d¬«      S )NrQ  TrR  r©  rb  s    r%   rß  rß  c  s   € Ô"9¸.È%Ð[_Ô"`€ r'   c                 ó   — t        «       S r,   )rü  rb  s    r%   rß  rß  d  s	   € œ~Ó/€ r'   c                 ó   — t        «       S r,   )r  rb  s    r%   rß  rß  f  s
   € Ô0Ó2€ r'   )rô  rþ  r§  rQ  rÛ  rž  r;  Ú_STRICT_VISION_BACKENDSc                 óV   — t         j                  t        | «      «      }|� ||«      S dS )Nrò  )r¯  r|   r¤  )rJ  r]  Úbackends      r%   Ú_resolve_strict_vision_backendr²  j  s,   € Ü%×)Ñ)Ô*DÀXÓ*NÓO€GØ$Ð0‰7�5‹>ÐB°lÐBr'   c                  ó  — g } t        «       }|rI|dvrE|t        v rt        |«      d   du}nt        |t	        «       «      d   du}|r| j                  |«       t        D ]'  }|| vsŒt        |«      d   €Œ| j                  |«       Œ) | S )u½   Available vision backends in auto-selection order (active provider â†’ OpenRouter â†’ Nous â†’ DeepInfra).

    Single source of truth for setup, tool gating, and runtime auto-routing.
    >   rJ   rL  r   N)rW  Ú_VISION_AUTO_PROVIDER_ORDERr²  rÆ  r[  rz  )Ú	availabler¬  Úmain_okr7  s       r%   Úget_available_vision_backendsr·  o  s¢   € ð
 €IÜ'Ó)€MÙ˜¨lÑ:ØÔ7Ñ7Ü4°]ÓCÀAÑFÈdÐR‰Gä-¨mÔ=MÓ=OÓPÐQRÑSÐ[_Ð_ˆGÙØ×Ñ˜]Ô+Ü(ò  ˆØ�IÒÔ"@ÀÓ"CÀAÑ"FÑ"RØ×Ñ˜QÕð ð Ðr'   r  r/  c                 óV   — |€| ddfS |xs |}|rt        ||d¬«      \  }}| ||fS | ||fS )zSApply the explicit model override (and async wrapping) to a resolved vision client.NTrR  )r  )rÞ  r  r/  rô  r�   r"  Úasync_clientÚasync_models           r%   Ú_finalize_vision_clientr»  ƒ  sR   € ð
 ÐØ  $¨Ð,Ð,Ø Ò1 M€KÙÜ$4°[À+ÐY]Ô$^Ñ!ˆ�kØ  ,°Ð;Ð;Ø˜k¨;Ð6Ð6r'   c           	      ó   — t        | «      }|xs |}| dk(  r9t        | |xs |«      \  }}|€yt        j                  d| |xs |xs |«       ||fS | t        v rt        j                  d| «       yt        | |«      st        j                  d| «       ydx}	}
|}| dk(  s| j                  d«      rg|j                  d	«      r8|j                  d	«      |j                  d
«      xs d|j                  d«      }}}nt        «       \  }}}|r||}
}	|xs |xs d}t        | |||	|
|d¬«      \  }}|€yt        j                  d| |xs |«       ||xs |fS )z^Auto-detect step 1: try the main provider; (None, None) falls through to the aggregator chain.r§  Nrò  z/Vision auto-detect: using main provider %s (%s)ui   Vision auto-detect: skipping main provider %s (no vision support) â€” falling through to aggregator chainut   Vision auto-detect: skipping main provider %s (reports no vision capability) â€” falling through to aggregator chainr;  rM  rA   r@   r   T)r   r  r   r×  r  )rì  r²  rŠ   r¯  rí  r²   rÅ  rU  r|   rí  rÆ  )r¬  rÇ  r  rô  r÷  Úprovider_vision_defaultr¦  r  r/  Úrpc_base_urlÚrpc_api_keyÚrpc_api_moderê  rë  rì  Ú
rpc_clientÚ	rpc_models                    r%   Ú_vision_main_provider_clientrÃ  ‘  s±  € ô ?¸}ÓMÐØ*Ò8¨j€LØ˜Òô &DÀMÐSaÒS|Ðe|Ó%}Ñ"ˆ�]ØÐØÜ�‰ÐEÀ}ÐVcò  WDÐguò  WDð  zDô  	EØ˜MÐ)Ð)ØÔ1Ñ1Ü�‰ð  Að  CPô  	QØÜ& }°lÔCä�‰ð CØô	
ð ð "&Ð%€L�;Ø$€LØ˜Ò  M×$<Ñ$<¸YÔ$GØ�;‰;�zÔ"Ø3:·;±;¸zÓ3JÈGÏKÉKÐXaÓLbÒLjÐfjÐls×lwÑlwð  yCó  mD [˜‰Kä3JÓ3LÑ0ˆK˜ [ÙØ(3°Z˜+ˆLØ,ÒC°ÒC¸tˆLÜ3Ø�|¨lÈlØ$°7ÀdôLÑ€J�	ð ÐØÜ
‡K�KÐAÀ=ÐR[ÒRkÐ_kÔlØ�yÒ0 LÐ0Ð0r'   c                 ó  — t        | j                  d«      xs
 t        «       «      }t        | j                  d«      xs
 t        «       «      }|j	                  «       j                  «       dk(  r%t        |«      \  }}|r|r||}}t        | ddd¬«      } |r'|dvr#t        ||| ||«      \  }}	|�t        |||	||«      S t        D ])  }
|
|k(  rŒ	t        |
«      \  }}	|€Œt        |
||	||«      c S  t        j                  d«       y)	zbAuto-detect order: 1. main provider + model, 2. OpenRouter, 3. Nous Portal, 4. DeepInfra, 5. stop.rJ  r]  rR  rJ   )rA   r@   r   >   rJ   rR  rL  z'Auxiliary vision client: none availablerâ  )rK   r|   rW  r[  rS  rT  rY  rÜ   rÃ  r»  r´  r²  rŠ   r²   )r  rô  r÷  r�   r¬  rÇ  rÈ  rÉ  rŒ   r/  rd  r  s               r%   Ú_vision_auto_routerÅ  Á  s$  € ô
 ˜Ÿ™ JÓ/ÒHÔ3FÓ3HÓI€MÜ�W—[‘[ Ó)Ò?Ô-=Ó-?Ó@€JØ×ÑÓ×"Ñ"Ó$¨Ò-ô %<¸JÓ$GÑ!ˆ�zÙ™ZØ(5°z˜:ˆMÜ˜7¨R¸ÀbÔIˆGÙ˜Ð.AÑAÜ <¸]ÈJÐX_Ðaoð  rCó  !DÑˆ�ØÐÜ*¨=¸&À-ÐQ_ÐakÓlÐlä0ò nˆ	Ø˜Ò%ØÜ%CÀIÓ%NÑ"ˆ�]ØÑ"Ü*¨9°kÀ=ÐR`ÐblÓmÒmðnô ‡L�LÐ:Ô;Ør'   )z$https://open.bigmodel.cn/api/paas/v4zhttps://api.z.ai/api/paas/v4)rA   r@   r�   r×  c                óÖ  — t        |«      }t        d| |||«      \  }}}	}
}t        |«      }|	r)|r|dvr|nd}t        ||||	|
||¬«      \  }}|||�|fS dfS |dk(  rt	        ||||«      S |t
        v rt        ||«      \  }}t        |||||«      S |dk(  r8t        D ]/  }t        |||||
xs dd|d	¬
«      \  }}|€Œ t        |||||«      c S  t        |||||d	¬«      \  }}|||�|fS dfS )zÔResolve the client actually used for vision tasks.

    Direct endpoint overrides beat provider selection; explicit providers may force
    experimental backends; auto mode only tries backends known to work.
    r/  >   rJ   rL  r;  ©r]  r�   r  r   r   r×  NrL  rÖ  ro  T)rA   r@   r   r×  r  )r   r×  r  )
rý  r›  r¤  rÆ  rÅ  r´  r²  r»  Ú_ZAI_OPENAI_VISION_URLSrþ  )rJ  r]  rA   r@   r�   r×  r  rá  rô  rõ  rö  r÷  Úprovider_for_base_overriderŒ   r"  r  r/  Ú_zai_urls                     r%   rý  rý  ã  su  € ô & lÓ3€GÜXtØ�(˜E 8¨WóYÑU€Iˆ~Ð0Ð2BÐDUô +¨9Ó5€IÙÙ2;À	ÐQ]Ñ@]¡YÐckÐ"Ü5Ø&¨nÈØ/ÐBRØ&°Wô
Ñˆ�ð
 *¨6À6ÐCU°KÐ`Ð`Ð[_Ð`Ð`Ø�FÒÜ! '¨>Ð;LÈjÓYÐYØÔ/Ñ/Ü%CÀIÈ~Ó%^Ñ"ˆ�]Ü& y°+¸}ÈnÐ^hÓiÐiØ�EÒÜ/ò 	kˆHÜ"4Ø˜>¨:ÀØ(Ò0¨DÐ;MÐ\cØô#ÑˆF�Kð
 Ñ!Ü.¨y¸&À+È~Ð_iÓjÒjð	kô -Ø�> :Ð8IÐX_ÐkoôÑ€FˆKð �f¨fÐ.@˜{ÐKÐKÀdÐKÐKr'   c                  ó&   — t         r
t        «       S i S )zNReturn extra_body kwargs (Nous Portal product tags when Nous-backed, else {}).)r  r  r*   r'   r%   Úget_auxiliary_extra_bodyrÌ    s   € å!2ÔÓÐ:¸Ð:r'   rb  r
  c                óÀ   — t        t        «       «      xs d}t        d«       xr% t        «       du xr |dv xs |j	                  d«      }|st        |«      rd| iS d| iS )zÆMax-tokens kwarg for the auxiliary provider: direct OpenAI/Copilot and newer OpenAI-family
    models (by ``model`` name, so custom endpoints fronting gpt-5.x are caught) need max_completion_tokens.rJ   r#  N)rI  rÚ  z.githubcopilot.comrk  rj  )rg   rð  ra  r»  rÁ  rk   )r
  r]  Ú_custom_hostÚdirect_openai_familys       r%   Úauxiliary_max_tokens_paramrÐ    s{   € ô %Ô%=Ó%?Ó@ÒFÀB€LäÐ0Ó1Ð1ò 	y´oÓ6GÈ4Ð6Oò 	yØÐHÐHÒwÈL×LaÑLaÐbvÓLwð ñ ÔAÀ%ÔHØ'¨Ð/Ð/Ø˜%Ð Ð r'   rº  é@   c                   óL   — e Zd ZdZdZdeddfd„Zdefd„Zde	de
fd	„Zdefd
„Zy)Ú_CallableCacheDiscriminatorzBHash a credential callback by identity without exposing its state.©Ú	_callbackr  r!   Nc                 ó   — || _         y r,   rÔ  )r-   r  s     r%   rC   z$_CallableCacheDiscriminator.__init__3  s	   € Ø!ˆ�r'   c                 ó,   — t        | j                  «      S r,   )rô   rÕ  r6   s    r%   Ú__hash__z$_CallableCacheDiscriminator.__hash__6  s   € Ü�$—.‘.Ó!Ð!r'   Úotherc                 óV   — t        |t        «      xr | j                  |j                  u S r,   )r2   rÓ  rÕ  )r-   rÙ  s     r%   Ú__eq__z"_CallableCacheDiscriminator.__eq__9  s%   € Ü˜%Ô!<Ó=ÒcÀ$Ç.Á.ÐTY×TcÑTcÐBcÐcr'   c                  ó   — y)Nz<callable-api-key>r*   r6   s    r%   r7   z$_CallableCacheDiscriminator.__repr__<  s   € Ø#r'   )r8   r9   r:   r;   r<   r   rC   r  rØ  rW  rO   rÛ  rK   r7   r*   r'   r%   rÓ  rÓ  .  sK   „ ÙLà€Ið" ð "¨ó "ð"˜#ó "ðd˜Fð d tó dð$˜#ô $r'   rÓ  c                 óÖ   — | dk(  rt        |«      rt        |«      S | dk(  rHt        |t        «      r8|r6dt	        j
                  |j                  d«      d¬«      j                  «       fS |S )z;Return a hashable, secret-safe runtime cache-key component.r@   zapi-key-digestrÇ  rÄ  rÅ  )rª   rÓ  r2   rK   rÉ  rÊ  rË  rÏ  )rF  r
  s     r%   Ú_runtime_cache_discriminatorrÞ  @  s\   € à�	Òœh uœoÜ*¨5Ó1Ð1Ø�	Òœj¨´Ô4¹Ø ¤'§/¡/°%·,±,¸wÓ2GÐUWÔ"X×"_Ñ"_Ó"aÐbÐbØ€Lr'   )rA   r@   r   r×  r  rà  r]  c                ó(  ‡— t        |«      Š| dk(  rt        ˆfd„t        D «       «      nd}	| dk(  r|xs dt        |«      fnd}
t	        | |¬«      }|xs ‰j                  dd«      }t        d|xs d«      }t        «       | ||xs d||xs d|	||
||fS )NrL  c              3   óV   •K  — | ]   }t        |‰j                  |d «      «      –— Œ" y­w)rJ   N)rÞ  r|   )ræ   rç   r  s     €r%   rè   z$_client_cache_key.<locals>.<genexpr>Q  s%   øè ø€ ÒjÐPQÔ4°Q¸¿¹ÀAÀrÓ8J×KÑjùs   ƒ&)r*   rJ   rÑ  r]  r@   )rý  r¡  rÌ  ræ  rÔ  r|   rÞ  re   )rJ  r�   rA   r@   r   r×  r  rà  r]  Úruntime_keyÚtask_keyÚ	pool_hintÚ	model_keyÚapi_key_keyr  s                 @r%   Ú_client_cache_keyræ  I  sÌ   ø€ ô & lÓ3€Gànvð  {Aò  oA”%ÓjÔUiÔjÔjð  GI€KØ?GÈ6Ò?Q�’
˜Ô4°TÓ:Ñ;ÐWY€HÜ  ¸ÔE€Ið Ò1˜Ÿ™ W¨bÓ1€IÜ.¨y¸'º-ÀRÓH€Kô Ó˜x¨°X²^ÀÀ[ÐRZÒR`Ð^`ÐbmÐoxð  {Cð  ENð  PYð  Zð  Zr'   c                  óJ   — 	 ddl } | j                  «       S # t        $ r Y yw xY w)z\``asyncio.get_event_loop()`` or None when no loop can be obtained (async cache-key binding).r   N)rA  Úget_event_looprF   )Ú_aios    r%   Ú_current_event_looprê  ]  s+   € ðÛØ×"Ñ"Ó$Ð$øÜò Ùðús   ‚ –	"¡"©Ú
bound_loopr  rì  c                óÌ   — t        |t        «      ry t        5  t        j	                  | «      }|�|d   |urt        |d   «       |||ft        | <   d d d «       y # 1 sw Y   y xY wrq  )r2   r>   r¹  rº  r|   Ú_close_cached_client)r  rŒ   r/  rì  Ú	old_entrys        r%   Ú_store_cached_clientrð  f  sj   € Ü�&Ô-Ô.ØÜ	ñ GÜ!×%Ñ% iÓ0ˆ	ØÐ  Y¨q¡\¸Ñ%?Ü  ¨1¡Ô.Ø$*¨M¸:Ð#FŒ�iÑ ÷	G÷ Gñ Gús   ˜9AÁA#)rA   r@   r   r×  r  Úlookup_modelÚlookup_taskÚcache_providerrñ  rò  c        
         óî   — t        d|¬«      }
|
€d|fS |
\  }}t        ||¬«      }|r
t        «       nd}|rt        ||xs d|¬«      \  }}n||}}t	        | |||||||	|¬«	      }t        ||||¬«       ||fS )	u™  Refresh Nous runtime creds, rebuild the client, and replace the cache entry.

    ``model`` is the resolved wire model stored as the entry's usable model and returned. The
    cache KEY MUST be built from ``lookup_model``/``lookup_task`` â€” the model and task as passed
    to ``_get_cached_client`` when the stale client was acquired â€” so the fresh client overwrites
    the exact entry the stale one is served from. Keying on the resolved model or an empty task
    would leave the expired client immortal and every auxiliary call 401ing forever.

    See #56889.
    For ``provider == "auto"`` the task participates in the cache key (task-specific fallback policy), so it
    MUST be carried into the key here for the same reason as ``lookup_model``; otherwise an auto-provider
    client refreshed on a 401 lands under the ``task=""`` key while the stale entry survives under the
    task-scoped key (#58894).
    TrÎ  Nr?   rJ   rR  ©r�   rA   r@   r   r×  r  rà  r]  rë  )rØ  r”   rê  r  ræ  rð  )ró  r]  r�   rA   r@   r   r×  r  rñ  rò  r  Ú	fresh_keyÚfresh_base_urlr  Úcurrent_looprŒ   r"  r  s                     r%   Ú_refresh_nous_auxiliary_clientrù  p  s¡   € ô( (°dÈwÔW€GØ€Ø�Uˆ{ÐØ 'Ñ€Iˆ~Ü'°	ÀNÔS€KÙ,6Ô&Ô(¸D€LÙÜ.¨{¸EºKÀRÐS\Ô]Ñˆ‘à)¨5�ˆÜ!Ø :¸È'Ø¨À	ÐP[Øô€Iô
 ˜ F¨KÀLÕQØ�;ÐÐr'   c                  óL   — 	 ddl m}  d„ | _        y# t        t        f$ r Y yw xY w)a¿  Monkey-patch ``AsyncHttpxClientWrapper.__del__`` to be a no-op.

    The SDK's ``__del__`` schedules ``aclose()`` on the *running* loop, but the transport is
    bound to the loop the client was created on; when that loop is dead this raises "Event loop
    is closed" into prompt_toolkit's loop. Safe because cached clients are closed explicitly and
    the OS reaps the rest. Call once at CLI startup, before any ``AsyncOpenAI`` is created.
    r   ©ÚAsyncHttpxClientWrapperc                  ó   — y r,   r*   r6   s    r%   rß  z(neuter_async_httpx_del.<locals>.<lambda>¡  ó   � r'   N)Úopenai._base_clientrü  Ú__del__r‡   rˆ   rû  s    r%   Úneuter_async_httpx_delr  —  s*   € ðÝ?Ù*;ÐÕ'øÜœÐ(ò Ùðús   ‚ ‘#¢#c                 óÆ   — t        j                  t        «      5  ddlm} t        | dd«      }|�t        |dd«      s|j                  |_        ddd«       y# 1 sw Y   yxY w)u¹   Mark the httpx AsyncClient inside an AsyncOpenAI client as closed so ``__del__`` won't
    schedule ``aclose()`` on a dead loop. Skips the full async close â€” the OS drops connections.r   )ÚClientStaterŠ  NÚ	is_closedT)rC  rD  r}   Úhttpx._clientr  rP   ÚCLOSEDÚ_state)rŒ   r  Úinners      r%   Ú_force_close_async_httpxr	  ¦  sV   € ô 
×	Ñ	œYÓ	'ñ .Ý-Ü˜ 	¨4Ó0ˆØÐ¤W¨U°KÀÔ%FØ&×-Ñ-ˆEŒL÷	.÷ .ñ .ús   š4AÁA Úclose_resultc                 ó–  ‡ ‡— dˆˆ fd„} |«       }	 ddl }	 |j                  «       }|j                  |«      }dd„}|j                  |«       d}y# t        $ r |j                  |«       Y yw xY w# t        $ rO |�?t        j                  t        «      5  |j                  «        ddd«       n# 1 sw Y   nxY wt        ‰«       Y yw xY w)z=Finish an async close without leaking an unawaited coroutine.Nc               “   ó|   •K  — 	 ‰ƒ d {  –—†  t        ‰ «       y 7 Œ# t         $ r Y Œw xY w# t        ‰ «       w xY w­wr,   )r}   r	  )rŒ   r
  s   €€r%   Ú_await_closez+_schedule_async_close.<locals>._await_close²  s@   øè ø€ ð	-Ø×Ðô % VÕ,ð	 ùÜò 	Ùð	ûô % VÕ,üs0   ƒ<… Š‹ �<› �	)¦, ¨)©, ¬9¹<r   c                 ó€   — t        j                  t        «      5  | j                  «        d d d «       y # 1 sw Y   y xY wr,   )rC  rD  r  r  )Úcompleted_tasks    r%   Ú_consumez'_schedule_async_close.<locals>._consumeÃ  s1   € Ü×(Ñ(¬Ó7ñ /Ø"×,Ñ,Ô.÷/÷ /ñ /ús   š4´=r›   )rA  Úget_running_loopÚcreate_taskÚadd_done_callbackrF   r%  r}   rC  rD  rƒ  r	  )r
  rŒ   r  Úrunnerré  Úlooprà  r  s   ``      r%   Ú_schedule_async_closer  °  s¿   ù€ ö-ñ ‹^€Fð)Ûð	Ø×(Ñ(Ó*ˆDð ×#Ñ# FÓ+ˆDó/ð ×"Ñ" 8Ô,Ø‰Føô ò 	Ø�H‰H�VÖð	ûô ò )ØÐÜ×$Ñ$¤YÓ/ñ Ø—‘”÷÷ ñ úä  Ö(ð	)úsK   ’A0 —A §(A0 ÁA-Á*A0 Á,A-Á-A0 Á0$CÂB.Â%	CÂ.B7	Â3CÃC©Úclose_asyncr  c                óˆ  — | €yt        | dd«      }t        |«      st        | «       y	  |«       }t	        j
                  |«      rM|rt        || «       yt        j                  t        «      5  |j                  «        ddd«       t        | «       yt        | «       y# t        $ r t        | «       Y yw xY w# 1 sw Y   Œ;xY w)zBClose one cached client, awaiting async transports only when safe.Nrƒ  )
rP   rª   r	  r}   ÚinspectÚisawaitabler  rC  rD  rƒ  )rŒ   r  r†  r
  s       r%   rî  rî  Ï  s¹   € à€~ØÜ�v˜w¨Ó-€HÜ�HÔÜ  Ô(ØðÙ“zˆô ×Ñ˜<Ô(ÙÜ! ,°Ô7ð 	ô ×$Ñ$¤YÓ/ñ %Ø×"Ñ"Ô$÷%ä$ VÔ,ØÜ˜VÕ$øô ò Ü  Ô(Ùðú÷%ð %ús   ©B Á-B8ÂB5Â4B5Â8Cc                  ó|  — t         5  t        j                  «       D � cg c]  } | d   €Œ	| d   | d   f‘Œ }} t        j                  «        ddd«       	 ddl}|j                  «       }D ].  \  }}|duxr |j                  «       xs ||u }t        ||¬«       Œ0 yc c} w # 1 sw Y   ŒWxY w# t        $ r d}Y ŒRw xY w)zìClose all cached clients; call at CLI shutdown *before* the loop closes.

    Snapshot+clear under the lock, close outside it: async teardown can block while an owner
    loop drains, and holding the lock would convoy every caller.
    r   Nr�  r  )	r¹  rº  rÃ  rE  rA  r  rF   r  rî  )rE  Úclientsré  Úrunning_looprŒ   Ú
owner_loopr  s          r%   Úshutdown_cached_clientsr   é  sÑ   € ô 
ñ Ü5B×5IÑ5IÓ5KÖd¨EÈuÐUVÉxÑOc�E˜!‘H˜e A™hÒ'ÐdˆÐdÜ×ÑÔ÷ðÛØ×,Ñ,Ó.ˆð &ò >Ñˆ�
ð !¨Ð,Òg°*×2FÑ2FÓ2HÒ2fÈJÐZfÐLfˆÜ˜V°Ö=ñ	>ùò e÷ð ûô ò ØŠðús2   ‡B!ž
B©BµB!ÁB- ÂB!Â!B*Â-B;Â:B;c                  ó"  — t         5  t        j                  «       D � �cg c]&  \  } }|d   €Œ|d   j                  «       sŒ | |d   f‘Œ( }} }|D ]  \  } }t        | = Œ 	 ddd«       D ]  \  }}t	        |d¬«       Œ yc c}} w # 1 sw Y   Œ'xY w)z‹Force-close cached async clients whose loop is closed; call after each agent turn
    (defense-in-depth behind ``neuter_async_httpx_del``).r�  Nr   Tr  )r¹  rº  r6  r  rî  )rØ   rE  rC  rŠ  Ú_keyrŒ   s         r%   Úcleanup_stale_async_clientsr#  þ  s    € ô 
ñ #Ü3@×3FÑ3FÓ3H×z¡Z S¨%ÈEÐRSÉHÑL`ÐejÐklÑem×ewÑewÕey�#�u˜Q‘x’ÐzˆÑzØ!ò 	#‰LˆC�Ü˜cÑ"ñ	#÷#ð ò 7‰ˆˆfÜ˜V°Ö6ñ7ùó {÷#ð #ús'   ‡BŸA?­A?Á	A?Á
BÁ?BÂBÚcached_defaultc           
      óž   — |rFd|v rBt        d„ | t        | dd«      t        | dd«      fD «       «      xs t        |xr d|v «      }|s|S |xs |S )zÂKeep slash-bearing model IDs only for cached clients that accept ``vendor/model`` (OpenRouter
    or a slash-bearing default). Mirrors the resolve_provider_client() guard, which cache hits skip.r_  c           
   3   ól   K  — | ],  }|xr$ t        t        t        |d d«      xs d«      d«      –— Œ. y­w)rA   rJ   ræ  N)rf   rK   rP   )ræ   r3   s     r%   rè   z _compat_model.<locals>.<genexpr>  s<   è ø€ ò 
àð ÒcÔ)¬#¬g°c¸:ÀrÓ.JÒ.PÈbÓ*QÐSbÓcÓcñ
ùs   ‚24rŠ  NrŒ   )rõ   rP   rO   )rŒ   r]  r$  Úaccepts_slashs       r%   Ú_compat_modelr(  	  sq   € ñ �˜‘Üñ 
à¤¨°	¸4Ó @Ä'È&ÐRZÐ\`ÓBaÐbô
ó 
ò <ô �.Ò: S¨NÐ%:Ó;ð 	ñ Ø!Ð!ØÒ"�NÐ"r'   c	                 óz  — |r
t        «       nd}	t        |«      }
t        | ||||||||¬«	      }t        5  |t        v rqt        |   \  }}}| xs |duxr ||	u xr |j                  «        }|r|t        |||«      fcddd«       S t        ||duxr |j                  «       ¬«       t        |= ddd«       |}|s%t        t        | «      «      }|�t        |«      xs |}t        | ||||||
||¬«	      \  }}|�t        «       r||xs |fS |�Št        5  |t        vrWt        t        «      t        k\  r4t        t        t!        t        «      «      = t        t        «      t        k\  rŒ4|||	ft        |<   n|}t        |   \  }}}t        ||¬«       ddd«       |t        |||«      fS # 1 sw Y   ŒøxY w# 1 sw Y   Œ$xY w)aé  Get or create a cached client for the given provider.

    Async clients bind to the loop they were created on, so every async hit validates the cached
    loop is the current, open loop; stale entries are replaced in place (bounded, no cross-loop reuse).

    This keeps cache size bounded to one entry per unique provider config, preventing the fd-exhaustion that
    previously occurred in long-running gateways where recycled worker threads created unbounded entries
    (#10200).
    Nrõ  r  )r  r   r   r×  r  rà  )rê  rý  ræ  r¹  rº  r  r(  rî  rD  r[  rH  rÆ  rR   r3  Ú_CLIENT_CACHE_MAX_SIZEÚnextÚiter)rJ  r]  r�   rA   r@   r   r×  r  rà  rø  r  r  Úcached_clientr$  Úcached_loopÚloop_okÚeffective_api_keyÚ_perŒ   r/  Úbuilt_clientr  s                         r%   rþ  rþ    s  € ñ -7Ô&Ô(¸D€LÜ% lÓ3€GÜ!Ø˜Z°(ÀGÐV^Ø!¨Y¸TÈô€Iô 
ñ )ØœÑ%Ü9FÀyÑ9QÑ6ˆM˜>¨;Ø$�nò Ø 4Ð'Òg¨K¸<Ð,GÒgÐP[×PeÑPeÓPgÐLgð ñ Ø$¤m°MÀ5È.Ó&YÐY÷)ñ )ô ! ¸KÈtÐ<SÒ<oÐXc×XmÑXmÓXoÕpÜ˜iÐ(÷)ð  ÐÙÜÔ6°xÓ@ÓAˆØˆ?Ü 5°cÓ :Ò E¸gÐÜ3Ø�%˜°xÐRcØ¨¸9È4ôÑ€FˆMð ÐÔ/Ô1ð �uÒ- Ð-Ð-ØÐÜñ 	KØ¤Ñ-ô œ-Ó(Ô,BÒBÜ%¤d¬4´Ó+>Ó&?Ð@ô œ-Ó(Ô,BÓBà,2°MÀ<Ð+P”˜iÒ(à%�Ü+8¸Ñ+CÑ(�˜ qä$ \¸zÕJ÷	Kð ”= ¨°Ó>Ð>Ð>÷Y)ð )ú÷@	Kð 	Kús%   ´AF%Â(F%ÄAF1Å%)F1Æ%F.Æ1F:ÚprovÚmdlc                 ó€   — | j                  «       j                  «       dk7  r| |fS t        |«      \  }}|r|r||fS | |fS )z¸Resolve an *explicit* ``provider: moa`` to its preset's aggregator slot (_resolve_auto_route()
    only unwraps the implicit case; "moa" isn't in PROVIDER_REGISTRY and would dead-end).rR  )rS  rT  rY  )r3  r4  rW  rX  s       r%   Ú_unwrap_moa_providerr6  a  sN   € ð ‡z�zƒ|×ÑÓ˜uÒ$Ø�SˆyÐÜ5°cÓ:Ñ€L�)Ù™	Ø˜YÐ&Ð&Ø�ˆ9Ðr'   c                 óÞ   — t        | xs d«      j                  «       j                  «       }|dv s|j                  d«      ry|t        v ry	 ddlm}  ||«      duS # t        $ r |d	v cY S w xY w)
zSTrue when a first-class provider keeps its identity alongside an explicit base_url.rJ   >   rJ   rL  r;  rM  FTr   )Úget_providerN>   ú
qwen-oauthúcopilot-acpr§  rô  rÛ  rÝ  rQ  úminimax-oauth)rK   rS  rT  rU  rB  r)  r8  r}   )r3  rX  r8  s      r%   Ú _preserve_provider_with_base_urlr<  l  s   € ä�T’Z˜R“×&Ñ&Ó(×.Ñ.Ó0€JØÐ+Ñ+¨z×/DÑ/DÀYÔ/OØØÔ*Ñ*Øð
Ý5Ù˜JÓ'¨tÐ3Ð3øÜò 
Øð 
ð 
ò 	
ð
ús   ÁA ÁA,Á+A,c                 óì  — dx}x}x}x}}	| �rJt        | «      }
t        |
j                  dd«      «      j                  «       xs d}t        |
j                  dd«      «      j                  «       xs d}t        |
j                  dd«      «      j                  «       xs d}t        |
j                  dd«      «      j                  «       xs d}|sPt        |
j                  d«      xs |
j                  d«      xs d«      j                  «       }|rt	        |«      xs d}t        t        |
j                  d	«      xs d«      «      j                  «       xs d}	|r|j                  «       d
k(  rd}|r|j                  «       d
k(  rd}|xs |}|rSt        |«      j                  «       j                  «       dk(  r)t        ||«      \  }}|rn|j                  «       dk7  r[d}d}nV|rTt        |«      j                  «       j                  «       dk(  r*t        ||«      \  }}|r|j                  «       dk7  r|}d}d}ddlm	} |r |||«      \  }}|r |||«      \  }}|r|d
k7  r|s|r|d|fv r|}|s|}|rt        |«      r|nd}|||||	fS |r|||||	fS |r>|r<t        |xs d«      j                  «       j                  «       t        v r|nd}|||||	fS |r|r|d
k7  r|||d|	fS |r|d
k7  r|||||	fS d
|dd|	fS )ad  Determine (provider, model, base_url, api_key, api_mode) for a call.

    Priority: explicit args > config auxiliary.{task}.* > "auto". A bare base_url means custom,
    but a first-class provider + base_url keeps the provider identity so its auth/transport
    shaping still applies. api_mode is "chat_completions", "codex_responses", or None (auto).
    NrJ  rJ   r]  rA   r@   r  r  r   rL  rR  r   )Úexpand_direct_api_aliasr;  )rä  rK   r|   rS  ra  rZ   rT  r6  Ú"hermes_cli.runtime_provider_customr>  r<  rB  )rà  rJ  r]  rA   r@   r(  r*  r)  Úcfg_api_keyr÷  r\  Úcfg_key_envrô  r>  Úkepts                  r%   r›  r›  |  s)  € ð QUÐT€LÐT�9ÐT˜|ÐT¨kÐ<MÚÜ0°Ó6ˆÜ˜;Ÿ?™?¨:°rÓ:Ó;×AÑAÓCÒKÀtˆÜ˜Ÿ™¨°Ó4Ó5×;Ñ;Ó=ÒEÀˆ	Ü˜;Ÿ?™?¨:°rÓ:Ó;×AÑAÓCÒKÀtˆÜ˜+Ÿ/™/¨)°RÓ8Ó9×?Ñ?ÓAÒIÀTˆÙÜ˜kŸo™o¨iÓ8Ò`¸K¿O¹OÈMÓ<ZÒ`Ð^`Óa×gÑgÓiˆKÙÜ-¨kÓ:ÒB¸d�ô 0´°K·O±OÀJÓ4OÒ4UÐSUÓ0VÓW×]Ñ]Ó_ÒgÐcgÐñ �—‘“ &Ò(ØˆÙ�Y—_‘_Ó&¨&Ò0Øˆ	ØÒ'˜i€Nñ ”C˜“M×'Ñ'Ó)×/Ñ/Ó1°UÒ:Ü#7¸À.Ó#QÑ ˆ�.Ù˜Ÿ™Ó(¨EÒ1ØˆHØ‰GÙ	œ#˜lÓ+×1Ñ1Ó3×9Ñ9Ó;¸uÒDÜ"6°|À^Ó"TÑˆ�iÙ˜L×.Ñ.Ó0°EÒ9Ø&ˆNØˆLØˆKõ KÙÙ4°X¸xÓHÑˆ�(ÙÙ%<¸\È<Ó%XÑ"ˆ�lñ
 �H Ò&©x¹LÈ\Ð^bÐdlÐ]mÑMmØˆÙØ!ˆGÙÜ;¸HÔE‰xÈ8ˆØ�^ X¨wÐ8IÐIÐIÙØ˜¨°7Ð<MÐMÐMÙ™Ü" <Ò#5°2Ó6×<Ñ<Ó>×DÑDÓFÔJ_Ñ_‰|ÐemˆØ�^ \°;Ð@QÐQÐQÙ™¨¸Ò)?ð ˜^¨\¸4ÐARÐRÐRÙ˜¨Ò.Ø˜^¨\¸;ÐHYÐYÐYØ�> 4¨Ð/@Ð@Ð@r'   ç      >@g     Àr@c                 óÐ  — | si S 	 ddl m}  |«       }t        |t        «      r|j                  di «      ni }t        |t        «      r|j                  | i «      ni }t        |t        «      si }	 ddlm}  |«       D ]F  }|j                  d«      | k(  sŒ|j                  d«      xs i }t        |t        «      ri |¥|¥c S  |S  	 |S # t        $ r i cY S w xY w# t        $ r Y |S w xY w)zÂConfig dict for auxiliary.<task>, or {} when unavailable. Plugin-registered tasks get their
    declared defaults layered under user config (user wins); built-in defaults live in DEFAULT_CONFIG.r   rý  r  )Úget_plugin_auxiliary_tasksrØ   Údefaults)	r{   rt   r‡   r2   rÜ   r|   Úhermes_cli.pluginsrE  r}   )rà  rt   rv   Úauxr\  rE  Ú_entryÚ	_defaultss           r%   rä  rä  Ö  sý   € ñ Øˆ	ðÝ:Ù%Ó'ˆô *4°F¼DÔ)Aˆ&�*‰*�[ "Ô
%Àr€CÜ'1°#´tÔ'<�#—'‘'˜$ Ô#À"€KÜ�k¤4Ô(Øˆð	ÝAÙ0Ó2ò 	ˆFØ�z‰z˜%Ó  DÓ(Ø"ŸJ™J zÓ2Ò8°b�	Ü˜i¬Ô.Ø7˜iÐ7¨;Ð7Ò7Øð Ðñ	ð Ðøô! ò ØŠ	ðûô ò ØØÐðús5   †C Á.$C Â,C Ã C ÃC ÃCÃCÃ	C%Ã$C%c                   ó6   — e Zd ZU dZeed<   eeee	f      ed<   y)ÚCompressionFastLanez*Explicit, non-reasoning compression route.Úcertified_non_reasoningrp  N)
r8   r9   r:   r;   rO   rI  r	   r   rK   r   r*   r'   r%   rL  rL  ñ  s   … Ù4à!Ó!Ø˜t C¨ H™~Ñ.Ô.r'   rL  rv   c                 óD  — ddl m} t        | j                  d«      xs d«      j	                  «       j                  «       }t        | j                  d«      xs d«      j	                  «       } || j                  d«      «      }|duxr |j                  d«      d	u }|||fS )
zDOnly explicit reasoning disablement certifies a non-reasoning route.r   ©Úparse_reasoning_effortrJ  rJ   r]  r¦  Nrî  F)Úhermes_constantsrP  rK   r|   rS  rT  )rv   rP  rJ  r]  Úparsed_effortÚnon_reasonings         r%   Ú_fast_lane_config_fieldsrT  ø  s‘   € å7Ü�6—:‘:˜jÓ)Ò/¨RÓ0×6Ñ6Ó8×>Ñ>Ó@€HÜ�—
‘
˜7Ó#Ò) rÓ*×0Ñ0Ó2€EÙ*¨6¯:©:Ð6HÓ+IÓJ€MØ!¨Ð-ÒW°-×2CÑ2CÀIÓ2NÐRWÐ2W€MØ�U˜MÐ)Ð)r'   ©rÏ  rb  rc  r`  ra  rb  rc  c                ó*  — |�|n
t        d«      }t        |«      \  }}}t        |xs d«      j                  «       j	                  «       xs |}	t        |xs d«      j                  «       xs |}
|	dvxr |
j	                  «       dv}t        t        t        | xs d«      «      «      }|t        |	«      k(  }t        |xs d«      j                  «       j	                  «       |
j	                  «       k(  }|r|r|r|rt        ddddœ«      S t        dd«      S )	zICertify explicit non-reasoning settings only on the matching destination.Nr´  rJ   >   rJ   rL  TFró  ©rî  rï  )rä  rT  rK   rS  rT  r[  rF  rL  )r`  ra  rÏ  rb  rc  rv   r(  r*  rS  rJ  r]  Úexplicit_routeÚactual_normÚprovider_matchesÚmodel_matchess                  r%   Úresolve_compression_fast_laner\    s  € ð
 *Ð5‰\Ô;UÐVcÓ;d€FÜ-EÀfÓ-MÑ*€L�)˜]ÜÐ%Ò+¨Ó,×2Ñ2Ó4×:Ñ:Ó<ÒLÀ€HÜ�Ò% 2Ó&×,Ñ,Ó.Ò;°)€EØ \Ð1ÒW°e·k±k³mÈ<Ð6W€NÜ)Ô*GÌÈOÒLaÐ_aÓHbÓ*cÓd€KØ"Ô&=¸hÓ&GÑGÐÜ˜Ò*¨Ó+×1Ñ1Ó3×9Ñ9Ó;¸u¿{¹{»}ÑL€MÙÑ*©}ÁÜ" 4°UÀfÑ)MÓNÐNÜ˜u dÓ+Ð+r'   c                 óX   — t        | «      \  }}}|dvxr |j                  «       dvxr |S )zAWhether task config declares fast-only controls that cannot leak.>   rJ   rL  )rT  rT  )rv   rJ  r]  rS  s       r%   Ú$_compression_config_claims_fast_laner^    s4   € ä%=¸fÓ%EÑ"€Hˆe�]Ø˜<Ð'Ò_¨E¯K©K«MÀÐ,MÒ_ÐR_Ð_r'   rd  rè  c                óÖ   — | dk7  s|�||fS t        |«      }	t        |||||¬«      }
|
j                  �d|	vr|
j                  |	d<   ||	fS t        |«      r|	j	                  dd«       ||	fS )z?Apply the certified compression controls to one resolved route.r´  NrU  rê  )rÜ   r\  rp  r^  r*  )rà  r`  ra  rÏ  rb  rc  rd  rj  rè  Úbodyr>  s              r%   re  re    s™   € ð ˆ}Ò 
Ð 6Ø˜:Ð%Ð%Ü�
Ó€DÜ(Ø˜Ð:LÐ^mð  }Iô€Dð ×ÑÐ(Ø˜dÑ"Ø $× 5Ñ 5ˆD�Ñð �tÐÐô 
.Ð.?Ô	@Ø�‰�˜dÔ#Ø�tÐÐr'   c                 óð   — | syt        | «      j                  d«      }|€y	 t        |«      }t        |t        «      s|dk  rt        j                  d| |t        «       y|S # t        t        f$ r d}Y ŒGw xY w)u7  ``auxiliary.<task>.no_progress_timeout`` from config, or None when unset/invalid
    (the Codex stream guard then keeps its built-in ``_AUX_STREAM_NO_PROGRESS_TIMEOUT_SECONDS``
    default). Lets an operator widen the substantive-progress window independently of the
    overall request timeout â€” see #108104.Nrˆ  rž  r   ziauxiliary.%s.no_progress_timeout=%r is not a positive number of seconds; using the built-in %.0fs default)
rä  r|   r  r)  r0  r2   rO   rŠ   r‹   rŒ  )rà  r?  r
  s      r%   Ú_get_task_no_progress_timeoutrb  .  s‰   € ñ
 ØÜ
$ TÓ
*×
.Ñ
.Ð/DÓ
E€CØ
€{ØðÜ�c“
ˆô �#”tÔ ¨¢
ô 	�‰ð/Ø04°cÔ;bô	dð Ø€Løô œ	Ð"ò ØŠðús   ¢A! Á!A5Á4A5c                 óÆ   — | s|S t        | «      j                  d«      }|�3t        j                  t        t
        «      5  t        |«      cddd«       S |S # 1 sw Y   |S xY w)z9``auxiliary.<task>.timeout`` from config, else *default*.r²  N)rä  r|   rC  rD  r)  r0  r  )rà  rÙ   r?  s      r%   Ú_get_task_timeoutrd  F  sZ   € áØˆÜ
$ TÓ
*×
.Ñ
.¨yÓ
9€CØ
€Ü× Ñ ¤¬YÓ7ñ 	Ü˜“:÷	ñ 	à€N÷	à€Nús   ¿AÁA r²  c                 óN   — |�|S t        | «      }| dk(  rt        |t        «      S |S )z„Explicit ``timeout`` wins, else config; compression gets a floor so a reasoning model
    summarising a large context isn't cut off.r´  )rd  rZ  Ú"_COMPRESSION_TIMEOUT_FLOOR_SECONDS)rà  r²  Ú	effectives      r%   Ú_effective_aux_timeoutrh  Q  s4   € ð ÐØˆÜ! $Ó'€IØAEÈÒAVŒ3ˆyÔ<Ó=ÐeÐ\eÐer'   c                 óL  — t        | «      }|j                  d«      }t        |t        «      rt        |«      ni }d|v r|S |j                  d«      }|�|dk(  r|S | dv rt        j                  d| «       |S ddlm}  ||«      }|�||d<   |S t        j                  d	| |«       |S )
zãShallow copy of ``auxiliary.<task>.extra_body`` with ``reasoning_effort`` folded into
    ``reasoning`` unless one is configured (more specific wins). MoA tasks are excluded: their
    reasoning depth is per-slot in the preset.rè  rê  r¦  rJ   )Úmoa_referenceÚmoa_aggregatoruÉ   auxiliary.%s.reasoning_effort is not supported â€” MoA reasoning depth is per-slot: set reasoning_effort on the preset's reference_models entries / aggregator instead (moa.presets.<name>...). Ignoring.r   rO  ux   auxiliary.%s.reasoning_effort %r is not a valid level (none, minimal, low, medium, high, xhigh, max, ultra) â€” ignoring)rä  r|   r2   rÜ   rŠ   r‹   rQ  rP  )rà  r\  r?  r  rï  rP  r7  s          r%   Ú_get_task_extra_bodyrl  Z  sÅ   € ô -¨TÓ2€KØ
�/‰/˜,Ó
'€CÜ$ S¬$Ô/ŒT�#ŒY°R€FØ�fÑØˆØ�_‰_Ð/Ó0€FØ€~˜ 2šØˆØÐ2Ñ2Ü�‰ðoàô	
ð
 ˆÝ7Ù# FÓ+€FØÐØ$ˆˆ{Ñð €Mô	 	�‰ð GØ�&ô	
ð €Mr'   Ú_aux_sync_semaphoresÚ_aux_async_semaphoresc                 ó–   — | r| dk(  ry	 t        t        | «      j                  d«      «      }|dkD  r|S dS # t        t        f$ r Y yw xY w)z˜``auxiliary.<task>.max_concurrency`` as a positive int, or None. Vision uses this key for
    its encode/resize CPU pool; its LLM calls stay concurrent.r/  NÚmax_concurrencyr   )r  rä  r|   r0  r)  )rà  r
  s     r%   Ú_get_task_max_concurrencyrq  …  s^   € ñ �4˜8Ò#ØðÜÔ.¨tÓ4×8Ñ8Ð9JÓKÓLˆð ˜A’Iˆ5Ð' 4Ð'øô ”zÐ"ò Ùðús   Š#6 ¶AÁArç  ÚlimitÚfactoryc                 ó˜   — t         5  | j                  |«      }|�|d   |k7  r| ||«      fx| |<   }|d   cddd«       S # 1 sw Y   yxY w)zNReturn the cached semaphore for ``key``, rebuilding it when the limit changed.Nr   rO  )Ú_aux_sem_lockr|   )rç  rØ   rr  rs  rE  s        r%   Ú_cached_semaphorerv  ‘  sU   € ä	ñ Ø—	‘	˜#“ˆØˆ=˜E !™H¨Ò-Ø"'©°«Ð!8Ð8ˆE�#‰J˜Ø�Q‰x÷	÷ ò ús   ‡/A Á A	c                 óx   — t        | «      }|€yddlm} t        t         |«       | f|t
        j                  «      S )zCGet a per-task sync semaphore, rebuilding it after a config change.Nr   ©re   )rq  rQ  re   rv  rm  r¹   ÚBoundedSemaphore)rà  rr  re   s      r%   Ú_acquire_sync_aux_semaphorerz  š  s8   € ä% dÓ+€EØ€}ØÝ0ÜÔ1±OÓ4EÀtÐ3LÈeÔU^×UoÑUoÓpÐpr'   c                 óÌ   — t        | «      }|€yddl}	 |j                  «       }ddlm} t        t         |«       | t        |«      f||j                  «      S # t        $ r Y yw xY w)zCGet a per-task, per-event-loop async semaphore after config lookup.Nr   rx  )
rq  rA  r  rF   rQ  re   rv  rn  rô   Ú	Semaphore)rà  rr  rA  r  re   s        r%   Ú_acquire_async_aux_semaphorer}  £  sl   € ä% dÓ+€EØ€}ØÛðØ×'Ñ'Ó)ˆõ 1ÜÔ2±_Ó5FÈÌbÐQUËhÐ4WÐY^Ð`g×`qÑ`qÓrÐrøô ò Ùðús   ”A Á	A#Á"A#c                  óŠ   — t         5  t        j                  «        t        j                  «        ddd«       y# 1 sw Y   yxY w)z%Drop cached semaphores (test helper).N)ru  rm  rE  rn  r*   r'   r%   Ú_reset_aux_semaphoresr  ±  s2   € ä	ñ &Ü×"Ñ"Ô$Ü×#Ñ#Ô%÷&÷ &ñ &ús	   ‡)9¹A>   ú
minimax-cnÚminimaxr;  c                 óB   — | t         v xs d|xs dj                  «       v S )zMTrue for known Anthropic-compatible providers or any ``/anthropic`` URL path.r0  rJ   )Ú_ANTHROPIC_COMPAT_PROVIDERSrT  r×  s     r%   r  r  ½  s&   € àÔ2Ð2Ò^°lÀxÂ~ÐSU×F\ÑF\ÓF^Ð6^Ð^r'   )Úimagez	image/png)Úvideoz	video/mp4)Ú	image_urlÚ	video_urlc                 óv  — g }| D �]0  }|j                  d«      }t        |t        «      s|j                  |«       Œ7g }d}|D ]Ö  }|j                  d«      }|t        vr|j                  |«       Œ.|j                  |«      xs i j                  dd«      }t        |   \  }	}
|j                  d«      rL|j                  d«      \  }}}d|v r,d	|v r(|j                  dd
«      d
   j                  d	d
«      d   }
d|
|dœ}nd|dœ}|j                  |	|dœ«       d}ŒØ |j                  |ri |¥d|i¥n|«       �Œ3 |S )z‹Convert OpenAI ``image_url``/``video_url`` blocks to Anthropic ``image``/``video``;
    only list-content messages with such blocks change.rf  Frá   r2  rJ   zdata:ú,rN  ú;rO  r   rì  )rá   Ú
media_typerº  )rá   r2  )rá   r¯  T)r|   r2   r  rz  Ú_ANTHROPIC_MEDIA_BLOCKSrU  Ú	partitionrV  )rÜ  Ú	convertedr  rf  Únew_contentrŸ  ró   Ú
block_typer2  Ú	anth_typer‹  Úheaderr  Úb64datar¯  s                  r%   r  r  È  s_  € ð €IØó NˆØ—'‘'˜)Ó$ˆÜ˜'¤4Ô(Ø×Ñ˜SÔ!ØØˆØˆØò 	ˆEØŸ™ 6Ó*ˆJØÔ!8Ñ8Ø×"Ñ" 5Ô)ØØ—9‘9˜ZÓ(Ò.¨B×3Ñ3°E¸2Ó>ˆCÜ$;¸JÑ$GÑ!ˆI�zØ�~‰~˜gÔ&Ø%(§]¡]°3Ó%7Ñ"�˜˜7Ø˜&‘= S¨F¡]Ø!'§¡¨c°1Ó!5°aÑ!8×!>Ñ!>¸sÀAÓ!FÀqÑ!I�JØ"*¸*ÈgÑV‘à"'°Ñ4�Ø×Ñ¨	¸VÑDÔEØ‰Gð	ð  	×Ñ¹GÐ8˜CÐ8 ¨KÒ8ÈÖMð/Nð0 Ðr'   >
   Úthinkrë   rê  Ú	verbosityÚthinkingbudgetÚthinkingconfigÚenable_thinkingÚthinking_budgetÚthinking_configr¦  c                 ód   — t        | t        «      syt        d„ | j                  «       D «       «      S )zOReturn whether a profile payload contains a reasoning wire control (recursive).Fc              3   ó–   K  — | ]A  \  }}t        |«      j                  «       j                  «       t        v xs t	        |«      –— ŒC y ­wr,   )rK   rS  rT  r§  Ú"_contains_profile_reasoning_fields)ræ   rØ   Únesteds      r%   rè   z5_contains_profile_reasoning_fields.<locals>.<genexpr>ñ  sE   è ø€ ò áˆC�ô 	ˆC‹�‰Ó×ÑÓ Ô$;Ð;ÒiÔ?aÐbhÓ?iÓiñùs   ‚AA	)r2   rÜ   rõ   r6  r»  s    r%   r�  r�  í  s/   € ä�eœTÔ"ØÜñ à Ÿ;™;›=ôó ð r'   >   únous-portalr§  ÚnousresearchÚprovider_normc                 ó6   — | t         vryddlm}  ||«      dk(  S )zUTrue when a Nous Portal route serves ``model`` over /v1/messages (dual-wire catalog).Fr   r`  rt  )Ú_NOUS_PROVIDER_NAMESr)  ra  )r¡  r]  ra  s      r%   Ú_nous_on_messages_wirer¤  ú  s"   € àÔ0Ñ0ØÝ2Ù˜ÓÐ#7Ñ7Ð7r'   >   ú
nvidia-nimúbuild-nvidiaÚnimÚnvidiaÚnemotron>   úgoogle-geminiúgoogle-ai-studiorÕ  ÚgoogleÚeffective_basec                 óV   — | t         v ry|sy	 ddlm}  ||«      S # t        $ r Y yw xY w)zEGemini native by provider name, else (best-effort) by base URL shape.TFr   )r÷  )Ú_GEMINI_NATIVE_PROVIDER_NAMESrþ  r÷  r}   )r¡  r­  r÷  s      r%   Ú_is_gemini_native_router°    s9   € àÔ5Ñ5ØÙØðÝIÙ(¨Ó8Ð8øÜò Ùðús   Ž œ	(§(c                 óæ   — t        | |«      xsd t        ||«      xsV |t        v xsL t        |d«      xs> t	        |«      dk(  xs. t        ||«      xs  |dk(  xs t        |d«      xs t        |«      S )u'  Whether an explicit max_tokens is forwarded on this route.

    No default cap elsewhere (omitted = provider default; avoids max_completion_tokens / ZAI-vision
    quirks). Forward only where mandatory or honored: Anthropic Messages wire (400 without it);
    NVIDIA NIM (empty choices[] when omitted); MoA reference slots; Gemini native (fixed 65,535
    ceiling otherwise); OpenRouter (budgets the FULL window when omitted â†’ 402 on low credit);
    managed local llama-server (uncapped decode with no EOS burns the GPU to the context window).
    r  rj  rþ  ræ  )r  r¤  Ú_NVIDIA_PROVIDER_NAMESrf   rK   r°  Ú_is_managed_local_endpoint)rJ  r¡  r]  r­  rà  s        r%   Ú_forwards_max_tokensr´    s•   € ô 	& h°Ó?ò 	6Ü! -°Ó7ò	6àÔ2Ð2ò	6ô ! Ð1KÓLò	6ô ˆt‹9˜Ñ'ò		6ô
 # =°.ÓAò	6ð ˜LÑ(ò	6ô ! °ÓAò	6ô & nÓ5ð
r'   c                 óü   — t        «       }g }| D ]j  }|j                  d«      xs i j                  dd«      }|r||v rt        j                  d|||«       ŒG|r|j	                  |«       |j                  |«       Œl |S )zLDrop duplicate tool names (Vertex/Azure/Bedrock 400 on them) with a warning.rk  rD   rJ   zK_build_call_kwargs: duplicate tool name '%s' removed (provider=%s model=%s))r  r|   rŠ   r‹   rˆ  rz  )rØ  rJ  r]  r:  ÚdedupedÚtoolrD   s          r%   Ú_dedupe_tool_namesr¸  )  sƒ   € ä“€DØ€GØò ˆØ—‘˜Ó$Ò*¨×/Ñ/°¸Ó;ˆÙ�D˜D‘LÜ�N‰NÐhÐjnÐpxÐzô  AØÙØ�H‰H�TŒNØ�‰�tÕðð €Nr'   c                   ób   — e Zd ZU eeef   ed<   eeef   ed<   eeef   ed<   eed<   dZeed<   y)Ú_ProfileProjectionr`  Úreasoning_extraÚ	top_levelÚhandles_reasoningFÚmessages_wireN)	r8   r9   r:   r   rK   r   rI  rO   r¾  r*   r'   r%   rº  rº  8  s<   … Ø
ˆs�Cˆx‰.ÓØ˜#˜s˜(‘^Ó#Ø�C˜�H‰~ÓØÓØ€M�4Ôr'   rº  c                 óD   — t        | «      }|dk(  ryddlm}  ||«      duS )a™  True when a profile-less provider name is really a configured OpenAI-compatible custom endpoint.

    Keyed ``providers:`` / ``custom_providers`` entries (by bare key, or ``main``/``auto`` resolving to
    one). An unconfigured name with only an explicit base_url keeps the generic nested fallback: the
    operator declared nothing about that endpoint's wire, and the fireworks control contract pins it.
    r;  Tr   rö  N)r[  rè  r÷  )r¡  rD   r÷  s      r%   Ú_routes_to_custom_endpointrÀ  @  s,   € ô # =Ó1€DØˆxÒØÝFÙ% dÓ+°4Ð7Ð7r'   c                 ó  — i }i }i }d}d}		 ddl m}
 ddlm}  |
|«      }|€t	        |«      r |
d«      }|�•|j
                  dk(  }	|j                  |||¬«      xs i }|j                  ||du||¬	«      \  }}|xs i }|xs i }t        |«      j                  |j                  uxs% t        |«      xs t        |«      xs t        |«      }t        |||||	«      S # t        $ r!}t        j                  d
| |«       Y d}~Œ4d}~ww xY w)zFProvider profile's extra_body / kwargs projection; partial on failure.Fr   rª  )ÚProviderProfileNr;  rt  )r]  rA   rp  )rp  Úsupports_reasoningr]  rA   zA_build_call_kwargs: provider profile projection failed for %s: %s)r¿  r«  Úproviders.baserÂ  rÀ  r   Úbuild_extra_bodyÚbuild_api_kwargs_extrasrá   r�  r}   rŠ   r²   rº  )rJ  r¡  r]  r­  rp  r`  r»  r¼  r½  r¾  r«  rÂ  rÐ  r  s                 r%   Ú_project_provider_profilerÇ  N  sM  € ð €DØ&(€OØ "€IØÐØ€MðiÝ2Ý2Ù& }Ó5ˆØˆ?Ô9¸-ÔHñ +¨8Ó4ˆGØÐØ#×,Ñ,Ð0DÑDˆMØ×+Ñ+°%À.ÐcsÐ+ÓtÒzÐxzˆDØ)0×)HÑ)HØ!1ÐFVÐ^bÐFbØ nð *Ió *Ñ&ˆO˜Yð .Ò3°ˆOØ!š RˆIä�W“×5Ñ5¸_×=dÑ=dÐdò AÜ5°dÓ;òAä5°oÓFòAô 6°iÓ@ð	 ô ˜d O°YÐ@QÐS`ÓaÐaøô ò iÜ�‰ÐXÐZbÐdg×hÑhûðiús   ŒC C Ã	DÃ$D Ä DÚ
projectionc                 ó–  — t        | xs i «      }|j                  «       D ��ci c]_  \  }}t        |«      j                  «       j	                  «       t
        v r-t        |«      j                  «       j	                  «       dk7  r||“Œa }}}t        |t         «      xr |j                  d«      du }|r|j                  dd«       |j                  |j                  «       |j                  |j                  «       |j                  |«       |rAt        |t         «      r1|j                  s%|rddi|d<   nd|j                  d«      xs ddœ|d<   t        |j                  d«      t         «      rd	d
lm}	  |	|d   «      |d<   |t        v r*d|vrt!        «       |d<   d|vr	 d	dlm}
  |
«       }|r||d<   |S c c}}w # t&        $ r d}Y Œw xY w)zTCaller extra_body + profile body/reasoning + generic reasoning fallback + Nous tags.rê  rî  FNTrï  rð  rW  r   ©Úclamp_reasoning_configr  rú  )Úget_conversation_context)rÜ   r6  rK   rS  rT  r§  r2   r|   r*  rF  r`  r»  r½  r  rË  r£  r  Úagent.portal_tagsrÌ  r}   )rè  rÈ  rp  r¡  Úmerged_extrarØ   r
  Úcaller_reasoning_fieldsÚcaller_disabledrË  rÌ  Ú
sticky_keys               r%   Ú_merge_aux_extra_bodyrÒ  v  sÑ  € ô ˜
Ò( bÓ)€Là%1×%7Ñ%7Ó%9÷Ù!�s˜EÜˆs‹8�>‰>Ó×!Ñ!Ó#Ô'>Ñ>Ä3ÀsÃ8Ç>Á>ÓCS×CYÑCYÓC[Ð_jÒCjð 	ˆU‰
ðÐñ ô !Ð!1´4Ó8ÒeÐ=M×=QÑ=QÐR[Ó=\Ð`eÐ=e€OÙð 	×Ñ˜ dÔ+Ø×Ñ˜
Ÿ™Ô(Ø×Ñ˜
×2Ñ2Ô3ð ×ÑÐ/Ô0ÙœJÐ'7¼Ô>Àz×GcÒGcÙØ)2°EÐ(:ˆL˜Ò%ð 59ÐDT×DXÑDXÐYaÓDbÒDnÐfnÑ(oˆL˜Ñ%ô �,×"Ñ" ;Ó/´Ô6ÝAÙ$:¸<ÈÑ;TÓ$Uˆ�[Ñ!ð Ô,Ñ,Ø˜Ñ%Ü#4Ó#6ˆL˜Ñ Ø˜|Ñ+ð"ÝFÙ5Ó7�
ñ Ø-7�˜\Ñ*ØÐùóYøôP ò "Ø!’
ð"ús   £A$F4ÆF: Æ:GÇGrˆ  c           	      óü  — |||dœ}|�||d<   |	xs | dk(  r
t        «       nd}t        ||| «      }|t        u rd}n|�|}|�ddlm}  ||«      s||d<   t        | xs d«      j                  «       j                  «       }|�+t        | ||||
«      r|j                  t        ||¬	«      «       |rt        || |«      |d
<   ddlm} ddlm} t!        |t"        «      rE|j%                  d«      }t!        |t"        «      r$d|v r t#        |«      }|j'                  d«       |€|} | ||||||
«      «      }t)        | ||||«      }|j                  |j*                  «       t-        ||||«      }d|v rddlm}  ||||||
«      }|r||d<   |rXt!        |t"        «      rH|	xs d}|dk(  s/|j2                  s#t5        ||«      st7        |«      st9        ||«      rt#        |«      |d<   ddlm}  ||| |	t?        d«      xs d«      S )uS  Build kwargs for .chat.completions.create() with model/provider adjustments.
    ``no_progress_timeout`` is a Codex-Responses-only extra (consumed by
    ``_CodexCompletionsAdapter.create``'s ``**kwargs`` catch-all); callers must only pass it
    when the resolved client is a ``CodexAuxiliaryClient`` â€” real SDK clients don't accept it.)r]  rÜ  r²  Nrˆ  r;  rJ   r   rq  rl  rb  rØ  rÊ  )Úknown_reasoning_floorrê  rî  rR  )Ú#without_unsupported_response_formatrè  rÛ  rm  )Úmerge_session_affinity_headersrú  ) rð  r‹  r\  rv  rr  rK   rS  rT  r´  rF  rÐ  r¸  r  rË  Úagent.auxiliary_reasoning_floorrÔ  r2   rÜ   r|   r*  rÇ  r¼  rÒ  r‡  rÕ  r¾  r¤  rŸ  r  rJ  rÖ  r  )rJ  r]  rÜ  rl  rj  rØ  r²  rè  rp  rA   rà  rˆ  r/   r­  Úfixed_temperaturerr  r¡  rË  rÔ  Útask_reasoningrÈ  rÎ  rÕ  Úraw_baserÖ  s                            r%   r   r   ª  s2  € ð (-¸(ÈwÑW€FØÐ&Ø(;ˆÐ$Ñ%ØÒ]ÀÈHÒ@TÔ":Ô"<ÐZ\€Nô 5°U¸NÈHÓUÐØÔ,Ñ,Ø‰Ø	Ð	&Ø'ˆØÐÝDÙ'¨Ô.Ø$/ˆF�=Ñ!Ü˜š BÓ'×-Ñ-Ó/×5Ñ5Ó7€MØÐÔ"6°xÀÐPUÐWeÐgkÔ"lØ�‰Ô0°À5ÔIÔJÙÜ,¨U°H¸eÓDˆˆw‰õ >ÝEÜ�*œdÔ#Ø#Ÿ™¨Ó4ˆÜ�n¤dÔ+°	¸^Ñ0KÜ˜jÓ)ˆJØ�N‰N˜;Ô'ØÐ'Ø#1Ð Ù-ÙÐ.°¸~ÈuÐVZÓ[ó]Ðä*¨8°]ÀEÈ>Ð[kÓl€JØ
‡M�M�*×&Ñ&Ô'Ü(¨°ZÐAQÐS`Óa€LØ˜LÑ(ÝYÙ:¸<ÈÐXfÐhmÐosÓtˆÙØ+ˆˆ|Ññ œJÐ'7¼Ô>Ø’>˜rˆà˜[Ò(¨J×,DÒ,DÔH^Ð_lÐnsÔHtÜ2°8Ô<Ô@]Ð^kÐmuÔ@vä*.Ð/?Ó*@ˆFÐ&Ñ'õ GÙ)¨&°(¸HÔFYÐZfÓFgÒFoÐkoÓpÐpr'   r€  c                 ó^  — | €t        d|xs d› d�«      ‚ddlm}  || |||¬«       	 | j                  }|rt	        |d   d«      st        d	«      ‚	 ddlm}  || «      rt        d|xs d› d�«      ‚t        j                  «       }	|	�1t!        | d«      }
t#        |
t        «      r|
j%                  «       r|
|	d<   t'        «        | S # t
        t        t        f$ rR}t        | «      }|€9t        d|xs d› d
t        | «      j                  › dt        | «      dd ›d�«      |‚|} Y d}~ŒÕd}~ww xY w)u  Validate the .choices[0].message shape (fail fast, not a downstream AttributeError).

    Also the single aux-usage accounting chokepoint: every successful non-streaming response
    passes here exactly once; *provider*/*base_url* are optional hints.

    See #7264.
    Recording is best-effort and never affects validation. *provider*/*base_url* are optional accounting
    hints â€” fallback-path calls omit them and the row keeps the model (read from the response itself) with
    an empty route. See #23270.
    Nrû  r@  z: LLM returned None responser   )Úrecord_aux_usager×  re  zmissing choices[0].messagez&: LLM returned invalid response (type=z): éx   ug   . Expected object with .choices[0].message â€” check provider adapter or custom endpoint compatibility.)Úis_router_timeout_shimz:: provider returned a timeout shim instead of a completionr]  rr  )rF   Úagent.aux_accountingrÜ  r(  r/  rˆ   r0  Ú
IndexErrorÚ_recover_aux_response_messagerá   r8   rK   Ú!agent.transports.chat_completionsrÞ  rl  r|   rÞ   r2   rS  Ú_complete_relay_auxiliary_call)r€  rà  rJ  rA   rÜ  r(  r  Ú	recoveredrÞ  r‡  r]  s              r%   r
  r
  ô  sY  € ð ÐÜ˜Z¨ª°Ð'7Ð7SÐTÓUÐUÝ5Ù�X˜t¨hÀÕJðØ×"Ñ"ˆÙœg g¨a¡j°)Ô<Ü Ð!=Ó>Ð>ð =õ IÙ˜hÔ'ô ˜Z¨ª°Ð'7Ð7qÐrÓsÐsä%×)Ñ)Ó+€GØÐÜ�x Ó)ˆÜ�eœSÔ! e§k¡k¤mØ(-ˆGÐ$Ñ%Ü"Ô$Ø€Oøô+ œI¤zÐ2ò Ü1°(Ó;ˆ	ØÐÜØ˜Tš^ VÐ,Ð,RÔSWÐX`ÓSa×SjÑSjÐRkÐknÜ�x“=  #Ð&Ð)ð *<ð=óð ð	ð
 �ûðús   ©(C ÃD,ÃAD'Ä'D,Úsuccess©r  r  c           
      ó0  — t         j                  «       }|€yddlm} |j	                  t        |j                  d«      xs d«      | t        |j                  d«      xs d«      t        |j                  d«      xs d	«      |j                  d
«      ¬«       y)zFClose one auxiliary logical call after acceptance or terminal failure.Nr   r�  rp  rJ   r]  rn  rJ  r  rr  )r  r“  r’  Úresponse_model_name)rl  r|   r«  rž  Úcomplete_logical_callrK   )r  r‡  rž  s      r%   rã  rã  "  s   € ä%×)Ñ)Ó+€GØ€ØÝØ×#Ñ#ÜˆG�K‰K˜Ó%Ò+¨Ó,°gÜ�w—{‘{ 7Ó+Ò8¨yÓ9Ü˜'Ÿ+™+ jÓ1Ò@°[ÓAØ#ŸK™KÐ(8Ó9ð	 $õ r'   c                  ój   — 	 t        d¬«       y# t        $ r t        j                  dd¬«       Y yw xY w)zDClose a terminally failed call without replacing its original error.Úfailedræ  z+Relay auxiliary failure finalization failedTr°   N)rã  r}   rŠ   r‹   r*   r'   r%   rv  rv  0  s2   € ðUÜ&¨xÖ8øÜò UÜ�‰ÐDÈtˆÖTðUús   ‚ � 2±2c                 ó  — t        | «      }|syt        t        |¬«      t        | dd«      xs d¬«      }	 |g| _        | S # t        $ r@ t        t        | dd«      t        | dd«      t        | d	d
«      |gt        | dd«      ¬«      cY S w xY w)zžSynthesize chat-completions shape from Responses-style text (``output_text``,
    ``output`` items) that some compatible endpoints return outside ``choices``.N)rf  r&  r$  )re  r&  rô   rJ   r]  rW  úchat.completionro  ©rô   r]  rW  r(  ro  )Ú_extract_aux_response_textr   rP   r(  r}   )r€  rê   r4  s      r%   rá  rá  8  s§   € ô & hÓ/€DÙØÜ¤_¸TÔ%BÔRYÐZbÐdsÐuyÓRzò  SEð  Eô  F€Fð
Ø"˜8ˆÔØˆøÜò 
ÜÜ�x  rÓ*´'¸(ÀGÈRÓ2PÜ˜8 XÐ/@ÓAÈFÈ8Ü˜( G¨TÓ2ô
ò 	
ð
ús   ¶	A  Á AB	ÂB	c                 ó  — t        | d«      }t        |t        «      r |j                  «       r|j                  «       S t        | d«      }t        |t        «      syg }|D ]‡  }t        |d«      }|r|dk7  rŒt        |d«      xs g D ]^  }t        |d«      dv sŒt        |d«      }t        |t        «      sŒ/|j                  «       sŒ@|j                  |j                  «       «       Œ` Œ‰ d	j                  |«      j                  «       S )
zIText from Responses-style ``output_text`` or ``output[].content[].text``.rg  rd  rJ   rá   re  rf  >   Nrê   rg  rê   ú
)rÞ   r2   rK   rS  r  rz  r0  )r€  rg  rd  Úpartsr}  r~  r   rê   s           r%   rï  rï  J  sí   € ä˜ =Ó1€KÜ�+œsÔ#¨×(9Ñ(9Ô(;Ø× Ñ Ó"Ð"Ü�H˜hÓ'€FÜ�fœdÔ#ØØ€EØò /ˆÜ˜4 Ó(ˆ	Ù˜ iÒ/ØÜ˜D )Ó,Ò2°ò 	/ˆDÜ�d˜FÓ#Ð'DÒDÜ˜d FÓ+�Ü˜d¤CÕ(¨T¯Z©Z­\Ø—L‘L §¡£Õ.ñ		/ð	/ð �9‰9�UÓ×!Ñ!Ó#Ð#r'   g     À‚@g      @c                 ó~   — 	 | �t        | «      nd}t        t        t
        |z  «      S # t        t        f$ r d}Y Œ*w xY w)u§   Absolute wall-clock bound for a streamed aux call; generous by design (the idle
    timeout is the real guard â€” this only stops a one-token-per-idle-window trickle).rž  )r  r0  r)  rZ  Ú!_AUX_STREAM_CEILING_FLOOR_SECONDSÚ_AUX_STREAM_CEILING_MULTIPLIER)rø  r²  s     r%   rŽ  rŽ  f  sL   € ðØ.?Ð.K”%Ð)Ô*ÐQTˆô Ô0Ô2PÐSZÑ2ZÓ[Ð[øô ”zÐ"ò ØŠðús   ‚( ¨<»<c                 ó8   — t        | t        t        t        f«      S )z–Adapters that stream inside .create() tick the hook themselves (Codex, Anthropic) or
    cannot stream (Bedrock); none accept ``stream=True`` from us.)r2   rJ  rƒ  r–  ©rŒ   s    r%   Ú_client_streams_internallyrø  p  s   € ô �fÔ3Ô5MÔOeÐfÓgÐgr'   g      .@)rž  rJ   ztuple[float, str]Ú_managed_local_cachec                  ól  — t        j                  «       } t        \  }}| |z
  t        k  r|S 	 ddlm}  |«       j                  d¬«      }t        t        j                  |«      xs i j                  dd«      «      }t        |«      j                  j                  «       }| |fa|S # t        $ r d}Y Œw xY w)z¡host:port of the managed local llama-server ("" when none), read with a short TTL from
    the supervisor state file provider resolution also uses (exact match).r   )Ú
state_pathrÇ  r°  rA   rJ   )rû   rü   rù  Ú_MANAGED_LOCAL_STATE_TTL_SÚ#hermes_cli.local_runtime.supervisorrû  r·  rK   rµ  r¶  r|   r   ÚnetlocrT  r}   )rB  Útsr¿  rû  r?  rá  rþ  s          r%   Ú_managed_local_netlocr 	  z  s«   € ô �.‰.Ó
€CÜ%�J€BˆØ
ˆR�xÔ,Ò,ØˆðÝBÙ‹l×$Ñ$¨gÐ$Ó6ˆÜ”D—J‘J˜s“OÒ) r×.Ñ.¨z¸2Ó>Ó?ˆÜ˜$“×&Ñ&×,Ñ,Ó.ˆð   ˜=ÐØ€Møô ò ØŠðús   ­A2B% Â%B3Â2B3c                 ó    — | syt        «       }|sy	 t        t        | «      «      j                  j	                  «       |k(  S # t
        $ r Y yw xY w)zBTrue when *base_url* targets the llama-server this Hermes manages.F)r 	  r   rK   rþ  rT  r}   )rA   Úmanageds     r%   r³  r³  �  sP   € áØÜ#Ó%€GÙØðÜœ˜H›Ó&×-Ñ-×3Ñ3Ó5¸Ñ@Ð@øÜò Ùðús   ’.A Á	AÁAc                 óT  ‡— t        |xs d«      j                  «       Š‰syt        ‰d«      st        ‰«      ry	 ddlm}  |«       xs i j                  di «      j                  d«      xs g }t        |t        t        f«      rt        ˆfd	„|D «       «      S 	 y# t        $ r Y yw xY w)
uö   Providers that only accept streaming (non-stream = 400): Tencent Copilot, any
    ``auxiliary.stream_only_base_urls`` substring, and the managed local llama-server
    (streamed for cancellation â€” it only notices a dead client on socket write).rJ   Fzcopilot.tencent.comTr   rP  r  Ústream_only_base_urlsc              3   ó¦   •K  — | ]H  }t        |t        «      xr2 |j                  «       xr  |j                  «       j                  «       ‰v –— ŒJ y ­wr,   )r2   rK   rS  rT  )ræ   Úmarkerrä  s     €r%   rè   z,_provider_requires_stream.<locals>.<genexpr>§  sH   øè ø€ ò 'àô ˜6¤3Ó'Ò]¨F¯L©L«NÒ]¸v¿|¹|»~×?SÑ?SÓ?UÐY]Ð?]Ó]ñ'ùs   ƒAA)rK   rT  rf   r³  r{   rô  r|   r2   r  r¡  rõ   r}   )rJ  rA   rô  Úmarkersrä  s       @r%   rˆ  rˆ  š  sµ   ø€ ô ˆxŠ~˜2Ó×$Ñ$Ó&€DÙØÜ˜TÐ#8Ô9Ô=WÐX\Ô=]ØðÝ1Ù“=Ò& B×+Ñ+¨K¸Ó<×@Ñ@ÐAXÓYÒ_Ð]_ˆÜ�g¤¤e˜}Ô-Üó 'à%ô'ó 'ð 'ð .ð øô ò ØØðús   »AB Â	B'Â&B'z can only afford\s+([0-9][0-9,]*)i   c                 ó  — t        | «      syt        j                  t        | «      «      }|sy	 t	        |j                  d«      j                  dd«      «      }|t        z
  }|t        k\  r|S dS # t        t        f$ r Y yw xY w)zçAffordable output budget (minus margin) from an OpenRouter credit-limited 402
    ("...but can only afford 7117": credit exists, the cap was too large); ``None``
    when no count is present or the budget is too small to be useful.NrO  r‰  rJ   )r]  Ú_AFFORDABLE_TOKENS_REÚsearchrK   r  r<  Úreplacer0  r)  Ú_AFFORDABLE_RETRY_MARGIN_TOKENSÚ_AFFORDABLE_RETRY_FLOOR_TOKENS)r  r;  Ú
affordableÚcappeds       r%   Ú!_affordable_max_tokens_from_errorr	  ·  s†   € ô ˜SÔ!ØÜ!×(Ñ(¬¨S«Ó2€EÙØðÜ˜Ÿ™ Q›×/Ñ/°°RÓ8Ó9ˆ
ð Ô9Ñ9€FØÔ=Ò=ˆ6ÐGÀ4ÐGøô ”zÐ"ò Ùðús   ¯*A/ Á/BÂ Br†  r‡  c                ó$  — 	 t        | |||¬«      S # t        $ rõ}t        |«      }|€‚ |j                  d«      xs |j                  d«      }t	        |t
        t        f«      rd|cxk  r|k  r‚  t        |«      }|j                  dd«       |j                  dd«       |j                  t        |t        |j                  d«      xs d«      xs d¬«      «       t        j                  d	|xs d
||«       t        | |||¬«      cY d}~S d}~ww xY w)z Credit-aware :func:`_create_with_progress_once`: a 402 naming an affordable
    budget retries ONCE with that cap (only ever lowering); anything else re-raises.r†  Nrj  rk  r   r]  rJ   rb  zwAuxiliary %s: credit-limited 402 (affordable=%d tokens); retrying once with a clamped output cap instead of failing: %sr@  )Ú_create_with_progress_oncer}   r	  r|   r2   r  r  rÜ   r*  rF  rÐ  rK   rŠ   r¯  )rŒ   r/   rà  r‡  r  r	  Úexisting_caprž  s           r%   rš  rš  È  s  € ð
aÜ)¨&°&¸$È\ÔZÐZøÜò aÜ6°sÓ;ˆ
ØÐØØ—z‘z ,Ó/ÒV°6·:±:Ð>UÓ3VˆÜ�l¤S¬% LÔ1°a¸,Ô6TÈ*Ò6TØð 7Uä˜F“|ˆØ×Ñ˜ tÔ,Ø×ÑÐ0°$Ô7Ø×ÑÜ& z¼¸V¿Z¹ZÈÓ=PÒ=VÐTVÓ9WÒ9_Ð[_Ô`ô	bä�‰ð Uà’N˜F J°ô	5ô *¨&°,ÀÐS_Ô`Õ`ûðaús   ‚ ‘	DšC*D
ÄDÄ
Dz!Tuple[Dict[str, Any], str, float]c                 ó¢   — t        | «      }d|d<   ddi|d<   |t        | j                  d«      xs d«      t        | j                  d«      «      fS )zI(stream kwargs, model name, total ceiling) for a streamed re-aggregation.TrŸ  Úinclude_usageÚstream_optionsr]  rJ   r²  )rÜ   rK   r|   rŽ  )r/   r2  s     r%   Ú_stream_request_planr	  á  sX   € ä˜“L€MØ"€M�(ÑØ'6¸Ð&=€MÐ"Ñ#Øœ3˜vŸz™z¨'Ó2Ò8°bÓ9Ü% f§j¡j°Ó&;Ó<ð>ð >r'   c                óÆ  — t        || «      }t        «        t        «       s|rt        | «      r= | j                  j
                  j                  di |¤Ž}t        | «      s
t        «        |S t        |«      \  }}}	  | j                  j
                  j                  di |¤Ž}t!        |d«      rt        «        |S t#        |||¬«      S # t        $ r�}	|s,t        |	«      s!t        |	«      st        |	«      st        |	«      r‚ t        j                  d|xs d|	«       t        «         | j                  j
                  j                  di |¤Ž}t        «        |cY d}	~	S d}	~	ww xY w)uÆ  create() that streams (and re-aggregates, ticking the hook per substantive chunk) when a
    progress hook is active or the provider is stream-only; plain ``create(**kwargs)`` otherwise
    or when the adapter streams internally. Streaming rejections fall back to a plain call â€”
    except under ``force_stream``.

    Behavior is byte-for-byte identical to a plain ``create(**kwargs)`` when neither trigger applies (every
    existing caller/task) or when the client's wire adapter streams internally. With a hook + a
    chunk-capable client, the request is sent with ``stream=True`` and aggregated, ticking the hook only for
    substantive chunks. The configured ``timeout`` acts per stream read (idle) rather than as a total
    budget, and outer liveness watchdogs see tokens moving. ``force_stream=True`` (stream-only providers
    such as Tencent Copilot â€” credit @kudi88, PR #60686) takes the same streamed path even without a hook.
    Providers that reject the streamed request fall back to the plain non-streaming call â€” except under
    ``force_stream``, where a stream-only provider rejects the plain call by definition, so the original
    error is surfaced to the normal recovery chains instead.
    zBAuxiliary %s: streamed request failed (%s); retrying non-streamingr@  Nr(  ©r]  Útotal_ceilingr*   )r   rÐ   r×   rø  rH  r9  r.  rÕ   r	  r}   rƒ  rŽ  r]  rt  rŠ   r²   r/  Ú_aggregate_chat_stream©
rŒ   r/   rà  r‡  r€  r2  r]  r	  Úchunksr  s
             r%   r	  r	  ê  s:  € ô$ /¨v°vÓ>€FÜÔô
 !Ô"©<Ô<VÐW]Ô<^Ø1�6—;‘;×*Ñ*×1Ñ1Ñ;°FÑ;ˆÜ)¨&Ô1Ü)Ô+ØˆÜ*>¸vÓ*FÑ'€M�5˜-ðØ/�—‘×(Ñ(×/Ñ/Ñ@°-Ñ@ˆô" ˆv�yÔ!Ü%Ô'ØˆÜ! &°À]ÔSÐSøô' ò ñ Ô9¸#Ô>Ä.ÐQTÔBUÜ$ SÔ)Ô-AÀ#Ô-FØô 	�‰ÐYØ’^˜V Sô	*äÔØ1�6—;‘;×*Ñ*×1Ñ1Ñ;°FÑ;ˆÜ%Ô'Ø�ûðús   Á;&C Ã	E ÃBEÅE ÅE ©Úallow_acloser	  r	  c                óº   — t        | dd«      xs |rt        | dd«      nd}t        |«      sy	  |«       }t        j                  |«      r|S dS # t        $ r Y yw xY w)zOBest-effort ``close()`` (or ``aclose()``); returns a pending awaitable or None.rƒ  NÚaclose)rP   rª   r}   r  r  )r	  r	  r†  r  s       r%   Ú_close_chunk_streamr"	     sn   € ä�v˜w¨Ó-ò CÙ+7Œ�˜ $Ô'¸Tð ä�HÔØðÙ“ˆô ×(Ñ(¨Ô0ˆ6Ð:°dÐ:øô ò Ùðús   ®A Á	AÁAr	  r	  c                ó¸   — t        ||t        «       ¬«      }	 | D ]  }|j                  |«       Œ 	 t        | «       |j	                  «       S # t        | «       w xY w)z–Consume a chunk stream into a complete response; TimeoutError (phrased "timed out" so
    ``_is_timeout_error`` matches) when *total_ceiling* elapses.©r]  r	  rþ   )Ú_ChatStreamAccumulatorr  Úfeedr"	  rÈ  )r	  r]  r	  ÚaccÚchunks        r%   r	  r	  -  s[   € ô
 !Ø =Ô@\Ó@^ô`€Cð$Øò 	ˆEØ�H‰H�U�Oñ	ô 	˜FÔ#Ø�:‰:‹<Ðøô 	˜FÕ#ús   ˜A ÁA)rñ  rë   rf  rê   c                   óz   — e Zd ZdZ	 	 ddedee   dee   fd„Zdd„Zd	e	de
fd
„Zd	e	de
fd„Zde	ddfd„Zde	fd„Zy)r%	  zIShared per-chunk accumulation so sync and async aggregation cannot drift.Nr]  r	  rþ   c                 óÊ   — t        j                  «       | _        || _        || _        g | _        g | _        g | _        i | _        d x| _	        | _
        d| _        |xs d| _        y rï  )rû   rü   Ú_startedÚ_total_ceilingÚ_host_deadlineÚcontent_partsÚreasoning_partsÚreasoning_detailsÚtool_calls_accr&  ro  Úresp_idÚ
resp_model)r-   r]  r	  rþ   s       r%   rC   z_ChatStreamAccumulator.__init__C  sc   € äŸ™Ó(ˆŒØ+ˆÔð ,ˆÔØ(*ˆÔØ*,ˆÔØ,.ˆÔØ9;ˆÔØ*.Ð.ˆÔ˜TœZØˆŒØš+ 2ˆ�r'   r!   c                 óF  — t        j                  «       }| j                  �6|| j                  z
  | j                  k\  rt	        d| j                  d›d�«      ‚| j
                  �?|| j
                  k\  r/t	        dt        j                  «       | j                  z
  d›d�«      ‚yy)z?Raise TimeoutError past the total ceiling or the host deadline.Nz(Auxiliary streamed call timed out after rú   z3s total ceiling (stream still open but over budget)zIAuxiliary streamed call timed out at the host compression deadline after zUs (the caller already stopped waiting; streaming on would only pin its session lease))rû   rü   r,	  r+	  rý   r-	  )r-   rB  s     r%   Ú_check_deadlinesz'_ChatStreamAccumulator._check_deadlinesU  sµ   € ä�n‰nÓˆØ×ÑÐ*°°d·m±mÑ0CÈ×H[ÑH[Ò/[ÜÐ!IÈ$×J]ÑJ]Ð^aÐIbð cSð  Só Tð Tà×ÑÐ*¨s°d×6IÑ6IÒ/IÜð  1Ü15·±Ó1AÀDÇMÁMÑ1QÐRUÐ0Vð W8ð 8ó 9ð 9ð 0JÐ*r'   rã   c                 óD  ‡— t        |dd«      }|€.t        |dd«      }t        |t        «      r|j                  d«      }t        |t        «      syd}|D ]I  Š| j
                  j                  ‰«       t        ‰t        «      sŒ/t        ˆfd„t        D «       «      sŒHd}ŒK |S )z¡Collect ``reasoning_details`` (OpenRouter-style thinking); True only when a detail
        carries text, so structural/signed envelopes can't keep a stall alive.r0	  NÚmodel_extraFc              3   ój   •K  — | ]*  }t        ‰j                  |«      t        «      xr ‰|   –— Œ, y ­wr,   )r2   r|   rK   )ræ   rç   Údetails     €r%   rè   zA_ChatStreamAccumulator._feed_reasoning_details.<locals>.<genexpr>n  s3   øè ø€ ò 0eØAB”
˜6Ÿ:™: a›=¬#Ó.Ò<°6¸!±9Ó<ñ0eùs   ƒ03T)	rP   r2   rÜ   r|   r  r0	  rz  rõ   Ú_REASONING_DETAIL_TEXT_FIELDS)r-   rã   r0	  r7	  Úmade_progressr9	  s        @r%   Ú_feed_reasoning_detailsz._ChatStreamAccumulator._feed_reasoning_detailsa  s§   ø€ ô $ EÐ+>ÀÓEÐØÐ$Ü! %¨¸Ó=ˆKÜ˜+¤tÔ,Ø$/§O¡OÐ4GÓ$HÐ!ÜÐ+¬TÔ2ØØˆØ'ò 	%ˆFØ×"Ñ"×)Ñ)¨&Ô1Ü˜&¤$Õ'¬Có 0eÜFcô0eõ -eà $‘ð		%ð
 Ðr'   c                 óŒ  — d}t        |dd«      xs g D ]­  }t        |dd«      xs d}| j                  j                  |ddg dœ«      }t        |dd«      r|j                  |d<   d	}t        |d
d«      }|€Œbt        |dd«      r|j                  |d<   d	}t        |dd«      sŒŽ|d   j                  |j                  «       d	}Œ¯ |S )zHMerge tool-call fragments by index; True when any fragment carried data.Frà  NrŸ  r   rJ   )rô   rD   rl  rô   Trk  rD   rl  )rP   r1	  r“   rô   rD   rz  rl  )r-   rã   r;	  r  Úidxr'	  Úfns          r%   Ú_feed_tool_callsz'_ChatStreamAccumulator._feed_tool_callss  sÖ   € àˆÜ˜5 ,°Ó5Ò;¸ò 	)ˆBÜ˜"˜g qÓ)Ò.¨QˆCØ×%Ñ%×0Ñ0°¸RÈÐZ\Ñ6]Ó^ˆCÜ�r˜4 Ô&ØŸE™E��D‘	Ø $�Ü˜˜Z¨Ó.ˆBØ‰~Ü˜2˜v tÔ,Ø"$§'¡'�C˜‘KØ$(�MÜ˜2˜{¨DÕ1Ø˜Ñ$×+Ñ+¨B¯L©LÔ9Ø$(‘Mð	)ð Ðr'   r(	  c                 óŒ  — t        «        | j                  «        t        |dd «      xs | j                  | _        t        |dd «      xs | j                  | _        t        |dd «      }|r|| _        t        |dd «      xs g }|sy |d   }t        |dd «      xs | j                  | _        t        |dd «      }|€y d}dd	lm}  |t        |d
d «      d¬«      }|r| j                  j                  |«       d}t        |dd «      xs t        |dd «      }	|	€St        t        |dd «      t        «      r8|j                  j                  d«      xs |j                  j                  d«      }	 ||	d¬«      }	|	r| j                  j                  |	«       d}|| j!                  |«      z  }|| j#                  |«      z  }|rt%        «        y y )Nrô   r]  ro  r(  r   r&  rã   F)Úflatten_message_textrf  rJ   )ÚsepTrê  Úreasoning_contentr7	  )rÓ   r5	  rP   r2	  r3	  ro  r&  Úagent.message_contentrB	  r.	  rz  r2   rÜ   r7	  r|   r/	  r<	  r@	  rË   )
r-   r(	  Úchunk_usager(  r4  rã   r;	  rB	  ÚpieceÚreasoning_pieces
             r%   r&	  z_ChatStreamAccumulator.feed†  s²  € ô 	$Ô%Ø×ÑÔÜ˜u d¨DÓ1ÒA°T·\±\ˆŒÜ! %¨°$Ó7ÒJ¸4¿?¹?ˆŒÜ˜e W¨dÓ3ˆÙØ$ˆDŒJÜ˜% ¨DÓ1Ò7°RˆÙØØ˜‘ˆÜ$ V¨_¸dÓCÒYÀt×GYÑGYˆÔÜ˜ ¨Ó.ˆØˆ=ØØˆÝ>á$¤W¨U°I¸tÓ%DÈ"ÔMˆÙØ×Ñ×%Ñ% eÔ,Ø ˆMÜ! %¨°dÓ;Òh¼wÀuÐNaÐcgÓ?hˆØÐ"¤z´'¸%ÀÐPTÓ2UÔW[Ô'\Ø#×/Ñ/×3Ñ3°KÓ@ÒnÀE×DUÑDU×DYÑDYÐZmÓDnˆOÙ.¨ÀBÔGˆÙØ× Ñ ×'Ñ'¨Ô8Ø ˆMà˜×5Ñ5°eÓ<Ñ<ˆØ˜×.Ñ.¨uÓ5Ñ5ˆÙÜ Õ"ð r'   c                 ó0  — d }| j                   rdt        | j                   j                  «       «      D ��cg c]6  \  }}t        |d   dt        |d   dj	                  |d   «      ¬«      ¬«      ‘Œ8 }}}t        ddj	                  | j
                  «      |dj	                  | j                  «      xs d | j                  xs d ¬	«      }t        d
|| j                  xs d¬«      }t        | j                  | j                  d|g| j                  ¬«      S c c}}w )Nrô   rk  rD   rJ   rl  rm  rn  r#  )rÝ  rf  rà  rê  r0	  r   r$  r%  rí  rî  )r1	  rÂ  r6  r   r0  r.	  r/	  r0	  r&  r2	  r3	  ro  )r-   rà  Ú_idxr'	  re  r4  s         r%   rÈ  z_ChatStreamAccumulator.finish¬  s  € Øˆ
Ø×Òô "(¨×(;Ñ(;×(AÑ(AÓ(CÓ!D÷Fñ �D˜#ô   3 t¡9°:ÌØ˜V™°·±¸¸KÑ8HÓ0IôIKö LðFˆJñ Fô "Ø b§g¡g¨d×.@Ñ.@Ó&AÈjØ—g‘g˜d×2Ñ2Ó3Ò;°tØ"×4Ñ4Ò<¸ô
ˆô
 ! q°'È×I[ÑI[ÒIeÐ_eÔfˆÜ $§,¡,°d·o±oÐN_Ø(. x°t·z±zôCð 	CùóFs   µ;D)rJ   NNr›   )r8   r9   r:   r;   rK   r	   r  rC   r5	  r   rO   r<	  r@	  r&	  rÈ  r*   r'   r%   r%	  r%	  @  s{   „ ÙSàIMØ26ñ&˜cð &°xÀ±ð &Ø (¨¡ó&ó$
9ð¨Sð °Tó ð$ cð ¨dó ð&$#˜#ð $# $ó $#ðLC˜ô Cr'   r%	  c             ƒ   ó  K  — t        ||t        «       ¬«      }	 | 2 3 d{  –—† }|j                  |«       Œ7 Œ6 	 t        | d¬«      }|�Xt	        j
                  t        «      5  |ƒ d{  –—†7   ddd«       |j                  «       S # 1 sw Y   |j                  «       S xY w|j                  «       S # t        | d¬«      }|�:t	        j
                  t        «      5  |ƒ d{  –—†7   ddd«       w # 1 sw Y   w xY ww xY w­w)zXAsync mirror of :func:`_aggregate_chat_stream` (AsyncOpenAI streams need ``async for``).r$	  NTr	  )r%	  r  r&	  r"	  rC  rD  r}   rÈ  )r	  r]  r	  r'	  r(	  Úpendings         r%   Ú_aggregate_chat_stream_asyncrM	  ½  så   è ø€ ô !Ø =Ô@\Ó@^ô`€CðØ!÷ 	ð 	�%Ø�H‰H�U�Oð	ø™6ô & f¸4Ô@ˆØÐÜ×$Ñ$¤YÓ/ñ Ø—‘÷à�:‰:‹<Ð÷à�:‰:‹<Ðúˆ3�:‰:‹<Ðøô	 & f¸4Ô@ˆØÐÜ×$Ñ$¤YÓ/ñ Ø—‘÷÷ ñ úð üs}   ‚D šB2 œ9 7¡9¤B2 ·9¹B2 »(D Á#BÁ)A,Á*BÁ/D ÂBÂ&D Â2)C=ÃC0Ã!C$
Ã"C0Ã'	C=Ã0C9Ã5C=Ã=D c              ƒ   óÔ   K  — t        |«      \  }}} | j                  j                  j                  di |¤Žƒ d{  –—† }t	        |d«      r|S t        |||¬«      ƒ d{  –—† S 7 Œ(7 Œ­w)zWAsync create() for stream-only providers: ``stream=True`` + aggregate the async chunks.Nr(  r	  r*   )r	  rH  r9  r.  r/  rM	  )rŒ   r/   rà  r2  r]  r	  r	  s          r%   Ú_acreate_with_streamrO	  Î  sh   è ø€ ä*>¸vÓ*FÑ'€M�5˜-Ø1�6—;‘;×*Ñ*×1Ñ1ÑB°MÑB×B€FÜˆv�yÔ!ØˆÜ-¨f¸EÐQ^Ô_×_Ð_ð Cøð `ús!   ‚9A(»A$¼#A(ÁA&Á A(Á&A(c                 ó8   — t        | t        t        t        f«      S )z[Async twin of :func:`_client_streams_internally` (the async adapters are separate classes).)r2   rN  r‰  r�  r÷  s    r%   Ú _async_client_streams_internallyrQ	  ×  s   € ä�fÔ8Ô:WÔYtÐuÓvÐvr'   c             ƒ   ó  K  — t        || «      }t        «        t        «       s|rt        | «      rE | j                  j
                  j                  di |¤Žƒ d{  –—† }t        | «      s
t        «        |S t        |«      \  }}}	  | j                  j
                  j                  di |¤Žƒ d{  –—† }t!        |d«      rt        «        |S t#        |||¬«      ƒ d{  –—† S 7 Œ‡7 Œ4# t        $ r™}	|s,t        |	«      s!t        |	«      st        |	«      st        |	«      r‚ t        j                  d|xs d|	«       t        «         | j                  j
                  j                  di |¤Žƒ d{  –—†7  }t        «        |cY d}	~	S d}	~	ww xY w7 Œ­­w)z¾Async :func:`_create_with_progress`: stream + re-aggregate (ticking the hook per substantive
    chunk) when a progress hook is active or the provider is stream-only; plain create otherwise.NzHAuxiliary %s: streamed async request failed (%s); retrying non-streamingr@  r(  r	  r*   )r   rÐ   r×   rQ	  rH  r9  r.  rÕ   r	  r}   rƒ  rŽ  r]  rt  rŠ   r²   r/  rM	  r	  s
             r%   r²  r²  Ü  s[  è ø€ ô
 /¨v°vÓ>€FÜÔä Ô"©<Ô<\Ð]cÔ<dØ7˜Ÿ™×0Ñ0×7Ñ7ÑA¸&ÑA×AˆÜ/°Ô7Ü)Ô+ØˆÜ*>¸vÓ*FÑ'€M�5˜-ðØ5�v—{‘{×.Ñ.×5Ñ5ÑF¸ÑF×Fˆô ˆv�yÔ!Ü%Ô'ØˆÜ-¨f¸EÐQ^Ô_×_Ð_ð/ Bøð GùÜò ñ Ô9¸#Ô>Ä.ÐQTÔBUÜ$ SÔ)Ô-AÀ#Ô-FØÜ�‰Ð_Ø’^˜V Sô	*äÔØ7˜Ÿ™×0Ñ0×7Ñ7ÑA¸&ÑA×AÐAˆÜ%Ô'Ø�ûðúð  `úsm   ‚AFÁC!Á*FÂ)C% Â.C#Â/C% Â3)FÃF
ÃFÃ#C% Ã%	FÃ.A=FÅ+E.Å,FÅ<FÅ=FÆFÆFÚ_ResolvedAuxRoutec          
      óî  — |}| dk(  rct        |dk7  r|n||xs ||xs ||xs |||
¬«      \  }}}|€0|dk7  r+|s)t        j                  d|«       t        d|||
¬«      \  }}}|�ñ|xs |}nêt        ||||||	|
| ¬«      \  }}t	        ||«      }|€Æ|xs dj                  «       j                  «       }|re|d	vrat        | |«      \  }}}|€)|d
k(  r
t        «       nd}t        |xs t        |«      «      ‚||}}|rt        ||xs d| dk(  ¬«      \  }}|xs |}|}|€;|s9t        j                  d| xs d|«       t        d||
| ¬«      \  }}t	        |d«      }|€t        d| › d|› d�«      ‚t        ||||«      S )z´Resolve the client for one aux call: vision chain, or cached text client with the
    explicit-provider fallback_chain / auto-chain rescue; RuntimeError when nothing is configured.r/  rL  )rJ  r]  rA   r@   r�   r×  NzDVision provider %s unavailable, falling back to auto vision backends)rJ  r]  r�   r×  )r�   rA   r@   r   r×  rà  rJ   >   rL  r;  rþ  r§  rR  zBAuxiliary %s: provider %s unavailable, trying auto-detection chainr@  )r�   r×  rà  z$No LLM provider configured for task=z
 provider=z. Run: hermes setup)rý  rŠ   r‹   rþ  rÿ  rS  rT  rã  rb   r_   ra   r  r¯  rS	  )rà  rJ  r]  rA   r@   rÞ  rô  rõ  rö  r÷  r×  r�   r  rŒ   r"  Ú	_explicitrL  rM  r8  Únous_details                       r%   Ú_resolve_call_clientrW	    s  € ð +ÐØˆxÒÜ2PØ*;¸vÒ*EÑ&È8Ø Ò) EÐ4EÒ4QÈØ$Ò/¨¸JÐUaô3
Ñ/Ð˜F Kð
 ˆ>Ð/°6Ò9ÑBSÜ�N‰NÐaØ,ô.ä6TØ ~À*Ø)ô7+Ñ3Ð ¨ð ÐØ 2Ò GÐ6GÑä0Ø˜~¸*ÐO`Ø$Ð/@È|ØôÑˆ�ô <¸FÐDUÓVÐØˆ>ð +Ò0¨b×7Ñ7Ó9×?Ñ?ÓAˆIÙ˜YÐ.NÑNÜ0_Ø˜)ó1%Ñ-�	˜8 XàÐ$ØFOÐSYÒFYÔ"@Ô"BÐ_c�KÜ4Ø#ÒVÔ'KÈIÓ'VóXð Xà&/°˜�ÙÜ*:Ø! 8¢>¨r¸dÀhÑ>Nô+QÑ'�F˜Kà$,Ò$AÐ0AÐ!Ø%6Ð"ð ˆ~Ñ&7Ü—‘Ð`Ø šN FÐ,=ô?ä&8Ø zÀÐSWô'YÑ#�˜ä%CÀFÈFÓ%SÐ"Ø€~Ü(Ð+OÐPTÈvð V5Ø5FÐ4GÐGZð*\ó ]ð 	]ä˜V [Ð2CÐEWÓXÐXr'   Ú_PreparedAuxRequestÚrequest_providerÚ	base_infoc                ól  — t        | ||||«      \  }}}}}|r|}t        | «      }|j                  |xs i «       t        | |||||||||||¬«      \  }}}}t	        | |
«      }t        |t        t        f«      rt        | «      nd}|xs |}|s)| dk(  rt        d«      ni }t        | ||||||||¬«	      \  }}t        |||«       t        |t        |«      |«       |rt        t        |dd«      xs d«      }nHt        t        |d|«      xs d«      }| r,t         j#                  d| |xs d|xs d	|r	d
|vrd|› �nd«       t%        ||||||	||||xs || |¬«      } |rt'        |«      | d<   t        t        |dd«      xs d«      }!t)        ||!«      rt+        | d   «      | d<   t-        ||| |||||||||«      S )a   Shared head of call_llm/async_call_llm: resolve route + client, publish it, build request kwargs.
    Sync-only: compression fast lane, per-request ``extra_headers``, and ``base_info`` falling
    back to the resolved base_url when the client exposes none.)rJ  r]  rA   r@   rÞ  rô  rõ  rö  r÷  r×  r�   Nr´  r_  rA   rJ   zAuxiliary %s: using %s (%s)%srL  rÙ   rþ  z at )	rl  rj  rØ  r²  rè  rp  rA   rà  rˆ  rö  rÜ  )r›  rl  rF  rW	  rh  r2   rJ  rN  rb  rä  re  rˆ  r‹  rF  rK   rP   rŠ   r¯  r   rÜ   r  r  rX	  )"rà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   r‰  r�   rÞ  rô  rõ  rö  r÷  rù  rŒ   r"  r  rø  rˆ  rY	  Úcompression_configr  rZ	  r/   Úclient_bases"                                     r%   Ú_prepare_aux_requestr^	  L  sH  € ô a}Øˆh˜˜x¨óa2Ñ]Ð�~Ð'8Ð:JÐL]áØ$ÐÜ/°Ó5ÐØ×Ñ 
Ò 0¨bÔ1ÜAUØ�x u°xÈØ+¸NØ+Ð>NØ+¸,ÐS]ô	BÑ>€FˆKÐ*Ð,>ô /¨t°WÓ=Ðô
 �fÔ3Ô5NÐOÔPô 	& dÔ+ØVZð ð *Ò>Ð->ÐÙØJNÐR_ÒJ_Ô7¸ÔFÐegÐÜ"AØÐ"2ÀØ'¸ÐM_Ø0¸ZØ+ô	#
ÑˆÐô Ð/°Ð>OÔPÜ�zÔ#@ÐAQÓ#RÐT_Ô`ÙÜœ ¨
°BÓ7Ò=¸2Ó>‰	äœ ¨
Ð4EÓFÒLÈ"ÓMˆ	ÙÜ�K‰KÐ7ØÐ/Ò9°6¸;Ò;SÈ)Ù/8¸\ÐQZÑ=Z˜4 	˜{Ñ+Ð`bôdô
  Ø˜+ x¸[ÐU_ØÐ.Ð;OØ)°IÒ4RÐARÐY]Ø/ô	1€Fñ
 Ü"& }Ó"5ˆˆÑä”g˜f j°"Ó5Ò;¸Ó<€KÜ$Ð%5°{ÔCÜ@ÀÈ
ÑASÓTˆˆzÑÜØ�˜VÐ%6Ð8HÈ.ØÐ+Ð->Ð@QØ˜ió)ð )r'   c                   ó&   — e Zd ZU dZeed<   eed<   y)Ú_LadderStepz³A provider request the ladder asks its driver to perform. kind: "call" (client, kwargs) |
    "retry_same_provider" (provider, model) | "fallback" (fb_client, fb_model, fb_label).Úkindr.   N)r8   r9   r:   r;   rK   rI  r¡  r*   r'   r%   r`	  r`	  �  s   … ñ]à
ƒIØ
„Kr'   r`	  ú
auth errorrd  zmodel incompatible with routezinvalid provider responseúrequest timed outzconnection errorÚ_FALLBACK_REASONSÚstepÚacceptc              #   ób   K  — 	 | –—}|dfS # t         $ r} ||«      s‚ d|fcY d}~S d}~ww xY w­w)z¡One ladder rung: perform ``step``; yields ``(response, None)`` on success,
    ``(None, exc)`` when ``accept(exc)`` lets the next rung handle it, else re-raises.N)r}   )re	  rf	  r  r  s       r%   Ú_rungrh	  £  sC   è ø€ ðØ‘ˆð
 �4ˆ<Ðøô	 ò Ù�cŒ{ØØ�SˆyÕûðüs$   ‚/„ ˆ/Œ	,•'¡,¢/§,¬/c                 ó&  — t        | «      xs… t        | «      xsx t        | «      xsk t        | «      xs^ dt	        | «      v xsO dt	        | «      v xs@ t        | d«      xs2 t        | «      xs% t        | «      xs t        | «      xs t        | «      S )a6  After a parameter-strip retry: fall through to the max_tokens/payment/auth
    chains with the stripped kwargs; re-raise anything those chains won't handle.
    A 429 on the retry is the credential/provider-fallback rungs' job, so it falls
    through too (the pre-ladder max_tokens rung accepted rate limits).rj  Úunsupported_parameterrl  )
r]  r�  rŽ  rt  rK   r’  r¢  r¤  r›  r±  rm  s    r%   Ú_param_rung_acceptsrk	  ¯  s©   € ô
 ˜cÓ"ò 	1Ô&:¸3Ó&?ò 	1Ä>ÐRUÓCVò 	1Ü# CÓ(ò	1àœs 3›xÐ'ò	1à+BÄcÈ#ÃhÐ+Nò	1ô /¨s°MÓBò	1ô -¨SÓ1ò	1ô 6VÐVYÓ5Zò	1ô /¨sÓ3ò	1ô ,¨CÓ0ð	2r'   c                 óL   — t        | «      xs t        | «      xs t        | «      S r,   )rŽ  r]  rt  rm  s    r%   Ú_credential_rung_acceptsrm	  À  s$   € Ü˜#ÓÒUÔ"3°CÓ"8ÒUÔ<PÐQTÓ<UÐUr'   Ú_LadderRoutec                 ón   — d| v r*| j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}S dS c c}}w )zACopy *kwargs* without ``temperature``; None when it was not sent.rl  N©r6  ©r/   r8  r9  s      r%   Ú_without_temperaturerr	  Î  s9   € àFSÐW]ÑF]˜VŸ\™\›^×B‘T�Q˜¨q°MÓ/AˆAˆq‰DÓBÐgÐcgÐgùÓBs   ˜1¦1c                 ó`   — | j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}S c c}}w )um  Copy *kwargs* without either output cap. Unlike the other strips this never returns None: a
    route can translate the caller's cap into a field the wire kwargs no longer show (Codex
    Responses), and the provider's own gateway may inject one â€” the 400 still names ``max_tokens``
    and the identical request completes on retry (registry class #89897/#90257).)rj  rk  rp	  rq	  s      r%   Ú_without_max_tokensrt	  Ó  s.   € ð
 $Ÿ\™\›^×`‘T�Q˜¨qÐ8_Ò/_ˆAˆq‰DÓ`Ð`ùÓ`s   ”*¡*c                 óŒ   — t        | «      }d|v xr dt        t        |dd«      «      v }d|v xs d|v xs t        | d«      xs |S )NÚ1210ÚbigmodelrA   rJ   rj  rj	  )rK   rP   r’  )r  rŒ   Úerr_strÚis_zai_param_errors       r%   Ú_is_max_tokens_rejectionrz	  Û  sg   € Ü�#‹h€Gð   7Ð*Òa¨z¼SÄÈÐQ[Ð]_ÓA`Ó=aÐ/aÐØ˜GÐ#ò XÐ'>À'Ð'Iò XÜ.¨s°LÓAòXØEWðYr'   c                 óž   ‡ ‡— d„ t         dt        ft        t        dt        ft
        t        dt        ft        t        ddfˆ ˆfd„t        ddffS )	a  Ordered ``(matches, strip, log message, remember)`` parameter rungs; ``strip`` returns None
    when the field was not on the wire, so an unchanged request is never re-sent; ``remember``
    (optional) records the rejection per route so the next call omits the field up front.c                 ó   — t        | d«      S )Nrl  )r’  rm  s    r%   rß  z"_parameter_rungs.<locals>.<lambda>é  s   € Ô4°S¸-ÓH€ r'   z2provider rejected temperature; retrying without itz|provider rejected the structured-output format field; retrying without it (schema enforcement degrades to prompt compliance)z9provider requires reasoning; retrying at the floor effortzRprovider rejected the reasoning field; retrying without it (route default applies)Nc                 ó(   •— ‰d uxr t        | ‰«      S r,   )rz	  )r  rŒ   rj  s    €€r%   rß  z"_parameter_rungs.<locals>.<lambda>ú  s   ø€ �Z tÐ+ÒUÔ0HÈÈfÓ0U€ r'   z5provider rejected the output cap; retrying without it)rr	  r‰  r›  r   r   r¤  r   r   r¢  r¨  rt	  )rŒ   rj  s   ``r%   Ú_parameter_rungsr~	  ä  sm   ù€ ñ
 
IÔJ^Ø	=Ô?]ð	_ä	(Ô*Kð
>Ü?cð	eô 
*Ô+?Ø	DÔF^ð	`ä	&Ô(AØ	]Ð_cð	eä	UÔWjØ	@À$ð	Hð%ð r'   Ú	first_errr	  c              #   ó  ‡ ‡K  — |j                   |j                  |j                  }}}t        t	        ||«      «      }|rºt        ˆ ˆfd„|D «       d«      }|€n¡|j                  |«       |\  }	}
}} |
‰«      }t        j                  d|xs d||‰ «       ‰ }t        t        d||f«      t        «      E d{  –—† \  }Š ‰ €4|�- ||j                  |j                  xs |j                  ‰|«       |d|fS |Š|rŒºd‰ ‰fS 7 ŒG­w)aÎ  Parameter rungs: retry without temperature / structured-output format / reasoning field /
    max_tokens. Rungs chain in whichever order the provider raises them (reasoning models reject
    temperature AND max_tokens; a reasoning-strip retry can then trip temperature, #78273), each
    field stripped at most once, so a request with N rejected fields recovers in N retries.
    Returns ``(response, None, kwargs)`` or ``(None, narrowed_err, stripped_kwargs)``.c              3   óN   •K  — | ]  } |d    ‰«      r |d   ‰«      �|–— Œ y­w)r   rO  Nr*   )ræ   Úrungr	  r/   s     €€r%   rè   z*_ladder_parameter_rungs.<locals>.<genexpr>
  s7   øè ø€ ò K˜TØ�t˜A‘w˜yÔ)¨g¨d°1©g°f«oÐ.Iô ñ Kùs   ƒ"%NzAuxiliary %s%s: %s: %sr@  )rŒ   rà  rt  r  r~	  r+  ÚremoverŠ   r¯  rh	  r`	  rk	  rÞ  rZ	  rõ  )r	  r	  r/   rj  rŒ   rà  rt  ÚrungsÚhitÚmatchesrS  re  Úrememberrž  Ú	rejectionÚresps   ` `             r%   Ú_ladder_parameter_rungsrŠ	  ÿ  s#  ùè ø€ ð Ÿ™ e§j¡j°%·)±)�#ˆD€FÜÔ! &¨*Ó5Ó6€EÙ
Üô K Uô KØLPóRˆàˆ;ØØ�‰�SÔØ,/Ñ)ˆ�˜ Ù˜V“}ˆÜ�‰Ð,¨dªn°f¸cÀ7ÈIÔVØˆ	Ü%*Ü˜ ¨Ð 6Ó7Ô9Ló&N÷ N‰ˆˆiàÐØÐ#ñ ˜×0Ñ0°%·/±/Ò2\ÀU×E\ÑE\Ø ô,à˜˜|Ð+Ð+Øˆò' ð( �˜FÐ"Ð"ðNús   „B3DÂ7C?Â8ADÃ:Dre  c                 ó¾  — t        | j                  xs d| j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  dk(  ¬«
      \  }}|€yt        j                  || j                  xs d| j                  «       |r||j                  d«      k7  r||d<   t        d||f«      S )zNRebuild the Nous client after a credential event; None when nothing refreshed.r§  r/  )
ró  r]  rñ  rò  r�   rA   r@   r   r×  r  Nr@  r]  )rù  rÞ  r"  rô  rà  r�   rõ  rö  r÷  r×  rŠ   r¯  rt  r|   r`	  )r	  r/   re  Úrefreshed_clientÚrefreshed_models        r%   Ú_refreshed_nous_steprŽ	     sÄ   € ä(FØ×.Ñ.Ò8°&À×@QÑ@QØ×)Ñ)°u·z±zÈe×N^ÑN^Ø×(Ñ(°%×2HÑ2HØ×(Ñ(°u×7IÑ7IØ—:‘: Ñ)ô)Ñ%Ð�oð ÐØÜ
‡K�K�˜Ÿ™Ò- v¨u¯y©yÔ9Ù˜?¨f¯j©j¸Ó.AÒAØ)ˆˆw‰Ü�vÐ 0°&Ð9Ó:Ð:r'   Úclient_is_nousc              #   óœ  K  — |j                   |j                  |j                  }}}t        | «      r’|r�t	        |dk(  |j                  d«      ¬«      }|ro||j                  d«      k7  r[t        j                  d|xs d||j                  d«      |«       ||d<   t        t        d||f«      d„ «      E d{  –—† \  }} | €|dfS t        | «      r9|r7t        «       r-t        ||d«      }	|	�t        |	d	„ «      E d{  –—† \  }} | €|dfS t        | «      r/|r-t        ||d
«      }	|	�t        |	d„ «      E d{  –—† \  }} | €|dfS d| fS 7 Œ�7 ŒM7 Œ­w)z•Nous-only rungs: stale-model self-heal, paid-account refresh, 401 refresh.
    Returns ``(response, None)`` or ``(None, first_err)`` to fall through.r/  r]  )r/  rA  z]Auxiliary %s%s: model %r no longer in Nous catalog; retrying with refreshed recommendation %rr@  c                  ó   — yr¿  r*   rm  s    r%   rß  z$_ladder_nous_rungs.<locals>.<lambda>A  rþ  r'   NzUAuxiliary %s%s: refreshed Nous runtime credentials after paid account check, retryingc                 ó2   — t        | «      xs t        | «      S r,   ©rm	  r�  rm  s    r%   rß  z$_ladder_nous_rungs.<locals>.<lambda>K  ó   € Ô":¸3Ó"?Ò"\ÔCWÐX[ÓC\€ r'   zFAuxiliary %s%s: refreshed Nous runtime credentials after 401, retryingc                 ó2   — t        | «      xs t        | «      S r,   r“	  rm  s    r%   rß  z$_ladder_nous_rungs.<locals>.<lambda>S  r”	  r'   )rŒ   rà  rt  r­  rE  r|   rŠ   r‹   rh	  r`	  r]  rc  rŽ	  rŽ  )
r	  r	  r/   r�	  rŒ   rà  rt  Úhealed_modelr‰	  re	  s
             r%   Ú_ladder_nous_rungsr—	  1  s„  è ø€ ð
 Ÿ™ e§j¡j°%·)±)�#ˆD€Fô ! Ô+±Ü6Ø˜HÑ$°6·:±:¸gÓ3FôHˆá˜L¨F¯J©J°wÓ,?Ò?Ü�N‰Nð Gàš> 6¨3°·
±
¸7Ó0CÀ\ôSð +ˆF�7‰OÜ).¬{¸6ÀFÈFÐCSÓ/TÑVfÓ)g×g‰OˆD�)ØÐ Ø˜T�zÐ!ä˜Ô#©Ô;eÔ;gÜ#Ø�6Øcóeˆð ÐÜ).ØÑ\ó*^÷ ^‰OˆD�)àÐ Ø˜T�zÐ!Ü�iÔ ¡^Ü#Ø�6ÐcóeˆàÐÜ).ØÑ\ó*^÷ ^‰OˆD�)àÐ Ø˜T�zÐ!Ø�ˆ?Ðð+ høð^øð^ús7   ‚B4EÂ6EÂ7AEÃ:EÃ;9EÄ4E
Ä5EÅEÅ
Ec           	   #   ól  K  — |j                   |j                  |j                  |j                  f\  }}}}t	        ||j
                  t        |d«      «      }t        | «      r¡|dvr�|s›|dk(  rdt        |dd«      ini }	t        |fi |	¤Žry|t        |«      k7  rt        |«       t        j                  d|xs d||«       t        d||j                  xs |j                   f«      }
t#        |
d	„ «      E d
{  –—† \  }} | €|d
fS t%        |||j&                  ¬«      }t)        t        |dd«      xs d«      }|r«t+        | «      r | }t-        | «      r8t/        | «      s-t#        t        d||f«      t*        «      E d
{  –—† \  }}|€|d
fS t1        |||¬«      rMt        j                  d|xs d||t3        |«      j4                  «       	 t        d||j                  f«      –—d
fS d
| fS 7 Œð7 Œn# t6        $ r>}t/        |«      st        |«      st-        |«      rt1        ||«       |} n‚ Y d
}~d
| fS d
}~ww xY w­w)z™OAuth credential refresh + same-provider retry, then credential-pool rotation.
    Returns ``(response, None)`` or ``(None, first_err)`` to fall through.rJ   >   NrJ   rL  rÛ  ré  r@   zCAuxiliary %s%s: refreshed %s credentials after auth error, retryingr@  Úretry_same_providerc                 ó2   — t        | «      xs t        | «      S r,   r“	  rm  s    r%   rß  z*_ladder_credential_rungs.<locals>.<lambda>p  r”	  r'   NrÑ  rè  zBAuxiliary %s%s: recovered %s via credential-pool rotation after %s)rŒ   rà  rt  rÞ  r7  rZ	  rÿ  rŽ  rP   r2  r[  r¼  rŠ   r¯  r`	  rô  r"  rh	  rç  r×  rK   rm	  rt  r]  ró  rá   r8   r}   )r	  r	  r/   r�	  rŒ   rà  rt  rÞ  Úauth_refresh_providerr}  re	  r‰	  Úpool_providerÚ_client_api_keyÚrecovery_errÚ
retry2_errs                   r%   Ú_ladder_credential_rungsr 	  Y  s  è ø€ ð
 ,1¯<©<¸¿¹ÀUÇYÁYÐPU×PgÑPgÐ+gÑ(€FˆD�#Ð(Ü<Ø˜5Ÿ?™?Ô,JÈ6ÐSUÓ,VóXÐä�yÔ!Ð&;ÐCUÑ&UÙ"à2°kÒAð ,¬W°V¸YÈÓ-KÑLØGIð 	ä(Ð)>ÑQÀ.ÒQØ$Ô(?Ð@QÓ(RÒRô &Ð&7Ô8Ü�K‰KÐ]Øš ¨Ð-BôDäØ%Ø&¨×(<Ñ(<Ò(QÀ×@QÑ@QÐRóTˆDô */ØÑ\ó*^÷ ^‰OˆD�)àÐ Ø˜T�zÐ!ô
 /Ð/@À&ÐW\×WiÑWiÔj€Mô œ' &¨)°RÓ8Ò>¸BÓ?€Oñ Ô1°)Ô<Ø ˆô   	Ô*Ô3DÀYÔ3OÜ,1Ü˜F V¨VÐ$4Ó5Ô7Oó-Q÷ "QÑˆD�,àÐ#Ø˜T�zÐ!Ü! -°ÈoÕ^Ü�K‰KÐ\Øš ¨¨]¼DÀÓ<N×<WÑ<WôYðÜ)Ø)Ð,=¸u×?SÑ?SÐ+TóVñ VØX\ð]ð ]ð �ˆ?ÐðO^øð("Qùô ò ô & jÔ1´^ÀJÔ5OÜ/°
Ô;Ü*¨=¸*ÔEØ *‘Iàó ð �ˆ?ÐûðüsP   ‚C3H4Ã5G&Ã6BH4Å9G(Å:AH4ÇG* Ç!H4Ç(H4Ç*	H1Ç31H,È$H4È,H1È1H4©Útask_chain_onlyÚis_autor¢	  c                óð   — d}t        | |xs d|||j                  |¬«      }|r|S |d   €!|rt        | |xs d|||j                  |¬«      }|d   €%t        || ||j                  ||j                  ¬«      }|S )uc  Next candidate after a fallback entry was quarantined mid-request (dead credential or a
    capacity error): remaining configured entries (task chain, then main chain on auto) before the
    discovery chain. ``task_chain_only`` (explicit-provider auth error) stops at the task chain â€”
    the user never opted that task into discovery or the main model.zfallback candidate unavailablerL  ©r”  rµ  r¡  r¢  r   ©r”  r¡  r¢  r×  )rß  rZ	  rë  r´  r×  )	rà  rÞ  r£	  r	  rµ  r¢  r¢	  r”  Úfbs	            r%   Ú_next_fallback_after_quarantiner¨	  ™  s™   € ð .€FÜ	'ØÐÒ) 6°&À|ØŸ™°}ô
F€Bñ Øˆ	Ø	ˆ!�u€}™Ü%ØÐ#Ò- v°fÈ<Ø!ŸO™O¸=ôJˆð 
ˆ!�u€}Ü"Ø˜t¨FÀEÇOÁOØ'°e×6HÑ6HôJˆð €Ir'   c           	   #   óª  ‡ K  — |j                   |j                  |j                  }}}|dv }t        ˆ fd„t        D «       d«      }t        ˆ fd„t        D «       «      }|rt        |«      j                  d«      nd}t        |t        «      xr t        |«      }	|dk(  xr | xr |	}
|�|s|s|
sy|dk(  r;t        t        ||j                  |j                  ¬«      xs ||j                  ¬	«       |d
k(  r<t         j#                  d|xs d||j                  xs ||j$                  |xs d|«       nt         j'                  d|xs d|||‰ «       |dv rdn|j(                  }ddlm} |dk(  r"t/        ||j                  «      r|j0                  nd}t3        ||xs d|||j                  |¬«      \  }}}|€Q|rOt5        ||xs d|||j                  |¬«      \  }}}|€Mt7        ||||j                  ||j                  ¬«      \  }}}n#|€!|
st9        |||||j                  |¬«      \  }}}t;        «       }|��||t=        t?        |dd«      xs d«      f}||v rn_|jA                  |«       tC        |jD                  tG        |«      |«       tI        d|||f«      –—}|�|S tK        |||||||
¬«      \  }}}|�Œ�t         j#                  d|xs d|||«       y­w)u  Last rung: other providers (per-task chain; then auto: main fallback chain + discovery
    chain, explicit: main-agent-model net). Returns the response or None.
    Capacity errors (payment/quota, connection, exhausted 429, model incompatible, malformed
    response) bypass the explicit-provider gate â€” the provider cannot serve this request
    regardless of user intent. Auth errors from an explicit provider may only use the task's
    own configured fallback_chain; they never imply an unconfigured provider hop.>   NrJ   rL  c              3   ó:   •K  — | ]  \  }} |‰«      sŒ|–— Œ y ­wr,   r*   ©ræ   Ú	predicaterÄ   r	  s      €r%   rè   z,_ladder_provider_fallback.<locals>.<genexpr>Á  s   øè ø€ Ò[Ñ-˜Y¨ÁiÐPYÕFZ”5Ñ[ùs   ƒ”Nc              3   ó@   •K  — | ]  \  }}|d k7  sŒ |‰«      –— Œ y­w)rb	  Nr*   r«	  s      €r%   rè   z,_ladder_provider_fallback.<locals>.<genexpr>Â  s)   øè ø€ ò aÙ!1 ¨EÈ%ÐS_ÓJ_‰	�)×ñaùs   ƒ‘r:  rb	  r   rÑ  r  rc	  z‚Auxiliary %s%s: request to %s timed out after %ss (raise auxiliary.%s.timeout for slow or reasoning models) on %s, trying fallbackr@  z.Auxiliary %s%s: %s on %s (%s), trying fallback)rb	  r   r   )r¸  rL  r¥	  r¦	  rA   rJ   rI  r¡	  ztAuxiliary %s%s: %s on %s and all fallbacks exhausted (fallback_chain + main agent model). Raising the primary error.)&rà  rt  rÞ  r+  rd	  rõ   rä  r|   r2   r  rO   r&  rç  rŒ   r×  rZ	  rŠ   r‹   r²  r¯  r"  rÀ  r¸  r[   ÚENDPOINTrß  rë  r´  rË  r  rK   rP   rˆ  r‹  r‰  rF  r`	  r¨	  )r	  r	  rà  rt  rÞ  r£	  r”  Úis_capacity_errorÚ
task_chainÚhas_task_fallback_chainÚexplicit_auth_with_task_chainÚ_chain_failed_modelr¸  Ú_chain_failure_scoperL  rM  r8  Útried_lanesr>  Úfb_resps   `                   r%   Ú_ladder_provider_fallbackr·	  ²  sI  øè ø€ ð $)§:¡:¨u¯y©y¸%×:QÑ:QÐ ˆ#€Dð  Ð#5Ð5€GÜÓ[Ô1BÔ[Ð]aÓb€FÜó aÜ5Fôaó aÐáKOÔ+¨DÓ1×5Ñ5Ð6FÔGÐUY€JÜ(¨´TÓ:ÒO¼tÀJÓ?OÐà�,ÑÒJ w ;ÒJÐ3Jð "ð €~™gÑ):Ñ>[ØØ�Ò ô 	!Ü&Ð'8¸%¿,¹,ÐUZ×UgÑUgÔhò !Ø ¨5¯?©?õ	<ð Ð$Ò$ô 	�‰ð Nà’~˜v s¨E¯O©OÒ,PÐ?PÐRW×R_ÑR_Ø’~˜vÐ'8õ	:ô
 	�‰ÐDØ’N˜F C¨Ð1BÀIô	Oð
 #)Ð,KÑ"K™$ÐQV×QbÑQbÐÝ3ð �_Ò$Ô)@ÐARÐTY×TcÑTcÔ)dð 	×Òàð ô
 %CØÐÒ) 6°&ÐGZØŸ™Ð7Kô%MÑ!€Iˆx˜ð Ð™WÜ(@ØÐ#Ò- v°fÐK^Ø!ŸO™OÐ;Oô)QÑ%ˆ	�8˜Xð ÐÜ,AØ! 4°ÈÏÉØ2À×ASÑASô-UÑ)ˆI�x¡ð 
Ð	Ñ#@Ü(FØ˜t¨FÐATØ!ŸO™OÐ;Oô)QÑ%ˆ	�8˜Xô “u€KØ
Ð
Ø˜(¤C¬°	¸:ÀrÓ(JÒ(PÈbÓ$QÐRˆØ�;ÑØØ�‰˜ÔÜ˜5×+Ñ+Ô-JÈ8Ó-TÐV^Ô_Ü# J°¸HÀhÐ0OÓPÑPˆØÐØˆNÜ(GØÐ# W¨eÐ5HÐJ^Ø9ô);Ñ%ˆ	�8˜Xð Ñ
ô ‡N�Nð Uð
 ’>˜6 3¨Ð0AôCð ùs   ƒJ1KÊ5Kc             #   ó   K  — |rdnd}t        |||||||||	|
||||j                  d«      «      }t        | |||«      E d{  –—† \  }} }| €|S |dk(  xs t        |d«      }t	        | |||«      E d{  –—† \  }} | €|S t        | |||«      E d{  –—† \  }} | €|S t        | |«      E d{  –—† }|�|S t        | «      r	 t        |«       | ‚| ‚7 ŒŒ7 Œ]7 ŒB7 Œ)# t        $ r t        j                  d|d¬	«       Y | ‚w xY w­w)
uh  Ordered recovery rungs after the primary request failed (generator): parameter
    strips â†’ Nous heal/refresh â†’ credential refresh/pool rotation â†’ provider fallback.
    Each rung returns a response, narrows ``first_err`` and falls through, or re-raises.
    Raises the narrowed ``first_err`` when exhausted (after evicting a connection-poisoned client).rž  rJ   r²  Nr§  r×  z9Auxiliary%s: cache eviction after connection error failedTr°   )rn	  r|   rŠ	  rf   r—	  r 	  r·	  r�  r°  r}   rŠ   r²   )r	  rŒ   r/   rà  r�   rZ	  rÞ  rô  rõ  rö  r÷  r"  rj  r×  r‰  rt  r	  r‰	  r�	  s                      r%   Ú_aux_recovery_ladderr¹	    s[  è ø€ ñ #‰*¨€CÜØ��c˜: yÐ2CÀ^ØÐ+Ð->ÀÈ\Ð[eØ�
‰
�9Óó€Eô *AÀÈEÐSYÐ[eÓ)f×fÑ€Dˆ)�VØÐØˆØ'¨6Ñ1ò \Ü.¨yÐ:ZÓ[ð ä!3°I¸uÀfÈnÓ!]×]�O€Dˆ)ØÐØˆÜ!9¸)ÀUÈFÐTbÓ!c×c�O€Dˆ)ØÐØˆÜ/°	¸5ÓA×A€DØÐØˆô ˜IÔ&ð	-Ü)¨&Ô1ð €Oˆ)€Oð; gøð
 ^øð døð Bùô ò 	-Ü�L‰LÐTØ tð õ -ð €Oð	-üsk   ‚?C>ÁCÁ0C>Á2CÁ3C>ÂCÂC>Â*CÂ+C>Â?C Ã
C>ÃC>ÃC>ÃC>Ã!C;Ã7C>Ã:C;Ã;C>Úperformc                 óä   — 	 t        | «      }	 	  ||«      }| j                  |«      }Œ# t        $ r}| j                  |«      }Y d}~Œ d}~ww xY w# t        $ r}|j
                  cY d}~S d}~ww xY w)zJRun a ladder generator, feeding each step's result (or exception) back in.N©r+  Úsendr}   ÚthrowÚStopIterationr
  ©Úladderrº	  re	  r  r  r$  s         r%   Ú_drive_ladderrÂ	  @  sq   € ð
Ü�F‹|ˆØð+Ù  ›�ð —{‘{ 6Ó*�ð øô ò )Ø—|‘| CÓ(•ûð)ûô ò Ø�z‰zÕûðúsB   ‚A �) —A ©	A²AÁA ÁAÁA Á	A/ÁA*Á$A/Á*A/c              ƒ   ó   K  — 	 t        | «      }	 	  ||«      ƒ d{  –—† }| j                  |«      }Œ#7 Œ# t        $ r}| j                  |«      }Y d}~Œ"d}~ww xY w# t        $ r}|j
                  cY d}~S d}~ww xY w­w)z=Async twin of :func:`_drive_ladder` (``perform`` is awaited).Nr¼	  rÀ	  s         r%   Ú_drive_ladder_asyncrÄ	  O  sx   è ø€ ð
Ü�F‹|ˆØð+Ù& t›}×,�ð —{‘{ 6Ó*�ð à,ùÜò )Ø—|‘| CÓ(•ûð)ûô ò Ø�z‰zÕûðüs_   ‚A>„A ‘5 œ3�5 ¡A ³5 µ	A¾AÁA ÁAÁA Á	A;Á%A6Á0A;Á1A>Á6A;Á;A>Ú
started_atrB  c                 ód   — t        dt        |€t        j                  «       n|| z
  dz  «      «      S )z7Whole milliseconds since ``started_at`` (clamped at 0).r   iè  )rZ  r  rû   rü   )rÅ	  rB  s     r%   Ú_elapsed_msrÇ	  ^  s,   € äˆq”#¨C¨KœŸ™Ô(¸SÀJÑNÐRVÑVÓWÓXÐXr'   Úlatency_infoc                 ó0   — | �|| vrt        |«      | |<   yyy)z;Record ``key`` in ``latency_info`` the first time it fires.N)rÇ	  )rÈ	  rØ   rÅ	  s      r%   Ú_stamp_latency_oncerÊ	  c  s&   € àÐ C¨|Ñ$;Ü'¨
Ó3ˆ�SÒð %<Ðr'   )rJ  r]  rA   r@   r×  rl  rj  rØ  r²  rè  rp  rö  r   rŸ  r	  r‰  rÈ	  rŸ  r	  c                óø  — t        j                  «       }t        | «      }|�|j                  «        t        j                  «       }|�t	        ||«      |d<   t        t        dd«      }	 t        |«      5  t        t        |«      r|n|�d„ nd«      5  t        t        t        j                  t        |d|«      «      5  t        t        t        j                  t        |d|«      «      5  t!        di d| “d|“d	|“d
|“d|“d|“d|“d|“d|“d|	“d|
“d|“d|“d|“d|“d|“d|“d|“Ž}ddd«       ddd«       ddd«       ddd«       |r5|�3|}d}t#        |«      |�t	        |«      |d<   |�|j%                  «        S S |�t	        |«      |d<   |�|j%                  «        S S # 1 sw Y   Œ}xY w# 1 sw Y   Œ�xY w# 1 sw Y   Œ…xY w# 1 sw Y   Œ‰xY w# |�t	        |«      |d<   |�|j%                  «        w w xY w)zARun an auxiliary LLM request, applying the configured task limit.NÚqueue_wait_msrÆ   c                   ó   — y r,   r*   r*   r'   r%   rß  zcall_llm.<locals>.<lambda>‚  rþ  r'   Úprovider_dispatch_msÚtime_to_first_progress_msrà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   rŸ  r	  r‰  Úsummary_generation_msr*   )rû   rü   rz  ÚacquirerÇ	  rP   rÊ   rÙ  r  rª   r  rÏ   r  ÚpartialrÊ	  rÒ   Ú_call_llm_implÚ$_release_sync_semaphore_after_streamÚrelease)rà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   rŸ  r	  r‰  rÈ	  Úqueue_started_atÚ	semaphoreÚrequest_started_atÚprior_progress_hookr€  Ústream_semaphores                            r%   Úcall_llmrÛ	  i  s�  € ô —~‘~Ó'ÐÜ+¨DÓ1€IØÐØ×ÑÔÜŸ™Ó)ÐØÐÜ(3Ð4DÐFXÓ(Yˆ�_Ñ%Ü!¤-°¸Ó>Ðð ä Ó-ñ	ääÐ/Ô0ñ $à(4Ð(@’|Àdóñ	ô #¤=´)×2CÑ2CÜ# \Ð3IÐK]ó3_ó `ñ	ô #Ô#9¼9×;LÑ;LÜ# \Ð3NÐPbó<dó eñ	ô &ò ÙðÙ$,ðÙ49ðÙDLðÙV]ðá)ðá4<ðáJUðñ &ðñ .3ðñ =Dðñ Q[ðñ "2ð	ñ BOð	ñ Zbð	ñ
 ðñ
 /=ðñ
 JTðˆH÷	÷ 	÷ 	÷ 	ñ& �iÐ+Ø(ÐØˆIÜ7¸ÐBRÓSð Ð#Ü4?Ð@RÓ4SˆLÐ0Ñ1ØÐ Ø×ÑÕð !ð	 àÐ#Ü4?Ð@RÓ4SˆLÐ0Ñ1ØÐ Ø×ÑÕð !÷7	ð 	ú÷ 	ð 	ú÷ 	ð 	ú÷ 	ð 	ûð2 Ð#Ü4?Ð@RÓ4SˆLÐ0Ñ1ØÐ Ø×ÑÕð !úss   Á)G Á4GÂ+F<Â=+F0Ã(A F$	Ä(F0Ä0F<Ä8GÅ G Å?G Æ$F-Æ)F0Æ0F9Æ5F<Æ<G	ÇGÇGÇG Ç%G9r×	  c              #   óD  K  — 	 | E d{  –—†  	 t        | dd«      }t        |«      r |«        |j                  «        y7 Œ5# |j                  «        w xY w# 	 t        | dd«      }t        |«      r |«        |j                  «        w # |j                  «        w xY wxY w­w)zGRelease a permit only after a streaming response is consumed or closed.Nrƒ  )rP   rª   rÕ	  )rŸ  r×	  rƒ  s      r%   rÔ	  rÔ	  œ  s‹   è ø€ ð Ø×Ðð	 Ü˜F G¨TÓ2ˆEÜ˜ŒÙ”à×ÑÕð 	ùð ×ÑÕûð	 Ü˜F G¨TÓ2ˆEÜ˜ŒÙ”à×ÑÕøˆI×ÑÕÿsR   ‚B „A ‰?ŠA �A ®B ¿A ÁAÁB ÁBÁBÁ7BÂBÂBÂB c          
      óX  — t        |«      }t        | fi d|“d|“d|“d|“d|“d|“d|“d|	“d	|
“d
|“d|“d|“d|“d|“d|“d|“Ž}t        | |||	|
|j                  |j                  |¬«      }t        ||j
                  |j                  |j                  ||j                  |¬«      }|||fS )aG  Shared head of both call impls: prepare the request and bundle the kwargs the recovery
    drivers pass to ``_retry_same_provider_*`` / ``_call_fallback_candidate_*``. One immutable
    runtime snapshot for keying/resolution/retries/fallbacks, so a concurrent /model switch
    can't mix key and client from different runtimes.rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   r‰  r�   )rà  rÜ  rl  rj  rØ  rø  rù  rp  )rõ  rö  r÷  r×  r"  rö  )	rý  r^	  rÜ   rø  rù  rõ  rö  r÷  r"  )rà  r�   rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   r‰  r=  Úcandidate_kwargsrž  s                       r%   Ú_plan_aux_callrß	  ©  s!  € ô +¨<Ó8€LÜ
ØòÙðÙ',ðÙ7?ðÙIPðá!ðá,4ðáBMðñ ðñ &+ðñ 5<ðñ ISðñ *ð	ñ :Gð	ñ
 ðñ
 '1ðñ
 >Hð€Cô Ø˜H°+È*Ø s×'<Ñ'<Ø ×5Ñ5ÐHXôÐô
 Ø¨C×,AÑ,AØ×-Ñ-À×AVÑAVØ!¨s¯©Èmô€Lð
 �Ð.Ð.Ð.r'   c                 óf   — t        |«      syt        | |«      rt        j                  d| ||«       yy)zÍTrue when ``exc`` is a transient transport blip worth a same-provider retry; critical-path
    tasks skip it on a full-budget timeout (``_should_skip_same_provider_retry``) and go straight
    to fallback.Fz_Auxiliary %s%s: timeout on the critical path; skipping same-provider retry and falling back: %sT)rƒ  r·  rŠ   r¯  )rà  r  rt  s      r%   Ú_should_retry_same_providerrá	  Ê  s:   € ô )¨Ô-ØÜ'¨¨cÔ2Ü�‰ð HØIMÈsÐTWô	YàØr'   rž  rÞ	  c                 óø   — | j                   dk(  r.d| j                  t        |j                  |j                  ¬«      fS | j                   dk(  r | j                  \  }}ddt        |||¬«      fS d| j                  |fS )zQResolve a ladder step into ``(kind, args, kwargs)`` for the sync/async performer.r@  rŒ  r™	  r•  r*   )rÞ  rô  rI  )ra	  r.   rÜ   rÞ  r÷  )re	  r=  rž  rÞ	  Úretry_providerr  s         r%   Ú_ladder_step_callrä	  ×  sy   € ð ‡y�y�FÒØ�t—y‘y¤$°×0EÑ0EÐPS×PeÑPeÔ"fÐfÐfØ‡y�yÐ)Ò)Ø&*§i¡iÑ#ˆ˜Ø˜œD ÀÐ`kÔlÐlÐlØ�t—y‘yÐ"2Ð2Ð2r'   c                óö   — t        | |j                  |j                  |||j                  |j                  |j
                  |j                  |j                  |j                  |j                  |d   |d   |¬«      S )zABuild the recovery-ladder generator for a failed primary request.rj  r×  )rŒ   r/   rà  r�   rZ	  rÞ  rô  rõ  rö  r÷  r"  rj  r×  r‰  )
r¹	  rŒ   r/   rZ	  rÞ  rô  rõ  rö  r÷  r"  )r	  r=  rž  rà  r�   r‰  s         r%   Ú_start_recovery_ladderræ	  ã  so   € ô
  Ø˜#Ÿ*™*¨S¯Z©Z¸dÈzØ—-‘-°3×3HÑ3HØ×)Ñ)¸S×=RÑ=RØ×-Ñ-À×AVÑAVØ—O‘O°¸\Ñ0JØ! .Ñ1¸jôJð Jr'   )rJ  r]  rA   r@   r×  rl  rj  rØ  r²  rè  rp  rö  r   rŸ  r	  r‰  c                óü  ‡ ‡‡‡‡‡‡ — t        ‰ fi dd“d|“d|“d|“d|“d|“d|“d	|“d
|“d|	“d|
“d|“d|“d|“d|“d|“Ž\  ŠŠ Š‰j                  ‰j                  ‰j                  cŠŠŠ|r`d‰d<   |r|‰d<   ‰ dk(  r6t	        ‰t
        «      r& ‰j                  j                  j                  d%i ‰¤ŽS t        ‰‰‰‰j                  ¬«      S dt        dt        fˆˆˆˆˆ fd„}	 	  |‰‰j                  ¬«      S # t        $ r³}t        ‰ |d«      s‚ t        «       }|}t!        d|dz   «      D ]€  }t#        t$        d|dz
  z  z  d«      }t&        j)                  d‰ xs d ||||«       t+        j,                  |«       	  |«       c cY d!}~S # t        $ r}t/        |«      s‚ |}Y d!}~Œzd!}~ww xY w |‚d!}~ww xY w# t        $ r:}d"t0        dt        fˆˆˆ ˆ fd#„}t3        t5        |‰‰ ‰ d|¬$«      |«      cY d!}~S d!}~ww xY w)&a¸  Centralized synchronous LLM call: resolve provider/model, auth, kwargs, fallbacks.
    task: aux task whose provider:model comes from config (ignored if provider set); api_mode
    overrides task config; timeout=None reads auxiliary.{task}.timeout; extra_headers override
    client defaults. stream=True returns the raw SDK stream (caller consumes/falls back)
    instead of a validated response. RuntimeError if no provider is configured.r�   FrJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   r‰  TrŸ  r	  rk  rŒ  Úvalidate_kwr!   c                  óZ   •— t        t        ‰‰‰‰j                  ˆˆˆˆfd„¬«      ‰fi | ¤ŽS )Nc           
      óf   •— t        ‰| ‰t        ‰‰j                  xs ‰j                  «      ¬«      S r…  )rš  rˆ  rZ	  rõ  )rœ  rŒ   r=  rY	  rà  s    €€€€r%   rß  z2_call_llm_impl.<locals>._primary.<locals>.<lambda>!  s1   ø€ Ô'<Ø˜G TÜ!:Ø(¨#¯-©-Ò*P¸3×;PÑ;Pó"Rô(€ r'   r•  )r
  r®  r÷  )rè	  rŒ   r/   r=  rY	  rà  s    €€€€€r%   Ú_primaryz _call_llm_impl.<locals>._primary  s>   ø€ ô &Ü"Ø˜Ð)9ÀC×DYÑDYöôð ñ

ð  ñ

ð 
	
r'   r×  rJ   rO  g       @g       @zoAuxiliary %s: transient transport error (attempt %d/%d); retrying same provider after %.1fs before fallback: %sr@  Nre	  c                 ó’   •— t        | ‰‰‰«      \  }}}|dk(  rt        t        |i |¤Ž‰«      S |dk(  rt        di |¤ŽS t	        |i |¤ŽS )Nr@  r•  r*   )rä	  r
  r®  r  r˜  )re	  ra	  r.   rJ  rÞ	  r=  rž  rà  s       €€€€r%   Ú_performz _call_llm_impl.<locals>._performB  s_   ø€ Ü.¨t°S¸,ÐHXÓY‰NˆD�$˜Ø�vŠ~Ü-Ô.DÀdÐ.QÈbÑ.QÐSWÓXÐXØ�wŠÜ0Ñ6°2Ñ6Ð6Ü0°$Ð=¸"Ñ=Ð=r'   ©rà  r�   r‰  r*   )rß	  rŒ   r/   rY	  r2   rJ  rH  r9  r.  rÀ  r÷  r   rZ	  r}   rá	  rˆ  Úranger�  Ú_TRANSIENT_RETRY_BACKOFF_BASErŠ   r¯  rû   Úsleeprƒ  r`	  rÂ	  ræ	  )!rà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  r   rŸ  r	  r‰  rë	  Útransient_errÚ_max_transient_retriesÚ_last_transientÚ_attemptÚ_backoffÚretry_transientr	  rí	  rÞ	  rŒ   r/   r=  rY	  rž  s!   `                          @@@@@@r%   rÓ	  rÓ	  ñ  sŽ  þ€ ô +9Øò+Ùð+Ù)1ð+Ù9>ð+ÙIQð+áð+á&2ð+á=Eð+ñ  ð+ñ -7ð+ñ ?Dð+ñ NUð+ñ ð	+ñ 1Að	+ñ
 $ð+ñ
 /7ð+ñ
 DNð+Ñ'€CˆÐ'ð (+§z¡z°3·:±:¸s×?SÑ?SÐ$€FˆFÐ$ñ ØˆˆxÑÙØ'5ˆFÐ#Ñ$ØÐ#Ò#¬
°6Ô;OÔ(Pð 2�6—;‘;×*Ñ*×1Ñ1Ñ;°FÑ;Ð;Ü! &¨&Ð;KÐVY×VkÑVkÔlÐlð
¤ð 
¬÷ 
ñ 
ð."ð	"ÙÐ%5ÀÇÁÔNÐNøÜò 	"Ü.¨t°]ÀBÔGØÜ%;Ó%=Ð"Ø+ˆOÜ! !Ð%;¸aÑ%?Ó@ò 6�ÜÔ<ÀÈÐSTÉÑ@UÑVÐX[Ó\�Ü—‘ð Uà šN F¨HÐ6LÈhÐXgôiô —
‘
˜8Ô$ð6Ù#›:×%øÜ ò 6Ü8¸ÔIØØ&5•Oûð6úð6ð "Ð!ûð#	"ûô$ ò 
ð	>œ;ð 	>¬3÷ 	>ð 	>ô Ü" 9¨c°<ÀdÐW\ÐisÔtØóõ 	ûð
úsm   Ã%C9 Ã9	F5ÄA8F0Å;F	ÆF0ÆF5ÆF8 Æ		F*ÆF%Æ F0Æ%F*Æ*F0Æ0F5Æ5F8 Æ8	G;Ç/G6Ç0G;Ç6G;c                 óÊ   — | �t        | t        «      r| S t        | t        «      rd| vr| S | j                  d«      xs g }nt	        | dd«      }|s| S |rt        |d   d«      S dS )zæPull a message (dict, object, or str) out of a response-or-message value: dict-shaped
    responses/bare messages (compression, proxies) and ChatCompletion objects; MagicMock
    ``reasoning_*`` attrs are deliberately not strings.Nr(  r   re  )r2   rK   rÜ   r|   rP   Ú_message_field)r€  r(  s     r%   Ú_coerce_llm_messagerú	  N  sp   € ð Ðœ: h´Ô4ØˆÜ�(œDÔ!Ø˜HÑ$ØˆOØ—,‘,˜yÓ)Ò/¨R‰ä˜( I¨tÓ4ˆÙØˆOÙ4;Œ>˜' !™* iÓ0ÐEÀÐEr'   c                 ó^   — t        | t        «      r| j                  |«      S t        | |d «      S r,   rÛ   )r  rD   s     r%   rù	  rù	  _  s'   € Ü& s¬DÔ1ˆ3�7‰7�4‹=ÐO´w¸sÀDÈ$Ó7OÐOr'   )Úmax_reasoning_charsrü	  c                ó  — t        | «      }|€yt        |t        «      r|j                  «       S t	        |d«      }t        |t        «      s|rt        |«      nd}|j                  «       }|rJt        j                  dd|t
        j                  t
        j                  z  ¬«      j                  «       }|r|S g }dD ]W  }t	        ||«      }|sŒt        |t        «      sŒ#|j                  «       sŒ4||vsŒ9|j                  |j                  «       «       ŒY t	        |d«      }	|	r¡t        |	t        «      r‘|	D ]Œ  }
t        |
t        «      sŒ|
j                  d«      xs$ |
j                  d«      xs |
j                  d	«      }|sŒN||vsŒS|j                  t        |t        «      r|j                  «       n
t        |«      «       ŒŽ |syd
j                  |«      }|�3t        |«      |kD  r%t        j!                  dt        |«      |«       |d| S |S )u›  Extract content from an LLM response, falling back to reasoning fields.
    Order: ``content`` (inline think blocks stripped) â†’ ``reasoning``/``reasoning_content`` â†’
    ``reasoning_details`` (OpenRouter array). Accepts a response or bare message;
    ``max_reasoning_chars`` bounds a reasoning fallback so unbounded chain-of-thought can't
    become the compaction summary. Returns ``""`` if nothing found.NrJ   rf  zz<(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>.*?</(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>)Úflags)rê  rD	  r0	  rñ  rê   z

z:fell back to reasoning fields (%d chars); truncating to %d)rú	  r2   rK   rS  rù	  r£  ÚsubÚDOTALLÚ
IGNORECASErz  r  rÜ   r|   r0  r3  rŠ   r‹   )r€  rü	  r  r?  rf  Úcleanedr/	  rF  rÝ   Údetailsr9	  rñ  rê   s                r%   Úextract_content_or_reasoningr
  c  sÓ  € ô ˜hÓ
'€CØ
€{ØÜ�#”sÔØ�y‰y‹{ÐÜ
˜˜iÓ
(€CÜ�cœ3ÔÙŒc�#Œh 2ˆØ�i‰i‹k€GÙä—&‘&ðLð �œrŸy™y¬2¯=©=Ñ8ô	
÷
 ‰%‹'ð 	ñ ØˆNà!#€OØ3ò 0ˆÜ˜S %Ó(ˆÚ”:˜c¤3Õ'¨C¯I©I­K¸CÀÒ<VØ×"Ñ" 3§9¡9£;Õ/ð0ô ˜SÐ"5Ó6€GÙ”:˜g¤tÔ,Øò 	jˆFÜ˜&¤$Õ'Ø Ÿ*™* YÓ/Ò^°6·:±:¸iÓ3HÒ^ÈFÏJÉJÐW]ÓL^�Ú˜w¨oÒ=Ø#×*Ñ*¼jÈÔRUÔ>V¨7¯=©=¬?Ô\_Ð`gÓ\hÕið		jñ
 ØØ�;‰;�Ó'€DØÐ&¬3¨t«9Ð7JÒ+JÜ�‰ÐSÜ˜4“yÐ"5ô	7àÐ(Ð(Ð)Ð)Ø€Kr'   )rJ  r]  rA   r@   r×  rl  rj  rØ  r²  rè  rp  r‰  c             ƒ   ób  K  — t        | «      }|�|j                  «       ƒ d{  –—†  	 t        |«      5  t        | |||||||||	|
|||¬«      ƒ d{  –—† cddd«       |�|j	                  «        S S 7 ŒN7 Œ"# 1 sw Y   nxY w	 |�|j	                  «        yy# |�|j	                  «        w w xY w­w)zERun an asynchronous auxiliary LLM request under the configured limit.N)rà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  r‰  )r}  rÑ	  rÙ  Ú_async_call_llm_implrÕ	  )rà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  r‰  r×	  s                  r%   Úasync_call_llmr
  “  sÚ   è ø€ ô -¨TÓ2€IØÐØ×ÑÓ!×!Ð!ð
 Ü  Ó.ñ 	Ü-Ø H°EÀHÐV]Ø)°HÈ+Ø%¨U¸GÐPZØ!1¸jô	÷ ÷	ð 	ð Ð Ø×ÑÕð !ð 	"øðø÷	ð 	úð 	ð Ð Ø×ÑÕð !øˆ9Ð Ø×ÑÕð !üsU   ‚!B/£A2¤B/©B ´A6ÁA4ÁA6Á	B ÁB/Á4A6Á6A?Á;B ÂB/ÂB,Â,B/c             ƒ   ó  ‡ ‡‡‡‡‡‡‡‡K  — t        ‰ fi dd“d|“d|“d|“d|“d|“d|“d	|“d
|“d|	“d|
“d|“d|“dd“dd“d|“Ž\  ŠŠŠ‰j                  ‰j                  ‰j                  cŠŠŠ	 t	        ‰‰j
                  xs ‰j                  «      Šdt        t        t        f   dt        fˆˆˆ fd„Šdt        dt        fˆˆˆˆˆˆ fd„}	  |‰‰j
                  ¬«      ƒ d{  –—† S 7 Œ# t        $ rC}t        ‰ |d«      s‚ t        j                  d‰ xs d|«        |«       ƒ d{  –—†7  cY d}~S d}~ww xY w# t        $ rC}dt        dt        fˆˆˆˆ fd„}t        t!        |‰‰‰ d|¬«      |«      ƒ d{  –—†7  cY d}~S d}~ww xY w­w)z‘Centralized asynchronous LLM call; see call_llm() for full documentation.
    No per-request header / api_mode override on the async entry point.r�   TrJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  rö  Nr   r‰  Ú_kwargsr!   c              “   ó>   •K  — t        ‰| ‰‰¬«      ƒ d {  –—† S 7 Œ­wr…  r±  )r	
  Ú_force_stream_asyncrŒ   rà  s    €€€r%   Ú_acreatez&_async_call_llm_impl.<locals>._acreateÂ  s   øè ø€ Ü/°¸ÀÐTgÔh×hÐhÐhús   ƒ–—rè	  c            	   ›   ój   •K  — t        t        ‰‰‰‰j                  ‰¬«      ƒ d {  –—† ‰fi | ¤ŽS 7 Œ
­w)Nr•  )r
  r¶  r÷  )rè	  r
  rŒ   r/   r=  rY	  rà  s    €€€€€€r%   rë	  z&_async_call_llm_impl.<locals>._primaryÅ  sH   øè ø€ Ü)Ü-Ø˜FÐ-=È×H]ÑH]Ø#ô%÷ %ð ñ	%ð $ñ	%ð %ð%ús   ƒ#3¦1§3r×  rž  zgAuxiliary %s (async): transient transport error; retrying once on the same provider before fallback: %sr@  re	  c              “   ó  •K  — t        | ‰	‰
‰«      \  }}}|dk(  rt        t        |i |¤Žƒ d {  –—† ‰«      S |dk(  rt        di |¤Žƒ d {  –—† S |\  }}}t	        ||xs d‰dk(  ¬«      \  }}t        |||fi |¤Žƒ d {  –—† S 7 ŒU7 Œ:7 Œ­w)Nr@  r•  rJ   r/  rR  r*   )rä	  r
  r¶  r  r  rŸ  )re	  ra	  r.   rJ  rL  rM  r8  r  rÞ	  r=  rž  rà  s           €€€€r%   rí	  z&_async_call_llm_impl.<locals>._performÕ  s¬   øè ø€ Ü.¨t°S¸,ÐHXÓY‰NˆD�$˜Ø�vŠ~Ü-Ô4KÈTÐ4XÐUWÑ4X×.XÐZ^Ó_Ð_Ø�wŠÜ7Ñ=¸"Ñ=×=Ð=Ø,0Ñ)ˆI�x Ü+¨I°x²~À2ÐRVÐZbÑRbÔd‰LˆI�qÜ7¸	À8ÈXÑ\ÐY[Ñ\×\Ð\ð /Yøà=øð ]ús3   ƒ+B
®B¯B
ÁBÁ3B
Á?BÂ B
ÂB
ÂB
rî	  )rß	  rŒ   r/   rY	  rˆ  rZ	  rõ  r   rK   r   r}   rá	  rŠ   r¯  r`	  rÄ	  ræ	  )rà  rJ  r]  rA   r@   r×  rÜ  rl  rj  rØ  r²  rè  rp  r‰  rë	  rò	  r	  rí	  r
  r
  rÞ	  rŒ   r/   r=  rY	  rž  s   `                 @@@@@@@@r%   r
  r
  ¬  sö  ÿøè ø€ ô +9Øò+Ùð+Ù(0ð+Ù8=ð+ÙHPð+áð+á&2ð+á=Eð+ñ  ð+ñ -7ð+ñ ?Dð+ñ NUð+ñ ð	+ñ 1Að	+ñ
 ð+ñ
 &*ð+ñ
 7Að+Ñ'€CˆÐ'ð (+§z¡z°3·:±:¸s×?SÑ?SÐ$€FˆFÐ$ð#ô 8Ð8HÈ#Ï-É-ÒJpÐ[^×[pÑ[pÓqÐð	i¤D¬¬c¨¡Nð 	i´s÷ 	ið	%¬#ð 	%´#÷ 	%ò 	%ð	$Ù!Ð+;ÀcÇmÁmÔT×TÐTÐTùÜò 	$ä.¨t°]ÀJÔOØÜ�K‰Kð HØIMÊÐQWÐYfôhá!›×#Ð#Õ#ûð	$ûô ò ð	]¤ð 	]´÷ 	]ð 	]ô )Ü" 9¨c°<ÀdÐW[ÐhrÔsØó÷ ð õ 	ûðüs‘   ‹A$F	Á0AD: ÃC+ Ã$C)Ã%C+ Ã(F	Ã)C+ Ã+	D7Ã43D2Ä'D*Ä(D2Ä,D7Ä-D: Ä1F	Ä2D7Ä7D: Ä:	FÅ3FÅ6E9Å7FÅ;FÅ<F	ÆFÆF	)ÚPathc          	      óP   — t        | xs d«      \  }}}}}t        ||d||||¬«      S )a  Return (async_client, model_slug) for async consumers.

    For standard providers returns (AsyncOpenAI, model). For Codex returns
    (AsyncCodexAuxiliaryClient, model) which wraps the Responses API.
    Returns (None, None) when no provider is available.
    NTrÇ  rš  rœ  s          r%   Úget_async_text_auxiliary_clientr
  ì  sC   € ô 4PÐPTÒP\ÐX\Ó3]Ñ0€Hˆe�X˜w¨Ü"ØØØØ"Ø ØØ!ôð r'   )TNNr›   r,   rò  r¿  r‡  )Nr   )Nrƒ  NrJ   NrI   )rƒ  N)rJ   rƒ  )	NFFNNNNFN)NFNNNNFN)NNNNN)	NNNrC  NNNNNrâ  (=  r;   rC  r!  r  rÉ  r  rµ  r(  r  r£  r¹   rû   rs  Útypesr   Útypingr   r   r   r   r   r	   r
   r   r   rù  r   r   r   Úagent.error_classifierr   r   r   r   r   r×  r   r   r‡  r   Úagent.codex_headersr   r  r   r’   r   r  r   r  r+  r   r,  r   r#   r   r    rá   rI  r&   r)   rÃ   rQ   r>   rO   rR   ÚcontextmanagerrU   r  rV   rv  rW   rX   r{   rY   Úhermes_cli.config_providersrZ   Úagent.auxiliary_healthr[   r\   r]   r^   Úagent.auxiliary_unavailabler_   r`   ra   rb   rc   rQ  rd   re   Úutilsrf   rg   rh   ri   rj   rk   rl   Ú	getLoggerr8   rŠ   r  rm   rn   ro   rp   rK   r   r‰   r�   r”   rŸ   r  r–   r    r¥   r­   r¢   r£   rµ   rÊ   rÏ   rÒ   r  rÇ   rË   rÐ   rÓ   rÕ   r×   rÞ   r÷   r  rŒ  r  r  r  r  r  rÜ   r)  r-  r1  r:  rî  rB  r?  rI  r[  rW  r\  rc  ri  rk  rŽ  r�  rw  ru  r{  r€  r�  r‰  r‹  r�  r“  r¡  r™  r¤  rÉ  rÓ  rÏ  rÝ  Ú	frozensetrß  ræ  rè  rì  rí  r  rú  r  r  r  rI  r  Ú_HERMES_VERSIONÚ_AI_GATEWAY_HEADERSrÍ  r  r  r  r  r  r=  r³  r'  r   r!  r"  r*  r+  r,  r5  r:  r>  rD  rH  rO  rS  rU  r  r\  ra  r€  r„  r†  rÊ  r6  r<  rD  Ú!_AsyncAnthropicCompletionsAdapterrJ  rN  r[  r]  rƒ  r‰  r‹  r–  r�  rŸ  r§  r»  rÃ  rÍ  rØ  rÖ  rå  rï  r  r  r   r  r  r  r  r-  r'  r@  rE  rM  rÒ	  r[  rW  r`  r_  rY  r\  rb  rc  rd  re  rf  rg  rh  Ú
ContextVarrj  rl  rx  r‚  r…  rˆ  r‹  r”  r®  r¶  rÀ  rÂ  rº   rÅ  rÇ  rÍ  r  ÚTokenrÔ  rÖ  rÙ  rÛ  rí  rð  rü  r   r  r  r  r  r#  rü  rÌ  r+  rý  r0  r:  r2  r3  r4  r6  r8  rA  ÚWARNINGr&  rû  rC  rF  rK  rZ  r}   r]  rc  rq  rr  rn  rt  ry  r�  rƒ  r‡  rð	  rˆ  rŽ  r’  r›  r   r¢  r¤  r¨  r­  r±  r³  r¶  r·  r¼  r°  rÐ  rÔ  rà  r5  rÝ  rç  ró  r  r  r  r  r  r  r  r  r'  r)  r-  r/  r2  r7  r>  rB  rD  rF  rH  rK  rP  rT  rZ  rk  rr  rz  r~  r˜  rŸ  r´  rª  rË  rÍ  rÐ  r×  rß  rã  rÕ  rÚ  rë  rñ  rô  rû  r©  rþ  r  rÿ  r  r   r$  r1  r5  r7  Ú_ResolveResultrÓ  r<  rA  rO  rK  rS  rV  r[  r^  rb  rf  rh  ro  rr  rx  rz  r}  r‡  rŒ  r“  r”  rÆ  r�  r´  rÅ  r¤  r§  r¯  r²  r·  r»  rÃ  rÅ  rÈ  rý  rÌ  rÐ  rº  r¹  r*  rÓ  rÞ  ræ  rê  rð  rù  r  r	  r  rî  r   r#  r(  rþ  r6  r<  r›  Ú_DEFAULT_AUX_TIMEOUTrf  rä  rL  rT  r\  r^  re  rb  rd  rh  rl  rm  ry  rn  ru  rq  rv  rz  r}  r  rƒ  r  rŒ  r  r§  r�  r£  r¤  r²  r¯  r°  r´  r¸  rº  rÀ  rÇ  rÒ  r   r
  rã  rv  rá  rï  rô  rõ  rŽ  rø  rü  rù  r 	  r³  rˆ  Úcompiler
  r		  r	  r	  r	  rš  r	  r	  r"	  r	  r:	  r%	  rM	  rO	  rQ	  r²  rS	  rW	  rX	  r^	  r`	  rd	  rh	  rk	  rm	  rn	  rr	  rt	  rz	  r~	  rŠ	  rŽ	  r—	  r 	  r¨	  r·	  r¹	  rÂ	  rÄ	  rÇ	  rÊ	  rÛ	  rÔ	  rß	  rá	  rä	  ræ	  rÓ	  rú	  rù	  r
  r
  r
  Úpathlibr
  r   ÚNOUS_EXTRA_BODYr
  r*   r'   r%   ú<module>r(
     s”E  ðòó Û Û Û Û Û Û Û 	Û 	Û Û Û Ý !ß _× _Õ _ß 7Ñ 7÷õ ÷ [Ý R÷ó õ 9Ý Hñ
 Ýà$(Ð �8˜D‘>Ó (ð˜$ó ÷,ñ ,ñ 
‹€ð #�9—?‘?Ó$Ð ÷6ñ 6ð$<˜4ó <ð ×Ññ'ó ð'õ ,ß QÝ -Ý ;÷ó ÷Dõ D÷ B÷ f÷  fñ  fà	ˆ×	Ñ	˜8Ó	$€ñ
 &)£UÐ ˜sÓ *Ù'*£uÐ  Ó ,Ù(+«Ð   #Ó -Ù&)£eÐ  Ó +ð
 (¨3¡-ð 
°Có 
ð !&Ð ð OTò A¨°#©ð AÀtð AÐX\Ð]`ÐbeÐ]eÑXfó Að*@ cð @°Sð @ÀCð @ÈCó @ð8 ,˜IŸO™OÓ-Ð ôK Mô KðE $ó EðQ¨ó Qð ×ÑòC Tò Có ðCð&. 8¨H°R¸°WÑ,=Ñ#>ó .ð°¸"¸c¸'Ñ1Bð Àtó ÷0ñ 0ð6  �	—‘Ó!€Ø�	—‘Ó!€Ø(˜Ÿ™Ó*Ð ð '�y—‘Ó(Ð ðA�i—o‘oð A¨cð A°dó Aô*ô
*ô
<ôð<˜dó <ò+�ð +˜#ð +¨ð +°só +ð	¨ð 	°ó 	ð¨(°C°5¸$°;Ñ*?ó ð0 +/Ð 'ð ×Ñð )§/¡/ò ó ðð ×Ññó ðð8 h¨u¡oó 8ð
 ×Ñð. (¨5¡/ò .ó ð.ð*;%°¸$¸sÀC¸x¹.Ð9IÈ3Ð9NÑ0Oð ;%ÐY]Ð^aÐcfÐ^fÑYgð ;%Ðloó ;%ð| ð ¨Cð °Dó ð˜#ð ¨3ð °4ó ð 3ó ð Ð ð  °hØ¨ñÐ ð
 *.€ˆh�t˜C ˜H‘~Ñ&Ó -ð˜t C¨ H™~ó ð"? h¨s¡mð ?¸ó ?ñ( "›8Ð �&Ó #ð<�x ‘}ð <¨ó <ð
6˜( 3™-ð 6¨Dó 6ð: h¨s¡mð :¸ó :ð +/Ð 'à$(Ð !ò` H¨S¡Mð `¸XÀc¹]ð `ÐVZó `ð*^ 8¨C¡=ð ^¸HÀS¹Mð ^ÈhÐWZÉmó ^ò
M˜8 C™=ð M°H¸S±Mð MÈTó Mð
^¨x¸©}ð ^Àó ^ñ %(£EÐ ˜cÓ )ðrØ�s‰mðrØ'/°¡}ðrØGKÈCÐQTÈHÁ~ðrØ^kðrà	órð UYò>Ø�C‰=ð>Ø$,¨S¡Mð>ØDLÈSÁMð>àó>ð& 59ñà(,òØ�C‰=ðØ$,¨S¡Mðà!%ðð ˆe�_óð(Ð �eó ðÐ �Uó ð^ ð ^¨ó ^ð;¨#ð ;°#ó ;ð~ JOò !¨Sð !À$ð !ÐSVó !ðN !¨ÐI`ØÐ3JØ1Ð@[Ø)Ð;KÐ\cØ)Ð;PØ%¸Mñ9Ð % t¨C°¨H¡~ó ð 0UÐ ˜d 3¨ 8™nÓ Tñ  )Ð*<Ð)=Ó>Ð �9Ó >ðR 8¨C¡=ð R°Tó Rð 6AÈÑ*YÐ ˜˜c 3˜h™Ó Yð¨sð °xÀ±}ó ñ  (1°-ÐAQÐ1RÓ'SÐ ˜9Ó Sð <ØØ7ñÐ ð¨°©ð ¸À¹ó ò(  t¡ð °tó ð< 7¸ÐFÐ ð} s¨T¡zð }°dó }õ 6ð <ØØ  Ð 1Ð2ñÐ õ Dð)˜$ó )ð  Ð �4Ó ð
 =Ð Ø'€ØDÐ Ø9Ð Ù!Ó# kÑ1€Ø+Ð òbð )WÐ %Ø(9Ð %ðZ¨ð Z°ó Zð #ð ¨#ó ò<=¨#ð =°Sð =À(È3Á-ó =ð	 ð 	¨¨t°X¸c±]Ð/BÑ)Có 	ò˜sð ¨#ð ¸À#¹ó ð," ð "¨ó "ò. #ð .°ð .¸có .ñ" (Ð)<Ð(=Ó>Ð ð sð ¨tó ð  3ó ð+˜#ð + #ó +ð - sð -¨u°T¸#±YÀÀSÁ	È3Ð5NÑ/Oó -ð>Q˜3ð Q¨h°s©mð QÀó Q÷YTñ YT÷x^Kñ ^K÷B#ñ #÷Dñ D÷:ñ :ð( %=Ð !÷
"ñ 
"ô	Ð 9ô 	ðH¸4ÀÀSÀ¹>ð HÐ\_ð HÐdhó H÷,pKñ pK÷fñ ô	Ð$=ô 	÷&ñ &÷Rñ ô	Ð";ô 	ðk°#ð k¸$ó kð  Y]ò+[Øð+[Øð+[Ø*-ð+[Ø9<ð+[ØHPÐQTÉð+[àó+[ð\˜ $™ó ðD	˜Dð 	 Só 	ð =Bò #°Tð #ÀhÈuÐUXÐZ]ÐU]ÉÑF_ó #ðN #ÈòØðØ8@À¹ðàˆe�C˜�H‰oÑóð2�t˜C ˜H‘~ð ¨(°5¸¸c¸±?Ñ*Có ð  H¨U°3¸°8©_Ñ$=ó  ðF (¨3¡-ó ð:I 5¨°&Ñ)9¸8ÀC¹=Ð)HÑ#Ió IðZ 8=È%ò@Øð@Ø ð@Ø04ð@ØCGð@àˆd�^ó@ð0	 sð 	¨x¸©~ó 	ñ ›Ð �3Ó ðM˜( 3™-ð M¨Dó Mð
( %¨¨c¨	Ñ"2ó 
(ð	 ð 	¨ó 	ò  h¨u°S¸(À2ÀsÀ7Ñ:KÐ5KÑ/LÑ&Mð  Ð]`ð  ÐlqÐrzð  |Bñ  sCð  EMð  NQñ  ERð  sRñ  mSó  òF4¨Cð 4¸3ó 4ò(DL�dð DL u¨X°fÑ-=¸xÈ¹}Ð-LÑ'Mó DLðNI¨tð IÀ(È3Á-ð IÐT\Ð]`ÑTaó Ið" CHô ˜Cñ ¨dñ ¸4ð ÈCô ð4 %�9×$Ò$Ð%5°wÈÕNÐ Ø'�i×'Ò'Ð(8¸*ÈtÐ[_Õ`Ð Ø&�Y×&Ò&Ð'7¸ÈUÕSÐ Ø'�i×'Ò'Ð(8¸*ÈuÕUÐ ñ¨°#©ð ¸5ÀÈ#ÁÐPXÐY\ÑP]ÐA]Ñ;^õ ð& #õ ñ °#ð  ¸#õ  ð !Ñ ˜Ô  ØÑ �SÔ Ø Ñ ˜Ô  ØÑ �sÔ Ø Ñ ˜Ô  Ø!Ñ ˜Ô !à€K×ÒÑ3¸TÕBñ �{×-Ò-¨h°t¸CÀ¸H±~Ñ.FÑGô ð
 €K×ÒÑ1¸4Õ@ñ ˜×/Ò/°¸¸cÀ3¸h¹Ñ0HÑIô ð
 ×Ññ- ð -¨tó -ó ñ-ô*ôð>¨¨t©ð >¸CÀ$¹Jð >ÐRUÐX\ÑR\ð >Ðaeõ >ñ1Ø˜˜c 3˜h™Ñ(ð1Ø4<¸S±Mð1ØJRÐSVÉ-ð1à	õ1ð #¸4óØ�t‘ðØ.1°D©jðà
ˆ3��T˜#˜s˜(‘^Ð#Ñ$ tÑ+õð( DHØÐRVôØðØ˜c 3˜h™ðØ69¸D±jðà�D‰jñà)1°4¸¸S¸±>Ð2BÀCÐ2GÑ)HÈ4Ñ)Oðð 	õð> DHØÐRVôØðØ˜c 3˜h™ðØ69¸D±jðà�D‰jñà)1°4¸¸S¸±>Ð2BÀCÐ2GÑ)HÈ4Ñ)Oðð 	õð6 DHÐ`dôØðØ˜c 3˜h™ðØ69¸D±jðØSVÐY]ÑS]ðàõñ4 2JÑ ˜u S©# X™Ô IØ*˜IŸNšNÓ,Ñ ñ6¨%°±S°©/ð 6¸dõ 6ð3˜h t¨C°¨H¡~Ñ6õ 3ñK˜sð K sõ Kð =?ÐPRØ r¸BÐRTØóØðØñØ69ðØJMðàðà!$ñà69ñàLOñð ðð ×Òõ	ñ@˜k×/Ò/ð °Dõ ð ×Ññ+ h¨t°C¸°H©~Ñ&>ó +ó ñ+ö<ð$8  x°¡}°h¸s±mÀXÈcÁ]Ð'RÑ!Sõ $8ðN #õ ö
ð& ð ¨õ ð"#g˜e H¨S¡M°8¸C±=Ð$@ÑAõ #gðL; sð ;¨u°X¸c±]ÀHÈSÁMÐ5QÑ/Rõ ;ð.@ #õ @ð;˜sð ; u¨X°c©]¸HÀS¹MÐ-IÑ'Jõ ;ð< #ÀdØ'+Àtó6Ø�s‰mð6Ø6>¸s±mñ6à ‘}ð6à7?À±}ð6ð ˆ8�C‰=˜( 3™-Ð'Ñ(õ6òr'c X¨e°C¸À"ÀcÀ'Ñ9JÐ4JÑ.KÑ%Lð 'cÐX]Ð^fÐgjÑ^kÐmuÐvyÑmzÐ^zÑX{õ 'cñT ]Ñ Ù3ñ 7ñ  Ñ ñ
¨(°4¸¸S¸±>Ñ*Bð ÀtÈCÐQTÈHÁ~õ ð6˜T %™[õ ñ !Ñ Ø)+Ñ �d˜3 ˜:Ñ&Ô +Ø-/Ñ ˜$˜s E˜zÑ*Ô /Ø(*Ñ �t˜C ˜H‘~Ô *ñ ©¹.Ù"±NÉ^ò Ñ ð2 Sð 2¨Sõ 2ñ !9Ñ ð +/ñØMQÙ/¸g¿oºoóØñØ  ™ðØ=EÀc¹]ñàñà8;ðð 
õò. #ð °¸#±ð È$õ ð" '+ñ
ØIMó
Øð
Ø˜s‘mð
Ø9AÀ#¹ð
à	õ
ö "ñ-˜ñ - e¨C±¨H¡oð -¸$õ -ð &ñ )ñ Ñ ñ™9ð ¨õ ð°Dõ ñÑ ñ Ñ ñA™ið A¨Dõ Añx™ið x¨Dõ xñ
N™9ð 
N¨õ 
Nñ™ið ¨Dõ ñ"N¡yð N°Tõ Nñ Ñ Ù #Ñ ð* õ *ñ	`™	ð 	` dõ 	`ñ\©ñ \¸3ð \À4õ \ñ|©ð |°tõ |ð4-¨dð -°xÀ±~õ -ñ 	2¡yð 	2°Tõ 	2ñ5©)ð 5¸õ 5ð- dð -¨x¸©~õ -ñ&¡9ð °õ ñ(¡ið °Dõ ñ0j©	ð j°dõ jñ $Ó$QÓRÑ ðp¨8°C©=ñ p¹yð pÈTõ pð) Cð )¨Dõ )ð$¨#ð °$õ ò$ #ð ¨cð ¸Sõ ð6 QUó /˜sñ /°X¸dÀ3ÈÀ8¹nÑ5Mð /ÐY\õ /ñ6Ñ ñ
"Ñ ð ñ ¨U°5¸¸c¸±?ÁCÐ3GÑ-Hð ÈXÐVYÉ]õ ð SWó,Øñ,Ø$'ñ,Ø7?ÀÀSÈ#ÀXÁÑ7Oð,àˆc�]õ,ð^ TVó & Sñ &©yñ &ÈSð &ÐZ^õ &ð` /3ó)&Ø�c‰]ñ)&Ø/2ñ)&ØDLÈSÁMñ)&à ‘}ñ)&à8@À¹ñ)&ð   ‘}ñ)&ð 5=¸TÀ#ÀsÀ(¹^Ñ4Lñ)&ð ˜#‘ñ	)&ñ +/ñ	)&ð >FÀe¹_ñ	)&ð
 ˜‘ñ)&ð
 '/©t¡nñ)&ð
 JOñ)&ð ñ)&ð 3;¸4±.ð)&ð OSñ)&ð ˜D  c ™NÑ+ð)&ð ˆ3��S˜#�X‘ÐÑõ)&ñX°Cñ ÈHÐUXÉMð ÐaiÐjmÑanð Ð{~õ ñ¸3ñ ÐS[Ð\_ÑS`ð ÐhpÐqtÑhuð ð  CFõ ð=˜t C¨ H™~ð =°$õ =ð dõ ðV Dõ Vð
 4õ ó°3ð Àõ ð	Z¨õ 	Zðm Tõ mñ ,Ñ=WÙ%Ñ4RÙ/Ñ;Vò:Ñ ˜˜S (©3°¨9Ñ"5Ð5Ñ6ô ð KMó ¨Cñ ÀCð ÐQUõ ð" WYó'Ø ‘}ñ'Ø7:ñ'ØPSð'àõ'ð 6 ¨¡ñ 6¸ð 6ÀÈ$ÈsÐTWÈxÉ.ÑAYõ 6ñ  #ð ¨(°5©/õ ð
M (¨3¡-ñ 
M¸3ð 
MÀ8ÈEÁ?õ 
MðI¨ð I°õ Iö˜:õ ðEØðEØ ðEØ,4°S©MðEØBJÈ3Á-ðEáõEð OØ��S�‰>ñOØ&)ñOØ5=¸c±]ðOáõOðØ
�3‰-ñØ$'ñØ3;¸C±=ñØLOðáõñ
Ùñ
Ø#¡D™>ñ
Ù;Oð
à
‰4‘ˆ:Ñõ
ñÙ%ðØ08¸±ñÙIMñà‘D‰>ñà(0°©ñàEMÈcÁ]ñð ñð 59ñð MUÐUYÉNñð ñ	ð (,ñ	ð ?Cð	ð
 
ˆ#ˆsˆ(�^õñ.!RØñ!RØ& s™mñ!RØ7:ð!RØEMÈcÁ]ñ!Ràñ!Rà/3ð!Rð Ñ  c¨3 h¡°¸3ÀÀXÈcÁ]Ð:SÐUYÐZ]Ð_bÐZbÑUcÐ:cÑ1dÐdÑeõ!RðL  2¸tó?Ø
�3‰-ñ?Ø#&ñ?Ø58ñ?ÙBKð?àñ?à ñ?à/7¸©}ð?ð 
õ?ð& ô	Ù%ñà�s˜C ¨#¡Ð/°Ñ7KÈTÐRUÐWZÐRZÉ^Ð7[Ñ1\Ð\Ñ]ðð ñð ð	ð
 ˆ3�˜˜s D¨¨c¨¡NÑ4HÐHÑIÑJÐJÑKõñ*>Øñ>Ø& s™mñ>Ø7:ð>ØEMÈcÁ]ñ>Ù^bñ>à˜%‘ñ>à.6°s©mñ>àDLÉTÁNñ>ð ñ>ð 59ñ>ð MUÐUYÉNð>ð ˆc�]õ	>ñB0Øñ0Ø& s™mñ0Ø7:ð0ØEMÈcÁ]ñ0Ù^bñ0à˜%‘ñ0à.6°s©mñ0àDLÉTÁNñ0ð ñ0ð 59ñ0ð MUÐUYÉNð0ð ˆc�]õ	0ðh ;Jñ$à°DÐcgô$Øð$Ø #ñ$Ø47ñ$àñ$à.1ñ$àHPÐQUÐVYÐ[^ÐV^ÑQ_ÑH`ð$ð ˆ8�C‰=˜( 3™-¨Ð,Ñ-õ$ðP RTØôØñØ(0°©ñØKNñàðð ‰c�4ˆiÑõð* ;BØX\ó)7Øð)7Ø #ñ)7Ø47ñ)7à˜3‘-ñ)7à9<ñ)7àRUð)7ð ˆ8�C‰=˜( 3™-¨Ð,Ñ-õ)7ðvE x°¡}ð E¸À#¹õ Eò
	=¨ð 	=°Cð 	=À3ð 	=ÐVYð 	=ÐckÐloÑcpõ 	=ð 9>ó>Ø��S�‰>ð>Ø%(ð>Ø14ñ>Ø?GÈ¹}ð>à
�3‰-ð>à #ñ>à15ð>ð ˆc�]õ>ð* [_ñ1à°Dó1Ø
ñ1Ø #ñ1Ø-0ñ1ØJRÐSVÉ-ñ1àñ1à.1ð1ð ˆ8�C‰=˜( 3™-¨Ð,Ñ-õ1ðhYØ
�3‰-ñYØ*-ðYà
ˆ8�C‰=˜( 3™-¨Ð,Ñ-õYð( 4¨¨S¨¡>ð (°h¸s±mõ (ð" 4¨¨S¨¡>ð "°e¸HÀS¹MÈ8ÐTWÉ=Ð<XÑ6Yõ "ð$ CJñ7à"&¸rÐX\ó7Ø
�3‰-ñ7Ø*-ñ7Ø<?ñ7à˜3‘-ñ7à9<ñ7àRUð7ð ˆ8�C‰=˜( 3™-¨Ð,Ñ-õ7ñt&°#ð &¸$õ &ñ&Z  S¨# X¡ð Z°h¸s±mð ZÈÈcÐSVÐX[Ð]`ÐbeÐNeÑHfõ Zñ4-=Øñ-=Ø$'ñ-=Ø;>ñ-=ØQTñ-=Øhkð-=àˆe�C˜˜c�MÑ"Ñ#õ-=ó`¨Cð °xÀ±}ð ÐPTõ ð˜e H¨VÑ$4°h¸s±mÀSÐ$HÑIõ ð2 JNó"Ø˜4  S ™>Ñ*ð"Ø9AÀ#¹ð"à
ˆ8�FÑ˜X c™]¨CÐ/Ñ0õ"ñ<¨3ð ¸#ð À#õ ò-.¨ð -.¸õ -.ñ`¨(°3©-ð À3ð È8ÐTWÉ=õ ñ+¨¨S°#¨X©ð +À#ñ +ÐTWð +Ð\_õ +ðB, Cð ,°¸±ñ ,ÈTð ,ÐV[Ð\dÐehÑ\iÐksÐtwÑkxÐ\xÑVyõ ,ð^ 3ð ¨x¸©}ð ÀÀxÐPSÁ}ÐV^Ð_bÑVcÐGcÑAdõ ö4�jõ ð �x ‘} h¨s¡mÐ3Ñ4�ñ7˜Cð 7 E¨#¨x¸¸C¸Ñ/@Ð*@Ñ$Aõ 7ñ!˜#ð ! Cñ !¨cñ !¸#ð !À$õ !ñ¡Oð ¸sð Àtõ ð& @Bó&c™ð &c°cñ &cÈCñ &cØ"%ñ&cØ9<õ&cðRn¨cð n°h¸s±mõ nñ'‘ð '°Cñ 'È(ÐSVÉ-ð 'Ñ\jõ 'ñe™ñ e°ð e¸xÈ¹}ñ eÐ_bñ eÐknð eñ  tBõ eñ'™oð '±.õ 'ñ,e¡Oð e¹õ eñ3™oð 3±.õ 3ñ(>¡oð >¹.õ >ñ.n¡?ð n±~õ nñE¡ð E±Nõ EóPU°#ñ UÀ3ñ UÐW_Ð`dÐehÐjmÐemÑ`nÑWoõ UñK3¡oð K3¸(Á>Ñ:Rõ K3ñ\\¡ð \¹>õ \ð¨sñ ÀSð ÈSÐSWÉZõ ñ0;3¡ñ ;3¸3ñ ;3Èxð ;3Ñ\jõ ;3ñ|%©/ð %À$ÀsÈCÀxÁ.ð %ÑUcõ %ñP%[¡/ð %[±nõ %[ñV !Ù,Ù Ù0Ù*Ù$òWÑ ˜T # x±Ð0AÁ>Ð0QÑ'RÐ"RÑSô ð SXØ_cØ[`Øò	O)ØðO)ØðO)Ø26ñO)ØKOñO)àðO)à5=¸eÀCÈÐRTÐVYÐRYÑIZÐDZÑ>[Ñ5\ðO)ð ñO)ð )1°°c¸3°h±Ñ(@ðO)ð UYðO)ð �3‰-ð	O)ð
 ˆ8�C‰=˜( 3™-Ð'Ñ(õO)ñhÐZ^ó  Cñ ¸xÈÈSÐRUÈXÉÑ?Wð ÐchÐiqÐrxÑiyð  |Dð  EHñ  |Ið  jIñ  dJõ ñ BÑ ð8¨#ð 8°h¸s±mð 8Èõ 8ð-¨°#©ð -¸3õ -ðN¨H°S©Mð N¸eÀHÈSÁMÐS[Ð\_ÑS`ÐD`Ñ>aõ Nò WÚ<ÚPÚ`Ú/Ù1Ú2òfÑ ˜˜c 8¨X°c©]¨O¸UÀ8ÈCÁ=ÐRZÐ[^ÑR_ÐC_Ñ=`Ð,`Ñ#aÐaÑbô òC¨Sð C¸À#¹ð CÐRWÐX`ÐadÑXeÐgoÐpsÑgtÐXtÑRuõ Cð
 t¨C¡yõ ñ(7Øñ7Ø),ñ7Ø=EÀc¹]ñ7à˜S‘Mð7à/3ð7ð ˆ8�C‰=˜( 3™-¨°#©Ð6Ñ7õ7ñ-1Øñ-1Ø$'ñ-1Ø26°s¸C°x±.ñ-1ØRZÐ[^ÑR_ñ-1à ‘}ð-1ð ˆ8�C‰=˜( 3™-Ð'Ñ(õ-1ñ`Ø�#�s�(‰^ñØ-5°c©]ñØOWÐX[É}ðàðð ˆ8�C‰=˜( 3™-¨°#©Ð6Ñ7õñ> cÑ ð <@ñ)LØ^bØ!°eØ-1ó)LØ�s‰mð)LØ+3°C©=ð)LØNVÐWZÉmð)Là�c‰]ð)Là/3ñ)Lð ˜4  S ™>Ñ*ð)Lð ˆ8�C‰=˜( 3™-¨°#©Ð6Ñ7õ	)LðX; $õ ;ð
 FJô 
! cð 
!°X¸c±]ð 
!Èdõ 
!ð* %'�ˆt�E˜5�LÑ!Ô &Ø#�Y—^’^Ó%Ñ ÙÑ ÷$ô $ñ$¨ñ °Cð ¸Cõ ð CGØ!¸TØ-1ÀUØ°tó	ZØðZØ"&ðZØ2:¸3±-ðZà�c‰]ðZà-5°c©]ñZð ˜4  S ™>Ñ*ðZð ?CðZð �3‰-ð	Zð (0°¡}ð	Zð
 õZð(˜Sõ ð lpô G Eñ G°3ñ GÀxÐPSÁ}ñ GÐehð GÐtxõ Gð _cØ!¸TØ-1ÀUØ"&ÀTô	$Øð$Ø#+¨C¡=ð$Ø>Bð$ØNVÐWZÉmð$à�c‰]ð$à-5°c©]ñ$ð ˜4  S ™>Ñ*ð$ð ?Cñ$ð ˜3‘-ñ	$ð 6>¸c±]ð	$ð
 ˆ8�C‰=˜( 3™-Ð'Ñ(õ$öNñ. Sð .¨Tõ .ñ)¨ñ )°Sð )¸Tõ )ð> >Cô % ñ %°dð %Àtõ %ö4>ö*7ñ
#˜#ð 
# h¨s¡mñ 
#ÀXÈcÁ]ð 
#ÐW_Ð`cÑWdõ 
#ð QUØX\Ø37ò@?Øð@?Øð@?Ø26ð@?ØJMð@?àð@?à#&ñ@?à=EÀdÈ3ÐPSÈ8ÁnÑ=Uð@?ð ð@?ð $,¨C¡=ð@?ð ˆ8�C‰=˜( 3™-Ð'Ñ(õ	@?ñV˜sñ ¨°#©ð ¸5ÀÀhÈsÁmÐASÑ;Tõ ñ
¨8°C©=ð 
¸Tõ 
ð" Z^Ø!òJAØ
ðJAØ #ðJAØ36ðJAØIQÐRUÉðJAà�c‰]ðJAð ˆ3�˜‘˜x¨™}¨h°s©m¸XÀc¹]ÐJÑKõJAñZ Ñ ñ &+Ñ "ð Sð ¨T°#°s°(©^õ ö6/˜*õ /ñ* T¨#¨s¨(¡^ð *¸¸cÀ3È¸nÑ8Mõ *ð _cØ%)ÐTXô,Øñ,Ø(0°©ñ,ØNVÐWZÉmñ,à˜c‘]ñ,à9AÀ$ÀsÈCÀxÁ.Ñ9Qð,ñ õ,ñ$`°°c¸3°h±ð `ÀDõ `ðØ
�‰*ñØ*-ñØ=@À4¹Zñà˜d™
ñà58¸4±ZñàOSÐTWÐY\ÐT\É~ñð ˜C ˜H‘~ñð 47¸±:ñð LPÐPSÐUXÐPXÉ>ðð ˆ3�‰:�t˜C ˜H‘~Ð%Ñ&õ	ð(¨ð °¸±õ ñ0 3Gñ ˜Cð ¨%ð È5õ ðf ñ f¨x¸©ð fÀ5õ fð˜sð  t¨C°¨H¡~õ ðL WYÑ �d˜5  c ™?¨E°#°y×7QÒ7QÐ2QÑ,RÐRÑSÔ XØEGÑ �t˜E # s¨C -Ñ0°%¸¸S¸±/ÐAÑBÔ GØ�	—’Ó �ð	( H¨S¡Mð 	(°h¸s±mõ 	(ñ˜Tð ¨ñ °Cñ À(ÈCÈ5ÐRUÈ:ÑBVð Ð[^õ ðq h¨s¡mð q¸À×A[ÒA[Ñ8\õ qðs x°¡}õ sö&ñ (Ó(RÓSÑ ð_¨Cð _¸3ð _À4õ _ñ )?ÑMcÒdÑ ñ±$ð ¹4õ ó>Ñ ñ¨cð °dõ ñ !Ó!HÓIÑ ñ8¨#ð 8°cð 8¸dõ 8ó UÑ Û YÑ ñ
¨3ñ 
Àð 
Èõ 
ð 3ñ °sð À3ñ ÐX[ð ÐckÐloÑcpð Ðuyõ ñ,™dð ¨cð ¸#ð Á$õ ö ˜õ  ñ8¨cð 8°dõ 8ð%bØñ%bØ"%ð%bØ.1ñ%bØCFñ%bØZbÐcgÑZhð%báõ%bñP1Ø˜‘ñ1Ù,>ñ1ØRZÐ[_ÑR`ñ1Øqtð1à	ˆ#ˆsˆ(�^õ1ðj OSØUYØJNØ:>Ø+/òGqØðGqØñGqÙ)-ñGqØ<DÀU¹OñGqà˜‘ñGqà-5±d©^ñGqàMRñGqð ˜‘ñGqð :BÀ$¹ðGqð �s‰mð	Gqð +3°3©-ñ	Gqð
 " %™ðGqð 
õGqðV jnó+Øð+Ø! #™ð+Ø9AÀ#¹ð+ØYaÐbeÑYfð+àõ+ñ\ 6?ô ¨sð À4õ öUñ
¨Cð 
°H¸S±Mõ 
ñ$$¨ð $°õ $ñ0 %*Ñ !Ù!$Ñ ñ\°¸%±ð \ÀUõ \ñh sð h¨tõ hñ "Ñ Ù,5Ñ Ñ)Ô 5ð˜sõ ð&
¨°#©ð 
¸4õ 
ð¨ð °xÀ±}ð Èõ ð* #˜Ÿ
š
Ñ#FÈÏÊÓVÑ ñ "%Ñ á"$Ñ ñH©9ð H¸À#¹õ Hð$ @DñaØ]bôaØðaØ˜c 3˜h™ðaØ/7¸©}ñaØVZðaàõað2>  c¨3 h¡ð >Ñ4Wõ >ð @Dñ3TØ]bô3TØð3TØ˜c 3˜h™ð3TØ/7¸©}ñ3TØVZð3Tàõ3Tðl >Cô 
; ñ 
;°dð 
;Àsõ 
;ð "$ÀdôØðØñØ4<¸U±Oðàõñ  !KÑ ÷zCô zCð| "$ÀdôØðØñØ4<¸U±Oðàõó"` sð `°D¸¸c¸±Nð `È(ÐSVÉ-ð `Ðcfõ `ñw¨Sð w°Tõ wð @Dñ `Ø]bô `Øð `Ø˜c 3˜h™ð `Ø/7¸©}ñ `ØVZð `àõ `ñN Ñ2Ùˆs€O‘m X¨c¡]Ð3Ñ6IÈ3Ð5OÙ˜3Ðð5!ó "Ñ ð
9YØ
�3‰-ð9YØ&.¨s¡mð9YØ<DÀS¹Mð9YØU]Ð^aÑUbð9Yà�c‰]ñ9Yà/2ñ9YàDLÈSÁMñ9Yð   ‘}ñ9Yð 9AÀ¹ñ9Yð   ‘}ñ	9Yð 5=¸TÀ#ÀsÀ(¹^Ñ4Lð	9Yð [_ð	9Yñ
 õ9Yñx !Ñ!6Ùˆs€O‘m X¨c¡]Ð3°hÀÀSÈ#ÀXÁÐ5OÙ˜#ÐÑ!3°SÐ 9Ñ<LÈhÐWZÉmÐ;\Ù˜( 3™-Ð(Ñ+=¸xÈ¹}Ð*MÙ˜( 3™-Ð(Ñ+>ÀÐ*FÙ˜T # s (™^Ð,©{¸CÐ.@ð9Bó CÑ ðA)Ø
�3‰-ðA)Ø&.¨s¡mðA)Ø<DÀS¹MðA)ØU]Ð^aÑUbðA)à�c‰]ñA)à*.¨s°C¨x©.ñA)áDHñA)ð ˜%‘ñA)ð /7°s©mñA)ð EMÉTÁNñA)ð �e‰_ñ	A)ð +3°4©.ñ	A)ð MUÐUYÉNñ	A)ð
 ˜D  c ™NÑ+ðA)ð
 8@À±}ñA)ð ˜˜c 3˜h™Ñ(ðA)ð 7;ðA)ñ õA)öH�*õ ñ ‘\Ð"Ñ%6¹Ð$HÙ™<Ð(Ñ+GÑIhÐ*iÙ#Ñ%@ÐAñ Ñ+Ð,Ñ/CÑEWÐ.XðJÑ �5˜˜x©¨°TÐ(9Ñ:¸CÐ?Ñ@Á#ÐEÑFô ñ	‘ñ 	 x±°¸TÐ0AÑ'Bõ 	ñ2™Yð 2¨4õ 2ñ"V¡)ð V°õ Vñ
 ™.Ùˆs€O�f˜h s™mÐ,©u°c¨l¸\È4Ð<PÑS^Ð`cÐRdÙ˜#ÐÑ!1°8¸C±=Ð AÑDWÐYaÐbeÑYfÐCgÙ˜ #™Ð'Ñ*=¸xÈ¹}Ð)MÙ�H˜S‘MÐ"¡^°X¸dÀ3ÈÀ8¹nÑ5MÐ$NÙ�8˜D  c ™NÑ+Ð,©y¸(À5¹/Ð.Jð+ó �ðh ð h¨(°4©.õ hð
a ð a¨õ añY¡)ñ Y°Sð Y¸Tõ Yñ˜Sñ ¨h°s©mð Àõ ñ6#Ùñ#Ù!-ð#Ø7;¸CÀ¸H±~ñ#ØS[Ð\_ÑS`õ#ñB;¡ð ;°d¸3À¸8±nñ ;Èsð ;ÐW_Ñ`kÑWlõ ;ñ"%Ùñ%Ù!-ð%Ø7;¸CÀ¸H±~ñ%ØW[õ%ñP=Ùñ=Ù!-ð=Ø7;¸CÀ¸H±~ñ=ØW[õ=ðD QVóØ
�3‰-ñØ,/ñØ:>ñÙGSñà˜3‘-ñà03ñàIMðð ˆ8�C‰=˜( 3™-¨Ð,Ñ-õñ2[©ñ [¹<õ [ñ|-Ùñ-Ø%(ð-Ø26°s¸C°x±.ð-ØHPÐQTÉð-àñ-à!$ñ-à9<ñ-àNVÐWZÉmñ-ð   ‘}ñ-ð 9AÀ¹ñ-ð   ‘}ñ	-ð 4<¸C±=ñ	-ð OWÐWZÉmñ	-ð
 ˜4  S ™>Ñ*ñ-ð
 9AÀÀcÈ3ÀhÁÑ8Põ-ñ` 8©[¨M¸3Ð,>Ñ#?ð ÀCõ ñ¨x¹¸ÀsÐ8JÑ/Kð ÐPSõ óY˜Eñ Y¨°©ð YÀ3õ Yñ
4 h¨t°C¸°H©~Ñ&>ð 4ÀSñ 4ÐV[ð 4Ð`dõ 4ñ àñ/ Ø)-¸DÐRVØÀ$Ø#'¸4ÈtØ¨dÐW[Ø.2ÀDÐY^ØÈØ-1ó/ Ø
ð/ Ø#&ð/ Ø69ð/ ØLOð/ àñ/ à'/°°S¸#°X±Ñ'?ñ/ áRVñ/ ð ˜%‘ñ/ ð 69ñ/ ñ IMñ/ ð ñ	/ ð (,ñ	/ ð GOÈtÁnñ	/ ð
 ˜D  c ™NÑ+ð/ ð
 ?Bñ/ ð
 SWñ/ ð ñ/ ð .6°d¸3À¸8±nÑ-Eñ/ ð ˜4  S ™>Ñ*ð/ ð 	ó/ ó ñ/ ñd
 °ñ 
 À×A[ÒA[õ 
 ð/Ø
�3‰-ð/Ø(,ð/Ø8@À¹ð/ØNVÐWZÉmð/à�s‰mð/à&.¨s¡mñ/àCKÈDÐQTÐVYÐQYÉNÑC[ñ/ñ ñ/ð "*¨%¡ñ/ð ?GÀs¹mñ/ð U]Ñ]aÑTbñ/ð �e‰_ñ	/ð +3°4©.ñ	/ð MUÐUYÉNñ	/ð
 ˜D  c ™NÑ+ð/ð
 8@À±}ñ/ð ˜˜c 3˜h™Ñ(ð/ð Ñ  S¨# X¡°°S¸#°X±Ð>Ñ?õ/ðB
 h¨s¡mñ 
¹)ñ 
È#ð 
ÐRVõ 
ñ	3Ù
ñ	3Ù/ñ	3Ø?CÀCÈÀH¹~ñ	3ØaeÐfiÐknÐfnÑaoð	3à
ˆ3��t˜C ˜H‘~Ð%Ñ&õ	3ñJÙñJÙ2ñJØBFÀsÈCÀxÁ.ðJà
�3‰-ðJà%)ñJà7?ÀÀSÈ#ÀXÁÑ7OõJð ñZØ)-¸DÐRVØÀ$Ø#'¸4ÈtØ¨dÐW[Ø.2ÀDÐY^ØÈóZØ
ðZØ#&ðZØ69ðZØLOðZàñZà'/°°S¸#°X±Ñ'?ñZáRVñZð ˜%‘ñZð 69ñZñ IMñZð ñ	Zð (,ñ	Zð GOÈtÁnñ	Zð
 ˜D  c ™NÑ+ðZð
 ?BñZð
 SWñZð ñZð .6°d¸3À¸8±nÑ-EðZð 	õZôzFô"Pð QUô -À3ÈÁ:ð -ÐY\õ -ñ` àñ Ø)-¸DÐRVØÀ$Ø#'¸4ÈtØ¨dÐW[Ø+/ó Ø
ð Ø#&ð Ø69ð ØLOð àñ à'/°°S¸#°X±Ñ'?ñ áRVñ ð ˜%‘ñ ð 69ñ ñ IMñ ð ñ	 ð (,ñ	 ð GOÈtÁnñ	 ð
 ˜˜c 3˜h™Ñ(ð ð 	ó ó ñ ð2 ñ4Ø)-¸DÐRVØÀ$Ø#'¸4ÈtØ¨dÐW[Ø+/ó4Ø
ð4Ø#&ð4Ø69ð4ØLOð4àñ4à'/°°S¸#°X±Ñ'?ñ4áRVñ4ð ˜%‘ñ4ð 69ñ4ñ IMñ4ð ñ	4ð (,ñ	4ð GOÈtÁnñ	4ð
 ˜˜c 3˜h™Ñ(ð4ð 	õ4÷v Ñ Ý á"Ó$�ñÐ`dó ¨#ñ ÀXÈdÐSVÐX[ÐS[ÉnÑE]ö r'   