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
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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