
    PL
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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   )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/kuhnn/.hermes/hermes-agent/hermes_cli/codex_models.py	<genexpr>z-_add_forward_compat_models.<locals>.<genexpr>C   s(      @@Hx4@@@@@@    )setappendaddr   any)r   orderedmodel_idsynthetic_modeltemplate_modelsr   s        @r   _add_forward_compat_modelsr%   2   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>n   s    1qt r   keyc                    g | ]\  }}|S r   r   )r   _r/   s      r   
<listcomp>z*_fetch_models_from_api.<locals>.<listcomp>o   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   J   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tomllibrG   loads	read_textrE   rF   rB   r'   rJ   )rW   config_pathr_   payloadr]   s        r   _read_default_modelrd   r   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.jsonrZ   r[   r.   r/   r0   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      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_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P   $" " " "J/ / / / / / /r   