Ë
    uPêj  ã                   ó|  — d Z ddl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  ed¬«       G d	„ d
«      «       Zdededefd„Zdedededefd„Zddedej(                  dz  defd„Zdedee   defd„Ze
e	fdededee   dededefd„Ze
e	dfdeeef   deeef   dededej(                  dz  defd„Zy) uu  
Thompson sampling and prior initialization for the adaptive router bandit.

Each (router, request_type, model) cell is a Beta(alpha, beta) posterior.
- alpha = pseudo-successes
- beta  = pseudo-failures
- mean  = alpha / (alpha + beta)
- total samples = alpha + beta - COLD_START_MASS  (informative prior, not data)

Hot path: thompson_sample() â€” pure function, no I/O.
é    N)Ú	dataclass)ÚFinal)ÚBASE_TIER_WEIGHTÚCOLD_START_MASSÚDEFAULT_COST_WEIGHTÚDEFAULT_QUALITY_WEIGHTÚ
SAMPLE_CAPÚSTRENGTH_BONUS)ÚAdaptiveRouterPreferencesÚRequestTypeT)Úfrozenc                   óR   — e Zd ZU dZeed<   eed<   edefd„«       Zedefd„«       Z	y)Ú
BanditCellz@Posterior state for a single (router, request_type, model) cell.ÚalphaÚbetaÚreturnc                 ó`   — | j                   | j                  z   }|dkD  r| j                   |z  S dS )Nr   ç      à?©r   r   )ÚselfÚtotals     ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/router_strategy/adaptive_router/bandit.pyÚmeanzBanditCell.mean#   s.   € à—z‘z D§I¡IÑ-ˆØ%*¨Q¢Yˆt�z‰z˜EÑ!Ð7°CÐ7ó    c                 óh   — t        dt        | j                  | j                  z   t        z
  «      «      S )Nr   )ÚmaxÚintr   r   r   )r   s    r   Útotal_sampleszBanditCell.total_samples(   s&   € ä�1”c˜$Ÿ*™* t§y¡yÑ0´?ÑBÓCÓDÐDr   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚfloatÚ__annotations__Úpropertyr   r   r   © r   r   r   r      sF   … áJàƒLØ
ƒKàð8�eò 8ó ð8ð ðE˜sò Eó ñEr   r   ÚprefsÚrequest_typer   c                 ó.  — | j                   t        vr*t        t        «      }t        d| j                   › d|› �«      ‚t        | j                      }|| j                  v rt
        nd}t        d||z   «      }|t        z  }d|z
  t        z  }t        ||¬«      S )a"  
    Cold-start prior for a (model, request_type) cell.

    mean = base_tier_weight[tier] + (STRENGTH_BONUS if request_type in strengths else 0)
    capped at 0.95 to avoid an over-confident prior.
    Total mass = COLD_START_MASS so that ~10 real observations can move it noticeably.
    zquality_tier=z# is not supported; valid tiers are g        gffffffî?ç      ð?r   )	Úquality_tierr   ÚsortedÚ
ValueErrorÚ	strengthsr
   Úminr   r   )r'   r(   ÚvalidÚbaseÚbonusr   r   r   s           r   Úinitial_cellr3   -   s—   € ð ×ÑÔ!1Ñ1ÜÔ.Ó/ˆÜ˜=¨×);Ñ);Ð(<Ð<_Ð`eÐ_fÐgÓhÐhÜ" 5×#5Ñ#5Ñ6€DØ%1°U·_±_Ñ%D•>È#€EÜ�d˜D 5™LÓ)€DØœ/Ñ)€EØ˜‘:¤Ñ0€DÜ˜E¨Ô-Ð-r   ÚcellÚdelta_alphaÚ
delta_betac                 ót   — | j                   |z   }| j                  |z   }||z   t        kD  r| S t        ||¬«      S )uà   
    Apply a learning update to a cell, enforcing the sample cap.

    SAMPLE_CAP is a HARD cap on (alpha + beta). When the cap would be exceeded,
    we drop the update. (D5: hard cap, no rescaling â€” keep v0 simple.)
    r   )r   r   r	   r   )r4   r5   r6   Ú	new_alphaÚnew_betas        r   Úapply_deltar:   @   s?   € ð —z‘z KÑ/€IØ—i‘i *Ñ,€HØ�8ÑœjÒ(ØˆÜ˜I¨HÔ5Ð5r   Úrngc                 ób   — |�|nt         }|j                  | j                  | j                  «      S )zKDraw a sample from Beta(alpha, beta). Returns a quality estimate in [0, 1].)ÚrandomÚbetavariater   r   )r4   r;   Úrs      r   Úthompson_sampler@   N   s&   € à�o‰s¬6€AØ�=‰=˜Ÿ™ T§Y¡YÓ/Ð/r   Ú
model_costÚ	all_costsc                 ó\   — |syt        |«      t        |«      }}||k(  ryd| |z
  ||z
  z  z
  S )z
    Map a raw $/1k-token cost into [0, 1] where 0 = most expensive, 1 = cheapest.
    Returns 0.5 when there's no spread.
    r   r*   )r/   r   )rA   rB   ÚloÚhis       r   Únormalized_costrF   T   s=   € ñ
 ØÜ�‹^œS ›^ˆ€BØ	ˆR‚xØØ�: ‘? r¨B¡wÑ/Ñ0Ð0r   Úquality_sampleÚquality_weightÚcost_weightc                 ó0   — t        ||«      }|| z  ||z  z   S )zŒ
    Multi-objective score. V0 is a weighted linear sum of (quality, normalized_cost).
    Higher is better. Both inputs are in [0, 1].
    )rF   )rG   rA   rB   rH   rI   Ú
cost_scores         r   ÚscorerL   a   s%   € ô (¨
°IÓ>€JØ˜NÑ*¨[¸:Ñ-EÑEÐEr   ÚcellsÚmodel_costsc                 óö   — | st        d«      ‚t        |j                  «       «      }d}t        d«      }| j	                  «       D ].  \  }}	t        |	|¬«      }
t        |
||   |||«      }||kD  sŒ+|}|}Œ0 |€J ‚|S )z¡
    Sample once per model, score each, return the model with highest score.

    cells: {model_name: BanditCell}
    model_costs: {model_name: $/1k tokens}
    zpick_best called with no modelsNz-inf)r;   )r-   ÚlistÚvaluesr#   Úitemsr@   rL   )rM   rN   rH   rI   r;   rB   Ú
best_modelÚ
best_scoreÚmodelr4   ÚqÚss               r   Ú	pick_bestrX   p   s•   € ñ ÜÐ:Ó;Ð;Ü˜K×.Ñ.Ó0Ó1€IØ!€JÜ�v“€JØ—{‘{“}ò ‰ˆˆtÜ˜D cÔ*ˆÜ�!�[ Ñ'¨°NÀKÓPˆØˆz‹>ØˆJØ‰Jðð Ð!Ð!Ð!ØÐr   )N)r"   r=   Údataclassesr   Útypingr   Ú.litellm.router_strategy.adaptive_router.configr   r   r   r   r	   r
   Úlitellm.types.routerr   r   r   r3   r#   r:   ÚRandomr@   rP   rF   rL   ÚdictÚstrrX   r&   r   r   ú<module>r`      sw  ðñ
ó Ý !Ý ÷÷ ÷ Hñ �$Ô÷Eð Eó ðEð .Ð1ð .Àð .ÐQ[ó .ð&6�jð 6¨uð 6À%ð 6ÈJó 6ñ0˜*ð 0¨6¯=©=¸4Ñ+?ð 0È5ó 0ð
1 ð 
1°$°u±+ð 
1À%ó 
1ð" 3Ø,ñFØðFàðFð �E‰{ðFð ð	Fð
 ðFð óFð$ 3Ø,Ø $ñØ��Z�Ñ ðà�c˜5�jÑ!ðð ðð ð	ð
 
�‰˜Ñ	ðð 	ôr   