Ë
    ÛJêj|3  ã                  óê   — 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 ddl	m
Z
 ddlmZmZmZmZmZmZ ddlmZmZmZ  ej,                  e«      Z G d	„ d
ee«      Ze G d„ d«      «       Z G d„ d«      Zy)uK   Model Intelligence â€” discovery, validation, and classification of models.é    )ÚannotationsN)Ú	dataclass)ÚEnum)ÚAny)ÚModelFreeStatusÚModelRecordÚModelRegistryÚModelStatusÚ
ModelTrustÚ	ModelType)ÚProviderRecordÚProviderRegistryÚProviderTrustc                  ó    — e Zd ZdZdZdZdZdZy)ÚDiscoveryCategoryz/Model category for intelligence classification.ÚfreeÚnewÚfree_for_testÚfree_for_studyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚFREEÚNEWÚFREE_FOR_TESTÚFREE_FOR_STUDY© ó    úQ/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/model_intelligence.pyr   r      s   „ Ù9Ø€DØ
€CØ#€MØ%�Nr   r   c                  ót   — 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<   y)ÚModelDiscoveryConfigz-Configuration for model discovery/harvesting.Nzlist[str] | NoneÚ	providersg      8@ÚfloatÚcheck_interval_hoursTÚboolÚauto_classifyÚauto_registerÚvalidate_connectivityÚvalidate_functionalzlist[DiscoveryCategory] | NoneÚ
categories)r   r   r   r   r#   Ú__annotations__r%   r'   r(   r)   r*   r+   r   r   r    r"   r"   $   sP   … á7à"&€IÐÓ&Ø"&Ð˜%Ó&Ø€M�4ÓØ€M�4ÓØ"&Ð˜4Ó&Ø $Ð˜Ó$Ø15€JÐ.Ô5r   r"   c                  óª   — e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 dd„Zdd„Zdd„Ze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„Zddd„Zd d„Zy)!ÚModelIntelligenceub  Model Intelligence â€” discovery, validation, and classification.

    Manages the full model lifecycle from discovery through registry
    registration. Implements the validation pipeline:

    DISCOVERY â†’ NORMALIZATION â†’ DEDUPLICATION â†’ METADATA VALIDATION â†’
    CONNECTIVITY TEST â†’ FUNCTIONAL TEST â†’ CLASSIFICATION â†’ REGISTRY UPDATE
    Nc                ó’   — |xs
 t        «       | _        |xs
 t        «       | _        |xs
 t	        «       | _        g | _        g | _        y ©N)r	   Úmodel_registryr   Úprovider_registryr"   ÚconfigÚ_discoveredÚ_validation_log)Úselfr1   r2   r3   s       r    Ú__init__zModelIntelligence.__init__;   sD   € ð -Ò?´³ˆÔØ!2Ò!HÔ6FÓ6HˆÔØÒ6Ô 4Ó 6ˆŒØ&(ˆÔØ57ˆÕr   c                ó|  — g }| j                   j                  «       }| j                  j                  r2|D �cg c]'  }|j                  | j                  j                  v sŒ&|‘Œ) }}|D ]$  }| j                  |«      }|j                  |«       Œ& t        j                  dt        |«      t        |«      «       |S c c}w )z.Discover models from all registered providers.z&Discovered %d models from %d providers)
r2   Úlist_activer3   r#   ÚproviderÚ_discover_provider_modelsÚextendÚloggerÚinfoÚlen)r6   Ú
discoveredr#   Úpr:   Úmodelss         r    Údiscover_from_providersz)ModelIntelligence.discover_from_providersK   s¥   € à(*ˆ
Ø×*Ñ*×6Ñ6Ó8ˆ	à�;‰;× Ò Ø$-ÖU˜q°·±¸t¿{¹{×?TÑ?TÒ1TšÐUˆIÐUà!ò 	&ˆHØ×3Ñ3°HÓ=ˆFØ×Ñ˜fÕ%ð	&ô 	�‰Ð<¼cÀ*»oÌsÐS\Ë~Ô^ØÐùò Vs   ·'B9ÁB9c                ó  — g }|j                   D ]x  }t        ||j                  |j                  |j                  |j
                  | j                  |j                  «      t        j                  «       ¬«      }|j                  |«       Œz |S )z'Discover models from a single provider.)Úmodel_idr:   Úapi_availableÚlocal_availableÚsourceÚtrustÚlast_checked)
Úavailable_modelsr   r:   rF   Úlocal_availabilityrH   Ú"_map_provider_trust_to_model_trustrI   ÚtimeÚappend)r6   r:   rB   rE   Úrecords        r    r;   z+ModelIntelligence._discover_provider_modelsZ   s{   € à$&ˆà ×1Ñ1ò 
	"ˆHÜ Ø!Ø!×*Ñ*Ø&×4Ñ4Ø (× ;Ñ ;Ø—‘Ø×=Ñ=¸h¿n¹nÓMÜ!ŸY™Y›[ôˆFð �M‰M˜&Õ!ð
	"ð ˆr   c           
     ór  — t         j                  t        j                  t         j                  t        j                  t         j                  t        j                  t         j
                  t        j
                  t         j                  t        j                  i}|j                  | t        j                  «      S )z*Map ProviderTrust enum to ModelTrust enum.)r   ÚOFFICIALr   ÚVERIFIEDÚ	COMMUNITYÚ
UNOFFICIALÚUNKNOWNÚget)rI   Úmappings     r    rM   z4ModelIntelligence._map_provider_trust_to_model_trustl   sy   € ô ×"Ñ"¤J×$7Ñ$7Ü×"Ñ"¤J×$7Ñ$7Ü×#Ñ#¤Z×%9Ñ%9Ü×$Ñ$¤j×&;Ñ&;Ü×!Ñ!¤:×#5Ñ#5ð
ˆð �{‰{˜5¤*×"4Ñ"4Ó5Ð5r   c                ó‚   — g }|j                  dg «      D ]'  }| j                  |«      }|sŒ|j                  |«       Œ) |S )z(Discover models from configuration dict.rB   )rW   Ú_normalize_model_configrO   )r6   r3   rB   ÚmrP   s        r    Údiscover_from_configz&ModelIntelligence.discover_from_configx   sG   € à$&ˆØ—‘˜H bÓ)ò 	&ˆAØ×1Ñ1°!Ó4ˆFÚØ—‘˜fÕ%ð	&ð ˆr   c                óÒ  — 	 t        |j                  dd«      «      }|syt        |t        |j                  dd«      «      t        |j                  dd«      «      t        |j                  dd«      «      |j                  d	«      |j                  d
d«      |j                  dd«      |j                  dd«      ¬«      S # t        $ r }t
        j                  d|«       Y d}~yd}~ww xY w)z-Normalize a model config dict to ModelRecord.rE   Ú Nr:   ÚunknownÚversionÚ
model_typeÚchatÚcontext_windowrG   FrF   TÚfree_status)rE   r:   r`   ra   rc   rG   rF   rd   z$Failed to normalize model config: %s)ÚstrrW   r   r   Ú	Exceptionr=   Úwarning)r6   r3   rE   Úexcs       r    rZ   z)ModelIntelligence._normalize_model_config�   sÇ   € ð	Ü˜6Ÿ:™: j°"Ó5Ó6ˆHÙØÜØ!Ü˜VŸZ™Z¨
°IÓ>Ó?Ü˜FŸJ™J y°"Ó5Ó6Ü$ V§Z¡Z°¸fÓ%EÓFØ%Ÿz™zÐ*:Ó;Ø &§
¡
Ð+<¸eÓ DØ$Ÿj™j¨¸$Ó?Ø"ŸJ™J }°iÓ@ô	ð 	øô ò 	Ü�N‰NÐAÀ3ÔGÜûð	ús   ‚B=  BB= Â=	C&ÃC!Ã!C&c                ó  — |j                   j                  «       j                  «       |_         dddddœ}|j                  j                  «       |v r"||j                  j                  «          |_        |j                  t
        j                  k(  r|j                   s	 |j                  t        j                  k(  rt        j                  |_        |j                  t        j                  k(  rt        j                  |_        |S )z,Normalize model metadata to standard format.ÚgeminiÚopenaiÚazureÚlitellm)ÚgoogleÚgptzazure-openaizlocal-ai)rE   ÚlowerÚstripr:   ra   r   ÚCHATrI   r   rV   rT   Ústatusr
   ÚACTIVE)r6   ÚmodelÚaliasess      r    Ú	normalizezModelIntelligence.normalize™   sÂ   € àŸ™×-Ñ-Ó/×5Ñ5Ó7ˆŒð ØØ#Ø!ñ	#
ˆð �>‰>×ÑÓ! WÑ,Ø$ U§^¡^×%9Ñ%9Ó%;Ñ<ˆEŒNà×ÑœyŸ~™~Ò-°e·n²nØà�;‰;œ*×,Ñ,Ò,Ü$×.Ñ.ˆEŒKØ�<‰<œ;×.Ñ.Ò.Ü&×-Ñ-ˆEŒLàˆr   c                óª   — i }|D ]4  }|j                   }||vs|j                  ||   j                  kD  sŒ0|||<   Œ6 t        |j                  «       «      S )z8Deduplicate models by model_id, keeping the most recent.)rE   rJ   ÚlistÚvalues)r6   rB   Úseenru   Úkeys        r    ÚdeduplicatezModelIntelligence.deduplicate´   sY   € à')ˆØò 	"ˆEØ—.‘.ˆCØ˜$‰ %×"4Ñ"4°t¸C±y×7MÑ7MÓ"MØ!��S’	ð	"ô �D—K‘K“MÓ"Ð"r   c                óö  — g }|j                   s|j                  d«       |j                  s|j                  d«       |j                  �-|j                  dk  r|j                  d|j                  › �«       |j                  �-|j                  dk  r|j                  d|j                  › �«       |j                   t        |«      dk(  |t        j                  «       dœ}| j                  j                  |«       |S )zValidate model metadata.zmodel_id is emptyzprovider is emptyr   z%context_window must be positive, got z!max_tokens must be positive, got )rE   ÚvalidÚissuesÚ	timestamp)rE   rO   r:   rc   Ú
max_tokensr?   rN   r5   )r6   ru   r€   Úresults       r    Úvalidate_metadataz#ModelIntelligence.validate_metadataÁ   sÚ   € àˆà�~Š~Ø�M‰MÐ-Ô.Ø�~Š~Ø�M‰MÐ-Ô.Ø×ÑÐ+°×0DÑ0DÈÒ0IØ�M‰MÐAÀ%×BVÑBVÐAWÐXÔYØ×ÑÐ'¨E×,<Ñ,<ÀÒ,AØ�M‰MÐ=¸e×>NÑ>NÐ=OÐPÔQð Ÿ™Ü˜“[ AÑ%ØÜŸ™›ñ	
ˆð 	×Ñ×#Ñ# FÔ+Øˆr   c                óR  — | j                   j                  |j                  «      }|€|j                  dddœS |j                  xs |j
                  }|j                  ||j                  j                  |j
                  |j                  dœ}| j                  j                  |«       |S )z$Test connectivity to model endpoint.Fzprovider not found)rE   Ú	reachableÚerror)rE   r†   Úprovider_statusÚlocalrF   )r2   rW   r:   rE   Úapi_availabilityrG   rs   ÚvaluerF   r5   rO   )r6   ru   r:   r†   rƒ   s        r    Útest_connectivityz#ModelIntelligence.test_connectivity×   sœ   € à×)Ñ)×-Ñ-¨e¯n©nÓ=ˆØÐà!ŸN™NØ"Ø-ñð ð ×-Ñ-ÒF°×1FÑ1Fˆ	àŸ™Ø"Ø'Ÿ™×4Ñ4Ø×*Ñ*Ø%×3Ñ3ñ
ˆð 	×Ñ×#Ñ# FÔ+Øˆr   c                óv  — |j                   dddœ}|j                  s.|j                  s"d|d<   | j                  j	                  |«       |S | j
                  j                  |j                   «      }d|d<   |xr |j                  t        j                  k(  |d<   ||d<   | j                  j	                  |«       |S )	z#Run basic functional test on model.F)rE   ÚtestedÚpassedzmodel not reachabler‡   TrŽ   r�   Ú
registered)
rE   rF   rG   r5   rO   r1   Úhasrs   r
   rt   )r6   ru   rƒ   r�   s       r    Úfunctional_testz!ModelIntelligence.functional_testì   s²   € ð Ÿ™ØØñ"
ˆð ×"Ò"¨5×+@Ò+@Ø3ˆF�7‰OØ× Ñ ×'Ñ'¨Ô/ØˆMà×(Ñ(×,Ñ,¨U¯^©^Ó<ˆ
ØˆˆxÑØ%ÒL¨%¯,©,¼+×:LÑ:LÑ*LˆˆxÑØ)ˆˆ|Ñà×Ñ×#Ñ# FÔ+Øˆr   c                óH  — |j                   t        j                  k(  r|j                  st        j                  S |j                   t        j
                  k(  rt        j
                  S |j                   t        j                  k(  rt        j                  S t        j                  S )z)Classify model into a discovery category.)rd   r   r   Úcard_requiredr   r   r   r   )r6   ru   s     r    ÚclassifyzModelIntelligence.classify  sv   € à×Ñ¤× 4Ñ 4Ò4¸U×=PÒ=PÜ$×)Ñ)Ð)Ø×Ñ¤/×"?Ñ"?Ò?Ü$×2Ñ2Ð2Ø×Ñ¤/×"@Ñ"@Ò@Ü$×3Ñ3Ð3ä$×(Ñ(Ð(r   c                óâ  — d}|j                   t        j                  k(  r|dz  }nE|j                   t        j                  k(  r|dz  }n"|j                   t        j                  k(  r|dz  }|j
                  t        j                  k(  r|dz  }nE|j
                  t        j                  k(  r|dz  }n"|j
                  t        j                  k(  r|dz  }|j                  �S|j                  dk\  r|dz  }n>|j                  dk\  r|dz  }n)|j                  dk\  r|dz  }n|j                  d	k\  r|d
z  }|j                  }t        |j                  |j                  |j                  |j                   |j"                  |j$                  g«      }|t'        |dz  d«      z  }|j(                  t*        j,                  k(  r|dz  }n"|j(                  t*        j.                  k(  r|d
z  }t'        |d«      dz  S )z%Score model suitability (0.0 to 1.0).g        é   é   é
   é   i ô i }  i@  iÐ  é   g¤p=
×£
@g      Y@)rd   r   r   r   r   rI   r   rR   rS   rT   rc   ÚcapabilitiesÚsumÚvisionÚtool_callingÚstructured_outputÚ	reasoningÚcodingÚ
multimodalÚminrs   r
   rt   ÚDEGRADED)r6   ru   ÚscoreÚcapsÚ	cap_scores        r    Úscore_modelzModelIntelligence.score_model  s¿  € àˆà×Ñ¤× 4Ñ 4Ò4Ø�R‰K‰EØ×Ñ¤/×"?Ñ"?Ò?Ø�R‰K‰EØ×Ñ¤/×"@Ñ"@Ò@Ø�R‰KˆEà�;‰;œ*×-Ñ-Ò-Ø�R‰K‰EØ�[‰[œJ×/Ñ/Ò/Ø�R‰K‰EØ�[‰[œJ×0Ñ0Ò0Ø�R‰KˆEà×ÑÐ+Ø×#Ñ# vÒ-Ø˜‘‘Ø×%Ñ%¨Ò.Ø˜‘‘Ø×%Ñ%¨Ò-Ø˜‘‘Ø×%Ñ%¨Ò-Ø˜‘
�à×!Ñ!ˆÜØ�K‰KØ×ÑØ×"Ñ"Ø�N‰NØ�K‰KØ�O‰Oð
ó ˆ	ð 	”�Y Ñ% rÓ*Ñ*ˆà�<‰<œ;×-Ñ-Ò-Ø�R‰K‰EØ�\‰\œ[×1Ñ1Ò1Ø�Q‰JˆEä�5˜%Ó  5Ñ(Ð(r   c                óò  — |€| j                  «       }g }|D �]\  }d|j                  i}| j                  |«      }d|d<   | j                  j                  r | j
                  j                  |«       d|d<   | j                  |«      }|d   |d<   | j                  j                  r| j                  |«      }|d   |d<   | j                  j                  r&| j                  |«      }|j                  dd	«      |d
<   | j                  j                  r | j                  |«      }|j                  |d<   | j!                  |«      |d<   |j#                  |«       t$        j'                  d|j                  «       �Œ_ |S )z!Run the full validation pipeline.rE   TÚ
normalizedr�   r   Úmetadata_validr†   r�   FÚfunctional_passÚcategoryr¦   zPipeline step complete for %s)rC   rE   rw   r3   r(   r1   Úregisterr„   r)   rŒ   r*   r’   rW   r'   r•   r‹   r©   rO   r=   r>   )	r6   rB   Úresultsru   Ústep_resultÚ
validationÚconnectivityÚ
functionalr®   s	            r    Úrun_pipelinezModelIntelligence.run_pipelineB  s_  € àˆ>Ø×1Ñ1Ó3ˆFà(*ˆàó 	IˆEØ+5°u·~±~Ð*FˆKà—N‘N 5Ó)ˆEØ(,ˆK˜Ñ%à�{‰{×(Ò(Ø×#Ñ#×,Ñ,¨UÔ3Ø,0�˜LÑ)à×/Ñ/°Ó6ˆJØ,6°wÑ,?ˆKÐ(Ñ)à�{‰{×0Ò0Ø#×5Ñ5°eÓ<�Ø+7¸Ñ+D�˜KÑ(à�{‰{×.Ò.Ø!×1Ñ1°%Ó8�
Ø1;·±ÀÈ%Ó1P�Ð-Ñ.à�{‰{×(Ò(ØŸ=™=¨Ó/�Ø*2¯.©.�˜JÑ'à#'×#3Ñ#3°EÓ#:ˆK˜Ñ à�N‰N˜;Ô'Ü�K‰KÐ7¸¿¹ÖHð9	Ið< ˆr   c                ó,   — t        | j                  «      S r0   )ry   r5   )r6   s    r    Úget_validation_logz$ModelIntelligence.get_validation_logi  s   € Ü�D×(Ñ(Ó)Ð)r   )NNN)r1   zModelRegistry | Noner2   zProviderRegistry | Noner3   zModelDiscoveryConfig | NoneÚreturnÚNone)r¸   úlist[ModelRecord])r:   r   r¸   rº   )rI   r   r¸   r   )r3   údict[str, Any]r¸   rº   )r3   r»   r¸   zModelRecord | None)ru   r   r¸   r   )rB   rº   r¸   rº   )ru   r   r¸   r»   )ru   r   r¸   r   )ru   r   r¸   r$   r0   )rB   zlist[ModelRecord] | Noner¸   úlist[dict[str, Any]])r¸   r¼   )r   r   r   r   r7   rC   r;   ÚstaticmethodrM   r\   rZ   rw   r}   r„   rŒ   r’   r•   r©   rµ   r·   r   r   r    r.   r.   1   s”   „ ñð 04Ø59Ø.2ð	
8à,ð
8ð 3ð
8ð ,ð	
8ð
 
ó
8ó óð$ ò	6ó ð	6óóó0ó6#óó,ó*ó2	)ó,)ôd%ôN*r   r.   )r   Ú
__future__r   ÚloggingrN   Údataclassesr   Úenumr   Útypingr   Ú'cyberbrain26.model_layer.model_registryr   r   r	   r
   r   r   Ú*cyberbrain26.model_layer.provider_registryr   r   r   Ú	getLoggerr   r=   re   r   r"   r.   r   r   r    ú<module>rÆ      su   ðÙ Qå "ã Û Ý !Ý Ý ÷÷ ÷ñ ð 
ˆ×	Ñ	˜8Ó	$€ô&˜˜Tô &ð ÷	6ð 	6ó ð	6÷y*ò y*r   