From b63b759866b163be93dd0493c7748b9515f82f1e Mon Sep 17 00:00:00 2001 From: Kalki Date: Fri, 25 Aug 2023 12:46:48 +0530 Subject: [PATCH 01/12] Models Frontend Changes --- gui/pages/Dashboard/Settings/Settings.js | 8 ++++---- gui/public/images/google_analytics_logo.png | Bin 0 -> 19215 bytes gui/utils/utils.js | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 gui/public/images/google_analytics_logo.png diff --git a/gui/pages/Dashboard/Settings/Settings.js b/gui/pages/Dashboard/Settings/Settings.js index 06d2025ae..7d1263383 100644 --- a/gui/pages/Dashboard/Settings/Settings.js +++ b/gui/pages/Dashboard/Settings/Settings.js @@ -34,10 +34,10 @@ export default function Settings({organisationId, sendDatabaseData}) { database-icon Database - +
diff --git a/gui/public/images/google_analytics_logo.png b/gui/public/images/google_analytics_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d06bf018a3d60396c95cef70ec6227e1ec75c79e GIT binary patch literal 19215 zcmeFYXIv9q*Ec$Vic&;HL_t76iXcU)f)JD@Af3=5AiaxpfdnrF1O%iDNbkM(5(KG& z^xmX*LJuY7op{~PbDsBi&UrtbkLN=sGm|}gufEoQ%}$V-iaaG59T@-slnSq8Gys4Y zJS7IMUID+3JV(yKuWN5#>A3&^IW^%!1SEXF3*IDh(U5-$6#u@z0bX3PdZGLR0LsG2 zF{YORKrvH6=7p9g(a!9(@8&i}s~2k$94zljvg|hU=QcJiHypJmZ_-`5bn~uS$Dnte z0NhYbzTJD2h}46j^Vo%ffp6vogPWY%jjsWwc8Nt6HrBCo=-tht6P}9lcOjo$=Dg<7 z-#>rp>8Z2}`us(74eb!w6Wp8M^Cil8ZVih}EDHkwsXQ5wk1T1Bw$x8o!DI9dA^`Ba z#R8tHy}Se-6+eRqscSdEBPTO~XEqt|@c$3~|3(`5R{{P9h2Batd}ZdnbW9?OZTJR} zElC}v-K6@9s)f0s6;-<@#VJh4!|4~3;^i$xw@JNrn!D~Wsk=8sywJ%45XM4FS`tf-0@DCA4Tr*!87 zW9Z#st!!uA(D)MD{XHFXD#$|@%#+cCi4Gk?Mj`|$EXOl;+aA5+C*bqOChkd198E%Z_PaTQ8&5*Mr`52nJT##>gIr(yUTe6^s*zpf(q2;!7lIf z0)LVejd%F@p8JiH67GUbS6)>xA`gEEFMCI$alx%J}i^{a=t zA&kobatKQ|Y0qW496*!4nz^||s}$Gt(ku=M-Tyf}!=Y-4nCQR5|Ip7=9`ttjwHOze zn#aDpDjPEw?%?G-X+`75q zmj=cUKe&S7!t8xFHk_)>LKvDW=`5fl>ixP`4c+ocVJ(|Sb0TGrk;3a=(#28-d>|8=EtPWpktpciH*L{T z{EiBGc%zN%gDDu={dnzi@6k!mQzR^ZU3JH2MNZ>oSo_*`C~@gN@0$C(G1X=P_y;z= zP1R=QsfYoY2n|U0+a+?Xrd8V8PTnyW+3Yi&3A<5Tx1uhQGJ>JFzL)QpKr>qkQt7w> z0qZtn^02_g^ON0Jp)?z@Rl_3G#~K_Vl2RTkzugF~z&yFy1atSxO&j`ca|EJ{vm=#){{n|V;9hcCIdxp8jGj~3%nC%1|ogx-N zaFmEw4t}E(hvnp1;nNJCNqOa&$eOgIJ|H}FNR*m45_6gu2+2P$LOv8|m=^l1U1r3K zrcH7-!&9RBgsU6%=~M8G@exYVKb2|y@^_%u@7^D=0RGr#6&Yb)i`I5B))`m85P{o4 zv-!0N@aXGvna#%g^OmgcZA80Xx%bZ-V;#?U&@E=R=gim7<4J%#Xi))&^Ci(@BAl;Q)%^<$9yR6k7JkQATvypdO{xfEIM>E$F_&x4={=P37Ck_ zwbnN;Kk1u4_8v;(tM5SOWkZrhR8%)l;_^__VpRhuS}i535uZQ(BhQcaZxEN0d1K;?*`(#yBTz*+|Q zEtBiSG~C*RC|>`WWXsjfj*O2=^ge0oHkW48Rv#HyT*Burw^+?YRV*hL%ZwLGRuBl&;os z!ZFLcgU{`qQ7%S1wfXqH*2cqlE=B9DpQS{9!rbg8x0O7Fqh%Ox_Ya&C?3kM0=C(?s zK%bd@Bf11yrev$7Pd{hwbYw9;1`qSO{6Nt>96k&sD%PBkC)x@CZArC-ZeA@*(Gr>K zxvJ8xP~Gli7l(XTd;)QqbpN64tfhnffmGK(j7Su~J^k05ByIq}pP<@e_;Lp(d=^hz zOxy5P$b94AQO((^hp6({F=luPU9f+Oe@B#BY)`~?9{P8U?4ZaEC+p=d<@{4pmL)u` zV`@<%C-a}9%JcJ>qfZG`2pMPWRV?1^C1`9MCPVc@fyJ5*&g|2@!jQ?|#Rmby)E7}C zRP)706E!iXZBd`#tOQ>5rgA_%{NBW!EFW);4V

rlh?V%gAaHspaRVXZ+Lk2S<abx`@jDozIN1?&2W`w(w>HM~-MsZA=w}|B863;?QegRgrh-_( z>W?jGMQ4S}4rQoj&BNl$`NAg!Ph32-Z(Z#dQzE(W2iYpMl&`Dl#~x#plCsND{Mu-hNeU$owQ+<7^vwVb^ zDNNKM0vd}Y1OwpyU_Yh!KKl1p3#id|w~xc@b|>+~1DbM`^GAE$Y)IgeVn8ASJ(4RC(vleDUcG z{$=p`e_(``e2lJZ=E*m~D7+d!A;1_F5=(s`SpI8%q8pb9DutGj0qt^xlSz9j;CjxB z7X;RolR_aM@tk)+J^VidiWdFC?m0hVf>q{!I}U$CFynmf@0Wqw6d?b90ZL1L;lv@W zEMab;o5X5{;QD}KE(_3NlX}bV4fEdz3W?VZDWvX55fP}%DHz?WczWZq6oHzeCq!T8 zAY}i557}*AC30_XYx(+j5kqb#4fL2EI_D&O@d5bj{{aU1LGN|f8)RCnLV^j|#_r7q zQ*a1)QjoqcU-sXKsj$bk?-1}K1}AGtu*RtWUxd<$aS&@zN|g~r59QV-a^=1HfIJnr zOAPo8k0wxeZA#q+2-;pTIM>?QZ8q9xHt8Zr5Biu$hA_VgPlu(`q?61Jlk7`y+5ZzL zD|i~|R`cptFXA>KnveY)g4`xVXl>c0zq0+8OWo1n3c&9lP;}rm4H2M15(C^OrvU)n zm=xe{p2W?s&pvR1)B)dlVV53UO??1b!&~;d*Q8$j7Y7qGOvC~A|I)1Q6@?_aOt3j2 zH(?wFE<^W!x1IkfSi3ii|B>7~N~BQXnY`&=Ho1Qj17w8Q`xk$jK($Bk>I8V8OU(?l z%l_qb)IPIdxccdlP~Nl?fC3%b*`c(~;l5gUZ~JGw9^9?!{3m?XG^ ziD2XZYM_*>K&YPtAoBxn*nyVd{MQoFg2Aix?^j<50qrmU8ldjwfw~8NkNt>EK%!K1 z>{K2UfW&G6ex`9Eityq3pH0-JC3dFx zS=;;GuLfIhLKED^)fyyy%q!TZ(KALuEv_SF6>!JL^NoBG(fJFKCHG|Y^TTqVIw$uA zC<(#OLWIh;WD{zSHj33sXR*F!yjNv-sc%;??iSp)G2YnwM)8^8-yaLjdY|=8r*y^a zU=fO|F^u&v7qnpsH5zVQ5k8k**6}1>&WM#JV!5t_spB^#Y343=qA7IL=(ctJ!awm6`H&NuK3^Ndz6hSFcas8w&Z8dO%?B&__H$VQ z_tZ!63^wlWDy9NNY7Z^}CaGr~Vm39o*`_fnkWBvz$pSMEqnz`(X=uE7{zS|%N5u;) z2I>Ia51gEg@-AuK7xAi?7hC4NL`k?~oEel>%+}>lzZQG5Z{DqG zG0!2G7hcQ`J3{1@Z)NSyOY-6M6@ZphFhr5`23+%u*gEcil!SO)0lScAI9nx!KJ$t5 zeyl#KdgQ|6N>?=aC*Z~T%9S&Fk!m4s_|mke8EwpONp^4alGyusD_4xdxNTbnVgP!@ zm^;+TEv1Ep)#NLvLZY&AQx)l7l6)0!Uk4(wM14M6D5%$w@aRad;(6LKqrdZ}kJ=wW z{Av_aUqJ0ncX;BMxG+A&h>-|&>XQh$F}emtUJQ#>UKEI(huT%HOx4)D8Mm{rGl**= zSt4$c0+mLRUJ)Or0kK3FR@C^)45wTO2vN=D>~|PySBo$pTC3(ZY^n-!0{qm*YLcox z(4^Ri!L3xW6-Au}P=C&MPtqidvI3ErP2oO9nmWz;iLkT7eB*N#Hp^Zn zzYkHI&)$bzN8pgQtFhs>gCji55sHZ z*YDi`#%P`I>#D*}nvN}eGB}^5XNX{$uj7xyZI>rV@;~+Y&MXNd;;Y9qtt$3j-smzI z{2f8$!tT_hJCs~<*Lv1at}k*Z&Z{mLuZ4%glf2qE?9 zPVFX1Fom*`1(5**I?Y0`uk*H@I(XkI_{JdLW*UB9n5_o>I;Nx1&IM#XX@0LWy9ZaX zQ?r+1&FE#UhGYeJb&Nd?P@&9-!;jrwk>ob zC`AYu%?F{~*4ADQ-*eAetSZq?2<^c%Cr-sg(>SDsUPdiuo?0ZT$n?Xo?^e~xcyfvM z9?YA~re_YTCvkv=@Q7E4!%Rd!6Q#P8UgBgV1}TPH-n{ih|<<#DT>T1j=PWpq0X z=TFay;g@f}^i$UII%3~BBiFemdh+cG+S|eDbLx*G4ZsSl<&L8Gwi@=a=h*SBKM+j1 z+}ian!CURs_P)v)wHpCqj7SA}$s_lyPV_p(9loO=r)`5aYN>tD)+7%qu*31<#}jTS zt@1rjcdnG~*j-t+4U+&G;xh#qc-2QbxH$(a$Dn1X!;8 zW3=RJ@(Ns%(N^f4oSQOYLDg;108zqeM8VhC<$B34(%S;#^=s+y zZDxs+p!sN<*H-;hP#~4#Dj?ObWs%V7b`*k&nDy{jUrMPra#~Bqt*8L-8KfiEE(0R+ zkCh-|ZQj2x0yw%t1gvNKXeZ*?@^kb(Pq`Ct9i&=8QKdAFqMU1)j61fSr_oU`nkR1( z7tZdLxlA3Np>w_7c<2U^re1(+)wsTPpt?AnG!r}7fT+1`SPM`0vjMQ76N6uwIG0vq zJWk3_&^xuI0iP6RKh2Qn5WK9>($(xOi0<1mAHK{^LM$N#HfyqGKcMAL$ArAc0|oJ2 z%E3l$yPX#X_@d`Mw7>KVh+p1)YlM$4!BW|r{9sHnpopdisg5ihJZQkyq3KAgP=~0o zOe5(XB3%wWk5a_Y z_*=kD4`6h$^%gw3lFX^0mPJtrOD;#e0Flp!`SYcchB1cz5RX*3E_OfFxwLx{cO}k zNf8kiIb62s_vUZ4`Te84T?*&xI|3W(3{CjelkbQqKKz!^y?j9EH`y_12%+bST;0RdIT3n#Q$dbz66MHa+H&HxaqgeZf4J)rF;UhmpI@EV@qx6$Z>0e6Ey}6H@f7m}e;@;A^idUz zpX2N68Q`nvO((iamB_ewGA=5Z-JJvc;(bB6G0sr|9mTZD| zl39F{o_m$h^-Ltn@e&y1%D-n3HFB5yu5BzA@YkC@qSE!F`jkZAZ%nqFO|8!uk}x#N zaR{p0S6x8ou|?ri@QP7SdVPRbu{y4IpYQKPF5S1OEkLyl-egEb`;Ve~lt6@RJJw+WrCK0XReO z&z#!NA)i~{Tm{zIwTW(1G~m-}{~hGVvVeizrYFqy(q(XPPZPN74kCUXY6A4B{|p6W z7x|3SG5N&)ZG`FJ&AJIXp}vO^8WN0enxmt5`_~2EX#Iz2iAz%b$ZxvSLByuuLM&}u zev9RQy@2a~a&!-*C%7P(01J$wSEKMOQ)B>17&AzK{u<$!=)UU9+??)te8C-XI|2nvYUnrh{ z-%~@xbcjqQ;$>BoBzg?qX14GLWTT3;ix6Y@%r^m5xnDS`sj_)VYZWVEAEPr3a5 z0pkiNcfVVy#D4#PP;s3Fl=Zj&O6UJ72@EFnpS=*Wa)r`m{G{Lzq_d$Y)q|cnQok33 z*a}J<2)GPV06q)cz0*tdf4c>CRg7+H6TJ<7?8i*VWSoV>H<*EzKZImsuG842(ZW2g z_)dz55ZrA;@x$h~iF9tYcM!-GOQg^yqG%XPxL(Xc=!5*Vje!4HdPE9feIVR6bWT-Q z8kZ4kcAxfkd+U8rfFP3(K~-BiCEvVEbeoKz5cla8kloS(eC$>*G062S$n|1I;m3bW zuK%?`PX30Di!$T%iHoK*a3}HW7mc_&@)3nIXX^?8L-(O$b{3Yx?|`{>wrB+rs{%0+#(p zyo)U9rT_7l%Wb;|PTqe9rM?0?JNEz1p~fG3!*7w`76erVsXF6=vwtB;$vzS2DkSE- z#RNpI+)I-CLYAsVFupRf)Ia)pVIb24^%7hu?yq{)|65Ie9SK;sKHcEFb4`clzq|<4 zDZ#DJ6c9F&*Z)l8qMv~H3hXnus(WAcONRInbrQTQ;D7gQHE`B1gj+-e!3d^cXd}R2 zAWE=d+a!_}(7``~8v|S;y3xT_G*UNDZ__%bl8}WETuF?BsGKbIswj?%(0!@z5}~vH#@29_SdoH$7YI~N;xy=#X)u1 zj6}hw`wvH}VUH^;8n`rRA0WfVGXXU;9u-L2G%Sy;DyI?m!#{+UN&$~2|$;qns0G5z2B4n>!^%L7v{L5}@ zcRa(}JR6;hTkjLY@SsIh9NnF0w;FSrwamsF6S&X9Lf-aevf<=m)Qe)!907=mf(_kF#Ij>DZk=L9_*3*3*HCHscc$aIN0vzmfWh z#u$7Z6!huj~n~VTi%rYTfIn`F5hg?zRj1UW`(ply6*esr)8qvZ{n0sGU;{Y*KpCzr?yI|s_!{b2gUA?BYYSY$>>l2NZ;b8 zd*SnA5q;u9CnMuF7l#O$!QTa=U*rvSpV+pCn>z7N=Mb$TbCLjlFbhkU2u=RRYCwwH zC2DL|vynr+J4~aw7uejbjhy29U-ie=`bjfFokp=tWlc`Wt;=l#Z8f`rMH>NRjKhn{ zh+-^yCbeg@WWbX4(&AxBM9|Eh-=mIj)=;?m%`LUZm;BOJon%53XLNmBmx&loN0{;! zl(6n&G3Uy;vLex{@*)C`=;ttVFVKRYbCIO2}z!OsC0c z>U|Zx*Jqt1HvY#NQB)*^gyqKyP?QO}EuE5IxGruXiZ=MLp}qSObV^?~W4ewn9M(6i zyoWC$5%s*&!_|t5+-HGrL>{Z_iRSw!&Xvrf;VK4mN57^#`>48pM$wI3B{(*ix%nU3 zpZ4cU=!5t`a5sd$EMzDs z(Cr8XS0Nww(VK={TyHl>{;sT23U7ZQJpJ~rC1(G_0F8~swVN_uMiZsfZrHWoR$M7lfbKabuD z=Jl>C4?uXj-!uPPec+0uneF5-ci+2hqXnKt&(_)I$tlXgMeJg(QC$K*nlvMtXw ziJOuIVrSZ~bF>G;8uTHKn<5MBC!WtvFk7ok7Xa26A_`G1uyaOhvRT3Qnc~F@eN#>?9K$WlgS=sQl zV7aSdC-Pwa=+q7QV3dlBa_#n+L)aamT>XAXXBWv`5PlQIg!(ivmJ}ey(Q}1Z#C}FT zVk@J#(y;%$X*K9qZ&8P}u0I1Qy^F2Smh{x24uqL!hy2GYcbSj*E_1S506WDKJPS*A zTIyBc<3rcUBK^+&^D-v^-xNlC%XHPzgpMHH$+~id+p(AzDU#)YDCgGMjndrJCK2m- z(s|}SrdVfHDfdS8DKG75sddB4ex_DGV`L(30#_8giR!xPs{K1F(Ik+J^_KD5@_DiO zHrA(Ow)?HG&!KYx(1N9vexc9l^^xL|>8wn6Ww5{UeaEHr`Kzb=+Qq~sRDPyo^$DK< z@Wq2k%jxW)=J>mB=U=YFHz5UHc!*u5&8#Q>z#-SQhBZ;SpvGBRpr%=s6t_X8<)9LH z2GEt#0bt$rZ#ltlZP*sU9+FVEKWpo=gH21B&RsU^<`Cjqsef{|aD6F2hATw54|52! z-knBy^vfHSah;vK`j{rPKXk_$D(7V(?fgq8Qiu_JThQXC5S6`kjL?^N!f1N9sc?o> z%wnYPJ-0`}niC_Oi;#%Jd2cpbYe9)(-*IeltUJQu4~yD2&qpt%o=iM;I~VEy{0~6p z5AdrQ#(TqS81c(aJ-rOE%CVib;vz?SSVpaY294^YAGI|R?Ics^y!qH9Z^Mtv(X+HR zj|09NVQUO^z;`<)Hl-5VU;Wj^}WX zx0+pHxo06{ICZILiIvVluxjI7cW~;y>@mdOgqjjhp#twVDW>2kna|0 zdD}nR=RyrTb{$|`BMAdajStLl38apLN4_vM+X|&Y+tWwF$&8RoH@ahR+(FsMGqmZ2 zIr8<}*=(6|FkXFq02IL1EVxAvauyry<9QQkO|gHxbOlY{>28PngH@CcnnK^|Q;-Hk#n~Z9361o2`Q}Frm8wAy zi$TFrKCn!_t8|snCO+qKX25BYhtECoUVM8&fz;ke2tv#*gm4XFm`BmGt8*w+Um}Po zBQN)?Lj!1g(Y}Hujg<4G&>U&NZKBk0%)_cx%o8E2 z>wyP|yF?Ez9R)Bs#6uqUG4=M7Z&UqssY`zF15KRON$$|MZus6W}Xs&ku0#zI*#|K!pp|{kel!^T@pQZ(PJE77^5OO^0@V&0H_b|U|N?XmV)?y zv`rsa_D-VzB71b(yX|}_)|(0V(rv70s@7@gRH@f=J8!L~8r-RH^~eHW_%2q>g? zB2kv#V@{?eWOsQltErorj~LCJBwR0RGedoAbR662XsuVX>bq*?di3JrakS`S-7YJ! z6w?{K4&6P(Lp7ZEOQ{ms2>eZyv(m!WaFxF3=#z`4_3opuh?Sq}SyTd#eSzH4gbY4= zT?Py8>~IqI2f$H`x`Qhwv+vCWe|AlWh{L9@^a2hy7*TfO)~n)~>N-P?s}m|-d@3ef zY&_qLSstv_@8gI#;M!q>aByvp)5yMt|D_?TIqh4m+GwSV`>DPN?K#6*Yj}63q)Djb z4))ShkKy3XnmT@~gO#K&Rwo*>$G7@MPLh#gh4-LlZ*ufMUSDT};h8ku?CJRuC0Rh4 zpp9ok_5p~CoSDM2I#F-oD%;xR^!SNvpiLYSDoxH?$INpaXr`}?-}($=|qQS?To zTMlItFdcdakF;Wzqi?V~Nnt%&)xor?;LeZpE=qhsy;~ezu~kIO=L-CQ@4}y~o=^Go z{T|4Teaab9F`Y@9{QQU7^2C4S#vE|>80h2G9Bf10Ge#PHzR%Fmixq&TbOWl*p>t_EC@V6Jg{$I=M71qONV~43)nH=2a2TSH4K>dVKkZd9eqiA8qqwub zJSE&w#IR6S=f%?*E^n@VrA!gSb>fyuh1 zzEk?130YMaRg8?Phu*>XDBo6Ph5?O3vtM1J#F%U7{&LoMZP}TAzmCTz9eW3jj?35C ziB4YODzkU%wfm=6;082&sW>nw1;G@}F}rU;gQ{O_&*$JkUFzbL@?cYk#)K5VbCBT? ze_tk#aibKc{7EnP9#_%!v&?U6lG;W~z3;NPj>|@yZkczJwurU)VFl(12x>X#8WF-~Z4YeJc@SKdFmjcU9Wt=4RDQsNeRIVB$FOnS{KP z80!9&l3{7_kdOGSYy*!V#i#ZwA%Nvh2NW3jD zw`?#P{yNuJVw*vUsgE(%CiYBN(A6DXR>Yi^2_4;O_$hJ=E zI}=Gv2K)4&a~p4{(f-Tvk9nLb-1qlJ*ou^6Ziz%wL$FW{2gAwNWx7rG?XHo#VIR(R z8wJ-$up*NUM~b`o>{(S}j4|(M_c~g==pOZH%_I?rz z@!;5#rqt0GxQ;F!iJ3X!H?NAr>Ig0TW7KrB0x2Eme}M0@R5rpS+0ItKhMnk_I(k}F zR32~Gc0k8XLmzFsMlto=o6Vf6rak=#v`VXAbzdh1Q}-TqX9pi5Ieq`|V9D&>;pP?>sW!$E#un} zXMMX!jdI=41$3TOpqghsB&Rd`XyU%-?e;$&lldkvmPk4qxg)GO>?^K zR{ujgu@SonrkJpqEw@dtp`QX+YpQxq=O$cF*m(V-p8G2Cc?ej;ymr&j?8i!qQ1Iu^ zrD$v3kvpD}b7<@crS9ambU+J|x*8%kb30OwJKkO=!s2)LK6p8AKX-V)YG?GU`IaJH zeO~xWpHsx(l~7}hSR4mO`@`eiJtD_q_n>^*rsptxIJmd5Flyu&BcF0~3+iFq_j&x; z(=+@9o}JGtHa|`hrc7Ock|0|u+4{_$;#0Jkq-rW(QOuvFDC|7?%felfRm=6>FPNFIYi7G{Df>Ei3SmdnYdSu5j;Zm2lptG^kszqeCuMnQnt!4M`56%`M7lKC`FU z>4(W@cRY-0Dhej`tQqp`v9sNy(-|QtX@lg+_l%#|jEpGoAX1WHNYTCyXsGcyHoswi z^Q&}iwN+-!WUE4wGA$9WXI6S1t!4Q6PZgRh6rqH5dJ}n010;IbOuHB_G3I@uzmJX< zpjN>i7Wr62RX4BCcYg`BAno`$Y2$-!&Y398dmD;pn>zn8&RNy?^LGI1hRTSMXMw}$ zm>oi6V?E&Qw^&N~!&RLsH|LAH#0gd0(CM?M=*>`lszr)V1G|XO8f(mAP5qV_?>vQ` zCatO^-q}N+qZ!R~=DTdiN_X))Mcbu^>C??Mw({-J{E0k$4vv5WxHVw->`5NiK@&cw zY3jJyE_fztEeH6tR@1*$8_)05xY!(aGZdti`(D$7#7fJ$Vtk}#NkQxNd;7(9Lg&jU z_mVH7+c>5~novXvJBiGhTj6U?7B>!a_IYH@rp^;mqB?5qj+r*# z^Vt>Gf(EM#surdYTkplq42K1l>4VQAil#6JDXwhEkCI#|$4#4cV+G3bT=cNqDK<#z zPyY|m;_LV9WTu7QuY~u=(2FzfxI7~zf;5w~#0l3(paO5hPTsJoN5_cO399B+RlHg0 ziOW67j9a^mXy~yjQib%%lvOt#$&bwJ7uxIo!<@`~Vzt6`GUbuR-h>!fF zc~f%RiE0G7E34|6>EwRF%y^=caG!=B$1(y(tqEOGaEhHgrSQ;Oq9IMwTO~TWSJdlQ zNQ# zdZ~fU)6BGS-Q747yGK?H<7>$!p?v42%7)ku{^7Z)5sC2bypJ4P`>kE|Ww;Qn_Vca! zAN~y~!qbZQFlartr&R36ry5=Lk@v`-7DQ2$TR(B;wMHc)BUQ-tsSwIZ<9iGK>fJf> zNf@g!Q%9>41bk-x6iNg|OV?-j!KvVL1P|_Ws7V6>lZo+Uk8phqGi48^?n;=zpBE9HVxEwO4KZt~K~K zXq1x6Dn*G`E%hPuyChWe@~Y_rj~Vu1((+Wf^~ZHnXC-jGL$kFyX9t9feJt)_*Nt^d zaj3#_@fNSq-s-&Ob2sPCgFd2$@*-N>i@sxwNb{=Z#YzkYyyz&;C((^4l`3yU?AI#(;(!Fn=ZqlvTo}`=s za~!=po$oMzK~LAP7ApslD^Y=DcM-TTaq8kcv^ zJKvsHuis|_{k>j9c5*N1nVTBvmLI@h`X#|qYpv-hi4O6bsxG0fskauzY1nm@ zefBv_J~eLZ%4CNfsyM(W`7AlMo-(f=0@?5U@|{h^cS~Q>^~as`OP$lnQNGR zYa^f~5G=_x#f8gu6wTC|%;#}B6>{)gFqm~?l-TfQYF3Pc!+eJK?zHi?qNqHoc8ChjZ@e6M|FfW%V? zxs7hMmA>*WS+@3!YpfKn!!;;hx82``s2{Z8O9s!sG$iLiCithRVeL2X$ezzEy=RHB zR90Gw%RQf&*IL1d)Q9z03xDsv9z+rX@L$5P*#_thDkWTuUAV4mB6Ci=NP^p%pSCBc zQN!>0qM8?ie@>UYTUqe19oC$`MHj#y@C`AfAQ4290kp9g>VVChrv;NGO*#T1jRqMU zjD3tEHl4a>dq|l$WZWy4HHds%)0vK7`BqG^mFQT)lh~l({o!rZ3$1srLmKdkq26;v zQ$ws?K&ihNMGt~o8A6kz2R&?Dv)puE=9p$gwre0#hNhR_Ion(Ce#t0WX zuhF<%cw&AaZxE+IUpLA9W6TETiA@k>Ep}h@h$+h?3LxHBhH>vj_u{7hS zT;+8)w00rfAaispZy-X+5_}ms;>CnSxU{;MT z|D5XjPK;n$n)Rvk(A1Sscqf(Zv>p6K2U8aP=*v1}u0X)FG?D2+Vu)8KYIu$c%h5M~ z$P8uiFq$=T*R3Jzx(*3`S)wzTDcrc-S+zmqq$5}_K;_yFBi$`2DN`yh-iN?{A+#;< zIYujvzbT#cC=V1nITizRZy{#f-+z$f!z;9_;%`p&Tt7zdIeh0PZuwePBvc81slN0% zZ0;21iYY*8TCA%3(=C-g6%wkEkT!s!-Ia~cuCVc5H78v&KMoxx1Eh7YTpb_&*4Vi$ z{kA3R&@v(Gux#+Pv>?Z0g+vGqtE0 z_i0u+{JM(5nDI#9Btr$!+>Y7OXR{Y5>$1(_*;5z6{UaFEZQ7&$Yt0jiS=ruIdN2tv zn;9JDN;~jCrwrAW_7mMsD^O!IvrNO^wj55UZ3~VPR;LTE|Nixqepsc#$fR`_8&dTs z)OcTP$LG-L(UfalgH3&F4bv3AUP!VKUUi`2?&7r%#-}QWzN<7i$lwqwY;>?6lNY;t zQEBV`11fDV9QJ)DDDy=k(~X{~U8VfxT4f?N(zE1KYH7+zo5m9^MZ1a+Qy~hpM@^ z3aYSHcbVNpnk@B)yJY*vPjs;9a>?gL3*X)F!*|2r-QLuep-E7Ks<6GXe?pmSIs)4i z!_5^cM4D7Poz7AEQ;0-44G(2y)=wEP9(hhQs!*>U$Tr`AY95!<+Wzvula3}IX`oxa z>Hk``m;B&Tw59)gGDh*RVz*qXS?8D(|J%P2pJ%-)sdLlXymR4v%l1l6VZm%2fZhx9?*8@M*? zPrtv24_tD>g_s!#!dH~s<~%T^a>br8_En3Dt<8=RLN{#eVxv*$#8LVn7E-_8U*lH9 z$JfWh>&W_##c=(2W%3J@TGf+TN$0mWnk|^dRYu%x7rXh!$7q|NtZ@xjSc;cp5+6VK z{@aZwTQfsHVf<3>5VOz;TqBfpj>8*cP<-octAFl~dj~;A-x5QGA5D1`v8Q09gGCyo zXq~#K4mKt}X84aGa&G_u`UNH5)?5?ktqng$jD_3oH-~Rbh(HR@NRf+lU%YhWRNBhg zf*^;ia zdr+TT;EotsW>p>g6m>CF`g}BgDz8U#K6j_zWBj-k_0=}<0Nig}_}2dL#sFP)slVQi z$Jh}6n z58;5bsoQdw7t@X3eFhs08@F997pZ5&SIi=xZAk8lECx?ONI%>=zgas3#=9m>Z`z`W z<%v-GoWsB>*FTKP^ZSo@W}KTMH{>xd8wOr=D!8*!)z}Wxxj?*e0RvNaGdFhk;JqS> z`E-*f4>!6?#!l9nWk<=AH+G-1@_znw{9@N74tb&-!!ktOzs9X}*<>YS(#zq>hC%H|_&EsR(Fz5aH$gDt@#$vD}U9E8%!rl)Zseg)>)yY2} zL5+^(AdN?N#%mezpTyj4HSB6RE~ffyjK<$7R@ka+!W|g3-<=Bc>|#G}r}gKFA^VLw z>tWVR0e$7pcZTUAsD7VZpPP#2OblDvx+&yg#G#cmmDS_#q_(p-{_C~GsBi15)1P~X z;O3K82s`Ky7m=Uc^ZQqU%cHiB_077=wv@Y|M4R5Ifrti3UKXj7ma8W+!6k4e)Qb1} zpmTLoxmtC9&9kb}C+!*2U=x!qfBStIJ)cjgtwBjFL!yR2alr9zn!_vQi-4h_dq8ro zlKM7KT0Q1QDeE@Qf2v@Cs~2X(W@n@7UywIAX}G*cZjuLTDbpIdwIm<57XCDvsC-)N zY2Ls^Ym`>TfqYHx(WJOP#_=mmrPfaOSI&{!30u=EwtB&}$Jbu8puYU!B7P@Lq$D5R z3-0%k7%!+p-Dy82ot^&TP03^4_Gs<&(>ZHiVwty*HlLcq$N#nLFXj6@w!YO5G^y-e z&ET{1wbi81$!9)w8-^Y)x%21Y)YFoujkhQN5MBm{u!=z zMW&qh-?h^wW&fT^?R+8C`*x4l#Vf2`Zst4f4TMe|jMP`p-nA%9*D@!5%4-Qflezah zB7axs{J%J9i;;SK_~iQgX8Sev^~drTv%YedyK?AX`_>OLcCV{`KV{kXER~rPV{KNs z?VYE4_;WSilGBUbj-{yUNr_*Y^wINsveC+CFDhre`?FI+FNHd85_6`MExn~(*JxsFg_77i?8BiR{Pxf7;4n^<4D-?}}Y4@0&M$=A59?B(IA%(r(^5W^nuVlBs{PH!QCa zT=uuMbjc3mA952c=RQ~4!?!lxuplPTYWgS7#@_^PN#0 zSlC#9W$K4)=@{pIksGuBoSnhVbhR@_-7WrJ{{Pcyz4}`7j~^`6m0@CVI&X9OhwSo_ z_DTDA%fD}V?5idsup0xJuk0m`PR~zkn zGW*%us_KrVo6Gk{iEo&EQcLvWseVbRu6HL^Rqop~t);VNpVSj|)@KiO&PsiLv(o&b z!lEs)u?4nOw^tpQ*?0EvH4X+16DEdROP^kAT03=V^xRLo-?#~GJ$=5?fBx^|4w3sN ztu+Pq3;XB&`g!X3C*Oa<7k6D-w)yG1iu$!|e|_YSOP*++d-i(6tguZ{svTSH@80+( z(|he#&$Z<<`Wl_4a5FM!tSHXR3D5Qq^ZS?e^~?XI8{^x`*v@{Mx>a^!KSO|@D5J)b zd3Vo6Z~j@Nz3R{Mnpd74EX)h8{(i1BMV1k`@%Kz-&4-@Z6GR^}{@r$sRe@)Upfdw# qA9A}nGx9dl(PN6J9vT<^v)zw7w0}bUqCLP6XYh3Ob6Mw<&;$VMlc{L{ literal 0 HcmV?d00001 diff --git a/gui/utils/utils.js b/gui/utils/utils.js index 72141feb6..f0e4d4cc6 100644 --- a/gui/utils/utils.js +++ b/gui/utils/utils.js @@ -25,7 +25,8 @@ const toolkitData = { 'Instagram Toolkit': '/images/instagram.png', 'Knowledge Search Toolkit': '/images/knowledeg_logo.png', 'Notion Toolkit': '/images/notion_logo.png', - 'ApolloToolkit': '/images/apollo_logo.png' + 'ApolloToolkit': '/images/apollo_logo.png', + 'Google Analytics Toolkit': '/images/google_analytics_logo.png' }; export const getUserTimezone = () => { From 47e676dfbf5f19e0502115a8ebd4e6dce2f057e6 Mon Sep 17 00:00:00 2001 From: Kalki Date: Fri, 25 Aug 2023 13:11:37 +0530 Subject: [PATCH 02/12] Models Frontend Changes --- gui/pages/Content/Agents/AgentCreate.js | 7 ++++++- gui/pages/Content/Models/ModelForm.js | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gui/pages/Content/Agents/AgentCreate.js b/gui/pages/Content/Agents/AgentCreate.js index 04989cb6f..95f731786 100644 --- a/gui/pages/Content/Agents/AgentCreate.js +++ b/gui/pages/Content/Agents/AgentCreate.js @@ -871,6 +871,11 @@ export default function AgentCreate({ return false; } + const openModelMarket = () => { + openNewTab(-4, "Marketplace", "Marketplace", false); + localStorage.setItem('marketplace_tab', 'market_models'); + } + return (<>

@@ -954,7 +959,7 @@ export default function AgentCreate({ ))}
-
openNewTab(-4, "Marketplace", "Marketplace", false)} className="custom_select_option horizontal_container mxw_100 padding_12_14 gap_6 bt_white"> +
openModelMarket()} className="custom_select_option horizontal_container mxw_100 padding_12_14 gap_6 bt_white"> marketplace_logo Browse models from marketplace
diff --git a/gui/pages/Content/Models/ModelForm.js b/gui/pages/Content/Models/ModelForm.js index 4ff9725e3..b157296d3 100644 --- a/gui/pages/Content/Models/ModelForm.js +++ b/gui/pages/Content/Models/ModelForm.js @@ -161,7 +161,7 @@ export default function ModelForm({internalId, getModels, sendModelData}){
Token Limit setModelTokenLimit(+event.target.value)}/> + onChange={(event) => setModelTokenLimit(parseInt(event.target.value, 10))}/>
From 8267b8acbc13aee7956b2b7a10a880a882ae459c Mon Sep 17 00:00:00 2001 From: Kalki Date: Fri, 25 Aug 2023 13:19:04 +0530 Subject: [PATCH 03/12] Models Frontend Changes --- gui/pages/Content/Models/AddModelMarketPlace.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gui/pages/Content/Models/AddModelMarketPlace.js b/gui/pages/Content/Models/AddModelMarketPlace.js index 95bfea16c..6365c06ba 100644 --- a/gui/pages/Content/Models/AddModelMarketPlace.js +++ b/gui/pages/Content/Models/AddModelMarketPlace.js @@ -12,6 +12,14 @@ export default function AddModelMarketPlace(template){ const [templateData, setTemplateData] = useState(template.template); const [isLoading, setIsLoading] = useState(false); const [providerId, setProviderId] = useState(1); + const [disableInstall, setDisableInstall] = useState(false); + + useEffect(() => { + if(modelVersion === '' && modelEndpoint === '') + setDisableInstall(true) + else + setDisableInstall(false) + },[modelVersion, modelEndpoint]) useEffect(()=>{ console.log(templateData) From 6b90e33882c8c0c678accc53e3a3ec0b51ad033e Mon Sep 17 00:00:00 2001 From: Kalki Date: Fri, 25 Aug 2023 18:55:09 +0530 Subject: [PATCH 04/12] Backend Compatibility for New/Existing users on local --- gui/pages/Content/Agents/AgentCreate.js | 24 +++++++++++++---- gui/pages/api/DashboardService.js | 5 ++++ superagi/controllers/models_controller.py | 9 +++++++ superagi/models/models.py | 27 +++++++++++++++++++ tests/unit_tests/models/test_models_config.py | 12 +++++++++ 5 files changed, 72 insertions(+), 5 deletions(-) diff --git a/gui/pages/Content/Agents/AgentCreate.js b/gui/pages/Content/Agents/AgentCreate.js index 95f731786..37e1d416d 100644 --- a/gui/pages/Content/Agents/AgentCreate.js +++ b/gui/pages/Content/Agents/AgentCreate.js @@ -11,7 +11,7 @@ import { updateExecution, uploadFile, getAgentDetails, addAgentRun, fetchModels, - getAgentWorkflows + getAgentWorkflows, validateOrAddModels } from "@/pages/api/DashboardService"; import { formatBytes, @@ -56,7 +56,7 @@ export default function AgentCreate({ const [searchValue, setSearchValue] = useState(''); const [showButton, setShowButton] = useState(false); const [showPlaceholder, setShowPlaceholder] = useState(true); - const [modelsArray, setModelsArray] = useState([]); + const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k']); const constraintsArray = [ "If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.", @@ -69,7 +69,7 @@ export default function AgentCreate({ const [goals, setGoals] = useState(['Describe the agent goals here']); const [instructions, setInstructions] = useState(['']); - const models = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k', 'google-palm-bison-001', 'replicate-llama13b-v2-chat'] + const models = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k'] const [model, setModel] = useState(models[1]); const modelRef = useRef(null); const [modelDropdown, setModelDropdown] = useState(false); @@ -155,7 +155,7 @@ export default function AgentCreate({ .then((response) => { const models = response.data.map(model => model.name) || []; const selected_model = localStorage.getItem("agent_model_" + String(internalId)) || ''; - setModelsArray(models); + setModelsArray(prevModels => Array.from(new Set([...prevModels, ...models]))); if (models.length > 0 && !selected_model) { setLocalStorageValue("agent_model_" + String(internalId), models[0], setModel); } else { @@ -494,7 +494,21 @@ export default function AgentCreate({ return true; } - const handleAddAgent = () => { + const validateModel = async () => { + const response = await validateOrAddModels(model) + if (response.data.error) { + toast.error(response.data.error, {autoClose: 1800}); + return false; + } + return true; + } + + const handleAddAgent = async () => { + if(env === 'DEV') { + const bool = await validateModel() + if(!bool) return; + } + if (!validateAgentData(true)) { return; } diff --git a/gui/pages/api/DashboardService.js b/gui/pages/api/DashboardService.js index 43806c012..c1cd116bf 100644 --- a/gui/pages/api/DashboardService.js +++ b/gui/pages/api/DashboardService.js @@ -363,3 +363,8 @@ export const fetchMarketPlaceModel = () => { return api.get(`/models_controller/get/list`) } +export const validateOrAddModels = (model) => { + return api.get(`/models_controller/validate_or_add_gpt_models`, { + params: { model } + }); +} diff --git a/superagi/controllers/models_controller.py b/superagi/controllers/models_controller.py index f4f018e9a..c6afc5967 100644 --- a/superagi/controllers/models_controller.py +++ b/superagi/controllers/models_controller.py @@ -100,6 +100,15 @@ async def fetch_data(request: ModelName, organisation=Depends(get_user_organisat raise HTTPException(status_code=500, detail="Internal Server Error") +@router.get("/validate_or_add_gpt_models", status_code=200) +async def validate_or_add_gpt_models(model: str = None, organisation=Depends(get_user_organisation)): + try: + return Models.validate_model_in_db(db.session, organisation.id, model) + except Exception as e: + logging.error(f"Error Validating or Adding GPT Models: {str(e)}") + raise HTTPException(status_code=500, detail="Internal Server Error") + + @router.get("/get/list", status_code=200) def get_knowledge_list(page: int = 0, organisation=Depends(get_user_organisation)): """ diff --git a/superagi/models/models.py b/superagi/models/models.py index d024c842f..d645a732f 100644 --- a/superagi/models/models.py +++ b/superagi/models/models.py @@ -201,3 +201,30 @@ def fetch_model_details(cls, session, organisation_id, model_id: int) -> Dict[st except Exception as e: logging.error(f"Unexpected Error Occured: {e}") return {"error": "Unexpected Error Occured"} + + @classmethod + def validate_model_in_db(cls, session, organisation_id, model): + try: + from superagi.models.models_config import ModelsConfig + models = {"gpt-3.5-turbo-0301": 4032, "gpt-4-0314": 8092, "gpt-3.5-turbo": 4032, + "gpt-4": 8092, "gpt-3.5-turbo-16k": 16184, "gpt-4-32k": 32768} + + model_config = session.query(Models).filter(Models.model_name == model, + Models.org_id == organisation_id).first() + if model_config is None: + model_provider = session.query(ModelsConfig).filter(ModelsConfig.provider == "OpenAI", + ModelsConfig.org_id == organisation_id).first() + + if model_provider is None: + return {"error": "Model not found and the API Key is missing"} + else: + result = cls.store_model_details(session, organisation_id, model, model,'', + model_provider.id, models[model], 'Custom', '') + if result is not None: + return {"success": "Model was not Installed, so I have dont it for you"} + + else: + return {"success": "Model is found"} + + except Exception as e: + logging.error(f"Unexpected Error occurred while Validating GPT Models: {e}") diff --git a/tests/unit_tests/models/test_models_config.py b/tests/unit_tests/models/test_models_config.py index 56bfd89c0..5c1731d3a 100644 --- a/tests/unit_tests/models/test_models_config.py +++ b/tests/unit_tests/models/test_models_config.py @@ -111,4 +111,16 @@ def test_fetch_model_by_id(mock_session): # Call the method model = ModelsConfig.fetch_model_by_id(mock_session, organisation_id, model_provider_id) + assert model == {"provider": "some_provider"} + +def test_fetch_model_by_id_marketplace(mock_session): + # Arrange + model_provider_id = 1 + # Mock model + mock_model = MagicMock() + mock_model.provider = 'some_provider' + mock_session.query.return_value.filter.return_value.first.return_value = mock_model + + # Call the method + model = ModelsConfig.fetch_model_by_id_marketplace(mock_session, model_provider_id) assert model == {"provider": "some_provider"} \ No newline at end of file From 815d5183debf96f015ee9bb5420f1518244ca78b Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 14:10:19 +0530 Subject: [PATCH 05/12] DEV api key requirements --- superagi/models/models.py | 23 +++++++++++++++++++++-- superagi/models/models_config.py | 11 ++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/superagi/models/models.py b/superagi/models/models.py index d645a732f..116d46d5b 100644 --- a/superagi/models/models.py +++ b/superagi/models/models.py @@ -2,6 +2,7 @@ from sqlalchemy.sql import func from typing import List, Dict, Union from superagi.models.base_model import DBBaseModel +from superagi.helper.encyption_helper import encrypt_data, decrypt_data import requests, logging # marketplace_url = "https://app.superagi.com/api" @@ -206,6 +207,8 @@ def fetch_model_details(cls, session, organisation_id, model_id: int) -> Dict[st def validate_model_in_db(cls, session, organisation_id, model): try: from superagi.models.models_config import ModelsConfig + from superagi.models.configuration import Configuration + models = {"gpt-3.5-turbo-0301": 4032, "gpt-4-0314": 8092, "gpt-3.5-turbo": 4032, "gpt-4": 8092, "gpt-3.5-turbo-16k": 16184, "gpt-4-32k": 32768} @@ -216,9 +219,25 @@ def validate_model_in_db(cls, session, organisation_id, model): ModelsConfig.org_id == organisation_id).first() if model_provider is None: - return {"error": "Model not found and the API Key is missing"} + configurations = session.query(Configuration).filter(Configuration.key == 'model_api_key', + Configuration.organisation_id == organisation_id).first() + model_api_key = decrypt_data(configurations.value) + + if configurations is None: + return {"error": "Model not found and the API Key is missing"} + + model_details = ModelsConfig.store_api_key(session, organisation_id, "OpenAI", model_api_key) + + # Get 'model_provider_id' + model_provider_id = model_details.get('model_provider_id') + + result = cls.store_model_details(session, organisation_id, model, model, '', + model_provider_id, models[model], 'Custom', '') + if result is not None: + return {"success": "Model was not Installed, so I have dont it for you"} + else: - result = cls.store_model_details(session, organisation_id, model, model,'', + result = cls.store_model_details(session, organisation_id, model, model, '', model_provider.id, models[model], 'Custom', '') if result is not None: return {"success": "Model was not Installed, so I have dont it for you"} diff --git a/superagi/models/models_config.py b/superagi/models/models_config.py index a8d2a2ba6..4d6bf936f 100644 --- a/superagi/models/models_config.py +++ b/superagi/models/models_config.py @@ -76,14 +76,17 @@ def store_api_key(cls, session, organisation_id, model_provider, model_api_key): ModelsConfig.provider == model_provider)).first() if existing_entry: existing_entry.api_key = encrypt_data(model_api_key) + session.commit() + result = {'message': 'The API key was successfully updated'} else: new_entry = ModelsConfig(org_id=organisation_id, provider=model_provider, api_key=encrypt_data(model_api_key)) session.add(new_entry) + session.commit() + session.flush() + result = {'message': 'The API key was successfully stored', 'model_provider_id': new_entry.id} - session.commit() - - return {'message': 'The API key was successfully stored'} + return result @classmethod def fetch_api_keys(cls, session, organisation_id): @@ -107,6 +110,8 @@ def fetch_api_key(cls, session, organisation_id, model_provider): if api_key_data is None: return [] else: + print("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") + print(decrypt_data(api_key_data.api_key)) api_key = [{'id': api_key_data.id, 'provider': api_key_data.provider, 'api_key': decrypt_data(api_key_data.api_key)}] return api_key From 4067eeb188c6a39850a71fb3f4e1b06ee946e420 Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 16:23:07 +0530 Subject: [PATCH 06/12] removing print statements --- gui/pages/Content/Agents/AgentCreate.js | 5 +++-- superagi/agent/agent_iteration_step_handler.py | 1 - superagi/agent/agent_tool_step_handler.py | 1 - superagi/jobs/agent_executor.py | 6 ------ superagi/models/models_config.py | 2 -- 5 files changed, 3 insertions(+), 12 deletions(-) diff --git a/gui/pages/Content/Agents/AgentCreate.js b/gui/pages/Content/Agents/AgentCreate.js index 37e1d416d..09008fccf 100644 --- a/gui/pages/Content/Agents/AgentCreate.js +++ b/gui/pages/Content/Agents/AgentCreate.js @@ -56,7 +56,8 @@ export default function AgentCreate({ const [searchValue, setSearchValue] = useState(''); const [showButton, setShowButton] = useState(false); const [showPlaceholder, setShowPlaceholder] = useState(true); - const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k']); + const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k', 'falcon']); + const gptModels = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k']; const constraintsArray = [ "If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.", @@ -504,7 +505,7 @@ export default function AgentCreate({ } const handleAddAgent = async () => { - if(env === 'DEV') { + if(env === 'DEV' && gptModels.includes(model)) { const bool = await validateModel() if(!bool) return; } diff --git a/superagi/agent/agent_iteration_step_handler.py b/superagi/agent/agent_iteration_step_handler.py index 94e50c3e9..543a285e6 100644 --- a/superagi/agent/agent_iteration_step_handler.py +++ b/superagi/agent/agent_iteration_step_handler.py @@ -34,7 +34,6 @@ class AgentIterationStepHandler: """ Handles iteration workflow steps in the agent workflow.""" def __init__(self, session, llm, agent_id: int, agent_execution_id: int, memory=None): - print(session, llm, agent_execution_id, agent_id, memory) self.session = session self.llm = llm self.agent_execution_id = agent_execution_id diff --git a/superagi/agent/agent_tool_step_handler.py b/superagi/agent/agent_tool_step_handler.py index 52951a00d..7aeb0d59b 100644 --- a/superagi/agent/agent_tool_step_handler.py +++ b/superagi/agent/agent_tool_step_handler.py @@ -99,7 +99,6 @@ def _process_input_instruction(self, agent_config, agent_execution_config, step_ prompt = self._build_tool_input_prompt(step_tool, tool_obj, agent_execution_config) logger.info("Prompt: ", prompt) agent_feeds = AgentExecutionFeed.fetch_agent_execution_feeds(self.session, self.agent_execution_id) - print(".........//////////////..........1") messages = AgentLlmMessageBuilder(self.session, self.llm, self.llm.get_model(), self.agent_id, self.agent_execution_id) \ .build_agent_messages(prompt, agent_feeds, history_enabled=step_tool.history_enabled, completion_prompt=step_tool.completion_prompt) diff --git a/superagi/jobs/agent_executor.py b/superagi/jobs/agent_executor.py index c69f5bb04..cd3f8d99b 100644 --- a/superagi/jobs/agent_executor.py +++ b/superagi/jobs/agent_executor.py @@ -56,7 +56,6 @@ def execute_next_step(self, agent_execution_id): return model_config = AgentConfiguration.get_model_api_key(session, agent_execution.agent_id, agent_config["model"]) - print(model_config) model_api_key = model_config['api_key'] model_llm_source = model_config['provider'] try: @@ -72,8 +71,6 @@ def execute_next_step(self, agent_execution_id): agent_workflow_step = session.query(AgentWorkflowStep).filter( AgentWorkflowStep.id == agent_execution.current_agent_step_id).first() try: - print(agent_config["model"]) - print(model_api_key) if agent_workflow_step.action_type == "TOOL": tool_step_handler = AgentToolStepHandler(session, llm=get_model(model=agent_config["model"], api_key=model_api_key, organisation_id=organisation.id) @@ -107,9 +104,6 @@ def execute_next_step(self, agent_execution_id): @classmethod def get_embedding(cls, model_source, model_api_key): - print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&") - print(model_source) - print(model_api_key) if "OpenAI" in model_source: return OpenAiEmbedding(api_key=model_api_key) if "Google" in model_source: diff --git a/superagi/models/models_config.py b/superagi/models/models_config.py index 4d6bf936f..fc4bad9e3 100644 --- a/superagi/models/models_config.py +++ b/superagi/models/models_config.py @@ -110,8 +110,6 @@ def fetch_api_key(cls, session, organisation_id, model_provider): if api_key_data is None: return [] else: - print("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") - print(decrypt_data(api_key_data.api_key)) api_key = [{'id': api_key_data.id, 'provider': api_key_data.provider, 'api_key': decrypt_data(api_key_data.api_key)}] return api_key From dc294a97a2c38809f87a4c30d3c0dd740ace2c8e Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 16:27:45 +0530 Subject: [PATCH 07/12] removing print statements --- superagi/models/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superagi/models/models.py b/superagi/models/models.py index 116d46d5b..6136f6906 100644 --- a/superagi/models/models.py +++ b/superagi/models/models.py @@ -240,7 +240,7 @@ def validate_model_in_db(cls, session, organisation_id, model): result = cls.store_model_details(session, organisation_id, model, model, '', model_provider.id, models[model], 'Custom', '') if result is not None: - return {"success": "Model was not Installed, so I have dont it for you"} + return {"success": "The Model has been Successfully installed as it was not previously set up"} else: return {"success": "Model is found"} From 6d105a47fbe1f8a01b14e3ea7e27da81c485ca9b Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 16:46:57 +0530 Subject: [PATCH 08/12] removing print statements --- superagi/models/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superagi/models/models.py b/superagi/models/models.py index 6136f6906..59a9b5fd6 100644 --- a/superagi/models/models.py +++ b/superagi/models/models.py @@ -234,7 +234,7 @@ def validate_model_in_db(cls, session, organisation_id, model): result = cls.store_model_details(session, organisation_id, model, model, '', model_provider_id, models[model], 'Custom', '') if result is not None: - return {"success": "Model was not Installed, so I have dont it for you"} + return {"success": "The Model has been Successfully installed as it was not previously set up"} else: result = cls.store_model_details(session, organisation_id, model, model, '', From a68a7f5eec10b303d4e3ff974f920d7b76c9093c Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 16:51:04 +0530 Subject: [PATCH 09/12] removing print statements --- gui/pages/Content/Agents/AgentCreate.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gui/pages/Content/Agents/AgentCreate.js b/gui/pages/Content/Agents/AgentCreate.js index 09008fccf..3a37607c9 100644 --- a/gui/pages/Content/Agents/AgentCreate.js +++ b/gui/pages/Content/Agents/AgentCreate.js @@ -56,8 +56,7 @@ export default function AgentCreate({ const [searchValue, setSearchValue] = useState(''); const [showButton, setShowButton] = useState(false); const [showPlaceholder, setShowPlaceholder] = useState(true); - const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k', 'falcon']); - const gptModels = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k']; + const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k']); const constraintsArray = [ "If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.", @@ -505,7 +504,7 @@ export default function AgentCreate({ } const handleAddAgent = async () => { - if(env === 'DEV' && gptModels.includes(model)) { + if(env === 'DEV' && models.includes(model)) { const bool = await validateModel() if(!bool) return; } From a01cc8600dd49824cf87c2e120e33e53fb56cf3f Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 18:41:40 +0530 Subject: [PATCH 10/12] backend compatibility --- gui/pages/Content/Agents/AgentCreate.js | 14 +-- superagi/models/models.py | 117 +++++++++++++++--------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/gui/pages/Content/Agents/AgentCreate.js b/gui/pages/Content/Agents/AgentCreate.js index 3a37607c9..17729cddf 100644 --- a/gui/pages/Content/Agents/AgentCreate.js +++ b/gui/pages/Content/Agents/AgentCreate.js @@ -56,7 +56,7 @@ export default function AgentCreate({ const [searchValue, setSearchValue] = useState(''); const [showButton, setShowButton] = useState(false); const [showPlaceholder, setShowPlaceholder] = useState(true); - const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k']); + const [modelsArray, setModelsArray] = useState(['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k']); const constraintsArray = [ "If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.", @@ -69,7 +69,7 @@ export default function AgentCreate({ const [goals, setGoals] = useState(['Describe the agent goals here']); const [instructions, setInstructions] = useState(['']); - const models = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-32k'] + const models = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k'] const [model, setModel] = useState(models[1]); const modelRef = useRef(null); const [modelDropdown, setModelDropdown] = useState(false); @@ -155,7 +155,7 @@ export default function AgentCreate({ .then((response) => { const models = response.data.map(model => model.name) || []; const selected_model = localStorage.getItem("agent_model_" + String(internalId)) || ''; - setModelsArray(prevModels => Array.from(new Set([...prevModels, ...models]))); + setModelsArray(models); if (models.length > 0 && !selected_model) { setLocalStorageValue("agent_model_" + String(internalId), models[0], setModel); } else { @@ -504,10 +504,10 @@ export default function AgentCreate({ } const handleAddAgent = async () => { - if(env === 'DEV' && models.includes(model)) { - const bool = await validateModel() - if(!bool) return; - } + // if(env === 'DEV' && models.includes(model)) { + // const bool = await validateModel() + // if(!bool) return; + // } if (!validateAgentData(true)) { return; diff --git a/superagi/models/models.py b/superagi/models/models.py index 59a9b5fd6..8e8c2a680 100644 --- a/superagi/models/models.py +++ b/superagi/models/models.py @@ -2,7 +2,8 @@ from sqlalchemy.sql import func from typing import List, Dict, Union from superagi.models.base_model import DBBaseModel -from superagi.helper.encyption_helper import encrypt_data, decrypt_data +from superagi.llms.openai import OpenAi +from superagi.helper.encyption_helper import decrypt_data import requests, logging # marketplace_url = "https://app.superagi.com/api" @@ -154,6 +155,31 @@ def store_model_details(cls, session, organisation_id, model_name, description, def fetch_models(cls, session, organisation_id) -> Union[Dict[str, str], List[Dict[str, Union[str, int]]]]: try: from superagi.models.models_config import ModelsConfig + from superagi.models.configuration import Configuration + + model_provider = session.query(ModelsConfig).filter(ModelsConfig.provider == "OpenAI", + ModelsConfig.org_id == organisation_id).first() + if model_provider is None: + configurations = session.query(Configuration).filter(Configuration.key == 'model_api_key', + Configuration.organisation_id == organisation_id).first() + + if configurations is None: + return {"error": "API Key is Missing"} + else: + default_models = {"gpt-3.5-turbo": 4032, "gpt-4": 8092, "gpt-3.5-turbo-16k": 16184} + model_api_key = decrypt_data(configurations.value) + + model_details = ModelsConfig.store_api_key(session, organisation_id, "OpenAI", model_api_key) + model_provider_id = model_details.get('model_provider_id') + models = OpenAi(api_key=model_api_key).get_models() + + installed_models = [model[0] for model in session.query(Models.model_name).filter(Models.org_id == organisation_id).all()] + + for model in models: + if model not in installed_models and model in default_models: + result = cls.store_model_details(session, organisation_id, model, model, '', + model_provider_id, default_models[model], 'Custom', '') + models = session.query(Models.id, Models.model_name, Models.description, ModelsConfig.provider).join( ModelsConfig, Models.model_provider_id == ModelsConfig.id).filter( Models.org_id == organisation_id).all() @@ -203,47 +229,48 @@ def fetch_model_details(cls, session, organisation_id, model_id: int) -> Dict[st logging.error(f"Unexpected Error Occured: {e}") return {"error": "Unexpected Error Occured"} - @classmethod - def validate_model_in_db(cls, session, organisation_id, model): - try: - from superagi.models.models_config import ModelsConfig - from superagi.models.configuration import Configuration - - models = {"gpt-3.5-turbo-0301": 4032, "gpt-4-0314": 8092, "gpt-3.5-turbo": 4032, - "gpt-4": 8092, "gpt-3.5-turbo-16k": 16184, "gpt-4-32k": 32768} - - model_config = session.query(Models).filter(Models.model_name == model, - Models.org_id == organisation_id).first() - if model_config is None: - model_provider = session.query(ModelsConfig).filter(ModelsConfig.provider == "OpenAI", - ModelsConfig.org_id == organisation_id).first() - - if model_provider is None: - configurations = session.query(Configuration).filter(Configuration.key == 'model_api_key', - Configuration.organisation_id == organisation_id).first() - model_api_key = decrypt_data(configurations.value) - - if configurations is None: - return {"error": "Model not found and the API Key is missing"} - - model_details = ModelsConfig.store_api_key(session, organisation_id, "OpenAI", model_api_key) - - # Get 'model_provider_id' - model_provider_id = model_details.get('model_provider_id') - - result = cls.store_model_details(session, organisation_id, model, model, '', - model_provider_id, models[model], 'Custom', '') - if result is not None: - return {"success": "The Model has been Successfully installed as it was not previously set up"} - - else: - result = cls.store_model_details(session, organisation_id, model, model, '', - model_provider.id, models[model], 'Custom', '') - if result is not None: - return {"success": "The Model has been Successfully installed as it was not previously set up"} - - else: - return {"success": "Model is found"} - - except Exception as e: - logging.error(f"Unexpected Error occurred while Validating GPT Models: {e}") + # @classmethod + # def validate_model_in_db(cls, session, organisation_id, model): + # try: + # from superagi.models.models_config import ModelsConfig + # from superagi.models.configuration import Configuration + # + # models = {"gpt-3.5-turbo": 4032, "gpt-4": 8092, "gpt-3.5-turbo-16k": 16184} + # + # model_config = session.query(Models).filter(Models.model_name == model, + # Models.org_id == organisation_id).first() + # if model_config is None: + # model_provider = session.query(ModelsConfig).filter(ModelsConfig.provider == "OpenAI", + # ModelsConfig.org_id == organisation_id).first() + # + # if model_provider is None: + # configurations = session.query(Configuration).filter(Configuration.key == 'model_api_key', + # Configuration.organisation_id == organisation_id).first() + # model_api_key = decrypt_data(configurations.value) + # + # if configurations is None: + # return {"error": "Model not found and the API Key is missing"} + # + # model_details = ModelsConfig.store_api_key(session, organisation_id, "OpenAI", model_api_key) + # print("///////////////////////////////////////1") + # models = OpenAi(api_key=model_api_key).get_models() + # print("////////////////////////////////////////2") + # print(models) + # model_provider_id = model_details.get('model_provider_id') + # + # result = cls.store_model_details(session, organisation_id, model, model, '', + # model_provider_id, models[model], 'Custom', '') + # if result is not None: + # return {"success": "The Model has been Successfully installed as it was not previously set up"} + # + # else: + # result = cls.store_model_details(session, organisation_id, model, model, '', + # model_provider.id, models[model], 'Custom', '') + # if result is not None: + # return {"success": "The Model has been Successfully installed as it was not previously set up"} + # + # else: + # return {"success": "Model is found"} + # + # except Exception as e: + # logging.error(f"Unexpected Error occurred while Validating GPT Models: {e}") From a1a9f3cfae8f74b55ecafcd202a4cb611829184e Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 18:56:29 +0530 Subject: [PATCH 11/12] backend compatibility --- gui/pages/Content/Agents/AgentCreate.js | 14 ------- gui/pages/api/DashboardService.js | 6 --- superagi/controllers/models_controller.py | 9 ----- superagi/models/models.py | 46 ----------------------- 4 files changed, 75 deletions(-) diff --git a/gui/pages/Content/Agents/AgentCreate.js b/gui/pages/Content/Agents/AgentCreate.js index 17729cddf..4d2849042 100644 --- a/gui/pages/Content/Agents/AgentCreate.js +++ b/gui/pages/Content/Agents/AgentCreate.js @@ -494,21 +494,7 @@ export default function AgentCreate({ return true; } - const validateModel = async () => { - const response = await validateOrAddModels(model) - if (response.data.error) { - toast.error(response.data.error, {autoClose: 1800}); - return false; - } - return true; - } - const handleAddAgent = async () => { - // if(env === 'DEV' && models.includes(model)) { - // const bool = await validateModel() - // if(!bool) return; - // } - if (!validateAgentData(true)) { return; } diff --git a/gui/pages/api/DashboardService.js b/gui/pages/api/DashboardService.js index c1cd116bf..576412692 100644 --- a/gui/pages/api/DashboardService.js +++ b/gui/pages/api/DashboardService.js @@ -362,9 +362,3 @@ export const fetchModelData = (model) => { export const fetchMarketPlaceModel = () => { return api.get(`/models_controller/get/list`) } - -export const validateOrAddModels = (model) => { - return api.get(`/models_controller/validate_or_add_gpt_models`, { - params: { model } - }); -} diff --git a/superagi/controllers/models_controller.py b/superagi/controllers/models_controller.py index c6afc5967..f4f018e9a 100644 --- a/superagi/controllers/models_controller.py +++ b/superagi/controllers/models_controller.py @@ -100,15 +100,6 @@ async def fetch_data(request: ModelName, organisation=Depends(get_user_organisat raise HTTPException(status_code=500, detail="Internal Server Error") -@router.get("/validate_or_add_gpt_models", status_code=200) -async def validate_or_add_gpt_models(model: str = None, organisation=Depends(get_user_organisation)): - try: - return Models.validate_model_in_db(db.session, organisation.id, model) - except Exception as e: - logging.error(f"Error Validating or Adding GPT Models: {str(e)}") - raise HTTPException(status_code=500, detail="Internal Server Error") - - @router.get("/get/list", status_code=200) def get_knowledge_list(page: int = 0, organisation=Depends(get_user_organisation)): """ diff --git a/superagi/models/models.py b/superagi/models/models.py index 8e8c2a680..35c0e9303 100644 --- a/superagi/models/models.py +++ b/superagi/models/models.py @@ -228,49 +228,3 @@ def fetch_model_details(cls, session, organisation_id, model_id: int) -> Dict[st except Exception as e: logging.error(f"Unexpected Error Occured: {e}") return {"error": "Unexpected Error Occured"} - - # @classmethod - # def validate_model_in_db(cls, session, organisation_id, model): - # try: - # from superagi.models.models_config import ModelsConfig - # from superagi.models.configuration import Configuration - # - # models = {"gpt-3.5-turbo": 4032, "gpt-4": 8092, "gpt-3.5-turbo-16k": 16184} - # - # model_config = session.query(Models).filter(Models.model_name == model, - # Models.org_id == organisation_id).first() - # if model_config is None: - # model_provider = session.query(ModelsConfig).filter(ModelsConfig.provider == "OpenAI", - # ModelsConfig.org_id == organisation_id).first() - # - # if model_provider is None: - # configurations = session.query(Configuration).filter(Configuration.key == 'model_api_key', - # Configuration.organisation_id == organisation_id).first() - # model_api_key = decrypt_data(configurations.value) - # - # if configurations is None: - # return {"error": "Model not found and the API Key is missing"} - # - # model_details = ModelsConfig.store_api_key(session, organisation_id, "OpenAI", model_api_key) - # print("///////////////////////////////////////1") - # models = OpenAi(api_key=model_api_key).get_models() - # print("////////////////////////////////////////2") - # print(models) - # model_provider_id = model_details.get('model_provider_id') - # - # result = cls.store_model_details(session, organisation_id, model, model, '', - # model_provider_id, models[model], 'Custom', '') - # if result is not None: - # return {"success": "The Model has been Successfully installed as it was not previously set up"} - # - # else: - # result = cls.store_model_details(session, organisation_id, model, model, '', - # model_provider.id, models[model], 'Custom', '') - # if result is not None: - # return {"success": "The Model has been Successfully installed as it was not previously set up"} - # - # else: - # return {"success": "Model is found"} - # - # except Exception as e: - # logging.error(f"Unexpected Error occurred while Validating GPT Models: {e}") From 5d701b2bab2eb9b5c3a4c7097a740580478da476 Mon Sep 17 00:00:00 2001 From: Kalki Date: Mon, 28 Aug 2023 18:56:59 +0530 Subject: [PATCH 12/12] backend compatibility --- gui/pages/api/DashboardService.js | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/pages/api/DashboardService.js b/gui/pages/api/DashboardService.js index 576412692..43806c012 100644 --- a/gui/pages/api/DashboardService.js +++ b/gui/pages/api/DashboardService.js @@ -362,3 +362,4 @@ export const fetchModelData = (model) => { export const fetchMarketPlaceModel = () => { return api.get(`/models_controller/get/list`) } +