From f946f61b4c9489d6a6254f3a7ad2e11f473cd72c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 11 Sep 2023 18:33:54 -0700 Subject: [PATCH] improvements to exception mapping --- docs/my-website/docs/exception_mapping.md | 7 +-- litellm/__pycache__/main.cpython-311.pyc | Bin 32776 -> 32885 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 90371 -> 91672 bytes litellm/tests/test_exceptions.py | 18 ++++++-- litellm/utils.py | 54 ++++++++++++++++++++++ 5 files changed, 73 insertions(+), 6 deletions(-) diff --git a/docs/my-website/docs/exception_mapping.md b/docs/my-website/docs/exception_mapping.md index e59c0d4c35..583d2b80ee 100644 --- a/docs/my-website/docs/exception_mapping.md +++ b/docs/my-website/docs/exception_mapping.md @@ -43,13 +43,14 @@ Base case - we return the original exception. | | ContextWindowExceededError | AuthenticationError | InvalidRequestError | RateLimitError | ServiceUnavailableError | |---------------|----------------------------|---------------------|---------------------|---------------|-------------------------| | Anthropic | ✅ | ✅ | ✅ | ✅ | | -| OpenAI | ✅ | ✅ |✅ |✅ |✅ | +| OpenAI | ✅ | ✅ |✅ |✅ |✅| | Replicate | ✅ | ✅ | ✅ | ✅ | ✅ | -| Cohere | ✅ | ✅ | | ✅ | | +| Cohere | ✅ | ✅ | ✅ | ✅ | ✅ | | Huggingface | ✅ | ✅ | ✅ | ✅ | | -| Openrouter | ✅ | ✅ | | ✅ | | +| Openrouter | ✅ | ✅ | ✅ | ✅ | | | AI21 | ✅ | ✅ | ✅ | ✅ | | | TogetherAI | ✅ | ✅ | ✅ | ✅ | | +| AlephAlpha | ✅ | ✅ | ✅ | ✅ | ✅ | > For a deeper understanding of these exceptions, you can check out [this](https://github.com/BerriAI/litellm/blob/d7e58d13bf9ba9edbab2ab2f096f3de7547f35fa/litellm/utils.py#L1544) implementation for additional insights. diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index b17f6147726726a07cbda8f329329fea1c0d2490..f5bd73faa4a4748a716c8d94ec4ad0ce08b7f08e 100644 GIT binary patch delta 4788 zcmb_fYj9iD5xz$+TefA%vSht1OR_A>^4n2t$8SlFAgL2lLJ4$fe-P6Uh8k!*6EcPgX?c`kAcfE*ZD|Y6qyqyDLraGe3Yks|^z4o#i_qzuCvX9&X_rT_RZ zS^%eWS1M99Okh)1kODYj)W8O(0)on{&J<5WxmVUMa11k)^vo7ci)YOeTAT#=)oIYfLA8{);HT;hq#XK{1(HEBYXfueRc zmxz?DOzi2sYwfA-8|{f@Xx_Ut=|FJ85lx4%Q!S|iuR}+wL8%Q<$#IiL&(=&!7H^T( z`KUHtXIHY$wTtRp1?viy=u!)u43`E%%^L;twiyY95&g%1gyEfR9UQMMfT_})%vd>J z&X*(v=PPqW>{2l4%%mP3C@q0ax;)B-bk3>i1eXmnX z6!5%B=S*faNLX(g=#w)-+5c=ry}YY73xPZ)W||V&3r>xsSx0!Opb(-<0kqR-HC`Gkk2;Dptg* z`I}#aggfOv?16-y#%o zjioYy_HK&y4sjig{%wmT1C6`b9{9>)OF5iX87{s~us&uzP2$*0K(XIeK>_$wUY&)jUJ5pQFMRgll3Y>_*-}?b>(;yV0;xr?T_UBWUn$A=sblP+i~t+`efPnLE&ukWLOWYy^ESSxK0 zjgR=DR~5gvdYsnl`rUlR?*-@f>-+s;yr5_b|mKIJtdpIT1dq@ygc7h+rEg#XKWsP=$ze7G zoz-3NR*e!KuHHb?dbzqg0rF5HE&8e8N7Uq+#F95Do|ut4V#}{>IxOb#y=Wxn=lv{` z2t!8sk;Hms^yESqbQ9dwn3YphK4QM2K{@DgWReI?umj3#%jD5%DZ8EC>^tC&+BSHq zRwrV2((A~)C{Og@Tk33N0=#uzvJ38}JU{n~IysSicSDaK9$m77jDW#yB|&I*7m^U% z<{qvXp$<78B`z7a2Klu}l2Xotk6u9r|8)O{TKHgTF{N4cW?2lylTcN^KXZ(-E)h2d zFV^=Oe}wY=NVXywK;lPo0LmMjWDM3c^yq>p@KE9sr#gm{4ePR#a~uc8#`_9)p>8P> zo{|XOsa7lJLcwmBYPRdXpzoI46h605LIV-DvJbv&oGiJ1G^p=EG6oMXvyid5=aZ+H~ z?w^t!DYp-vX#Jmxc6o-2BH4??2T!-zX=UGP`>RYS-T`>7{RMIlOm?)8BXFW)lWYd{ z9tWf69&!{8dwx!yhIa4Et-|)Ml)8y(&65DP56Ap1q0#V2AUYTd_HltoI24QoxHr(w z862Rb4O8}vm?Mo13Tjr+()?P7|P`Xfnb2^kA}E;Wg;N>yH6$i7&R{ar1O4a zn|q+MOqBPxqOxNEatLYn7W*mH*OMNHu>9d>I;Ln7{@PLy;>Y!@~C}Ef$&8E~Red zDRbvX9Yg{osHMho;EY0!pU_l7U(4a6kt|&n{W#8E^l>bKP_TyNK-*}ITXF3W+1xaF zGD`XiFM-3O+O&w2-%>;>I2>#td2l{hhkLk7E6$u%gCo?L*yHX{AyLDjP*sMEeq=DS z`EWL5BO3T5WM91vD|j=KK_o*+hAE+U%wFVuNW4f!Q7Ynun|k(!`wa>a{qy=zI1t2k7Fd{! zx2Xsx9FtE`@g*d$;MXemDv}IJTsd*H2BCD!nf)1x-AF!%^<$2#C4^zlP>e)2!Vktq zuF=0fAN!CLl-*pxoT|uLDHflq_sUnai+|fLT`7joA`j#W4O7gIyr)A;x= zuhA!N(^AtG%?Gwf1Rp_5ES`>64XGcJM EA0>KARR910 delta 4746 zcmd5~x&$+*I-h0;$hz=hR$$u@EXEXHY{pB}o;|X~vhnQi1j)zRfPUlP! zG6`<^CyiTJQ6wL&;=kUUB*&{l`bb7{#xO&&Bp=F+7{H#ZhsSeW!~j#2TiGXrf9AUB z>^z;_sVE}(Fs!JC=Dr-!P%b$8^34nDS;Mq=&Nw4xm|6Od{|FP&z?jNJPjyUX$W-zw zwrE-crVRw`lDMdlXAek!xtGZ=L%&v6xd9|~&3Zn>1*y=K9%h0?I=C556$?1Hz5M!1mht$AvtCrZot_j-HATyML3|l*$abvvnV$W(!l1ZN7 zZQxdEh0Ar^^m6SGDOeG|Ss8++e2MRp84AeR6etP9TiNAsyi%)n>XMhkM638JzC0mc zu^?w%t<;9M!a=i^)WNeA<*-kiN4f85t@e6WGDGn)D_{m)Q4jTkeRm$Wuh`i(a(!AB)6keosTbQDH1SI*EPoXv)w>QZ{GmkJHyhPh@qR;`0V-2iEU zgSuTQ8>azn^7IA@^`JoqtM#qb>HD-U*+;(!rES!g6@IVZL{>qy!J6i&#o&%t07ZWE z2CSUu)wokwIVih%(FX|YSyVBp6#{Z}#&!WGyNr3X^iLZ#@R)JAAUSK4FN(qYtugq3 z6j_CJt|E&z9c7B-1<$oZu*gOh+J*jpwqsh%Tb?A3k*GD$z9=c3i?@r`F4C@EqIK}K z2Sn_eXf5xcV^`D>?@9^;FX5?_T{|seJ78O}MR(J~@z%LJ;3viFNjF?7F92dHqCN5b zVtoc}rUo#X3~*Fe2q9BVqMGia)#MgCX-uD+OqoKBu{i}FeULh+RRE0JCOqEN*CN1FW zDk<3sl4{g`drQWEY&M*4k3FdFyKCRZ({$UjrCaHp{Ssyqi9OjL=iF*)g;@ zxomL)JR;t6H^UA`y}YM`*=CCRcrWjZH(N3SrP_krNjbwry^oeqMWPGeh}6tF?5*r5 z4BAh66L?K^TM{@futWRVnkjPA-H1Id- zv@|`S`*icIOVYuYbz+A0D`T)sF;)^cLiWSk&345&-V<$fImn#*qMT>3%$AkVb?;dZu_ z@`dC`XkOlK{kJlVyB$CxT&xWK(pER&+Z@Si}a2LS^vm< z2J+m~D3*=;xrl#nT)};UYkmWy-75VDvR9zC{U}k#PPbQz#D6Zf#QxR!nP$q)Jh_&5 zyY0-`iVk5sUunHd$y`tflMBl1^=k12eck$8@x@#TrNFFdZC@@h-S%wnx?J%q-Hoao@477UE9xeA&$o3Ordhu;L&XRXxnf;A~M8VD8r#y)nJ%!{sB+tWBY$>%n$DSf8IOK04T6oFt zA?DaO{vU|Dq_i^Uv--l}!EmH65P3>8pTPx3{M;n2eSi{Ltk2S6UcPfMFc==7u;~j2 z16&zabiARU<%96{caSL3j~dXYRkjDbJHLh+%d#mhu$G8 zsfj%_w1Utc_x$jt#ur&hgqBkB*PG%anMoOaQb-rSQ$$2?X*6FH$%M5d25o8y!}Lm$ zi>Pkjh=GWpI^dW}vlx=5EYhVZKK(F5sZWhX($pSo7X6aVzTrzY<%@nbFT>s7oq&nt zz>h{923fkNgO(>^J>sZ^59y~o++Up7|fiCJ`>f@8p2t)X#q14ssu3{heer}a%Q zN=HyC;)Lf`5CuYW-HqIMLIp2`>U(~O6LB1|zeQ~q3RK(+$S*Wxd^?DDWx=}#r!P`6 zpVc|K!_TsVfnD5b6g~&uvEmA$BCq27Wh7V@-0MgXzBXBWyHPkaX3hBw#V#b*;N+Mk z+eu600)0OZ-vyV)Mugtj&wWG+bZd;v8Dn-=o%l?JH>=Ab{+&b8RR=pF$8rzS)$`Ku zL^$Ff<*Yz* z0meHorjEE6PCtc5_j(J2!mdS4Mt?9g!6DFTm>=vtLyo}ggqge!7bf&38TG@Nk<=i; WFt~ao!lSDVGAE13`j};MgY-X*HV_B^ diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 4977702a255d7491a205eaf7bf07a7b57b584686..d4868f0cf52ff337825c809e3156020401c8cf76 100644 GIT binary patch delta 2797 zcmaJ>du&rx9KOFk?jBwDpxvu`v}5bq4oX+pShq2^F$a?^1Q_TxBhu`4t}wdh?lM^| z2>3vaMw9c$F;No!Feq^v$O1PppiyJuGbx7XAQCYWe6TDX;wGTZ^SfQQ=_)tpemUp& zI^TC*Pkp3)^-FE~n|ggJ$G&qP%nHxGaXOve(h!>v~H zflFhfleKCXC)cMw)e2={%`lmoFp{L3cDl(42M;MgG}FAQB$#)*Sx+(8iW;#Bak^`=U|%LJ=$FT^f(&I3Yn*#$d~2_B?|% z3WGmp%ugnWWh;}2L6ySZ!7{5B7z@>N=Pt%VcW)L;E0fJPcx8Xw33hfBX^QQSaWj>!#>gC8~gFkbjS~_-QMpXvamKV7l>MUgHFF%x%hyOmC z(gN(&>|_i{=4_)bnGqI0VP(J1#9cL)MKpy`)gZ66UeRSo za_sLoFX%iMb)G2K&6BTZKUTHyXDF=Z)1#?ej`gjSNVc1`acbhBdYS8#Ba&Uu+PG^? z#JKW`$t@q}VNz?!J!ZRTs)}S`8#lCnIubE-u@(=jqTV#fp?NwmP?H9h6&GhYuNdSG^hbntQSp*_n0jgs;MmvDl${K0w-fK zo@0+>+Q+lXPyN{8bb zZ8=+_8?tDCvl=L;jy%{7W%OVkSae2QK?HrWd@>J8RXP`15Gs=8Z%wdA1vRv#2=0e^ z`dkrAK^qMfLnGAE_lm*8wGKB!@f_Ph2QNBtBR5cUDZB*T@;jxl7n+-K_VoxY2v6Yl1Hv`T(TG?@Y(W`nKSO8$JR=tByfRJ6e+2*~Gc&QJkaFEVaz$JKuGSgmo zT5enktJRsx1WN6gPtxGrqHik;DAm#lg4|XK%ae0?;X$=4LTn{Q0~lDdfEed_U&lsL+EC3Icad86x=5biON-b80}x+((a^F z9%z6K)Kv?myr0=ah4fG<80kPQB*O`LUoBixoBJ^VU%<=DI;Fv2^Uz43_W{W#dhwo% zwRCR-c;E+mq5=Fpbr{=#(1@Tg+loDf60#AM`FCQ^i=fcNxy3;Q8)|eTR3cQN4WUl< z-v?@dDtT`stOCfTuQ$OuD5RH~Agq0yMf@W7G=olK8o?AZ>br&TGeQV$PtYe@p+XyG z{oC@ptYfKbZ7@ae_vx~fY>=ZL8o=XlAcsL5UW-PQ=YSWV=zKpI+FN5rQMVIeZwzEZwEx# zsdoOEIX7)QDK22fvjXJw@exFub8~V*Zgt9oG|PllzNU+cQeO!sS|=>)$s~+ZN5f+bq!}v%D^{lHKVPQtISe&59dW?2TWX>Q_cyP?o-Bc-ssf}v50s+i;0!hWdkPtcFmdOe6!TiBhqizga}=e+cKHo zHymr^+n%r99x2E!7^N7xRC(hl7CzgQXYgyIu6t;npZ_$@At<}HoBea2digOmn3`sw#SYa;bA}6;W1gmc=S9L<-k{n*DgA+3W#R2 zQn4K~v_q*_2b8jZoR}G3!AtfVUu$iXl`nbcbd!=z1gcnm8a{xXUC7`WzoelCWu-)+ zjG&xg8>g*+;5SM%DpX3TBp4!ZG`Ef$M$3_RA@gNmHF7jwvyKSN%0i7*&w7%ev{3h2 zwkr#ZO&+eIqnUl5fjI5=EM&l@Q&>gC_$Mg!1TWLHj-ZwrB(UWj7KX`ju(7A#_sE?mW0#%DI>b;HUM-6+B`ZKWHzhN*fhy-P?k+n0~bS$e(5kW|{Q zXY?vz>}EdFQOhC=P>q#ZLjh)o@iW>{0xKHXz7ix?7ZTS+1o{=N=2m}LV`E!Om%p)5 zDSNW5D=4IeU^Ru9+qe3CTm2nM1x3`8{~}op%;ZH0s#v8LcH`^Z&wO^on?v<{+WTHy zHP|*#{6?x1v%=r*E9>ZPYktY!qBQwi+uIZm+gT0|POvY^(OObOvBd;l0-Y+cRCGo} zCe*%xtXBzimeg8lV@(yXgy)e>VAS5KfB`15o3Zy!tahN1Zw2DmsVWp>Ivc7&KLphDAh*F=wT?g3A)MmCi`$PGNf(XKBt{qjCu)OY-TlXVH=ZbkPMln)*y#F zSJl8_>Ivoa)L?_@U2b0s(*|pBRx-Uu3ky|LOlKGCFkRZi=Voo74yQ%*up{-Tg;Tp< z&o2?CX!&c=0=&&WX+R;G*_8%Zmgs+zOLY45wnL9qf1kQ)(xMPag}N$KU2#&dn}DA8 j-(kgD+U2dATfE9K&9x4XO_l)vxderASQ^R7TkzAr@!cI; diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index 96aeb98b28..f08705e41c 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -12,7 +12,7 @@ from litellm import ( embedding, completion, # AuthenticationError, -# InvalidRequestError, + InvalidRequestError, ContextWindowExceededError, # RateLimitError, # ServiceUnavailableError, @@ -34,8 +34,7 @@ litellm.vertex_location = "us-central1" # Approach: Run each model through the test -> assert if the correct error (always the same one) is triggered -models = ["gpt-3.5-turbo"] -test_model = "claude-instant-1" +models = ["command-nightly"] # Test 1: Context Window Errors @pytest.mark.parametrize("model", models) @@ -73,6 +72,9 @@ def invalid_auth(model): # set the model key to an invalid key, depending on th elif model in litellm.openrouter_models: temporary_key = os.environ["OPENROUTER_API_KEY"] os.environ["OPENROUTER_API_KEY"] = "bad-key" + elif model in litellm.aleph_alpha_models: + temporary_key = os.environ["ALEPH_ALPHA_API_KEY"] + os.environ["ALEPH_ALPHA_API_KEY"] = "bad-key" elif ( model == "replicate/llama-2-70b-chat:2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1" @@ -115,8 +117,18 @@ def invalid_auth(model): # set the model key to an invalid key, depending on th os.environ["AI21_API_KEY"] = temporary_key elif ("togethercomputer" in model): os.environ["TOGETHERAI_API_KEY"] = temporary_key + elif model in litellm.aleph_alpha_models: + os.environ["ALEPH_ALPHA_API_KEY"] = temporary_key return +# Test 3: Invalid Request Error +@pytest.mark.parametrize("model", models) +def test_invalid_request_error(model): + messages = [{"content": "hey, how's it going?", "role": "user"}] + + with pytest.raises(InvalidRequestError): + completion(model=model, messages=messages, max_tokens="hello world") + # Test 3: Rate Limit Errors # def test_model_call(model): # try: diff --git a/litellm/utils.py b/litellm/utils.py index 90cf6984d0..5fc70f673d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1786,6 +1786,20 @@ def exception_type(model, original_exception, custom_llm_provider): llm_provider="cohere", model=model ) + elif "invalid type:" in error_str: + exception_mapping_worked = True + raise InvalidRequestError( + message=f"CohereException - {original_exception.message}", + llm_provider="cohere", + model=model + ) + elif "Unexpected server error" in error_str: + exception_mapping_worked = True + raise ServiceUnavailableError( + message=f"CohereException - {original_exception.message}", + llm_provider="cohere", + model=model + ) else: if hasattr(original_exception, "status_code"): exception_mapping_worked = True @@ -1938,6 +1952,46 @@ def exception_type(model, original_exception, custom_llm_provider): llm_provider="together_ai", model=model ) + elif model in litellm.aleph_alpha_models: + if "This is longer than the model's maximum context length" in error_str: + exception_mapping_worked = True + raise ContextWindowExceededError( + message=f"AlephAlphaException - {original_exception.message}", + llm_provider="aleph_alpha", + model=model + ) + elif hasattr(original_exception, "status_code"): + print(f"status code: {original_exception.status_code}") + if original_exception.status_code == 401: + exception_mapping_worked = True + raise AuthenticationError( + message=f"AlephAlphaException - {original_exception.message}", + llm_provider="aleph_alpha", + model=model + ) + elif original_exception.status_code == 400: + exception_mapping_worked = True + raise InvalidRequestError( + message=f"AlephAlphaException - {original_exception.message}", + llm_provider="aleph_alpha", + model=model + ) + elif original_exception.status_code == 429: + exception_mapping_worked = True + raise RateLimitError( + message=f"AlephAlphaException - {original_exception.message}", + llm_provider="aleph_alpha", + model=model + ) + elif original_exception.status_code == 500: + exception_mapping_worked = True + raise ServiceUnavailableError( + message=f"AlephAlphaException - {original_exception.message}", + llm_provider="aleph_alpha", + model=model + ) + raise original_exception + raise original_exception elif custom_llm_provider == "vllm": if hasattr(original_exception, "status_code"): if original_exception.status_code == 0: