From 0df86699e7b4b8a76c83da796c1295864da583e3 Mon Sep 17 00:00:00 2001
From: Timothy Carambat <rambat1010@gmail.com>
Date: Wed, 17 Jan 2024 18:00:54 -0800
Subject: [PATCH] feat: Add support for Zilliz Cloud by Milvus (#615)

* feat: Add support for Zilliz Cloud by Milvus

* update placeholder text
update data handling stmt

* update zilliz descriptor
---
 .vscode/settings.json                         |   5 +-
 README.md                                     |   1 +
 docker/.env.example                           |   5 +
 .../ZillizCloudOptions/index.jsx              |  38 ++
 frontend/src/media/vectordbs/zilliz.png       | Bin 0 -> 14336 bytes
 .../GeneralSettings/VectorDatabase/index.jsx  |  11 +-
 .../Steps/DataHandling/index.jsx              |   8 +
 .../Steps/VectorDatabaseConnection/index.jsx  |  10 +
 server/.env.example                           |   5 +
 server/models/systemSettings.js               |   6 +
 server/utils/helpers/index.js                 |   3 +
 server/utils/helpers/updateENV.js             |  11 +
 .../utils/vectorDbProviders/zilliz/index.js   | 365 ++++++++++++++++++
 13 files changed, 466 insertions(+), 2 deletions(-)
 create mode 100644 frontend/src/components/VectorDBSelection/ZillizCloudOptions/index.jsx
 create mode 100644 frontend/src/media/vectordbs/zilliz.png
 create mode 100644 server/utils/vectorDbProviders/zilliz/index.js

diff --git a/.vscode/settings.json b/.vscode/settings.json
index 82165a178..ab66c194b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -2,10 +2,13 @@
   "cSpell.words": [
     "Dockerized",
     "Langchain",
+    "Milvus",
     "Ollama",
     "openai",
     "Qdrant",
-    "Weaviate"
+    "vectordbs",
+    "Weaviate",
+    "Zilliz"
   ],
   "eslint.experimental.useFlatConfig": true
 }
\ No newline at end of file
diff --git a/README.md b/README.md
index 6e3df0df4..c3eb429c0 100644
--- a/README.md
+++ b/README.md
@@ -89,6 +89,7 @@ Some cool features of AnythingLLM
 - [Weaviate](https://weaviate.io)
 - [QDrant](https://qdrant.tech)
 - [Milvus](https://milvus.io)
+- [Zilliz](https://zilliz.com)
 
 ### Technical Overview
 
diff --git a/docker/.env.example b/docker/.env.example
index 8d33a809d..f3eba2418 100644
--- a/docker/.env.example
+++ b/docker/.env.example
@@ -99,6 +99,11 @@ GID='1000'
 # MILVUS_USERNAME=
 # MILVUS_PASSWORD=
 
+# Enable all below if you are using vector database: Zilliz Cloud.
+# VECTOR_DB="zilliz"
+# ZILLIZ_ENDPOINT="https://sample.api.gcp-us-west1.zillizcloud.com"
+# ZILLIZ_API_TOKEN=api-token-here
+
 # CLOUD DEPLOYMENT VARIRABLES ONLY
 # AUTH_TOKEN="hunter2" # This is the password to your application if remote hosting.
 
diff --git a/frontend/src/components/VectorDBSelection/ZillizCloudOptions/index.jsx b/frontend/src/components/VectorDBSelection/ZillizCloudOptions/index.jsx
new file mode 100644
index 000000000..5a26b437a
--- /dev/null
+++ b/frontend/src/components/VectorDBSelection/ZillizCloudOptions/index.jsx
@@ -0,0 +1,38 @@
+export default function ZillizCloudOptions({ settings }) {
+  return (
+    <div className="w-full flex flex-col gap-y-4">
+      <div className="w-full flex items-center gap-4">
+        <div className="flex flex-col w-60">
+          <label className="text-white text-sm font-semibold block mb-4">
+            Cluster Endpoint
+          </label>
+          <input
+            type="text"
+            name="ZillizEndpoint"
+            className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5"
+            placeholder="https://sample.api.gcp-us-west1.zillizcloud.com"
+            defaultValue={settings?.ZillizEndpoint}
+            required={true}
+            autoComplete="off"
+            spellCheck={false}
+          />
+        </div>
+
+        <div className="flex flex-col w-60">
+          <label className="text-white text-sm font-semibold block mb-4">
+            API Token
+          </label>
+          <input
+            type="password"
+            name="ZillizApiToken"
+            className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5"
+            placeholder="Zilliz cluster API Token"
+            defaultValue={settings?.ZillizApiToken ? "*".repeat(20) : ""}
+            autoComplete="off"
+            spellCheck={false}
+          />
+        </div>
+      </div>
+    </div>
+  );
+}
diff --git a/frontend/src/media/vectordbs/zilliz.png b/frontend/src/media/vectordbs/zilliz.png
new file mode 100644
index 0000000000000000000000000000000000000000..e755b0f12085c61990ce8ae45d62fec9fcb3c987
GIT binary patch
literal 14336
zcmdtJWmwzI)-Q|{cXudKq<FC4rMQ>ku7P49I20>hyf_pn#oJQ6xVt;WC4u4=XmLB?
z-tz3dpZ7f<&N*Ms$#vz*WY(HBzh#q|`L9I1(on?1rp87>Lc&v4l6#GWgsk%T#zaT-
z_;HY<AwIAmN`~%8NccUEZ{$=?d>TZjgonI=hpdaUGYIT~<l`o0BPJ)K;Oguv#P15$
z72_A;au5Ru14IQx0sQ=YKz<-lNR%JQ$K@dg5ai=WwD_UKE6PYnPmb+%3_J|f)x@k_
zoOvv5T&zGmKF$!t1c)ho#1KtqkcZ_{A7>}9yO@t8+g}`Fi1uSQFPjwh)4#tY+-z*c
zUdt)`ofYv-lI@L$2SkjQ*W25h$6J8M#m$bFUsP0-mk+=T0B|EXxZQoh9+p1bV0UJO
zq<<GB2XeP|vxj)tyMUiQing?J@$`^nWBVu9-yqpo|8p9Mr<>DXlh|1Ef}B8)hH>ZR
z=i&c1ls4949`+tip#K0a<K*!lJx=zInus}Bg6$;Pe7J2uww9hw9&A#&;J?P(JhcJ2
z+uMPkazA}*@8o3vR)Y5trIY=?i21AM-zD?@f6V_E+rOy$zi0^=4-YqctAAPp?9OBP
zSC8kT33(9S<+ZeVv<Kh6+2e1c#AIyT{{{G?CfXp^|L8$j<dFcebaMyk_(DLEY_CD?
zE}m}Ipnna6zYCOg16g{2Y@`5u06}g(er|rC1n+;4{^?1HzZ2wrJd|yuMEHaN*8CtL
zZlEPUh+9z5+KL+}D9pz#1QZ2XTH1>63G@AztiKKUZ;}+O5Q2mNLI7bz)C=;9hzbGu
z{yG0&#Q!!#$Hmk7&7)dUfPZrSSKoiJ|Npr8-_7+8RsY?r|A!n6`Ipps^zvUh`{-W;
z0pVYPfAcS*PfW(s<Bf}(l#adgQ&~$lOJ^%f4~a+Se-Qpdx&Qr8M64SB7Ki^t=wk`_
zZxM)K7W*q&T-<bAT%4q2Ex}%v61@M}{XYZwk2UB&co3`6zl1RFKUXuU;uZI5BqV@~
zvYd>LPxfJscZSZ-yU4W#(=@Xp3j5bOq*_Ep)~G~1#6su=tdn0RDb;7#Ptt9zlm*nS
zt%y5UQ}dbf1&gTUWb9Qa<agy4d79g$k8nrER>i!Ja>NC4FMN*#?Cg%RZzKzTpGt0i
ziqh57(_;!F>`Kaa!gv}+sHK=s`Vtd^MTId8^5XyYrb;#4y8&}@%`p3*V3l_nCk9kO
zqo@2{m&d9>7>AmeY<i3bAK2wBSb8$J+Gi96WLTxKiO^V7h}cv4T?`B5IP%}iaiH|p
zH9IHUV-r0?5GeJMJcu6&5sw6Q@?DR3!UctV(%|*FEN<m!c4n>U4yCkQeHoP$CKaU=
zrdQc4nJs-&2egd&?;c0&f3G(*eDCzg_T@(tjbhCzQ$GU1=M3ekL!Tl-Eg6I;*cN%O
z1C^Z`RndET;v&oxk94$Wg&cCE2tH_`A58&3m5A&SN~(eCl)d2x7LNR|zl;6{U~shp
zLa_d$Y6hckm!hZS3SZjLM7@3zon`2P^;(V&(Nqx|4nar}dX!Y>rx9Y?DnIsAEBZy%
z$1|@HLD~1}nDvkNZ<qVn4WqxjN;yOd6PX>0+z!H|Nw*azwo9VOW;<rF@gkH~ym%YK
zo*xTPG!SRll18UVrwSUs6gRoH@UnIbO+$<Fe~}*xT#^pWB<O0o_!e!m;btI)7B3~9
zH7N>pb8YNnlb=asXC4Zcgs*PEVZ)HhWgi}0mg8FtF@kqfiwo~3GKW--4GY26q*`*;
zDMU6`#_%3p`2Ft)meRQ0-dO7ky^IGNJ=t2eqNN<__Cp`gd=<83C}0S)%9m{9mec<}
zF#tX7b~%Is)<85-2^#2ZdYY(p-596!p8azy0EKoQ_4pR`Q!Bl&zfGdO;qASeuc+FC
z;w67GlP!I_uD7_*G%3?__JR>WE_ay7acD)oLF{y6gZ_2$Lgf)E@HC7N<^27A@8-uD
zA|eGUP#Q-WPIG-m>~!xpZ(VMIQOcGxLLFLM=|J(<HHyubWqr@X-=h$N((G5s;^`e$
zM(Yl~6=QCd3c))|VSPvF!@@wd9faW#!9xW7aV(?k?0u@FMEuRpv4%c0pjj4w6}kCj
zwrBrq!k{xL6E=eDGnfRp=~m#hr0cm;e6)a7Lr=gD!D#6*cb;eDB*L+bm!l$jYl?Yh
z4D`@-1zJ^FFgck~fDbe>)Mp#6BVQO6y~iX5$+4FshnCl;W6XQ&at4QDSgM4j;TVDv
z3nh$lm>)xrxku~n^9t5#)7P)!M>;5+YmsEXyAq_y`sYQL$9k>?k4c!GBfwY>5CH#}
z_m2B)rbH5~F@F*|Xj<Yyc<wJ^fuZ7#Xjfk89@F&lDcXqNvzZBXe&^80%z(%2ppv;Z
zx8#z$0GJsbN?7!1SNa(bbh5!x<gHG=EK$nOATTH$Mob)IU#!ghQWI!wZgwGP5fWaW
z*FF(j{U~PkSB5YTDQ|ZYDe93$CR>b{8N<>2@9i&77?^TEG6<s@ArKaQp&Yvo9tA#A
zPU^hRNGaNUnU?8tTEOZdhyPSdAtRpc<+ipHtGG$Lez_@1OmQUjHRG~vqQxruUl?7-
zn#KlrMp+$~<Ms7WDjqO~&LipD8aqr^``G1l5D>?RoIhV&DTwL@)-6!$_BI9xjQB_`
z&yW7vemf$x{3^UsK7Rxm-3;H8x{<cx2hr}IZOi^Gh_&~}?_Yn2YQF#SRBH=KXusnF
z=b-?fNX;+^1m6qlidk|NS=tj;V9XDZ%Vf?Lq&4z#JF?BPbyQ|D1)|P!VTpJd2Rr^Y
zOGH&l5$zG3(@)LacZ&PA?z;(tTh);^#GI)7HB{CEh#ya9;91R_b24<6+ttF++3z?v
z>Lp;dn>H@eQA%R5K|zIW@}Be$XRK&nWvS(^iFFGRSJQ$Hh25TeMO^5oyF9%di;Xh3
z0E%|@%(0`b>Ef=-bj#(SJY5=KqsSjoye2PIX)t4wmO`erpacFL@2T)AhAv2#Dl})w
za%j4<@9oaDu%Cul@3EXb+Q>)W%Ue7ei(5{}HXY<pi0@qMQZTC?65aA5e?$h|6dNyI
zDX1msa!sJGyLcQGcc%AKa;orlBW$C$5;P2JN|KII&$7II(r_r;u*>QLk~o-8{Mr}w
z@+D%lieu-*amFz3$&Rf_<?Yj!KT4HVZ!?`#oI`1B)hdki9q6L058wKDaG9J*UQXx2
zYVdaJl}YJ|LGf<uR1@XR!%m~?*(%V2t4b%!%Bqjp%bT;VUI%Lgzqc0WbT_a0*(=`J
z3&1c$I`4wQ@MLUfm|Q-vyJu+4iP|{uhzth6%=;3OK-Ai<z727cQCIGk<5KB{jw)NG
zT37;W;hK83pYxcG6A>f4R-lCfvDN8n+*cCscxSsu^h2X2zhyadz<*uR*@#*fhu^wh
z7|xXA1>9UZ=dnLw8KSkj^!}`H_-)0hk`QC|G~*A;!D{B!rNpo}hnIMrOC*6*<u156
z19Ut`p`v<M_lgv;+Qd(P#>&1@_ajR5`5|gIKF4=5IMSDvO}2=|nL{^bHyRd7cC`QP
zoInY8jPh4=RQ`((?7!d16nu7d-v-y|dW*P@WaHAz+6W6Px-P}(FV4GN<GNop(z(5v
zC5=B$j3VE{zZr(Y^es|ZD<zn<wve9{@$ET~Ts0n?vWDquA&=YmG=9he*QIt?lUt|k
z&vg&!ZXK$Xb?<$YMYsJH-q@LP1vzqtr*B)1v{%!qA2DieVM*S|q;F{dq6ivwE;hvC
zGJb-yZOh84?OId?luEUqUY?V`ZJDu*6u_`6j?=Qc5^Go&ffuxQM2x;5@^2uf4`N<Q
z+$1Lk(YwNGUnDj=jcV|XOQ39mGNU+j1AngbiT2w^{@$&rJg&}~Nxc>I*u_0uv?&hI
z0xfA=o)th~<Iq+RrF2=MhXkC-zwKEw{}wSq*klvxAMySiiH@eyrYp`2z-o{LI0EUL
z$(o$QS1u#mta{)rv&C!uQ`fij-p#`VUDnB#JDSkluYGSPb(D!iTQQ)kCDqgp8VCic
zw&NofJrA2}>P&w&%&<yfEY)8p^bbE#{q|=hL%6$<r`a+xp9#pUDStJ_MCpmKd;>gK
zjQRRBIpHgg<?Q-FZ<eZ3imyUz1mCSO$CRtPh?>f5y$gfHL&ms8HmiZeYF|T;bc=X@
zfXEWphQyWJoB0mAW~RQ6agdc`*vFd<fkiATa?$jl8^M%RI}SK4B57pN<KB@wmu<=n
z6{K3M`qJo?DM{mtUo}!ysDX|o=4<8}hrw)90>9a_mRl(TFIcj@#YZmR?Y;DH{l4-f
zp*=Mf?v5P=AmHGMh^cVpC8#8y-H=MhDayLaTxkP3r#18V)z<Zlf7QmgK0lxP#QsVP
znO7~;QaVD>JhU2HVvzsLXGdthP8<hskdb9bVskz@7S)Nx{={fqvIja%20!u$s%kj2
z%^KwGjL)gG$ZNh#9#=lPCjbgvxEPvL((>F(U$zHzr{(x0=gVK*?BBsJl=DQMl^|j{
zL$y5Ez}550xApis)3q`v_hMgPj}<E>1vpY}$FGLeH~R*I^V{&a`fb$4LFeicA(=2Z
zIQJHh=YfpNFw_yN=`dPaV0b42#~lHz7(@dM2y1*_=_5!oJ6pzgA1;Uj5jC_HnoJp4
z5?JwG7#(w5#eGYktUyye(uNAJr+{V~!)hA~pUH?Q%0H91eVf5O%#9Fa_Y2gg*099G
zn_=geY!*CfZ$k@iUa*}~t-Kd7sG15ewRHx%zq^>P8Fh4zbsdN_6AsJd;4tzWX1gVr
zb-}L)Xbh9f+@AT0vz_3zHd;3{J2V7~QfxI{dhX{b*+&^PK0`(B+3+35V#mUz$}TxU
zzkA1=%Jh)8KC$ky#cP=JIV|z3Wi6oo13S(;8QDB%i~<vR6Z(G6?U9IQ41UdZhNkh>
zu_q1dSml$4#Z9*(M=)XWChuUcvew=lJmKSa&G%>&YiP$69l1}YfeL5AG~-w$WsMPX
zhDfAjottw;c9s^5JS2%y*YB$&dbzzkGtHzyEpC(j@J-w82DK$Z>ErM3D{{CvBOf#X
zO$)qZz}p0aR~w06702V@2b$2f;XL1N$YQo*ij6oD5&lYic=Ao>?Lyz0t()kdH%TYY
zh8$-*W;h_{eA|w!!{g^~EySd-;ah)FfD*I1CQt0nz2k+9M-1L9yES+*M{de@Y+kO7
z(sXK$h5kOZaJHXNN<r%Ztp#7Kg;oQOyHo=Gx9oRBkoIOh+lsT$V0x$G5G31C^}Xt>
zR*^IQqH-y=m)+N6t`Va{c#v^xK0p4SH4+kOl5Hincny0V4d+f@ayIr=x?h?eqvYGW
z1MO16D<xv}kLIz)rS^|LYIrWh>5ttr9IS5S4TIfQ7l^VBSFdUr2eiBmlmO6^fxK2|
zZ8LO>D5;PlMT?xWfG2{=rMs@|s9LGi-OLX!0zX_>_(rUWD)NV4w$##QBRQ3QtJs7z
z)5=gN8T>%!aw(=VfFcrvk>}CaTpOGlfclmpwNrtNaEKiz_G2wHOTS^9DcFI8E0yww
z{(f6}Y)&A#Fzb6Q0KK`b?hC5-3BfK-k&sCsA2Q(Bx&f}y;K${(rf!i8uvJV(hnEgR
zi<X`#OS2bny+Fqe7BLIel&+%M?-tE6t|TPqdY7yLXxB(RQ5G@e^!fCizl`}F$TeKE
zLL*Goe501h5X3}6l|TGjMFn~q3=g$@)$WB(qx%_Q|Dja<Zd2)6!t~*CR}e0}FX`KJ
z!L|(BLgsdlriHJbwGQ}_3Bm~+Z_bY*Bh4eKD!PLKC|N00&k2C!M=gY6!s8YN*tAjA
zFLtN!&~YQErsLWrL5|AXPM5T-t?1jicCL8_Tfeq_G+vv^)(A!k1d`vL*w6pS*)z2a
z;r4d0$E*%YyAK|)V;Mr(GS=_N7VR5@nN<(;tVL~q@+XhL4T<20N#$m9hqEe`&K=tL
zX$-6!$>&nnEHDI82QjgTqRdpFie#e}V7ydzEjD6FnzYeCo-V{P@u{lEA{V$iT);_?
zbPmKTZTik)c=%D6Kk>Ex`pzWUV(sZkrw_E$8PYEeoqC8-1tcf)<Ew^7N5iUv;eF$<
zA;u(|4+vXB#>5GV)q>TtxT=NHGq-+yg&gti%;Y)T1+qC#?N&$fN4bB-?Q6q+pe67-
z-)N0F6iAjR!ijAhFgRxpQKSL|YZs7~w+yiw7c{*X1&oHK!e0%!F_w&sSGUbv6q~KF
zG^^7->xJk^n=?c)yNpG;yM$wWQctp>Zayn?|KW@s)JomA!lE1z1yGS$YlDpN!zYP1
zTzEH92gkY1Pz3C{JK7@my|mN!)uy*v<Qk8oCMrLfI!@d5idoaTt@hKBn@bdb?q}Yg
z0f0qY_B_~s)(d<5NyI@aZ=(h`{+v&q7=JP>-QW4Om4Nq;MhOpZh*|)y6|vnC&*cpc
zd_-sC_n^*2qsqco?eCk81jUyEhX=_*GiUgTnrR)X3Eh2o3-N_wbmCnLc2~I;R}KOa
z(w%wukxk!P=8Cg&jP&o`PCWFe1u*rkC?>SycY}jViZhe|vdI9weykj5qcLoC_}QRS
zK`cNH@#`D278x}z+h0E6g87FE^Ngvwd30yk;+kuJZA|0#a7HL_?-`|7&z67g%E9w9
z)*SaO`^;vL>$z2fU3S%Q!q)-J^5qtyWif08g<n#hj9L+W*Fq62otIV>M#!A{9mx;D
z8=4V;p?Uf)?1SsAgLpJup!BZx{-%9feP1==+0{Gvct5P+h&A7X()y2pnJ*Z<X~j{b
zD<Gl!&jprld{6A*c$+)Azxh(GJbn~_#VnxncGxVCkbFcSUd%I3Gl&u*=CS)J2dIc2
zIal0am%E{1K+cpShGV5{y5+I&mStZD#+PhvbOw2P9ft?CJW0?L_M#=wiD#|A6DI<<
zBN+*4wBs=Wtx^%Mu@WrlgGFSKAdI2mxb_trM{XmT2gW|<h*9G(^5;m$tpw5!&Jh4<
z0#h$uL&v?13*L}@9@j}AiCH#2fds0t7vWA}tYM>{F=fHwI8%Zg6-q_xlks?=p~2S>
z&P=c(jre``?D$IgdM31dt-}xJa0A;Y(5&fz<N@1R@;>zR-p!i!bmQj<8{nx_{U+-f
zY%38m`L)l5I_eFxRz!#MTvxg|6zqnwuU1otp6!o~ON-m85w?!xVrbls+!lmGE3xC;
zGBr+Vohl|V<LNI#dEt2Bywrep4<~J*ez^Nw+4q#O?QX%sIVjEXO)S77Ex<+zkdxD-
zJudnRy=E=k+fMfGnh)~9m6q&9eVHi@@R-)e{x#4#)@xfdN1$s{L*@p*BZ#ewnIzVY
z-A(P<4_XE351-)wl}8F=0Hq)c99d>uH)++~P5BYp?>RazbwNA%-Vh2pe{7uh4#Lx4
z#T54fDFtR8RQK<5azxlagrVbmZ?s7D&&zplq+OCAs}E(Qir0pT^G==HHO9(OJtZT9
zOnY10cx||p@;3i;)TMVGQ%$j!pD4h<rNRx+3}2+$SycByy+2igSjXxveo!#A%SH*h
zuJXK9oul0N@L)_H#1u-xud#XU3GH)-8KeHF(JW`yLLW%#g^Zg@HGi{z|AY98A&JJm
z^#RF3sogaRI%3MvvPy@XK~L1A-1P5f!MPn&tT;9G2k+V?FnBdon+jOX6el+GtuAeY
z8eD;b_&aUxL_EZxcd<7VYQ945r|x3?dsVL1lmNmpN?f`nKbQWl1ZbK$>ra}>+hu%l
z!S5K;^byp`%!i;&_%9mxgleUu=Ivl5tE1IKNomz`iKC+&ecoU;($$XaHgEH80nU{#
z6~%HBomqwjE!`4LmqY-Pplf48qdvh-5cbI1ai;hg#dO!J!)k(kW8EYH3Tp44-|w03
z<z66u!Zzzhp(PX@nUX}l?*T*a=Bud!FC`OBfAgE|>H?~mfK_bSqL|kg!5{JKN1T_R
z6u1BYbx$|9HyMK2jw3#qTKwFG90Psqv|e{meSGiweC{jS99}qQ?VX`n!NU*a6W9&%
z0B@-2d9;epF>1yG@=Q4zsz!JXhD^oA$kKE*l?edllTUBf?X5@6;UdIFb!VRX$Pf2Z
zw$(DW%5AG<oZ_dT=eL&<hX>l2>;<^*Tm4|IjeL$`Tq=hl$)9e!cB(}jvF-5q3K!a(
ze+nNiV5F}+$*O<W%7(L%n##ZPmc?li-PpU=98)>I=d&H#<$?&b;ru;{Og?UKnX$zz
zZiXn`Y+32^aK2yZ;Ph5MJD}gw?4JzO!hB{y0b;jXGTw%z`d6Yk)_N2t+uf82POF$;
zNyI`!#zYJn_-^Km>As~lZ(H3qr76;EL^qf~FaPn@NSXi7E}AUH%ZFsxb#8Z3>a6G0
zpdk0shbfKqW63|1P@i9UhvN|rH#IL2_Z`G!WN;V;UjX_@4#k7>;iY4y5qS!5JfZSi
z4^ik_&(G?r22DeLrn@#Diw$kwuN+vi+205-YAJ-Y`dJ>C`1ql78PS?QjnljWRU@`e
zpK`%<rIwMEO$+3k1xr->jGD9Ob|_H*H>U-ZX*=pEljOG|v2l;aR^Nxe)}QiitI<oI
zf8TyFVg17TLr+qjw7B|GZd5noF35J%Aww9ocoaY$S0dhLa5!0{BrppqX}U!jW|~fU
z6Gu!bNeQOJKXYJ|BSRd#p%!Rdw}h)7k!!YT+Lcia)66?ez1GJgCr9aLy60C)0^Gy+
z5bE-uABB5wb<R-rNzMlbMJ{QIEd7WV+{gZ&<*a=)GejAAP;xjPhDr>=ukpoc5yB}R
zdG~WaZu>S~|N5x9WM;dFXMG$)lHRZ#e;N34DHrQPP9deHq@!*Wu}{VuIyufb+Yj73
zy)~<;Uic*!v43qNG-6EofF=XrYJb<ynY={y$H!*$^`(OO8y%5dA*NS#K9XsN4FD6c
zDF)BZi!mZ9t$UcB0oj_#&vHj{pW+S3r!4pEy;C>I(%=3#!zGWFOU`Ax_cz!`{4{LX
z;>8uhZ<uEK$=gla$B9r>u~4`dvnDH@<En^xY3BFs`(_nd!<1ZJ8QW4?vcbY08;$|4
zzLb+Dx7dOAQ#F;#{tMIJIhRg<b8#g%O<iFypGinRT+&7}KNJ2dQhxG!q*+DF^RY$&
ztnzVR22u^qN?=Y^<0sFz%%;{=CheUvOSeCKAPSP&Zd+#TA&s$6qvFhJO|wQArM!n+
z_o_%M{n%-ARFr2=g>71}tUEs^asVN;W7FV?HTI_a5I+<1kP26u2lQw-UizviwYE5W
zTX8w+H-PoK;J%9Svhwx<Ho$oEOHZN>eo@w8E$!?X0(w-n(L$Wf^80RQ(+1MCn5Gt+
z$U4u<@0`h}?#75Talgl*d!bf^*+*(5su&f^&KReL;lecf{#IgO_7VH?Z0eXa<yS;f
z7?t)W{w*mo2+WUge{Rl?j=fYfyvla_Fz_C*!UbUNI%SlWHY^1pQj2k5T(dayR^nv)
z_ZCi0ryIiZjn6T(T=0qMwE9}GruNR9hIyF{IWLLzihpeze^_{~_zWMIEw8{{{5?oR
zRLMpzv!nje<SVoC<iG5+(;2R=#*EahnD19*6Rys~&#AO`l7+OcoDQs#*zdHWMk&M)
z3Na)0OcJVnh2=lOQ+4zSPjMt;VuvWiLiu}{D7Bw%daUJ!%9*F|v<)nnkr<Z6|58jp
z{hdU&Sl4N1s&UBjm+0H@bAxk1Lz2{S*20YE8=Etuj&9)t?}-6y?LPpcDZl+eWpW0A
z^!sky15T;T#EJ;TbUEx!7Ip92liBZJEaBOSx$35YVW6c5!OiVDL;`HzP>AJZSb<j=
z+|&#?jWLPcM3U7AGo5GaT*9lXFB#~ib)@kIVlLiZw!B{R`)e1>+mfmvvg9cG-24p#
zf9)Hjg0~%&M-v^p^`0%aK?k}lqHhE3i3Ce`tBx=UskEZunPLoq4^RB-I7Ybu&#Q4n
ziz#0jp=unXY}29MiNA~rtm3aoWXJhHwhwJ{<#SO^YhExLHjMA~sAffv+wT}Cz_X_>
zU|=6sMVub2Zg_m)zCP#N>=k^UhWBjLb)FnBvDP~>H4BDoDR#d<nrPu+(tJE;hho5X
zIp9#7N_R~qLmQo*ZGmEgk8_;QL#E@yv{qmv8m~A3)5T15kJkfZRs~siyLM7+j`>W@
zAFNdTP;rvy_R_ixb6~e%hzgAyK9klK$G&jaT|(!di{K1daw@WuA|h?A#FM41%$7P3
zd1kQV4=@sQbH|tRi9ALoMZ{G|Y{f;Fw0T6oc_=CdGs0z1p?ePw|2n$9AWTk?B8KFm
zr>M^v)=(5YgJC(JE%A9WIam-_)>EnA9n+P*ewdC-$-|baB1QgcG(IO{1-Fyie6B=l
zx0rQ@uIBo}K{KTa{J5gT3SJSx&Uq1O)Q{U$f=dY6vH-c15n2!6gZ$eMFAhIe){op>
z$qZhK6hQMy2t?{zP;3LRNyxjGaw!))`)US|78k#eXD?wXc!tm`K4n5&dw2WSlHLCy
zRrAO2lVPP7xZP~4<jr2h12b&bjN$fp$OUBhGtUU@b{#EaB&T;>CP44-PU>xCLd=G9
zsJkQsU_Mv^`-t1|fqMX@2-f`>;6Sp2Q8}WPwR%pAZ_8?DlK#jCw{Kiilugy@3T)nR
zsOEI#B(8Qz*~c4vwp2q=y7Zeh?wtnS!4gY|B4UkS&Bkc=qm^14VU&3ZOcvs%?slf=
zYHW=wIj4VjZ*4JtZ&ALj3w+iK-}8jnkeF0KP}K~uD|jPwGQqOwdk%&atMr@Y+)M^P
zaD^2Os_>8KaDJy#2H81P_x1YLs=%7<I)!B8+(N#_B(YE-52omM1-Nv|Qfx$<ImcR$
z5N6a3eb^eQJ!wuuA<Ug~Yu7tkWJJJ1JZAHvuBVd{A;a&R!)Y305`cr~R+k2tjD^eT
zm%=Wl8uU7nGS4|i%<uxl^%CZyse2(_6dUtx6s$av%A6J_`kj4yh)eu8hi!OF1~X^z
z?3);{OpXW^@4ocLu!T{n;#Piq-zlxF6X!*&&>$l713C-Z-IN3e><WL1=m4G?!&baL
z-pHuj4vOZ0zU>o9Plpcig3o$Y?ZWRz5YO5|M$BxMy&4>3{gYVl(Xg$nx89>ehOZ!6
z<~NjV+yl3C{N+PDW5$hSpRSM;*tjWFBIDy=TiS8ftLPb(D8=6+Du!G8f7SZGrBMc`
zuouJ<B92JM^r2M87(bR8MjeGzpi3p)1QD{PC3yD1IQK}y!i7|k!x=4U*2<gcwHBv8
zC%)9V8@E(e(5@QcY)A($<YHVT^vd2@R`#(ohsseQx2@t3v_H{o!N*u%h%V&<XfF(7
z!KY)O1GY!&rYC5z*EuoQvO~gUvvPs^at-?)-p(qK>VD9lx_p7pxYqV0!KLG0mANyd
zOtO#_u{>LAMuw+h<C@)Rbg+jnb6RDvG1bp5-Y)!_21qPzJ&f3sf-ygQ4>RQ<yC;40
zi82%4@lAeq1NEE)!bI(boEEn$)G0hZuoOf9hPbLAjr{mmC*R<R46~GMaAh$Op127^
zTqkA+iugAQG+Zv*6!NEgo{19Ew+<N7+(9adxBQVw^txxpE!JdiE=Pu3aKpV8|A@Rs
zY%w$AjG@6L(4XFAL5)P1a)91m_^1qITItOzw${t-0OE9;h+aFra$W43p>NX1Ak-M&
zTq;MFNDq~g+EtEtnTOfF6Hls^Mtauo;f>~E{VKQ`jy%c=M2LgwIm5fEWN4zk#aggn
zwNmc-f!~kGQK_NrC!LoU0u;&GS9{v9<73*uRb6uX)5U<}7wzY-s86}vR;VF?Y#Z|p
z7_8;tCytgsdG-wyz41j9VECS`vKB)omv<ZR-ZXgg!l7{o9Yr^E<F?-V7<uQxao+uD
zhJp65bvxR4AX0MrRmFaP0L&qGI2_QcxMZ;|meD|8#}<&LI2%4_2ND;vMA#C^u#WtQ
z0q2-o=pNr)-DYJGatCQx_psj8WX-tdKTtlxzKQ#}D*-)c<a2&@AicBhpLN=e1HC<(
z5FBNURGTWOa$WYK9l0iE^+%r;?%Et;WsZ@fLNfO53LWqK?Lw8z5NwyI97I9Zi537$
z)9PD4Q3Ehe9-dQbi)~W&ZO>FA`&ST12=<%j_zl5=ec?-tX2x{1&*b?EQ(X_ZLSK)1
zD3V73LQ@#RO4i;*eu^~p3s9Ra<OoY{>c~)qW-tp(f3gui3|Zj3>)kG<Rpmz2zX+y~
zj^NdHVgBP2m#*JY|F)xwXD%i}Ih1-K{>6M=P&c5bnV~DZo=SShQz?mGHc59@o;7GN
zhHHpEAx#~sIoCl_kIt<8PMLvaC7gJINcCQP_hH278Dzhsa67<c<C7@Wy@j02=h!JW
z$2LB&cy{B&rTEC;N24OhDBtDL!YfW_tW6h&PHOyIgR@!8LaX#x;|lDnd?h?auslb{
z?DCn~HK~Gu(>Y@p6*1`J!DE&oX=+4Nhay)*sqyqb(7R$Uzs;-41W$awBu;bwP9Mta
z+BaP1$fRu}YRhMG8#{dMY<9Ep0FA|eW&Ch~lfDx~mY}0U+3t0jUSg?wdqiq(Sg2U_
zXU8H|_8i+a!sGVk#YrRgl5HYu(i32vsEH3(%a570+V*AC1g?-QrfL%<Ifkey)MH)&
zu((O}B0?Lm*K`DY0|y#14fsjzt)tUbD8Fh|%b5kXusowD0ZZYrR;U>krzp@S@C3&+
z%W$rsF`GQqYO>fMzno5nUmtvXjccuLV~^Lcu7>!eOE#y({n%Iv<;)USZm}8s6ePYB
zR_qDAUWNCIvTpmmw||hiyhFL1e$hOOWBF8TvGN!xHV5;8-X(=`nd@}K400ns!4orV
z$m*}8yHGe8pV9xjG*$cZ`~-gc+Ms@VOOj_Od9JIzEiBpCK-e7fMg9+)Q`*Z7l0N6i
z4|#*s>D!*p*30Pu-}(>70i&y^@U7QVtFK2->TAk|$V1d#8R1GFVu+}n(`!3ieL{mz
zL2mZ37`2KkJ>p!KU?Ct5!vbx@=0UAmE8r5Q)F2plI35BWEmF1){*cKvrO28&^5Gm}
zB%ZP1o_+>ef;DQwh`A|<g_TlV>yF;FOX2Wp#yl)C!aQqKRiM?Kkd60$>ZNf)uwqWK
zpBZBVR;ux=HA1y`W#reR1Ro}^_pK;b>GyVzC@p0=W2#%04REgDF@1{zm28gJbU4;L
z;TqhCm{+T^rx-B{XS*uYn4Kv{_8VSlopV&cnrP%V@xqm8oaq;`sysuI_`|;(7}C5S
z-Bs`z@#G8x@&Md8qSjn-5&=d27W)w<&J!#n3HbSO1h8As{qPD{+y6X9qLfn&l9Zuo
zxaz~y(j?Yqni*qIHl*o~o$e8Vf3{+(PfAWiiG`CZl-uoj(RFswxyOsY7Gp|P`qrgx
z_ilmz`|+fgD}!6B804mx4@NPW%2Mdj%pGsQ6eB3QC=@|rlzhJZOD_e_u?w%&WY&&E
zQ55pPG|rIBPKf=yV7a!x;Sl~+BsM2-q<Y|U(}KJ_JnkM|pf$m=Za5rWVX>e;ZyTiH
z$TTh;v6oaWx+c8j0nJ*0HflnX>FiCIze-p$kKAKl3wwK;Y5_^r6t23A`POZH4r;qE
zY_mX#k&vvs2H;!oaEc)G_9ltzq$iZQ+3LkML0*P7r~IcoJ|HP6k$U4}3X0C0);m*9
z*X0__A<l26FG+!D%tIGxlr(#+-le9VH7m5_D~)>Uu<^Mr>-v`$UU`DkB4nw2C)VF;
zC(E8jbw)YoIm;%`E#n%pq?)p(AZ0INYq)IlNHu5Z9Y&Ps`(5?OF}~u<Z@H%-<owp8
z$<i>uG)<ZC-4rL#L#pN8k@D?psQNIw`&>tH#aC8k-Y(JOokHw@BZl2@an0z5gYbk0
zuO8?zr^Qn6-dRjnk%ins9$74<MY6o@8<LgZ8sUT9-Jacfw)o}4S#Y9AsZd$NLJZgp
zd$6VHdg>KXp`tR%kFOZ|UKc?trkn8k&D9Ft)ASIcXB`AQAxT!bD^4*Rmm2UtbdU${
zJl_KNVv6#4T4z=+R0`q5u^n8zB#~ptjTs4Y$?xBv=jcfukoj{TBy)`kIK7IA-VLZ?
ztE4z*b?@YzNKf4n7y0L92}Rtr;f$|hv3X$E2xZz0xyh#Osw7dy?xgAD#XTuaRgV`;
zQrVk*XB=PuWxAWv9u0Cl<?u5GrRcL97UV8`;tTR_P~y6xJ%|4Tt<MIS($nGc5Hmzs
zRZ0AY89i>VqvM<-^?KxB3KoJ7aUw}Jkfi@z*O_HrOc6T3i>;A@x7US70TV0b7ax-v
z%=pr{iSi{UT#_l&Vj7&$if<mXtLPyV7$PKNwa!&mz}{N!9m3Cc+2A$h`rroqy!jGM
zvoneqS}l;bpXhTx<>8325r`7hh;PJ@m@^-0HT62zDyDM)th@i?psP8>^&{3Zq}KR%
zL}vFiB|V7-=FOH2v8MaXgozZSh3qjg&~i@5-KM<>L*SLO&n^$JC`-4jag-C>yh5I<
z9oYxTUZCTq2TVCcY6iM}Khdr?tNHa@T8K6@5)lh`_Zviwsxr~UpS`^)7YLSkHI=bU
ze92o*jI9#}@+Izmq`8D>3U6@Uh_4+m5Hc*-v)U}=3!5zcysIU)QcLOdxxIdRYgyE8
zAO}t^F%R%w4*be*Ykyuu1<9^*?WIe9akprQCjen(@#4Qoyo=j$&}tlxo%w!X7Ypdr
z&B;sccFWU|(Mtr~o@~ZdDh-EYr-hJ%5Wf^PlR8&Z9!_Wp%eW6sSYirJ2?I~Rd<jz?
zhNqsLf$_@rGj)y_nT5pt5t%T<6|tl(vZIvdnv{}b<9oqIg{kz51&v$f-EWQ1;C|V=
zCP;sg0{Ozjyptjsz58ruv19{9LDYeQAt>4B%iP`olB{v(prTIMoJxeQS5maO^hpDR
zq9q^UCS@7t8rxo%3IMAQbrwk8cPwniiP&XxiWt~jAirrpo5^mMzn^1)cybdb3gL65
z`vz7s$vk~?c73eZJyHCs85r6bHJ}ZrdiG)(J)C1u5(M8;@dx?a{fK;9BuwF&m}rzL
zkn##;q7~VMcFmMs$oPA;R<v?mrpf&&lEe?G(BP=-7x`Qkt0q`C`0J`E+n)Siftfm3
z5zB`fTak*rK`%yBA`CE7zHLiYBMZN2d?mxEMb1Z(zTqnYXk2a({^Mxvj?939|1wQo
z1r{-O1W=rw+i+eq$GUhkJ{0mYpX*iIHT9N%L@Oa(e4?UmD`=9G_qAFaGm=7mc)Vv>
zjl7~^-*5#u+}DUlhY#^QQRR@h0Y>^pC+ko1N)8>*I-|IdI6yQr`LhC1Y!vTHZ}BDP
zXT#>@qPH|~rgp^PKIK{nhS3T;<b>Lxeh#pfP_EXt2KJ5K9TDxlWux?Y@+X0p!fgew
z<oa?mNfQ1?zq5xuKU~fbI`ceuQWARR(nW$ezaG7+XN_N2yHafYvRuM~ddh<2?HRmI
zO0^g@tx_B`k0d^fimM}s67`yPy(bNF@ghT%`X16$B~`8GpVkoF5p7Ypq#j)+x0BCF
zZ&OjHO?T;Kyl)7uIZ+ib1am}62hm%6W+Hym+4x1_keG6H5ZJ~OYDfcJ8Mi!An6IR{
z{t-g%X`+)tXr52|+W<d<p)OKixHAp#4U_m=f_5>s;8n{5IAn4(&%F$4O}>CAFs+*@
zL+%!%#OP=;eYFK*Hm-0J<iwB*C2nYxTuwFcNVsYCOd97b4Kx29$(B8v5}hq?>H>>m
z-k05upkIZ0sR5wk?%ywMRe?>PE}A`G=lc0ks7<@&waDj_cET(r0N<&Ob)v1|F&YNr
z{u_MpnSVazy1aAarWjI1)S7aE1%|kWsx?t5S4kZW7bW{Gg9Dow?wdukGvpf(C3--A
z%xVCOGV7(GAG`Xsq^oAN+S?-nb7}z?Q#+!bwX%UWK`o_JiM@w!X(sHrUgH6r)3Xte
z-C*vgw?&7jmc{23T?8d^Y=m06$#TBY`gp%07S-Qh*V%v5m0<oPQjQ~}7bLQz2DH>J
zq3mNh|L(!5n!JsV;vGm7c*_Jt0Hg(@*)wKWvbrZV!ZCNq)_N8k8b8n&j;-R5{4ilh
zRC&o)8mxTESPT#%(MW4(&WXcy4Qk#PZx6XMBj1i0VA6_)LK5W{)w6A4NcOsV6@hl~
z8ixkv_ypi#GjX}C$MJ=tv))Q#hE{5h)+5zJ8TQnNmm7NXUp8NgCOqQ%o~3@~+RpCT
ziflCVF3UKBOaF8}UNRM~%KdWO_YonFfFd7-rtl-gI;tO>p1H`OzT%%2(2ngJUuhsp
zi(j~MQ{kN0Bu`N;uTX1tqv=&V=oo??DIIWtsuOD_J46F@Cmo?qj+aiKMJKY4gTB||
z)7!_PCjiy##eg{MiyvY6JpoYrAIvA8%)y~6Mm#CW2=^FBcxaaO-BpiH)<VDa?bb6h
zPVhd5UWixE6DA5jnm<w*pKVYsDpxpEp?9~I`Re4j*&-(mXOk8|jFl6a0ay1q&<Z?X
zunA%9jo_MgP@M8RNA`9ikPd_qAgYpMhRYphX0<+^v_?z_-D|gfYJ$B2q3oo#!jJC1
z3&|D+BMj8d*zA_1Hp3p@**f~VS}DOg?HPYV0plN@Q6m94Y6Qqv+0~^EH9bV>n;*pZ
zzJq@%Q<p3p$z^GL!>Tdv7^k6h6qG+glsb1*E`A&lzKL#U8(N+wRf#sS9eB}g<@1?H
z%@MtScEDkWN&V5<{QCz(>iR<8q~FYcMK@WSXr!y6^e>_3azLJ&6=*tQ5=ne?sg1r~
zO?M+-X7Y$8jm&SWeJ|XvXve~l7&Nle>j!<$|7P1Cd|BVtqueN30*P+(`F}1>7Lc+E
zhAWSLE@5>#MMtQw0CFSW)k_;3m(S+h>jhDUGOI!nRTySCz#6?eW|GWemL=r(5^RQV
zSyyzvh;^HC*Te#YoNyn+k=80oG7tP8E77flvvQhZ`}WRE;A3Bf;$(k`Jo+X1q`&8P
zS|(`fcjE`G=q^NMf3RgOCe0UN)$D89!GxDKRFCE1OI%a0(_YFUA=;7sC(6^{2124o
zR@XP#lNxElC}fXyyiBh~Y<8Mxc;w^|!3-%}jo+!F;jxTHl&(g<;7`p%)N{u(BCN}|
z<Ts@&BB6LRL=+zS=r)_G#&m?hziQmAyfo|6M_#{YM+~w!0kGP8H5dGCD$6qx0&p|z
zr5qXpgo;tk$|9+(94?}*NNt_eG;S<M^a!*<ou5UGhzQ{y%Bb?1X~`8M51#z^$61DL
z;%Bv@F&|@jvY3*I;W6PZ7f6|V_`)k?5vpj}PZpiK)yETRAr$LO8Y`y!a>I>S)HzTJ
zKv;juNFJDd6+g3J8L6-9pu|O^5NKiQ_dMt16e48_BNX0QbNYYbZxR3b=MLxt^6B8-
V=Mc1O`p5s)Da&ifmA|wI`5#n5e98a-

literal 0
HcmV?d00001

diff --git a/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx b/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx
index f49054b90..02887b86a 100644
--- a/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx
+++ b/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx
@@ -9,6 +9,7 @@ import LanceDbLogo from "@/media/vectordbs/lancedb.png";
 import WeaviateLogo from "@/media/vectordbs/weaviate.png";
 import QDrantLogo from "@/media/vectordbs/qdrant.png";
 import MilvusLogo from "@/media/vectordbs/milvus.png";
+import ZillizLogo from "@/media/vectordbs/zilliz.png";
 import PreLoader from "@/components/Preloader";
 import ChangeWarningModal from "@/components/ChangeWarning";
 import { MagnifyingGlass } from "@phosphor-icons/react";
@@ -19,6 +20,7 @@ import QDrantDBOptions from "@/components/VectorDBSelection/QDrantDBOptions";
 import WeaviateDBOptions from "@/components/VectorDBSelection/WeaviateDBOptions";
 import VectorDBItem from "@/components/VectorDBSelection/VectorDBItem";
 import MilvusDBOptions from "@/components/VectorDBSelection/MilvusDBOptions";
+import ZillizCloudOptions from "@/components/VectorDBSelection/ZillizCloudOptions";
 
 export default function GeneralVectorDatabase() {
   const [saving, setSaving] = useState(false);
@@ -33,7 +35,6 @@ export default function GeneralVectorDatabase() {
   useEffect(() => {
     async function fetchKeys() {
       const _settings = await System.keys();
-      console.log(_settings);
       setSettings(_settings);
       setSelectedVDB(_settings?.VectorDB || "lancedb");
       setHasEmbeddings(_settings?.HasExistingEmbeddings || false);
@@ -66,6 +67,14 @@ export default function GeneralVectorDatabase() {
       options: <PineconeDBOptions settings={settings} />,
       description: "100% cloud-based vector database for enterprise use cases.",
     },
+    {
+      name: "Zilliz Cloud",
+      value: "zilliz",
+      logo: ZillizLogo,
+      options: <ZillizCloudOptions settings={settings} />,
+      description:
+        "Cloud hosted vector database built for enterprise with SOC 2 compliance.",
+    },
     {
       name: "QDrant",
       value: "qdrant",
diff --git a/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx
index 3b0046382..ae5730276 100644
--- a/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx
+++ b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx
@@ -10,6 +10,7 @@ import TogetherAILogo from "@/media/llmprovider/togetherai.png";
 import LMStudioLogo from "@/media/llmprovider/lmstudio.png";
 import LocalAiLogo from "@/media/llmprovider/localai.png";
 import MistralLogo from "@/media/llmprovider/mistral.jpeg";
+import ZillizLogo from "@/media/vectordbs/zilliz.png";
 import ChromaLogo from "@/media/vectordbs/chroma.png";
 import PineconeLogo from "@/media/vectordbs/pinecone.png";
 import LanceDbLogo from "@/media/vectordbs/lancedb.png";
@@ -139,6 +140,13 @@ const VECTOR_DB_PRIVACY = {
     ],
     logo: MilvusLogo,
   },
+  zilliz: {
+    name: "Zilliz Cloud",
+    description: [
+      "Your vectors and document text are stored on your Zilliz cloud cluster.",
+    ],
+    logo: ZillizLogo,
+  },
   lancedb: {
     name: "LanceDB",
     description: [
diff --git a/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx
index 37e0e5b73..af0b5662d 100644
--- a/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx
+++ b/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx
@@ -6,6 +6,7 @@ import LanceDbLogo from "@/media/vectordbs/lancedb.png";
 import WeaviateLogo from "@/media/vectordbs/weaviate.png";
 import QDrantLogo from "@/media/vectordbs/qdrant.png";
 import MilvusLogo from "@/media/vectordbs/milvus.png";
+import ZillizLogo from "@/media/vectordbs/zilliz.png";
 import System from "@/models/system";
 import paths from "@/utils/paths";
 import PineconeDBOptions from "@/components/VectorDBSelection/PineconeDBOptions";
@@ -14,6 +15,7 @@ import QDrantDBOptions from "@/components/VectorDBSelection/QDrantDBOptions";
 import WeaviateDBOptions from "@/components/VectorDBSelection/WeaviateDBOptions";
 import LanceDBOptions from "@/components/VectorDBSelection/LanceDBOptions";
 import MilvusOptions from "@/components/VectorDBSelection/MilvusDBOptions";
+import ZillizCloudOptions from "@/components/VectorDBSelection/ZillizCloudOptions";
 import showToast from "@/utils/toast";
 import { useNavigate } from "react-router-dom";
 import VectorDBItem from "@/components/VectorDBSelection/VectorDBItem";
@@ -68,6 +70,14 @@ export default function VectorDatabaseConnection({
       options: <PineconeDBOptions settings={settings} />,
       description: "100% cloud-based vector database for enterprise use cases.",
     },
+    {
+      name: "Zilliz Cloud",
+      value: "zilliz",
+      logo: ZillizLogo,
+      options: <ZillizCloudOptions settings={settings} />,
+      description:
+        "Cloud hosted vector database built for enterprise with SOC 2 compliance.",
+    },
     {
       name: "QDrant",
       value: "qdrant",
diff --git a/server/.env.example b/server/.env.example
index 26c51927c..23e20bb13 100644
--- a/server/.env.example
+++ b/server/.env.example
@@ -96,6 +96,11 @@ VECTOR_DB="lancedb"
 # MILVUS_USERNAME=
 # MILVUS_PASSWORD=
 
+# Enable all below if you are using vector database: Zilliz Cloud.
+# VECTOR_DB="zilliz"
+# ZILLIZ_ENDPOINT="https://sample.api.gcp-us-west1.zillizcloud.com"
+# ZILLIZ_API_TOKEN=api-token-here
+
 # CLOUD DEPLOYMENT VARIRABLES ONLY
 # AUTH_TOKEN="hunter2" # This is the password to your application if remote hosting.
 # STORAGE_DIR= # absolute filesystem path with no trailing slash
diff --git a/server/models/systemSettings.js b/server/models/systemSettings.js
index 1c4069ac9..90de463f0 100644
--- a/server/models/systemSettings.js
+++ b/server/models/systemSettings.js
@@ -63,6 +63,12 @@ const SystemSettings = {
             MilvusPassword: !!process.env.MILVUS_PASSWORD,
           }
         : {}),
+      ...(vectorDB === "zilliz"
+        ? {
+            ZillizEndpoint: process.env.ZILLIZ_ENDPOINT,
+            ZillizApiToken: process.env.ZILLIZ_API_TOKEN,
+          }
+        : {}),
       LLMProvider: llmProvider,
       ...(llmProvider === "openai"
         ? {
diff --git a/server/utils/helpers/index.js b/server/utils/helpers/index.js
index 2eed9057c..b72bb7977 100644
--- a/server/utils/helpers/index.js
+++ b/server/utils/helpers/index.js
@@ -19,6 +19,9 @@ function getVectorDbClass() {
     case "milvus":
       const { Milvus } = require("../vectorDbProviders/milvus");
       return Milvus;
+    case "zilliz":
+      const { Zilliz } = require("../vectorDbProviders/zilliz");
+      return Zilliz;
     default:
       throw new Error("ENV: No VECTOR_DB value found in environment!");
   }
diff --git a/server/utils/helpers/updateENV.js b/server/utils/helpers/updateENV.js
index f44b040b7..9e89047ff 100644
--- a/server/utils/helpers/updateENV.js
+++ b/server/utils/helpers/updateENV.js
@@ -199,6 +199,16 @@ const KEY_MAPPING = {
     checks: [isNotEmpty],
   },
 
+  // Zilliz Cloud Options
+  ZillizEndpoint: {
+    envKey: "ZILLIZ_ENDPOINT",
+    checks: [isValidURL],
+  },
+  ZillizApiToken: {
+    envKey: "ZILLIZ_API_TOKEN",
+    checks: [isNotEmpty],
+  },
+
   // Together Ai Options
   TogetherAiApiKey: {
     envKey: "TOGETHER_AI_API_KEY",
@@ -316,6 +326,7 @@ function supportedVectorDB(input = "") {
     "weaviate",
     "qdrant",
     "milvus",
+    "zilliz",
   ];
   return supported.includes(input)
     ? null
diff --git a/server/utils/vectorDbProviders/zilliz/index.js b/server/utils/vectorDbProviders/zilliz/index.js
new file mode 100644
index 000000000..b8493e1c2
--- /dev/null
+++ b/server/utils/vectorDbProviders/zilliz/index.js
@@ -0,0 +1,365 @@
+const {
+  DataType,
+  MetricType,
+  IndexType,
+  MilvusClient,
+} = require("@zilliz/milvus2-sdk-node");
+const { RecursiveCharacterTextSplitter } = require("langchain/text_splitter");
+const { v4: uuidv4 } = require("uuid");
+const { storeVectorResult, cachedVectorInformation } = require("../../files");
+const {
+  toChunks,
+  getLLMProvider,
+  getEmbeddingEngineSelection,
+} = require("../../helpers");
+
+// Zilliz is basically a copy of Milvus DB class with a different constructor
+// to connect to the cloud
+const Zilliz = {
+  name: "Zilliz",
+  connect: async function () {
+    if (process.env.VECTOR_DB !== "zilliz")
+      throw new Error("Zilliz::Invalid ENV settings");
+
+    const client = new MilvusClient({
+      address: process.env.ZILLIZ_ENDPOINT,
+      token: process.env.ZILLIZ_API_TOKEN,
+    });
+
+    const { isHealthy } = await client.checkHealth();
+    if (!isHealthy)
+      throw new Error(
+        "Zilliz::Invalid Heartbeat received - is the instance online?"
+      );
+
+    return { client };
+  },
+  heartbeat: async function () {
+    await this.connect();
+    return { heartbeat: Number(new Date()) };
+  },
+  totalVectors: async function () {
+    const { client } = await this.connect();
+    const { collection_names } = await client.listCollections();
+    const total = collection_names.reduce(async (acc, collection_name) => {
+      const statistics = await client.getCollectionStatistics({
+        collection_name,
+      });
+      return Number(acc) + Number(statistics?.data?.row_count ?? 0);
+    }, 0);
+    return total;
+  },
+  namespaceCount: async function (_namespace = null) {
+    const { client } = await this.connect();
+    const statistics = await client.getCollectionStatistics({
+      collection_name: _namespace,
+    });
+    return Number(statistics?.data?.row_count ?? 0);
+  },
+  namespace: async function (client, namespace = null) {
+    if (!namespace) throw new Error("No namespace value provided.");
+    const collection = await client
+      .getCollectionStatistics({ collection_name: namespace })
+      .catch(() => null);
+    return collection;
+  },
+  hasNamespace: async function (namespace = null) {
+    if (!namespace) return false;
+    const { client } = await this.connect();
+    return await this.namespaceExists(client, namespace);
+  },
+  namespaceExists: async function (client, namespace = null) {
+    if (!namespace) throw new Error("No namespace value provided.");
+    const { value } = await client
+      .hasCollection({ collection_name: namespace })
+      .catch((e) => {
+        console.error("Zilliz::namespaceExists", e.message);
+        return { value: false };
+      });
+    return value;
+  },
+  deleteVectorsInNamespace: async function (client, namespace = null) {
+    await client.dropCollection({ collection_name: namespace });
+    return true;
+  },
+  // Zilliz requires a dimension aspect for collection creation
+  // we pass this in from the first chunk to infer the dimensions like other
+  // providers do.
+  getOrCreateCollection: async function (client, namespace, dimensions = null) {
+    const isExists = await this.namespaceExists(client, namespace);
+    if (!isExists) {
+      if (!dimensions)
+        throw new Error(
+          `Zilliz:getOrCreateCollection Unable to infer vector dimension from input. Open an issue on Github for support.`
+        );
+
+      await client.createCollection({
+        collection_name: namespace,
+        fields: [
+          {
+            name: "id",
+            description: "id",
+            data_type: DataType.VarChar,
+            max_length: 255,
+            is_primary_key: true,
+          },
+          {
+            name: "vector",
+            description: "vector",
+            data_type: DataType.FloatVector,
+            dim: dimensions,
+          },
+          {
+            name: "metadata",
+            decription: "metadata",
+            data_type: DataType.JSON,
+          },
+        ],
+      });
+      await client.createIndex({
+        collection_name: namespace,
+        field_name: "vector",
+        index_type: IndexType.AUTOINDEX,
+        metric_type: MetricType.COSINE,
+      });
+      await client.loadCollectionSync({
+        collection_name: namespace,
+      });
+    }
+  },
+  addDocumentToNamespace: async function (
+    namespace,
+    documentData = {},
+    fullFilePath = null
+  ) {
+    const { DocumentVectors } = require("../../../models/vectors");
+    try {
+      let vectorDimension = null;
+      const { pageContent, docId, ...metadata } = documentData;
+      if (!pageContent || pageContent.length == 0) return false;
+
+      console.log("Adding new vectorized document into namespace", namespace);
+      const cacheResult = await cachedVectorInformation(fullFilePath);
+      if (cacheResult.exists) {
+        const { client } = await this.connect();
+        const { chunks } = cacheResult;
+        const documentVectors = [];
+        vectorDimension = chunks[0][0].values.length || null;
+
+        await this.getOrCreateCollection(client, namespace, vectorDimension);
+        for (const chunk of chunks) {
+          // Before sending to Pinecone and saving the records to our db
+          // we need to assign the id of each chunk that is stored in the cached file.
+          const newChunks = chunk.map((chunk) => {
+            const id = uuidv4();
+            documentVectors.push({ docId, vectorId: id });
+            return { id, vector: chunk.values, metadata: chunk.metadata };
+          });
+          const insertResult = await client.insert({
+            collection_name: namespace,
+            data: newChunks,
+          });
+
+          if (insertResult?.status.error_code !== "Success") {
+            throw new Error(
+              `Error embedding into Zilliz! Reason:${insertResult?.status.reason}`
+            );
+          }
+        }
+        await DocumentVectors.bulkInsert(documentVectors);
+        await client.flushSync({ collection_names: [namespace] });
+        return true;
+      }
+
+      const textSplitter = new RecursiveCharacterTextSplitter({
+        chunkSize:
+          getEmbeddingEngineSelection()?.embeddingMaxChunkLength || 1_000,
+        chunkOverlap: 20,
+      });
+      const textChunks = await textSplitter.splitText(pageContent);
+
+      console.log("Chunks created from document:", textChunks.length);
+      const LLMConnector = getLLMProvider();
+      const documentVectors = [];
+      const vectors = [];
+      const vectorValues = await LLMConnector.embedChunks(textChunks);
+
+      if (!!vectorValues && vectorValues.length > 0) {
+        for (const [i, vector] of vectorValues.entries()) {
+          if (!vectorDimension) vectorDimension = vector.length;
+          const vectorRecord = {
+            id: uuidv4(),
+            values: vector,
+            // [DO NOT REMOVE]
+            // LangChain will be unable to find your text if you embed manually and dont include the `text` key.
+            metadata: { ...metadata, text: textChunks[i] },
+          };
+
+          vectors.push(vectorRecord);
+          documentVectors.push({ docId, vectorId: vectorRecord.id });
+        }
+      } else {
+        throw new Error(
+          "Could not embed document chunks! This document will not be recorded."
+        );
+      }
+
+      if (vectors.length > 0) {
+        const chunks = [];
+        const { client } = await this.connect();
+        await this.getOrCreateCollection(client, namespace, vectorDimension);
+
+        console.log("Inserting vectorized chunks into Zilliz.");
+        for (const chunk of toChunks(vectors, 100)) {
+          chunks.push(chunk);
+          const insertResult = await client.insert({
+            collection_name: namespace,
+            data: chunk.map((item) => ({
+              id: item.id,
+              vector: item.values,
+              metadata: chunk.metadata,
+            })),
+          });
+
+          if (insertResult?.status.error_code !== "Success") {
+            throw new Error(
+              `Error embedding into Zilliz! Reason:${insertResult?.status.reason}`
+            );
+          }
+        }
+        await storeVectorResult(chunks, fullFilePath);
+        await client.flushSync({ collection_names: [namespace] });
+      }
+
+      await DocumentVectors.bulkInsert(documentVectors);
+      return true;
+    } catch (e) {
+      console.error(e);
+      console.error("addDocumentToNamespace", e.message);
+      return false;
+    }
+  },
+  deleteDocumentFromNamespace: async function (namespace, docId) {
+    const { DocumentVectors } = require("../../../models/vectors");
+    const { client } = await this.connect();
+    if (!(await this.namespaceExists(client, namespace))) return;
+    const knownDocuments = await DocumentVectors.where({ docId });
+    if (knownDocuments.length === 0) return;
+
+    const vectorIds = knownDocuments.map((doc) => doc.vectorId);
+    const queryIn = vectorIds.map((v) => `'${v}'`).join(",");
+    await client.deleteEntities({
+      collection_name: namespace,
+      expr: `id in [${queryIn}]`,
+    });
+
+    const indexes = knownDocuments.map((doc) => doc.id);
+    await DocumentVectors.deleteIds(indexes);
+
+    // Even after flushing Zilliz can take some time to re-calc the count
+    // so all we can hope to do is flushSync so that the count can be correct
+    // on a later call.
+    await client.flushSync({ collection_names: [namespace] });
+    return true;
+  },
+  performSimilaritySearch: async function ({
+    namespace = null,
+    input = "",
+    LLMConnector = null,
+    similarityThreshold = 0.25,
+  }) {
+    if (!namespace || !input || !LLMConnector)
+      throw new Error("Invalid request to performSimilaritySearch.");
+
+    const { client } = await this.connect();
+    if (!(await this.namespaceExists(client, namespace))) {
+      return {
+        contextTexts: [],
+        sources: [],
+        message: "Invalid query - no documents found for workspace!",
+      };
+    }
+
+    const queryVector = await LLMConnector.embedTextInput(input);
+    const { contextTexts, sourceDocuments } = await this.similarityResponse(
+      client,
+      namespace,
+      queryVector,
+      similarityThreshold
+    );
+
+    const sources = sourceDocuments.map((metadata, i) => {
+      return { ...metadata, text: contextTexts[i] };
+    });
+    return {
+      contextTexts,
+      sources: this.curateSources(sources),
+      message: false,
+    };
+  },
+  similarityResponse: async function (
+    client,
+    namespace,
+    queryVector,
+    similarityThreshold = 0.25
+  ) {
+    const result = {
+      contextTexts: [],
+      sourceDocuments: [],
+      scores: [],
+    };
+    const response = await client.search({
+      collection_name: namespace,
+      vectors: queryVector,
+    });
+    response.results.forEach((match) => {
+      if (match.score < similarityThreshold) return;
+      result.contextTexts.push(match.metadata.text);
+      result.sourceDocuments.push(match);
+      result.scores.push(match.score);
+    });
+    return result;
+  },
+  "namespace-stats": async function (reqBody = {}) {
+    const { namespace = null } = reqBody;
+    if (!namespace) throw new Error("namespace required");
+    const { client } = await this.connect();
+    if (!(await this.namespaceExists(client, namespace)))
+      throw new Error("Namespace by that name does not exist.");
+    const stats = await this.namespace(client, namespace);
+    return stats
+      ? stats
+      : { message: "No stats were able to be fetched from DB for namespace" };
+  },
+  "delete-namespace": async function (reqBody = {}) {
+    const { namespace = null } = reqBody;
+    const { client } = await this.connect();
+    if (!(await this.namespaceExists(client, namespace)))
+      throw new Error("Namespace by that name does not exist.");
+
+    const statistics = await this.namespace(client, namespace);
+    await this.deleteVectorsInNamespace(client, namespace);
+    const vectorCount = Number(statistics?.data?.row_count ?? 0);
+    return {
+      message: `Namespace ${namespace} was deleted along with ${vectorCount} vectors.`,
+    };
+  },
+  curateSources: function (sources = []) {
+    const documents = [];
+    for (const source of sources) {
+      const { metadata = {} } = source;
+      if (Object.keys(metadata).length > 0) {
+        documents.push({
+          ...metadata,
+          ...(source.hasOwnProperty("pageContent")
+            ? { text: source.pageContent }
+            : {}),
+        });
+      }
+    }
+
+    return documents;
+  },
+};
+
+module.exports.Zilliz = Zilliz;