
    Rj                         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.3-codex-spark	List[str]DEFAULT_CODEX_MODELS))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>K   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 ]}t	          |t
                    s|                    d          }t	          |t                    r|
                                sX|
                                }|                    dd          }	t	          |	t                    r)|	
                                                                dv r|                    d          }
t	          |
t          t          f          rt          |
          nd}|                    ||f           |                    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
visibility >   hidehiddenpriority'  c                "    | d         | d         fS Nr      r   )xs    r   <lambda>z(_fetch_models_from_api.<locals>.<lambda>v   s    1qt r   keyc                    g | ]\  }}|S r   r   )r   _r.   s      r   
<listcomp>z*_fetch_models_from_api.<locals>.<listcomp>w   s    &D&D&D4t&D&D&Dr   )httpxgetstatus_codejson
isinstancedict	Exceptionloggerdebugr&   striplowerintfloatr   sortr$   )r%   r?   respdataentriesexcsortableitemr.   r/   r3   ranks               r   _fetch_models_from_apirT   R   s   yyO$&>&>&>?  
 

 s""Iyy{{,6tT,B,BJ$((8R(((   @#FFF						 H & &$%% 	xx$$$ 	DJJLL 	zz||
 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tomllibrE   loads	read_textrC   rD   r@   r&   rH   )rU   config_pathr]   payloadr[   s        r   _read_default_modelrb   z   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                    r|D ]}t          |t                    s|                    d          }t          |t                    r|
                                sX|
                                }|                    d          }t          |t                    r)|
                                                                dv r|                    d          }t          |t          t          f          rt          |          nd	}	|                    |	|f           |                    d
            g }
|D ]\  }}||
vr|
                    |           |
S )Nzmodels_cache.jsonrX   rY   r-   r.   r/   >   r1   r2   r3   r4   c                "    | d         | d         fS r6   r   )rR   s    r   r9   z$_read_cache_models.<locals>.<lambda>   s    DGT!W#5 r   r:   )r\   rB   r^   r_   rE   rC   rD   r@   listr&   rH   rI   rJ   rK   r   rL   )rU   
cache_pathrawrO   rQ   rR   r.   r/   r3   rS   dedupedr=   s               r   _read_cache_modelsri      s   11J 	j--w-??@@   			 $.c4#8#8BcgghdGH'4   * 	* 	*DdD)) 88F##DdC(( 

 ::<<D ,//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_HOMEr0   z.codex)osgetenvrH   r&   r   home
expanduserrT   r$   rb   r   ri   r   )r%   codex_home_strrU   r    
api_modelsdefault_modelr!   s          r   get_codex_model_idsrs      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   )rU   r   r   rV   )rU   r   r   r   r   )r%   rV   r   r   )__doc__
__future__r   rB   loggingpathlibr   typingr   r   rl   	getLogger__name__rF   r   __annotations__r   r$   rT   rb   ri   rs   r   r   r   <module>r|      s@   > > > " " " " " "         ! ! ! ! ! ! ! ! 						8	$	$# # #     @	F 	F 	F  	 	 	 	   0%F %F %F %FP   $" " " "J/ / / / / / /r   