Ë
    Û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e G d„ d«      «       Z G d„ d«      Zy)uz  Provider Registry â€” metadata store for all known providers.

Stores:
- provider name, status, free tier
- registration, card requirement
- API, available models, rate limits, token limits
- conditions, expiration, last checked, source, trust
- Free Score (optional): free, no-card, no-expiration, API availability,
  limit size, stability, official source, local availability
é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚAnyc                  ó$   — e Zd ZdZdZdZdZdZdZy)ÚProviderStatusz!Operational status of a provider.ÚactiveÚdegradedÚinactiveÚblockedÚunknownN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚACTIVEÚDEGRADEDÚINACTIVEÚBLOCKEDÚUNKNOWN© ó    úP/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/provider_registry.pyr	   r	      s   „ Ù+Ø€FØ€HØ€HØ€GØ�Gr   r	   c                  ó$   — e Zd ZdZdZdZdZdZdZy)ÚProviderTrustzTrust level of a provider.Ú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                  ó$   — e Zd ZdZdZdZdZdZdZy)ÚProviderFreeScorez!Free tier scoring classification.Ú	excellentÚgoodÚfairÚpoorÚnoneN)	r   r   r   r   Ú	EXCELLENTÚGOODÚFAIRÚPOORÚNONEr   r   r   r&   r&   )   s   „ Ù+Ø€IØ€DØ€DØ€DØ�Dr   r&   c                  óD  — e Zd ZU 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<   d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<   dZded<   dZded<    e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#<   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)<   e$jJ                  Z&d*ed+<    ee'¬«      Z(d,ed-<   e)d2d.„«       Z*e)d2d/„«       Z+d3d0„Z,d4d1„Z-y)5ÚProviderRecordz"Complete provider metadata record.ÚstrÚproviderr	   ÚstatusFÚboolÚ	free_tierÚregistration_requiredÚcard_requiredNz
str | NoneÚapi_baseTÚapi_key_requiredÚapi_available)Údefault_factoryz	list[str]Úavailable_modelsÚ
rate_limitz
int | NoneÚrate_limit_valueÚtoken_limitÚmax_context_tokensÚ
conditionszfloat | NoneÚ
expirationÚfloatÚlast_checkedÚsourcer   ÚtrustÚfreeÚno_cardÚno_expirationÚapi_availabilityÚ
limit_sizeg        Ú	stabilityÚofficial_sourceÚlocal_availabilityr&   Ú
free_scorezdict[str, Any]Úmetadatac                ó6   — | j                   xs | j                  S ©N)r7   rI   ©Úselfs    r   Úis_freezProviderRecord.is_freec   s   € à�~‰~Ò* §¡Ð*r   c                ó   — | j                   S rT   )rP   rU   s    r   Úis_localzProviderRecord.is_localg   s   € à×&Ñ&Ð&r   c                óš   — |j                  «       D ]  \  }}t        | |«      sŒt        | ||«       Œ! t        j                  «       | _        y)zUpdate fields in-place.N)ÚitemsÚhasattrÚsetattrÚtimerF   )rV   ÚkwargsÚkeyÚvalues       r   ÚupdatezProviderRecord.updatek   sA   € à Ÿ,™,›.ò 	*‰JˆC�Ü�t˜SÕ!Ü˜˜c 5Õ)ð	*ô !ŸI™I›KˆÕr   c                ó:  — d}| j                   r|dz  }| j                  r|dz  }| j                  �| j                  dk  r|dz  }| j                  t        j
                  k(  r|dz  }| j                  t        j                  k(  r|dz  }| j                  dk  r|dz  }n| j                  dk  r|dz  }|dk\  rt        j                  S |dk\  rt        j                  S |dk\  rt        j                  S | j                  rt        j                  S t        j                  S )	zÚCompute free tier score based on conditions.

        Penalties:
        - card required
        - trial only
        - low limits
        - academic-only
        - unofficial source
        - unstable service
        r   é   é   iè  g      à?gš™™™™™é?é   é   )r9   r8   rM   rH   r   r$   r#   rN   r&   r/   r.   r-   rI   r,   r0   )rV   Ú	penaltiess     r   Úcompute_free_scorez!ProviderRecord.compute_free_scorer   s  € ð ˆ	à×ÒØ˜‰NˆIØ×%Ò%Ø˜‰NˆIØ�?‰?Ð&¨4¯?©?¸TÒ+AØ˜‰NˆIØ�:‰:œ×1Ñ1Ò1Ø˜‰NˆIØ�:‰:œ×0Ñ0Ò0Ø˜‰NˆIØ�>‰>˜CÒØ˜‰N‰IØ�^‰^˜cÒ!Ø˜‰NˆIà˜Š>Ü$×)Ñ)Ð)Ø˜!Š^Ü$×)Ñ)Ð)Ø˜!Š^Ü$×)Ñ)Ð)Ø�YŠYÜ$×.Ñ.Ð.Ü ×%Ñ%Ð%r   )Úreturnr6   )r_   r   rj   ÚNone)rj   r&   ).r   r   r   r   Ú__annotations__r	   r   r5   r7   r8   r9   r:   r;   r<   r   Úlistr>   r?   r@   rA   rB   rC   rD   r^   rF   rG   r   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r&   r0   rQ   ÚdictrR   ÚpropertyrW   rY   rb   ri   r   r   r   r2   r2   2   s…  … á,àƒMØ+×3Ñ3€FˆNÓ3ð €IˆtÓØ"'Ð˜4Ó'Ø€M�4Óð  €HˆjÓØ!Ð�dÓ!Ø€M�4ÓÙ"'¸Ô"=Ð�iÓ=ð "€J�
Ó!Ø#'Ð�jÓ'Ø"€K�Ó"Ø%)Ð˜
Ó)ð "€J�
Ó!Ø#€J�Ó#Ù°·	±	Ô:€L�%Ó:ð €FˆJÓØ(×0Ñ0€Eˆ=Ó0ð €Dˆ$ÓØ€GˆTÓØ€M�4ÓØ"Ð�dÓ"Ø!€J�
Ó!Ø€IˆuÓØ!€O�TÓ!Ø$Ð˜Ó$ð %6×$:Ñ$:€JÐ!Ó:ñ  %°TÔ:€HˆnÓ:àò+ó ð+ð ò'ó ð'ó(ô$&r   r2   c                  ó¦   — e Zd Z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„Zdddddœ	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zy)ÚProviderRegistryzpRegistry for provider metadata.

    Provides CRUD operations, health tracking, and free score computation.
    c                ó®   — i | _         t        D �ci c]  }|t        «       “Œ c}| _        t        D �ci c]  }|t        «       “Œ c}| _        y c c}w c c}w rT   )Ú
_providersr	   ÚsetÚ
_by_statusr   Ú	_by_trust)rV   ÚsÚts      r   Ú__init__zProviderRegistry.__init__Ÿ   sO   € Ø57ˆŒä,ö;
ØˆAŒs‹u‰Hò;
ˆŒô ,ö9
ØˆAŒs‹u‰Hò9
ˆ�ùò;
ùò9
s
   �A²Ac                ó@  — || j                   |j                  <   | j                  |j                     j	                  |j                  «       | j
                  |j                     j	                  |j                  «       t        j                  d|j                  «       |S )z*Register a provider and return its record.zRegistered provider %s)	rs   r4   ru   r5   Úaddrv   rH   ÚloggerÚinfo)rV   r4   s     r   ÚregisterzProviderRegistry.register¨   sr   € à-5ˆ�‰˜×)Ñ)Ñ*Ø�‰˜Ÿ™Ñ(×,Ñ,¨X×->Ñ->Ô?Ø�‰�x—~‘~Ñ&×*Ñ*¨8×+<Ñ+<Ô=Ü�‰Ð,¨h×.?Ñ.?Ô@Øˆr   c                ó$  — || j                   vry| j                   j                  |«      }| j                  |j                     j	                  |«       | j
                  |j                     j	                  |«       t        j                  d|«       y)z+Remove a provider. Returns True if existed.FzUnregistered provider %sT)	rs   Úpopru   r5   Údiscardrv   rH   r|   r}   )rV   Úprovider_namer4   s      r   Ú
unregisterzProviderRegistry.unregister°   sm   € à §¡Ñ/ØØ—?‘?×&Ñ& }Ó5ˆØ�‰˜Ÿ™Ñ(×0Ñ0°Ô?Ø�‰�x—~‘~Ñ&×.Ñ.¨}Ô=Ü�‰Ð.°Ô>Ør   c                ó8   — | j                   j                  |«      S )zRetrieve provider by name.)rs   Úget©rV   r‚   s     r   r…   zProviderRegistry.getº   s   € à�‰×"Ñ" =Ó1Ð1r   c                ó¨   — | j                   j                  |t        «       «      D �cg c]   }|| j                  v sŒ| j                  |   ‘Œ" c}S c c}w )z#List providers with a given status.)ru   r…   rt   rs   )rV   r5   Úps      r   Úlist_by_statuszProviderRegistry.list_by_status¾   sA   € à,0¯O©O×,?Ñ,?ÀÌËÓ,NÖg qÐRSÐW[×WfÑWfÒRf�—‘ Ó"ÒgÐgùÒgó
   §A»Ac                ó¨   — | j                   j                  |t        «       «      D �cg c]   }|| j                  v sŒ| j                  |   ‘Œ" c}S c c}w )z(List providers with a given trust level.)rv   r…   rt   rs   )rV   rH   rˆ   s      r   Úlist_by_trustzProviderRegistry.list_by_trustÂ   sA   € à,0¯N©N×,>Ñ,>¸uÄcÃeÓ,LÖe qÐPQÐUY×UdÑUdÒPd�—‘ Ó"ÒeÐeùÒerŠ   c                óÄ   — | j                   j                  t        j                  t	        «       «      D �cg c]   }|| j
                  v sŒ| j
                  |   ‘Œ" c}S c c}w )zList all active providers.)ru   r…   r	   r   rt   rs   ©rV   rˆ   s     r   Úlist_activezProviderRegistry.list_activeÆ   sI   € à,0¯O©O×,?Ñ,?Ä×@UÑ@UÔWZÓW\Ó,]Öv qÐabÐfj×fuÑfuÒau�—‘ Ó"ÒvÐvùÒvs   µAÁ	Ac                óv   — | j                   j                  «       D �cg c]  }|j                  sŒ|‘Œ c}S c c}w )zList all local providers.)rs   ÚvaluesrP   rŽ   s     r   Ú
list_localzProviderRegistry.list_localÊ   s+   € àŸ?™?×1Ñ1Ó3ÖL�a°q×7KÓ7K’ÒLÐLùÒLó   �6¯6c                óv   — | j                   j                  «       D �cg c]  }|j                  sŒ|‘Œ c}S c c}w )zList all free providers.)rs   r‘   rW   rŽ   s     r   Ú	list_freezProviderRegistry.list_freeÎ   s)   € àŸ?™?×1Ñ1Ó3ÖA�a°q·y³y’ÒAÐAùÒAr“   c                óH   — t        | j                  j                  «       «      S )zList all registered providers.)rm   rs   r‘   rU   s    r   Úlist_allzProviderRegistry.list_allÒ   s   € ä�D—O‘O×*Ñ*Ó,Ó-Ð-r   N)r5   rH   Ú
local_onlyÚ	free_onlyc               ó|  — t        | j                  j                  «       «      }|r|D �cg c]  }|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Œ|‘Œ }}|S c c}w c c}w c c}w c c}w )zSearch providers with filters.)rm   rs   r‘   r5   rH   rP   rW   )rV   r5   rH   r˜   r™   Úresultsrˆ   s          r   ÚsearchzProviderRegistry.searchÖ   s»   € ô �t—‘×-Ñ-Ó/Ó0ˆáØ")Ö@˜Q¨Q¯X©X¸Ó-?’qÐ@ˆGÐ@ÙØ")Ö>˜Q¨Q¯W©W¸Ó-=’qÐ>ˆGÐ>ØÐ!Ø")ÖP˜Q¨Q×-AÑ-AÀZÓ-O’qÐPˆGÐPØÐ Ø")ÖD˜Q¨Q¯Y©Y¸)Ó-C’qÐDˆGÐDàˆùò Aùâ>ùâPùâDs.   ªB*¿B*ÁB/Á B/Á,B4ÂB4ÂB9Â"B9c                óê  — | j                   j                  |«      }|€y|j                  }|j                  } |j                  di |¤Ž ||j                  k7  rF| j
                  |   j                  |«       | j
                  |j                     j                  |«       ||j                  k7  rF| j                  |   j                  |«       | j                  |j                     j                  |«       |S )z9Update provider metadata. Returns updated record or None.Nr   )	rs   r…   r5   rH   rb   ru   r�   r{   rv   )rV   r‚   r_   r4   Ú
old_statusÚ	old_trusts         r   rb   zProviderRegistry.updateì   sÃ   € à—?‘?×&Ñ& }Ó5ˆØÐØØ—_‘_ˆ
Ø—N‘Nˆ	Øˆ�‰Ñ!˜&Ò!à˜Ÿ™Ò(Ø�O‰O˜JÑ'×/Ñ/°Ô>Ø�O‰O˜HŸO™OÑ,×0Ñ0°Ô?Ø˜Ÿ™Ò&Ø�N‰N˜9Ñ%×-Ñ-¨mÔ<Ø�N‰N˜8Ÿ>™>Ñ*×.Ñ.¨}Ô=àˆr   c                ó†   — i }| j                   j                  «       D ]!  \  }}|j                  «       }||_        |||<   Œ# |S )z&Compute free scores for all providers.)rs   r[   ri   rQ   )rV   ÚscoresÚnamer4   Úscores        r   Úcompute_free_scoresz$ProviderRegistry.compute_free_scoresþ   sM   € à/1ˆØ"Ÿo™o×3Ñ3Ó5ò 	!‰NˆD�(Ø×/Ñ/Ó1ˆEØ"'ˆHÔØ ˆF�4ŠLð	!ð ˆr   c                ó,   — t        | j                  «      S rT   )Úlenrs   rU   s    r   ÚcountzProviderRegistry.count  s   € Ü�4—?‘?Ó#Ð#r   c                ó   — || j                   v S rT   )rs   r†   s     r   ÚhaszProviderRegistry.has
  s   € Ø §¡Ð/Ð/r   )rj   rk   )r4   r2   rj   r2   )r‚   r3   rj   r6   )r‚   r3   rj   úProviderRecord | None)r5   r	   rj   úlist[ProviderRecord])rH   r   rj   r«   )rj   r«   )
r5   zProviderStatus | NonerH   zProviderTrust | Noner˜   úbool | Noner™   r¬   rj   r«   )r‚   r3   r_   r   rj   rª   )rj   zdict[str, ProviderFreeScore])rj   Úint)r   r   r   r   ry   r~   rƒ   r…   r‰   rŒ   r�   r’   r•   r—   rœ   rb   r¤   r§   r©   r   r   r   rq   rq   ™   s—   „ ñó

óóó2óhófówóMóBó.ð )-Ø&*Ø"&Ø!%ñð &ðð $ð	ð
  ðð ðð 
óó,ó$ó$ô0r   rq   )r   Ú
__future__r   Úloggingr^   Údataclassesr   r   Úenumr   Útypingr   Ú	getLoggerr   r|   r3   r	   r   r&   r2   rq   r   r   r   ú<module>r´      sƒ   ðñ	õ #ã Û ß (Ý Ý à	ˆ×	Ñ	˜8Ó	$€ô�S˜$ô ô�C˜ô ô˜˜Tô ð ÷c&ð c&ó ðc&÷Lr0ò r0r   