
    `gj"                        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y)z8Codex model discovery from API, local cache, and config.    )annotationsN)Path)ListOptional)gpt-5.6-solgpt-5.6-sol-progpt-5.6-terragpt-5.6-terra-progpt-5.6-lunagpt-5.6-luna-pro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   r   )r   r   )r   )r   r   r   )r   r   )r   r   )r   r   z!List[tuple[str, tuple[str, ...]]]_FORWARD_COMPAT_TEMPLATE_MODELSc                   g }t               | D ])  }|vs|j                  |       j                  |       + t        D ]A  \  }}|v rt	        fd|D              s |j                  |       j                  |       C |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  
 y wN ).0templateseens     J/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/codex_models.py	<genexpr>z-_add_forward_compat_models.<locals>.<genexpr>Y   s     @Hx4@s   )setappendaddr   any)	model_idsorderedmodel_idsynthetic_modeltemplate_modelsr   s        @r   _add_forward_compat_modelsr)   H   s     GUD 4NN8$HHX
 -L &(d"@@@NN?+HH_%& N    c                ^   	 ddl }|j                  ddd|  id      }|j                  dk7  rg S |j                         }t	        |t
              r|j                  d	g       ng }g }|D ]  }t	        |t
              s|j                  d      }t	        |t              r|j                         sF|j                         }|j                  dd      }	t	        |	t              r!|	j                         j                         dv r|j                  d      }
t	        |
t        t        f      rt        |
      nd}|j                  ||f        |j                  d        t!        |D cg c]  \  }}|	 c}}      S # t        $ r"}t        j                  d
|       g cY d}~S d}~ww xY wc c}}w )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>   s    1qt r*   key)httpxgetstatus_codejson
isinstancedict	Exceptionloggerdebugstrstriplowerintfloatr!   sortr)   )access_tokenr@   respdataentriesexcsortableitemr2   r3   r7   rank_s                r   _fetch_models_from_apirX   `   s   yyO$~&>?  

 s"Iyy{,6tT,B$((8R(
 H &$%xx$$DJJLzz|
 XXlB/
j#&:+;+;+=+C+C+EI[+[88J' *8c5\ Bs8}t%!&$ MM,M-%8&D4t&DEE1  @#F	0 'Es(   -E; 4E; 'F)
;	F&F!F&!F&c                `   | dz  }|j                         sy 	 dd l}	 |j                  |j	                  d            }t        |t              r|j                  d      nd }t        |t              r |j                         r|j                         S y # t        $ r Y y w xY w# t        $ r Y y w xY w)Nzconfig.tomlr   utf-8encodingmodel)
existstomllibrF   loads	read_textrD   rE   rA   rI   rJ   )
codex_homeconfig_pathr_   payloadr]   s        r   _read_default_modelre      s    },K-- 5 5w 5 GH %/w$=GKK 4E%%++-{{}    s"   B !B! 	BB!	B-,B-c                <   | dz  }|j                         sg S 	 t        j                  |j                  d            }t        |t              r|j                  d      nd }g }t        |t              r|D ]  }t        |t              s|j                  d      }t        |t              r|j                         sF|j                         }|j                  d      }t        |t              r!|j                         j                         dv r|j                  d      }t        |t        t        f      rt        |      nd	}	|j                  |	|f        |j                  d
        g }
|D ]  \  }}||
vs|
j                  |        |
S # t        $ r g cY S w xY w)Nzmodels_cache.jsonrZ   r[   r1   r2   r3   >   r5   r6   r7   r8   c                    | d   | d   fS r:   r   )rU   s    r   r=   z$_read_cache_models.<locals>.<lambda>   s    DGT!W#5 r*   r>   )r^   rC   r`   ra   rF   rD   rE   rA   listrI   rJ   rK   rL   rM   r!   rN   )rb   
cache_pathrawrR   rT   rU   r2   r3   r7   rV   dedupedrW   s               r   _read_cache_modelsrl      sz   11J	jj--w-?@ $.c4#8cgghdGH'4  	*DdD)88F#DdC(

::<D ,/J*c*z/?/?/A/G/G/IM_/_xx
+H$.x#u$F3x=FDOOT4L)	*" MM5M6G !4wNN4 ! N9  	s   %F FFc                   t        j                  dd      j                         xs  t        t	        j
                         dz        }t	        |      j                         }g }| rt        |       }|rt        |      S t        |      }|r|j                  |       t        |      D ]  }||vs|j                  |        t        D ]  }||vs|j                  |        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_HOMEr4   z.codex)osgetenvrJ   rI   r   home
expanduserrX   r)   re   r!   rl   r   )rO   codex_home_strrb   r%   
api_modelsdefault_modelr&   s          r   get_codex_model_idsrv      s     YY|R0668WC		h@V<WNn%002JG +L9
-j99 (
3M}%&z2 %7"NN8$% ) %7"NN8$% &g..r*   )r$   r   returnr   )rO   rI   rw   r   )rb   r   rw   Optional[str])rb   r   rw   r   r   )rO   rx   rw   r   )__doc__
__future__r   rC   loggingpathlibr   typingr   r   ro   	getLogger__name__rG   r   __annotations__r   r)   rX   re   rl   rv   r   r*   r   <module>r      si    > "    ! 				8	$&# i &PF !B $0%FP$"J/r*   