From d542066d4bae6d599ee8b4d356f0a56234a26fbd Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 28 Aug 2023 09:38:40 -0700 Subject: [PATCH] fixes to streaming for ai21, baseten, and openai text completions --- litellm/__init__.py | 1 + litellm/__pycache__/__init__.cpython-311.pyc | Bin 7422 -> 7483 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 29079 -> 29196 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 66013 -> 68280 bytes litellm/llms/ai21.py | 127 ++++++++++++++ litellm/llms/baseten.py | 2 +- litellm/main.py | 57 ++++--- litellm/tests/test_streaming.py | 164 +++++++++---------- litellm/utils.py | 39 +++++ 9 files changed, 273 insertions(+), 117 deletions(-) create mode 100644 litellm/llms/ai21.py diff --git a/litellm/__init__.py b/litellm/__init__.py index baa3aa4af8b..227a7d66250 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -20,6 +20,7 @@ azure_key: Optional[str] = None anthropic_key: Optional[str] = None replicate_key: Optional[str] = None cohere_key: Optional[str] = None +ai21_key: Optional[str] = None openrouter_key: Optional[str] = None huggingface_key: Optional[str] = None vertex_project: Optional[str] = None diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index df608813db25262329c7815d96ed31611665a2b1..b15b88021181c0a14e70994b95401895e58eeb7e 100644 GIT binary patch delta 1147 zcmY+BNla5g7{_NyOP8b?S%k8brBGT*DP8CSr64LG`zGjkK*BfF>MNMXBN1YPBp6NP zpuTXDlLw69qUjOuM!mQs9(wj@Ja|$M#%~@4>`cGkfBy4*Gt-&(H+IlrePOj)2(}+@ zzr)TGtBrns-Sm@gP*%3M%noK&gIbGGmm;j58@Q1h7j=2n<)S)8 zzy=jiiM?vKK&4QP&W`=i)j%!O9lQDyw}GXO6N|1P&ozP*n!uIY#+~Py^PC4-u+p2W zY|V2%bY5u7<@^wUAcQoxL7^RO7$Ui36k>SX(SaS%`QI(#=(@0LcVZ45=_iobBGApr z&4$C*BV@0DkbR89#u{~mH}0X?Kbj)U2|ZhcH34O=GYB_EGlmDF1=O7a&qk6!-*d`> z&<_Ji9SgxF7({Ky`5~MSqYk4+P)AUssH3Pc-pYOJco1*X=+_v~7}OZn7}D6TF`_Z5 zF($}5lEVbXaJ$Zv?YN%@c$i0dj0bs$=a$0wu7$;6B1u^nOv03uNGDi=5*$xU-P1xZ zOX>r?JDMJ1L%I23ZGKuBK_xIFji$%gSbCg|rzhA%dXi11r`QzM(kbGeRln)q7)IYMAWgGs@mqhlX$UXtj5!O_fxusA`cvNPdwRth))@4u6DK}(34|5C4 zOA5cE$X@lmxw1qo&YDudmz31vnjAyBss1+m!(s=wNfuvKZWM4L)=wpGE8dVd7`Wwa z3;Tm|t;p01)CoA$>y~nBr5M&A+y>dL-nR@Cy2MOV=8NS~VQWH+y9Ig#&I$AioEPX9 zxFB#*pf9t1CQj+J`mSi1R;jV#KAmh+?-oZK6`0Oi(#yalywZx2HAu?~^U~o%M8w)y z=47*4535Jq4WHH4WP2OJ7H?y zNP1v8C6YMIz-%TVB}hUPFivKA=eW*g`lNo+FAb0ZX^;%ELybLDEErP?l9_Q-0d8g{ zq)9RSnoLVGWJa1Lvsf!81=l<~(R|2%)VkH;Hv6d`wEFQ!j|Dk^BKtVpXV_xn z29HijxY+~4g2jUwm#T1SF?Uy{%dohzmd(+voa|vg4AyGiT+pY1W^?J)Z8?VaA+s4f zs`vz#UUs0!PL5`_WULN1@UW4?&e4Q$sdp;)L@z9Frn4()Zy*qq>v*=FXSH%0J2sB! zTKP^({%1 z;bpP>U(<8ZGKz7bEJxRK>1?W?-N>ag>+%?GvKKX->{E>+KF_NcIBs#=<{%s)j`Q35 gqmN5#u#us?@?%Vh_^yA+_tg5t{C)E~t%eu=14v-~>Hq)$ diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index 58ce173b3b7815a0a0f2ee000a679a9f9e9e6f9f..ed8d32b9652700b7db2bf3cf763de23dc0972d7c 100644 GIT binary patch delta 8414 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 diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 773d47432605c370372ec1bb4f67920ee3531192..8d8cbae60af951f7ba332fd4843415cba9ed8752 100644 GIT binary patch delta 3660 zcmai1eQ*=U6~8^*Svp&?EbG&jjb&^ZNnk_lgfD}s02@dgV`?ziGZ)$z*b6IeLJM*4VOf zg@~ePCxc5#Xq9bcR1@JSclrUcA#)tn6wFL9ElkK6Wiw}i+Zf@<$f~095Gw)$eajfc zw5h#anl|PMbck)j%R$K@4f$eKA&(u=&UkwVO$?Ci3*^l7XbTP%&4f7{OF= z#!)i7Pxh>xiwOy5`Rh5dvj$qStZL**rEG~@v}Edxz4&FPY@Y`$ zSvqf|RVlqUmX#=R#|$Z+aa5*sjH75Mk}%tc?wv}pNN}iK7)(ut?XZizb$*wRImSBt zF6NjMQFO6>x26-p*uA$H3PcpeBO~_?gE}{-jrhQ0uEwoc96Vgi{xz%3apNkhT6&y zdYru7egL^i#AUXSkGGZ;k424Q{-Z2xfWg&KHfj>NWzdiE&_fdUqvti~ z35j&fVufq@23z{?u+q0}1uAwq9UhqjmK(OKy)xXXbmrRwJn+tKIJr@wnn ziyo7DUOk6Um^8iiA$nXgz5Wb~c1uHV{tTfZ$??{kJc>!j-(8%Aj!5V|e-1h!tvcSD z1!AKgODyV_#P|~$^c*>@yhRQg1^znh>i~JP#-1%Qk80E%-$UN0agebS)rBE}#-qsm z1hp|CO*$f@sD+s}wfUr-%ry(Bg^YID$)8`ali!{+Y4L72M6Zr~dU7Fgo$|N+0nR?W z3pDR$lGd8sT;C`?+56l?V<>+&({@7BSmD)^#>9CvA>H%I*BW$=R3&FQK7+lFbKAQ^BBmMU&BEpI z!Iva4c?0>+!7M&c;Q|FhrzR;}rMw)b()gbgeox^dz#+}F21@uB8J_qDS=ekvN6Ciq zDul?d*VxF~_f1+>V4|$Zl2D6nK;&+f4UxaqPgjSC7S@`6#H=WKkvYh|0?H4=n|}77 z^htTOO_=U@Jg2kou^qj^NOxZ-jA>NjgLF5O(7Rr_DHPb&8+1kbTss0d9CYD_gW(;( z7_4%w$K8)~hXTDWJWX2anlbXGedF1!f!_XLJ;r?){~OeXX%M+wE<6XmFDh04?X&nn|w6k%)3RHr18;7zL~H+oU}Oh-yiFbTilApJt(ADjnIk`=Azg` zih1scA1d6)PQ|=%6rfJl*Qw>G6(#eFFTHvvG4=WkN-H_7@wuU@t3+ktj~0e>SAk@4#D_r1>Kn{X{iru|1nw_LoiD-?t+e3Uqfwg1aIew@zc)Ba2q`ha-I?K4Ba9KE6xTQFWl4mi@G69I*n$ zTs91zsTc;QRLT0P|L+ucuQ2rZzWfN02TxbcMCTlcOtoCU zn;CpGUT+0w1hf))zpVnV5H+_?L7l(vPC**zJZeIg#PhQ<(*&Q-`!Hmp+Dsx*tMU1N5D*Ufp617k%bkmunf2>ao_IC93 zM|Si_(pjYD)0dz^jfZq4(4{NE%_PC^L5!>z=fv*L2!4t3en^2v&RufGG95G90^wjJ z7@7_e4^11(ZL}|FKo}AEcEUPvN9rVU3Sw(<6Q;gQo zj*jj;ULdywly%$W6||jr0H zaLjOsIU<-&;1Eyk|$`XR&g(qmt zUZ(I0ow-H^&J{Ic7P0_;O{u@2@C^Xm6!hvG&&?=zecO8QC72r*)Iul*B7ramOmJPK z?+dJD$@)(U4RooFj&Epu&u7W?bL&u?tUm9}jqBZs+}-^vfV$9(H$-+D-qm_;d=AGa(}EDHwf6P|geJpM6{ z{{wg2vsUq}9c+p%ffX`z@HcgAAM-WJzQ()is2lUt9qo^M>XkZA{cTEq*?w@5;`GY~ z+U_dbJmzVJsE&I!E1u2d!3%DrCzH9>hDqv2)z8;x?>`h&2UFjs{jH@=r$4H(hXTEC z@o73s;RyBJE9CtP9UHRvR+M5gFppCy8K^h#wiI&{W|i=ZQ_OcEz0hfC*=H9~mI;tyMfRq^rITOvusQj3+DySBJur2Gtx+wd zd%#pHrkXJ2zr!Qfb<3b;_xA?tuwQDq@pI16hmbSHd!YAoBN1HaWQoG=WLIbTL0=7#Pi;viz*;QkrleyoW^Y~`w zoHH}$K34VaQyD%F3)3-bgI^6fOO0m?mlwco>|c-)S>X}f-0-MvWAaMu8!%0fXFI_I zB<6U)30ADgjmG^&dOW#IA4l34j}Xv5=CK_#+9kRfmKRxcPPUx!kHp}LemB4fOf znSQ1*CiPit&3PRbJN1_8wwGJ$du{10d0ty~TfWyehbUQdiIO$9FD1QYWm`#W#V;vy z4r#elf!CJXVafG}Fl#!o16~0b)3F45i^&^5t+Ch_JF#&|U%ENA(LL@LKx^?unj2>{ z&KMsbZ-}5h?kltwX0rJ5ph=m2HeU^Al}%q4hJsgV{h>}xH0#fb0B+@C$9548qQiRzdsb)# z6CiXZ!wWnJoZFe5PbZtzQgpOYI^}eXwR{|GRAY9SIfWzQ2`bk~`hx8(pitLciozqE zW~{xWRS`{(dvl|NW(_Xg8;v8K#!S0dxt&qPRj58L(J6T!-|UK9F{Wk_Rf05n271EYEyea%vt;H8nu8-N*=cYMnX{)W8P%C<&qH z8%ocaP4sSwo;7!+T_1Snf_K|Q+wNAms$O@?eLRAj98Qq4Jcjd!<8aHc1%~jzaJ+CI z(B+E>S z7x=!UNTcgjRP~y%G~q7bM`Mf3f#ORITk2}u@{fG-U=?w6Y^`C4