From 010a4d44af23f12b6061559a0325fa2fa1ea9fb4 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Sat, 24 May 2025 12:12:31 -0700 Subject: [PATCH] Fix passing standard optional params (#11124) * fix(main.py): use processed non-default-params as standard input params for langfuse Fixes https://github.com/BerriAI/litellm/issues/11072 Fixes https://github.com/BerriAI/litellm/issues/11096 * fix(main.py): rename variable to be more accurate * test(test_langfuse_e2e_test.py): add router unit test for langfuse e2e testing Prevent https://github.com/BerriAI/litellm/issues/11072 from happening again * build: update lock * fix(utils.py): refactor optional params function make it easier to get the standardized non default params * fix(utils.py): improve process non default params function * fix(main.py): include provider specific params in processed non default params used in logging ensures user can see any provider specific params on langfuse ensures user can see any provider specific params on langfus e --- .../litellm_enterprise-0.1.6-py3-none-any.whl | Bin 0 -> 88534 bytes .../dist/litellm_enterprise-0.1.6.tar.gz | Bin 0 -> 33399 bytes litellm/constants.py | 40 +++ litellm/main.py | 98 +++--- .../proxy/_experimental/out/onboarding.html | 1 - litellm/proxy/_new_secret_config.yaml | 2 +- litellm/utils.py | 318 +++++++++--------- tests/litellm/test_utils.py | 73 +++- tests/llm_translation/test_optional_params.py | 21 ++ tests/local_testing/test_ollama.py | 8 +- .../completion_with_router.json | 87 +++++ .../test_langfuse_e2e_test.py | 39 +++ 12 files changed, 468 insertions(+), 219 deletions(-) create mode 100644 enterprise/dist/litellm_enterprise-0.1.6-py3-none-any.whl create mode 100644 enterprise/dist/litellm_enterprise-0.1.6.tar.gz delete mode 100644 litellm/proxy/_experimental/out/onboarding.html create mode 100644 tests/logging_callback_tests/langfuse_expected_request_body/completion_with_router.json diff --git a/enterprise/dist/litellm_enterprise-0.1.6-py3-none-any.whl b/enterprise/dist/litellm_enterprise-0.1.6-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c212c7e5a3d62954e34d895e2d781de5e0e525c1 GIT binary patch literal 88534 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

xHe$(B%B<}&&*3mc7 z)>1Xmwz4&~Fa%;P{Zjn!d)Uidz(U zelssd0p#2BqO8{MlXU*+Orpn!HN~IrN&92k15c{kC@D>fDEJX=Mb|{QqPs zy$gQ)iP6vo0Otb}^6eI$)x8H8aOr63TixVNz6(6}^{>0h!TR?>qeA~)KodP{jeirf zgP8Hm&4?8Mi1~J3vNOB~+z6P9fuZu(O)P465l#lMD*!fN(EjzLyR#VIhi!e6NX%B< z=4XrVfTszbH-pxV{c*cHb(-9R31n{6*1w&d{BAP`Na7&gD0CW7Tfo}*>q&QKG`kO3 z+fwhQKmE0A`lq=GTG=*|0N{TI-rLd!vG{$yuBO=^z3JzRH3SpTcprcV3iPGh=7yK$ zJ(&7dH=6xV6;+MjaiImEiGZNF{}S_!p=D})FQ}2a#!tF0b`W>Z&D!NAd)Dn91Y&zH z9H7Mi)`O72M#67g4xa$_ZEL#O?jCGYO&~;%(H~3kUksFE5)dOg0NfX7+*h~c9Pe-s zxP`jT&pjTFCFPQ&0FN7}>`kiGKc94W4X5Ad>8V@l=>vwOnW~k}FXsjErsU2cH{Up1emwy{1=|T&jgY&Xj^ES8vjDbSw=!~VK`9Nj5ASC2{L6Xe8IxY# z&Ajq=yU;B9KHwW8*cez-{+rUiCVwFt2=Ji*LEj$e8DsCk2doER8&gC7ryd$7uBG`K zH`F8`?Ax|5ar`})`kEG|mZmyZs#btI-%{09TSE`9jDON|zF4j)DFOUwfPdR=8cXKTtv*1!QL)?A%}BWi z(cVhmSo>es9W}Bm$RYq-1AyONaXF^_KHSvM3fTMm^>D0ptS+|&2sj>~-?rFjGwwk) z(>75DlEeQe2JKIzZA?Go&JQ4ifl=~yhw{n%eXN<0I-p;cn(9VBvz%&5c~>3*Oz^)6 znI`KVOknsh{+GSLGDS>ONPyf3ytkXTJo_GG3vC_XK*BEvPAgUX$QyDU@ZKJ=iE{5j zwl=ah{!jD%(*o1t&0Cu9fL>Mot;%6}_W;`i8f9%}WU8+9k4sx*+Z`53fNBLa^KF;h zMgH%TEdX8Cy3yx<=}*-z)o)<|`j@{6yteQjbZvDl<6k>nZ59Y{5CQ1T#-zxt5tFL; z9$;$?dtGf{p7@nFaN(Jr`7VIW`x`o|7!Uy9jqnUVn?z@q$ZhElJ*9~#(&1vWx| z35S(GZoOG{>H+ZEYox8Jd%>+N{?!*<@B{aU+%&El;% z0I(mRU9WCw7kTY{z@}z^3G|a$u_sGA3J<8H6%deu>lUx8?jAfNATZfaXerA4EjMdH z4}f@k>VMsE51NTRuy64TmzYGB5%kUBlwtr2Z0i2?q`QMP-2-b5gv{2qH2Y(3>enU@ zfuTg*&0+!xXw}=cWnc3>KET@86vz+rQ`_=$X`b0*fcOZg@@=o2Z|m<9frLWZx`0z% zRpY--s(+e`S#2>xZ??xQ0sQS55vBbecnftKV0-yrXT$`O2m3b%3X}l)?cO`saSyt! zzLlolFBPpWTud$#0H;CS?Y-~1?gs`|jX&v65x7MXH-`srVh7%y8iIT7!2?1K>X=&m z$20d&EsXPY4&?=azVWYf{nevxyc}=(ejjb4Zf*24f7vc#;`j%EmIN%$xNp&h`+uKi zuWq9C(<4{2A}tVt08aaFa%~&@eVhX@$7@>}{`x%V-8A-pRyN(;Vfgp>;Aw=P5vJ4|HexIa(X{4z(|UCP}QVm~NP)_zL)w^)mJ0e5r1`~Y-r{}S*InPBdge>WM) zkMg4dqyA5s{J0}Q^`8p-_=g{27q=A0!a)Uy%NP`_J9TnLjYyz#)g9==Xmr^dHQ>D9hb2 zmp{sO0K6`LFZ*u+y?z9}yepl%!RdY!jSu)2{)eLf3{`ix;JabReiWPt|34M{M-Z|* qrT#5s*k7fBG9mm=rT!;?nAjUgz*++Vu?POc0&aR_5dsrG$o~To>pdU< literal 0 HcmV?d00001 diff --git a/enterprise/dist/litellm_enterprise-0.1.6.tar.gz b/enterprise/dist/litellm_enterprise-0.1.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..698a9da2095d4405cf5ee179efa1d43a716f341e GIT binary patch literal 33399 zcmV*EKx@AriwFn+00002|7>Y=Wo&G1UuAA|WpZ$GX>(;QFfK7JHZF8wasceTYkJ#A zvNqVixe6TmoUgxD48W|0pG9hnFY)< ze`XQ0p4q_65+))uaR+z-uT~|y%OZiyh{*e!5s{Jk-Tdy~&*iTlh}TUdb){OX<|~y-vGTf_ z`kVN?_>ZbsL{$eZqFKZk8j4ABg?uqz+dVlxY@S{=^MmeE#(%9+i5vfwao`6qRCN2IsJFqDI1sp)hANmV*TgTFf#yia>xoUj+^OzKb{ zjt!-MXGuGqj8rO=DpF1w8pMRY#7Gheh#qU5d@A)>vF;>;^kt(fS-NC-xL)c#>rpny zehP$9Ov&WGC0XlAvT5oaMYc#+>gt`*0BFmWqH9u5QHjaLvnixA(m)%VvRu_*`hBD!b^~m?&JrMp>Gg^B4<-H3y1|2 zJNjU#Dzerg(jycs>o3o!ZFUT0NX5J&#=w;Ho^(l!2dKKNBtOWCDz{aVdQfEPx+AOV z?arNL4bA=CUHC<`t~$;Ghu!XOWiZV3yXD+{^?sL+)Laq%r)zB;YEseqxeiF4k#s{M z1E4GIC|XbddmBZ`%StBPepH}zCW~2gcxj|)5wT*WzWzWA4XD!cK=q;E_|>jpklwVb zq&=n;hPA>=&Z>wKeMDBQ0;LC8Rl1Y zANZE{9>_%cI?9TzMKr8hDi5?!4+MmCse#^Adf2$ot1i90YB*}Eig_muWvg=s-H6k) z)8wTuNU2ZBV9(&fWBGPLSj95A@VWtg5bID!M79Q{6(6F!gF(ySq6J%Gwc2 z0dkLN!C6D5ylq5zb;$!!^&#!Nn9hQ#MS8=LG1N`0He{oZENGN}jT8gl$tlw_KtY)3 zwwC5->(nf5EycFAEdvxv)2&qBkTtAyoStZ7Fw!Qp=U4|ik0>SdXlNcFZ$d*uJz@q( zN)#-Sf2gE9HLK8^@Sv@9yF|kjSjo^eh|z};#0Q4AS7brrHgDjpJpxRaiu^+cChreT z>GJH|)#rnYrgVHMonM^&c6`)4lF|p4@H?HAJ|ACwIQw)ZL5hom)2lDi**odr^o#WC z@##@kYW{wH(Y(Br&Ms2NAJ0#YoAB)T^zh`<(edef=`G|tJ-d=ljz1n>0nw{72^n%y z$IVM5_OW?!_yK+%ygfcSzWS0)y*s`-MVjxEitCvI*>u zfb8k<>AMTy()`#wy~+bucqTP}gCEl6hl7(7WR*Jj1kzuieA40B`In31_aCmL4`(Mw zO?ddW36dSWJ!vvlP^iO`gX51`>FD6&!TTo7bp})}QkaZMCw>0V#7D^Q0RDe?b$oV; z#W*}Wy}E#(St#Yjm6P@J@nthB9b6n=VuifBIQy7QVRb@|GfD*Voi-U2tZK>EB9H`s zf4Xcs1f`?q!3og1#LQSkJ2AB8J7{H@HnIXs_E0vgFd?m(O;(+$1QzWFrOVbCn&44m6AAWccL=&N9%ip#WO1{ZD_S6@Jmut9eg?!0ua5*Ze7gFGnY zk*?j>T$yycllSPAGIS455jy2Wq+Pcca;B-&k3U|)rUrh))?oyAmjZ|mZd85vAzTPZ zq*;dCv3~q9mHPkw&;R{@NMKGHj;%exD|@|+87_37_j zKuurAo@&fYo5k}&|1b3aZ2hm)UKas()$_$_p}bcv2>|d{UjM@{c3Uk)Q><1iKO8T0 z{m1Xn=L&TI0)RjNRwxz9wW3)6|2q3WG5>Gb{J&QzSH%1;=6~P(?|yBe)v7Ib?#*5D zRUQmg(o*$)9{_Gk9xB20VaohptQ3Rue;uBR`F}0@KeokF(26ASwv=E`Gt?E08W0T9 zA<6@hy0RrpJwqQzyl157kDd(mH&i5LFw_l8dIvub&X2RwhpVge=GP7xGPCOi`PYb; zRthz@Qo~NR1ACv;-{DbysGHVKdKWrTjyym=OJ`EDIo3K-m-Hlf+M-W)3`S<(rkB}I zN$|0ZG5dla=%A1?eZl1JN-j}}XHRD&>6N7E|B{_ducQOh91Uz+6l%BW51vE1lTGQD z%d=Bj4NfjvCk;t{lof|~{tr{vpkQ(0*c37EeuN|}J-&6{dBpspk6_>3?J8KWxa-#Y zuwm^$G1BQJT8rhN+wUIu?2?k4r z#&X!$Hw{BK(%4Cqp44h-@_@8jQllZITdjetXsuS7apJvi^q_QfLu2LPKk~*%+kq~Y zmF}RAHPXdWJzs$T71LP>Gd1>L3d;Ot*E)g!1pc$}U%mLcUfC<>>y>i7S}hCwC-C2N z{MRQMF_aGCKIdrw08Yk#rDDBUMEqAQ7K-&kwLJ%kQ?^*LofYziYhlQzBPC7J*Y@s$@x-DO(*?fgX^h@92|Dw2a8=IrGUdvZ;)p8B{be z^Hffoa!j{Kr8=r?ns&c}ZpDhf6RHr7?QsKOD;{?oSZNZqmvw&G`;~pCU9U~cxCLl_ zs%ykecSk{v=}FdwJ`qm$CySw@#$6Cr2%^qCok-uu{r$B z%=SLN$?AyEos7R2w9y;_nr`8|N4*+@T`4QY2t#xA^bvJ71YsT&L)WM?idh|OM}QbtRsr+ z)XI~O+jG_)4g3ZF^_)&c6mV&Sz^O~xIBYfR;VOnp0u<0(_Q;^bq3U2oZrJM{^y$vM zN3CFvhA?Sn^3K%g%vq9~y%8YiX1A$!=rZ22Wb=N9CI+gC4l_)P=Gw^w8Xi?KbS2-X z3+XjoJ+Ily8a?CR;#75gn{p>}Z}+0}_>?&=X8wH-qs8tHw%@TAtpumx3#!`)%)}`9 zzVu-ZGU3^Lvh>jtv;=b%DpA}L;BwkkdOc#`_%-#B0q=t=SF6j$>61@@^r4O(@K){$ zmSI%caQ8@*W)~4d+Fd4|y~?CwUV5h(rX_Xm2y`|qzE2*QQLy)WX3Yn?h8i?f4PkXqN!Tv_c*$@1PBcPzea~vcrTwvOU2?bAs>_iIFOVdRS zU4yAtO|a*L*P?xxwk>0aWS+xK;avgyIj_;g6AI8vFpF=l~x;j<(yfdFlVl)^(JO7 zU9CBTQ8;09g)P^ivnkhJEDT}}VXHz~di#$o9wacV7V3lOB22%+Bf_bb59wy~VW>yL4bU5NGtzwv-6%|9Yo0 zGR(+2^6inRYnFeH1TdBil+mDthhtiF5_ZLmc)8>00ijuQI^?3_h1WKyN9uTHO7=dt zH_|%nkR6n7pm&KX{fC*hJ52yldViU`IUQ@@kTodGO)M|27(3}uGM%1R0Sc$Jv_}V=u67-{hk@=BGasO;3M#erP(<8*WsD+bLRWAX6F(G# z<%*seSy3C_J!J6X9d-@h7>rErj?0E;h(;#0hi$|Dl8u;aL-c*vE)Vzta_{g$238W) zBvH%tDR~UGLw4Hmp3FY3GX?qwHZak4{4_Gs8{TqE`C`I0JuEdd+u- zES_;QMYx0XqDCNFNpsHnc%wZzYOOrOJuRTQ6I?m{O*52DGkz85!AdzY$f{NWPJaEX zfS7QXJmHENa~(6LnDY|Pd683`rx;kcnEC1wQkis*&!!T+CvjJY_$e!jPG~ZK7GWwp zpOPdM?!}1PQwipgUi3sFxAAl{h)(r2(o;mYc;<6*tSXQ#-~;)dNatslSB{IyvmURt5967iMu|g~YLV9?DR}GAez(m(kiEP+2jiV2ov{1|o zRhZF6%Ds_rTO2(Pe3YSi;6Km;|$fj0P9$*z1^1#GCtIArx z2k0R`bhRJ0eUqp1qZR*404Yz;ZXX*EOXhxe0ke=V7o%h+W;9Si`1I_S80B`s4$pY~ zgPrMzTXZ$^>2RI3!Y{D>*rPn`z;qW#<@8*92ND(X1vkCUb;r>)5_lV^5_G$0p$RsS z%Xtpz?Mltl&@}|fd8L&B?zZj}D@1`m2MX_G70;77GdGqPl6%MFb(%g+-@00^ZXgMx zt8~*ic8wjh)#ve_%1$QZ>w<4b3XD7Ej7bfxq20X;I0Nc%puP{B{d2yjHul{b3#GBk zyYJRXAPt>zu3(-??@Mve6770CNi?WT(_sj&ecgyYgSJWs)~ht`NCJuJqo}l$$~pEE zg0lc*3-q2~db{)PJKZ~w!froE5f8k1)9RV{Gp;fh_tfVAhaKexFzjn_-|E ztnIs!iagfkJHM06S(a+!XLgy5a+ZzqlVv)73gsOo|0k$Q*cJau#s?#)fN74Zhj+Tt z!BBzNmDCFka8oHei;3z9RtP|SsQY%DSX<50tLDY|#qnjc<#yj4uecmozLE}U4%e3q z!>d_5#GV=UbY)5pisk9Kr)XDE4{U9*jeWzD2YI;ez#tx-rCV+SuQLMAKbs?C+QY=_ zx#(6xI^Z~FOUKxFG)5|P4d|!vDniteMpb$pHrQd+fu5opipMdEs{-gQ-CG=&Fq8;I z43{br*lyB;pg~fh^P-dY zo9>noON{*Z1Pf9RhE@xx4pnq9;`0qx0PKT^rnmG;Z(8Geh8c}^>KXO1Bhb)QoKw>W zeLV7OTeWNw~<+2o)<-t5l+fD_q!;z|~DQDZ0gP z^wR0{_3`QD)va_ToA>*$YM{rYLe;$(6WWwm)kwT*P{r`W6Bh9K2Ul%KLr0^E!n8y8 zb~-u@3?<>YUL;_RrJ=4W9j<()rYfT9kCI#0`BX^g|9snge|#!^I=wu2*QD`7F?Q+U z!BzA9*~M}5@=Ykmv>_8_(L6nx#2`*4Nc&s!;_?8)l18M0iVe2`)|=UQikxcG4Be#n zrKeaY$@I`5EzcQd>^bl!i=*fI>>NcoIJupWT{kUn{u}K^n<@8mw29eP;C)9D!^EMW zHQJg>Y&w!RC3nOlYLW5}W$19UE64OpeuxCozB3@9E1)bf?}7zSV- zMu(AmGNz8H`vF9r4I3`@?TyHFP%G>hD}oC4L7Q}O;xvPA6abH;MLk#KsGM%mf^Xze zSJ7LRA!|-}@N|qS+{^WL;xVzDgvXHBe$BHf4%`27(gi`M9MiGCGtDqMR+)BB47e=e z20ebD zOmRnW0wlU!DG4aB3)8rcEc9)J+d|K?(Q2gQ6dmb_o(a$hVQCdp(Qsz&kR7|Yfz4~! zU5Un{59iBw*yi`TaGSL^!qJ%{a^!jG^A6;3ab5xeg5QCY37K}#_7b+}V32Fp0Wb(Q&GXZeO)Rfo zN%Uqgex{Dbs&j;qj$Qi!-JaQtt_$?>WEi!VpsFr4qaDPKJEG`V(wA)(fn6rxj@Cfd z05KV69u04HK6KCI@6jp6m(OQN!Gz3B6rc~^bI)%^Ir+FeBTCG!b)W-u=T}ATOKn|O zX-GoVB!M&r>B1%n3S*J4*2D-L9ze;r5y9-#G823lI9zW}rF7@uvxsw6JHbvGnyK~v)4|123%XS6?ZIW!IZF~$8As5Y zU}SQ^clx7Z(u2kS3^V&@=#;U?076usGk%CYx@ViHT-{0UrZZ8_%3+CrYDkdyuWCDR zwL>1g5IZ2niq6Id^o$rK$o19P(b+9KVnE}K4s-*iV`9+xf~(c;l>S}Lx-;}q|86*f z=Iam*M!G)R0SqQ1yQq#$+4)0y^57Eof!Lp@1(pPg9q2#}d5p~rhS&4t*f{pfk7I*wE_1o{DQ?3kk`5mlCzFj__nTRAOp>!!zCk(R#Fca6!reA|zEZP_ z>CVji`@y9Z&+$0o*zOoOn4i=9G*+B`65TbX4Dn0^^dcTdfjfPqQVicAq{|oi>4qJT zJ&2yaLTJ4|0T42n+n`Z@>HWaL#Exxhr!ipYmJfgd;D2^@%el1)h(thK7S+lJ z*CGzbh02D3um%cUKhVEq;`@n*@*}6kiR9Sy$cor^d@T0^-d6tr-)f2`dF&H9N9apz#!LBa!BZR{X%+t(#0UH{&k+Ucbtxwb(_55e50xvHXAB^P50d55xF=z-7Fj856fimk#~9IW$=V* z2x)W>N;iTuV%&tN_ZBS$piUy=l_^n+#w^g$MfLX4N5A{2vz?9Ih)yk(;kZWx>%(xo z{!_2q2@2iSqg2xwOl3z<#p^}5nZz}P#jK>S{NXB|yk~E(pVH`7hTB8?XfNOU;G+*@ zEZymkKbW{M^kMnv|D1lledZK1@HgQVCc^$N?EjAazg#buYkT=(rBE+dUkm%cu>ViD z{}0h(*d1A8_uG8;zm;nB0z3a%tX683dV${mQ4;rmtnL1fb8NUHXgKLW1x$*1eUD8& zmHI$;3$TxQ)Foz8)&T%uQgc6*lRhZ@JBoZUtj#+f2Jk|*NFGmV_LM&U{+(}U0K|Ra zPR%spmSrf^qz#)AN-=K}JRJd;GmsOorQuJ?U|iWZ-bwEa z;@m85I|&%1KT>7qSWw>_n-r5}b)JATTd7>$yxMXXx2i z-!&f`ah-QO9%kSv9|~{v?s%5_SeOjakv6jv-qCZ4#~RxZ;9ZWuD|LSGzIk!<>FP`C zsQK>T)5%rq-NEt6r;BFm>cd6z^26E55rF4fVU~og&&Q`nXP;Y_&BL?PqszE_9}Z66 zAD_PW&#V}}%p_?XGW)lU^lhIi=YfoS}QMpqzpUP}ura8Sx_ULP2=pc^|3%j`? z&?l)r@78f`aW29M`M3mcpKy1W_BPLdL4eyl=)&=9^Nas(0Nl{o8K)gR4w15VgeI{< zhf!^s{GJk-+7G7sj^Y_SkL(D%M|PDJww zn4q4g5t*r;r%j8o_3VqzcFE^77+1Q1f#7iR;{Cvs9sr+FOy(au{t(nAzd|N@3FNoN z`19KpFnfOPHyHLrl|CLEpGqfZ?~f0o-o9FM9PJB&=YV0N_l42UOJ|xoW`P%N6pP5# zT@Ba)WKYyV4vM?dkDStv{>28hv;?oE;HMY4O%5Kgz7(zY*YrnbOryv&4?lNoL<%UQ z`1{%9nOr??lBv{iQJ5x~C(Uf7Bm;D`npjYpBpnKh z9XVN@8zYTKKS}4XNm1G=-+-jtcsX7KVw+}TP;$i7J{>#a?k+5&yQs~;G7>o#eZ`E~ zlx5lCdw#?hUoXr_MHrq~7O?Y>h39=Z~g>K zx}iaO%GX9ZR(qEYLBEjo&tQt+iGCt;`Gj=t$iAy*n(S<{fCmX$16y0?V1j;{E$;u` zvO~y+y-UK95IUe`8B9(cwbd@f~w(Thz9_j)T@DfCNBof+;EwpILrt|}6_CtP_i0ITA z+V(X$N0pru{v7>Huy07%EB`G$`OeF*kAl6&aG*R_KJG-gSJCpdJf{5_d{AQN+<-~i zjcDc$yXmsA?TA;h;IX9{jPa9vny6ok$qe$WdHFa39L$=QLM*2_!<*_KB%;bg6T=vJ zIt+kz+9fEwQhHB4 z@w58|uyN>l7xgn#ramedAH!f9Y}TuIzKPm}rSDCGgLmTQBz~(sdC!vO-J2T+(i68S zvnKX!O{QlGZ$`rI&iuzr`;c&M=iO|3kT3!EV#d8kI6HqcNJ(SAJokslhzqjGT0DE|-nzirG|D{ZNb8MDO)to{v-P zHB36^T`3>xQ~;`B%LbjQO)qYtyt2;iM^1qp66L&fh*v=Y6$}XwVBi&`GqUtvZ=(KL z%DK)GJJEf~9jQYs73vMHnc0H6Uh``!@t$&~GH}-7bk=1&P_&HnhD&to9b^2yYPRp8 zm$-Kb^->Nruyg-a;4$n-=>>vRHs9!Fkw%@mo(uDSkRJ%U6OOTQ?t-(`|1{XzlfR}M zIGUHPye<6X$nYGadG|2Fy9nKW7`)Jzb`f}mfyqaMfozO%h*DurgI&SJAuK72B+O=wH=Tw}#vuDn+^p>;cgiGZscfCtoIL4{b7#ITfAJcw97A}))IZt=kWcc!`2(>?4ZyXvY^CS{GDFTI_bo|tyKD-FhB z_m+RUeE*pb>R<41uw#yrb`YlTOL(x>j(ub7)9B=~l1WEO!TJ!Ch1J1z&QnT{In^_g zJXTh!-6Sla9+C-;+hcl#J-_76jpLEUQa?)R)7^tKy}jr`SGqK0BDVNw$PA5qoWru? z-Fi{BBtO)L-YGY5$*nD|y(jCDkh;W46I_tv#)ii`#vTG}O$_vVew;P_I#KDmV<5GP4I{%QvfsPy8VzV9zO&V_QMO$NWQ&gl!IQL z>-7$~$MMAbueq%`%0~`lih8^gcg%!?o1hsKYurfN9VQ)%s2()1DCz`(Ar;dQQxP#aLShfHriX{5Ou z+vG^6zJp2L-ZkOk*t9*Q_-f%FPYq;rtJe3dfCx z7;R}hU;NKXtyC`r;(yl4WfA}LyS)Dm;}TrbE^%b{2x-?fi?h8Dy;}j14R#}Qa>&s2 zU){FGTiGyBKVGF2b*v|FBU|!7qWl<7lH)uaCDKF91^`8W&YY4p3Q7=S{>V`pM|eV+d@GguUzmuml@5dc=ji7IJ>k6+=n4I{n zY$_dWtjWm^{u~+Pk~x7x>rP2*SPH*(VoJi#ms5!ys`{uaYu5C-!Gy>1luG>Nah6*7 z2)!Lf(O@{GS^ot?gPcvTzH>u)kge%8clD^KiXNBDZ%J}0u`BnCkz#psgM~+BO z(Mb1{SdY4aA^H}sB1W*KITRPDDy6SjvZ{B8oLn9cjk)>j!=bwPB->?V7N`e9*GNZM zMwelf7V9#jUXLt1u)CDX0(COhWIXIh78b-Nv`9at+u!6}lx9!RD~4_T>jGT?v(L-5 zDVyVS-Aufu5Xg^)x4HRR=6DGMfB>0=djC7PHI7UOiLXvwjb+J8p-?r zJ4I7Eij|x{&!2#=b~kD-qbV4r#acoIU|=jm7)oeCSw@ycj7Rx_B$vV=F*kPuz8vd| z&dfa|qv#9tOY{=N5oRu<(c{O|>hJHUyTIun;1P@YqlO4 zxp`$eC6=o6mN6Y^jM75wb4ngB2y8}^%kbDTkiguGzg*#ojb&8Bn4bMus2a}hEqMu| z=s;#MIfk%YA1?+{*%6Mx$D6!UNy%eqBLE$IDl^{7~#yM^n9Qdyu@9;qQ> z5%w0DTT6teR57CS!lmbQl9&HCJWP?4{R3v6m*W>%>n8Uz9n;+N^85!ZuEe}w*zx>N zMrS7HbMG+?QmbIBqb97X`fz+n<166xfvPf4@bbWNz7U!91Nk~*zT4EZb5Dx*M#R8D zubsfLARaWqcRL9SyAXN4CK#zQbPI|10unrbPNR<5o@{YPb|Rn0Uu5F&@?3`Afo&+) zVBy7{HZ5Kj`wjPjq(LM+lCnFVd_p)EA+eu_x~j4YoRleV63e33_1b60FqSNykZ;*< z+!OV9u8f{_f(o$DnB`BQ-Md!=bIZo~9X#6U5{#MH2wW-dim~-zU>UJkGen<3p1zT9r9KQJ5^ovB3=_Adi;z@pu z$#28ghATZ^jy#`_9xyJA9r9&ACK!bVl@+*{JgO*>!8P3(%3^UAd{VG0k0mS`L!J{I9`=WnGTwv^t*A?tvp<-obyowy?x|axJ2f?z@YseH6z=b7i9YXJ( zzIKz{W@%u$On9QO1EO&{-aL_g%ekQ#bJ&>!%=zPMC+%%EutH9nD4e_AhTGoay$)y zA?boe!2pGY`10_%lAX?m6~z{b&bhZ!s_8bCY}7IIJRm6zZ_=AsC%yC$=R&)VLAo;i z;eaKlYwcrDZddx}Ni`Prl*CSKu_a)UveKuzBaU4qcwMNX4M$c!?GJdJW;dogqcJqA zhejsP5IZpD9u$7E;mSxd7W_0>G)~Wh>HUBHzMn}g-sM-&-II0o8M-;E%h`Ilzix;+ zxnD)h_jW%}FeZgF;oDjE<7ONW6U;ejE>F~Tk!U8q5))41RCp|CgZ^%=}8FGjMN zH>x{MOza&sGxgVr)NUufO+J6GpmRqod^oYv>2{8Jm8D@pT&aurpCbO}%<(^+FnYVTCCw8DbaMPp_T3-u#l)CmWqRerJsxK~%aYV>5+G z?ZCwb;bDmbPAa??YNIzTV?SuWcH*Vdo3KHmSdv|$jZs_V(!*cZ2Fah(6L;Ee zi1>BDiiWiyQOX z54Yd&Px>|k&&$v7wDIlDxBaIg{Ahf;f&cA)`_IO=20Z(A^K%2U{qXH3{SETK>#wx} z=BqyMTmuK-)5_gGl}n5|OQ(IiF)%fz{r11ze*5=~_qrMXmj70)8v_3c{P%t1zk0D$ z7vosqza;pN#qAD^|4I0-Tq_3m|D~F^|6?2QAGGBP!Cxpy{LJ7F*NkWk>ijpM&Qv7J^{ z1_C2)?3on>`lVYE2JGAS*R4$jh$!yheKU92JiKUL<$i5`$rZ2v>---VUta&d_x@e! z>bIlMh0F3Ur`5`@9}b(fkDm_eC$~@4y=Ta{D7M*-^}ifm|BGV%U(5Pmk6i!vs%5eK zi}gRr`X9c!Y^wdQTnn!MmAbJ1ZNd7_+mc$uR)zo~Z_Jw&0|X^p5(@B=-3n767iit4 zz}u%{J+X#IC|iX7N9cdPOa0I5VpaHm3H+A?|AlUiov!~W6@&P%T&xNFw|V@>+H$q< zFY2n|Ss$zgYjH*8jb|J+c0a^*_n_ zZ{OJN8~>B^Kb2DG{7NtpBtv?bE=kS^g=DWNtuQJm-dc>G;T`=a^j!&eAXe zW5t6PuF^5+T};VV4IRSV-C9hfvSL)$udyl@gvRPS!+*m5w=w(|Y5#j&s0#NVf&UWW zKa<@w8W{hR@L#P^4f%fy``X=wdd)+Jau-p|Vf*1mB|a&+LT0rJ!>g@L#D|4dcJEz<=xb6pLjEZ=h%_9|%}D z#Vdg;{8G^h$JfPj@wGslF9H9Bn|&JoD^)`FziO=_@ZaX~pWT+!7Dn50H89ZT6TGr$ zRxlVL=aSH0nDWXoV3=hh9AuOEhF6uSBcgT4w?7nP1K6lk5ehk>{}cG{FNXg{)}4VD z`0;!Em@`lu{woyLYo5Q_g$0Z1tD-=^{3TiTW@R{k+22{nHq36}%xf@D_> zDE!#KTbp*TZ9~CE>jn^AMd;IOM-|Ft2OxsMwBfPOti^-S3YtRsv)_n z;Kr(gLFU>vKxTpe1pbS{f3M5p0EobU$?%_LkgxNc|E&e%zm@8>y72$o3jBv{>9HmT zPS>so`ytc$k>6xdmxlT%oAqJ7K&cYq9HjF70zOZb|CQ=s9g5NI@c$F%e>e3h7KmjnYM zD6bp|L{)nNod+L^LgyhqTaN$gVf%26On#jR)rv zeOXA+PkHqqF{+TsP$H+afeS{L5j;4uJAPmFuoZ?GAQn}5Aja5rPs*3fc=$ULV@?#N+M4NCLEVH>-2q9Ny=zo@s|4KFC|Gz2xS1PRv|B;@ek#0*P)}wCRD_VahJ<#h~u`K3^?->7u zn|=EIpJDtb;=gVK{$p(^ojPsl>OfY60~tq`VN!k2M9G%}3n#GHJUrCy$#`wxkaElU z?181)v;RR=oCy{9Px$|D+b0r*6#K!6${0P7_{8z3A?SF+@ zS=j%!0ROSJJj1rMgKMn>^?CZtoIvkEHWYni`bAwT%nK1-rC0wMUg$ZKH^0|BsOznV zBHqW;o7Iy%Z=webdfL5g_H182tI=f(Xa?5TezSU|2&F^Y?MdUw$|L4a42=+txzaa4c zIzFqr|Dmf7hic#^_*AJLx!ovMg|_*n;Qw&5Prv`660-jnYXbjo9{;np^xmzo67bL1 zBsKMWgj_1}57J#J><`xTGzDmPc#|JmH+k1Dv;3Sy!zs>xi1QySTK^4QBOPV7^B>US z;>P)xvHpjfefs?mMREVbR<8f7E!T1WgK=8m{70my%K-urq*sasBKRdz1Ti||`UmmZ zZu}?gznlBSp|RH$VgD8QFB$$Dw)L-b*?()rko~tN?7v%q|FA7rs{3Iqk{W)wfJ=sZ zF3lC=Jjw`lJ`0%p7?lmg?X50q@#N)Kb*-PnP<`F$>aXpriQ@Clf%CENV+H1oh2rA* zYstKWk@P)Qlc_pd%9~uH1=Urqiv5AW{{sJSG5#-C>mnMT!2e0`|ESj^{*d3(1rar}Dc~$n`u_jxF+#xf0fK^Ju1MFq2|KVnzy8hR~{$F)r|J{Q1-)_s5 zLjapmQWOv+=yHHSnDR=oK$zWBIA9ezg`&q3tW-zny7_e5}6BzLO$A1ycKK=Zs zz<*nb|K9PoTmuHQStZATF~Tkd3r5mjB_51qm;@8r!*Tu5;KV6Vf&XU1f5QKJbDtP6 zRxcEV0a)O_MEK9N)bTw2-^F4r?EekP1^(MS{=>GkW6`b(_#uyjq4Fyk&yD!};w=g4 zIYdFC)nYua_{qQ>QV@||#Yf;jG5;?W|J5o2{|Wq;1pg_T(owAO9R7c`YBl8lR~G00 zwgCU}w)6ymm1NDi4B?U^zLmg2&U#)*IGe=FL5eo7LxTVuv=mu2SBe)yWlMw^IhF59 zAsDCtUu%9ZmB6j#h3$gPBL1(4|GOglucB#pqxP)k-@Q^@n15de{tGsHqWHfe{{L3s zKWxi&n130k1+2f3qAm;Pg-EX$=Y{ws1UX1YU>xz;cKlZjG|0tsc&|j3G%K?93$}7cwVRnh2A0;Dh zeh{DU0sjg6@8&)+aO`!hToD6O;J+mJZ-i^zqx?W@6Yy007xMorRBOWiyAAlyY0DKm z0lJLlMt*(~e_fsZTJDhE*Pj$KMn ziVO_nWph4i15TWg#rdbVK^B1aa=%Yw!i==Z%MrmuK*g7){}b_FHmCnvRs5HpArFY6 z2crK*!p$PA_^-vFei`^L-0aii|CfULze-);zb(Lj*p_)kU-bp>l+UrAF!--e%BAZ5 zLWEZe07I2M4KVc-JvYkvuA8dO8?kRI*8fs5y#5!&`oEs_zrM2dpO|-e^xT}$1_+;$ zKmp(X`X6fcsrsKv*#1`&@jtd<{kPk49X3FR*#dUJIDwah2O_Dj78FFXOk@*uNUh&4 zSQ9bgg#Jg^|F-ZG2gT|l7@NR%j3t~qD+UTfW-d+oIYlu=NkcSeN7GbejoT7CXYL&+6izf3+yRMW8Szz+ke!Rz~^ z@n^e5;-fFpAsxP(yDR1E8{9o8>73ebA@4I0}JGXN@O1MXn zOkT;F=kJo_Jcp*%BkWcbaF=Fyj`T*>*>8e`bKV*gq6hU&FeW1BCYArU^Du!jw-sX8 zXLR7)tsCgjt_g=ox1a)9!;Zg=Ei!orE&cz5xp51nr^f9?ey8J4Ck6^<{YbmjCkFUM z+A_#unh18kI|^uozC~+gHlb7kt4F7`>IyX&zTH=zlXIN4j9%1S9h90O-~Qx@ai72_D~;hQ+t+ma8MRXA;q(;D)zrV^YX^ z7g6x#FYG`24mo2proz-t#+bRHd6$Wd^RW+&{&D-h#Fl)#FKG0muK55M3C@`$4-HfG zQ@T|Y)UAp<&Upq`4hC@BSU=Yt2J-<+y1`+=%YSTyKWEHFj7$bEiSW;(2k9kP$k2u9g|XwozYm^h~eKO{Z@cVgR3x-tGXF(o%dQ%0Qn62o2Y-Hb5Pw5<-LD8%M~Z3rI& zcjcahfZo6Ft-%LDB-;e8VL7{U2k=QH#LHSkhbpXSdb0{(a7ZN3e>OQBI~YyBV#Rr= zb8}I&ks;he52Za!jlvBI*2BT;i{T4W^#Z`iJ8RH*c*#w19Vla|?RdJ6k_(fzBX(=! zlmz&e5fORycbnS&`t81Er`+0!wE#VZ6NzVmv}}8Z%AKyc+&>5e7KYxp8-dbU43dLI~QnHil*Ct z=i%gjSpBC>Hk5}zMRFE3Ea;WppzCe0G!p)e-&Rh^5pWdp0lM$@9`TTf6|qaxXfr`y z?(n1951S%jT(SHLB&kz7_fp-9Un}m+rm2iifGFxa^-G7ndB#plFR5sy?Lh z>8%GyHs|Q)~Hv84c)ya-G0sb zCxh`w^TWnl+KRW|i76-1{GFD82NM{n%izT1KEPf96S;zzN%^vu?O&CQi99)o2HKVk zf&K2Jd~zqHd~#yiFHZj6t7qGu8t%qG%bs|B2eUnJ2fUf^)vE5MSIn$Wt9t2-tiF1? za`{jsZox9{AhY;1Ul$f01gcOc{p+eFRN$?2U5CC-@I%szxFMgfcV<@Usgjy1*Q)!l zA?YrIWQ?yKuR1%QhImhUx@P=lDLWx+qz~EAMo$Fw<$b)T_rM1!GXF9Ye_AR3ts2>j zSf+<~$vKazH|rkKbaCp^_`B*M5F#HbF3)uj9C?l|Sbsk&Q_Y9IyxU@<*OGU-g<|$# zhM=eo-mXbnE?;3co2DIjM%?+_M%Oq-*TeYGJ=pKDW|9_JA@pf)dta-6-U)dzAr{z(g_mqC92xd|0q0qz)p88%(~ zCU>6ROfx87c(~qj-hso9=Vf5KH>OR*(Fe-T5O^8xM&|SNOHCX8RUIVt;`8;@M*sHT zYZM|c&@;!b{>aJ^!f3WYxOdz);Ec!0GkB`co6vc7UqJaLv_PMjDwg~^z?ANH^q8Zm z+7B$fg94n6qe81dF9kCgVAh-}GKXW1RJ?s6JV{^^S)w;?A-ew9GTr`&1$%afy|mb? zBeN-;2f);B!OUB5_J6BMK>ppIWZZlyZKV@fB3eo@M881UO^U&n){E^Yh!QL$#XC9ZJbJo5l^NXwWD^PZtzrroox?CMXYu?C(6B58J*gRhl~|U;=n;q zJ&fr5`MF_Rsb{>81W>gjRF1zB)!~`fR+IN8Uy(4Oh_bV36ZCLx82#cqkhlq07y(LI zGbgjAvy(vZHjvc+nB&+D^tC+c-8X}EEWYg|T%6_9hAX4oK3_^6f?{1Mp)b13RpEE7 zZ|tlM?}pe;)+AiaAs$K!5i%G09%?xLO^6t<^poEQV|c)+4vI;oU?x$|vOKr`KY3F+ zfDaiWLi`ds)V5{!g&L@1EFlLLOZxSFE?>fveVxV2QEP%}mL~t4Ax+f)MD7WOpLa|H zr=%P@uPzY9P5@y3BLPxaMPagnVV({H6LbP~#-(!uusEXtK;P(BNb`-|pVA`mb|$7F z9)*Y4Bo4A9KkwqiIYTG95h(X4u}{iN!hd_ieVvXQT8I3$wY0CaC6MejW0MW(jfs35 z3Eg)fH5cF}?fZ|YcvS;BuS1=VB=wCWB>0S0MO@@=CcC=w|9JS`Km0?K+tSH>PaFAD zfDC%&CmvXxqive*>j5)-p_} zLI97%{e~-5)AQS;=WVh?A|23A9XrMHGDp2$GTCV*R}DU;T{qDCG_Ca$+RxqZrk^?~ zXnAaWB?Xv~?GY=TbD{U427%$dFU)M@AJmx;JrEzC!{F_VV*rBHBdRQI2&fHF>{QMp zDne1XxQ$~Q`nL3b(&`l*_mSqNDaoOZWfzut-cNxe z&}hgasq1#PayJ6DsJp?H{{St|5W{|Ad=9ZQJZS7Ud6Q-t?KiQAcpd2o`Yg7|1Fq`A z{&0z)Q@Y>Sl7Y6>pFRs5ZMO9pVb$L0^@0fR!Q^OgBYZd~0$&{7r$}%g2gIb5k&B#K z!1;_Abyz7m@M4hUffox-MWm{02c1Nm7*s>jx-iSrt$ucCR>$%egjhO3%@U%`cww9< zproOm56I828NmTxmB0I?rsR24BAph=fj5QD_9UC^X?NhVcp3920)NZKyyFw~fq^Hw zI(RCM4k2Jv31BS%c^scFsEFbzw*ivRc@G;Q_Oky;$;nSfrj|z4uQ6N0<}=yo*>?Cn zWqvg39p2ck{WvhpF*5U*U8kJU_)~w@lu|V=o25ZJ?z$AxH5!(d+j*uwG8U^{S(`S$NU@&ngPSGk<`S z69TR{7j%fgS80fKXXQY&jzr9`<5p`HfA;Ydgd{#8&5!Z*i$gvFff>{36QaMqd~~`r zd*2WEe0!Lrmoz4UKGe`g030@35J2-kb7%=sEL#2nlo7S!e?n*XA+GLyB+x6zg8`r& zR?lG$lPWKl?uPbe&`R65GHreNg9s$HS~)+_+6+sh&=B(a{Q~gg^$WJ^RlulpzGCaa z8Nr%x7C;C`#|+M%T37*6?BC^rBiA46Llnv@Cd)_`YVVvU;bxTpuL~d@%4{yE?b#+i z57#2S%OP+04~9O`#R7(eaA~7jc$@_c@^;0o2+7>HnvW-fKt_LfS0;ddO~(?6TBt3^ z|GM>B)-Q>-0zXT3|B3z{zZj?Wcau|2d58lc`slTrU(f*T9CUjNZqL8n2;ep+Z}~2e zja;J>`FD8w9t>AN$fxU#CZ(@1^2-eoFx<@C=r8TpTib5Rio66U_1EZHc3@-?uv+`~+O@Jb<%?QmaO-r%ja1lv(Q~IYOx-}0(y-OPl0-AgF52zJ5 zw%J4Qw-ct|#AL2w0lYF_xb-KkaQR(u#j@#dDJx~ME|Y5k==`m8kU-Jyo2~nNaok?F_H57jn%kX z3AS{e0#+NVAgjYS&w}2x;Ok#GFIPliu-*W209_p|n1_thQj+W#6nL9sx7KXwv36`$ zG6)K?k){CfvJpY#`dHdodF6ELA$+a8U5TyRU;+o3MY)|?(EM6d5R>aZg|VUn7mb`p zlZcMcN3?oUA(;PgP3lx~Kl3~pAqACj-hIW<{i8D@?zU)V>rM?ZaJvviz|^N4(nF9r z$t_-ycp`k?6XvP0Ii4B_pdg$V!~w6cTj^eS1I@#^WaIA0t#qckCQLo}r}7(L|6Zy% zWUog!%XwQmR?x(PJx=T2NCOL9(yqWo~td$|j<+NF|gpgQy~cbuS2uLdXm8W@`WkF`~e`ROkni8WVi*zPY4b0A%nD z!edYwi_;F`qyE;6j-#t?2<8(C0i)gnNk>hFI+XxogUvSI9P8B2Fw9X_KEX@M{x#Wh zGt%IO_23>v_sJ7%iL{wqGoMO#*^&&HgHg{`1dbJ2Ywg58yM z<1mI|pp$BZY=8-)&FkbWpD0EvGlpT+B3T>*7At`dV{m4nO#k$prLXPh&&oUlRJA;Z z^h9=N6yqGzBQ6D|H99?Zdx>pF1eK$zn}mpRI}ZW@^Y0>Xqj{?=9dl6m%{ z@!SLEFMom8HjcAy$!z?5Cx2%Vsg;cmDOoI8g23~&eqKs<4U)5)$l9t<6qyTz82a$r z6$QdhjAhDJ($X%38dvkQC@h)d1<~fRj@sQv^!KS}2CmSt@`=wiWzW!2))yV5)xYq?aJf^d5;i$93q9G957MZB2Pco;b>OfTr+2Eq?8`% znN1XFrEJMUz`kj-U}C?%`C4bu>1SZ*a!1w6QrW#t`gpKQEJ@s2IIYHJTe#)=T1xxF zo~@HLdR`p?MIcA^8fzj&Hny8yH09&--`usgo(*GKk4sd<+jnJ+sRNL+?V^V<7UaX( zf#1IE3;&qphm*C8wXsPDT8m>!>yD)mWG4x>DL=5Joadc3Ye1i>(Pp>J zW90^Ni);U-e!sg7C0Xhrk_Tx*_~PKb)G^|vI+qc=24v4cME@Kdx@EWB1+&c`b9Yn( z&SLQ!3Le+L{OKofqSqKCP|@J-lb|FeME*X|;ySB3f)0V-@jINj&War~#4B}iR3kyx zFaOti@X8n7^76m_hLx0K(Pw|%j5c2?Rt}HKhP~Pmi6b`Yd1g#Phfq(~0OJ$bUjCUC z!nGxYQ{j2&oO9AFVwk^xSC9lZn_eQ> zx-YX?t|;`QCye3D^GDRBi(OG>lSeg)bF!#@=#@V&R&!AjgXq0WMR2tu+Ch-ccVM9a zsHjo|FxnJ1;xVe4oyOfTtc!F>M!@HE|53GT@NW3SKlx`0cnz#1JmFOTdG2tHqKh@& z<2u8GCi0GWqjmWl3^oBo^0UXDyQfurjB474p^_grIk~l{+n`6lX%OS4Fy%A;Im!3r zL!fz`E$KJ@AI4(&D=u4f$rWNvQT{m)a}S^q_8@c6@fr>B_2 zFJce82@ivpbX1PVdiBY{Xb7HVvnA~c|35#cCVWNoKXOS+TH!9D2L)S-c>q35Tz>&a zjT*b zP6B;ll(%`hbWqm%hxe}-2@ItbE49hpSaEfF<_q;-8R?*oWz?s0>*V z;taWkoR=#kl`C^Wy+j$yN9}#j$L=KOx{=e-SASg4wW#|b`ba(yNVQo4iq1ASEv;^-j}1eqTz~I0HE0StEk*A+jH_QRO07#a zI$u%yHzEH1fh*JI#?3>Ro`z?Jis&rs>gT*e;(rU97!IcD1O0%5=jGZs&HzL`iwvjg z`>Xov32CztlB2ZiO#tW&Jl32O0)BZh(yU0Y$d*2x&py?QV$kZyPw0@SY>RykKW@>wN2e!q%uDA! z=Psi~S%Zt0#`A{tY!dreDj>XWYY4a-$at!pfCH@GzYTTnf5`V#AH3|LD<6>45k>06 zgwjo)Xq^Jd_QP=AGmzn=Z9WX3tK@D&WeM5ltOMMoqVZhP+))Xc_cWU^EPAP0fa|R$ zWIAV8f)D>tj^FR6jV{Z)JMVMPUz%0jZrm3?yFmh5(p4*rs0JG2CdOw=_hL8T0q;CS ziyY^!cb9RMCIqDO2UrXR2+ZH(MlfXdlIb-5>VKhA@9`i*vE><^^KjJ?8k7aRJ?EI^%$w~!~|;$WZ@oNzXkl?UvcZ4-%DCb6BJYhkszUf zV-J-rAKcmK?Q=}NI`4^34cs8B+s=v>;;R?$7BPP|u;$a2Rf2e_FLI}9UvKwZzCT`D zTGF|;e6BeaQ1zTsqCy4)gDpd6UU%Bj8Vki4M)&DlZ$Dx|2eH$$@b0q6PG1Vjl2oXt zjz=wA9y$-{VdxFnmdyT{wx863o;8YrFSCSmrG<{gr3ep`&$tcHkj_t|hxEo16XX6( zA++W06kA`<+PuhJ3u;=3Z8?1Svh%+~)1$?*%Jf2ojm1Vv>W6%Tpc1a}PVV%|Lcca% z>8zX_6XUkF@o55ih))JZs9fUg&A(xwzMQCC()FQ-QZG3PE93plZmm~i!pR%9UCiG| z@%?4DsboEl#l4_`CUY_3GybmKqnmL>myf5j8A$k$;#+~A!E^o@kP7R{yAodQ`MEf3 zRU6=MBIdK?IF;Gi;>nco;R!Dux!G#)xoTGO%vptp?(2D>ztd73;y?9fUU}H^2S_Av zV$^VZFX3Id6swqaCM8PR{~Gps?=yF=C(BE-kH8BeN~>a@TcKdj{p5#V9XRnAX;h)fPa844ar`=()slmLj(f=V z294q><-!K5^Jc%Wl(B!nKRqTsDvrwVZJX7j0J`bBUEAx=ed2W=3+!iSJJvkeri%H< zFNtP7eh7q^p)2oGRv|5xxUQq?*nBaqIj~qBO6Ot3VR$Pc9?9_fq^(lLmLI0%dku zC54A+OoMO793FEi78G^6b{LIZCn(vQ=Q|sw3zL+87XG~)9%NL=pOo#ek~6B^KGP|Srm z?d5$6zpG9BD7m`M`Dc?*q(9FucxBqR{_S*w7gCsQi5^Cn-eKj=@zXE7z?HBQ{zvv~ z#B^wQ(e2%4{cmQK4TA+2kXK8539wQ_f*sOmtAftaH%kiL9&k(5IH7mi@0sx-S0`sGJ<2~cY)%%c(x0*Ly3+_)&S*ek*no?gg@GKx- z-h3h8YJi0$^lduUq@?Y^!#l<>n=r5axVGf{UfZPEsZUt$oa8c=sF01AkhS2uUx})D zwm?|91j`>ZyU2$$^rt{hITi4J%5SYK_xBh^MXB(6*3=PqMH@Z~?Rvv-Qvo})hwQg{ z16V~9gD6yL+EjfJ?>*CJjJs)Bd=LQs0VfRd}KqA%y z649?kW4E33e|j@}mYN z4l!89b-$$o!`zj|+sTtPrnQuhQfgA55%gRp<-xe0kfYFU?5CP|bQWiwtWw4G=^S+b zw(3R}cRKti;w0Fab=8&Y>S8}_=RfTw3S+#Dc!wL$reuwuH5p7gVP=}2#uQ{zBp>{1 zbhPEEzV6kCxcYiO*%CV$Kkp}hw@n$l{15HKdSxzydPF7^b$L^weA{-nW8{3>KWA;< ziJ%hM%x=pp3^u66`bXzcnf#fNDmv}Tb&#F$Nd1|0<35-2++KlsSxx3B`sN+SL&fhL zlt|KHHkqp<)aPu1To z?$Sf>*OG?kPxmvA+5DBPwI5dvVBsUTEzc^G6!%^4l9UQgr# z7MNoP)USGFQoh`4VAN=p_j&tgh_kohSn*JQHL9HT4IVxzWW49`GDIpcHYquFn7}(a zEm_LgBufPR1#|6zcOK^?oRSJL3NS(6jzqZO5^izhW&9fQi1sQBN#Xq}M7@vagqUX- z{I0goAXLO4sgL-mB98;aydCtzlRVipbYDe0=!dArQiS>mG>^P2Nj3wmnL&;CG~lF6 zu_NjCX#4g`kOpp?Dro$otGc3P;#&;w6>f5ksD?{>PJeRiIqsEoy z=@y&ldr29(WGRU^0V<2~XR?uhYN9W1vR*oT_ErM52gbZ;GfbDDZxz9HQ&uQnF?~Oj zZpmI>4t-y!fVLc(F^KBnzPTtc=5NH&oaUZG)yFiRLVx}F);T20C&2QK- z*rJ=FAWoBPpc7rAUa}ShgFvgOZrBb`>#8?jiUlTT{C5290IDN3yw}dVIwoi70#mo2 z<-_e0(!Q#&W@67NUsu@V+Du6g`dal?@mA6(K9PO_eXL!Un=wBwf?3asmIq?>q2UY@ z@ho`8pE-sPaz>0te5X}`NK}RYbfwev>v`%QI~Sd+C(3)`u{XTL`4M(09ssA~QMaQv z>3BAs`TKpS2kkG38|FODlpQYP+L}}eNhZxAh2Fst({w{VSN_IT8?US2a31V~fdj8x z*NTj#v8=~_@whKjOGfAKwG+%4Y|}M5IRn|H<0F*iblq&8SK_9 zd@@1niso^3qnHl#+*Vj}2>K-WR=~dAb*F_mK-6uUeeP`435g_|k-XrOaeboOG#q)! zcmBo1CAELj$J;PV)qK)nO8&1Z2G7!RVx2)P#1||HRX?y|rkP{x^9V{cEc3L&y5!QY z$7X%M-FyougiqXwwidp6HPex_%+rVT{k6!$yBZ;+!@0r6tX$^%adbK^2Xa+)+`=}~ zU&>w`Z;#oYC0ur$tJ%?|v<+|A6$V z4C!KLZ$B-1n&X6%8ya-CPg$0Z=`*o026=D1NE7`hzq(MIyJfRqEu+mnhYw(_p2oqM zdp=HGq=tX-KI0o(==I{~VwFvF4gi_bTAnXqdHKJq=z(>J&7uPt5w7G>)KcQY4e!GJ zSj1+&JWW^!oThQ|N3_$Ao@SYZQe1n5KH3Noqh~BK+2RBp7T%R`R_XG!xX=eS8+y4H zP_4JU8++9-_NtTdus`rjfPv+NfcN->PyIr7QsMj(=3@cpJWpelu;Zm$rpBn%$3@Su z%~0IMoJ5Q~I&+DmD5I>CXycEz>+W1v)EV-vXvlmF;@6*imY+d<`I~1fvET5JOHQm3 z)yIi&H!GeyrNd?cK`@t)+3}D1rfQ76|PaX2jR}@jXVZA0PGoc*pdu%xBJYj_e z!$)m-(rmSY?XlF~M8=X;`3V>i_Zrxl3aiH%B1IZq+(Qx9V_>7U{}I9vO1__?ttf9K zcHIm7bv2lY#kWb3p1x@qS*%}0h9l8-?#?t3hNFnrs=S<`9d-P2re&4K%73RyF5?vR)9cEq8X;C#G+0`vW*FI2s@>g5+ob&BvR2n zut11DO?f6o{Ibg4625Vu&f2yPT@F8p_Lmg5hZb;=vx#rIwqO!|e5M>m@+FUP{n|~I z5zftsrz`o=#gKksPi7^8QK#WDX>h#Qi48RK32Rpc%v_I*3S-YdmQ>`4W=Ee$jpVuHecqR#M$tHJ0LJSJuXlbIcbAdCLQ@nX{kQ^so7) z$3Z@TmWu*RMgZf;xmDk`LB0AlDf-ZRxgtX@EvOkGd?RB3NTsWpV5*g7!KeOdiXELp zW8fYheWi*q+qx=!ryyyTY$`FW_nhm+(cV_WZh*L) ziFCchb9i-a>17dk^^vuSw6#ltbd)AvLX^P`4%}6HwmH5O-xtZwM+FGVm>D!X4J!FM zUKre!Tl!G{&em3{$Y(%F_<({%hBUI!4n=xQV;$z)Bb?d4p|OikvKdV@uq!XN%Z1#K zu9@XX?TgExFt(2fMsD-$j2YUcL(&EkTc$=r=LLtkTrJ_VPO2|OYdIL&DQe!Mz2g;+ z1FVgWfcXdTIzSf+C_uV`f?%jM0;_a4?M;Af44?|F;j*1|iS()S?Vrv%yl-QMpFckk z?*`VKz~V1F+2M4!VSO(EX;Qd!${Q8_sVh@?0mjYO&jot@wPsDzu}v*FFn@kYfkbty zqgM0!6Yoh;C~?v|{{roA1Wm&z2XK|qEgxr{#tOvXXXEH^Lw4y(dpLMH`bg#8uVCt zLa)nw=hYRr@K7@ddI4Yro8M&Pw@+de_{RYDP}@!ERgF8S4#BS5kBVIAS0woH*?njr zVD$&p#KjgYeKdC|or4R|_i4c>1PW7@qTDe<;w#*dpqQs` zn4ePue*WDM*16gG`zs`Ns7kYueP>E=Iact;#-QO0Bk&7*7J|3K9GKSkgqC*49u^;t zqBJ{nLi3>^AkF8|^M`H!;0w3l{*&`fy!5UaT?v{W;RBD)eR>1ogS32|>SJk$aivXbr>v0DtgS)E8v=m+mB@cPf$&bV~7v`u^@FSE3h$ za5qA5@n{)deL8tqa=`dCO`|9`pew#r-W6veW@2$KyV#xP^_xt{Fo5-p>y;Y%mx0vi8nLeKyX*1so&%9>EL_5BaRf{p}0qJZf`CYN3RKB*<95r`xz+o43s)Zg@R{1z zz|F=@@MEaU$dGod2K#yI@E-kDX2+sf#V;j?XBTXw`a}fo$c%^S&E*4_?sk@AVv(Qq zEkge?z6o3U8R5IjWk2$;&Bz={;5xBk)v#+nlmgdRw24Yr<@;5ZWa3cB65V_r;v%|T z(Wu1bjg+Ejm5d7FLuY;&u%c2D^y!l(m8@t15__!LsKdxxK}7-2)|iw;^lmxt$V1`Z z)q&yZb-^GiHSEa@@0F{U_g1f4E6|v(^r9q#crLt0Or1BBR5ofwD$9O{M9Q8wQ8{+y zc1g}BvAEF$Yv5)m60A*6lNSpl_?CC#h^03-5+znJe0U@Fiise({^V?=kyZ}Q&Nm{M zu6iQz`21#4sTA9?5Hy-{FVp^Jg4e@{e3_HD%DM3vW%-S0{T|avV}v71DQ%7&csHq3 zLU7CADJ&=RB<#ZvwpoWkNR|}eZ@X3uYBBs>b~AMLsqxyw6sO-W*Q_3kWAbz@7Re02 z)nY9@wB%@&6)&fu+r}x5578F**4b9m!Bdwv39+ODW>-Y2>|zuQWTmeU#DE>NFo&?R zvlu$G!tck-p`+$d(;J3y>lL@~4%pb6$z3UcpbA1;2obTOi{Mxa(N+ z_XG4cfTeTbDx-@?$?$`Z`z=t)WXzq*9#z zl@;|*Z!{-?9*cK7j-jtn?b-z8`47&h1-gq2u+%KgJX`c)G@Gu9S**%2^NNdV&Fd`b z;~kb<*X_`+wXa}V$W^Ud1L>rrsk1;|Ug9yrE( zw}wcbl<*qWOfWxP~Vknw0b=Nf|j8KZpv_I__THA77kUxKat zl~0;(X2}_}o^<^2jpD6Tb^@ytt^dS*N*x{dYBAmxIX0W!u`<%HL68tU5f1Lss1fl! z^MtIe_mu7dm6thqK$)tQGu3_^qIVU>uninOf9ivmqCS}gd>4ZI1cC#BbIw<-&n(af z{rpsIdyf~LF-_gYCm_LR-x-_+^w?o}d#FesN zw4?7+S$7irrDc(x6Gl+8y^)!*)$GuCwoCaP7kB|lOyHcfQR1yy z|DJaC);pFej;83_o^HRlV@0J>tkAMw(~NH&c^*~N1rGKbD>JUS1~tq%=xkm5sW~b! z1SkE%P)J=OK=GZ}X(?Y~O+V`To*`hg4M=ywz2>A#AEgnCyAODhyni=;{^e=I6r2mJ z(c#*|fs$FET7H!(GtKcMK5iOP((A-`_{~u^c=JgONJ$nc_?hgAG+Gxg-GVQThS0E; z>G9K-M>zNl4J|`QD2D8?HLIuenb1(Qv?DFB^K6H9lr<`8g@^6iHJ+DFXcsp3ld!yr z6I3P@(+oxRwsGLU!LEA6N(g&NL%Yu)mT z5fmrvJHPMQ+bl_F{LpYYv-~&d+rt-2dK%P` zc8l6~p6Qh-n@A;dInnJ~Ob5H#Q(8f>M^;h3Z(%045WbvmszYL1PWDK?zHVtOwd6CB zUnlbIQxB+Q_-59B%-KfPlXMkWP`(bI>tt zqZtrr-l!sxUO5829)N5(wU}K?BQC{LkMh;0uL^R_`5EGIJo=cO{&79??2-SaLblqq zwRhUfx@}R4dg~a;q)4QR@Tm2Y&GQN4kz_xLAQTl`*;k=x6yjhyjgucNuF))pC(}c5 zbmy>dV^)%66Q|JD%0%aAAjTE6xDgN9bFNt@?8@HgTH7Y<~U5yl)QkJ8>LKWR2asbZ1F-?sU*wZ zl|@TMHeI-G%=Zd=W|*Mvx8MS)iT6D=T58(x5xte`qO8{22UA?-w*j#@ICrF8i^#&1>Nqh=q|10KuK%w6s*S$7Dw73|3`7kpY z01^R5+J=7dy@4-kxxE9tRMx3~N&0$1_a07tCZ1KriD+QsjW@5qnmOU_RS#i}_HVl2 z3#I?=t$1Nj-?>4cdXZN-rYW2=9(SwP5-j-}TH%7N;rGMhoqS2q(8ErN5pn&B;dX-% z1E=1w>c-|KI@n@FK=IG=1#Rfy4*IO=uWpUhVlUMO-C~7kc+IC5rdn->U8O}V*Gb@I zMgA&Ai;kkDPcy}JErp_B@OK&27PZ0wm0LFhlN;9U7#KVYkF>}wc_HSYYR|#?{N+}4 zxZ|g2Y+J2@IO(L)-#_mJ1Pk3Lp>R!nHr}0Z{j0#Gv4oYtH$uU>lD(6%8+gj#lX*PII4Kve-w?tap zBrc4eOp_h;Dcy{7;$x^#NSAB!9tl<3!iewZEVorvsgHVR&ffRR%T1aqU$7llKKXOw zrWiH$O|7)%)%06?Wz3&02xRJ6D;VmxMWl4t9NTLP*%%t# z!7d3^p=N`QJ?fj7YriTugoBCDaZ=p zES@&A=_!2sAaC{ZLGD(6M;BLerYc-`CIps?be-GG<=;(n>Wr(FcTa`S67SMk&r*)G zXl)jlBhaR@*;!{d*(YXvmqEl}>z^nCRs2d|p7c4={n_?s=5B3A2UI4(5UPqt=Ap!L zjzU7dcNeb?g_|-B^*&GxyJ>EQ5~492V6w~zc)cD!f7VjZXRLxlC%{pDXxtq1lHR-O zK)UG*Pw`2YSjktF+aoM&pWVj+Fa1DH4kU(W2V1K+y)IbNBgdytO)CVtO;7ba{H!UM z_rVRrb=+r5B&baosWTokZiY9-n@Bd}AB6`f4kN_Q7C5fY-%uGmkiDF(^ZRMbrFGG& z5$fC@oE9~52}$glEZ3mSnrLhsuWhx9cjyVH$NorFm3>=5naYyb1?mPz@%%*Zkr#6) zZNfytkLi8mNTK=~CTc8rB4oF0w}LEmgaR*2VIf17*&kmldEW3%Q)Q?Emu&0w3j<#L z#cCqAd-`>j{LIhRW!=vKIzG}rv6==~#4gk7+|vU|lS1e~OnAR&iYR5#e&KIMENzWL z?LkPJWpk>pBoDPpOZ4B9;gQaM)c$^=0W(0XV&VE}1EHcXe`1x70%i3r%x@C86gDcPg$o{CItKSQyLvCSDb)Ua%Dp0ixe^^=#%K?qP%H#saXHAnK#gsQJ~8 zK6#9`?l{rAe%+atUjxn9y!}w0X34%$hPc+s6C44Uyv_+bcMs1snq1C8+k)(*KP#p| zb7k-yetRSjhTo<=IW|4h(7F)|ybk+{Y`(0L9@=0>nTIh!9pSMV!gd?2X5{_RLS!3x z0l8v+>Uj9GD|yjlWVVXDBJ%cIWWtWGD7gMyR#$GPQW!UzuWs2Rt>}?PoL1Ig>-&>A zM#0%oTN0blD;nM8Y0Vkx8v;}esz&3G%_f52gbJL^Hq8BqWNQ}rwb+FkQ8l=M=AF$&5ciu`h&&zs;kSmZ;$`2VT z(Hc@raZ4_{zPaLXrQ_pyDV?5T&B^LGSCQOcR!PV`&m0#&(x-2kFhZLf#L{Pi&FXUF z6J%To;-}VcaKV+Rz_wlZlS|(pSDQB={cdTNlP>FqrA``*dw{&rxvd!}G1^Zd@MfEg z8rQ$89fe4nr&%f7ra5}rJMFjrpSQmAs_U}yKUhnRWEOoq>hyZP)YW0XpM_7$g~_tC zF6Y|fOSDW=UldKD*JY!fJjdMdR6dZlHbH9sWAzFrgq+c%{%dgg*uzNT-QCySDLa3g zCIBZEkQj4LkP*fZoa!7mup+ai%6Q4xhcG(;5CoaC$E_r_x`8kKS-YJ$tamQz>`B%Y)*hlhKmFD0yEHD*Tgbyk+NZneo2jz>icTW0QBV(Oz3&PoJ?)+&>?a4D1{bqwbFg(+5KOorKA zXhdU8Ff>_<4Ak#LorZ_WIpDZlWmo=IJ1wcT$nG%XCFx3Jnm_q;qdfp#1||am^sHq7 zLH0ghY`oEz5xJE143mdXu9q5ZgG>5A@}LgtKhF$zBx%l(T*BT`lI1I;h4z>Xl(l0A@b0{B|uy`^(n@HcPJR)8Gp+3iE6U4_BcYmx&S=rX=- z__3XW@z0{YR}iq;0oKHEGrZ{B z({Lx}5d6H8(E69LyzA7&S%XC88?WmrK|X91Ybrau1I5~4^FOjUNIyFJDciB04C;|U zokit@r{59hj6wM1a zRZ?sN(wK*29KR;NeKKo;gCQ+?r-?1RAeh>Nvm>;{za;?hhN(FM*DpcNtvMbLkvog% z-@g_;*YhnqplD+Jq-sR_4njGQL)cG;wmb2#)|)siGu|w%U)W6>TTenPt=>KLP3JM4 zCe8ky{c+U~b-eyJ{c*n@UJ*!#{>4b%rtY~UZQ~e}5qHgc@)$tzqN2Tvh(2_04xTaV z3M;;UPMcY<^6hKNSzp76`1zmwKX8{PZDua4JuiYP_g|%7v)9!jXZ3VFd?+NK1PIozeYVab|ag{Ot4cDo)}obVm0{e z82`+vqoe`fGB38F0|IB6OKXJ*77olfe$aihzq9bmptedGX7H=ySQLOr128jduY1(x z%;_0uNVZ#CCtlApf69r2xy-V9cxQ+5da%WWincDL7{-2ZR4B#wG&-$d!i{Z;XFjmU zdOw<*<(43$S45{gFkS;=7XKGh^(zfj(!h1*!pX;ab&=RFw%|iiTM6o-m=5YsU3E|U r9%r`Yi2GA}L8*+ZT3fe-b?^${2>et7hoHh?bgYvJ5lF*mNdIpDPsiKp literal 0 HcmV?d00001 diff --git a/litellm/constants.py b/litellm/constants.py index 43a8eba3c1d..fba57a2bf9d 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -282,6 +282,46 @@ OPENAI_CHAT_COMPLETION_PARAMS = [ "web_search_options", ] +DEFAULT_CHAT_COMPLETION_PARAM_VALUES = { + "functions": None, + "function_call": None, + "temperature": None, + "top_p": None, + "n": None, + "stream": None, + "stream_options": None, + "stop": None, + "max_tokens": None, + "max_completion_tokens": None, + "modalities": None, + "prediction": None, + "audio": None, + "presence_penalty": None, + "frequency_penalty": None, + "logit_bias": None, + "user": None, + "model": None, + "custom_llm_provider": "", + "response_format": None, + "seed": None, + "tools": None, + "tool_choice": None, + "max_retries": None, + "logprobs": None, + "top_logprobs": None, + "extra_headers": None, + "api_version": None, + "parallel_tool_calls": None, + "drop_params": None, + "allowed_openai_params": None, + "additional_drop_params": None, + "messages": None, + "reasoning_effort": None, + "thinking": None, + "web_search_options": None, +} + + openai_compatible_endpoints: List = [ "api.perplexity.ai", "api.endpoints.anyscale.com/v1", diff --git a/litellm/main.py b/litellm/main.py index 44611e203f0..7f1ecd737f8 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -86,6 +86,7 @@ from litellm.utils import ( ProviderConfigManager, Usage, add_openai_metadata, + add_provider_specific_params_to_optional_params, async_mock_completion_streaming_obj, convert_to_model_response_object, create_pretrained_tokenizer, @@ -99,6 +100,7 @@ from litellm.utils import ( get_secret, get_standard_openai_params, mock_completion_streaming_obj, + pre_process_non_default_params, read_config_args, supports_httpx_timeout, token_counter, @@ -1140,42 +1142,55 @@ def completion( # type: ignore # noqa: PLR0915 if dynamic_api_key is not None: api_key = dynamic_api_key # check if user passed in any of the OpenAI optional params - optional_params = get_optional_params( - functions=functions, - function_call=function_call, - temperature=temperature, - top_p=top_p, - n=n, - stream=stream, - stream_options=stream_options, - stop=stop, - max_tokens=max_tokens, - max_completion_tokens=max_completion_tokens, - modalities=modalities, - prediction=prediction, - audio=audio, - presence_penalty=presence_penalty, - frequency_penalty=frequency_penalty, - logit_bias=logit_bias, - user=user, + optional_param_args = { + "functions": functions, + "function_call": function_call, + "temperature": temperature, + "top_p": top_p, + "n": n, + "stream": stream, + "stream_options": stream_options, + "stop": stop, + "max_tokens": max_tokens, + "max_completion_tokens": max_completion_tokens, + "modalities": modalities, + "prediction": prediction, + "audio": audio, + "presence_penalty": presence_penalty, + "frequency_penalty": frequency_penalty, + "logit_bias": logit_bias, + "user": user, # params to identify the model + "model": model, + "custom_llm_provider": custom_llm_provider, + "response_format": response_format, + "seed": seed, + "tools": tools, + "tool_choice": tool_choice, + "max_retries": max_retries, + "logprobs": logprobs, + "top_logprobs": top_logprobs, + "api_version": api_version, + "parallel_tool_calls": parallel_tool_calls, + "messages": messages, + "reasoning_effort": reasoning_effort, + "thinking": thinking, + "web_search_options": web_search_options, + "allowed_openai_params": kwargs.get("allowed_openai_params"), + } + optional_params = get_optional_params( + **optional_param_args, **non_default_params + ) + processed_non_default_params = pre_process_non_default_params( model=model, + passed_params=optional_param_args, + special_params=non_default_params, custom_llm_provider=custom_llm_provider, - response_format=response_format, - seed=seed, - tools=tools, - tool_choice=tool_choice, - max_retries=max_retries, - logprobs=logprobs, - top_logprobs=top_logprobs, - api_version=api_version, - parallel_tool_calls=parallel_tool_calls, - messages=messages, - reasoning_effort=reasoning_effort, - thinking=thinking, - web_search_options=web_search_options, - allowed_openai_params=kwargs.get("allowed_openai_params"), - **non_default_params, + additional_drop_params=kwargs.get("additional_drop_params"), + ) + processed_non_default_params = add_provider_specific_params_to_optional_params( + optional_params=processed_non_default_params, + passed_params=non_default_params, ) if litellm.add_function_to_prompt and optional_params.get( @@ -1241,10 +1256,7 @@ def completion( # type: ignore # noqa: PLR0915 cast(LiteLLMLoggingObj, logging).update_environment_variables( model=model, user=user, - optional_params={ - **standard_openai_params, - **non_default_params, - }, # [IMPORTANT] - using standard_openai_params ensures consistent params logged to langfuse for finetuning / eval datasets. + optional_params=processed_non_default_params, # [IMPORTANT] - using processed_non_default_params ensures consistent params logged to langfuse for finetuning / eval datasets. litellm_params=litellm_params, custom_llm_provider=custom_llm_provider, ) @@ -4027,9 +4039,7 @@ def embedding( # noqa: PLR0915 client=client, aembedding=aembedding, ) - elif ( - custom_llm_provider in litellm._custom_providers - ): + elif custom_llm_provider in litellm._custom_providers: custom_handler: Optional[CustomLLM] = None for item in litellm.custom_provider_map: if item["provider"] == custom_llm_provider: @@ -4040,7 +4050,11 @@ def embedding( # noqa: PLR0915 model=model, custom_llm_provider=custom_llm_provider ) - handler_fn = custom_handler.embedding if not aembedding else custom_handler.aembedding + handler_fn = ( + custom_handler.embedding + if not aembedding + else custom_handler.aembedding + ) response = handler_fn( model=model, @@ -4049,7 +4063,7 @@ def embedding( # noqa: PLR0915 optional_params=optional_params, model_response=EmbeddingResponse(), print_verbose=print_verbose, - litellm_params=litellm_params + litellm_params=litellm_params, ) else: raise LiteLLMUnknownProvider( diff --git a/litellm/proxy/_experimental/out/onboarding.html b/litellm/proxy/_experimental/out/onboarding.html deleted file mode 100644 index 82cebe3a379..00000000000 --- a/litellm/proxy/_experimental/out/onboarding.html +++ /dev/null @@ -1 +0,0 @@ -LiteLLM Dashboard \ No newline at end of file diff --git a/litellm/proxy/_new_secret_config.yaml b/litellm/proxy/_new_secret_config.yaml index 5fa3e618c22..58b40e8f0ce 100644 --- a/litellm/proxy/_new_secret_config.yaml +++ b/litellm/proxy/_new_secret_config.yaml @@ -79,7 +79,7 @@ model_list: api_key: os.environ/OPENAI_API_KEY litellm_settings: - store_audit_logs: true + callbacks: ["langfuse"] general_settings: store_model_in_db: true diff --git a/litellm/utils.py b/litellm/utils.py index 65d825c979c..f4f3707ebf9 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -63,6 +63,7 @@ from litellm.caching._internal_lru_cache import lru_cache_wrapper from litellm.caching.caching import DualCache from litellm.caching.caching_handler import CachingHandlerResponse, LLMCachingHandler from litellm.constants import ( + DEFAULT_CHAT_COMPLETION_PARAM_VALUES, DEFAULT_MAX_LRU_CACHE_SIZE, DEFAULT_TRIM_RATIO, FUNCTION_DEFINITION_TOKEN_COUNT, @@ -2671,50 +2672,18 @@ def _remove_unsupported_params( return non_default_params -def get_optional_params( # noqa: PLR0915 - # use the openai defaults - # https://platform.openai.com/docs/api-reference/chat/create +def pre_process_non_default_params( + passed_params: dict, + special_params: dict, + custom_llm_provider: str, + additional_drop_params: Optional[List[str]], model: str, - functions=None, - function_call=None, - temperature=None, - top_p=None, - n=None, - stream=False, - stream_options=None, - stop=None, - max_tokens=None, - max_completion_tokens=None, - modalities=None, - prediction=None, - audio=None, - presence_penalty=None, - frequency_penalty=None, - logit_bias=None, - user=None, - custom_llm_provider="", - response_format=None, - seed=None, - tools=None, - tool_choice=None, - max_retries=None, - logprobs=None, - top_logprobs=None, - extra_headers=None, - api_version=None, - parallel_tool_calls=None, - drop_params=None, - allowed_openai_params: Optional[List[str]] = None, - reasoning_effort=None, - additional_drop_params=None, - messages: Optional[List[AllMessageValues]] = None, - thinking: Optional[AnthropicThinkingParam] = None, - web_search_options: Optional[OpenAIWebSearchOptions] = None, - **kwargs, -): +) -> dict: + """ + Pre-process non-default params to a standardized format + """ # retrieve all parameters passed to the function - passed_params = locals().copy() - special_params = passed_params.pop("kwargs") + for k, v in special_params.items(): if k.startswith("aws_") and ( custom_llm_provider != "bedrock" @@ -2731,6 +2700,72 @@ def get_optional_params( # noqa: PLR0915 continue passed_params[k] = v + # filter out those parameters that were passed with non-default values + + non_default_params = { + k: v + for k, v in passed_params.items() + if ( + k != "model" + and k != "custom_llm_provider" + and k != "api_version" + and k != "drop_params" + and k != "allowed_openai_params" + and k != "additional_drop_params" + and k != "messages" + and k in DEFAULT_CHAT_COMPLETION_PARAM_VALUES + and v != DEFAULT_CHAT_COMPLETION_PARAM_VALUES[k] + and _should_drop_param(k=k, additional_drop_params=additional_drop_params) + is False + ) + } + + provider_config: Optional[BaseConfig] = None + if custom_llm_provider is not None and custom_llm_provider in [ + provider.value for provider in LlmProviders + ]: + provider_config = ProviderConfigManager.get_provider_chat_config( + model=model, provider=LlmProviders(custom_llm_provider) + ) + + if "response_format" in non_default_params: + if provider_config is not None: + non_default_params[ + "response_format" + ] = provider_config.get_json_schema_from_pydantic_object( + response_format=non_default_params["response_format"] + ) + else: + non_default_params["response_format"] = type_to_response_format_param( + response_format=non_default_params["response_format"] + ) + + if "tools" in non_default_params and isinstance( + non_default_params, list + ): # fixes https://github.com/BerriAI/litellm/issues/4933 + tools = non_default_params["tools"] + for ( + tool + ) in ( + tools + ): # clean out 'additionalProperties = False'. Causes vertexai/gemini OpenAI API Schema errors - https://github.com/langchain-ai/langchainjs/issues/5240 + tool_function = tool.get("function", {}) + parameters = tool_function.get("parameters", None) + if parameters is not None: + new_parameters = copy.deepcopy(parameters) + if ( + "additionalProperties" in new_parameters + and new_parameters["additionalProperties"] is False + ): + new_parameters.pop("additionalProperties", None) + tool_function["parameters"] = new_parameters + return non_default_params + + +def pre_process_optional_params( + passed_params: dict, non_default_params: dict, custom_llm_provider: str +) -> dict: + """For .completion(), preprocess optional params""" optional_params: Dict = {} common_auth_dict = litellm.common_cloud_provider_auth_params @@ -2761,65 +2796,6 @@ def get_optional_params( # noqa: PLR0915 non_default_params=passed_params, optional_params=optional_params ) - default_params = { - "functions": None, - "function_call": None, - "temperature": None, - "top_p": None, - "n": None, - "stream": None, - "stream_options": None, - "stop": None, - "max_tokens": None, - "max_completion_tokens": None, - "modalities": None, - "prediction": None, - "audio": None, - "presence_penalty": None, - "frequency_penalty": None, - "logit_bias": None, - "user": None, - "model": None, - "custom_llm_provider": "", - "response_format": None, - "seed": None, - "tools": None, - "tool_choice": None, - "max_retries": None, - "logprobs": None, - "top_logprobs": None, - "extra_headers": None, - "api_version": None, - "parallel_tool_calls": None, - "drop_params": None, - "allowed_openai_params": None, - "additional_drop_params": None, - "messages": None, - "reasoning_effort": None, - "thinking": None, - "web_search_options": None, - } - - # filter out those parameters that were passed with non-default values - - non_default_params = { - k: v - for k, v in passed_params.items() - if ( - k != "model" - and k != "custom_llm_provider" - and k != "api_version" - and k != "drop_params" - and k != "allowed_openai_params" - and k != "additional_drop_params" - and k != "messages" - and k in default_params - and v != default_params[k] - and _should_drop_param(k=k, additional_drop_params=additional_drop_params) - is False - ) - } - ## raise exception if function calling passed in for a provider that doesn't support it if ( "functions" in non_default_params @@ -2879,6 +2855,64 @@ def get_optional_params( # noqa: PLR0915 message=f"Function calling is not supported by {custom_llm_provider}.", ) + return optional_params + + +def get_optional_params( # noqa: PLR0915 + # use the openai defaults + # https://platform.openai.com/docs/api-reference/chat/create + model: str, + functions=None, + function_call=None, + temperature=None, + top_p=None, + n=None, + stream=False, + stream_options=None, + stop=None, + max_tokens=None, + max_completion_tokens=None, + modalities=None, + prediction=None, + audio=None, + presence_penalty=None, + frequency_penalty=None, + logit_bias=None, + user=None, + custom_llm_provider="", + response_format=None, + seed=None, + tools=None, + tool_choice=None, + max_retries=None, + logprobs=None, + top_logprobs=None, + extra_headers=None, + api_version=None, + parallel_tool_calls=None, + drop_params=None, + allowed_openai_params: Optional[List[str]] = None, + reasoning_effort=None, + additional_drop_params=None, + messages: Optional[List[AllMessageValues]] = None, + thinking: Optional[AnthropicThinkingParam] = None, + web_search_options: Optional[OpenAIWebSearchOptions] = None, + **kwargs, +): + passed_params = locals().copy() + special_params = passed_params.pop("kwargs") + non_default_params = pre_process_non_default_params( + passed_params=passed_params, + special_params=special_params, + custom_llm_provider=custom_llm_provider, + additional_drop_params=additional_drop_params, + model=model, + ) + optional_params = pre_process_optional_params( + passed_params=passed_params, + non_default_params=non_default_params, + custom_llm_provider=custom_llm_provider, + ) provider_config: Optional[BaseConfig] = None if custom_llm_provider is not None and custom_llm_provider in [ provider.value for provider in LlmProviders @@ -2887,38 +2921,6 @@ def get_optional_params( # noqa: PLR0915 model=model, provider=LlmProviders(custom_llm_provider) ) - if "response_format" in non_default_params: - if provider_config is not None: - non_default_params[ - "response_format" - ] = provider_config.get_json_schema_from_pydantic_object( - response_format=non_default_params["response_format"] - ) - else: - non_default_params["response_format"] = type_to_response_format_param( - response_format=non_default_params["response_format"] - ) - - if "tools" in non_default_params and isinstance( - non_default_params, list - ): # fixes https://github.com/BerriAI/litellm/issues/4933 - tools = non_default_params["tools"] - for ( - tool - ) in ( - tools - ): # clean out 'additionalProperties = False'. Causes vertexai/gemini OpenAI API Schema errors - https://github.com/langchain-ai/langchainjs/issues/5240 - tool_function = tool.get("function", {}) - parameters = tool_function.get("parameters", None) - if parameters is not None: - new_parameters = copy.deepcopy(parameters) - if ( - "additionalProperties" in new_parameters - and new_parameters["additionalProperties"] is False - ): - new_parameters.pop("additionalProperties", None) - tool_function["parameters"] = new_parameters - def _check_valid_arg(supported_params: List[str]): """ Check if the params passed to completion() are supported by the provider @@ -3608,7 +3610,7 @@ def get_optional_params( # noqa: PLR0915 ): extra_body = passed_params.pop("extra_body", {}) for k in passed_params.keys(): - if k not in default_params.keys(): + if k not in DEFAULT_CHAT_COMPLETION_PARAM_VALUES.keys(): extra_body[k] = passed_params[k] optional_params.setdefault("extra_body", {}) optional_params["extra_body"] = { @@ -3621,9 +3623,9 @@ def get_optional_params( # noqa: PLR0915 ) else: # if user passed in non-default kwargs for specific providers/models, pass them along - for k in passed_params.keys(): - if k not in default_params.keys(): - optional_params[k] = passed_params[k] + optional_params = add_provider_specific_params_to_optional_params( + optional_params=optional_params, passed_params=passed_params + ) print_verbose(f"Final returned optional params: {optional_params}") optional_params = _apply_openai_param_overrides( optional_params=optional_params, @@ -3633,6 +3635,18 @@ def get_optional_params( # noqa: PLR0915 return optional_params +def add_provider_specific_params_to_optional_params( + optional_params: dict, passed_params: dict +) -> dict: + """ + Add provider specific params to optional_params + """ + for k in passed_params.keys(): + if k not in DEFAULT_CHAT_COMPLETION_PARAM_VALUES.keys(): + optional_params[k] = passed_params[k] + return optional_params + + def _apply_openai_param_overrides( optional_params: dict, non_default_params: dict, allowed_openai_params: list ): @@ -3649,31 +3663,6 @@ def _apply_openai_param_overrides( def get_non_default_params(passed_params: dict) -> dict: - default_params = { - "functions": None, - "function_call": None, - "temperature": None, - "top_p": None, - "n": None, - "stream": None, - "stream_options": None, - "stop": None, - "max_tokens": None, - "presence_penalty": None, - "frequency_penalty": None, - "logit_bias": None, - "user": None, - "model": None, - "custom_llm_provider": "", - "response_format": None, - "seed": None, - "tools": None, - "tool_choice": None, - "max_retries": None, - "logprobs": None, - "top_logprobs": None, - "extra_headers": None, - } # filter out those parameters that were passed with non-default values non_default_params = { k: v @@ -3681,8 +3670,8 @@ def get_non_default_params(passed_params: dict) -> dict: if ( k != "model" and k != "custom_llm_provider" - and k in default_params - and v != default_params[k] + and k in DEFAULT_CHAT_COMPLETION_PARAM_VALUES + and v != DEFAULT_CHAT_COMPLETION_PARAM_VALUES[k] ) } @@ -6604,6 +6593,7 @@ class ProviderConfigManager: elif LlmProviders.OLLAMA == provider or LlmProviders.OLLAMA_CHAT == provider: # Dynamic model listing for Ollama server from litellm.llms.ollama.common_utils import OllamaModelInfo + return OllamaModelInfo() elif LlmProviders.VLLM == provider: from litellm.llms.vllm.common_utils import ( diff --git a/tests/litellm/test_utils.py b/tests/litellm/test_utils.py index 7a2b6aa0108..eccd5b798d8 100644 --- a/tests/litellm/test_utils.py +++ b/tests/litellm/test_utils.py @@ -701,6 +701,7 @@ def test_supports_computer_use_utility(): Tests the litellm.utils.supports_computer_use utility function. """ from litellm.utils import supports_computer_use + # Ensure LITELLM_LOCAL_MODEL_COST_MAP is set for consistent test behavior, # as supports_computer_use relies on get_model_info. # This also requires litellm.model_cost to be populated. @@ -708,11 +709,13 @@ def test_supports_computer_use_utility(): original_model_cost = getattr(litellm, "model_cost", None) os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" - litellm.model_cost = litellm.get_model_cost_map(url="") # Load with local/backup - + litellm.model_cost = litellm.get_model_cost_map(url="") # Load with local/backup + try: # Test a model known to support computer_use from backup JSON - supports_cu_anthropic = supports_computer_use(model="anthropic/claude-3-7-sonnet-20250219") + supports_cu_anthropic = supports_computer_use( + model="anthropic/claude-3-7-sonnet-20250219" + ) assert supports_cu_anthropic is True # Test a model known not to have the flag or set to false (defaults to False via get_model_info) @@ -724,12 +727,13 @@ def test_supports_computer_use_utility(): del os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] else: os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = original_env_var - + if original_model_cost is not None: litellm.model_cost = original_model_cost elif hasattr(litellm, "model_cost"): delattr(litellm, "model_cost") + def test_get_model_info_shows_supports_computer_use(): """ Tests if 'supports_computer_use' is correctly retrieved by get_model_info. @@ -739,13 +743,13 @@ def test_get_model_info_shows_supports_computer_use(): os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" # Ensure litellm.model_cost is loaded, relying on the backup mechanism if primary fails # as per previous debugging. - litellm.model_cost = litellm.get_model_cost_map(url="") - + litellm.model_cost = litellm.get_model_cost_map(url="") + # This model should have 'supports_computer_use': True in the backup JSON model_known_to_support_computer_use = "claude-3-7-sonnet-20250219" info = litellm.get_model_info(model_known_to_support_computer_use) print(f"Info for {model_known_to_support_computer_use}: {info}") - + # After the fix in utils.py, this should now be present and True assert info.get("supports_computer_use") is True @@ -754,4 +758,57 @@ def test_get_model_info_shows_supports_computer_use(): model_known_not_to_support_computer_use = "gpt-3.5-turbo" info_gpt = litellm.get_model_info(model_known_not_to_support_computer_use) print(f"Info for {model_known_not_to_support_computer_use}: {info_gpt}") - assert info_gpt.get("supports_computer_use") is False # Expecting False due to the default in ModelInfoBase \ No newline at end of file + assert ( + info_gpt.get("supports_computer_use") is False + ) # Expecting False due to the default in ModelInfoBase + + +@pytest.mark.parametrize( + "model, custom_llm_provider", + [ + ("gpt-3.5-turbo", "openai"), + ("anthropic.claude-3-7-sonnet-20250219-v1:0", "bedrock"), + ("gemini-1.5-pro", "vertex_ai"), + ], +) +def test_pre_process_non_default_params(model, custom_llm_provider): + from pydantic import BaseModel + + from litellm.utils import pre_process_non_default_params + + class ResponseFormat(BaseModel): + x: str + y: str + + passed_params = { + "model": "gpt-3.5-turbo", + "response_format": ResponseFormat, + } + special_params = {} + processed_non_default_params = pre_process_non_default_params( + model=model, + passed_params=passed_params, + special_params=special_params, + custom_llm_provider=custom_llm_provider, + additional_drop_params=None, + ) + print(processed_non_default_params) + assert processed_non_default_params == { + "response_format": { + "type": "json_schema", + "json_schema": { + "schema": { + "properties": { + "x": {"title": "X", "type": "string"}, + "y": {"title": "Y", "type": "string"}, + }, + "required": ["x", "y"], + "title": "ResponseFormat", + "type": "object", + "additionalProperties": False, + }, + "name": "ResponseFormat", + "strict": True, + }, + } + } diff --git a/tests/llm_translation/test_optional_params.py b/tests/llm_translation/test_optional_params.py index b29d20ba408..4ce18be8adb 100644 --- a/tests/llm_translation/test_optional_params.py +++ b/tests/llm_translation/test_optional_params.py @@ -460,6 +460,26 @@ def test_dynamic_drop_params_e2e(): print(mock_response.call_args.kwargs["data"]) assert "response_format" not in mock_response.call_args.kwargs["data"] +def test_dynamic_pass_additional_params(): + with patch( + "litellm.llms.custom_httpx.http_handler.HTTPHandler.post", new=MagicMock() + ) as mock_response: + try: + response = litellm.completion( + model="command-r", + messages=[{"role": "user", "content": "Hey, how's it going?"}], + custom_param="test", + api_key="my-custom-key", + ) + except Exception as e: + print(f"Error occurred: {e}") + pass + + mock_response.assert_called_once() + print(mock_response.call_args.kwargs["data"]) + assert "custom_param" in mock_response.call_args.kwargs["data"] + assert "api_key" not in mock_response.call_args.kwargs["data"] + @pytest.mark.parametrize( "model, provider, should_drop", @@ -559,6 +579,7 @@ def test_dynamic_drop_additional_params_e2e(): additional_drop_params=["response_format"], ) except Exception as e: + print(f"Error occurred: {e}") pass mock_response.assert_called_once() diff --git a/tests/local_testing/test_ollama.py b/tests/local_testing/test_ollama.py index 09c50315e05..2c4ceb3baf6 100644 --- a/tests/local_testing/test_ollama.py +++ b/tests/local_testing/test_ollama.py @@ -32,12 +32,14 @@ def test_get_ollama_params(): temperature=0.5, stream=True, ) - print("Converted params", converted_params) - assert converted_params == { + expected_params = { "num_predict": 20, "stream": True, "temperature": 0.5, - }, f"{converted_params} != {'num_predict': 20, 'stream': True, 'temperature': 0.5}" + } + print("Converted params", converted_params) + for key in expected_params.keys(): + assert expected_params[key] == converted_params[key], f"{converted_params} != {expected_params}" except Exception as e: pytest.fail(f"Error occurred: {e}") diff --git a/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_router.json b/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_router.json new file mode 100644 index 00000000000..e5059d873a0 --- /dev/null +++ b/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_router.json @@ -0,0 +1,87 @@ +{ + "batch": [ + { + "id": "45eb9b25-605c-4c4a-b2b3-8241e079cd31", + "type": "trace-create", + "body": { + "id": "litellm-test-32702f3d-8a1c-4912-a3d6-286e59a9c568", + "timestamp": "2025-05-24T17:01:19.408179Z", + "name": "litellm-acompletion", + "input": { + "messages": [ + { + "role": "user", + "content": "Hello!" + } + ] + }, + "tags": [] + }, + "timestamp": "2025-05-24T17:01:19.408284Z" + }, + { + "id": "9f5e9b7d-0cea-4776-b4b9-5c2e8f4bad3c", + "type": "generation-create", + "body": { + "traceId": "litellm-test-32702f3d-8a1c-4912-a3d6-286e59a9c568", + "name": "litellm-acompletion", + "startTime": "2025-05-24T10:01:19.142356-07:00", + "metadata": { + "model_group": "gpt-3.5-turbo", + "model_group_size": 1, + "deployment": "gpt-3.5-turbo", + "model_info": { + "id": "0f1cd8f9e6a22e499303d479486395563ea04decade83fe7334dc2f079a857c2", + "db_model": false + }, + "api_base": null, + "hidden_params": { + "model_id": "0f1cd8f9e6a22e499303d479486395563ea04decade83fe7334dc2f079a857c2", + "cache_key": null, + "api_base": "https://api.openai.com", + "response_cost": 3.5e-05, + "additional_headers": {}, + "litellm_overhead_time_ms": null, + "batch_models": null, + "litellm_model_name": "gpt-3.5-turbo", + "usage_object": null + }, + "litellm_response_cost": 3.5e-05, + "cache_hit": false, + "requester_metadata": {} + }, + "input": { + "messages": [ + { + "role": "user", + "content": "Hello!" + } + ] + }, + "level": "DEFAULT", + "id": "time-10-01-19-142356_chatcmpl-16b215b7-e51e-47b0-8fe5-9dd6f226fda1", + "endTime": "2025-05-24T10:01:19.406531-07:00", + "completionStartTime": "2025-05-24T10:01:19.406531-07:00", + "model": "gpt-3.5-turbo", + "modelParameters": { + "stream": false, + "max_retries": 0 + }, + "usage": { + "input": 10, + "output": 10, + "unit": "TOKENS", + "totalCost": 3.5e-05 + } + }, + "timestamp": "2025-05-24T17:01:19.408586Z" + } + ], + "metadata": { + "batch_size": 2, + "sdk_integration": "litellm", + "sdk_name": "python", + "sdk_version": "2.44.1", + "public_key": "pk-lf-3bfc4db9-217f-48e9-92e0-142566e3c204" + } +} diff --git a/tests/logging_callback_tests/test_langfuse_e2e_test.py b/tests/logging_callback_tests/test_langfuse_e2e_test.py index b46d8764dd7..12aa2f38bda 100644 --- a/tests/logging_callback_tests/test_langfuse_e2e_test.py +++ b/tests/logging_callback_tests/test_langfuse_e2e_test.py @@ -381,3 +381,42 @@ class TestLangfuseLogging: await self._verify_langfuse_call( setup["mock_post"], "completion_with_no_choices.json", setup["trace_id"] ) + + @pytest.mark.asyncio + async def test_langfuse_logging_with_router(self, mock_setup): + """Test Langfuse logging with router""" + setup = await mock_setup # Await the fixture + litellm._turn_on_debug() + router = litellm.Router( + model_list=[ + { + "model_name": "gpt-3.5-turbo", + "litellm_params": { + "model": "gpt-3.5-turbo", + "mock_response": "Hello! How can I assist you today?", + "api_key": "test_api_key", + } + } + ] + ) + with patch("httpx.Client.post", setup["mock_post"]): + mock_response = litellm.ModelResponse( + choices=[], + usage=litellm.Usage( + prompt_tokens=10, + completion_tokens=10, + total_tokens=20, + ), + model="gpt-3.5-turbo", + object="chat.completion", + created=1723081200, + ).model_dump() + await router.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Hello!"}], + mock_response=mock_response, + metadata={"trace_id": setup["trace_id"]}, + ) + await self._verify_langfuse_call( + setup["mock_post"], "completion_with_router.json", setup["trace_id"] + ) \ No newline at end of file