From 35430d360915e842c7f20199b6f196ebcd70b70b Mon Sep 17 00:00:00 2001 From: Aman Rao <54672230+amanrao23@users.noreply.github.com> Date: Tue, 5 Nov 2024 03:09:39 +0530 Subject: [PATCH] feat: add `AzureCosmosDBNoSqlVectorStore` and `SimpleCosmosDBReader` (#1331) Co-authored-by: Alex Yang <himself65@outlook.com> --- .changeset/metal-cameras-argue.md | 6 + examples/cosmosdb/addPlainData.ts | 60 ++ examples/cosmosdb/loadVectorData.ts | 95 +++ examples/cosmosdb/queryVectorData.ts | 83 +++ examples/data/shortStories.json | Bin 0 -> 51312 bytes examples/package.json | 1 + packages/llamaindex/package.json | 1 + packages/llamaindex/src/readers/index.ts | 1 + .../AzureCosmosDBNoSqlVectorStore.ts | 363 +++++++++++ packages/llamaindex/src/vector-store/index.ts | 1 + .../TestableAzureCosmosDBNoSqlVectorStore.ts | 39 ++ packages/llamaindex/tests/package.json | 3 +- .../tests/utility/mockCosmosClient.ts | 55 ++ .../AzureCosmosDBNoSqlVectorStore.int.test.ts | 183 ++++++ .../AzureCosmosDBNoSqlVectorStore.test.ts | 98 +++ packages/readers/cosmosdb/package.json | 14 + packages/readers/package.json | 20 + packages/readers/src/cosmosdb.ts | 87 +++ pnpm-lock.yaml | 573 ++++++------------ unit/package.json | 3 +- unit/readers/SimpleCosmosDBReader.test.ts | 154 +++++ 21 files changed, 1467 insertions(+), 373 deletions(-) create mode 100644 .changeset/metal-cameras-argue.md create mode 100644 examples/cosmosdb/addPlainData.ts create mode 100644 examples/cosmosdb/loadVectorData.ts create mode 100644 examples/cosmosdb/queryVectorData.ts create mode 100644 examples/data/shortStories.json create mode 100644 packages/llamaindex/src/vector-store/AzureCosmosDBNoSqlVectorStore.ts create mode 100644 packages/llamaindex/tests/mocks/TestableAzureCosmosDBNoSqlVectorStore.ts create mode 100644 packages/llamaindex/tests/utility/mockCosmosClient.ts create mode 100644 packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.int.test.ts create mode 100644 packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.test.ts create mode 100644 packages/readers/cosmosdb/package.json create mode 100644 packages/readers/src/cosmosdb.ts create mode 100644 unit/readers/SimpleCosmosDBReader.test.ts diff --git a/.changeset/metal-cameras-argue.md b/.changeset/metal-cameras-argue.md new file mode 100644 index 000000000..c58a38a0d --- /dev/null +++ b/.changeset/metal-cameras-argue.md @@ -0,0 +1,6 @@ +--- +"llamaindex": patch +"@llamaindex/readers": patch +--- + +Feature/ Add AzureCosmosDBNoSqlVectorStore and SimpleCosmosDBReader diff --git a/examples/cosmosdb/addPlainData.ts b/examples/cosmosdb/addPlainData.ts new file mode 100644 index 000000000..bc32359ce --- /dev/null +++ b/examples/cosmosdb/addPlainData.ts @@ -0,0 +1,60 @@ +import { CosmosClient } from "@azure/cosmos"; +import { DefaultAzureCredential } from "@azure/identity"; +import * as dotenv from "dotenv"; +import * as fs from "fs"; +// Load environment variables from local .env file +dotenv.config(); + +const jsonFile = "./data/shortStories.json"; +const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT!; +const cosmosConnectionString = + process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING!; +const databaseName = + process.env.AZURE_COSMOSDB_DATABASE_NAME || "shortStoriesDatabase"; +const containerName = + process.env.AZURE_COSMOSDB_CONTAINER_NAME || "shortStoriesContainer"; + +async function addDocumentsToCosmosDB() { + if (!cosmosConnectionString && !cosmosEndpoint) { + throw new Error( + "Azure CosmosDB connection string or endpoint must be set.", + ); + } + + let cosmosClient: CosmosClient; + + const stories = JSON.parse(fs.readFileSync(jsonFile, "utf-8")); + + // initialize the cosmos client + if (cosmosConnectionString) { + cosmosClient = new CosmosClient(cosmosConnectionString); + } else { + cosmosClient = new CosmosClient({ + endpoint: cosmosEndpoint, + aadCredentials: new DefaultAzureCredential(), + }); + } + + // Create a new database and container if they don't exist + const { database } = await cosmosClient.databases.createIfNotExists({ + id: databaseName, + }); + const { container } = await database.containers.createIfNotExists({ + id: containerName, + partitionKey: "/id", + }); + + console.log( + `Data import started to the CosmosDB container ${containerName}.`, + ); + // Insert the short stories into the CosmosDB container + for (const story of stories) { + await container.items.create(story); + } + + console.log( + `Successfully imported data to the CosmosDB container ${containerName}.`, + ); +} + +addDocumentsToCosmosDB().catch(console.error); diff --git a/examples/cosmosdb/loadVectorData.ts b/examples/cosmosdb/loadVectorData.ts new file mode 100644 index 000000000..8c1653e92 --- /dev/null +++ b/examples/cosmosdb/loadVectorData.ts @@ -0,0 +1,95 @@ +import { CosmosClient } from "@azure/cosmos"; +import { DefaultAzureCredential } from "@azure/identity"; +import { + SimpleCosmosDBReader, + SimpleCosmosDBReaderLoaderConfig, +} from "@llamaindex/readers/cosmosdb"; +import * as dotenv from "dotenv"; +import { + AzureCosmosDBNoSqlVectorStore, + OpenAI, + OpenAIEmbedding, + Settings, + storageContextFromDefaults, + VectorStoreIndex, +} from "llamaindex"; +// Load environment variables from local .env file +dotenv.config(); + +const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT!; +const cosmosConnectionString = + process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING!; +const databaseName = + process.env.AZURE_COSMOSDB_DATABASE_NAME || "shortStoriesDatabase"; +const collectionName = + process.env.AZURE_COSMOSDB_CONTAINER_NAME || "shortStoriesContainer"; +const vectorCollectionName = + process.env.AZURE_COSMOSDB_VECTOR_CONTAINER_NAME || "vectorContainer"; + +// This exampple uses Azure OpenAI llm and embedding models +const llmInit = { + azure: { + apiVersion: process.env.AZURE_OPENAI_LLM_API_VERSION, + endpoint: process.env.AZURE_OPENAI_LLM_ENDPOINT, + apiKey: process.env.AZURE_OPENAI_LLM_API_KEY, + }, +}; + +const embedModelInit = { + azure: { + apiVersion: process.env.AZURE_OPENAI_EMBEDDING_API_VERSION, + endpoint: process.env.AZURE_OPENAI_EMBEDDING_ENDPOINT, + apiKey: process.env.AZURE_OPENAI_EMBEDDING_API_KEY, + }, +}; + +Settings.llm = new OpenAI(llmInit); +Settings.embedModel = new OpenAIEmbedding(embedModelInit); + +async function loadVectorData() { + if (!cosmosConnectionString && !cosmosEndpoint) { + throw new Error( + "Azure CosmosDB connection string or endpoint must be set.", + ); + } + + let cosmosClient: CosmosClient; + // initialize the cosmos client + if (cosmosConnectionString) { + cosmosClient = new CosmosClient(cosmosConnectionString); + } else { + cosmosClient = new CosmosClient({ + endpoint: cosmosEndpoint, + aadCredentials: new DefaultAzureCredential(), + }); + } + + const reader = new SimpleCosmosDBReader(cosmosClient); + // create a configuration object for the reader + const simpleCosmosReaderConfig: SimpleCosmosDBReaderLoaderConfig = { + databaseName, + containerName: collectionName, + fields: ["text"], + query: "SELECT c.id, c.text as text, c.metadata as metadata FROM c", + metadataFields: ["metadata"], + }; + + // load objects from cosmos and convert them into LlamaIndex Document objects + const documents = await reader.loadData(simpleCosmosReaderConfig); + // create Azure CosmosDB as a vector store + const vectorStore = new AzureCosmosDBNoSqlVectorStore({ + client: cosmosClient, + databaseName, + containerName: vectorCollectionName, + flatMetadata: false, + }); + + // Store the embeddings in the CosmosDB container + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { storageContext }); + console.log( + `Successfully created embeddings in the CosmosDB container ${vectorCollectionName}.`, + ); +} + +loadVectorData().catch(console.error); diff --git a/examples/cosmosdb/queryVectorData.ts b/examples/cosmosdb/queryVectorData.ts new file mode 100644 index 000000000..47b5badfc --- /dev/null +++ b/examples/cosmosdb/queryVectorData.ts @@ -0,0 +1,83 @@ +import { CosmosClient } from "@azure/cosmos"; +import { DefaultAzureCredential } from "@azure/identity"; +import * as dotenv from "dotenv"; +import { + AzureCosmosDBNoSQLConfig, + AzureCosmosDBNoSqlVectorStore, + OpenAI, + OpenAIEmbedding, + Settings, + VectorStoreIndex, +} from "llamaindex"; + +// Load environment variables from local .env file +dotenv.config(); + +const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT!; +const cosmosConnectionString = + process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING!; +const databaseName = + process.env.AZURE_COSMOSDB_DATABASE_NAME || "shortStoriesDatabase"; +const containerName = + process.env.AZURE_COSMOSDB_VECTOR_CONTAINER_NAME || "vectorContainer"; + +const llmInit = { + azure: { + apiVersion: process.env.AZURE_OPENAI_LLM_API_VERSION, + endpoint: process.env.AZURE_OPENAI_LLM_ENDPOINT, + apiKey: process.env.AZURE_OPENAI_LLM_API_KEY, + }, +}; + +const embedModelInit = { + azure: { + apiVersion: process.env.AZURE_OPENAI_EMBEDDING_API_VERSION, + endpoint: process.env.AZURE_OPENAI_EMBEDDING_ENDPOINT, + apiKey: process.env.AZURE_OPENAI_EMBEDDING_API_KEY, + }, +}; + +Settings.llm = new OpenAI(llmInit); +Settings.embedModel = new OpenAIEmbedding(embedModelInit); + +async function query() { + if (!cosmosConnectionString && !cosmosEndpoint) { + throw new Error( + "Azure CosmosDB connection string or endpoint must be set.", + ); + } + + let cosmosClient: CosmosClient; + // initialize the cosmos client + if (cosmosConnectionString) { + cosmosClient = new CosmosClient(cosmosConnectionString); + } else { + cosmosClient = new CosmosClient({ + endpoint: cosmosEndpoint, + aadCredentials: new DefaultAzureCredential(), + }); + } + + // configure the Azure CosmosDB NoSQL Vector Store + const dbConfig: AzureCosmosDBNoSQLConfig = { + client: cosmosClient, + databaseName, + containerName, + flatMetadata: false, + }; + const store = new AzureCosmosDBNoSqlVectorStore(dbConfig); + + // create an index from the Azure CosmosDB NoSQL Vector Store + const index = await VectorStoreIndex.fromVectorStore(store); + + // create a retriever and a query engine from the index + const retriever = index.asRetriever({ similarityTopK: 20 }); + const queryEngine = index.asQueryEngine({ retriever }); + + const result = await queryEngine.query({ + query: "Who all jog?", // Cosmo, Ludo, Maud, Hale, Constance, Garrison, Fergus, Rafe, Waverly, Rex, Loveday + }); + console.log(result.message); +} + +void query(); diff --git a/examples/data/shortStories.json b/examples/data/shortStories.json new file mode 100644 index 0000000000000000000000000000000000000000..ca385cf1973209d6fd61db71f43f18617cc751c2 GIT binary patch literal 51312 zcmc(oTXI}imY&~x6lpzFy^!o`hr1)X`iY{blB&g$EUHR&yBv;#L;^@Lk%`I+A<)qg zJqW+_5Ihdgq(|cK``6wl6C{v;V22%1C6d6o?7i3RU)S?r{%SJ$@BDu<`D{D;dHdOK zC!f7s50~@hc9@*4cFWVr#caKqEzTyh#mVY=aypw`P3B8~IyoQKr?cg=$<<<5Zs*JM z$*`OZ>-BImS)EPJ7OQLSd^Wkhm@Oxpi`itioUY!_*0a;eFyZo>XOq=>Ic#T>lhw~J zCa-qu`D(}YUb?!PExB&KoorW=_3Zs@Sa8$%V!qwZ*1YK%ubR$h%k5;i+%0BYb}?)x zSL@Z~e8YWP9&s`o)~wOLp3l#=E{WZ+qV2Fet;NnShsEZ_<Smz6uhuhP$L}T^UcR0D zv^$x*ugP%6JD01~ax<B(mTX|--PiN&MLU4W$$Wjf$*rEsYH>Q54%=swA1~&ccU=DB zvuAa{m$U6~I&23HxsIGe=gQgnYJKCuziNN~?c_^dJZx_M`sL|+*0NjA+9SAOvpeb6 zdC%`c16TCLe3SE?&o-asegDjV|Jhf6LSLxXcIokq8=P!so6wPkPnNT5=<Ms~tECk8 z(yL+p?%)39e+;m}`}uTM$39){*z$HgEH?|udAd5EoN(cWyCC1i?h?M>D9?Ap`Rv8y z^)S7dOpDsNZgK|Qc;B!-x$))=6yNL?TNz+EnO@8|!<_D7*qvWMjJhF|9r&*dF`2Gc z*D%&5%WSLLT)`Bp-PR?n)-YF*ci3!h#^tiPrx57t<#P3Y$kE6$ua_)qJIt4toY%dy z`VK~YwYt3AE$5KkWBuK5dOq7eM6VCSVm3_HJ0wHiW+&$t+2@)!-b^;z^^Au+gJsVV z5e_55xn4~<ni-qkM5azxyz6vwwL3js%wYQ;R;NhnHNW+8m<$rHVDZ(vJo^kKuz()( z<#M)G-Vh80h3ije>=qT_YF3lW;oYpgk&7-@Qsmd03HN*Ai(xaIFNYVCm$izE-I_&7 zSy_V@5Af91V=KuY7MH8d7IF^R?ReR8Hb1{OS+SDqixp4h2zZLCx|l7l_^Z#lnor+N zc2}qh&V<cvSC_+f^<whHY;!e-Gi90S#jxV6Ue=+$lg*<%{N44izMO2>x2Lvkdq+3O z-`S=YNeA`C_Tu`2E1w|UUksk?%jtIhe!f*)OFw)n+<#o3AUfa7&t{WX7sFyPTb@58 z+@GV1=Fnqx<)N(3&a!Dv15x6C!{lVQ*@j7`^DQdaW19|_vo&Y7*uguh==^kZ;l5|< z7n2{=bu-0wvmCDYd85^IxKcNrqU&Km8Sio>B{#q2JyQ<n6h7!e3k$(qyQ{^FAO2;B zotQ0TtLRHK1V6o=Z%$X2&(G%U^mH=2kxOBl)7|FX<ZQO!@(`K#uaI-~tn}DyQJ<>! zgT2AoFv@Ir@1n3a!xfsXuG-~H7oKV84x9bkzx?Yd>r}JMe!iHWXa`Ul{PT2m4WC{w z(e$ioee-By7v;WlspsqA>f&bd`sb^~Y8|nEfZhjp9arR^FK)uMD+Ca(M}fjt%J8s- zR&_SJ<<c|Q?3QaxV`)xzwqC8ywyUcblW(%`90f|!i%SqsXVdv9WZ-!xO8CiQH#?cF zImFA|+1VUx$Zs|m7}>IgK2%}qf{Ki(Q;Go7VY9=8BdUv4i9YOh4bx0uXn81z0mZO9 z-CWFB6=Zk)(NIAlQsUX9?f3!}!P0mJ7JLDIzz9O3OT>1Gnt(m!Az$sPE?~-9W9P-v zW(WngcRod<%(3|xnbnd5^f@4!8;((tL36DC9|`$pd$X7wC;6*I<ny$&<Do4W<$5#+ zF~(=BlIF{j&=-@h3%gwm9AQ!VWOu2qh^ieXm-9=0K1`)PAY{RboXn;GD^62YEv3W< z92n0=aHrVxAD~rP;5D@1VSz{c<K9ea;m<Jbr_axZDVLmJm_cvgwIIkF3A$Lxexn@& zpq<Z`13Y)aLeK_ZK~AhE))pvtsv%nKV7nEol5{M%%&^aD3(9L28*N7Jkt5vYl7m^V z7N9=0;$k(0KiTH&RBV8rdJ4@;>POIazhZwIlRf!ve}<DcbA;*Y0VwbdkaP;1DI0nx z`7c3U0^(I!L#5~pJavJbP2SHy8^ej_t@FkFQq+td@77Kl-;CzEfsT^_!>SzJ!7-)5 z&mz2m2p7ZY^4HtRW(LaSaBt8{C<7o&U^fdxu7LDW4Ncd7#4cF%^$Ze$Xrqs?y<M0K zkAxF%e9&$=`}t}%RUNEnu*PcnXdT^QG;n*=Jd<BdzOTpJPrR?kBO5P0inqTR*er(h zV+1EBmd<X97dy3i$5EkOb5vfi2pZCz5bJnsTQn)WemR`RW8pldG2*W!yh3;&G{?S0 zjzK=)?4}02VvSH23GqxY5}q2*1%6+FiiH;qYNJGUkX(};m#5%r$Rzc|1zE!~a4cp3 z7%)gLF4f>*l><Ic1mLbvJBpD<cWAI*O#Zk$nY~-`L)ObC*leu~_JLXO*xY_C^F&a3 zGP~eh>Kw4pvrBypHUNxfNkjLP)KBv*x*V$wR((Ijtwdd|fF4{Hn|3jq<EU}P>3X<k zxiMxu^kjxy<XEA>;V}bFum}-@TI&<Itiis%(EAze6E$*_y}ny*X5jQ@uGxeT-2+!c zBN;KGa)}ziGX;<w;B+9;7Qbw=y}6oQuR+NGzPH@HL5c7%aD~j|<2dd@V4O`D<y0pe zTE`@L$-CK2+>P$tp_HLqEb9~qfN<ta<x?%r30zR#;6mUogHO?K?<TY9#fsm%*b5|N z3)`$Oz&e*;3Lu2<#P$QeanHj|F-nn^_ozEGJO4jl5iDTo>lxq!4LE`dun>ekhiNz! zw)t#QN63YX`3K&MvYg0;O*vh0Jc3g|Fi7EYgY&lFMD)VoGgpn7^!Z=TX0^5{hU992 zLf5wWv@3SSgLhY$x&$fQLWE*GbsiMg>41|r1Rb8hXZj0)5?R|<tCN#sKE|IK{a<f@ z^XQZZEYOcAGev)Mg<?_b9vY!Q0Dg9c9~CFCjL|c2^eKj%u)u5!>Ld6durNLV9eE|3 zYT)2x9=N%Ouj}1%Q0}gFS67&2V>~i<2loBdCEGB`Vs;K0ey;}PGPoBTghl7|8g|Kj zI^PWN-mvam?K3K#6h~w+VE@Y+2_(x%t!FqmKf?pKKj-?;>KE+U<^t-Lk0C7sR^<|L zsh;7a9~LWLN`Dy|`kw)M7C0!`sK?^ZPhh_-4{X9~s0)2HlPajK^%k|6Xo-(u3wV&k z&rTM&kh<B*H%o|f>&9i@=^(gz0t1Zz<^e|qpLFv8Ud0{76}i6Up#*w>Am0uke-Evj zKeP|F?YEeSnEOuN$O$^@FT43d!G^h^a>5ttBbaG-38qoJv<2LblE*OV*qp&<T=VNw z{1P48fRfVkFD7qh8`xBlujeH0hg@R=%kFe3-AoBb$}tIyt+q1_lJwL6?H3Vn+-+~X ziswvODmIjTv(z7DTv&b`rv;UvvW*srpITV9Y^yF*g<Z?@D7)KFj3+#roZs%Yu>E>6 z5))|iGHis$^L5;s<IZS*z@g)M)DV3hT@MFydga1ThqY%K%bvrPl#mhA@|IvMq~FIL ziTIoaISeBFzwB_?Rx9ZUO4)4U;zfh=1QgHO2pU2J4c6}=eWDXr^Vt-5!xbGp@|$4< zAmt$PTfIAelM|PsF^FdgCBB$^j&9p6V-{*d!m+6GCSiRw;Iyvq;WYzCGj7uo;XF0{ zZ#1Or+KMn50UsC?QT3&43y)j`b~!@;P|=Sj?H;(k^3ci#J*4OBQv5X??5yccd+%|N z^NRu29|iblqDG2KgBcwqb@j*QqlO4Ap^k^;Qm_A=p*Ky^{Qa=dhx5QsPT0BUfNDGq zmi00pY?z%$3D9kRg46>+0-k*?gem+7Drm6@e=ITqPe%Ijj12mO3rdh+$E!GqSsJf4 z{7Z0(a8f6r4?+LVKCsh^xe5y{+~JeLcec3Uq2a%r2cGRR=-C})fAD0f;LSS}b9X+^ z!&EsioCY|DO%vpHlX$l1czqat6xG4eME789uDxn8C+xDp_a-P(+itd@pC$e-r|@i& zB@rNl)%Hw?ea1mR2@;6Y#LPS1{Os{*h^_)25vnXA3k+7+=f&d1ajqh50rw*fBy2ns z&rt_uI44kvRn;FDF)b(i6FCL`AnXdIUm7L|H30{=C>?Lf{6l1WX*hea7(ldN+zMI4 zwgMM~^*X_A{<hV{&~R%oT3n$~v|<DA1&WC>@MB;^axFXr)$Wt>Qs|RhhCjeB)vv+F z5FQ(MA>e{lMnuk6u^F|UXCwjISybZ5qfj-*osC8upD(zOcPcjj%$T%KGVE6VcjJ@2 zQw%|7%b!+qZ<cwY6X4T{3_n5N{BiGXk9MW=)g9sMJFh-!L%sq@1M&&Ep}9@GL6cBh z%DZr|<UTODTjIPmMLrad9Arnvh?tS?rX*fo&QEoNIAhFnykTgif{1M{ce~(bGswk3 zK>Ty;&StuvtGNFB+2^EDZvOn)A!j|CxcY;{T3A3lG2-8=-G>h%6}%q^v7V!iff0+{ zB`RrpGsR^vkE2RJTVUG6c90NN6m4@gKcAV0gag+zqpOoF!+*;oIJfE;J!1dKk}EQY z&fCt;c8g+nZpB=wKC|4m&BTaE#^@wtM@QcBr1tD|;G7tWs2DEX-GJgRP%R(%xDO!B zk=c%Gm4C!6-4PlkWvUke0@DCL6Gj(wXu8qEB2R_5CQV|TD`skg3&1gf=(v79J4<Ay zJlGlNT$zg6SL+U2^b-CL#~&4dqZl*L@|-3s_Pzx?J*>|?<QtSi1t`k7Nld03@T*<Y zAf(|JI}NBw(l`omVmPEw40sn~RN0r=VrBR;aI-ugIAcs))$aK3`x!Xe_%CY7Bh%Ui zQ=RYFE|$jwG4wiBTjd`d36|JcYBFXeKSZ0nRW|P`8@9z7^Aui;hlDr2_1Y8g%~?GX zKma@@rmt{UOy|k$)6(R7jC(H|eYe9^nofQIP;A)o>%M{qyxnifcpyy&DhGYDTM#aR zDM-n()virFxA$`%-c@ax4In!Slg(^*8J4<+aw&o6&P^qjjFcUQLOb-i!W#O(f_S~= zVKdz=l6gZ{VDa+8wQ&=vMc7Xt5(>^Q@ovhvUZ#SBHTSUG=?n)%mB;SLbG+vcd8)2h z!v2ZNu=wcR@<q5Bu9mXp9ZgW5+}E9xXggHR6$pxuJWQ5Kfy?>NuIrNUO<r*cs7G-b zU?f|ud-OTFuWuvC2RVl5FRX~V<gHOrQ~hHTrkH>k5gAg}Xg%q9#^1w`71C^F2k*I- zP>!D4(~xz4T~_@VhY9a0*S;E8dR$xmX!;llT2yeGO$#C*ff85Iwzn4pB{vOha1!0Q z)kdWL<+%Yi8Q^lb;!KU%mQ2NN5*bwV_@UJmd9I2`Tx_wzSag$R&pNi}?PtIy%6AGR z@o2!jmbP))9Ozs)SzFe4!t5(jPS_!-hC^=FQaxXtJ!fCfp$Gqj;$WZ_00QDJcG@HM zob;0W*ZF%q-A4P6o%BkWn|sy4c>RCdUwagn{IEKKFb8^oNK578-G8L3<AoiD!Iag| z1HBMyp7a?EoAL?>${CeLKb@b!zbe=0#Kg>%D5LC%zS-5;>>auT_COQxSWhY1Slw%g z@RsKA>;_B)zeDQ2hGsm89OiU}viO>?oBzg)oHU&Ad!C1c=x7Y!adl0B2472J96yK( zkYO55P4pfwY|7I%0*V3HMDoaVxv2tzp0l6Hrl8<2WZMKx`73K`DS{l5!g>aMVcsO@ z8+NTY@;+&Z0yyU?IqxaSxP2J(S5)0ZO77){ueC;IE{sr9iiRG?>m6$@9*|==d3)PR zSZm-e7fGU!<?dBlfP|o0Pd5}=?$#AU!jItwGYmIovrDs)U_~xE$l!FLC*e%e)h4JR za9m|6ae^Yagmk5-xCwLQ0~@j8CBaaw{H|=%xGEmQuK+;U0MK^@C{DpV$)#V1#VDKu zloBi(6@E8TTR8rTSAWIp4zmAd7DtaaOED@0+x18ovA9w5AuO;c?`|anKejW?*5&Ds zSA4!(@1B4gjFObk{i+JF@C;rr&#@<p)V=)ic_&K%1oBB;5xjDoFJ2<Q=PUTA`E{77 z9_b`IF)ZgF)TfafOTt(QQZ_7~n<ZEaGyS!QZ#>kpg#Kv0G_{k^FYCV8ZRW$~GNv?M zljVvWCg-Ld2};w)!Q3{nHyC>3+NQI`j4+E(peZnP1@&nMQ5W1xd=Rk>QPzsVD9x^} z!wIp2usMO81#zV%@fmo%pFj&vq<D10(QPOJC@gLUFi&Ew2Cc_je$Ikbxry2G{Tv)N zVo=I90U=~|mgoH1Iy7`oJHr#hB~RdtyZC{S>FfQg(Vd&ids$?E|J&JGW`2-4(6&NI zYau!sbhAB);{H<BC%uyfn_O866Q)71y%f(Nj-mI(gE_~(<Ckr*`BenqZ}53j7GoO0 zN~WsD%e&;dh&iffL0JK7ArmZ|=e|}k2#1zy8siF!rn1avI*t#OUl@pUp^L6L3I<ch zQ=}t`#PCi?NY&UiDM0-Jj761<RunBP-eUGw2L)3m)i8^D4FERGQb(s2rW4Kp9zi&S zT3C^=l7IZo-~9GJ{Ovzv6I#huRLG9k>KG48)fNTpzgl${o|fkp&aU7aG5bwr)CWV3 ztrRW<p+s48cy11eM_g5PCaOW_x^c<>Z-4kDc~1=fK}cfM4%A-Xse;NTjGBnB>KJ{k zAh#jdy+XnS88AzRbRX>0b(JZwa;-3WED>*I;h`Zp_*>Q<Ol5s{$1_r9m{S!{(4Xhs zuH>U^aaf~gz)Yx`VlzWqEh^eKpA<CEnW7#TriJUe?JBbw#`bmQ?OeDON@&U+A2vxz z+56)H{Eyc?qt5CY<Gwo3y>9u_iXzP|716BnxPti{|7DHu^{Mdz$R3nRPKUGq^*<2` zpr+=*2yXl+kHI5JVaR%e)f^)bmBE=(EocNGo+1${qqzp;wmPglModApjMxSGE%hCh zXu%!Ex<#j35x{T7yS}R1_$swbvDcnoBgeWO>xHh!2!6_OJxQUG#;r7CcMMf%ifcE# zzzXX5V!Vx$v95s<5ui;u!NR0<OdXrq-~weI9lTpK`e^Fj;SJtL-WCf>a*j@bqmIbu zDZ@nMdP*i+D2fnjM8P&QjshmWUCtx`o7(T+61IF}&82bnidqxtTfg}8XOr(LE?KH< z%+7EWC*~kx-EU=FbQbXb5xX(pq7ob%M&Omya`wfv>n%wWTi_s{;>LIEA**@rlxcu4 z*}_k&lhjG9#0X_Ed_4GIiA$nkLG2IA0GP_}-OL`J8QrJPzN}UDgxITwg+zAu(dunq z<Ke|eDfWtZHEeW8`TiK7?qw1l!U;8C&<MBvGJF?uR&<uqfzzGkmTx%><)NZ&9v{sy zghCJ{2ouBG&z4i;p%$IgVM6$pL@7bJprS!9KCiJ(&CHum>e?Iwe2x^^Y=e0DunH6e zjPaZ6ULP)^+*cUp8Sy)dsmkJaLu~LdBH!E-rCAMNP}%JSBvATcvhmRpx2Nj?Z6@C( zB3W?#KBB&{l5D#VBR&und<DYgICK#|F2(eGx~{?Cc+Im)cXlQxt+TNN6a9$i&mZ<H zaNZOzR{<Uz06mL3Ett)Nay%yVv7BS$hDTO(w_(aRaE>m4JitIr-+J{EUII$-03SC4 zPyS(k-a0r)HB@?fl1#~|`8$iY!V`GKpokb)Wzbv|3HN7{_uUe;Kt{8#E~&$Vi+Jx~ zE-*qw9?$hWbwF--garHi?(J&GWP5quAxz-l3IS(rzKrzd`YK57y0T&E#v-&e5{ckd z!DlMY6H?E;l^=B>dwzaKbi3S<@c9{r36NO*A0UOzh7f#n#^HQ$_6jwKxKvUpt642U zE8E#G2Y`DU@0#9H!$gE`pa%_zey=tv%kewcBK5z<i=4yi?;on-dbOJ3K&2$Zowi~O zf=0lvl0PY3wcg#WyPALafamaa)sH6@Mba1d13-x84!lB<2ox6PynyAqhW@G#hgvDL z7q49e=AlhwD1sTiEwH5iv^*THV=3<t6nGk?Xzfo=fd~Lr*ZgSFA}jonR0D9uRjR=b zvQ|1K0sIC^wse`0tNDRfSBe9V0rhN6RXoYDU9m;1q$<Y(jXB^A4g#=04CKLePG>JY zaxt_57m;Z33RTc!#c-CFKxfO-=(TZbqn8s$?I|j+haJbz=KXou-$5RV04O&gSI|Ra z$88u{NBSnA-a!b|9Y@<VMVAC@6A#MPP~}GHFTkrEd`Cjy=MEZ;O~?buo2XR$hY44- z7Kbuc0^xI>-Kxy-I->>u{x|SX51=OBRPoB3Xx2u?cDSl?t<(r%4TwrbduuhV(-Wyu zZzNPy^aiN954u;O^`i+gR!sEZ?*pPcQtLSCdqtM#@~&XP2q9Xupc~R^?&@Wi2kGXr z%hi4`n){BK4d3gu+wVh`jK4}T!Imdzu!nrYSR!rG2J>vl(NdETm)2okhQOh}@FZwM z)B5xp+(|R(QYOhE6KGt}dU+{M+L>V|pj<gj%07KXb0*M-u8$RwF+j;i>7$}sp>L#l zv{St@3G;}atJ`1@?p{BqA`CjCl#<3%jx9oJ`l#2@>`2ghns-@;tj_z=Mi$Scs>}%R z^C)g)S%%mi%{P1Ovge5V(8|ZD^P`gc1&yy;+RsYadw6@7s#Q3t*m4NBG(8}FI;RUJ zV3VY86<l%usfEvo>J??wFbUpdo~om+__W$?)5?~s6ml*7?XNFa=x1EbgCJDW72WA~ zA!CZ;Fw%f!wuTzkqGX=}?#fb|-&32fXl&uu1b14=3q)_~8Xv;P(nEx#<98(J;I8+` z1FL|o@n?ZR6&`v5^<H%~{6$%u`<3vYKPx(Za>t)PJFW}9w2iRQ(`|LQxuMJ54fI%I zFYFiHr9ZteWI5T?n4$avdp}XEqZgO777l~(@q=w(w17s`Tg+fHrw-XS@+@h4J8;lL zEEg0vexQ(@XmIcKM8l@pyPH_c=L1~<Q#XL!i{zHN3XQjl2U+}8+qY6ib4|fub?BAu z-mk!f!xiw2iVmB@)at_(>4uN1cClAgONuO$2kWa)u%F{7kz6Ab#M)b$pRNOwTr@Rp zCoIw|XP9Oz?|e$=`O*ErUrM#+tb7Ru+7O^7&eN!Z9v)*G$64sB8Qq|iuo%}GyF9Us z__n5u<tmhZ*W#cxeD-G8!wG_Uw@sRX)Z|+=@>t&6+0poYu%yll6COBQd8F55?)7%F z_j>xMTN*$%bXZgY0ZFAFtDwHr$aDoaa#6}6P(f;N44+FWi7gh1yK_ba>LTGo!NOrW zO?Aa+0Ll6}x}sc8inqo?q4<|nNdsjbhJe7mrraVbj{q9~)=f*v5Q7FPwYH(F7IT%T zg`pU6>Z8?2@L0Ob-XBj#<-+f0eFVWn#1_@x6@TcNhDU}U&el7M50Qlfcc+@^J>h+k z82i7~Qd(kP5uqSF<2c6~1fdVXITF+MHZ(_>$r+p|<OtNTJ`zZd^8le_EZs@*0rgTl zJyw37c0fo^y)#foFA19ea?h-F`Q3};nm~><MGuf;Mdzt~u(rOjUIZZmR}Lkqyvq{; z&lRiIiP@!dnp~+Z47Bd^Cnh(FpD_X%o$|Fh%-XF2&~dE2ES&0<<@1-*lQNwqq;-8F zi5yU>VzDd~G}soQV&}-Pw@uB*p0@;33I#z-!PGR&d)!WG@h;K4Rf-5IjX)HBoMCZQ zRwe%(uT|63FDFMY`ubhZsozf+s_W8bvA^^vR{Hw%F1tzyG-q*8S*l#u`9OlQ8Ju!i z)+*e&Rdid*3tf~Gi29Mfx$&d$3Yv9H=-JK584ht5=hS?qzaL>H6;bu;%H37Ed}Q!x z+Ww_?^%CW6E&HJo9^3Q+aZV@}ygp2E+?U+|-d@zbJR0dw{eo{Hge3YZCKBT7v+;|- z2G&EdQb&}V%M~b;xfDSY&H95P0RJ>l0T5(1)iN0)tc5`yx9+@wG?DVpn-wYl#|L>w zN9^G#8+TlKludq*;=vg!3l>R4W&>$)d$JYSi1J|KLryIqX<LNXVdYr1dRI`60XOMF zOTb|L&OB^dzT#@(IC0eFmz^-$#xlMf5cd(?sX#0On?B4+exUj+p0|pFf??QYJ_M5A zt`pPiu_MXiT@HL4w1nkM4ViN`oSAdGVH<wSewZ3@NfR--Q&)qMZRlS|uT_�ZGBK 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 literal 0 HcmV?d00001 diff --git a/examples/package.json b/examples/package.json index 85ad47e0a..aeee05af3 100644 --- a/examples/package.json +++ b/examples/package.json @@ -4,6 +4,7 @@ "version": "0.0.12", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", + "@azure/cosmos": "^4.1.1", "@azure/identity": "^4.4.1", "@datastax/astra-db-ts": "^1.4.1", "@llamaindex/core": "^0.4.0", diff --git a/packages/llamaindex/package.json b/packages/llamaindex/package.json index 3155e5448..19c08cdb0 100644 --- a/packages/llamaindex/package.json +++ b/packages/llamaindex/package.json @@ -23,6 +23,7 @@ "@anthropic-ai/sdk": "0.27.1", "@aws-crypto/sha256-js": "^5.2.0", "@aws-sdk/client-sso-oidc": "^3.679.0", + "@azure/cosmos": "^4.1.1", "@azure/identity": "^4.4.1", "@datastax/astra-db-ts": "^1.4.1", "@discoveryjs/json-ext": "^0.6.1", diff --git a/packages/llamaindex/src/readers/index.ts b/packages/llamaindex/src/readers/index.ts index 55b7a945a..903607085 100644 --- a/packages/llamaindex/src/readers/index.ts +++ b/packages/llamaindex/src/readers/index.ts @@ -4,6 +4,7 @@ export { type ResultType, } from "@llamaindex/cloud/reader"; export * from "@llamaindex/readers/assembly-ai"; +export * from "@llamaindex/readers/cosmosdb"; export * from "@llamaindex/readers/csv"; export * from "@llamaindex/readers/directory"; export * from "@llamaindex/readers/discord"; diff --git a/packages/llamaindex/src/vector-store/AzureCosmosDBNoSqlVectorStore.ts b/packages/llamaindex/src/vector-store/AzureCosmosDBNoSqlVectorStore.ts new file mode 100644 index 000000000..0493db134 --- /dev/null +++ b/packages/llamaindex/src/vector-store/AzureCosmosDBNoSqlVectorStore.ts @@ -0,0 +1,363 @@ +import { + Container, + CosmosClient, + VectorEmbeddingDataType, + VectorEmbeddingDistanceFunction, + VectorIndexType, + type ContainerRequest, + type CosmosClientOptions, + type DatabaseRequest, + type IndexingPolicy, + type VectorEmbeddingPolicy, + type VectorIndex, +} from "@azure/cosmos"; +import { DefaultAzureCredential, type TokenCredential } from "@azure/identity"; +import { BaseNode, MetadataMode } from "@llamaindex/core/schema"; +import { getEnv } from "@llamaindex/env"; +import { metadataDictToNode, nodeToMetadata } from "./utils.js"; + +import { + BaseVectorStore, + type VectorStoreBaseParams, + type VectorStoreQuery, + type VectorStoreQueryResult, +} from "./types.js"; + +/** Azure Cosmos DB for NoSQL database creation options. */ +export type AzureCosmosDBNoSqlCreateDatabaseOptions = Partial< + Omit<DatabaseRequest, "id"> +>; +/** Azure Cosmos DB for NoSQL container creation options. */ +export type AzureCosmosDBNoSqlCreateContainerOptions = Partial< + Omit<ContainerRequest, "id" | "vectorEmbeddingPolicy" | "indexingPolicy"> +>; + +export interface AzureCosmosDBNoSQLInitOptions { + readonly vectorEmbeddingPolicy?: VectorEmbeddingPolicy | undefined; + readonly indexingPolicy?: IndexingPolicy | undefined; + readonly createContainerOptions?: + | AzureCosmosDBNoSqlCreateContainerOptions + | undefined; + readonly createDatabaseOptions?: + | AzureCosmosDBNoSqlCreateDatabaseOptions + | undefined; +} + +/** + * Configuration options for the `AzureCosmosDBNoSQLVectorStore` constructor. + */ +export interface AzureCosmosDBNoSQLConfig + extends AzureCosmosDBNoSQLInitOptions { + readonly client?: CosmosClient; + readonly connectionString?: string; + readonly endpoint?: string; + readonly credentials?: TokenCredential; + readonly databaseName?: string; + readonly containerName?: string; + readonly textKey?: string; + readonly metadataKey?: string; + readonly flatMetadata?: boolean; + readonly idKey?: string; +} + +const USER_AGENT_PREFIX = "LlamaIndex-CDBNoSQL-VectorStore-JavaScript"; + +const DEFAULT_VECTOR_EMBEDDING_POLICY = { + vectorEmbeddings: [ + { + path: "/embedding", + dataType: VectorEmbeddingDataType.Float32, + distanceFunction: VectorEmbeddingDistanceFunction.Cosine, + dimensions: 1536, + }, + ], +}; + +const DEFAULT_VECTOR_INDEXING_POLICY: VectorIndex[] = [ + { path: "/embedding", type: VectorIndexType.QuantizedFlat }, +]; + +function parseConnectionString(connectionString: string): { + endpoint: string; + key: string; +} { + const parts = connectionString.split(";"); + let endpoint = ""; + let accountKey = ""; + + parts.forEach((part) => { + const [key, value] = part.split("="); + if (key && key.trim() === "AccountEndpoint") { + endpoint = value?.trim() ?? ""; + } else if ((key ?? "").trim() === "AccountKey") { + accountKey = value?.trim() ?? ""; + } + }); + + if (!endpoint || !accountKey) { + throw new Error( + "Invalid connection string: missing AccountEndpoint or AccountKey.", + ); + } + + return { endpoint, key: accountKey }; +} + +export class AzureCosmosDBNoSqlVectorStore extends BaseVectorStore { + storesText: boolean = true; + + private initPromise?: Promise<void>; + + private container!: Container; + + /** + * The CosmosDB client. This is either passed in or created. + */ + cosmosClient: CosmosClient; + /** + * The key to use for the text field in the CosmosDB container. + * Default: "text" + */ + textKey: string; + + flatMetadata: boolean = true; + + /** + * The key to use for the id field in the CosmosDB container. + * Default: "id" + */ + idKey: string; + + /** + * The key to use for the metadata field in the CosmosDB container. + * Default: "metadata" + */ + metadataKey: string; + + /** + * The key to use for the vector embedding field in the CosmosDB container. + * Default: "embedding" + */ + embeddingKey: string; + + private initialize: () => Promise<void>; + + client(): unknown { + return this.cosmosClient; + } + + constructor(dbConfig: AzureCosmosDBNoSQLConfig & VectorStoreBaseParams) { + super(dbConfig); + const connectionString = + dbConfig.connectionString ?? + getEnv("AZURE_COSMOSDB_NOSQL_CONNECTION_STRING"); + + const endpoint = + dbConfig.endpoint ?? getEnv("AZURE_COSMOSDB_NOSQL_ENDPOINT"); + + if (!dbConfig.client && !connectionString && !endpoint) { + throw new Error( + "CosmosDB client, connection string or endpoint must be set in the configuration.", + ); + } + + if (!dbConfig.client) { + if (connectionString) { + const { endpoint, key } = parseConnectionString(connectionString); + this.cosmosClient = new CosmosClient({ + endpoint, + key, + userAgentSuffix: USER_AGENT_PREFIX, + } as CosmosClientOptions); + } else { + // Use managed identity + this.cosmosClient = new CosmosClient({ + endpoint, + aadCredentials: dbConfig.credentials ?? new DefaultAzureCredential(), + userAgentSuffix: USER_AGENT_PREFIX, + } as CosmosClientOptions); + } + } else { + this.cosmosClient = dbConfig.client; + } + + const client = this.cosmosClient; + const databaseName = dbConfig.databaseName ?? "vectorSearchDB"; + const containerName = dbConfig.containerName ?? "vectorSearchContainer"; + this.idKey = dbConfig.idKey ?? "id"; + this.textKey = dbConfig.textKey ?? "text"; + this.flatMetadata = dbConfig.flatMetadata ?? true; + this.metadataKey = dbConfig.metadataKey ?? "metadata"; + const vectorEmbeddingPolicy = + dbConfig.vectorEmbeddingPolicy ?? DEFAULT_VECTOR_EMBEDDING_POLICY; + const indexingPolicy: IndexingPolicy = dbConfig.indexingPolicy ?? { + vectorIndexes: DEFAULT_VECTOR_INDEXING_POLICY, + }; + + this.embeddingKey = + vectorEmbeddingPolicy.vectorEmbeddings?.[0]?.path?.slice(1) ?? ""; + + if (!this.embeddingKey) { + throw new Error( + "AzureCosmosDBNoSQLVectorStore requires a valid vectorEmbeddings path", + ); + } + + // Deferring initialization to the first call to `initialize` + this.initialize = () => { + if (this.initPromise === undefined) { + this.initPromise = this.init(client, databaseName, containerName, { + vectorEmbeddingPolicy, + indexingPolicy, + createContainerOptions: dbConfig.createContainerOptions, + createDatabaseOptions: dbConfig.createDatabaseOptions, + }).catch((error) => { + console.error( + "Error during AzureCosmosDBNoSQLVectorStore initialization", + error, + ); + }); + } + return this.initPromise; + }; + } + + /** + * Adds document to the CosmosDB container. + * + * @returns an array of document ids which were added + */ + async add(nodes: BaseNode[]): Promise<string[]> { + await this.initialize(); + if (!nodes || nodes.length === 0) { + return []; + } + + const docs = nodes.map((node) => { + const metadata = nodeToMetadata( + node, + true, + this.textKey, + this.flatMetadata, + ); + + return { + [this.idKey]: node.id_, + [this.embeddingKey]: node.getEmbedding(), + [this.textKey]: node.getContent(MetadataMode.NONE) || "", + [this.metadataKey]: metadata, + }; + }); + + const ids: string[] = []; + const results = await Promise.allSettled( + docs.map((doc) => this.container.items.create(doc)), + ); + for (const result of results) { + if (result.status === "fulfilled") { + ids.push(result.value.resource?.id ?? ""); + } else { + ids.push("error: could not create item"); + } + } + return ids; + } + + /** + * Delete a document from the CosmosDB container. + * + * @param refDocId - The id of the document to delete + * @param deleteOptions - Any options to pass to the container.item.delete function + * @returns Promise that resolves if the delete query did not throw an error. + */ + async delete(refDocId: string, deleteOptions?: object): Promise<void> { + await this.initialize(); + await this.container.item(refDocId).delete(deleteOptions); + } + + /** + * Performs a vector similarity search query in the CosmosDB container. + * + * @param query VectorStoreQuery + * @returns List of nodes along with similarityScore + */ + async query( + query: VectorStoreQuery, + options?: object, + ): Promise<VectorStoreQueryResult> { + await this.initialize(); + const params = { + vector: query.queryEmbedding!, + k: query.similarityTopK, + }; + + const nodes: BaseNode[] = []; + const ids: string[] = []; + const similarities: number[] = []; + const queryResults = await this.container.items + .query({ + query: + "SELECT TOP @k c[@id] as id, c[@text] as text, c[@metadata] as metadata, VectorDistance(c[@embeddingKey],@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c[@embeddingKey],@embedding)", + parameters: [ + { name: "@k", value: params.k }, + { name: "@id", value: this.idKey }, + { name: "@text", value: this.textKey }, + { name: "@metadata", value: this.metadataKey }, + { name: "@embedding", value: params.vector }, + { name: "@embeddingKey", value: this.embeddingKey }, + ], + }) + .fetchAll(); + + for (const item of queryResults.resources) { + const node = metadataDictToNode(item["metadata"], { + fallback: { + id_: item["id"], + text: item["text"], + ...item["metadata"], + }, + }); + node.setContent(item["text"]); + const nodeId = item["id"]; + const nodeScore = item["SimilarityScore"]; + nodes.push(node); + ids.push(nodeId); + similarities.push(nodeScore); + } + + const result = { + nodes, + similarities, + ids, + }; + return result; + } + + /** + * Initialize the CosmosDB container. + */ + private async init( + client: CosmosClient, + databaseName: string, + containerName: string, + initOptions: AzureCosmosDBNoSQLInitOptions, + ): Promise<void> { + const { database } = await client.databases.createIfNotExists({ + ...(initOptions?.createDatabaseOptions ?? {}), + id: databaseName, + }); + + const { container } = await database.containers.createIfNotExists({ + ...(initOptions?.createContainerOptions ?? { + partitionKey: { paths: ["/id"] }, + }), + indexingPolicy: initOptions.indexingPolicy || { + vectorIndexes: DEFAULT_VECTOR_INDEXING_POLICY, + }, + vectorEmbeddingPolicy: + initOptions?.vectorEmbeddingPolicy || DEFAULT_VECTOR_EMBEDDING_POLICY, + id: containerName, + }); + this.container = container; + } +} diff --git a/packages/llamaindex/src/vector-store/index.ts b/packages/llamaindex/src/vector-store/index.ts index f01bed7a5..90eac71d0 100644 --- a/packages/llamaindex/src/vector-store/index.ts +++ b/packages/llamaindex/src/vector-store/index.ts @@ -1,4 +1,5 @@ export * from "./AstraDBVectorStore.js"; +export * from "./AzureCosmosDBNoSqlVectorStore.js"; export * from "./ChromaVectorStore.js"; export * from "./MilvusVectorStore.js"; export * from "./MongoDBAtlasVectorStore.js"; diff --git a/packages/llamaindex/tests/mocks/TestableAzureCosmosDBNoSqlVectorStore.ts b/packages/llamaindex/tests/mocks/TestableAzureCosmosDBNoSqlVectorStore.ts new file mode 100644 index 000000000..cc028bcec --- /dev/null +++ b/packages/llamaindex/tests/mocks/TestableAzureCosmosDBNoSqlVectorStore.ts @@ -0,0 +1,39 @@ +import type { BaseNode } from "@llamaindex/core/schema"; +import type { Mocked } from "vitest"; +import { AzureCosmosDBNoSqlVectorStore } from "../../src/vector-store.js"; + +export class TestableAzureCosmosDBNoSqlVectorStore extends AzureCosmosDBNoSqlVectorStore { + public nodes: BaseNode[] = []; + public client; + + private fakeTimeout = (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)); + }; + + public async add(nodes: BaseNode[]): Promise<string[]> { + this.nodes.push(...nodes); + await this.fakeTimeout(100); + for (const node of nodes) { + await this.client.databases.containers.items.create(node); + } + return nodes.map((node) => node.id_); + } + + public async delete(nodeId: string): Promise<void> { + await this.client.databases.containers.item(nodeId).delete(); + } + + constructor(config: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + client: Mocked<any>; + endpoint: string; + idKey: string; + textKey: string; + metadataKey: string; + }) { + super(config); + this.client = config.client; + this.client.databases.createIfNotExists(); + this.client.databases.containers.createIfNotExists(); + } +} diff --git a/packages/llamaindex/tests/package.json b/packages/llamaindex/tests/package.json index 03798bd09..28c53e921 100644 --- a/packages/llamaindex/tests/package.json +++ b/packages/llamaindex/tests/package.json @@ -10,6 +10,7 @@ "@faker-js/faker": "^9.0.1", "llamaindex": "workspace:*", "msw": "^2.6.0", - "vitest": "^2.0.5" + "vitest": "^2.0.5", + "dotenv": "^16.4.5" } } diff --git a/packages/llamaindex/tests/utility/mockCosmosClient.ts b/packages/llamaindex/tests/utility/mockCosmosClient.ts new file mode 100644 index 000000000..ce525a134 --- /dev/null +++ b/packages/llamaindex/tests/utility/mockCosmosClient.ts @@ -0,0 +1,55 @@ +// mockCosmosClient.ts +import { vi } from "vitest"; + +export const createMockClient = (mockData?: unknown[]) => { + let id = 0; + const client = { + database: vi.fn().mockReturnValue({ + container: vi.fn().mockReturnValue({ + items: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + create: vi.fn().mockImplementation((doc: any) => ({ + resource: { id: doc.id ?? `${id++}` }, + })), + query: vi.fn().mockReturnThis(), + fetchAll: vi.fn().mockImplementation(() => ({ + resources: mockData + ? mockData + : Array(id) + .fill(0) + .map((_, i) => ({ id: i })), + })), + }, + item: vi.fn().mockReturnThis(), + delete: vi.fn(), + }), + }), + databases: { + createIfNotExists: vi.fn().mockReturnThis(), + get database() { + return this; + }, + containers: { + createIfNotExists: vi.fn().mockReturnThis(), + get container() { + return this; + }, + items: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + create: vi.fn().mockImplementation((doc: any) => ({ + resource: { id: doc.id ?? `${id++}` }, + })), + query: vi.fn().mockReturnThis(), + fetchAll: vi.fn().mockImplementation(() => ({ + resources: Array(id) + .fill(0) + .map((_, i) => ({ id: i })), + })), + }, + item: vi.fn().mockReturnThis(), + delete: vi.fn(), + }, + }, + }; + return client; +}; diff --git a/packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.int.test.ts b/packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.int.test.ts new file mode 100644 index 000000000..c93433781 --- /dev/null +++ b/packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.int.test.ts @@ -0,0 +1,183 @@ +import { + CosmosClient, + VectorEmbeddingDataType, + VectorEmbeddingDistanceFunction, + VectorIndexType, +} from "@azure/cosmos"; +import { DefaultAzureCredential } from "@azure/identity"; +import * as dotenv from "dotenv"; +import { + AzureCosmosDBNoSqlVectorStore, + Document, + OpenAI, + OpenAIEmbedding, + Settings, + VectorStoreQueryMode, + type AzureCosmosDBNoSQLConfig, + type VectorStoreQueryResult, +} from "llamaindex"; +import { beforeEach, describe, expect, it } from "vitest"; +dotenv.config(); +/* + * To run this test, you need have an Azure Cosmos DB for NoSQL instance + * running. You can deploy a free version on Azure Portal without any cost, + * following this guide: + * https://learn.microsoft.com/azure/cosmos-db/nosql/vector-search + * + * You do not need to create a database or collection, it will be created + * automatically by the test. + * + * Once you have the instance running, you need to set the following environment + * variables before running the test: + * - AZURE_COSMOSDB_NOSQL_CONNECTION_STRING or AZURE_COSMOSDB_NOSQL_ENDPOINT + * - AZURE_OPENAI_LLM_API_VERSION + * - AZURE_OPENAI_LLM_ENDPOINT + * - AZURE_OPENAI_LLM_API_KEY + * - AZURE_OPENAI_EMBEDDING_API_VERSION + * - AZURE_OPENAI_EMBEDDING_ENDPOINT + * - AZURE_OPENAI_EMBEDDING_API_KEY + * + * To use regular OpenAI instead of Azure OpenAI, configure the Settings.llm and Settings.embedModel accordingly. + */ + +const DATABASE_NAME = "llamaIndexTestDatabase"; +const CONTAINER_NAME = "testContainer"; +let client: CosmosClient; + +const llmInit = { + azure: { + apiVersion: process.env.AZURE_OPENAI_LLM_API_VERSION, + endpoint: process.env.AZURE_OPENAI_LLM_ENDPOINT, + apiKey: process.env.AZURE_OPENAI_LLM_API_KEY, + }, +}; + +const embedModelInit = { + azure: { + apiVersion: process.env.AZURE_OPENAI_EMBEDDING_API_VERSION, + endpoint: process.env.AZURE_OPENAI_EMBEDDING_ENDPOINT, + apiKey: process.env.AZURE_OPENAI_EMBEDDING_API_KEY, + }, +}; + +Settings.llm = new OpenAI(llmInit); +Settings.embedModel = new OpenAIEmbedding(embedModelInit); +// This test is skipped because it requires an Azure Cosmos DB instance and OpenAI API keys +describe.skip("AzureCosmosDBNoSQLVectorStore", () => { + beforeEach(async () => { + if (process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING) { + client = new CosmosClient( + process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING, + ); + } else if (process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT) { + client = new CosmosClient({ + endpoint: process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT, + aadCredentials: new DefaultAzureCredential(), + }); + } else { + throw new Error( + "Please set the environment variable AZURE_COSMOSDB_NOSQL_CONNECTION_STRING or AZURE_COSMOSDB_NOSQL_ENDPOINT", + ); + } + + // Make sure the database does not exists + try { + await client.database(DATABASE_NAME).delete(); + } catch { + // Ignore error if the database does not exist + } + }); + it("perform query", async () => { + const config: AzureCosmosDBNoSQLConfig = { + idKey: "name", + textKey: "customText", + metadataKey: "customMetadata", + client: client, + databaseName: DATABASE_NAME, + containerName: CONTAINER_NAME, + createContainerOptions: { + throughput: 1000, + partitionKey: { paths: ["/key"] }, + }, + vectorEmbeddingPolicy: { + vectorEmbeddings: [ + { + path: "/vector", + dataType: VectorEmbeddingDataType.Float32, + distanceFunction: VectorEmbeddingDistanceFunction.Euclidean, + dimensions: 1000, + }, + ], + }, + indexingPolicy: { + indexingMode: "consistent", + automatic: true, + includedPaths: [ + { + path: "/*", + }, + ], + excludedPaths: [ + { + path: "/_etag/?", + }, + { + path: "/metadata/?", + }, + ], + vectorIndexes: [ + { + path: "/vector", + type: VectorIndexType.QuantizedFlat, + }, + ], + }, + }; + + const vectorStore = new AzureCosmosDBNoSqlVectorStore(config); + + const embeddings = await Settings.embedModel.getTextEmbeddings([ + "This book is about politics", + "Cats sleeps a lot.", + "Sandwiches taste good.", + "The house is open", + "Sandwich", + ]); + + expect(vectorStore).toBeDefined(); + await vectorStore.add([ + new Document({ + id_: "1", + text: "This book is about politics", + embedding: embeddings[0], + metadata: { key: "politics" }, + }), + new Document({ + id_: "2", + text: "Cats sleeps a lot.", + embedding: embeddings[1], + metadata: { key: "cats" }, + }), + new Document({ + id_: "3", + text: "Sandwiches taste good.", + embedding: embeddings[2], + metadata: { key: "sandwiches" }, + }), + new Document({ + id_: "4", + text: "The house is open", + embedding: embeddings[3], + metadata: { key: "house" }, + }), + ]); + + const results: VectorStoreQueryResult = await vectorStore.query({ + queryEmbedding: embeddings[4] || [], + similarityTopK: 1, + mode: VectorStoreQueryMode.DEFAULT, + }); + expect(results.ids.length).toEqual(1); + expect(results.ids[0]).toEqual("3"); + }, 1000000); +}); diff --git a/packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.test.ts b/packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.test.ts new file mode 100644 index 000000000..88a90802e --- /dev/null +++ b/packages/llamaindex/tests/vector-stores/AzureCosmosDBNoSqlVectorStore.test.ts @@ -0,0 +1,98 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { BaseNode } from "@llamaindex/core/schema"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { TestableAzureCosmosDBNoSqlVectorStore } from "../mocks/TestableAzureCosmosDBNoSqlVectorStore.js"; +import { createMockClient } from "../utility/mockCosmosClient.js"; // Import the mock client + +const createNodes = (n: number) => { + const nodes: BaseNode[] = []; + for (let i = 0; i < n; i += 1) { + nodes.push({ + id_: `node-${i}`, + getEmbedding: () => [0.1, 0.2, 0.3, 0.4], + getContent: () => `content ${i}`, + } as unknown as BaseNode); + } + return nodes; +}; + +beforeEach(() => { + vi.clearAllMocks(); +}); + +describe("AzureCosmosDBNoSqlVectorStore Tests", () => { + it("should initialize correctly", async () => { + const client = createMockClient(); + const store = new TestableAzureCosmosDBNoSqlVectorStore({ + client: client as any, + endpoint: "https://example.com", + idKey: "id", + textKey: "text", + metadataKey: "metadata", + }); + + await store.add(createNodes(10)); + + expect(store).toBeDefined(); + + expect(client.databases.createIfNotExists).toHaveBeenCalledTimes(1); + expect(client.databases.containers.createIfNotExists).toHaveBeenCalledTimes( + 1, + ); + }); + + it("should add nodes", async () => { + const client = createMockClient(); + const store = new TestableAzureCosmosDBNoSqlVectorStore({ + client: client as any, + endpoint: "https://example.com", + idKey: "id", + textKey: "text", + metadataKey: "metadata", + }); + + expect(store).toBeDefined(); + + const nodes = createNodes(1500); + await store.add(nodes); + + expect(client.databases.containers.items.create).toHaveBeenCalledTimes( + 1500, + ); + }); + + it("should delete nodes", async () => { + const client = createMockClient(); + const store = new TestableAzureCosmosDBNoSqlVectorStore({ + client: client as any, + endpoint: "https://example.com", + idKey: "id", + textKey: "text", + metadataKey: "metadata", + }); + + const nodes = createNodes(10); + await store.add(nodes); + + await store.delete("node-0"); + + expect(client.databases.containers.item().delete).toHaveBeenCalledTimes(1); + }); + + it("should use specified IDs", async () => { + const client = createMockClient(); + const store = new TestableAzureCosmosDBNoSqlVectorStore({ + client: client as any, + endpoint: "https://example.com", + idKey: "id", + textKey: "text", + metadataKey: "metadata", + }); + + expect(store).toBeDefined(); + + const result = await store.add(createNodes(2)); + expect(client.databases.containers.items.create).toHaveBeenCalledTimes(2); + expect(result).toEqual(["node-0", "node-1"]); + }); +}); diff --git a/packages/readers/cosmosdb/package.json b/packages/readers/cosmosdb/package.json new file mode 100644 index 000000000..10dbf8b62 --- /dev/null +++ b/packages/readers/cosmosdb/package.json @@ -0,0 +1,14 @@ +{ + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "edge-light": "./dist/index.edge-light.js", + "workerd": "./dist/index.workerd.js", + "default": "./dist/index.js" + } + }, + "private": true +} diff --git a/packages/readers/package.json b/packages/readers/package.json index c08ca7449..98fbeb6e5 100644 --- a/packages/readers/package.json +++ b/packages/readers/package.json @@ -24,6 +24,24 @@ "default": "./assembly-ai/dist/index.js" } }, + "./cosmosdb": { + "edge-light": { + "types": "./cosmosdb/dist/index.edge-light.d.ts", + "default": "./cosmosdb/dist/index.edge-light.js" + }, + "workerd": { + "types": "./cosmosdb/dist/index.workerd.d.ts", + "default": "./cosmosdb/dist/index.workerd.js" + }, + "require": { + "types": "./cosmosdb/dist/index.d.cts", + "default": "./cosmosdb/dist/index.cjs" + }, + "import": { + "types": "./cosmosdb/dist/index.d.ts", + "default": "./cosmosdb/dist/index.js" + } + }, "./csv": { "edge-light": { "types": "./csv/dist/index.edge-light.d.ts", @@ -243,6 +261,7 @@ }, "files": [ "assembly-ai", + "cosmosdb", "csv", "directory", "discord", @@ -279,6 +298,7 @@ "@llamaindex/env": "workspace:*" }, "dependencies": { + "@azure/cosmos": "^4.1.1", "@discordjs/rest": "^2.3.0", "@discoveryjs/json-ext": "^0.6.1", "assemblyai": "^4.7.0", diff --git a/packages/readers/src/cosmosdb.ts b/packages/readers/src/cosmosdb.ts new file mode 100644 index 000000000..6a8e4f6c4 --- /dev/null +++ b/packages/readers/src/cosmosdb.ts @@ -0,0 +1,87 @@ +import type { CosmosClient, SqlQuerySpec } from "@azure/cosmos"; +import type { Metadata } from "@llamaindex/core/schema"; +import { type BaseReader, Document } from "@llamaindex/core/schema"; + +export type SimpleCosmosDBReaderLoaderConfig = { + /** + * The name of the database to read. + */ + databaseName: string; + /** + * The name of the container to read. + */ + containerName: string; + /** + * An array of field names to retrieve from each document. Defaults to ["text"]. + */ + fields?: string[]; + /** + * The separator to join multiple field values. Defaults to an empty string. + */ + fieldSeparator?: string; + /** + * A custom query to filter the documents. Defaults to `SELECT * FROM c`. + */ + query?: string | SqlQuerySpec; + /** + * An optional array of metadata field names. If specified extracts this information as metadata. + */ + metadataFields?: string[]; +}; + +/** + * Read data from CosmosDB. + */ +export class SimpleCosmosDBReader implements BaseReader { + /** + * The CosmosDB client. + */ + private client: CosmosClient; + + constructor(client: CosmosClient) { + this.client = client; + } + + /** + * Loads data from a Cosmos DB container + * @returns {Promise<Document[]>} + */ + public async loadData( + config: SimpleCosmosDBReaderLoaderConfig, + ): Promise<Document[]> { + if (!config.databaseName || !config.containerName) { + throw new Error("databaseName and containerName are required"); + } + const database = this.client.database(config.databaseName); + const container = database.container(config.containerName); + const query = config.query || "SELECT * FROM c"; + const fields = config.fields || ["text"]; + const fieldSeparator = config.fieldSeparator || ""; + const metadataFields = config.metadataFields; + + try { + let res = await container.items.query(query).fetchAll(); + const documents: Document[] = []; + + for (const item of res.resources) { + const texts: Array<string | string[]> = fields.map( + (name) => item[name], + ); + const flattenedTexts = texts.flat(); + const text = flattenedTexts.join(fieldSeparator); + + let metadata: Metadata = {}; + if (metadataFields) { + metadata = Object.fromEntries( + metadataFields.map((name) => [name, item[name]]), + ); + } + documents.push(new Document({ id_: item.id, text, metadata })); + } + + return documents; + } catch (error) { + throw new Error(`Error loading data from Cosmos DB: ${error}`); + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c70e03397..7b9098d88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,7 +62,7 @@ importers: dependencies: '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/remark-plugin-npm2yarn': specifier: 3.5.2 version: 3.5.2 @@ -96,16 +96,16 @@ importers: devDependencies: '@docusaurus/module-type-aliases': specifier: 3.5.2 - version: 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@5.12.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3) + version: 3.5.2(@algolia/client-search@5.12.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3) '@docusaurus/theme-classic': specifier: 3.5.2 - version: 3.5.2(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + version: 3.5.2(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/types': specifier: 3.5.2 - version: 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tsconfig/docusaurus': specifier: 2.0.3 version: 2.0.3 @@ -174,10 +174,10 @@ importers: version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@vercel/functions': specifier: ^1.5.0 - version: 1.5.0(@aws-sdk/credential-provider-web-identity@3.679.0) + version: 1.5.0(@aws-sdk/credential-provider-web-identity@3.679.0(@aws-sdk/client-sts@3.682.0)) ai: specifier: ^3.4.31 - version: 3.4.31(openai@4.69.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) + version: 3.4.31(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -258,7 +258,7 @@ importers: version: 1.22.2 shiki-magic-move: specifier: ^0.5.0 - version: 0.5.0(react@18.3.1)(shiki@1.22.2)(vue@3.5.12(typescript@5.6.3)) + version: 0.5.0(react@18.3.1)(shiki@1.22.2)(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3)) swr: specifier: ^2.2.5 version: 2.2.5(react@18.3.1) @@ -341,6 +341,9 @@ importers: '@aws-crypto/sha256-js': specifier: ^5.2.0 version: 5.2.0 + '@azure/cosmos': + specifier: ^4.1.1 + version: 4.1.1 '@azure/identity': specifier: ^4.4.1 version: 4.5.0 @@ -370,7 +373,7 @@ importers: version: 2.4.9 chromadb: specifier: ^1.8.1 - version: 1.9.2(cohere-ai@7.14.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)) + version: 1.9.2(cohere-ai@7.14.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) commander: specifier: ^12.1.0 version: 12.1.0 @@ -385,7 +388,7 @@ importers: version: link:../packages/llamaindex mongodb: specifier: ^6.7.0 - version: 6.10.0(@aws-sdk/credential-providers@3.682.0) + version: 6.10.0(@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))) pathe: specifier: ^1.1.2 version: 1.1.2 @@ -502,7 +505,7 @@ importers: version: 1.1.0(@types/react@18.3.12)(react@18.3.1) ai: specifier: ^3.3.21 - version: 3.4.31(openai@4.69.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) + version: 3.4.31(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -726,7 +729,10 @@ importers: version: 5.2.0 '@aws-sdk/client-sso-oidc': specifier: ^3.679.0 - version: 3.682.0(@aws-sdk/client-sts@3.678.0) + version: 3.682.0(@aws-sdk/client-sts@3.682.0) + '@azure/cosmos': + specifier: ^4.1.1 + version: 4.1.1 '@azure/identity': specifier: ^4.4.1 version: 4.5.0 @@ -822,13 +828,13 @@ importers: version: 4.7.1(bufferutil@4.0.8) chromadb: specifier: 1.9.2 - version: 1.9.2(@google/generative-ai@0.12.0)(cohere-ai@7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) + version: 1.9.2(@google/generative-ai@0.12.0)(cohere-ai@7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) chromadb-default-embed: specifier: ^2.13.2 version: 2.13.2 cohere-ai: specifier: 7.13.0 - version: 7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(encoding@0.1.13) + version: 7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(encoding@0.1.13) gpt-tokenizer: specifier: ^2.5.0 version: 2.5.1 @@ -846,7 +852,7 @@ importers: version: 1.10.0 mongodb: specifier: ^6.7.0 - version: 6.10.0(@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))) + version: 6.10.0(@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))) openai: specifier: ^4.60.0 version: 4.69.0(encoding@0.1.13)(zod@3.23.8) @@ -969,7 +975,7 @@ importers: dependencies: ai: specifier: ^3.3.21 - version: 3.4.31(openai@4.69.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) + version: 3.4.31(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) llamaindex: specifier: workspace:* version: link:../../.. @@ -1115,6 +1121,9 @@ importers: '@faker-js/faker': specifier: ^9.0.1 version: 9.1.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 llamaindex: specifier: workspace:* version: link:.. @@ -1320,6 +1329,9 @@ importers: packages/readers: dependencies: + '@azure/cosmos': + specifier: ^4.1.1 + version: 4.1.1 '@discordjs/rest': specifier: ^2.3.0 version: 2.4.0 @@ -1340,7 +1352,7 @@ importers: version: 1.8.0 mongodb: specifier: ^6.7.0 - version: 6.10.0(@aws-sdk/credential-providers@3.682.0) + version: 6.10.0(@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))) notion-md-crawler: specifier: ^1.0.0 version: 1.0.0(encoding@0.1.13) @@ -1440,6 +1452,9 @@ importers: specifier: ^0.23.0 version: 0.23.0(tree-sitter@0.22.0) devDependencies: + '@azure/cosmos': + specifier: ^4.1.1 + version: 4.1.1 '@faker-js/faker': specifier: ^9.0.1 version: 9.1.0 @@ -1905,6 +1920,10 @@ packages: resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} engines: {node: '>=18.0.0'} + '@azure/cosmos@4.1.1': + resolution: {integrity: sha512-EKcRHZy3enhz7hU/qlwW2urcoF7haFkQRbLhR+rUaAtzDaN6+F/rH4xJtNc94NjOEoeHUI+bkze63ZA55Gca0A==} + engines: {node: '>=18.0.0'} + '@azure/identity@4.5.0': resolution: {integrity: sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==} engines: {node: '>=18.0.0'} @@ -9068,6 +9087,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbi@4.3.0: + resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -10966,6 +10988,9 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + priorityqueuejs@2.0.0: + resolution: {integrity: sha512-19BMarhgpq3x4ccvVi8k2QpJZcymo/iFUcrhPd4V96kYGovOdTsWwy7fxChYi4QY+m2EnGBWSX9Buakz+tWNQQ==} + prism-react-renderer@2.4.0: resolution: {integrity: sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==} peerDependencies: @@ -11654,6 +11679,10 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semaphore@1.1.0: + resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} + engines: {node: '>=0.8.0'} + semver-diff@4.0.0: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} engines: {node: '>=12'} @@ -13736,51 +13765,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.679.0 - '@aws-sdk/credential-provider-node': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/middleware-host-header': 3.679.0 - '@aws-sdk/middleware-logger': 3.679.0 - '@aws-sdk/middleware-recursion-detection': 3.679.0 - '@aws-sdk/middleware-user-agent': 3.682.0 - '@aws-sdk/region-config-resolver': 3.679.0 - '@aws-sdk/types': 3.679.0 - '@aws-sdk/util-endpoints': 3.679.0 - '@aws-sdk/util-user-agent-browser': 3.679.0 - '@aws-sdk/util-user-agent-node': 3.682.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.0 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -14101,44 +14085,6 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.679.0 - '@aws-sdk/credential-provider-env': 3.679.0 - '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/types': 3.679.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0)': - dependencies: - '@aws-sdk/client-sts': 3.682.0 - '@aws-sdk/core': 3.679.0 - '@aws-sdk/credential-provider-env': 3.679.0 - '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/types': 3.679.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-ini@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(@aws-sdk/client-sts@3.682.0)': dependencies: '@aws-sdk/client-sts': 3.682.0 @@ -14177,44 +14123,6 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.679.0 - '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-ini': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/types': 3.679.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.679.0 - '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-ini': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/types': 3.679.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - '@aws-sdk/credential-provider-node@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(@aws-sdk/client-sts@3.682.0)': dependencies: '@aws-sdk/credential-provider-env': 3.679.0 @@ -14234,26 +14142,6 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.682.0(@aws-sdk/client-sts@3.682.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.679.0 - '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-ini': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/types': 3.679.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - optional: true - '@aws-sdk/credential-provider-process@3.678.0': dependencies: '@aws-sdk/core': 3.678.0 @@ -14286,20 +14174,6 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-sso@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))': - dependencies: - '@aws-sdk/client-sso': 3.682.0 - '@aws-sdk/core': 3.679.0 - '@aws-sdk/token-providers': 3.679.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/types': 3.679.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-sso@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))': dependencies: '@aws-sdk/client-sso': 3.682.0 @@ -14323,15 +14197,6 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.679.0(@aws-sdk/client-sts@3.678.0)': - dependencies: - '@aws-sdk/client-sts': 3.678.0 - '@aws-sdk/core': 3.679.0 - '@aws-sdk/types': 3.679.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.679.0(@aws-sdk/client-sts@3.682.0)': dependencies: '@aws-sdk/client-sts': 3.682.0 @@ -14341,7 +14206,7 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@aws-sdk/credential-providers@3.682.0': + '@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))': dependencies: '@aws-sdk/client-cognito-identity': 3.682.0 '@aws-sdk/client-sso': 3.682.0 @@ -14350,34 +14215,10 @@ snapshots: '@aws-sdk/credential-provider-cognito-identity': 3.682.0 '@aws-sdk/credential-provider-env': 3.679.0 '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-ini': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/credential-provider-node': 3.682.0(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/types': 3.679.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - optional: true - - '@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))': - dependencies: - '@aws-sdk/client-cognito-identity': 3.682.0 - '@aws-sdk/client-sso': 3.682.0 - '@aws-sdk/client-sts': 3.682.0 - '@aws-sdk/core': 3.679.0 - '@aws-sdk/credential-provider-cognito-identity': 3.682.0 - '@aws-sdk/credential-provider-env': 3.679.0 - '@aws-sdk/credential-provider-http': 3.679.0 - '@aws-sdk/credential-provider-ini': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0) - '@aws-sdk/credential-provider-node': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(@aws-sdk/client-sts@3.682.0) + '@aws-sdk/credential-provider-ini': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(@aws-sdk/client-sts@3.682.0) + '@aws-sdk/credential-provider-node': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(@aws-sdk/client-sts@3.682.0) '@aws-sdk/credential-provider-process': 3.679.0 - '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) + '@aws-sdk/credential-provider-sso': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0)) '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.682.0) '@aws-sdk/types': 3.679.0 '@smithy/credential-provider-imds': 3.2.5 @@ -14485,15 +14326,6 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.679.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.682.0(@aws-sdk/client-sts@3.678.0) - '@aws-sdk/types': 3.679.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.8.1 - '@aws-sdk/token-providers@3.679.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.682.0(@aws-sdk/client-sts@3.682.0) @@ -14609,6 +14441,21 @@ snapshots: '@azure/abort-controller': 2.1.2 tslib: 2.8.0 + '@azure/cosmos@4.1.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-rest-pipeline': 1.17.0 + '@azure/core-tracing': 1.1.2 + '@azure/core-util': 1.11.0 + fast-json-stable-stringify: 2.1.0 + jsbi: 4.3.0 + priorityqueuejs: 2.0.0 + semaphore: 1.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@azure/identity@4.5.0': dependencies: '@azure/abort-controller': 2.1.2 @@ -15772,7 +15619,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -15786,10 +15633,10 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.5.2 '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.3.1) autoprefixer: 10.4.20(postcss@8.4.47) babel-loader: 9.1.3(@babel/core@7.25.2)(webpack@5.96.1) @@ -15877,11 +15724,11 @@ snapshots: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) '@mdx-js/mdx': 3.1.0(acorn@8.13.0) '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 @@ -15915,9 +15762,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.12 '@types/react-router-config': 5.0.11 @@ -15934,17 +15781,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -15977,17 +15824,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/module-type-aliases': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -16018,13 +15865,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16050,11 +15897,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16080,11 +15927,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -16108,11 +15955,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16137,11 +15984,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -16165,14 +16012,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/logger': 3.5.2 - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16198,21 +16045,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@5.12.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@5.12.0)(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3) - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@5.12.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@5.12.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -16253,20 +16100,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/theme-classic@3.5.2(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/module-type-aliases': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.0 @@ -16302,13 +16149,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/module-type-aliases': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.12 '@types/react-router-config': 5.0.11 @@ -16329,16 +16176,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@5.12.0)(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@5.12.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@5.12.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(bufferutil@4.0.8)(eslint@9.13.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) algoliasearch: 4.24.0 algoliasearch-helper: 3.22.4(algoliasearch@4.24.0) clsx: 2.1.1 @@ -16378,7 +16225,7 @@ snapshots: fs-extra: 11.2.0 tslib: 2.8.1 - '@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.13.0) '@types/history': 4.7.11 @@ -16399,17 +16246,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.8.1 optionalDependencies: - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)': + '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -16424,10 +16271,10 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)': + '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.3) escape-string-regexp: 4.0.0 file-loader: 6.2.0(webpack@5.96.1) @@ -16447,7 +16294,7 @@ snapshots: utility-types: 3.11.0 webpack: 5.96.1 optionalDependencies: - '@docusaurus/types': 3.5.2(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19221,9 +19068,9 @@ snapshots: '@upstash/vector@1.1.7': {} - '@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.679.0)': + '@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.679.0(@aws-sdk/client-sts@3.682.0))': optionalDependencies: - '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.678.0) + '@aws-sdk/credential-provider-web-identity': 3.679.0(@aws-sdk/client-sts@3.682.0) '@vercel/postgres@0.10.0': dependencies: @@ -19549,7 +19396,7 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@3.4.31(openai@4.69.0(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8): + ai@3.4.31(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.26 '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) @@ -19565,7 +19412,7 @@ snapshots: secure-json-parse: 2.7.0 zod-to-json-schema: 3.23.5(zod@3.23.8) optionalDependencies: - openai: 4.69.0(zod@3.23.8) + openai: 4.69.0(encoding@0.1.13)(zod@3.23.8) react: 18.3.1 sswr: 2.1.0(svelte@5.1.9) svelte: 5.1.9 @@ -20238,18 +20085,18 @@ snapshots: optionalDependencies: onnxruntime-node: 1.14.0 - chromadb@1.9.2(@google/generative-ai@0.12.0)(cohere-ai@7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)): + chromadb@1.9.2(@google/generative-ai@0.12.0)(cohere-ai@7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)): dependencies: cliui: 8.0.1 isomorphic-fetch: 3.0.0(encoding@0.1.13) optionalDependencies: '@google/generative-ai': 0.12.0 - cohere-ai: 7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(encoding@0.1.13) + cohere-ai: 7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(encoding@0.1.13) openai: 4.69.0(encoding@0.1.13)(zod@3.23.8) transitivePeerDependencies: - encoding - chromadb@1.9.2(cohere-ai@7.14.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)): + chromadb@1.9.2(cohere-ai@7.14.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)): dependencies: cliui: 8.0.1 isomorphic-fetch: 3.0.0(encoding@0.1.13) @@ -20336,10 +20183,10 @@ snapshots: dependencies: rfdc: 1.4.1 - cohere-ai@7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))(encoding@0.1.13): + cohere-ai@7.13.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))(encoding@0.1.13): dependencies: '@aws-sdk/client-sagemaker': 3.678.0 - '@aws-sdk/credential-providers': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) + '@aws-sdk/credential-providers': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0)) '@aws-sdk/protocol-http': 3.374.0 '@aws-sdk/signature-v4': 3.374.0 form-data: 4.0.1 @@ -20358,7 +20205,7 @@ snapshots: cohere-ai@7.14.0(encoding@0.1.13): dependencies: '@aws-sdk/client-sagemaker': 3.678.0 - '@aws-sdk/credential-providers': 3.682.0 + '@aws-sdk/credential-providers': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0)) '@aws-sdk/protocol-http': 3.374.0 '@aws-sdk/signature-v4': 3.374.0 form-data: 4.0.1 @@ -21307,8 +21154,8 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) eslint: 9.13.0(jiti@2.4.0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.13.0(jiti@2.4.0)) eslint-plugin-react: 7.37.2(eslint@9.13.0(jiti@2.4.0)) eslint-plugin-react-hooks: 5.0.0(eslint@9.13.0(jiti@2.4.0)) @@ -21336,48 +21183,48 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 9.13.0(jiti@2.4.0) - eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) + eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.1.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) eslint: 9.13.0(jiti@2.4.0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.2(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)): + eslint-module-utils@2.8.2(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) eslint: 9.13.0(jiti@2.4.0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -21388,7 +21235,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.13.0(jiti@2.4.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)))(eslint@9.13.0(jiti@2.4.0)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -21400,7 +21247,7 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/parser': 7.2.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -23219,6 +23066,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbi@4.3.0: {} + jsesc@0.5.0: {} jsesc@2.5.2: {} @@ -24299,21 +24148,13 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.10.0(@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0))): - dependencies: - '@mongodb-js/saslprep': 1.1.7 - bson: 6.8.0 - mongodb-connection-string-url: 3.0.1 - optionalDependencies: - '@aws-sdk/credential-providers': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.678.0)) - - mongodb@6.10.0(@aws-sdk/credential-providers@3.682.0): + mongodb@6.10.0(@aws-sdk/credential-providers@3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0))): dependencies: '@mongodb-js/saslprep': 1.1.7 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.682.0 + '@aws-sdk/credential-providers': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0)) mongodb@6.7.0(@aws-sdk/credential-providers@3.682.0): dependencies: @@ -24321,7 +24162,7 @@ snapshots: bson: 6.8.0 mongodb-connection-string-url: 3.0.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.682.0 + '@aws-sdk/credential-providers': 3.682.0(@aws-sdk/client-sso-oidc@3.682.0(@aws-sdk/client-sts@3.682.0)) mongoose@8.5.1(@aws-sdk/credential-providers@3.682.0): dependencies: @@ -24795,21 +24636,6 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.69.0(zod@3.23.8): - dependencies: - '@types/node': 18.19.63 - '@types/node-fetch': 2.6.11 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - optionalDependencies: - zod: 3.23.8 - transitivePeerDependencies: - - encoding - optional: true - openapi-sampler@1.5.1: dependencies: '@types/json-schema': 7.0.15 @@ -25522,6 +25348,8 @@ snapshots: printable-characters@1.0.42: {} + priorityqueuejs@2.0.0: {} + prism-react-renderer@2.4.0(react@18.3.1): dependencies: '@types/prismjs': 1.26.4 @@ -26424,6 +26252,8 @@ snapshots: '@types/node-forge': 1.3.11 node-forge: 1.3.1 + semaphore@1.1.0: {} + semver-diff@4.0.0: dependencies: semver: 7.6.3 @@ -26583,13 +26413,14 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki-magic-move@0.5.0(react@18.3.1)(shiki@1.22.2)(vue@3.5.12(typescript@5.6.3)): + shiki-magic-move@0.5.0(react@18.3.1)(shiki@1.22.2)(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3)): dependencies: diff-match-patch-es: 0.1.1 ohash: 1.1.4 optionalDependencies: react: 18.3.1 shiki: 1.22.2 + svelte: 5.1.9 vue: 3.5.12(typescript@5.6.3) shiki@1.22.2: diff --git a/unit/package.json b/unit/package.json index 81b7702c4..ebd5f428a 100644 --- a/unit/package.json +++ b/unit/package.json @@ -11,7 +11,8 @@ "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "msw": "^2.6.0", - "vitest": "^2.0.5" + "vitest": "^2.0.5", + "@azure/cosmos": "^4.1.1" }, "dependencies": { "@llamaindex/cloud": "workspace:*", diff --git a/unit/readers/SimpleCosmosDBReader.test.ts b/unit/readers/SimpleCosmosDBReader.test.ts new file mode 100644 index 000000000..c7370a223 --- /dev/null +++ b/unit/readers/SimpleCosmosDBReader.test.ts @@ -0,0 +1,154 @@ +import { CosmosClient } from "@azure/cosmos"; +import { Document } from "@llamaindex/core/schema"; +import { + SimpleCosmosDBReader, + type SimpleCosmosDBReaderLoaderConfig, +} from "llamaindex"; +import { describe, expect, it, vi } from "vitest"; + +const createMockClient = (mockData?: unknown[]) => { + const client = { + database: vi.fn().mockReturnValue({ + container: vi.fn().mockReturnValue({ + items: { + query: vi.fn().mockReturnValue({ + fetchAll: vi.fn().mockResolvedValue({ + resources: mockData || [], + }), + }), + }, + }), + }), + }; + return client; +}; + +describe("SimpleCosmosDBReader", () => { + let reader: SimpleCosmosDBReader; + it("should throw an error if databaseName is missing", async () => { + const client = createMockClient() as unknown as CosmosClient; + const reader = new SimpleCosmosDBReader(client); + + await expect( + reader.loadData({ databaseName: "", containerName: "test" }), + ).rejects.toThrow("databaseName and containerName are required"); + }); + + it("should throw an error if containerName is missing", async () => { + const client = createMockClient() as unknown as CosmosClient; + const reader = new SimpleCosmosDBReader(client); + + await expect( + reader.loadData({ databaseName: "test", containerName: "" }), + ).rejects.toThrow("databaseName and containerName are required"); + }); + + it("should load data from Cosmos DB container", async () => { + const mockData = [ + { + id: "1", + text1: ["Sample text 1", "Sample text 2"], + text2: "Sample text 3", + metadataField1: "Metadata 1", + metadaField2: { field3: 1, field4: 2 }, + }, + { + id: "2", + text1: "Sample text 4", + text2: "Sample text 5", + metadataField1: ["prop1", "prop2"], + metadaField2: { field3: 3, field4: 4 }, + }, + ]; + + const mockCosmosClient = createMockClient( + mockData, + ) as unknown as CosmosClient; + reader = new SimpleCosmosDBReader(mockCosmosClient); + + const simpleCosmosReaderConfig: SimpleCosmosDBReaderLoaderConfig = { + databaseName: "testDatabase", + containerName: "testContainer", + fields: ["text1", "text2"], + fieldSeparator: "\n", + query: "SELECT * FROM c", + metadataFields: ["metadataField1", "metadaField2"], + }; + + const res = await reader.loadData(simpleCosmosReaderConfig); + + expect(res).toEqual([ + new Document({ + id_: "1", + text: "Sample text 1\nSample text 2\nSample text 3", + metadata: { + metadataField1: "Metadata 1", + metadaField2: { field3: 1, field4: 2 }, + }, + }), + new Document({ + id_: "2", + text: "Sample text 4\nSample text 5", + metadata: { + metadataField1: ["prop1", "prop2"], + metadaField2: { field3: 3, field4: 4 }, + }, + }), + ]); + }); + + it("undefined fields should be empty", async () => { + const mockData = [ + { + id: "1", + text: ["Sample text 1", "Sample text 2"], + metadataField1: "Metadata 1", + }, + ]; + + const mockCosmosClient = createMockClient( + mockData, + ) as unknown as CosmosClient; + reader = new SimpleCosmosDBReader(mockCosmosClient); + + const simpleCosmosReaderConfig: SimpleCosmosDBReaderLoaderConfig = { + databaseName: "testDatabase", + containerName: "testContainer", + fields: ["text", "text1"], + fieldSeparator: "\n", + query: "SELECT * FROM c", + metadataFields: ["metadataField1", "metadaField2"], + }; + + const res = await reader.loadData(simpleCosmosReaderConfig); + expect(res).toEqual([ + new Document({ + id_: "1", + text: "Sample text 1\nSample text 2\n", + metadata: { metadataField1: "Metadata 1", metadaField2: undefined }, + }), + ]); + }); + + it("should handle errors when loading data from Cosmos DB", async () => { + const client = createMockClient() as unknown as CosmosClient; + const reader = new SimpleCosmosDBReader(client); + + vi.spyOn( + client + .database("testDB") + .container("testContainer") + .items.query("Select * from c"), + "fetchAll", + ).mockRejectedValue("Fetch error"); + + const config: SimpleCosmosDBReaderLoaderConfig = { + databaseName: "testDB", + containerName: "testContainer", + }; + + await expect(reader.loadData(config)).rejects.toThrow( + "Error loading data from Cosmos DB: Fetch error", + ); + }); +}); -- GitLab