From 16589d1892fc0e836dada152c107434d5d7e3093 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 17 Aug 2023 11:31:34 -0700 Subject: [PATCH] return llm_provider as part of the exception --- litellm/__pycache__/__init__.cpython-311.pyc | Bin 4528 -> 4638 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 25606 -> 25743 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 43479 -> 46817 bytes litellm/exceptions.py | 43 +++++++++++++++ litellm/tests/test_exceptions.py | 10 ++-- litellm/utils.py | 53 ++++++++++--------- 6 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 litellm/exceptions.py diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index f76206ecdc8b8551fc786f48f4b19a8d87a71008..ff33c5b10afd32125e0f744bfa056d01e224f5c4 100644 GIT binary patch delta 515 zcmW-cyHCR~5XR#QS^^k40IGQO{R$~ayrC^+h7~3Ysfubhjg&N%>mtMgD?aJFUtzWdI;JNYqpo1ePJcwB?kKK-Dpvo})-bo5j@M3=Tk7w!;A z(nTAQ6u2dDY0xBShNd8!1(ybwqZyjDBP36AG!I&Ud;#)B&?0DwC0XhMX0WtkMlq|H zQ!Fax6$^?hB`Kr~ElSYBpk)}iObxp1nx08aq(N-Dl@qCzAQ3Uvq~B5Abaz2Dy5jD6 zRZ{h8q~_I0-PX1hcV@*R3qkfNdEhmh&{0`$R)UB@QaKGoYLY=do z>$EJv!imnnwwZ!-a}n@~3{>$yJ=jEDLe|= z_s<;4cwpl6Oa;Cd#supNXc>+UgyZ&u2Rt9&fD67Uu_dt`T;pPWM~1r+dlFTNn#7_+ sLShc^J6896I&fKocfcYz{kP#4en!K)={Ull@ymC$ukd#?c!~f01KN3yfB*mh delta 405 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 Dt6Qan diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index fe9983c5b45b9f6ae2c83f507ed30a015cc80981..4c042a250577e83e3e1140b3c4e0889639c92e26 100644 GIT binary patch delta 12570 zcmb7q3wTpUcK?0o{je-qk{{ScHnu_7mH~r#voXey5O6{uFOx*by4SWqmdsok43UvH zp}`@LIGJW~UW85afF{{x>vlKWOc{+*i_B0%1&AH(kiK3Zk8(GR|&uQ@C(T6r7C%Sw?nEvYV6z~Er6Q8A=Loh zAk_l4N_Bu6rG?O|&NgWgL^esQr690tmli{8vs4ebg>}6F3N>EU^&6!SFpM_73{7a7O{J*>CBW6RkJ36Otr!lX&}W#0t4l zy?Z)N_x95O#7}WD*U3vIRNsiwpEB(oYB1d`J+T_jb zVzeM90iA{VZ9DOiG$d5U3x4(t|({tGd(Lp8F89K;-Efrhh|Vx$$o-` zH3Lb;Wz8B1D-A5u_;fdC0$f;}9DBC(X*2OTTDx?}mQ%}`eH01R`*mtFqR z)Y#4mS5?+krCO>8HYh663y*k97D4dZwxtF7c)2%2Y9JRIrA#$SWQ`(qkgORGMB)Ro zg2Nt|)i@~nWsS>c-2^mB8Ne`i+2R^Cj7G;+OjxS27HpmVVjBy%j-W|{VN68& zM)lF7o10wYZ;A`}GJQ0h{Unx1g%8N2E2+q&1xjwGA)~yQQEKM?NOT|Q0=`nbKwG-CSvvfWR=Ywxm6nnmM=&p-cs(nG&+WI{Ly zZ+Kgs+}jSmZ3FkVv$cBTGV#Yv0z`hil*jNg5yBTYw3^$EjziV@0KWGd)*SQHuoRW(3q6awEbv0L>at_Vmak+?^m> z=|2?(ivpNx#?)A%hsY3%k1zE8w?KdTi1pU35Ix2n6OM_;49ASeOs8N?KFS?8;$nH6 zEtbcjtKGb0IBGdAvXBu%!iX>;ju=LaBV4ypG99%H@o8MK&Eva^WuczXr;?g3viZ z6GBUvlxM5&e_Ge|$O(C{pKLhX7>&o|L@KlnL=LlHLkO0^a6d`*_0LMn7k>koeu_)T zZ{cs4Q%l?7JzqSw@JujU)}Tij`Y{7ueJ)$3b|!`XZL&3U1n61w$S{OvH;g<03IEF` zy@}i&M5qRUNsIcT8TKY)2^j2|@jHsiCg@oPx~8CDc0IQSH|v1xlxTWEbmc6xxx0P#c-9bwl7u{uE~gv-4p?8cew~ z|04e=KP03DiQ9*3=Q56zqy^OJ=?C=8H9MXbW@#L%7d=z%(|0tm66{P_E1tZlo^fE*@#T;`WVtKc5tM;NU76 zNsXjn`BiWed9bz~jO-=ioZTfa#SKtmmK1rAqEO1j2-eyhNr~%VzU8Gujsqdck7mgk)$bclwK{4eAZ8aT7hbGVHnI#5XLpKXvkI8oV1T_p0LbQ*~@zE%vl_; z`Wo`R_7rocgmN0FEcW9L`lJ!oaSqlXZb)Pr-B<#JNJe+CrZT zv_ZpIMN3k+!%RJCbJ~K{Va461FRyYN&!x=|z=>eUe8hZ^KgbP=cXJ2%px6QHsVNm9 zuv+M&i`z=jp;;s_r&F;$SrZezT;!ijuMA&W;G?O#X1M+Qz>&QZ%fo90v6Sx5% zeNi&$6OX(A8Q+4R@(ch>82T5rwHceyGs)$l#A@_Ta@PUB(deAyt^);S$lz;23+E^r z?$8%^n4Iv87uN;(Rx~WhO9-zZoJBYXpgE$+0kEL;6P~{BfqF!f66l>~Vj&r%Qcl0Q z(7$>vE#s%4Fs2ki7lxDZ3NyYkA>W1kPpG=^A-;P2&PAW`^~`p%v120?Qc}8cwjPQF zZMub23}I3NKp$QFVp#wJS^<^}_k*p;xRW;_@%Q7~>b*Q)O(PA@?f#9`7U6C_`n{2AtdA7F0J=$=NO=>jDCd3t|i3~K$T@z%_( zkN`*NB#FvwLL~=M%m&rW(?=4tm^D{)01o4Q;Yfch+!cX?N)x089pobXBgliigTM^y zE)4wyKy&mCFgqINcvL1kFv*@u!otxDVu-}RI0XxY{1ts8R15a&uR|rK_n}M$PrnGQ z0AVj{`jN;R=)Wv0DaPerv-L#=r^gwYk#}iD^F8z4!aV2n%!ZvL9@qE;aYHhFvbn{M z!$s~vxR?H-xoX=77({cFs0b4XzeM;M0+JD21c-)^Mfkr6ze2c-zy^RFBz{5Lme)hm zlgmp@A41kje*DqpW^r-#++u%)Q8r@M#6TZwp~3_fH9ett$A7-^JYS0J&j|!i+$4j* zBrK9|(&tu}Llu9%dO80h{djd_IWmXsm9^q1mSjy~b-Y7Yty#ryrTf>+%V4*)!mdav z+6!8m*ArZY;XE<^a-HX9+WY3!vaZ zb7~slKSKbP7V28-Gkyjc&y5Gyc9`v}vGf{*wc`(L{61gz?-;%Tp#`B80JM6_K#Ipn z8>Vie_iZZm-;Kdegxy%mfUX(xYkG21v420Neu41+5Dc(-6OpHXzNs>U)(mVlay%AI zCgg4Gv`0*s=#0b^@R3PVX}Ai2xM04|Nk%hCD^LddBdGRm?3h5949%n$^DHQ(E;ywV z?2G1B;2c3f5VG@EpQE!xpjY4V7ot2P4`lsRi_#d?IahU`x`WF4CT`TRl9*}=S z_<}ax{-EIC>7U$QBeT&nU^0$Qkk|hSGm8Ki{jAJ9$kvR|sU#s45I$#`(HqT?AIfCc zUXmYTeJJeU-@9W$L!OIHKBaa+Y~fV|PM(h5@r@crfUVLu=>b?P$koN^r+0)hXf|jb zFz{lye!<=>fsZH_S6~vb6@-};Rb&ZNrHTFE2xJ<9T21;8*a^of!-SFvNLdqMAtvCp z=GZ2t6-Ij_u-?L=yIpq(k|NA=BdiDd3Z^jN28{Hl!2Hk*0|PN|1|lvelk}}SEBxT< z);$DaIGV$#`jEDnPTuM3F2>-muo-(0A_(^(Fe69C5CI7K^+Wgbm@p$R1*2#|6Y!eD zdV&DHbf`>;gC>Rhlpf|Hqxo@5cY(uD>ZT zPqC&KdzLJUW90<{>@6%3>EF&aRqMzHa;qIcm&R%Kqj$RfR!M{pq2Avh5l z5E>Ce2utZhy-PAUbYvNeV_k6s)`%8NTaK_2VHHAtP`Byms=(_$U{sfKpFUhd&L_iKN zBD{p~G60wx4`Fz7KJ^t0okc*~i2N}E6X2^DdJQ0Gnbm5xynF|28 zu^M}gaGW;ne;I6uU+nMkq6Wa05$OVJ9zCsKuUO~~a${uxxM&_Qlw#e7z?Ghodtj!b zvC;t)WAq244LJN4Ddpd#K4tmZQb`zsqmU%-!@hFFB8h1}%)%H?n9&_H6HoIGz(vET zK<-bOsrz^t?N{8qg)UJ_MPJH}DVe>v(z9pCm=Gl6kTK<&PGL@T0~~~SynjgH*iAjJ znO_DM!K>&dU=LhaS<)Q%2i{5*O{W1hFInfh;K_-UZzf-|rA2+& zx;GEIo0@SlaFPSc;Wo;iXSnAC$@yBr+&ZAkvw69uc$G6=xWZ38b9iMqWClJr=WB&? zyLJ^j_nfB9pJoP^IA5!2qkQ5)$&)sKsOEGogN(j5i!P~%Njoli87u!aa`L4OOgcr^ zk&aRFPj#X=FB4WjHereoBvEv&B&6b5)y?kvS65duRh>6gHA`M|XrTUA^J@G6pZHg3 zKH$(`<|q|ZUU8k?&rcik<2JkZU#t4W z!!U0HQ(b!S>S>ahtHVT@qr+c5AF8hDdEnZf&*63b`GDguUBe9I5V%$jbJ%_Pe7J@i z@Vd@a#rgFB?}vMt>KWw#?@jHHDdnOculGB^`NK=q&kAYNYYXVA!N$Uxj?KIDgVbF> z0(Riu!Igzs-8OoWes8d5(_vq00(>9I{#dkqFe>-s(i&(Cu>AqnU_TVs9PxM` zda@71B$>oUVcmt}CFbb6z%Kgnpv3Q>yAJ)xqM4#eIGD-Qb$DOqHoasQmSpuZbIhaJ zVhX$UNknDMdCQbrrJdQAyMTo4>Y8&S*vk1PX@=AxIQKRntGs2TnR_D&-c#yk-A<&n zVF}hYJB}D}AfW0_8{A9^*fRad(}|&55q2Q3Ef~#s+^*o!cPy5La2jTy@;k6vN$Ms-rUN zs8=2JS3)g%I7j36KhGbbj`VVQiKO1xnZ2<~g#f(D5!IWS@Mf~!j9QS%xff*JP3N00 zxm#3sOD@=`7Svt#F2sVfiQ@YwIj&XMCcr=6cHt9-aC(9;q`0;V^hCO(qCTv)-JWf` zSA_t)i9@RQ@Pzkp)_YhjI81+(uB-@kshjW0Zr-Cp0N(v+)iX5V8OnNwRL2ngU3yU_ zwBtfd4eh{p&py=?pYX)9p1A6W=Uf$M$}hPZRaawfA#}FpvZoeG;Jdq9_4G`5da|A#)zJg&)vBeJs$EM}*V4lpJo7uZ)ENr5;=sq2*0DF!#hp5=tX((aqykvzaRb%PoGFu z(RZFHq!SN3?OY0(uo$r;Ko=c+aKt`y8dy&4M;rKVy6Wg6zKceVZuJJBG>PCmNB9gU z^Iwnu<+giA(mV2jG*tB^3^ zC)LzhS4y*w{Bp%#BEee#@Fk8(lEJ?zPr1pJgE80zdVvpIA}1q~!W<+pUh_Hnn-hz` zcVs`gMOY)!T_+>@h_J6p=>IwSo0Z3a>ae9cB@d>m*Hj-Cs)zpZzv0m<63KC7YJd-I zBzB4baiC>DPSW2#+6sIZKXxu4IG7#_=9ZH^B98im+kCosoDni&_&dh$eR3DS6I-k+qE+7k8!;h-P=)XZ zSZ}^^f_0G72uwj3bpXo^V;VxeNWG`-x3e6Kv*|Vdol`!Zm*_iVP3ut6H4`{lqX#7t zLo%is22>6GMBI!Fan{4fF?Mi^b;o+b{SnZiyJ^!?3me!ziU%jyL*ZfDs8)zqEZ|3E zh2io?A!mU>|M&w>Z85B2Vm$^F;E7@*$`l}gb>oPWK@73Mni(e?81gI?Pp{asAG2}r zGz%;};2BOF(lyVh^uuCA_F;ZrQ)c?08KZIdXa;VMI*?hu75KRkd?*Irgoy(LKB=H% zr)zFL2~0G8FL@rBu`U(>5$jf^$iZ^pPI|_3*g)`J2Qh z)-$GZx~EpN;^zc#zy((u>oC?hON%ov_>FHu(sT6b7sAC+0cxLqP}m|Qe7c8z^mND$ zpWxw5WLh{Qz~!H}08B*K#9kBhqZ{pbrdTwj4Yc=}^;TorNCu#&kq+1S=_*5^iCr3+ zsC$Et{^S`KeQ(qu48a|u*-!swXQ6q>lD0^uQaZ86w^g!~PB(xXvPxFTCfT1AhHPnT z+9o;HL7rrioM~H(@8M(oo$y)DDW2y}99+Qh+}+%X`}GUK6PXr{KK4yNbv)NB3TLeB zy7KgM1vdPOZvl2R{8EeG#b7OQut7AZ8TnSs((($m_`9I|zC8%8>7392Yfm9$`kOz6a5u zU9;|mFA2j~Az=;p6D&23@TUlWhVXp=&CUvfQs5<%6$!#pESl1aW<2eA-C-)H!1;f} zY<1IhEif$wxDJ`+r4Q@s2F%Hip}LoFTX0jy^CcNuXt-@M;5Js~ipox{dt%)g@oeyo zJ4e?|6t!oI+9$aJYsFW?yWU)7^|SF0Dw{7=HcwQp$X2eHM>icZpjCAEtl$A&JRx1-H@%j;etC`*EVMVsAkcN zThHDzU?-(6&l_y z7BM`pwV};oxM=1fa?v8RIm{PrW(<2gQ2t_#tu17}7!onOl*jNg48P+p-_$6=?s*oWsamgxjGHxPpM%^l=zTJ=X|nRBSce~j=dK(K>dvVcvIOv#A@`kdH<%$P~oiXmn@ zv2BwbNta_9v(@^M3&kkdqp*CZV*A+brslvkbov&Spz~4lO*sJRdw=B8uVuWmT!Kny z>N-ZhoGG4@HFGON@O+nNg$G_GG<`WkESTp=!lh0m7SiuLtdK~K?3aAC*X2>Y?r7YNKlU4&^~1RnzPJr`rB7mJ|JpWRrHM=*rGM*Vz? z-_q!Y_GS!a*g5zG41O2kO@s>w?<4#g;X?pT1UV2mL`+>0F&{s3B{N4Xx>5DB?;$J_ z!6>t4hcR>(fh~i$YZ2Ug*lGf%MHK|Akt6`{pO$s{$DJF<&!7yvoboK){n8I;%gejh ztWdc*Z;m^le!Z9e@a21gi;MZ{N$y(s1k*m7$yiSPuQUYQ{6_waILYDv>tF-zdL`(& pljn;jxmkE%{OMN)dCxYuNuT6q;XSnG+)EXO3;4=O?pk01`2WgCVsroi delta 9705 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 C7MJY+ diff --git a/litellm/exceptions.py b/litellm/exceptions.py new file mode 100644 index 00000000000..82f2f516520 --- /dev/null +++ b/litellm/exceptions.py @@ -0,0 +1,43 @@ +## LiteLLM versions of the OpenAI Exception Types +from openai.error import AuthenticationError, InvalidRequestError, RateLimitError, ServiceUnavailableError, OpenAIError + +class AuthenticationError(AuthenticationError): + def __init__(self, message, llm_provider): + self.status_code = 401 + self.message = message + self.llm_provider = llm_provider + super().__init__(self.message) # Call the base class constructor with the parameters it needs + + +class InvalidRequestError(InvalidRequestError): + def __init__(self, message, model, llm_provider): + self.status_code = 400 + self.message = message + self.model = model + self.llm_provider = llm_provider + super().__init__(self.message, f"{self.model}") # Call the base class constructor with the parameters it needs + + +class RateLimitError(RateLimitError): + def __init__(self, message, llm_provider): + self.status_code = 429 + self.message = message + self.llm_provider = llm_provider + super().__init__(self.message) # Call the base class constructor with the parameters it needs + +class ServiceUnavailableError(ServiceUnavailableError): + def __init__(self, message, llm_provider): + self.status_code = 500 + self.message = message + self.llm_provider = llm_provider + super().__init__(self.message) # Call the base class constructor with the parameters it needs + +class OpenAIError(OpenAIError): + def __init__(self, original_exception): + self.status_code = original_exception.http_status + super().__init__(http_body=original_exception.http_body, + http_status=original_exception.http_status, + json_body=original_exception.json_body, + headers=original_exception.headers, + code=original_exception.code) + self.llm_provider = "openai" \ No newline at end of file diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index e224fdf7a63..76cff6bdb8b 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -40,11 +40,11 @@ def test_context_window(model): print(f"model: {model}") response = completion(model=model, messages=messages, custom_llm_provider="azure", logger_fn=logging_fn) print(f"response: {response}") - except InvalidRequestError: - print("InvalidRequestError") + except InvalidRequestError as e: + print(f"InvalidRequestError: {e.llm_provider}") return - except OpenAIError: - print("OpenAIError") + except OpenAIError as e: + print(f"OpenAIError: {e.llm_provider}") return except Exception as e: print("Uncaught Error in test_context_window") @@ -81,7 +81,7 @@ def invalid_auth(model): # set the model key to an invalid key, depending on the response = completion(model=model, messages=messages, custom_llm_provider=custom_llm_provider) print(f"response: {response}") except AuthenticationError as e: - print(f"AuthenticationError Caught Exception - {e}") + print(f"AuthenticationError Caught Exception - {e.llm_provider}") except OpenAIError: # is at least an openai error -> in case of random model errors - e.g. overloaded server print(f"OpenAIError Caught Exception - {e}") except Exception as e: diff --git a/litellm/utils.py b/litellm/utils.py index b88bc532ff6..b27938e90f4 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5,13 +5,13 @@ import litellm, openai import random, uuid, requests import datetime, time import tiktoken -from importlib_metadata import DistributionNotFound, VersionConflict encoding = tiktoken.get_encoding("cl100k_base") from .integrations.helicone import HeliconeLogger from .integrations.aispend import AISpendLogger from .integrations.berrispend import BerriSpendLogger from .integrations.supabase import Supabase -from openai.error import AuthenticationError, InvalidRequestError, RateLimitError, ServiceUnavailableError, OpenAIError +from openai.error import OpenAIError as OriginalError +from .exceptions import AuthenticationError, InvalidRequestError, RateLimitError, ServiceUnavailableError, OpenAIError ####### ENVIRONMENT VARIABLES ################### dotenv.load_dotenv() # Loading env variables using dotenv sentry_sdk_instance = None @@ -102,18 +102,14 @@ def install_and_import(package: str): try: # Import the module module = importlib.import_module(package) - except (ModuleNotFoundError, ImportError): + except ImportError: print_verbose(f"{package} is not installed. Installing...") subprocess.call([sys.executable, "-m", "pip", "install", package]) globals()[package] = importlib.import_module(package) - except (DistributionNotFound, ImportError): - print_verbose(f"{package} is not installed. Installing...") - subprocess.call([sys.executable, "-m", "pip", "install", package]) - globals()[package] = importlib.import_module(package) - except VersionConflict as vc: - print_verbose(f"Detected version conflict for {package}. Upgrading...") - subprocess.call([sys.executable, "-m", "pip", "install", "--upgrade", package]) - globals()[package] = importlib.import_module(package) + # except VersionConflict as vc: + # print_verbose(f"Detected version conflict for {package}. Upgrading...") + # subprocess.call([sys.executable, "-m", "pip", "install", "--upgrade", package]) + # globals()[package] = importlib.import_module(package) finally: if package not in globals().keys(): globals()[package] = importlib.import_module(package) @@ -687,8 +683,13 @@ def exception_type(model, original_exception, custom_llm_provider): global user_logger_fn exception_mapping_worked = False try: - if isinstance(original_exception, OpenAIError): + if isinstance(original_exception, OriginalError): # Handle the OpenAIError + exception_mapping_worked = True + if custom_llm_provider == "azure": + original_exception.llm_provider = "azure" + else: + original_exception.llm_provider = "openai" raise original_exception elif model: error_str = str(original_exception) @@ -702,49 +703,49 @@ def exception_type(model, original_exception, custom_llm_provider): print_verbose(f"status_code: {original_exception.status_code}") if original_exception.status_code == 401: exception_mapping_worked = True - raise AuthenticationError(f"AnthropicException - {original_exception.message}") + raise AuthenticationError(message=f"AnthropicException - {original_exception.message}", llm_provider="anthropic") elif original_exception.status_code == 400: exception_mapping_worked = True - raise InvalidRequestError(f"AnthropicException - {original_exception.message}", f"{model}") + raise InvalidRequestError(message=f"AnthropicException - {original_exception.message}", model=model, llm_provider="anthropic") elif original_exception.status_code == 429: exception_mapping_worked = True - raise RateLimitError(f"AnthropicException - {original_exception.message}") + raise RateLimitError(message=f"AnthropicException - {original_exception.message}", llm_provider="anthropic") elif "Could not resolve authentication method. Expected either api_key or auth_token to be set." in error_str: exception_mapping_worked = True - raise AuthenticationError(f"AnthropicException - {error_str}") + raise AuthenticationError(message=f"AnthropicException - {original_exception.message}", llm_provider="anthropic") elif "replicate" in model: if "Incorrect authentication token" in error_str: exception_mapping_worked = True - raise AuthenticationError(f"ReplicateException - {error_str}") + raise AuthenticationError(message=f"ReplicateException - {error_str}", llm_provider="replicate") elif exception_type == "ModelError": exception_mapping_worked = True - raise InvalidRequestError(f"ReplicateException - {error_str}", f"{model}") + raise InvalidRequestError(message=f"ReplicateException - {error_str}", model=model, llm_provider="replicate") elif "Request was throttled" in error_str: exception_mapping_worked = True - raise RateLimitError(f"ReplicateException - {error_str}") + raise RateLimitError(message=f"ReplicateException - {error_str}", llm_provider="replicate") elif exception_type == "ReplicateError": ## ReplicateError implies an error on Replicate server side, not user side - raise ServiceUnavailableError(f"ReplicateException - {error_str}") + raise ServiceUnavailableError(message=f"ReplicateException - {error_str}", llm_provider="replicate") elif model == "command-nightly": #Cohere if "invalid api token" in error_str or "No API key provided." in error_str: exception_mapping_worked = True - raise AuthenticationError(f"CohereException - {error_str}") + raise AuthenticationError(message=f"CohereException - {original_exception.message}", llm_provider="cohere") elif "too many tokens" in error_str: exception_mapping_worked = True - raise InvalidRequestError(f"CohereException - {error_str}", f"{model}") + raise InvalidRequestError(message=f"CohereException - {original_exception.message}", model=model, llm_provider="cohere") elif "CohereConnectionError" in exception_type: # cohere seems to fire these errors when we load test it (1k+ messages / min) exception_mapping_worked = True - raise RateLimitError(f"CohereException - {original_exception.message}") + raise RateLimitError(message=f"CohereException - {original_exception.message}", llm_provider="cohere") elif custom_llm_provider == "huggingface": if hasattr(original_exception, "status_code"): if original_exception.status_code == 401: exception_mapping_worked = True - raise AuthenticationError(f"HuggingfaceException - {original_exception.message}") + raise AuthenticationError(message=f"HuggingfaceException - {original_exception.message}", llm_provider="huggingface") elif original_exception.status_code == 400: exception_mapping_worked = True - raise InvalidRequestError(f"HuggingfaceException - {original_exception.message}", f"{model}") + raise InvalidRequestError(message=f"HuggingfaceException - {original_exception.message}", model=model, llm_provider="huggingface") elif original_exception.status_code == 429: exception_mapping_worked = True - raise RateLimitError(f"HuggingfaceException - {original_exception.message}") + raise RateLimitError(message=f"HuggingfaceException - {original_exception.message}", llm_provider="huggingface") raise original_exception # base case - return the original exception else: raise original_exception