
    i                        U d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
Z
 ej        e          Zg dZded<   g d	Zd
ed<   ddZddZddZddZdddZdS )z8Codex model discovery from API, local cache, and config.    )annotationsN)Path)ListOptional)gpt-5.5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	List[str]DEFAULT_CODEX_MODELS))r   )r	   r   r
   )r   r
   r   )r	   r   )r
   )r   z!List[tuple[str, tuple[str, ...]]]_FORWARD_COMPAT_TEMPLATE_MODELS	model_idsreturnc                <   g }t                      | D ]0}|vr*|                    |                               |           1t          D ]O\  }}|v r
t	          fd|D                       r*|                    |                               |           P|S )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      K   | ]}|v V  	d S N ).0templateseens     </home/ubuntu/.hermes/hermes-agent/hermes_cli/codex_models.py	<genexpr>z-_add_forward_compat_models.<locals>.<genexpr>1   s(      @@Hx4@@@@@@    )setappendaddr   any)r   orderedmodel_idsynthetic_modeltemplate_modelsr   s        @r   _add_forward_compat_modelsr$       s     GUUD  4NN8$$$HHX,K & &(d""@@@@@@@@@ 	&NN?+++HH_%%%Nr   access_tokenstrc                   	 ddl }|                    ddd|  id          }|j        dk    rg S |                                }t	          |t
                    r|                    d	g           ng }n4# t          $ r'}t                              d
|           g cY d}~S d}~ww xY wg }|D ]1}t	          |t
                    s|                    d          }t	          |t                    r|
                                sX|
                                }|                    d          du r|                    dd          }	t	          |	t                    r)|	
                                                                dv r|                    d          }
t	          |
t          t          f          rt          |
          nd}|                    ||f           3|                    d            t!          d |D                       S )zUFetch available models from the Codex API. Returns visible models sorted by priority.r   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 hidehiddenpriority'  c                "    | d         | d         fS Nr      r   )xs    r   <lambda>z(_fetch_models_from_api.<locals>.<lambda>Z   s    1qt r   keyc                    g | ]\  }}|S r   r   )r   _r.   s      r   
<listcomp>z*_fetch_models_from_api.<locals>.<listcomp>[   s    &D&D&D4t&D&D&Dr   )httpxgetstatus_codejson
isinstancedict	Exceptionloggerdebugr&   striplowerintfloatr   sortr$   )r%   rA   respdataentriesexcsortableitemr.   r0   r5   ranks               r   _fetch_models_from_apirV   8   s!   yyO$&>&>&>?  
 

 s""Iyy{{,6tT,B,BJ$((8R(((   @#FFF						 H & &$%% 	xx$$$ 	DJJLL 	zz||88&''500XXlB//
j#&& 	:+;+;+=+=+C+C+E+EI[+[+[88J'' *8c5\ B BNs8}}}t%%%%MM,,M---%&D&D8&D&D&DEEEs#   -A2 AA2 2
B#<BB#B#
codex_homer   Optional[str]c                   | dz  }|                                 sd S 	 dd l}n# t          $ r Y d S w xY w	 |                    |                    d                    }n# t          $ r Y d S w xY wt          |t                    r|                    d          nd }t          |t                    r(|	                                r|	                                S d S )Nzconfig.tomlr   utf-8encodingmodel)
existstomllibrG   loads	read_textrE   rF   rB   r&   rJ   )rW   config_pathr_   payloadr]   s        r   _read_default_modelrd   ^   s    },K t   tt-- 5 5w 5 G GHH   tt$.w$=$=GGKK   4E% %++-- {{}}4s   " 
00)A 
A,+A,c                   | dz  }|                                 sg S 	 t          j        |                    d                    }n# t          $ r g cY S w xY wt          |t                    r|                    d          nd }g }t          |t                    r4|D ]0}t          |t                    s|                    d          }t          |t                    r|
                                sX|
                                }|                    d          du r|                    d          }t          |t                    r)|
                                                                d	v r|                    d
          }t          |t          t          f          rt          |          nd}	|                    |	|f           2|                    d            g }
|D ]\  }}||
vr|
                    |           |
S )Nzmodels_cache.jsonrZ   r[   r-   r.   r/   Fr0   r2   r5   r6   c                "    | d         | d         fS r8   r   )rT   s    r   r;   z$_read_cache_models.<locals>.<lambda>   s    DGT!W#5 r   r<   )r^   rD   r`   ra   rG   rE   rF   rB   listr&   rJ   rK   rL   rM   r   rN   )rW   
cache_pathrawrQ   rS   rT   r.   r0   r5   rU   dedupedr?   s               r   _read_cache_modelsrk   p   s   11J 	j--w-??@@   			 $.c4#8#8BcgghdGH'4   * 	* 	*DdD)) 88F##DdC(( 

 ::<<Dxx*++u44,//J*c** z/?/?/A/A/G/G/I/IM_/_/_xx
++H$.x#u$F$FR3x===FDOOT4L))))MM55M666G ! !4wNN4   Ns   (A AAc                &   t          j        dd                                          p"t          t	          j                    dz            }t	          |                                          }g }| r t          |           }|rt          |          S t          |          }|r|
                    |           t          |          D ]}||vr|
                    |           t          D ]}||vr|
                    |           t          |          S )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_HOMEr1   z.codex)osgetenvrJ   r&   r   home
expanduserrV   r$   rd   r   rk   r   )r%   codex_home_strrW   r    
api_modelsdefault_modelr!   s          r   get_codex_model_idsru      s    Y|R006688WC	h@V<W<WNn%%0022JG  :+L99
 	:-j999 (
33M &}%%%&z22 % %7""NN8$$$( % %7""NN8$$$%g...r   )r   r   r   r   )r%   r&   r   r   )rW   r   r   rX   )rW   r   r   r   r   )r%   rX   r   r   )__doc__
__future__r   rD   loggingpathlibr   typingr   r   rn   	getLogger__name__rH   r   __annotations__r   r$   rV   rd   rk   ru   r   r   r   <module>r~      s?   > > > " " " " " "         ! ! ! ! ! ! ! ! 						8	$	$# # #     F F F        0#F #F #F #FL   $! ! ! !H/ / / / / / /r   