From 102c81f8634d40edd7618b3567482b9f145d088c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 25 Sep 2023 10:26:28 -0700 Subject: [PATCH] add get help message --- litellm/__init__.py | 51 +++++++++++++++++++ litellm/__pycache__/__init__.cpython-311.pyc | Bin 11116 -> 13263 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 47803 -> 48499 bytes litellm/__pycache__/timeout.cpython-311.pyc | Bin 5250 -> 5250 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 129090 -> 133042 bytes litellm/tests/test_completion.py | 6 +-- pyproject.toml | 2 +- 7 files changed, 55 insertions(+), 4 deletions(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index 2d5618bcd..45d768c33 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -1,3 +1,54 @@ +### GET HELP/SUPPORT MESSAGE ### +import shutil, os +show_get_help_message = True +def print_box(message, link): + # get the longest line to set the box width + max_length = max(len(message), len(link)) + + # get terminal size + columns, rows = shutil.get_terminal_size(fallback=(80, 24)) + + # set the width and height to 50% of terminal size + width = max_length + 4 # adding 4 to consider the padding spaces and border + height = 20 + + # define left and top margins for centering the box + left_margin = (columns - width) // 2 + top_margin = (rows - height) // 2 + + # create box border lines + horizontal_line = "+" + "-" * (width - 2) + "+" + empty_line = "|" + " " * (width - 2) + "|" + + # print top margin + for _ in range(top_margin): + print() + + # print top border + print(" " * left_margin + horizontal_line) + + # print padding and message + print(" " * left_margin + empty_line) + print(" " * left_margin + empty_line) + print(" " * left_margin + "| " + message.center(max_length) + " |") + print(" " * left_margin + "| " + link.center(max_length) + " |") + print(" " * left_margin + empty_line) + print(" " * left_margin + empty_line) + + # print bottom border + print(" " * left_margin + horizontal_line) + + # print bottom margin + for _ in range(rows - height - top_margin): + print() + + +message = "Add new LLMs: Give Feedback / Get Help" +link = "https://github.com/BerriAI/litellm/issues/new" +if show_get_help_message and not os.path.isfile('litellm_uuid.txt'): # only show once + print_box(message, link) + +### INIT VARIABLES ### import threading, requests from typing import Callable, List, Optional, Dict, Union from litellm.caching import Cache diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index 5f5a1a503d3374690de68d31c6f30a5a760f0842..05a7c09e2dbe18127e155f3f2f7f44e03662f200 100644 GIT binary patch delta 5412 zcmbtYZEO_B8J<1woqcDY?K9^OFxY3nfCIK6=F?_|L~*g`_8Qm=E${D z#-3;AeV=!pd3SbZcI|(h`BS*`p4aOkP}FaHoNm5VTGKIGOvr6=nlQp7h0yF(q7rjZ z2P?QiXaSR{%$(HeAl$`VT)JF{3Ru!bsjuY~y9g`1D-rS~)NFa5eCSy2kqCEa8*=+5 za{B5eFiruNx$~|AG@)jTl+Dad-6B&D^}w}ADOO8piRz_ZwUm~sWwcB!r{yBnt@zXm zS|O1zp)0tT`&TYX5njnWd%+5m1g!$9ocnpnCC8J1CoKpq&W6(J9FY=an3vWtiLT_O z&kRv2Sc$I6Vaf#KptUSfPFKTBuK|I&oG_m)P@lt8*i0aYSz$8`IgH7j&p(n}nwc_TX;V6T9z%*q35f5a=F= zYZt;VJtO=A_H&S4!ZzO^Yzuc^Mu#YO3qS*Ew$ObE5Z?EUa0hFKAvklStRh_H6p z)=^>Yw5?;p+GShEg|*wZP6%rcT6|CXB%V*HdT&`OE*BS`qJw-eeHwlBgtad}q1a1T z#95^!iSS=aK@n7+aXvieTKUtwLTxU0V4hv&B2)~x17vb}1bGq*RT*^WGU?O)P3 znpY#5N8`Yf#-Y3#ALY?FxTJA7ug14|GfcG8Zwk#jw7kQAq@`0BQ^OxYbJ16p_kmrbyIWO!k zc0pk(qYS<|y4Xd958`!5N&Ujpm{7;)n0l37RW+)qI@MK!8tOP5S10I%I!PzhYxJ7k z@4D!BQJE6gpz;$nPUGq{omO9?uc--|P?I#NzD{3P-=J@ZKCdc2Rd3K6(3Vb-rqDyU zDROjhWa)#6kN|Ok4^R8=w*uZK#?luWAqIF-|17CVU}LewrR4|S@=ZVOFr15#gj`6KL>F z!BE(hxrBh56)|@XS0p%(;eL`R1wkupj9P^wF=bqh>Xxj8DZdc zjq*r%)Ub*be#r=`AuSwAL6ch^u8tYkvu!D;m%yzA0wkqUpCo_t`QJG;SAFZk+ZR4-OBYPf6M*Rd4H$r@67l+Uq6!Uof&-OBHrpb-&;qM2N%3$$sVx%wR5L$b*8VH6`PWW z7AmUds%|x>yG&nWasb#w^{To3=^dYM`(%%~y4kF1zF%NgwIz=&`208ZIi3!^8!@Xl znZ8Y*x0${cF>>jOo9(8zF5|6xL?maqfEnq#BJW#;vxPJ81KBw}GwW^^o1WUanCWRY z<(7=xGB39*V=kMXO=d!F%E(Rga?^LRd$Efkp5texXKniIy`eip_Xo_z&P-#c>FNB# zdehTm%Dox6cV6y&N<~Bu-aCKi{QXsCI6tG`u=7+g`*)`+f; zbG;SRru>r-7KsLIDlm2>+#Z-Jx6R=Ac!bF<#x>*D#p4eqilu^jtpS#wRe@VbjWMnS zM`Ajz^D*rt5U)P?wzN-@8dBBe^)+L-P`v<2vfyu+k!RgA@T09u9WCEndk*|x5N#b? zgrs&FTL`h#+vQu_foL9&VFSWOgiQce znf=6CM!caBc%Wge3Aq4agm#3N5b%3R+lSDB&Pa2eqWf`Xs|SWeg&s%{lr;nywaL`WIuT7POwpke(r47rYgZ)xo{4EBz} zqEqzj^4GOQ>T00A{Fg}o3gITgtyDVTPo%KCCL@1RwmG zq&q{p=SlZMK@FUZ(wcO|r`7lB?$ph1?KT_sXBzek?}F@2_RoZG8m7EDBd?y9SHqi1 Ts+}jRp8P)eu;Gtx8Sm-8wxGV# delta 3388 zcmaKu+fNi%9LHz&!m=#OMGz1b1d)pu6c9zg1r`KELGJ3ox-NST%jg^yXJ=8g?b_D1 zwxvnUJoKe$Y#(SElO_%SK_B|k#I|o{O#0BbCVgn?Tbs1~{mvfoGF`^ZXXpF-{(j$? zojHU1WBm8og0F(XJO#EV-{iAj>h2d*q#uF)RGCqzLRDQMnNO9dpk2C)yNR27h=+TL zm*??R{B}oIer7&R${bcuMwdIB0_jvZ zoI>gBa5zQMsdPBS;H2TUlbsH0n;hEZa7v`J+u@W-r^?}Mmrk|ADN9RhkHadLPL0E< zkWQ_`*&&_14yRH$K2pc_!BgKUR352kX_UL9*&xi_QZ))yC6r2>=!#jU0i-77^U~ zO7K1$bSXm$t-q_#2ButXdp5Q1h78y<8#xNOM_4GVP?6+80awDogot<~ub_(sSXcILrZ>x*D%6>VQv;WogY+32xrE<7^I z*vSW@*iykpUT#s9wf5}u$2aFg+2?8Y`Hs!`p6v5h_W2W=^S#;Uzso+~Dd*eR$b&KQ z{b?8NUWc3VP}~^2IpiGc%Y=K_IofS?`l{XXhPr6GRh3ijEoTFnj!Nh4`$Sy}Wxs%s zynu3cYO92$>2~io6m0_q%ipptO8G*`_sGPwHJsVfa zG##a5aTl2p^>d;=4)s}flBGkpppEqi_6m**_6bf1h6M)%2L&eurv!%uhXiMlFHGY{~<`EL%SI89}B~d<4=6Q_7I3<)b!uSGN;BgY? zi)4{&MB`VjPm zev98Gx8YcwQkpLP247Sev%cS!Ql~e%N>sPyFA7=VvQlp=7za1z%7)dB7C5wXBN1&$ zGb52(MWd@{6S1h?{H%gsGZ_TjQ687p-1DsY@4>&PiuI)Yz|Ip;|5`CR;lscnqx~7W zteT30eqmtE8Y?fe^or2%aS%-|yD(xd8Z1g9vBZ+eZkmRut9FpBuq87>nHkmeWD@`A z?h(m$u13Mp7FLZg6#K0|D_Ydfjk+E4{=hgCj0wb~b-%W$cnS_}{|Yl8ITF>3S?h<| z=A84`pjrRccAR`+0E_d87=j`e5SU>w#4JKXTtn~;b8nApp7L6@pXD(WPtEawlH~xq<0@xKuGBX0#KA%W3BOl8_ zYo)$6U5JN8h+@PxL*!#i0cRg8+|5An(!!WZ_0%AW|-)t5G#lqh?|I2 z#4W^a#OsJR5N{&Vh&zb45N{*iLEJ^W3$Q(D9@UoYd<~X++=!Z5Vkv1HK>Iz!`-ppp z4-g+BK0>Sk?1K3ejl;6w(WPjd8OF!xgb?Bd!#D4*+-~@`DV>FkZ$aXVll;}MD1W$B UReh{f{^U|BH=Z^<_Iq&TKYZi84*&oF diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index b395309b62382bf73a0074cc09517dbae2f7fc57..396f89a3bdd6ec714cf99a706ba6191a51d0a792 100644 GIT binary patch delta 2080 zcmcIldrVVT7(d@VrKRr|ZLLtCpcIh`h-i_jD{oL*2U_35M>`{fiTv@i!;lzhw*~AWN7B@z4f{H&;Hm=dVjy)_x--} zopbs%J$aA0JId$|X|*aOJmFKuaR2S&x;hQ4q)Rn906zMr_NW5Z(5aTg4D-rFdds#Z z0h`$GX~1!r!A5os%}l?Gv7TkAeOwt}9ebWOj(3ZskiMN|2drg#>0y^oB$(dGc4Dk% z*HLrsM8GQc8uhvNi$qCoO*)R1>@m7KPgq9DYRHZJVi=*ef(Hx}JxE^m+Mu2k6j@29 z*MZBQM8IJopA@>tVULQOn64u`z50R*uAGxT9m1hPYv03MPUt1Cz`2}QUXPr;&!MPX zJaGJJY9P1sllAi+>vq%wkyFH0FwMBGd45YUR@t&3Rt1Rj9+*Q06iMXF6fOCDN-ac4 zt8*r)D$3M1Jgtpbxk_?uvMZsQwQyA;Q&)3}NG5~0>ZXMxP-r2kg(mV~nq4l1773xR z{^JQPFFYZ+F*P}J@iRN=3Podf&bW5!bEjQGc8;G0>&eY57p{q(ARpuwLk+o}TLDqx zbUTbPb_ZtAlzpyheGX-sxpMCjgPA4MNf-W zB)?b&n@Cad1o(n97CT_0~m>qMtISnZKtYg*l4qV6OlAD<} zYzl25TTATbx&{>LjQP2`aX%(xfd)TiSs{%B6?)L9pD@}6LgcT1tTz>CNJEF;Ve0^WWO3WhuLfLFuSTX zM1o6ei+n?Rm+qpK%dUdpN^A7wM&e;1cTLkCjzq&78(UgK;pT`6gpfKCZd=>f z7LBZ7S4Ym1O^qIMvhjUIk6>?GnnIQ@pA4HRSspPh{5d7_vFYq?r~oC(Wb%l;(q5~y0?GPV0zVAJ;%OsLmGgx12JAh__38b`kGb zN;3rPL_;3QH#}ArNkhY_QrF=$Vc3$ON1-L+C5h= ztnS_n{q$D%ph6J+?^3u8D#?P+uw?zj#>}i2bfPyy~5wlt8_-+QGh1;$01h& zd`ps!{2;u4Ke7*^^sS?x$#m-!2=N#IcoTvwvVywET56&@=z7ff_2l8F^__k_sCe}B zeO0aFu_Wb4Z{`&eO+EXL*3pv*V;C$tght*`I6$M#l!paEe<3JDEsLU>FU% zkC-wufC*!t61Ve+1WEYe>=8!IUMKIm#4>6&72nG$gk88WZ!W3Nz9Ng^(*v#nCHoeS z{7R|W&}v_T4SBH!@3ihg1He^FS=vn-8#|T;N;_T&l;Q1pn_)BVOen?~`3}R97tvfa zUy9G=q$tW+GhZf=wwzaS4jJOh+m~UOYsRHzNPb@vYOo|BSEUGx2?g#TDrb zoD?T9Os64b_|m5Om+>`?$hRX<%h!~mW_zHHujT9T;2bOT;r$C@6}A2Gd@UZyZA$mO z&ZBK&DxdC~F<-R)D^j7*@<0EzAary+&MwZ4t^XfC*vwFigL7<#2ELxBk5t*WlLU*$ z0ebKUi%yt!1iZZ0$AtRqQi{BTw7Od(;5@m!BWLmsX;%)k}Av-t>iuBlLdE~Q__+twV=F&o?1 zF=ZROzSGx6^ex|m7&gAPAaP7LRk%ZRY~<7+-lgT*x;C|R`MC}3tK3yw(^?RAO{#QV z-0-f}BdWb3bg{8GbzP45PhYi;i^Mm$dh$+p4={HvNn}^APSxj4Mx#}cZqZ!Rc`TCs zdRA(^9^KS|ByQ?84H3*u%bW%+b4#lb`Bp@V{-E}~GL zo=t5qEMgb$)ey**0>whOwgNUayK$eu#r)SnvC`h0eDE`&R#j_@b%qQ z@CGrzX#p4{&OM^5j(oXSt_Ff{3@jD{Y=hh3AQ>9`MkNY%h`=aGe6K()8<&&S$2%Fw zAU96@36M*!o)SOGrR4GHvjCOk_=hP9_zGV;_no*O`{*!u$-2}o%YR)xg#q2N28m_u`5ZKV8?Q}z#}zzB8# diff --git a/litellm/__pycache__/timeout.cpython-311.pyc b/litellm/__pycache__/timeout.cpython-311.pyc index 1f3bbe0d8086bf7151b8ac0bb2ebea1c25399fc8..71dcdd313162ad078fceb8010fde430b9c64dbf8 100644 GIT binary patch delta 90 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 delta 12368 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 J>V