Ë
    ÛJêj .  ã                  ó   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ  ej                  e«      Z G d„ dee	«      Z G d	„ d
ee	«      Z G d„ dee	«      Z G d„ dee	«      Ze G d„ d«      «       Ze G d„ d«      «       Z G d„ d«      Zy)u  Model Registry â€” metadata store for all known models.

Stores rich metadata per the Model Intelligence infobox specification:
- provider, model ID, version, family, type, context window
- capabilities: vision, tool/function calling, structured output, reasoning
- coding, multimodal, local availability, API availability
- license, commercial use, free status, registration required
- rate limits, token limits, discovered, last checked
- status, source, trust, environment, test status
- safety profile, resource requirements
é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚAnyc                  ó(   — e Zd ZdZdZdZdZdZdZdZ	y)	ÚModelStatuszOperational status of a model.ÚactiveÚdegradedÚhiddenÚfailedÚ
deprecatedÚunknownN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚACTIVEÚDEGRADEDÚHIDDENÚFAILEDÚ
DEPRECATEDÚUNKNOWN© ó    úM/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/model_registry.pyr	   r	      s#   „ Ù(Ø€FØ€HØ€FØ€FØ€JØ�Gr   r	   c                  ó$   — e Zd ZdZdZdZdZdZdZy)Ú
ModelTrustzTrust level of a model source.ÚofficialÚverifiedÚ	communityÚ
unofficialr   N)	r   r   r   r   ÚOFFICIALÚVERIFIEDÚ	COMMUNITYÚ
UNOFFICIALr   r   r   r   r   r   "   s   „ Ù(Ø€HØ€HØ€IØ€JØ�Gr   r   c                  ó0   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)Ú	ModelTypezType/category of model.ÚchatÚ
completionÚ	embeddingÚ	reasoningÚ
multimodalÚcodeÚsystemr   N)r   r   r   r   ÚCHATÚ
COMPLETIONÚ	EMBEDDINGÚ	REASONINGÚ
MULTIMODALÚCODEÚSYSTEMr   r   r   r   r(   r(   +   s-   „ Ù!Ø€DØ€JØ€IØ€IØ€JØ€DØ€FØ�Gr   r(   c                  ó$   — e Zd ZdZdZdZdZdZdZy)ÚModelFreeStatuszFree tier status of a model.ÚfreeÚfree_for_testÚfree_for_studyÚpaidr   N)	r   r   r   r   ÚFREEÚFREE_FOR_TESTÚFREE_FOR_STUDYÚPAIDr   r   r   r   r8   r8   7   s   „ Ù&Ø€DØ#€MØ%€NØ€DØ�Gr   r8   c                  ó‚   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded	<   dZded
<   dZded<   y)ÚModelCapabilitieszModel capability flags.FÚboolÚvisionÚtool_callingÚstructured_outputr,   Úcodingr-   Úfunction_callingÚ	json_modeN)r   r   r   r   rD   Ú__annotations__rE   rF   r,   rG   r-   rH   rI   r   r   r   rB   rB   @   sW   … á!à€FˆDÓØ€L�$ÓØ#Ð�tÓ#Ø€IˆtÓØ€FˆDÓØ€J�ÓØ"Ð�dÓ"Ø€IˆtÔr   rB   c                  ó`  — e Zd ZU dZded<   ded<   dZded<   dZded<   ej                  Z	d	ed
<   dZ
ded<    ee¬«      Zded<   dZded<   dZded<   dZded<   dZded<   ej&                  Zded<   dZded<   dZded<   dZded<   dZded<    eej2                  ¬«      Zded<    eej2                  ¬«      Zded<   ej&                  Zd ed!<   dZded"<   ej&                  Z d#ed$<   d%Z!ded&<   d'Z"ded(<   dZ#ded)<    ee$¬«      Z%d*ed+<    ee$¬«      Z&d*ed,<   e'd0d-„«       Z(e'd0d.„«       Z)d1d/„Z*y)2ÚModelRecordzComplete model metadata record.ÚstrÚmodel_idÚproviderNú
str | NoneÚversionÚfamilyr(   Ú
model_typez
int | NoneÚcontext_window)Údefault_factoryrB   ÚcapabilitiesFrC   Úlocal_availableÚapi_availableÚlicenseTÚcommercial_user8   Úfree_statusÚregistration_requiredÚcard_requiredÚ
rate_limitÚ
max_tokensÚfloatÚ
discoveredÚlast_checkedr	   ÚstatusÚsourcer   ÚtrustÚallÚenvironmentÚ
not_testedÚtest_statusÚsafety_profilezdict[str, Any]Úresource_requirementsÚmetadatac                óx   — | j                   t        j                  t        j                  t        j                  fv S ©N)r[   r8   r=   r>   r?   ©Úselfs    r   Úis_freezModelRecord.is_free{   s5   € à×ÑÜ× Ñ Ü×)Ñ)Ü×*Ñ*ð$
ð 
ð 	
r   c                ó   — | j                   S rn   )rW   ro   s    r   Úis_localzModelRecord.is_localƒ   s   € à×#Ñ#Ð#r   c                óš   — |j                  «       D ]  \  }}t        | |«      sŒt        | ||«       Œ! t        j                  «       | _        y)zUpdate fields in-place.N)ÚitemsÚhasattrÚsetattrÚtimerb   )rp   ÚkwargsÚkeyÚvalues       r   ÚupdatezModelRecord.update‡   sA   € à Ÿ,™,›.ò 	*‰JˆC�Ü�t˜SÕ!Ü˜˜c 5Õ)ð	*ô !ŸI™I›KˆÕr   )ÚreturnrC   )ry   r   r}   ÚNone)+r   r   r   r   rJ   rQ   rR   r(   r0   rS   rT   r   rB   rV   rW   rX   rY   rZ   r8   r   r[   r\   r]   r^   r_   rx   ra   rb   r	   rc   rd   r   re   rg   ri   rj   Údictrk   rl   Úpropertyrq   rs   r|   r   r   r   rL   rL   N   ss  … á)àƒMØƒMØ€GˆZÓØ€FˆJÓØ%ŸN™N€J�	Ó*Ø!%€N�JÓ%Ù&+Ð<MÔ&N€LÐ#ÓNð "€O�TÓ!Ø€M�4Óð €GˆZÓØ€N�DÓØ#2×#:Ñ#:€K�Ó:Ø"'Ð˜4Ó'Ø€M�4Óð "€J�
Ó!Ø!€J�
Ó!ñ ¨d¯i©iÔ8€J�Ó8Ù°·	±	Ô:€L�%Ó:ð &×-Ñ-€FˆKÓ-Ø€FˆJÓØ"×*Ñ*€Eˆ:Ó*Ø€K�ÓØ#€K�Ó#ð "&€N�JÓ%Ù,1À$Ô,GÐ˜>ÓGñ  %°TÔ:€HˆnÓ:àò
ó ð
ð ò$ó ð$ô(r   rL   c                  óØ   — e Zd ZdZdd„Zdd„Zdd„Zddd„Zddd„Zdd„Z	dd	„Z
dd
„Zdd„Zd d„Zd d„Zd d„Zd d„Zddddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!d„Zdd"d„Zd#d„Zd$d„Zddd„Zy)%ÚModelRegistrya"  Registry for model metadata.

    Provides CRUD operations and queries for model discovery,
    validation, and classification. Thread-safe for single-threaded asyncio use.

    Models are keyed by ``(provider, model_id)`` so the same model name can
    exist under multiple providers.
    c                ó˜   — i | _         i | _        i | _        i | _        t        D �ci c]  }|t        «       “Œ c}| _        d| _        y c c}w )Nr   )Ú_modelsÚ_by_providerÚ
_by_familyÚ_by_typer	   ÚsetÚ
_by_statusÚ_counter)rp   Úss     r   Ú__init__zModelRegistry.__init__™   sJ   € Ø/1ˆŒØ13ˆÔØ/1ˆŒØ-/ˆŒä)ö8
ØˆAŒs‹u‰Hò8
ˆŒð ˆ�ùò8
s   ¥Ac                ó|   — | xj                   dz  c_         |j                  › d|j                  › d| j                   › �S )Né   ú:ú#)rŠ   rO   rN   )rp   Úmodels     r   Ú	_next_keyzModelRegistry._next_key£   s5   € Ø�Š˜Ñ�Ø—.‘.Ð!  5§>¡>Ð"2°!°D·M±M°?ÐCÐCr   c                óò  — | j                  |«      }t        |j                  «      |_        |j                  j                  d|«       || j                  |<   | j
                  j                  |j                  t        «       «      j                  |«       |j                  r=| j                  j                  |j                  t        «       «      j                  |«       | j                  j                  |j                  j                  t        «       «      j                  |«       | j                  |j                     j                  |«       t         j#                  d|j$                  |j                  «       |S )a  Register a model and return its record.

        Each registration creates a new unique record, even if a record with
        the same ``(provider, model_id)`` already exists. This allows multiple
        versions or statuses of the same model name to coexist.
        Ú_registry_keyz!Registered model %s (provider=%s))r’   r   rl   Ú
setdefaultr„   r…   rO   rˆ   ÚaddrR   r†   r‡   rS   r{   r‰   rc   ÚloggerÚinforN   )rp   r‘   rz   s      r   ÚregisterzModelRegistry.register§   sý   € ð �n‰n˜UÓ#ˆÜ˜eŸn™nÓ-ˆŒØ�‰×!Ñ! /°3Ô7à!ˆ�‰�SÑØ×Ñ×$Ñ$ U§^¡^´S³UÓ;×?Ñ?ÀÔDØ�<Š<Ø�O‰O×&Ñ& u§|¡|´S³UÓ;×?Ñ?ÀÔDØ�‰× Ñ  ×!1Ñ!1×!7Ñ!7¼»Ó?×CÑCÀCÔHØ�‰˜Ÿ™Ñ%×)Ñ)¨#Ô.Ü�‰Ð7¸¿¹ÈÏÉÔXØˆr   Nc                ó  — | j                   j                  «       D ��cg c]'  \  }}|j                  |k(  r|�|j                  |k(  r|‘Œ) }}}|sy|D �])  }| j                   j	                  |«      }| j
                  j                  |j                  t        «       «      j                  |«       |j                  r=| j                  j                  |j                  t        «       «      j                  |«       | j                  j                  |j                  j                  t        «       «      j                  |«       | j                  |j                     j                  |«       t         j#                  d|«       �Œ, yc c}}w )z9Remove matching models. Returns True if any were removed.FzUnregistered model %sT)r„   ru   rN   rO   Úpopr…   Úgetrˆ   ÚdiscardrR   r†   r‡   rS   r{   r‰   rc   r—   r˜   )rp   rN   rO   ÚkÚrecÚkeysrz   r‘   s           r   Ú
unregisterzModelRegistry.unregister»   s.  € ð !ŸL™L×.Ñ.Ó0÷
Ù�!�SØ�|‰|˜xÒ'¨XÐ-=ÀÇÁÐQYÒAYò ð
ˆñ 
ñ ØØó 	;ˆCØ—L‘L×$Ñ$ SÓ)ˆEØ×Ñ×!Ñ! %§.¡.´#³%Ó8×@Ñ@ÀÔEØ�|Š|Ø—‘×#Ñ# E§L¡L´#³%Ó8×@Ñ@ÀÔEØ�M‰M×Ñ˜e×.Ñ.×4Ñ4´c³eÓ<×DÑDÀSÔIØ�O‰O˜EŸL™LÑ)×1Ñ1°#Ô6Ü�K‰KÐ/°Ö:ð	;ð ùó
s   ž,F c                óŒ   — | j                   j                  «       D ]'  }|j                  |k(  sŒ|�|j                  |k(  sŒ%|c S  y)zŒReturn the first registered record matching ``model_id``.

        When ``provider`` is given, restrict the match to that provider.
        N)r„   ÚvaluesrN   rO   )rp   rN   rO   rŸ   s       r   rœ   zModelRegistry.getÍ   sG   € ð
 —<‘<×&Ñ&Ó(ò 	ˆCØ�|‰|˜xÓ'¨XÐ-=ÀÇÁÐQYÓAYØ’
ð	ð r   c                ó¦   — | j                   j                  |t        «       «      D �cg c]  }|| j                  v r| j                  |   ‘Œ! c}S c c}w )z%List models from a specific provider.)r…   rœ   rˆ   r„   )rp   rO   Úmids      r   Úlist_by_providerzModelRegistry.list_by_provider×   sN   € ð ×(Ñ(×,Ñ,¨X´s³uÓ=ö
àØ�d—l‘lÑ"ð �L‰L˜Óò
ð 	
ùò 
ó   §$Ac                ó¦   — | j                   j                  |t        «       «      D �cg c]  }|| j                  v r| j                  |   ‘Œ! c}S c c}w )zList models in a family.)r†   rœ   rˆ   r„   )rp   rR   r¥   s      r   Úlist_by_familyzModelRegistry.list_by_familyß   óL   € ð —‘×*Ñ*¨6´3³5Ó9ö
àØ�d—l‘lÑ"ð �L‰L˜Óò
ð 	
ùò 
r§   c                óâ   — t        |t        «      r|j                  n|}| j                  j	                  |t        «       «      D �cg c]  }|| j                  v r| j                  |   ‘Œ! c}S c c}w )zList models of a given type.)Ú
isinstancer(   r{   r‡   rœ   rˆ   r„   )rp   rS   Útype_keyr¥   s       r   Úlist_by_typezModelRegistry.list_by_typeç   sb   € ä'1°*¼iÔ'H�:×#Ò#Èjˆð —}‘}×(Ñ(¨´3³5Ó9ö
àØ�d—l‘lÑ"ð �L‰L˜Óò
ð 	
ùò 
s   Á$A,c                ó¦   — | j                   j                  |t        «       «      D �cg c]  }|| j                  v r| j                  |   ‘Œ! c}S c c}w )z List models with a given status.)r‰   rœ   rˆ   r„   )rp   rc   r¥   s      r   Úlist_by_statuszModelRegistry.list_by_statusð   rª   r§   c                óÂ   — | j                   j                  t        j                  t	        «       «      D �cg c]  }|| j
                  v r| j
                  |   ‘Œ! c}S c c}w )zList all active models.)r‰   rœ   r	   r   rˆ   r„   )rp   r¥   s     r   Úlist_activezModelRegistry.list_activeø   sR   € ð —‘×*Ñ*¬;×+=Ñ+=¼s»uÓEö
àØ�d—l‘lÑ"ð �L‰L˜Óò
ð 	
ùò 
s   µ$Ac                óv   — | j                   j                  «       D �cg c]  }|j                  sŒ|‘Œ c}S c c}w )z"List all locally available models.)r„   r£   rW   ©rp   Úms     r   Ú
list_localzModelRegistry.list_local   s+   € àŸ<™<×.Ñ.Ó0ÖF�a°A×4EÓ4E’ÒFÐFùÒFó   �6¯6c                óv   — | j                   j                  «       D �cg c]  }|j                  sŒ|‘Œ c}S c c}w )zList all free models.)r„   r£   rq   r´   s     r   Ú	list_freezModelRegistry.list_free  s)   € àŸ<™<×.Ñ.Ó0Ö>�a°A·I³I’Ò>Ð>ùÒ>r·   c                óH   — t        | j                  j                  «       «      S )zList all registered models.)Úlistr„   r£   ro   s    r   Úlist_allzModelRegistry.list_all  s   € ä�D—L‘L×'Ñ'Ó)Ó*Ð*r   )rO   rR   rS   rc   Ú
local_onlyÚ	free_onlyre   c               ó°  — t        | j                  j                  «       «      }|r|D �	cg c]  }	|	j                  |k(  sŒ|	‘Œ }}	|r|D �	cg c]  }	|	j                  |k(  sŒ|	‘Œ }}	|rGt        |t        «      r|j                  n|}
|D �	cg c]  }	|	j                  j                  |
k(  sŒ|	‘Œ  }}	|r|D �	cg c]  }	|	j                  |k(  sŒ|	‘Œ }}	|�|D �	cg c]  }	|	j                  |k(  sŒ|	‘Œ }}	|�|D �	cg c]  }	|	j                  |k(  sŒ|	‘Œ }}	|r|D �	cg c]  }	|	j                  |k(  sŒ|	‘Œ }}	|S c c}	w c c}	w c c}	w c c}	w c c}	w c c}	w c c}	w )z$Search models with multiple filters.)r»   r„   r£   rO   rR   r¬   r(   r{   rS   rc   rW   rq   re   )rp   rO   rR   rS   rc   r½   r¾   re   Úresultsrµ   r­   s              r   ÚsearchzModelRegistry.search  sG  € ô �t—|‘|×*Ñ*Ó,Ó-ˆáØ")ÖD˜Q¨Q¯Z©Z¸8Ó-C’qÐDˆGÐDÙØ")Ö@˜Q¨Q¯X©X¸Ó-?’qÐ@ˆGÐ@ÙÜ+5°jÄ)Ô+L�z×'Ò'ÐR\ˆHØ")ÖL˜Q¨Q¯\©\×-?Ñ-?À8Ó-K’qÐLˆGÐLÙØ")Ö@˜Q¨Q¯X©X¸Ó-?’qÐ@ˆGÐ@ØÐ!Ø")ÖM˜Q¨Q×->Ñ->À*Ó-L’qÐMˆGÐMØÐ Ø")ÖD˜Q¨Q¯Y©Y¸)Ó-C’qÐDˆGÐDÙØ")Ö>˜Q¨Q¯W©W¸Ó-=’qÐ>ˆGÐ>àˆùò Eùâ@ùò Mùâ@ùâMùâDùâ>sR   ªD5¿D5ÁD:Á D:Â
D?Â)D?Â5EÃ
EÃE	Ã+E	Ã7EÄEÄEÄ-Ec                óô  — | j                  ||«      }|€y|j                  j                  d«      }|�|| j                  vry|j                  }|j                  }|j
                  }|j                  }	 |j                  di |¤Ž ||j                  k7  rp| j                  j                  |t        «       «      j                  |«       | j                  j                  |j                  t        «       «      j                  |«       ||j                  k7  r~|r3| j                  j                  |t        «       «      j                  |«       |j                  r=| j                  j                  |j                  t        «       «      j                  |«       ||j
                  k7  r„| j                  j                  |j                  t        «       «      j                  |«       | j                  j                  |j
                  j                  t        «       «      j                  |«       |	|j                  k7  rF| j                   |	   j                  |«       | j                   |j                     j                  |«       |S )z‰Update model metadata. Returns updated record or None.

        Looks up the record by ``model_id`` (and optional ``provider``).
        Nr”   r   )rœ   rl   r„   rO   rR   rS   rc   r|   r…   rˆ   r�   r•   r–   r†   r‡   r{   r‰   )
rp   rN   rO   ry   r‘   rz   Úold_providerÚ
old_familyÚold_typeÚ
old_statuss
             r   r|   zModelRegistry.update,  sÏ  € ð
 —‘˜ 8Ó,ˆØˆ=ØØ�n‰n× Ñ  Ó1ˆØˆ;˜# T§\¡\Ñ1ØØ—~‘~ˆØ—\‘\ˆ
Ø×#Ñ#ˆØ—\‘\ˆ
àˆ�‰Ñ�vÒà˜5Ÿ>™>Ò)Ø×Ñ×!Ñ! ,´³Ó6×>Ñ>¸sÔCØ×Ñ×(Ñ(¨¯©¼»Ó?×CÑCÀCÔHØ˜Ÿ™Ò%ÙØ—‘×#Ñ# J´³Ó6×>Ñ>¸sÔCØ�|Š|Ø—‘×*Ñ*¨5¯<©<¼»Ó?×CÑCÀCÔHØ�u×'Ñ'Ò'Ø�M‰M×Ñ˜hŸn™n¬c«eÓ4×<Ñ<¸SÔAØ�M‰M×$Ñ$ U×%5Ñ%5×%;Ñ%;¼S»UÓC×GÑGÈÔLØ˜Ÿ™Ò%Ø�O‰O˜JÑ'×/Ñ/°Ô4Ø�O‰O˜EŸL™LÑ)×-Ñ-¨cÔ2Øˆr   c                ó,   — t        | j                  «      S )z"Total number of registered models.)Úlenr„   ro   s    r   ÚcountzModelRegistry.countN  s   € ä�4—<‘<Ó Ð r   c                ó\   — t        | j                  j                  |t        «       «      «      S rn   )rÈ   r…   rœ   rˆ   )rp   rO   s     r   Úcount_by_providerzModelRegistry.count_by_providerR  s"   € Ü�4×$Ñ$×(Ñ(¨´3³5Ó9Ó:Ð:r   c                ó¼   ‡‡— ‰�-t        ˆˆfd„| j                  j                  «       D «       «      S t        ˆfd„| j                  j                  «       D «       «      S )Nc              3  ó^   •K  — | ]$  }|j                   ‰k(  xr |j                  ‰k(  –— Œ& y ­wrn   )rN   rO   )Ú.0rŸ   rN   rO   s     €€r   ú	<genexpr>z$ModelRegistry.has.<locals>.<genexpr>W  s3   øè ø€ ò àð —‘ Ñ(ÒE¨S¯\©\¸XÑ-EÓEñùs   ƒ*-c              3  ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wrn   )rN   )rÎ   rŸ   rN   s     €r   rÏ   z$ModelRegistry.has.<locals>.<genexpr>[  s   øè ø€ ÒM°�3—<‘< 8Õ+ÑMùs   ƒ)Úanyr„   r£   )rp   rN   rO   s    ``r   ÚhaszModelRegistry.hasU  sP   ù€ ØÐÜô àŸ<™<×.Ñ.Ó0ôó ð ô ÓM°t·|±|×7JÑ7JÓ7LÔMÓMÐMr   )r}   r~   )r‘   rL   r}   rM   )r‘   rL   r}   rL   rn   )rN   rM   rO   rP   r}   rC   )rN   rM   rO   rP   r}   úModelRecord | None)rO   rM   r}   úlist[ModelRecord])rR   rM   r}   rÔ   )rS   zModelType | strr}   rÔ   )rc   r	   r}   rÔ   )r}   rÔ   )rO   rP   rR   rP   rS   zModelType | str | Nonerc   zModelStatus | Noner½   úbool | Noner¾   rÕ   re   zModelTrust | Noner}   rÔ   )rN   rM   rO   rP   ry   r   r}   rÓ   )r}   Úint)rO   rM   r}   rÖ   )r   r   r   r   rŒ   r’   r™   r¡   rœ   r¦   r©   r®   r°   r²   r¶   r¹   r¼   rÁ   r|   rÉ   rË   rÒ   r   r   r   r‚   r‚   �   sÍ   „ ñóóDóô(ô$ó
ó
ó
ó
ó
óGó?ó+ð  $Ø!Ø-1Ø%)Ø"&Ø!%Ø#'ñð ðð ð	ð
 +ðð #ðð  ðð ðð !ðð 
óô@ óD!ó;õNr   r‚   )r   Ú
__future__r   Úloggingrx   Údataclassesr   r   Úenumr   Útypingr   Ú	getLoggerr   r—   rM   r	   r   r(   r8   rB   rL   r‚   r   r   r   ú<module>rÝ      s©   ðñ
õ #ã Û ß (Ý Ý à	ˆ×	Ñ	˜8Ó	$€ô�#�tô ô��dô ô	��Tô 	ô�c˜4ô ð ÷
ð 
ó ð
ð ÷=(ð =(ó ð=(÷@LNò LNr   