From 77e4acc7fa3dd22990f2b20251196e80d7d0cc94 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 16 Aug 2023 09:03:33 -0700 Subject: [PATCH] add testing module --- litellm/__init__.py | 3 +- litellm/__pycache__/__init__.cpython-311.pyc | Bin 3914 -> 4491 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 21013 -> 25606 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 42672 -> 42837 bytes litellm/testing.py | 57 +++++++++++++++++++ pyproject.toml | 2 +- 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 litellm/testing.py diff --git a/litellm/__init__.py b/litellm/__init__.py index 6b8240678..aa5c547bd 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -140,7 +140,8 @@ open_ai_embedding_models = [ ] from .timeout import timeout -from .utils import client, logging, exception_type, get_optional_params, modify_integration, token_counter, cost_per_token, completion_cost, load_test_model, get_litellm_params +from .testing import * +from .utils import client, logging, exception_type, get_optional_params, modify_integration, token_counter, cost_per_token, completion_cost, get_litellm_params from .main import * # Import all the symbols from main.py from .integrations import * from openai.error import AuthenticationError, InvalidRequestError, RateLimitError, ServiceUnavailableError, OpenAIError \ No newline at end of file diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index 3a9b2741d5df85503b851b0d4244a4783529bafa..07167d14986bfd4239c769b160eb2111badd76f9 100644 GIT binary patch delta 1267 zcmcgqO-~b16n$?>OPSKC6e#7REwn%xq|y&Q3mQpC+!$gaA@ZWBL*GyaXMoVbn2}Hx z>~Mo`Z;T6FxHA0{#8p>Hi2s4=+J*Oxj1p~JI+=U!JLlZ{?oDPsMvoKHJHKB<@SJ}8 zLSJ{BNMU^IB)R0mr0wJ&cEa`pK>^)CG<<|;w~98~Srm6wIs~M4yoIj!yw!e4C+#^x zBt$Xkf(S!&L-auOLiCjo?R|qug!Yv%i2{oNi$RV;?x!(O2Y~ehi_-xbF9{?;6Lb*r zAm~G&4?!M=JiMw#)Tjkx)tHU_HV)Vrw{ghEgpGqX4s#?)nuI|kbcD*fY{*2$2+pJW z=rYgOb#{R}7mW$C%qQg}rRvldB$hj&Vga)n{gEO)GD2S<>(G?Q}XL zw_0ICHIfMgNX7x0bc~`}>LJdq<$LejY+p`)r!Hx}^`0ji`*=2b*v#CAZ+*K?OoD7YM zwxnyN4U>7jvIn2zQMrX>z0cc&CDknGnyKo#QP@#-6{E~Pd5ica%eO2yH!C|@;fY#( z(ee^61fQzA@a+nGO2OEss$M>KH2zJ0X&ZZ`lD1V^SBk2m`4laiVMD%LpxIQ*Cb;MB zJyX-mtmwPfc?15}-Ej_S4jB$vcIu0WkKl+Q%2jsZn`{!L!{%zDbsq=CxKKw9)KIh@ zW*__y@*$yyf^`YG+s>Lg>TcIhF8V`I?EtTcHU&U&;LulZWdSLd(}k}HNjg|)TUc;$ vvfu);=vuMK3MZ>BY7^=@6zd{el46xJ6skFIT|oFTzv2JkwLgck@6yr_1`T1? delta 676 zcmc&wJ#Q015Z&3x4nF%FpM!&w*yqGw=W~R>Ie&zL4v8*8N(!<C3UHNXNKkK?iFpiF= z{F5Hv)BaIR4?9zq}q==DSsAk<41qz zC&m}?H=w>I8lb74i4%KH91M6raEC!(9&lGovz{CD#ctpVA^V2|e;|i8Orfa`wWn}T z{m{0@t>inH)sI|1aE}$$on-7quq%dsHG1>|{ZZ~twCZj|t%%kma?}^SsO?}0h~bu+ z=$)~aK7p)WrXjhe2{A)cy`Os=H|UujYRb+yDUbdlB<;~NExe)LW=f|aCGZ?i{U^@+ KyI9>fHh%+ySEBm> diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index afc8469fd96ae78d388c1d35392d7f9c4afd4d2c..d2da312cb36c13b989d9247b77a1122d6f141cdb 100644 GIT binary patch delta 8453 zcmc&Zdr%wsdAkx?AqfyKiH9VRcnc5@V=!+c0|tx@=KMO_ca>#!4FVzI)#BH!4t(P# zO{aI~%P$%G5+{c{iR0E>>yDc_U#Fd(+h&q!os3}AIYx7Ced%1&>p#IwW}3-m+J4`z zgdX7d+-90(_3dwekMH|_-}|?G^;`58en4k^Co@w^!F6){BlZu^yp>f**Zx`cyR@FA z*uooHw&;rT7L48@^L+)iC+uwT73xGSr&my1E^E3)!wCH3Yl>nGtcj)1q_JjVRoHSY zFt?s90q9`qLzKPr-V2JuO7*8TFyF2vw^dV35tZPdcg;rhJa=}13kWX3GspQCgh_oA zDe{ItCH#J-EhE*8oh~91O!Z>1ppMRg2Yc2-u?kT^XjUmI0j7y*09B$2AR{sW)uI|; zx|j}7BWeI@MJ+&`r~{ZGW&q3-GXZ9aSpfAS1u$DQ0L&2!2>k{fGzpp*%`%D-^EqCqsSahj_XQkq%f$IvA!c=^w1^bNl^h^N}4U@MWuo%#vjO#5=+I{ z&Py|o!JNO=8go~yw?N}}Q0vkaw2*f)n-@!0Y`0)5ccks$K+qyu*s>yd5*-VR!~ z5Hg4w(aKhU@N!owZ>azi{N#(KM5|bwgsUo!i>=1?qCAzY>4pXnw#O&HQoGbkK}#PU zuT2`Sm3oUoml-~RtrMxJcIq~@^Or)SOaUQVm+W3N#kN$jl(#Tw6Y>(K)hAC2G$f5W z2(7o|Ig;lD%fvF$tS_MJ$%wuj;GBL`U61UsvZ5MLQAbMIMzPdG2g|`T=81pyQDg|OIag~kO`BKypmf`P_xpOV(WI% zzFdWJa)PUi#lo0O5h1vW86>+aCDauEI@ygDi_~_q6VVj4zUq|VfzesIqUPDYX`VZ! z;DN5)5e*oA@>0Hr9LVpXJD(oLP9}yAjjue(KD$yZvo>k8J7u&^tX)#DJ;7SB4xYWi zIt)b?DHMs&$L_wNU=yjO`~Hc1&roOUOU47Pgq~CvtQWI+rI;ObkQ`%krNgIBqV7yy z6?BO8%MR4b7Jq7p`pq8nn}V$Y4g-5X`Pi7(+Az})lP`;Wm$J5aDF1a@9Jf40ixxH^ zPR(ovkpCb1Z+SlZSNl#wR$VPLwt;am5Gn>_2gDLjhBsR$&LmG;hp6xtl@2zx*_VAOhV9aBzTcXX`BEu|r3_Gwgl;W3=YYstp z2d`m#9|7~jo1XEKWKS)@<|O+WNwJ?D>^^o>-0^kl8w!Z3E$sf_&ZylSK)b1Xirw5w z1J2dSZxI4krr_5XlMl z2r9f~JB6FUAdfz!K-sn2i;5?o_3D{mhuE>aJF0`M#bBp`5<6%5VwA)x)zk$-eOlAhQlSo9W z?d1`b7Q6~lR zl+e9f+zrXbz`A8}fgDn*Hny>+H*-#&lygRceMvf;Ox9u0DfTVzlWLZfYGyMOvCrij zeaoZq5VS|!vpfJH$gn6K6jDfAg|`#-XiXj!z7`*g3bY1}W(oR+0_JnC_aQPq9T0GF zgLzg3^!(>PnPu5Vs<*ch+J{Oz6IEIkJB4b?1&4f}oeuWL%7myld7ex3(X^k}4@Kh) z6ezPdlq+62zmNyUqH;O8Tb`QIE%B7SYc5et&v)c;Y`bw^OG>FhOJ6hkiMzCJu}Jtv zT-&TqEW#2f*&be_vA8Oygm1=YR#1FHa9}Im*a1@YrRIZRB+(cf%Eiv>Von(b)L5KWBd+SM_R4dbuG}~TLIYBWTL*9k=}QbpIO`K z0a9->%NrG zGYfDuP2esF(A|qKIey+Vd{`#&O!yQa6G8M|9H*Q?T2qGww+aBruKC zC5q`$irBFe!3=^~1YQJl2oQyxmShsq3H~WgnC5tw+Y`w-JWhtHt~`@Tre9)`WLH

N&osQ%k2Bi*hK8|+_9>4E^pXI#dU}eWM(H37x zLK{hQdv-KOGMpnjn#pjb^O@`I*OJ%kCc*T)95NAzq_J+n9bx=luY1n@x!4)Q&%1Fw z{!yYH(PJbfMAWC<0Z!n2myFYbFdyh_Y;@1hH$*!dCjAlp9_OLK!-Hd=YYVRTl4wS< zreryCtP5QQ+=&z1-oPdOw#YnHpny+J;YnPao8WG)IW)-tvDH<>VHXF_aXg6Eg|dqd@~@JY>#7+1 z>d7yWFV!7c+?<7qh|Y=>$}8QT2Cv&UwE&SPw*CqtR?qVs>zNcHIyB|j&=;g3?gBTt zAaJ|^NxXqwDz6_RLZpc0=Dq%lpmK>%7mx^e{EI%9hlPN7ah?NPMx5HCZtns&$n$hf$J)BSA-^Xbe5McI+q;o!Y z-tX}V5hd`*zlsC0esNSASAHZ7+q|T~jHqcys^BHfWsXS7jO{a`iTakGm(`eo&JXVD zLsO0DH{WD+MwAP@H$rm(Jh70Qjt+9ykwGGkeC^+WB`i@JB|e7y!cn`pK`{kP9IR&- zUDa$Tp>N&ZcH1Jg9_L!F)@`Vu?{Q`A@)5b!(0JP|x7vH}GjeNi*%S_(Nj`$ zgP{s*LIu?uYNW$Z-3RDU*Z$bsi3yseL&qm$@3XX@4$b&tuZ#44#RmLS03XtNEtQ%3 zdxIM~#HFQbxo^;x%DB9bT{>X5L|0I9BMkeZnlS* zqI<<1=M?JbD7n^kz6*$)qX&@Iam6$~CTUN?V?psMzNr@#PbBzr3Ccah()|}*tBhq` zlSuOurto_4DpL_=Dnd-fI%8P!!!x*-ChxSOkpt~;;OSo{_LhepSm(XpPDx2`vAsHlR5CzP@v{pSdl<~GtP zOYLn(*xY_UCv5Jzzc*~|{{X-!lBX||N8M-p*EQy4&6>s@(%9cU7IyT6b{|`F99wl9 zTW9i@eE0|SL)PY1!;Y|F2keN+{Nmheb65ATGPW>d3o*7$hGq&&KP>E6E9|&mxmws4 zF6>+KKQ`BWXl_|Ex7>a4{<+Z3y{qP-uz3iy_ehf&%CfC$%EFqmZ?kKf+K{Gpy`=eW zRk)-hlx}*Y(}%LlS9KL(UB$a;Yr6W7u72Ix652Tswho507Sh}9BsaUe?3bq>!v@mV zG&Lc(>wCUe5Oz+4>hWIBXkD7zR2n(eY$YW<8dBDo=g29#X8E$^df@KfA54Z`a)<1v z;l65F&6y16OfF4-!em|@TsDS!4u;OYvO&Jsxii;X@y>y-9e8{E#`x`#u(=I(0OWhf zSkHG~7zgKk?MS(^UrYUC)j%6QBbMQOeExXHKr23fQnRNPpZ}hBP>auBmJHY7^FhB> z>l{!hAN1$jo&7!V>`}q{y`kR!pwmXt=|eUnIn>vci*+f~OAJJk1uvGt$H;PDA^jqG zzt2wpg8WNg6TL$6omLh954fz;S)t;;gsoX;4gCrEigQ2(mQMZKy+_Vk)gh@Q!JxwL zMKFZmbpU`@3aI;_eJMK@wOr>gd30Jom6na+WZW}^eJP<$OxWFU}&|2MIPxm!xukfi2Lb1Vx*FMks|v8IhE0|L+AAWw!$I^V|5hX{U% zKuToMYFOHVL?1u$%O`*zVM|IuACr+`o9aK|{a5$=!~d+HZ;-A-~`nfuOIS=gclXXBZqP&j|Aj%iFEA1 z1IaJbyCKOec)4C)52J8XfyZ!Q*-+9ny-xbZt;9dBx_5f~5v{ny5a&dBCqwBnue&!4 kml&F(H>hnMPn47*>x%h_ic+LsF>WyOlna^U+Qh5>1MWI${r~^~ delta 5300 zcmcH+ZERcB^<95|#IcK-t9hYe@V4GqOqBIx|7Vq-p�-dH!o5s$0FOFlkRaI?! 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 diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 92c3af615dfe18cf545c6a164d9732059e088a3a..c8658d0785ac8fb4732a9947849c6960d6124aed 100644 GIT binary patch delta 3022 zcma);3s98T6@dS{?`0Qu7kP-tB0_)_SiuL_$ir1hd_@}pV~BCHaDQ}RA9!~`(xSi! zjWNa|M-y9{iDVkvYE!lUOq#aSPHShH+E#;Y?AVQ&b{b=AQk6`bX-sEg&$;V^vC~fe z+5g*f&pqe-=bn52vwQNa?!q};$+uEdQxv?OSa*rv7*mw@XmICp-WL8bdaC3QbIjxE z!>qN2&*vHVy$B{)hQX@v1#pE`5Af+7PM(AM#e5;3q0ZyEc+bQ;4{x_x%k$OR4m+PU zY;3LL1;a{fJ)ezi;DyK~ya?&z4TatEK4D?u79@8TLNC zqP(aCl^xFhRQOYF)`nh1%;`4@W52QA$yqI0_M5oUg=UI^S`%t@Qmf_Eu@Klf%1IJr}%#klKkxfsr-fBs}|7tt`Kv<8eYO-A_tTa`hj#lj~`YvH!LIan}4 zCiuM5unZ^WX4W}*mW*eclBW%AvZdBOOEu-jvpBgP+T zr~PpeXjlCr5Lc6Sm!NTJA#2luOP_MEci`8L`b=+;>jiMF-^JdCgX`y7PNTxZ@cF-8 zzp#)73A<2Z-O)%)^+($}MHe}Q3E70pP}JlpRv3yp#CMFz8X8D(pXn8dH8nbANQ)Zb z{+^gBgaLll#F-5$nk(3c@I-TN+21Mb2ZVeAtukS54|K z>joKEL(wgMwU?HC9o}l5VVWf0Q*fhssqLR6eoXiXYFk#Y(=gJ~$PQ}1X}OSQN>0L2 zUgh~0naHAkM$$WkQNkyLn}mN8-WyZrEuv)zJ+1OGNk)=Pg!gH9i*SWtCY^;~CD@@; ztsJnCm`b1nCe{<=gI%O^5Yh?L2p`gHjNqi9ERQVxgQUBLNZ4rgv7YvJH5L=sNu5ci zR2eaikVV5}NpJ``9S?e^RD~>Nl0_~dkKiU`6XYv#8iqQ`bxfz7=x8ye{RAD>3W4L~_cTzhS3jgF|${mkWG{T!YYzNz6-^dF0q*<|M?@s&JqF5Zm1BZ%! zXLe7R-S67c_clxzW@sObJj+-B;?FE&e}p%lIgt7o#gGMLq75G3UCl0Qqq_@PMk7un zjG<_N$HWpUumR`ae0CfAtM-LGn;F{zhn{m!?<6ZjM=-(#9RiO@v{Aq?oO|whc3s=F zH_UunNVAm?B>Wle#7+VoX$(s-L>GacDMAR3{&pNvL?LD0Ms^c6?VYI&?7OAQ{4qJx z){APwH>3oxzswdO`))!XoY|kZ_)8QE6UVPaT6;9y9a7`LXhgP;Fe$CFZSz1p5Hnzy zS$K&oiZ=)aV+A_BURyr4kv&OO@>s=Ua!K)1o9_v!et*L5_iyV7gd%}3jzl|73zd*e zfh5X63=*iwVmd)SU^D3m7vUxhvCZ0-4|o~#!Lft2xew8t+yDb@fLKmm^7U~5d!fy^ z7w7Y|tuHhgys~7n!m=&MF402n{e*j!+CjseaP{j8%hr-eR$jXg;|Wu=4N%Ji0p%7g=SwSf?0*{vFQH9^cJ1(5eV*J1d4lu_>lQVlVwaB! zA(IHh#+M6?N6>f`48A;`|2&1>NBAnjvqltC8YUi%tC3#O2uqHX@zaa zc(5xT?NTFRHGJjBFW3ByW@Kl6j3n8yWOtH1i8@iT`N+N_yUin{+enZtPqwXDG<3kB z@sa_J#McoCeGohMSsHF2bP~1_WHYItyksZvlTNv(N&6!96R19d)_vc$e`={s q9-ew}9B1*P#G(d8tAFLP&VA9IHd)9S%bCQ#xA$?4UaNaG#{L6-hxwTR delta 2855 zcmZ{le^6A{702IQc42=24|G`&R8Ub^ItHneh*&N!2DZ$u>h)>eDY1;m-! zH@pw`o?rLgFYg{ceBX5TJyXHSloY#y&*}a+U-`76jL~HBQ6~mB_Ma;_!qmllS|9T* zndkOdeE0FZ zKE=0!&q1!_bCIj~JY+4;M|${ttBld@Lf?mmSVy<$?7*YF*G zd~5l_zFfsu&lS!>>wN2YB`?F|2lygPThEzSaW6A|W%}Bk*D`q`$~5DffbWeO{8)k@jRx&V`UkcDmT@jGiKrm9TcSqOUx8gA+IFErgDq)sj#ACK1Q;8M(!*rdsyX3 zQvxuaaB{rFQcBe7})1EBv~# zgnbFu8*|b~EAdA{F5xodY|4J<-sER2g=@D$DT5pH-DI# zIPQdMZL$0B6e88UNu!Sl2MOO2{z3ST@HsrAl~>XEghI!^LL(E65(uL-{WoEZU?!V| zkVvq>ZEevWD-G=g`R#6`K)G@%*^&t=A&u}Qd833Bno8ZI(96m8Cq&#qnnb%>TC`|% zT$O1QN_t6s#B`dDYl1d7-MYN=E?FpS21R5MvI#i^CqZ6<5pcB?oBqj+HEo*`Q{Tdb z1|g7cllUc^>|D<(;YR0Ply*nB!k$iPgbL%$a4KVCa6Y12iqPOOR(8Fc#7ZHdr;sH> zaZfcXgKa(T>{3dhn93oi6EyL2lqKk>9%CP&bG z)CHgSr2*eN0|G}gXq@C#PO%1e5}evw3t#UoR5w#;!U$gdXeTUqqTcyMiaO{!&@|9= zWc{U-!VgjkFD4cmgHP;ZtO;EGtJx*+^&d)Uq)aI!6MneaU&%f(%J~BRJf?XF7)o436}<) z@X3(Xbkk&99ooXIq>tMss^I=ZvzImFL_9(mUxP-pgiMwyiY%%n3vML`;UXM6)XTOS zvz{qsYz1t1wkBsa`J}>TQdq2^Eb1d78D4t!5z9XGXBhUwUUR9`L`o^id7P=^_BDzcx* zF7hDRwh&}1lkF&vrpd5;xFGEu4Gly*A&7nY0&E|izC^Z#BHD?(&3=lJmr`CI`S&8> t#eM<_AfAUehiBP;fvO)x*o^DS|1f4UMqiGy{{p$@%(wsm diff --git a/litellm/testing.py b/litellm/testing.py new file mode 100644 index 000000000..9b13f1f71 --- /dev/null +++ b/litellm/testing.py @@ -0,0 +1,57 @@ +import litellm +import time +from concurrent.futures import ThreadPoolExecutor + +def batch_completion(*args, **kwargs): + batch_messages = args[1] if len(args) > 1 else kwargs.get("messages") + results = [] + completions = [] + exceptions = [] + times = [] + with ThreadPoolExecutor() as executor: + for message_list in batch_messages: + if len(args) > 1: + args_modified = list(args) + args_modified[1] = message_list + future = executor.submit(litellm.completion, *args_modified) + else: + kwargs_modified = dict(kwargs) + kwargs_modified["messages"] = message_list + future = executor.submit(litellm.completion, *args, **kwargs_modified) + completions.append(future) + + # Retrieve the results and calculate elapsed time for each completion call + for future in completions: + start_time = time.time() + try: + result = future.result() + end_time = time.time() + elapsed_time = end_time - start_time + result_dict = {"status": "succeeded", "response": future.result(), "response_time": elapsed_time} + results.append(result_dict) + except Exception as e: + end_time = time.time() + elapsed_time = end_time - start_time + result_dict = {"status": "succeeded", "response": e, "response_time": elapsed_time} + results.append(result_dict) + + return results + +def load_test_model(model: str, custom_llm_provider: str = None, custom_api_base: str = None, prompt: str = None, num_calls: int = None, force_timeout: int = None): + test_prompt = "Hey, how's it going" + test_calls = 100 + if prompt: + test_prompt = prompt + if num_calls: + test_calls = num_calls + messages = [[{"role": "user", "content": test_prompt}] for _ in range(test_calls)] + start_time = time.time() + try: + results = batch_completion(model=model, messages=messages, custom_llm_provider=custom_llm_provider, custom_api_base = custom_api_base, force_timeout=force_timeout) + end_time = time.time() + response_time = end_time - start_time + return {"total_response_time": response_time, "calls_made": test_calls, "prompt": test_prompt, "results": results} + except Exception as e: + end_time = time.time() + response_time = end_time - start_time + return {"total_response_time": response_time, "calls_made": test_calls, "prompt": test_prompt, "exception": e} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 6d676f2a9..9edb2a2ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "0.1.400" +version = "0.1.401" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT License"