+
    Ki                       a  0 t $ R t^ RIHt ^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIt]P                  ! ]4      t. ROtR]R&   . ROtR]R&   R	 R
 ltR R ltR R ltR R ltRR R lltR# )z8Codex model discovery from API, local cache, and config.)annotationsN)Path)ListOptional	List[str]DEFAULT_CODEX_MODELSz!List[tuple[str, tuple[str, ...]]]_FORWARD_COMPAT_TEMPLATE_MODELSc                    V ^8  d   QhRRRR/# )   	model_idsr   return )formats   "4/home/ubuntu/hermes-agent/hermes_cli/codex_models.py__annotate__r      s      ) 	     c                  a . p\        4       oV  F.  pVS9  g   K  VP                  V4       SP                  V4       K0  	  \         Fr  w  r4VS9   d   K  \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   KP  VP                  V4       SP                  V4       Kt  	  V# )a  Add Clawdbot-style synthetic forward-compat Codex models.

If a newer Codex slug isn't returned by live discovery, surface it when an
older compatible template model is present. This mirrors Clawdbot's
synthetic catalog / forward-compat behavior for GPT-5 Codex variants.
c              3  ,   <"   T F	  qS9   x  K  	  R # 5iNr   ).0templateseens   & r   	<genexpr>-_add_forward_compat_models.<locals>.<genexpr>0   s     @H4s   TF)setappendaddr   any)r   orderedmodel_idsynthetic_modeltemplate_modelsr   s   &    @r   _add_forward_compat_modelsr"      s     GUD4NN8$HHX 
 -L(d"3@@333@@@@NN?+HH_% -L Nr   c                    V ^8  d   QhRRRR/# )r
   access_tokenstrr   r   r   )r   s   "r   r   r   7   s     #F #F #F #Fr   c                    ^ RI pVP                  RRRV  2/^
R7      pVP                  ^8w  d   . # VP                  4       p\	        V\
        4      '       d   VP                  R. 4      M. p. pT EF  p\	        T\
        4      '       g   K  TP                  R4      p\	        T\        4      '       d   TP                  4       '       g   K[  TP                  4       pTP                  R	4      R
J d   K  TP                  RR4      p	\	        T	\        4      '       d&   T	P                  4       P                  4       R9   d   K  TP                  R4      p
\	        T
\        \        34      '       d   \        T
4      MRpTP                  Y34       EK  	  TP                  R R7       \!        T UUu. uF  w  rTNK	  	  upp4      #   \         d#   p\        P                  RT4       . u Rp?# Rp?ii ; iu uppi )zUFetch available models from the Codex API. Returns visible models sorted by priority.NzAhttps://chatgpt.com/backend-api/codex/models?client_version=1.0.0AuthorizationzBearer )headerstimeoutmodelsz)Failed to fetch Codex models from API: %sslugsupported_in_apiF
visibility priority'  c                &    V ^ ,          V ^,          3#     r   )xs   &r   <lambda>(_fetch_models_from_api.<locals>.<lambda>Y   s    1qtr   keyhidehidden)httpxgetstatus_codejson
isinstancedict	Exceptionloggerdebugr%   striplowerintfloatr   sortr"   )r$   r<   respdataentriesexcsortableitemr+   r-   r/   rank_s   &            r   _fetch_models_from_apirR   7   s   yyO$~&>?  

 s"Iyy{,6tT,B,B$((8R(
 H$%%xx$$$DJJLLzz|88&'50XXlB/
j#&&:+;+;+=+C+C+EI[+[88J' *8c5\ B Bs8}%   MM,M-%8&D8t8&DEE-  @#F	, 'Es(   /G :G -G2
G/G*$G/*G/c                    V ^8  d   QhRRRR/# )r
   
codex_homer   r   Optional[str]r   )r   s   "r   r   r   ]   s      D ] r   c                   V R ,          pVP                  4       '       g   R#  ^ RIp TP                  TP	                  RR7      4      p\        T\        4      '       d   TP                  R4      MRp\        T\        4      '       d'   TP                  4       '       d   TP                  4       # R#   \         d     R# i ; i  \         d     R# i ; i)zconfig.tomlNutf-8encodingmodel)
existstomllibrB   loads	read_textr@   rA   r=   r%   rE   )rT   config_pathr\   payloadrZ   s   &    r   _read_default_modelra   ]   s    },K-- 5 5w 5 GH %/w$=$=GKK 4E%%++--{{}    s"   B0 !C 0B?>B?CCc                    V ^8  d   QhRRRR/# )r
   rT   r   r   r   r   )r   s   "r   r   r   o   s     ! !4 !I !r   c                   V R ,          pVP                  4       '       g   . #  \        P                  ! VP                  RR7      4      p\        T\        4      '       d   TP                  R4      MRp. p\        T\        4      '       Ed"   T EF  p\        T\        4      '       g   K  TP                  R4      p\        T\        4      '       d   TP                  4       '       g   K[  TP                  4       pTP                  R4      RJ d   K  TP                  R4      p\        T\        4      '       d&   TP                  4       P                  4       R9   d   K  TP                  R	4      p\        T\        \        34      '       d   \        T4      MR
p	TP                  Y34       EK  	  TP                  R R7       . p
T F  w  rYj9  g   K  T
P                  T4       K   	  T
#   \         d    . u # i ; i)zmodels_cache.jsonrW   rX   r*   Nr+   r,   Fr-   r/   r0   c                &    V ^ ,          V ^,          3# r2   r   )rO   s   &r   r5   $_read_cache_models.<locals>.<lambda>   s    DGT!W#5r   r7   r9   )r[   r?   r]   r^   rB   r@   rA   r=   listr%   rE   rF   rG   rH   r   rI   )rT   
cache_pathrawrL   rN   rO   r+   r-   r/   rP   dedupedrQ   s   &           r   _read_cache_modelsrj   o   s   11J	jj--w-?@ $.c4#8#8cgghdGH'4  DdD))88F#DdC((

::<Dxx*+u4,/J*c**z/?/?/A/G/G/IM_/_xx
+H$.x#u$F$F3x=FDOOTL)   MM5M6GNN4   N7  	s   &G' 'G76G7c                    V ^8  d   QhRRRR/# )r
   r$   rU   r   r   r   )r   s   "r   r   r      s     / /m /y /r   c                (   \         P                  ! RR4      P                  4       ;'       g&    \        \        P
                  ! 4       R,          4      p\	        V4      P                  4       p. pV '       d   \        V 4      pV'       d   \        V4      # \        V4      pV'       d   VP                  V4       \        V4       F  pWc9  g   K  VP                  V4       K  	  \         F  pWc9  g   K  VP                  V4       K  	  \        V4      # )zReturn available Codex model IDs, trying API first, then local sources.

Resolution order: API (live, if token provided) > config.toml default >
local cache > hardcoded defaults.

CODEX_HOMEr.   z.codex)osgetenvrE   r%   r   home
expanduserrR   r"   ra   r   rj   r   )r$   codex_home_strrT   r   
api_modelsdefault_modelr   s   &      r   get_codex_model_idsru      s     YY|R0668WWC		h@V<WNn%002JG +L9
-j99 (
3M}%&z2"NN8$ 3 )"NN8$ ) &g..r   )gpt-5.4-minigpt-5.4gpt-5.3-codexgpt-5.2-codexzgpt-5.1-codex-maxzgpt-5.1-codex-mini))rv   rx   ry   )rw   rz   )rx   )ry   )zgpt-5.3-codex-sparkrz   r   )__conditional_annotations____doc__
__future__r   r?   loggingpathlibr   typingr   r   rn   	getLogger__name__rC   r   __annotations__r   r"   rR   ra   rj   ru   )r{   s   @r   <module>r      sl    > "    ! 				8	$# i F !B 0#FL$!H/ /r   