From ea0de4c12e3aac2b3c815a3c3766d8d5b784b19f Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Mon, 23 Mar 2026 15:10:51 +0100 Subject: [PATCH] Edge v0.6 docs (#2199) * Initial Rust snippets * Update content for Rust * Upgrade Rust to 1.94.0; test Edge code snippets against dev * Temporarily test against Edge shim crate * Move to EdgeShardConfig and EdgeVectorParams * Add docs for payload indexing, filtering, facet(), and optimize() * De-emphasize on-device use case * Update link to Rust examples on Github * Flattened API * Switch to new/create and load to initialize shards * Fixups for released packages * Mention recover_partial_snapshot on method list * Link to Github dev branch for examples --------- Co-authored-by: xzfc --- automation/snippets/docker/Dockerfile | 2 +- automation/snippets/shell.nix | 12 +- .../snippets/templates/python/pyproject.toml | 4 +- automation/snippets/templates/python/uv.lock | 26 +- automation/snippets/templates/rust/Cargo.lock | 3936 +++++++++++++++-- automation/snippets/templates/rust/Cargo.toml | 7 +- .../content/documentation/edge/_index.md | 28 +- .../edge-data-synchronization-patterns.md | 6 +- .../edge/edge-fastembed-embeddings.md | 2 +- .../documentation/edge/edge-quickstart.md | 47 +- .../edge/edge-synchronization-guide.md | 10 +- .../generated/initialize-edge-shard/python.md | 8 +- .../edge/fastembed/generated/python.md | 8 +- .../snippets/edge/fastembed/python.py | 8 +- .../generated/close-edge-shard/rust.md | 3 + .../generated/configure-edge-shard/python.md | 6 +- .../generated/configure-edge-shard/rust.md | 24 + .../generated/configure-optimizer/python.md | 17 + .../generated/configure-optimizer/rust.md | 26 + .../generated/create-payload-index/python.md | 5 + .../generated/create-payload-index/rust.md | 10 + .../create-storage-directory/rust.md | 5 + .../edge/quickstart/generated/facet/python.md | 5 + .../edge/quickstart/generated/facet/rust.md | 8 + .../quickstart/generated/filter/python.md | 20 + .../edge/quickstart/generated/filter/rust.md | 28 + .../generated/initialize-edge-shard/python.md | 2 +- .../generated/initialize-edge-shard/rust.md | 6 + .../generated/load-edge-shard/python.md | 2 +- .../generated/load-edge-shard/rust.md | 3 + .../quickstart/generated/optimize/python.md | 3 + .../quickstart/generated/optimize/rust.md | 3 + .../edge/quickstart/generated/python.md | 57 +- .../quickstart/generated/query-points/rust.md | 16 + .../generated/retrieve-point/python.md | 2 +- .../generated/retrieve-point/rust.md | 7 + .../edge/quickstart/generated/rust.md | 157 + .../generated/upsert-points/rust.md | 16 + .../snippets/edge/quickstart/python.py | 67 +- .../headless/snippets/edge/quickstart/rust.rs | 185 + .../generated/delete-synced-points/rust.md | 13 + .../generated/dual-write/rust.md | 34 + .../initialize-immutable-shard/python.md | 2 +- .../initialize-immutable-shard/rust.md | 33 + .../initialize-mutable-shard/python.md | 8 +- .../initialize-mutable-shard/rust.md | 31 + .../synchronization-guide/generated/python.md | 10 +- .../generated/query-both-shards/rust.md | 32 + .../synchronization-guide/generated/rust.md | 196 + .../generated/update-immutable-shard/rust.md | 41 + .../edge/synchronization-guide/python.py | 10 +- .../edge/synchronization-guide/rust.rs | 217 + .../generated/create-upload-queue/rust.md | 6 + .../generated/initialize-edge-shard/python.md | 8 +- .../generated/initialize-edge-shard/rust.md | 30 + .../initialize-server-client/rust.md | 18 + .../generated/process-upload-queue/rust.md | 15 + .../generated/python.md | 10 +- .../generated/restore-snapshot/python.md | 2 +- .../generated/restore-snapshot/rust.md | 28 + .../generated/rust.md | 176 + .../generated/snapshot-url/rust.md | 7 + .../generated/update-from-snapshot/rust.md | 36 + .../generated/upsert-point/rust.md | 26 + .../edge/synchronization-patterns/python.py | 10 +- .../edge/synchronization-patterns/rust.rs | 199 + .../tutorial-semantic-search-101/rust.rs | 4 +- 67 files changed, 5607 insertions(+), 382 deletions(-) create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/close-edge-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/python.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/python.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-storage-directory/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/python.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/python.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/python.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/query-points/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/upsert-points/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/quickstart/rust.rs create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/delete-synced-points/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/dual-write/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/query-both-shards/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/update-immutable-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/rust.rs create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/create-upload-queue/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-server-client/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/process-upload-queue/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/snapshot-url/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/update-from-snapshot/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/upsert-point/rust.md create mode 100644 qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/rust.rs diff --git a/automation/snippets/docker/Dockerfile b/automation/snippets/docker/Dockerfile index 633d7fc7e..054800683 100644 --- a/automation/snippets/docker/Dockerfile +++ b/automation/snippets/docker/Dockerfile @@ -27,7 +27,7 @@ RUN add-apt-repository ppa:dotnet/backports && \ # for rust client RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ CARGO_HOME=/opt/rust RUSTUP_HOME=/opt/rust \ - sh -s -- -y --default-toolchain 1.91.0 + sh -s -- -y --default-toolchain 1.94.0 # for typescript client RUN npm install --global --prefix /usr/local pnpm diff --git a/automation/snippets/shell.nix b/automation/snippets/shell.nix index fb3b79c83..52c44165b 100644 --- a/automation/snippets/shell.nix +++ b/automation/snippets/shell.nix @@ -1,6 +1,9 @@ -with import { }; -mkShell { - buildInputs = [ +let + rust-overlay = builtins.fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"; + pkgs = import { overlays = [ (import rust-overlay) ]; }; +in +pkgs.mkShell { + buildInputs = with pkgs; [ # for ./sync-clients.py git @@ -17,8 +20,7 @@ mkShell { uv # for rust client - cargo - rustfmt + rust-bin.stable.latest.default # for typescript client pnpm diff --git a/automation/snippets/templates/python/pyproject.toml b/automation/snippets/templates/python/pyproject.toml index 7cd130787..d283a6693 100644 --- a/automation/snippets/templates/python/pyproject.toml +++ b/automation/snippets/templates/python/pyproject.toml @@ -6,11 +6,11 @@ dependencies = [ "datasets>=4.4.1", "fastembed", "qdrant-client", - "qdrant-edge-py" + "qdrant-edge-py==0.6.0" ] [tool.uv.sources] -qdrant-client = { git = "https://github.com/qdrant/qdrant-client", tag = "v1.17.0" } +qdrant-client = { git = "https://github.com/qdrant/qdrant-client", tag = "dev" } [dependency-groups] dev = [ diff --git a/automation/snippets/templates/python/uv.lock b/automation/snippets/templates/python/uv.lock index 775d080a9..6c1ed96f6 100644 --- a/automation/snippets/templates/python/uv.lock +++ b/automation/snippets/templates/python/uv.lock @@ -1420,8 +1420,8 @@ wheels = [ [[package]] name = "qdrant-client" -version = "1.17.0" -source = { git = "https://github.com/qdrant/qdrant-client?tag=v1.17.0#e7101dc5baf4d3ce7d6321e1500311619aa95a99" } +version = "1.17.1.dev0" +source = { git = "https://github.com/qdrant/qdrant-client?tag=dev#c7a5bef84b57ab3149b78d207b5de8aa3268d72e" } dependencies = [ { name = "grpcio" }, { name = "httpx", extra = ["http2"] }, @@ -1434,17 +1434,17 @@ dependencies = [ [[package]] name = "qdrant-edge-py" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/74/aa0f9f593325104c72ecd127536af5997e04a9c66b43115fb272f704b130/qdrant_edge_py-0.5.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:32e0e3a4a2356d1a9a8d8209084d529a09490c9750e11603d2a256470dbedd10", size = 8963017, upload-time = "2026-01-19T17:52:32.879Z" }, - { url = "https://files.pythonhosted.org/packages/bd/e9/2fe177ca4e35fc89ff0b57f194c4272c9d61776243438e70c4a0df493f7b/qdrant_edge_py-0.5.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:374e8c401713d467dac505abc3c6634bec482cb795961e56e8e4c0eafb49afe8", size = 8630038, upload-time = "2026-01-19T17:52:35.424Z" }, - { url = "https://files.pythonhosted.org/packages/60/4c/4267e4b0d227b4fb1a083f9fb0bd86f3601b6afd8eaf82d617199395f45a/qdrant_edge_py-0.5.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e92309e0ceb67b129ca9cfe97c158cc1d974b34ce109f127be7ced83fc87f95f", size = 9368631, upload-time = "2026-01-19T17:52:37.428Z" }, - { url = "https://files.pythonhosted.org/packages/af/e4/1c046502d10e944ae3eb49b7893668c9a7422044b4de5d77420696f1eadd/qdrant_edge_py-0.5.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fb3f776c78639780a19732548737c926ea9f80f0565ab64560aba5560abc568a", size = 9094018, upload-time = "2026-01-19T17:52:39.197Z" }, - { url = "https://files.pythonhosted.org/packages/60/e3/ed0f644f573a20b8ab03d4eef900a12fe02aad592093a9e40f485bd043b7/qdrant_edge_py-0.5.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:04919c193050907d12775b3232796af64a85f751750bf93dc451ef2968865f19", size = 9368787, upload-time = "2026-01-19T17:52:40.999Z" }, - { url = "https://files.pythonhosted.org/packages/63/71/9399389978aacc341802a80bd6bc44d6106c669b8c58750072a032535661/qdrant_edge_py-0.5.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:30d11c321c579ed5f71532b99ca3b1ca33cb1ca2419ae0944830edfaab4b7a47", size = 9276227, upload-time = "2026-01-19T17:52:42.987Z" }, - { url = "https://files.pythonhosted.org/packages/06/3e/8b923b96593201e9d9a00361c456bd6b3559b9204ee913ded80d5fae10af/qdrant_edge_py-0.5.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5172665b9db5a26f167a20c5094b1f6081ef17797d02829811e62a6cbb516293", size = 9608614, upload-time = "2026-01-19T17:52:44.793Z" }, - { url = "https://files.pythonhosted.org/packages/47/56/5da083ed1e37c0ab20dbcfef5fb9b42d2e75a648a543de260a21e0adbe30/qdrant_edge_py-0.5.0-cp310-abi3-win_amd64.whl", hash = "sha256:a6706401b1cc7d683e454ce0e76aa31d6664ec04b94bbc8c79268f082943657b", size = 8971559, upload-time = "2026-01-19T17:52:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/1c/72/fce3df4e4b8882b5b00ab3d0a574bbeee2d39a8e520ccf246f456effd185/qdrant_edge_py-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c9d463e7fa81541d60ab8671e6e92a9afd8c4a0e2cfb7e13ea8f5d76e70b877a", size = 9728290, upload-time = "2026-03-19T21:16:15.03Z" }, + { url = "https://files.pythonhosted.org/packages/41/99/70f4e87f7f2ef68c5f92104b914c0e756c22b4bd19957de30a213dadff22/qdrant_edge_py-0.6.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:a18b0bf0355260466bb8d453f2cedc7a9e4f6a2e9d9c58489b859150a3c7e0a6", size = 9203390, upload-time = "2026-03-19T21:16:17.255Z" }, + { url = "https://files.pythonhosted.org/packages/80/55/998ea744a4cef59c69e86b7b2b57ca2f2d4b0f86c212c7b43dd90cc6360e/qdrant_edge_py-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda53f31d8693d090ec564e6761037f57af6f342ac2eef82e1c160c00d80f331", size = 10287388, upload-time = "2026-03-19T21:16:19.215Z" }, + { url = "https://files.pythonhosted.org/packages/40/d2/9e24a9c57699fe6df9a4f3b6cd0d4c3c9f0bfdbd502a28d25fdfadd44ab5/qdrant_edge_py-0.6.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:80c5e8f8cf650e422a3d313e394bde2760c6206914cd9d6142c9c5e730a76639", size = 9752632, upload-time = "2026-03-19T21:16:21.409Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3c/a01840efcae392e5a376a483b9a19705ed0f5bc030befbe3d25b58a6d3d4/qdrant_edge_py-0.6.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d2ab0d209f693fd0d5225072441ed47eccee4f7044470a293c54a3ffdf963cfc", size = 10287245, upload-time = "2026-03-19T21:16:24.366Z" }, + { url = "https://files.pythonhosted.org/packages/7a/45/a3ec5e7d36c5dd4510e4f90d0adaf6aa3e66cff35884ff3edefce240fd77/qdrant_edge_py-0.6.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9abd0c3aedfed380d4c4a82626004b746bd05cb6a8e28e1b2fe7467726dc8840", size = 9935881, upload-time = "2026-03-19T21:16:26.384Z" }, + { url = "https://files.pythonhosted.org/packages/66/0d/43c9033fbb12f0858d5af73b842acb02b3208fe1a31882def2ef23fd560c/qdrant_edge_py-0.6.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ea51a917fc1b927d799d60e166337b6837ee3da39c23d4dc736b82b67497ff12", size = 10507046, upload-time = "2026-03-19T21:16:28.536Z" }, + { url = "https://files.pythonhosted.org/packages/73/33/b2ead1c51a59d31d19418e6d6ca8ea3ce0f32f76efdd48248a1a3791357f/qdrant_edge_py-0.6.0-cp310-abi3-win_amd64.whl", hash = "sha256:d8376e30b53fbb5d9ac8b0aea683173096d7a775b351110aee4337460c906e71", size = 9905482, upload-time = "2026-03-19T21:16:30.555Z" }, ] [[package]] @@ -1509,8 +1509,8 @@ dev = [ requires-dist = [ { name = "datasets", specifier = ">=4.4.1" }, { name = "fastembed" }, - { name = "qdrant-client", git = "https://github.com/qdrant/qdrant-client?tag=v1.17.0" }, - { name = "qdrant-edge-py" }, + { name = "qdrant-client", git = "https://github.com/qdrant/qdrant-client?tag=dev" }, + { name = "qdrant-edge-py", specifier = "==0.6.0" }, ] [package.metadata.requires-dev] diff --git a/automation/snippets/templates/rust/Cargo.lock b/automation/snippets/templates/rust/Cargo.lock index 0b2ac61b4..99a199c27 100644 --- a/automation/snippets/templates/rust/Cargo.lock +++ b/automation/snippets/templates/rust/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -9,10 +18,251 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] -name = "anyhow" -version = "1.0.100" +name = "adler32" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arrayvec" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +dependencies = [ + "nodrop", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] [[package]] name = "async-stream" @@ -36,6 +286,12 @@ dependencies = [ "syn", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.89" @@ -53,12 +309,57 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atomic_refcell" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" + +[[package]] +name = "atomicwrites" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef1bb8d1b645fe38d51dfc331d720fb5fc2c94b440c76cc79c80ff265ca33e3" +dependencies = [ + "rustix 0.38.44", + "tempfile", + "windows-sys 0.52.0", +] + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 0.1.2", + "tower 0.4.13", + "tower-layer", + "tower-service", +] + [[package]] name = "axum" version = "0.7.9" @@ -66,11 +367,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.4.5", "bytes", "futures-util", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", "itoa", "matchit", @@ -80,8 +381,25 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower 0.5.2", + "sync_wrapper 1.0.2", + "tower 0.5.3", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "mime", + "rustversion", "tower-layer", "tower-service", ] @@ -95,17 +413,38 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.1", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -113,33 +452,179 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "bitflags" -version = "2.10.0" +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "binout" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222fb4925a15bea6a68075021910e03d6aa2d04951d71ff1d956190a551d738f" + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "bitm" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7edec3daafc233e78a219c85a77bcf535ee267b0fae7a1aad96bd1a67add5d3" +dependencies = [ + "dyn_size_of", +] + +[[package]] +name = "bitpacking" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a7139abd3d9cebf8cd6f920a389cf3dc9576172e32f4563f188cae3c3eb019" +dependencies = [ + "crunchy", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2-rfc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" +dependencies = [ + "arrayvec 0.4.12", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.46" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cedarwood" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d910bedd62c24733263d0bed247460853c9d22e8956bd4cd964302095e04e90" +dependencies = [ + "smallvec", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -152,6 +637,113 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cgroups-rs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc46cf39fc5922b840030e0e5b378ce5caa9a824a675a95c6dec2c2c9ce9468" +dependencies = [ + "bit-vec", + "libc", + "log", + "nix 0.25.1", + "thiserror 1.0.69", + "zbus", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + +[[package]] +name = "charabia" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51689ee7cc84c8de789fc2874711d816055b93406cfd4135c40d1c82dd24b928" +dependencies = [ + "aho-corasick", + "csv", + "either", + "fst", + "irg-kvariants", + "jieba-rs", + "serde", + "slice-group-by", + "unicode-normalization", + "whatlang", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" +dependencies = [ + "cookie", + "document-features", + "idna", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -168,6 +760,42 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32c" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" +dependencies = [ + "rustc_version", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -177,6 +805,74 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "daachorse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b7ef7a4be509357f4804d0a22e830daddb48f19fd604e4ad32ddce04a94c36" + [[package]] name = "darling" version = "0.20.11" @@ -197,7 +893,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.11.1", "syn", ] @@ -212,6 +908,38 @@ dependencies = [ "syn", ] +[[package]] +name = "dary_heap" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d2e3287df1c007e74221c49ca10a95d557349e54b3a75dc2fb14712c751f04" + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "delegate" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + [[package]] name = "derive_builder" version = "0.20.2" @@ -243,6 +971,16 @@ dependencies = [ "syn", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -254,12 +992,134 @@ dependencies = [ "syn", ] +[[package]] +name = "docopt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f3f119846c823f9eafcf953a8f6ffb6ed69bf6240883261a7f13b634579a51f" +dependencies = [ + "lazy_static", + "regex", + "serde", + "strsim 0.10.0", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "dyn_size_of" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a742b95783b1f45b900129082cbc47717b6a77ee8d17eea70a8ea62462f5de3" + +[[package]] +name = "earcutr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" +dependencies = [ + "itertools 0.11.0", + "num-traits", +] + +[[package]] +name = "ecow" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78e4f79b296fbaab6ce2e22d52cb4c7f010fe0ebe7a32e34fa25885fd797bd02" +dependencies = [ + "serde", +] + [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_filter" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -267,27 +1127,110 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "find-msvc-tools" -version = "0.1.5" +name = "erased-serde" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -298,10 +1241,48 @@ dependencies = [ ] [[package]] -name = "futures" -version = "0.3.31" +name = "fs-err" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" +dependencies = [ + "autocfg", + "tokio", +] + +[[package]] +name = "fs4" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" +dependencies = [ + "rustix 1.1.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "fst" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -314,9 +1295,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -324,15 +1305,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -341,15 +1322,28 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -358,21 +1352,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -382,20 +1376,92 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] [[package]] -name = "getrandom" -version = "0.2.16" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "geo" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3901269ec6d4f6068d3f09e5f02f995bd076398dcd1dfec407cd230b02d11b" +dependencies = [ + "earcutr", + "float_next_after", + "geo-types", + "geographiclib-rs", + "i_overlay", + "log", + "num-traits", + "rand 0.8.5", + "robust", + "rstar", + "sif-itree", + "spade", +] + +[[package]] +name = "geo-types" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f8647af4005fa11da47cd56252c6ef030be8fa97bdbf355e7dfb6348f0a82c" +dependencies = [ + "approx", + "num-traits", + "rayon", + "rstar", + "serde", +] + +[[package]] +name = "geographiclib-rs" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a7f08910fd98737a6eda7568e7c5e645093e073328eeef49758cfe8b0489c7" +dependencies = [ + "libm", +] + +[[package]] +name = "geohash" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fb94b1a65401d6cbf22958a9040aa364812c26674f841bee538b12c135db1e6" +dependencies = [ + "geo-types", + "libm", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -408,30 +1474,98 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] -name = "h2" -version = "0.4.12" +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http", - "indexmap 2.12.0", + "http 1.4.0", + "indexmap 2.13.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", + "num-traits", + "serde", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -440,21 +1574,96 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.3.1" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", "itoa", ] +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + [[package]] name = "http-body" version = "1.0.1" @@ -462,7 +1671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.4.0", ] [[package]] @@ -473,8 +1682,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -490,6 +1699,30 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "hyper" version = "1.8.1" @@ -500,9 +1733,9 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -519,24 +1752,36 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http", - "hyper", + "http 1.4.0", + "hyper 1.8.1", "hyper-util", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tower-service", "webpki-roots", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.32", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "hyper-timeout" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper", + "hyper 1.8.1", "hyper-util", "pin-project-lite", "tokio", @@ -545,28 +1790,94 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", - "http", - "http-body", - "hyper", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.3", "tokio", "tower-service", "tracing", ] +[[package]] +name = "i_float" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "010025c2c532c8d82e42d0b8bb5184afa449fa6f06c709ea9adcb16c49ae405b" +dependencies = [ + "libm", +] + +[[package]] +name = "i_key_sort" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9190f86706ca38ac8add223b2aed8b1330002b5cdbbce28fb58b10914d38fc27" + +[[package]] +name = "i_overlay" +version = "4.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413183068e6e0289e18d7d0a1f661b81546e6918d5453a44570b9ab30cbed1b3" +dependencies = [ + "i_float", + "i_key_sort", + "i_shape", + "i_tree", + "rayon", +] + +[[package]] +name = "i_shape" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea154b742f7d43dae2897fcd5ead86bc7b5eefcedd305a7ebf9f69d44d61082" +dependencies = [ + "i_float", +] + +[[package]] +name = "i_tree" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e6d558e6d4c7b82bc51d9c771e7a927862a161a7d87bf2b0541450e0e20915" + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.1.1" @@ -615,9 +1926,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -629,9 +1940,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -648,6 +1959,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -675,6 +1992,39 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "include-flate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a05fb00d9abc625268e0573a519506b264a7d6965de09bac13201bfb44e723d" +dependencies = [ + "include-flate-codegen", + "include-flate-compress", +] + +[[package]] +name = "include-flate-codegen" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c3c319a7527668538a8530c541e74e881e94c4f41e1425622d0a41c16468af" +dependencies = [ + "include-flate-compress", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "include-flate-compress" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0bd9ea81b94169d61c5a397e9faef02153d3711fc62d3270bcde3ac85380d9" +dependencies = [ + "libflate", + "zstd", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -683,34 +2033,80 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] name = "indexmap" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "integer-encoding" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c00403deb17c3221a1fe4fb571b9ed0370b3dcd116553c77fa294a3d918699" + +[[package]] +name = "io-uring" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "libc", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "irg-kvariants" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2af7c331f2536964a32b78a7d2e0963d78b42f4a76323b16cc7d94b1ddce26" +dependencies = [ + "csv", + "once_cell", + "serde", +] [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" dependencies = [ "memchr", "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -722,25 +2118,148 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jieba-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348294e44ee7e3c42685da656490f8febc7359632544019621588902216da95c" +dependencies = [ + "phf_codegen", +] + +[[package]] +name = "jieba-rs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "766bd7012aa5ba49411ebdf4e93bddd59b182d2918e085d58dec5bb9b54b7105" +dependencies = [ + "cedarwood", + "include-flate", + "jieba-macros", + "phf", + "regex", + "rustc-hash", +] + +[[package]] +name = "jiff" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] -name = "libc" -version = "0.2.177" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libflate" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3248b8d211bd23a104a42d81b4fa8bb8ac4a3b75e7a43d85d2c9ccb6179cd74" +dependencies = [ + "adler32", + "core2", + "crc32fast", + "dary_heap", + "libflate_lz77", +] + +[[package]] +name = "libflate_lz77" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a599cb10a9cd92b1300debcef28da8f70b935ec937f44fcd1b70a7c986a11c5c" +dependencies = [ + "core2", + "hashbrown 0.16.1", + "rle-decode-fast", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +dependencies = [ + "bitflags 2.11.0", + "libc", + "plain", + "redox_syscall 0.7.3", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" @@ -748,6 +2267,12 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + [[package]] name = "lock_api" version = "0.4.14" @@ -755,13 +2280,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ "scopeguard", + "serde", ] [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru-slab" @@ -769,6 +2295,28 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "lz4_flex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9a0d582c2874f68138a16ce1867e0ffde6c0bb0a0df85e1f36d04146db488a" + +[[package]] +name = "macro_rules_attribute" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65049d7923698040cd0b1ddcced9b0eb14dd22c5f86ae59c3740eab64a676520" +dependencies = [ + "macro_rules_attribute-proc_macro", + "paste", +] + +[[package]] +name = "macro_rules_attribute-proc_macro" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670fdfda89751bc4a84ac13eaa63e205cf0fd22b4c9a5fbfa085b63c1f1d3a30" + [[package]] name = "matchit" version = "0.7.3" @@ -777,9 +2325,27 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] [[package]] name = "mime" @@ -799,26 +2365,189 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.61.2", ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "nix" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-cmp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +dependencies = [ + "bytemuck", + "num-traits", + "rand 0.8.5", + "schemars", + "serde", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -836,13 +2565,21 @@ version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ + "backtrace", "cfg-if", "libc", - "redox_syscall", + "petgraph", + "redox_syscall 0.5.18", "smallvec", - "windows-link", + "windows-link 0.2.1", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "percent-encoding" version = "2.3.2" @@ -850,19 +2587,92 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "pin-project" -version = "1.1.10" +name = "permutation_iterator" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "b55405179fe06e4e3820ddaf9f9b51cdff9e7496af9554acdb2b1921a86ca9cb" +dependencies = [ + "blake2-rfc", + "rand 0.7.3", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.13.0", +] + +[[package]] +name = "ph" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2fbaf8da280599aae4047ea0659a1e79cf61739bce5bdc50ca88dc7e6357060" +dependencies = [ + "aligned-vec", + "binout", + "bitm", + "dyn_size_of", + "rayon", + "seedable_hash", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", @@ -871,9 +2681,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -881,6 +2691,58 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +dependencies = [ + "portable-atomic", +] + [[package]] name = "potential_utf" version = "0.1.4" @@ -890,6 +2752,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -900,14 +2768,85 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.103" +name = "prettyplease" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] +[[package]] +name = "procfs" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" +dependencies = [ + "bitflags 2.11.0", + "procfs-core", + "rustix 1.1.4", +] + +[[package]] +name = "procfs-core" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" +dependencies = [ + "bitflags 2.11.0", + "hex", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", +] + [[package]] name = "prost" version = "0.13.5" @@ -925,7 +2864,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools", + "itertools 0.14.0", "proc-macro2", "quote", "syn", @@ -937,20 +2876,20 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" dependencies = [ - "prost", + "prost 0.13.5", ] [[package]] name = "qdrant-client" -version = "1.17.0" -source = "git+https://github.com/qdrant/rust-client?branch=master#a507f30f5ce734d056457402454e7bf6d7039ac2" +version = "1.16.1-dev" +source = "git+https://github.com/qdrant/rust-client?branch=dev#d9cf226e4583b82d8cb8c065851380c6d0b49765" dependencies = [ "anyhow", "derive_builder", "futures", "futures-util", "parking_lot", - "prost", + "prost 0.13.5", "prost-types", "reqwest", "semver", @@ -958,7 +2897,104 @@ dependencies = [ "serde_json", "thiserror 1.0.69", "tokio", - "tonic", + "tonic 0.12.3", +] + +[[package]] +name = "qdrant-edge" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6f1c06fc434230c87cd0a87ac24907f9e7ff06fbd4e604f775c89c17f910c6" +dependencies = [ + "ahash", + "arrayvec 0.7.6", + "atomic_refcell", + "atomicwrites", + "bincode 1.3.3", + "bitpacking", + "bitvec", + "bytemuck", + "byteorder", + "cc", + "cgroups-rs", + "charabia", + "chrono", + "crc32c", + "data-encoding", + "delegate", + "docopt", + "ecow", + "env_logger", + "fnv", + "fs-err", + "fs4", + "fs_extra", + "geo", + "geohash", + "half 2.7.1", + "indexmap 2.13.0", + "integer-encoding", + "io-uring", + "itertools 0.14.0", + "log", + "lz4_flex", + "macro_rules_attribute", + "memmap2", + "nix 0.31.2", + "nom", + "num-cmp", + "num-derive", + "num-traits", + "num_cpus", + "ordered-float 5.1.0", + "parking_lot", + "permutation_iterator", + "ph", + "procfs", + "qdrant-rust-stemmers", + "rand 0.10.0", + "rand_distr", + "rayon", + "rmp-serde", + "roaring", + "rustix 1.1.4", + "schemars", + "seahash", + "self_cell", + "semver", + "serde", + "serde-untagged", + "serde-value", + "serde_cbor", + "serde_json", + "serde_variant", + "sha2", + "smallvec", + "strum", + "sysinfo", + "tap", + "tar", + "tempfile", + "thiserror 2.0.18", + "thread-priority", + "tinyvec", + "tokio", + "tonic 0.11.0", + "uuid", + "validator", + "vaporetto", + "walkdir", + "zerocopy", +] + +[[package]] +name = "qdrant-rust-stemmers" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e61bd348ee10767d59d65d47ced0861921e8bb3ef0823aab63cc16c6c0f6d756" +dependencies = [ + "serde", + "serde_derive", ] [[package]] @@ -973,9 +3009,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls", - "socket2 0.6.1", - "thiserror 2.0.17", + "rustls 0.23.37", + "socket2 0.6.3", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -983,9 +3019,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "bytes", "getrandom 0.3.4", @@ -993,10 +3029,10 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -1011,16 +3047,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.3", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -1031,6 +3067,31 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + [[package]] name = "rand" version = "0.8.5" @@ -1040,6 +3101,7 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", + "serde", ] [[package]] @@ -1049,7 +3111,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -1069,7 +3152,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -1078,42 +3170,126 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", + "serde", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "rand_distr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d431c2703ccf129de4d45253c03f49ebb22b97d6ad79ee3ecfc7e3f4862c1d8" +dependencies = [ + "num-traits", + "rand 0.10.0", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.11.0", ] [[package]] -name = "reqwest" -version = "0.12.24" +name = "redox_syscall" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "base64", + "bitflags 2.11.0", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", "bytes", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-rustls", "hyper-util", "js-sys", @@ -1121,16 +3297,16 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tokio-util", - "tower 0.5.2", + "tower 0.5.3", "tower-http", "tower-service", "url", @@ -1149,12 +3325,70 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", ] +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "roaring" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba9ce64a8f45d7fc86358410bb1a82e8c987504c0d4900e9141d69a9f26c885" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "robust" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" + +[[package]] +name = "rstar" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" +dependencies = [ + "heapless", + "num-traits", + "smallvec", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc-hash" version = "2.1.1" @@ -1162,25 +3396,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] -name = "rustls" -version = "0.23.35" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.9", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -1199,9 +3482,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "web-time", "zeroize", @@ -1209,9 +3492,20 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "ring", "rustls-pki-types", @@ -1226,19 +3520,57 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "chrono", + "dyn-clone", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -1246,12 +3578,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "security-framework" -version = "3.5.1" +name = "seahash" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags", + "bitflags 2.11.0", "core-foundation", "core-foundation-sys", "libc", @@ -1260,19 +3598,39 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "seedable_hash" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47190540123956611cf01db81ad6dee21ca70e1d94a8ff5a962cf6d93b217c7c" +dependencies = [ + "wyhash", + "xxhash-rust", +] + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -1284,6 +3642,38 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float 2.10.1", + "serde", +] + +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half 1.8.3", + "serde", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -1305,16 +3695,39 @@ dependencies = [ ] [[package]] -name = "serde_json" -version = "1.0.145" +name = "serde_derive_internals" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "indexmap 2.13.0", "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1329,6 +3742,26 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_variant" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0068df419f9d9b6488fdded3f1c818522cdea328e02ce9d9f147380265a432" +dependencies = [ + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1336,16 +3769,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "simd-adler32" -version = "0.3.7" +name = "sif-itree" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "d7f45b8998ced5134fb1d75732c77842a3e888f19c1ff98481822e8fbfbf930b" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallvec" @@ -1358,9 +3819,14 @@ name = "snippets-amalgamation" version = "0.1.0" dependencies = [ "anyhow", + "fs-err", + "ordered-float 5.1.0", "qdrant-client", + "qdrant-edge", "serde_json", + "tempfile", "tokio", + "ureq", "uuid", ] @@ -1376,12 +3842,24 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "spade" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb313e1c8afee5b5647e00ee0fe6855e3d529eb863a0fdae1d60006c4d1e9990" +dependencies = [ + "hashbrown 0.15.5", + "num-traits", + "robust", + "smallvec", ] [[package]] @@ -1390,12 +3868,39 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" @@ -1404,15 +3909,21 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.110" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -1433,6 +3944,50 @@ dependencies = [ "syn", ] +[[package]] +name = "sysinfo" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows 0.62.2", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -1444,11 +3999,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -1464,15 +4019,60 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "thread-priority" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210811179577da3d54eb69ab0b50490ee40491a25d95b8c6011ba40771cb721" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.61.3", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -1485,9 +4085,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -1500,45 +4100,68 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", - "socket2 0.6.1", + "signal-hook-registry", + "socket2 0.6.3", "tokio-macros", "windows-sys 0.61.2", ] [[package]] -name = "tokio-macros" -version = "2.6.0" +name = "tokio-io-timeout" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.4", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls", + "rustls 0.23.37", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -1547,9 +4170,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -1558,6 +4181,67 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml_datetime" +version = "1.0.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime", + "toml_parser", + "winnow 1.0.0", +] + +[[package]] +name = "toml_parser" +version = "1.0.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.6.20", + "base64 0.21.7", + "bytes", + "flate2", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-timeout 0.4.1", + "percent-encoding", + "pin-project", + "prost 0.12.6", + "rustls-pemfile", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tonic" version = "0.12.3" @@ -1566,25 +4250,25 @@ checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum", - "base64", + "axum 0.7.9", + "base64 0.22.1", "bytes", "flate2", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", - "hyper", - "hyper-timeout", + "hyper 1.8.1", + "hyper-timeout 0.5.2", "hyper-util", "percent-encoding", "pin-project", - "prost", + "prost 0.13.5", "rustls-native-certs", "rustls-pemfile", "socket2 0.5.10", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -1614,14 +4298,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tower-layer", "tower-service", @@ -1629,18 +4313,18 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags", + "bitflags 2.11.0", "bytes", "futures-util", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "iri-string", "pin-project-lite", - "tower 0.5.2", + "tower 0.5.3", "tower-layer", "tower-service", ] @@ -1659,9 +4343,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1670,9 +4354,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -1681,9 +4365,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -1695,10 +4379,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] -name = "unicode-ident" -version = "1.0.22" +name = "typeid" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "untrusted" @@ -1707,10 +4429,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "url" -version = "2.5.7" +name = "unty" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "ureq" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc" +dependencies = [ + "base64 0.22.1", + "cookie_store", + "flate2", + "log", + "percent-encoding", + "rustls 0.23.37", + "rustls-pki-types", + "serde", + "serde_json", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "httparse", + "log", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", @@ -1718,6 +4478,12 @@ dependencies = [ "serde", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -1725,16 +4491,86 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "uuid" -version = "1.18.1" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.2", "js-sys", + "serde_core", "wasm-bindgen", ] +[[package]] +name = "validator" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fb22e1a008ece370ce08a3e9e4447a910e92621bb49b85d6e48a45397e7cfa" +dependencies = [ + "idna", + "once_cell", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_derive", +] + +[[package]] +name = "validator_derive" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7df16e474ef958526d1205f6dda359fdfab79d9aa6d54bafcb92dcd07673dca" +dependencies = [ + "darling", + "once_cell", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "vaporetto" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d7437bd3d45100e1ed1a284187ce4e9ee863f1fdac97b7eaa614623741464c6" +dependencies = [ + "bincode 2.0.1", + "daachorse", + "hashbrown 0.15.5", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1744,6 +4580,12 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -1752,18 +4594,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -1774,11 +4625,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -1787,9 +4639,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1797,9 +4649,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", @@ -1810,13 +4662,35 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.2" @@ -1831,10 +4705,22 @@ dependencies = [ ] [[package]] -name = "web-sys" -version = "0.3.82" +name = "wasmparser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -1852,19 +4738,235 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "whatlang" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471d1c1645d361eb782a1650b1786a8fb58dd625e681a04c09f5ff7c8764a7b0" +dependencies = [ + "hashbrown 0.14.5", + "once_cell", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link 0.1.3", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -1874,6 +4976,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -1889,7 +5000,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -1914,7 +5025,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -1925,6 +5036,24 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -2022,10 +5151,110 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] -name = "wit-bindgen" -version = "0.46.0" +name = "winnow" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" @@ -2033,6 +5262,40 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +[[package]] +name = "wyhash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf6e163c25e3fac820b4b453185ea2dea3b6a3e0a721d4d23d75bd33734c295" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix 1.1.4", +] + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + [[package]] name = "yoke" version = "0.8.1" @@ -2057,19 +5320,80 @@ dependencies = [ ] [[package]] -name = "zerocopy" -version = "0.8.27" +name = "zbus" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", @@ -2135,3 +5459,77 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", + "winnow 0.7.15", +] diff --git a/automation/snippets/templates/rust/Cargo.toml b/automation/snippets/templates/rust/Cargo.toml index 57faa231f..26d740921 100644 --- a/automation/snippets/templates/rust/Cargo.toml +++ b/automation/snippets/templates/rust/Cargo.toml @@ -5,7 +5,12 @@ edition = "2024" [dependencies] anyhow = "1.0.100" -qdrant-client = { git = "https://github.com/qdrant/rust-client", branch = "master" } +qdrant-edge = "0.6.0" +fs-err = "3" +ordered-float = "5" +qdrant-client = { git = "https://github.com/qdrant/rust-client", branch = "dev" } serde_json = "1.0.145" +tempfile = "3" tokio = { version = "1.48.0", features = ["rt-multi-thread", "macros"] } +ureq = { version = "3", features = ["json"] } uuid = { version = "1.18.1", features = ["v4"] } diff --git a/qdrant-landing/content/documentation/edge/_index.md b/qdrant-landing/content/documentation/edge/_index.md index 7a139fceb..497123540 100644 --- a/qdrant-landing/content/documentation/edge/_index.md +++ b/qdrant-landing/content/documentation/edge/_index.md @@ -8,36 +8,44 @@ partition: qdrant # What Is Qdrant Edge? -Qdrant Edge is a lightweight, embedded vector search engine for AI on devices like robots, kiosks, home assistants, and mobile phones. Designed for real-time vector search on edge devices with limited computational resources, Qdrant Edge allows applications to use Qdrant's functionality even with intermittent or no internet connectivity. +Qdrant Edge is a lightweight, embedded vector search engine for in-process retrieval with a minimal memory footprint and no background services. Qdrant Edge is designed for applications requiring low-latency vector search in environments with limited or intermittent connectivity, such as robots, kiosks, home assistants, and mobile phones. -Qdrant Edge does not run as a separate process. Instead, it runs inside an application process. Data is stored and queried locally on the device, ensuring low-latency access and enhanced privacy since data does not need to be transmitted to an external server. That said, Qdrant Edge provides APIs to [synchronize data with a Qdrant server](/documentation/edge/edge-data-synchronization-patterns/). This enables you to offload heavy computations such as indexing to more powerful server instances, back up and restore data, and centrally aggregate data from multiple edge devices. +Unlike Qdrant Server, which uses a client-server architecture, Qdrant Edge runs inside the application process. Think of it as SQLite, but for vector search. Data is stored and queried locally, ensuring low-latency access and enhanced privacy since data does not need to be transmitted to an external server. That said, Qdrant Edge provides APIs to [synchronize data with a Qdrant server](/documentation/edge/edge-data-synchronization-patterns/). This enables you to offload heavy computations such as indexing to more powerful server instances, back up and restore data, and centrally aggregate data from multiple edge devices. ## Qdrant Edge Shard -Qdrant Edge is built around the concept of an **Edge Shard**: a self-contained storage unit that can operate independently on edge devices. Each Edge Shard manages its own data, including vector and payload storage, and can perform local search and retrieval operations. +Qdrant Edge is built around the concept of an **Edge Shard**: a self-contained storage unit that can operate independently. Each Edge Shard manages its own data, including vector and payload storage, and can perform local search and retrieval operations. ![Qdrant Edge Shards operate on edge devices](/documentation/edge/qdrant-edge.png) -To work with a Qdrant Edge Shard from a Python application, use the [Python Bindings for Qdrant Edge](https://pypi.org/project/qdrant-edge-py/) package. This package provides an `EdgeShard` class with methods to manage data, query it, and restore snapshots: +To work with a Qdrant Edge Shard, use the [Python Bindings for Qdrant Edge](https://pypi.org/project/qdrant-edge-py/) package or the [`qdrant-edge` Rust crate](https://crates.io/crates/qdrant-edge). This library provides an `EdgeShard` class with methods to manage data, query it, and restore snapshots: +- `new` (Rust) / `create` (Python): Creates a new Edge Shard at the given path with the provided configuration. Fails if the path already contains data. +- `load`: Initializes an Edge Shard by reading existing data and optionally the configuration from disk. - `update`: Updates the data. - `query`: Queries the data. +- `facet`: Returns the top N distinct values of a payload field, sorted by the number of points that have each value. - `scroll`: Returns all points. - `count`: Returns the number of points. - `retrieve`: Retrieves points with the given IDs. - `flush`: Flushes the data to ensure that all writes have been persisted to disk. -- `close`: Cleanly destroys the shard instance, ensuring the data is flushed. The data is persisted on disk and can be used to create another shard. +- `close`: Cleanly destroys the shard instance, ensuring the data is flushed (Python). The data is persisted on disk and can be used to create another shard. In Rust, use the `Drop` trait to ensure the shard is closed when it goes out of scope. +- `optimize`: Optimizes the Edge Shard by removing data marked for deletion, merging segments, and creating indexes. - `info`: Returns metadata information about the shard. - `unpack_snapshot`: Unpacks a snapshot on disk. - `snapshot_manifest`: Returns the current shard’s snapshot manifest. -- `update_from_snapshot`: Applies a snapshot to the shard. +- `recover_partial_snapshot` (Rust) / `update_from_snapshot` (Python): Applies a snapshot to the shard. ## Using Qdrant Edge -To get started with Qdrant Edge, refer to the [Qdrant Edge Quickstart Guide](/documentation/edge/edge-quickstart/). +| Type | Guide | What you'll learn | +|--------------|----------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------| +| **Beginner** | [Qdrant Edge Quickstart](/documentation/edge/edge-quickstart/) | Get started with Qdrant Edge and learn the basics of managing and querying data | +| **Beginner** | [On-Device Embeddings](/documentation/edge/edge-fastembed-embeddings/) | Generate vector embeddings directly on edge devices using FastEmbed | +| **Reference** | [Data Synchronization Patterns](/documentation/edge/edge-data-synchronization-patterns/) | Overview of patterns for synchronizing data between Edge Shards and Qdrant server collections | +| **Advanced** | [Synchronize with a Server](/documentation/edge/edge-synchronization-guide/) | Synchronize an Edge Shard with a Qdrant server collection to offload indexing and synchronize data between devices | +### More Examples -## More Examples - -More examples and advanced usage of Qdrant Edge API can be found in the [GitHub repository](https://github.com/qdrant/qdrant/tree/master/lib/edge/python/examples). +The Qdrant GitHub repository contains examples of using the Qdrant Edge API in [Python](https://github.com/qdrant/qdrant/tree/dev/lib/edge/python/examples) and [Rust](https://github.com/qdrant/qdrant/tree/dev/lib/edge/publish/examples). diff --git a/qdrant-landing/content/documentation/edge/edge-data-synchronization-patterns.md b/qdrant-landing/content/documentation/edge/edge-data-synchronization-patterns.md index 24b199cd9..1ad8643e1 100644 --- a/qdrant-landing/content/documentation/edge/edge-data-synchronization-patterns.md +++ b/qdrant-landing/content/documentation/edge/edge-data-synchronization-patterns.md @@ -25,13 +25,13 @@ Using the snapshot URL, you can download the snapshot to the local disk and use {{< code-snippet path="/documentation/headless/snippets/edge/synchronization-patterns/" block="restore-snapshot" >}} -This code first downloads the snapshot to a temporary directory. Next, `EdgeShard.unpack_snapshot` unpacks the downloaded snapshot into the data directory, and a new instance of `EdgeShard` is created using the unpacked snapshot's data and configuration. +This code first downloads the snapshot to a temporary directory. Next, `EdgeShard.unpack_snapshot` unpacks the downloaded snapshot into the data directory, and an EdgeShard is initialized using the unpacked data and configuration. The `edge_shard` will use the same configuration and the same file structure as the source collection from which the snapshot was created, including vector and payload indexes. ## Update Qdrant Edge with Server-Side Changes -To keep an Edge Shard updated with new data from a server collection, you can periodically download and apply a snapshot. Restoring a full snapshot every time would create unnecessary overhead. Instead, you can use partial snapshots to restore changes since the last snapshot. A partial snapshot contains only those segments that have changed, based on the Edge Shard's manifest that describes all its segments and metadata. The `EdgeShard` class provides an `update_from_snapshot` method to update an Edge Shard from a partial snapshot. +To keep an Edge Shard updated with new data from a server collection, you can periodically download and apply a snapshot. Restoring a full snapshot every time would create unnecessary overhead. Instead, you can use partial snapshots to restore changes since the last snapshot. A partial snapshot contains only those segments that have changed, based on the Edge Shard's manifest that describes all its segments and metadata. {{< code-snippet path="/documentation/headless/snippets/edge/synchronization-patterns/" block="update-from-snapshot" >}} @@ -39,7 +39,7 @@ To keep an Edge Shard updated with new data from a server collection, you can pe To synchronize data from an Edge Shard to a server collection, implement a dual-write mechanism in your application. When you add or update a point in the Edge Shard, simultaneously store it in a server collection using the Qdrant client. -Instead of writing to the server collection directly, you may want to set up a background job or a message queue that handles the synchronization asynchronously. The device running the Edge Shard may not always have a stable internet connection, so queuing updates ensures that data is eventually synchronized when connectivity is restored. +Instead of writing to the server collection directly, you may want to set up a background job or a message queue that handles the synchronization asynchronously. The application may not always have a stable internet connection, so queuing updates ensures that data is eventually synchronized when connectivity is restored. First, initialize: - an Edge Shard from scratch or from server-side snapshot diff --git a/qdrant-landing/content/documentation/edge/edge-fastembed-embeddings.md b/qdrant-landing/content/documentation/edge/edge-fastembed-embeddings.md index 117a8b10e..b83aac7b9 100644 --- a/qdrant-landing/content/documentation/edge/edge-fastembed-embeddings.md +++ b/qdrant-landing/content/documentation/edge/edge-fastembed-embeddings.md @@ -5,7 +5,7 @@ weight: 15 # On-Device Embeddings with Qdrant Edge and FastEmbed -To generate embeddings for use with Qdrant Edge directly on a device, you can use the [FastEmbed](/documentation/fastembed/) library. FastEmbed provides multimodal models that run efficiently on edge devices to generate vector embeddings from text and images. +When using Python, you can use the [FastEmbed](/documentation/fastembed/) library to generate embeddings for use with Qdrant Edge. FastEmbed provides multimodal models that run efficiently on edge devices to generate vector embeddings from text and images. # Provision the Device diff --git a/qdrant-landing/content/documentation/edge/edge-quickstart.md b/qdrant-landing/content/documentation/edge/edge-quickstart.md index 6e556f32b..f9e00d59c 100644 --- a/qdrant-landing/content/documentation/edge/edge-quickstart.md +++ b/qdrant-landing/content/documentation/edge/edge-quickstart.md @@ -7,11 +7,7 @@ weight: 10 ## Install Qdrant Edge -First, install the [Python Bindings for Qdrant Edge](https://pypi.org/project/qdrant-edge-py/): - -```python -pip install qdrant-edge-py -``` +First, install the [Python Bindings for Qdrant Edge](https://pypi.org/project/qdrant-edge-py/) or the [Rust crate](https://crates.io/crates/qdrant-edge). ## Create a Storage Directory @@ -21,16 +17,20 @@ A Qdrant Edge Shard stores its data in a local directory on disk. Create the dir ## Configure the Edge Shard -An Edge Shard is configured with a definition of the dense and sparse vectors that can be stored in the Edge Shard, similar to how you would configure a Qdrant collection. Set up a configuration by creating an instance of `EdgeConfig`: +An Edge Shard is configured with a definition of the dense and sparse vectors that can be stored in the Edge Shard, similar to how you would configure a Qdrant collection. + +Set up a configuration by creating an instance of `EdgeConfig`. For example: {{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="configure-edge-shard" >}} ## Initialize the Edge Shard -Now you can create an instance of `EdgeShard` with the storage directory and the configuration: +Now you can create a new `EdgeShard` using `EdgeShard.create` (Python) or `EdgeShard::new` (Rust), passing the storage directory and configuration: {{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="initialize-edge-shard" >}} +Note that `create` and `new` will fail if the storage directory already contains data. To initialize an Edge Shard with existing data, see [Load Existing Edge Shard from Disk](#load-existing-edge-shard-from-disk). + ## Work with Points An Edge Shard has several methods to work with points. To add points, use the `update` method: @@ -41,12 +41,40 @@ To retrieve a point by ID, use the `retrieve` method: {{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="retrieve-point" >}} +## Create a Payload Index + +To optimize operations like [filtering](#filtering) and [faceting](#faceting) on payload fields, first create a payload index on the fields you plan to use with these operations: + +{{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="create-payload-index" >}} + ## Query Points To query points in the Edge Shard, use the `query` method: {{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="query-points" >}} +## Filter points + +You can also filter points based on payload fields: + +{{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="filter" >}} + +## Create Facets + +To create facets on a payload field, use the `facet` method. + +{{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="facet" >}} + +## Optimize the Edge Shard + +Optimization is the process of removing data marked for deletion, merging segments, and creating indexes. Qdrant Edge does not have a background optimizer. Instead, an application can call the `optimize` method to synchronously run optimization at a suitable time, such as during low-traffic periods or after a batch of updates. + +{{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="optimize" >}} + +The optimizer can be configured using the `optimizers` parameter of `EdgeConfig` when initializing the Edge Shard. For example: + +{{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="configure-optimizer" >}} + ## Close the Edge Shard When shutting down your application, close the Edge Shard to ensure all data is flushed to disk. The data is persisted on disk and can be used to reopen the Edge Shard. @@ -55,11 +83,10 @@ When shutting down your application, close the Edge Shard to ensure all data is ## Load Existing Edge Shard from Disk -After closing an Edge Shard, you can reopen it by loading its data and configuration from disk. Create a new `EdgeShard` instance with the storage directory: +After closing an Edge Shard, you can reopen it by loading its data and configuration from disk using the `load` method: {{< code-snippet path="/documentation/headless/snippets/edge/quickstart/" block="load-edge-shard" >}} ## More Examples -More examples and advanced usage of Qdrant Edge API can be found in the [GitHub repository](https://github.com/qdrant/qdrant/tree/master/lib/edge/python/examples). - +The Qdrant GitHub repository contains examples of using the Qdrant Edge API in [Python](https://github.com/qdrant/qdrant/tree/dev/lib/edge/python/examples) and [Rust](https://github.com/qdrant/qdrant/tree/dev/lib/edge/publish/examples). \ No newline at end of file diff --git a/qdrant-landing/content/documentation/edge/edge-synchronization-guide.md b/qdrant-landing/content/documentation/edge/edge-synchronization-guide.md index cdd96b68f..ef839d1be 100644 --- a/qdrant-landing/content/documentation/edge/edge-synchronization-guide.md +++ b/qdrant-landing/content/documentation/edge/edge-synchronization-guide.md @@ -8,24 +8,24 @@ weight: 30 Qdrant Edge can be synchronized with a collection from an external Qdrant server to support use cases like: - **Offload indexing**: Indexing is a computationally expensive operation. By synchronizing an Edge Shard with a server collection, you can offload the indexing process to a more powerful server instance. The indexed data can then be synchronized back to the Edge Shard. -- **Back up and Restore**: Regularly back up your Edge Shard data to a central Qdrant instance to prevent data loss. In case of hardware failure or data corruption on the edge device, you can restore the data from the central instance. +- **Back up and Restore**: Regularly back up your Edge Shard data to a central Qdrant instance to prevent data loss. In case of hardware failure or data corruption, you can restore the data from the central instance. - **Data Aggregation**: Collect data from multiple Edge Shards deployed in different locations and aggregate it into a central Qdrant instance for comprehensive analysis and reporting. - **Synchronization between devices**: Keep data consistent across multiple edge devices by synchronizing their Edge Shards with a central Qdrant instance. ## Synchronizing Qdrant Edge with a Server -To support having local updates from the device as well as updates from a server, you can implement a setup with two Edge Shards: +To support having local updates as well as updates from a centralized server, implement a setup with two Edge Shards: - A **mutable** Edge Shard that handles local data updates. - An **immutable** Edge Shard that mirrors a shard from a collection on a server using partial snapshots. -When querying data, merge results from both Edge Shards to provide a unified view. This way, new points added on the device are available for search alongside the data synchronized from the server. +When querying data, merge results from both Edge Shards to provide a unified view. This way, new points added locally are available for search alongside the data synchronized from the server. ![Qdrant Edge Shards can be synchronized with a central server](/documentation/edge/qdrant-edge-sync-with-server.png) Implementing a dual-write mechanism that writes data to both the mutable Edge Shard and the server collection ensures that data is indexed on the server and synchronized back to the immutable Edge Shard, benefitting search performance. -For an example implementation of the patterns described in this guide, refer to the [Qdrant Edge Demo GitHub repository](https://github.com/qdrant/qdrant-edge-demo). +For a Python example implementation of the patterns described in this guide, refer to the [Qdrant Edge Demo GitHub repository](https://github.com/qdrant/qdrant-edge-demo). ### 1. Initialize a Mutable Edge Shard @@ -51,7 +51,7 @@ Each point's payload should include a timestamp field (`SYNC_TIMESTAMP_KEY` in t You can periodically update the immutable Edge Shard with changes from the server using partial snapshots, as described in [Update Qdrant Edge with Server-Side Changes](/documentation/edge/edge-data-synchronization-patterns/#update-qdrant-edge-with-server-side-changes). -While restoring a snapshot, you may want to pause and buffer any ongoing data updates on the mutable Edge Shard. Before taking the snapshot, ensure all queued data has been written to the server. After the restoration is complete, you can resume normal operations. Refer to the [Qdrant Edge Demo GitHub repository](https://github.com/qdrant/qdrant-edge-demo) for an example implementation. +While restoring a snapshot, you may want to pause and buffer any ongoing data updates on the mutable Edge Shard. Before taking the snapshot, ensure all queued data has been written to the server. After the restoration is complete, you can resume normal operations. Refer to the [Qdrant Edge Demo GitHub repository](https://github.com/qdrant/qdrant-edge-demo) for an example implementation in Python. {{< code-snippet path="/documentation/headless/snippets/edge/synchronization-guide/" block="update-immutable-shard" >}} diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/initialize-edge-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/initialize-edge-shard/python.md index 212d9aa86..19deaa09d 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/initialize-edge-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/initialize-edge-shard/python.md @@ -4,7 +4,7 @@ from qdrant_edge import ( Distance, EdgeConfig, EdgeShard, - VectorDataConfig, + EdgeVectorParams, ) SHARD_DIRECTORY = "./qdrant-edge-directory" @@ -13,13 +13,13 @@ VECTOR_NAME="my-vector" Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/python.md index 9d0d449a5..5c9ba407a 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/generated/python.md @@ -20,7 +20,7 @@ from qdrant_edge import ( Distance, EdgeConfig, EdgeShard, - VectorDataConfig, + EdgeVectorParams, ) SHARD_DIRECTORY = "./qdrant-edge-directory" @@ -29,15 +29,15 @@ VECTOR_NAME="my-vector" Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) from pathlib import Path from qdrant_edge import Point, UpdateOperation diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/python.py b/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/python.py index 6b4c5cf6c..53f4d79e8 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/python.py +++ b/qdrant-landing/content/documentation/headless/snippets/edge/fastembed/python.py @@ -22,7 +22,7 @@ from qdrant_edge import ( Distance, EdgeConfig, EdgeShard, - VectorDataConfig, + EdgeVectorParams, ) SHARD_DIRECTORY = "./qdrant-edge-directory" @@ -31,15 +31,15 @@ VECTOR_NAME="my-vector" Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) # @block-end initialize-edge-shard # @block-start embed-and-store-image diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/close-edge-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/close-edge-shard/rust.md new file mode 100644 index 000000000..24118c30f --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/close-edge-shard/rust.md @@ -0,0 +1,3 @@ +```rust +drop(edge_shard); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/python.md index 97de4f6b2..e3cd54cd3 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/python.md @@ -2,15 +2,15 @@ from qdrant_edge import ( Distance, EdgeConfig, - VectorDataConfig, + EdgeVectorParams, ) VECTOR_NAME="my-vector" VECTOR_DIMENSION=4 config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/rust.md new file mode 100644 index 000000000..ac4a7d5ea --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-edge-shard/rust.md @@ -0,0 +1,24 @@ +```rust +const VECTOR_NAME: &str = "my-vector"; +const VECTOR_DIMENSION: usize = 4; + +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), +}; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/python.md new file mode 100644 index 000000000..f8ad47e5f --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/python.md @@ -0,0 +1,17 @@ +```python +from qdrant_edge import EdgeOptimizersConfig + +config = EdgeConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( + size=VECTOR_DIMENSION, + distance=Distance.Cosine, + ) + }, + optimizers=EdgeOptimizersConfig( + deleted_threshold=0.2, + vacuum_min_vector_number=100, + default_segment_number=2, + ), +) +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/rust.md new file mode 100644 index 000000000..3de48195d --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/configure-optimizer/rust.md @@ -0,0 +1,26 @@ +```rust +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: EdgeOptimizersConfig { + deleted_threshold: Some(0.2), + vacuum_min_vector_number: Some(100), + default_segment_number: Some(2), + ..Default::default() + }, +}; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/python.md new file mode 100644 index 000000000..128d1804f --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/python.md @@ -0,0 +1,5 @@ +```python +from qdrant_edge import PayloadSchemaType + +edge_shard.update(UpdateOperation.create_field_index("color", PayloadSchemaType.Keyword)) +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/rust.md new file mode 100644 index 000000000..6bed1bebe --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-payload-index/rust.md @@ -0,0 +1,10 @@ +```rust +edge_shard.update(UpdateOperation::FieldIndexOperation( + FieldIndexOperations::CreateIndex(CreateIndex { + field_name: "color".try_into().unwrap(), + field_schema: Some(PayloadFieldSchema::FieldType( + PayloadSchemaType::Keyword, + )), + }), +))?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-storage-directory/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-storage-directory/rust.md new file mode 100644 index 000000000..bb22ac435 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/create-storage-directory/rust.md @@ -0,0 +1,5 @@ +```rust +const SHARD_DIRECTORY: &str = "./qdrant-edge-directory"; + +fs_err::create_dir_all(SHARD_DIRECTORY)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/python.md new file mode 100644 index 000000000..cade0aa98 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/python.md @@ -0,0 +1,5 @@ +```python +from qdrant_edge import FacetRequest + +facet_response = edge_shard.facet(FacetRequest(key="color", limit=10, exact=False)) +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/rust.md new file mode 100644 index 000000000..130b671d0 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/facet/rust.md @@ -0,0 +1,8 @@ +```rust +let facet_response = edge_shard.facet(FacetRequest { + key: "color".try_into().unwrap(), + limit: 10, + filter: None, + exact: false, +})?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/python.md new file mode 100644 index 000000000..24cdc0d4e --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/python.md @@ -0,0 +1,20 @@ +```python +from qdrant_edge import FieldCondition, Filter, MatchValue + +results = edge_shard.query( + QueryRequest( + query=Query.Nearest([0.2, 0.1, 0.9, 0.7], using=VECTOR_NAME), + filter=Filter( + must=[ + FieldCondition( + key="color", + match=MatchValue(value="red"), + ) + ] + ), + limit=10, + with_vector=False, + with_payload=True + ) +) +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/rust.md new file mode 100644 index 000000000..b421dd57b --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/filter/rust.md @@ -0,0 +1,28 @@ +```rust +let filter = Filter { + should: None, + min_should: None, + must: Some(vec![Condition::Field(FieldCondition::new_match( + "color".try_into().unwrap(), + Match::Value(MatchValue { + value: ValueVariants::String("red".to_string()), + }), + ))]), + must_not: None, +}; + +let results = edge_shard.query(QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: Some(filter), + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), +})?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/python.md index d75770e12..3765ad052 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/python.md @@ -1,5 +1,5 @@ ```python from qdrant_edge import EdgeShard -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/rust.md new file mode 100644 index 000000000..609301547 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/initialize-edge-shard/rust.md @@ -0,0 +1,6 @@ +```rust +let edge_shard = EdgeShard::new( + Path::new(SHARD_DIRECTORY), + config, +)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/python.md index d5df43843..3656fc00d 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/python.md @@ -1,3 +1,3 @@ ```python -edge_shard = EdgeShard(SHARD_DIRECTORY) +edge_shard = EdgeShard.load(SHARD_DIRECTORY) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/rust.md new file mode 100644 index 000000000..e31fa346e --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/load-edge-shard/rust.md @@ -0,0 +1,3 @@ +```rust +let edge_shard = EdgeShard::load(Path::new(SHARD_DIRECTORY), None)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/python.md new file mode 100644 index 000000000..e31b157d6 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/python.md @@ -0,0 +1,3 @@ +```python +edge_shard.optimize() +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/rust.md new file mode 100644 index 000000000..3bd02c490 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/optimize/rust.md @@ -0,0 +1,3 @@ +```rust +edge_shard.optimize()?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/python.md index d278185be..e940ac36d 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/python.md @@ -8,15 +8,15 @@ Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) from qdrant_edge import ( Distance, EdgeConfig, - VectorDataConfig, + EdgeVectorParams, ) VECTOR_NAME="my-vector" VECTOR_DIMENSION=4 config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) @@ -25,7 +25,7 @@ config = EdgeConfig( from qdrant_edge import EdgeShard -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) from qdrant_edge import ( Point, UpdateOperation ) @@ -37,7 +37,7 @@ point = Point( edge_shard.update(UpdateOperation.upsert_points([point])) -point = edge_shard.retrieve( +records = edge_shard.retrieve( point_ids=[1], with_payload=True, with_vector=False @@ -54,7 +54,52 @@ results = edge_shard.query( ) ) +from qdrant_edge import FieldCondition, Filter, MatchValue + +results = edge_shard.query( + QueryRequest( + query=Query.Nearest([0.2, 0.1, 0.9, 0.7], using=VECTOR_NAME), + filter=Filter( + must=[ + FieldCondition( + key="color", + match=MatchValue(value="red"), + ) + ] + ), + limit=10, + with_vector=False, + with_payload=True + ) +) + +from qdrant_edge import FacetRequest + +facet_response = edge_shard.facet(FacetRequest(key="color", limit=10, exact=False)) + +edge_shard.optimize() + +from qdrant_edge import EdgeOptimizersConfig + +config = EdgeConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( + size=VECTOR_DIMENSION, + distance=Distance.Cosine, + ) + }, + optimizers=EdgeOptimizersConfig( + deleted_threshold=0.2, + vacuum_min_vector_number=100, + default_segment_number=2, + ), +) + +from qdrant_edge import PayloadSchemaType + +edge_shard.update(UpdateOperation.create_field_index("color", PayloadSchemaType.Keyword)) + edge_shard.close() -edge_shard = EdgeShard(SHARD_DIRECTORY) +edge_shard = EdgeShard.load(SHARD_DIRECTORY) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/query-points/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/query-points/rust.md new file mode 100644 index 000000000..81234fe14 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/query-points/rust.md @@ -0,0 +1,16 @@ +```rust +let results = edge_shard.query(QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: None, + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), +})?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/python.md index 8fddcf175..7294e4676 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/python.md @@ -1,5 +1,5 @@ ```python -point = edge_shard.retrieve( +records = edge_shard.retrieve( point_ids=[1], with_payload=True, with_vector=False diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/rust.md new file mode 100644 index 000000000..43e7dc509 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/retrieve-point/rust.md @@ -0,0 +1,7 @@ +```rust +let retrieved = edge_shard.retrieve( + &[PointId::NumId(1)], + Some(WithPayloadInterface::Bool(true)), + Some(WithVector::Bool(false)), +)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/rust.md new file mode 100644 index 000000000..af7af82dd --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/rust.md @@ -0,0 +1,157 @@ +```rust +use std::collections::HashMap; +use std::path::Path; + +use qdrant_edge::EdgeShard; +use qdrant_edge::{ + Condition, CreateIndex, Distance, EdgeConfig, EdgeOptimizersConfig, + EdgeVectorParams, FacetRequest, FieldCondition, FieldIndexOperations, + Filter, Match, MatchValue, NamedQuery, PayloadFieldSchema, + PayloadSchemaType, PointId, PointInsertOperations, PointOperations, + PointStruct, PointStructPersisted, QueryEnum, QueryRequest, ScoringQuery, + UpdateOperation, ValueVariants, Vectors, WithPayloadInterface, WithVector, +}; +use serde_json::json; + +const SHARD_DIRECTORY: &str = "./qdrant-edge-directory"; + +fs_err::create_dir_all(SHARD_DIRECTORY)?; + +const VECTOR_NAME: &str = "my-vector"; +const VECTOR_DIMENSION: usize = 4; + +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), +}; + +let edge_shard = EdgeShard::new( + Path::new(SHARD_DIRECTORY), + config, +)?; + +let points: Vec = vec![ + PointStruct::new( + 1u64, + Vectors::new_named([(VECTOR_NAME, vec![0.1f32, 0.2, 0.3, 0.4])]), + json!({"color": "red"}), + ) + .into(), +]; + +edge_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(points), + ), +))?; + +let retrieved = edge_shard.retrieve( + &[PointId::NumId(1)], + Some(WithPayloadInterface::Bool(true)), + Some(WithVector::Bool(false)), +)?; + +let results = edge_shard.query(QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: None, + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), +})?; + +let filter = Filter { + should: None, + min_should: None, + must: Some(vec![Condition::Field(FieldCondition::new_match( + "color".try_into().unwrap(), + Match::Value(MatchValue { + value: ValueVariants::String("red".to_string()), + }), + ))]), + must_not: None, +}; + +let results = edge_shard.query(QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: Some(filter), + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), +})?; + +let facet_response = edge_shard.facet(FacetRequest { + key: "color".try_into().unwrap(), + limit: 10, + filter: None, + exact: false, +})?; + +edge_shard.optimize()?; + +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: EdgeOptimizersConfig { + deleted_threshold: Some(0.2), + vacuum_min_vector_number: Some(100), + default_segment_number: Some(2), + ..Default::default() + }, +}; + +edge_shard.update(UpdateOperation::FieldIndexOperation( + FieldIndexOperations::CreateIndex(CreateIndex { + field_name: "color".try_into().unwrap(), + field_schema: Some(PayloadFieldSchema::FieldType( + PayloadSchemaType::Keyword, + )), + }), +))?; + +drop(edge_shard); + +let edge_shard = EdgeShard::load(Path::new(SHARD_DIRECTORY), None)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/upsert-points/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/upsert-points/rust.md new file mode 100644 index 000000000..7dab79856 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/generated/upsert-points/rust.md @@ -0,0 +1,16 @@ +```rust +let points: Vec = vec![ + PointStruct::new( + 1u64, + Vectors::new_named([(VECTOR_NAME, vec![0.1f32, 0.2, 0.3, 0.4])]), + json!({"color": "red"}), + ) + .into(), +]; + +edge_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(points), + ), +))?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/python.py b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/python.py index e1b4912d1..d9157f589 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/python.py +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/python.py @@ -10,15 +10,15 @@ Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) from qdrant_edge import ( Distance, EdgeConfig, - VectorDataConfig, + EdgeVectorParams, ) VECTOR_NAME="my-vector" VECTOR_DIMENSION=4 config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) @@ -29,7 +29,7 @@ config = EdgeConfig( # @block-start initialize-edge-shard from qdrant_edge import EdgeShard -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) # @block-end initialize-edge-shard # @block-start upsert-points @@ -45,7 +45,7 @@ edge_shard.update(UpdateOperation.upsert_points([point])) # @block-end upsert-points # @block-start retrieve-point -point = edge_shard.retrieve( +records = edge_shard.retrieve( point_ids=[1], with_payload=True, with_vector=False @@ -65,10 +65,65 @@ results = edge_shard.query( ) # @block-end query-points +# @block-start filter +from qdrant_edge import FieldCondition, Filter, MatchValue + +results = edge_shard.query( + QueryRequest( + query=Query.Nearest([0.2, 0.1, 0.9, 0.7], using=VECTOR_NAME), + filter=Filter( + must=[ + FieldCondition( + key="color", + match=MatchValue(value="red"), + ) + ] + ), + limit=10, + with_vector=False, + with_payload=True + ) +) +# @block-end filter + +# @block-start facet +from qdrant_edge import FacetRequest + +facet_response = edge_shard.facet(FacetRequest(key="color", limit=10, exact=False)) +# @block-end facet + +# @block-start optimize +edge_shard.optimize() +# @block-end optimize + +# @block-start configure-optimizer +from qdrant_edge import EdgeOptimizersConfig + +config = EdgeConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( + size=VECTOR_DIMENSION, + distance=Distance.Cosine, + ) + }, + optimizers=EdgeOptimizersConfig( + deleted_threshold=0.2, + vacuum_min_vector_number=100, + default_segment_number=2, + ), +) +# @block-end configure-optimizer + +# @block-start create-payload-index +from qdrant_edge import PayloadSchemaType + +edge_shard.update(UpdateOperation.create_field_index("color", PayloadSchemaType.Keyword)) +# @block-end create-payload-index + # @block-start close-edge-shard edge_shard.close() # @block-end close-edge-shard # @block-start load-edge-shard -edge_shard = EdgeShard(SHARD_DIRECTORY) +edge_shard = EdgeShard.load(SHARD_DIRECTORY) # @block-end load-edge-shard diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/rust.rs b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/rust.rs new file mode 100644 index 000000000..7e897221c --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/quickstart/rust.rs @@ -0,0 +1,185 @@ +use std::collections::HashMap; +use std::path::Path; + +use qdrant_edge::EdgeShard; +use qdrant_edge::{ + Condition, CreateIndex, Distance, EdgeConfig, EdgeOptimizersConfig, + EdgeVectorParams, FacetRequest, FieldCondition, FieldIndexOperations, + Filter, Match, MatchValue, NamedQuery, PayloadFieldSchema, + PayloadSchemaType, PointId, PointInsertOperations, PointOperations, + PointStruct, PointStructPersisted, QueryEnum, QueryRequest, ScoringQuery, + UpdateOperation, ValueVariants, Vectors, WithPayloadInterface, WithVector, +}; +use serde_json::json; + +pub async fn main() -> anyhow::Result<()> { + // @block-start create-storage-directory + const SHARD_DIRECTORY: &str = "./qdrant-edge-directory"; + + fs_err::create_dir_all(SHARD_DIRECTORY)?; + // @block-end create-storage-directory + + // @block-start configure-edge-shard + const VECTOR_NAME: &str = "my-vector"; + const VECTOR_DIMENSION: usize = 4; + + let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), + }; + // @block-end configure-edge-shard + + // @block-start initialize-edge-shard + let edge_shard = EdgeShard::new( + Path::new(SHARD_DIRECTORY), + config, + )?; + // @block-end initialize-edge-shard + + // @block-start upsert-points + let points: Vec = vec![ + PointStruct::new( + 1u64, + Vectors::new_named([(VECTOR_NAME, vec![0.1f32, 0.2, 0.3, 0.4])]), + json!({"color": "red"}), + ) + .into(), + ]; + + edge_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(points), + ), + ))?; + // @block-end upsert-points + + // @block-start retrieve-point + let retrieved = edge_shard.retrieve( + &[PointId::NumId(1)], + Some(WithPayloadInterface::Bool(true)), + Some(WithVector::Bool(false)), + )?; + // @block-end retrieve-point + + // @block-start query-points + let results = edge_shard.query(QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: None, + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), + })?; + // @block-end query-points + + // @block-start filter + let filter = Filter { + should: None, + min_should: None, + must: Some(vec![Condition::Field(FieldCondition::new_match( + "color".try_into().unwrap(), + Match::Value(MatchValue { + value: ValueVariants::String("red".to_string()), + }), + ))]), + must_not: None, + }; + + let results = edge_shard.query(QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: Some(filter), + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), + })?; + // @block-end filter + + // @block-start facet + let facet_response = edge_shard.facet(FacetRequest { + key: "color".try_into().unwrap(), + limit: 10, + filter: None, + exact: false, + })?; + // @block-end facet + + // @block-start optimize + edge_shard.optimize()?; + // @block-end optimize + + // @block-start configure-optimizer + let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: EdgeOptimizersConfig { + deleted_threshold: Some(0.2), + vacuum_min_vector_number: Some(100), + default_segment_number: Some(2), + ..Default::default() + }, + }; + // @block-end configure-optimizer + + // @block-start create-payload-index + edge_shard.update(UpdateOperation::FieldIndexOperation( + FieldIndexOperations::CreateIndex(CreateIndex { + field_name: "color".try_into().unwrap(), + field_schema: Some(PayloadFieldSchema::FieldType( + PayloadSchemaType::Keyword, + )), + }), + ))?; + // @block-end create-payload-index + + // @block-start close-edge-shard + drop(edge_shard); + // @block-end close-edge-shard + + // @block-start load-edge-shard + let edge_shard = EdgeShard::load(Path::new(SHARD_DIRECTORY), None)?; + // @block-end load-edge-shard + + Ok(()) +} diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/delete-synced-points/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/delete-synced-points/rust.md new file mode 100644 index 000000000..950c1d738 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/delete-synced-points/rust.md @@ -0,0 +1,13 @@ +```rust +let filter = Filter::new_must(Condition::Field(FieldCondition::new_range( + SYNC_TIMESTAMP_KEY.parse::().unwrap(), + Range { + lte: Some(OrderedFloat(sync_timestamp)), + ..Default::default() + }, +))); + +mutable_shard.update(UpdateOperation::PointOperation( + PointOperations::DeletePointsByFilter(filter), +))?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/dual-write/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/dual-write/rust.md new file mode 100644 index 000000000..e3aba0206 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/dual-write/rust.md @@ -0,0 +1,34 @@ +```rust +const SYNC_TIMESTAMP_KEY: &str = "timestamp"; +let id = 2u64; +let vector = vec![0.4f32, 0.3, 0.2, 0.1]; +let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs_f64(); +let payload = json!({ + "color": "green", + SYNC_TIMESTAMP_KEY: timestamp, +}); + +let edge_points: Vec = vec![ + EdgePoint::new( + PointId::NumId(id), + Vectors::new_named([(VECTOR_NAME, vector.clone())]), + payload.clone(), + ) + .into(), +]; +mutable_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(edge_points), + ), +))?; + +let rest_point = PointStruct::new( + id, + HashMap::from([(VECTOR_NAME.to_string(), vector)]), + payload.as_object().cloned().unwrap_or_default(), +); +upload_queue.push_back(rest_point); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/python.md index c7997db7e..f1f2187e8 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/python.md @@ -25,5 +25,5 @@ with tempfile.TemporaryDirectory(dir=data_dir.parent) as restore_dir: EdgeShard.unpack_snapshot(str(snapshot_path), str(data_dir)) -immutable_shard = EdgeShard(IMMUTABLE_SHARD_DIR) +immutable_shard = EdgeShard.load(IMMUTABLE_SHARD_DIR) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/rust.md new file mode 100644 index 000000000..7f4235b41 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-immutable-shard/rust.md @@ -0,0 +1,33 @@ +```rust +const COLLECTION_NAME: &str = "edge-collection"; +let snapshot_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot" +); + +const IMMUTABLE_SHARD_DIR: &str = "./qdrant-edge-directory/immutable"; +let data_dir = Path::new(IMMUTABLE_SHARD_DIR); + +let restore_dir = tempfile::Builder::new() + .tempdir_in(data_dir.parent().unwrap_or(Path::new(".")))?; +let snapshot_path = restore_dir.path().join("shard.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::get(&snapshot_url) + .header("api-key", QDRANT_API_KEY) + .call()? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&snapshot_path, &bytes)?; + +if data_dir.exists() { + fs_err::remove_dir_all(data_dir)?; +} +fs_err::create_dir_all(data_dir)?; + +EdgeShard::unpack_snapshot(&snapshot_path, data_dir)?; + +let immutable_shard = EdgeShard::load(data_dir, None)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/python.md index 864340885..497d027b6 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/python.md @@ -4,7 +4,7 @@ from qdrant_edge import ( Distance, EdgeConfig, EdgeShard, - VectorDataConfig, + EdgeVectorParams, ) MUTABLE_SHARD_DIR = "./qdrant-edge-directory/mutable" @@ -15,13 +15,13 @@ VECTOR_NAME="my-vector" VECTOR_DIMENSION=4 config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -mutable_shard = EdgeShard(MUTABLE_SHARD_DIR, config) +mutable_shard = EdgeShard.create(MUTABLE_SHARD_DIR, config) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/rust.md new file mode 100644 index 000000000..deed99da3 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/initialize-mutable-shard/rust.md @@ -0,0 +1,31 @@ +```rust +const MUTABLE_SHARD_DIR: &str = "./qdrant-edge-directory/mutable"; +const VECTOR_DIMENSION: usize = 4; +const VECTOR_NAME: &str = "my-vector"; + +fs_err::create_dir_all(MUTABLE_SHARD_DIR)?; +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), +}; + +let mutable_shard = EdgeShard::new( + Path::new(MUTABLE_SHARD_DIR), + config, +)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/python.md index 361e67445..496102715 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/python.md @@ -4,7 +4,7 @@ from qdrant_edge import ( Distance, EdgeConfig, EdgeShard, - VectorDataConfig, + EdgeVectorParams, ) MUTABLE_SHARD_DIR = "./qdrant-edge-directory/mutable" @@ -15,15 +15,15 @@ VECTOR_NAME="my-vector" VECTOR_DIMENSION=4 config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -mutable_shard = EdgeShard(MUTABLE_SHARD_DIR, config) +mutable_shard = EdgeShard.create(MUTABLE_SHARD_DIR, config) import requests import tempfile @@ -51,7 +51,7 @@ with tempfile.TemporaryDirectory(dir=data_dir.parent) as restore_dir: EdgeShard.unpack_snapshot(str(snapshot_path), str(data_dir)) -immutable_shard = EdgeShard(IMMUTABLE_SHARD_DIR) +immutable_shard = EdgeShard.load(IMMUTABLE_SHARD_DIR) from qdrant_edge import ( Point, UpdateOperation ) from qdrant_client import models diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/query-both-shards/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/query-both-shards/rust.md new file mode 100644 index 000000000..509d03d1c --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/query-both-shards/rust.md @@ -0,0 +1,32 @@ +```rust +let query = QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: None, + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), +}; + +let mut all_results = mutable_shard.query(query.clone())?; +all_results.extend(immutable_shard.query(query)?); + +all_results.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) +}); + +let mut seen_ids = std::collections::HashSet::new(); +let results: Vec<_> = all_results + .into_iter() + .filter(|p| seen_ids.insert(p.id.clone())) + .take(10) + .collect(); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/rust.md new file mode 100644 index 000000000..0b9bd488e --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/rust.md @@ -0,0 +1,196 @@ +```rust +use std::collections::HashMap; +use std::path::Path; +use std::time::{SystemTime, UNIX_EPOCH}; + +use ordered_float::OrderedFloat; +use qdrant_client::qdrant::PointStruct; +use qdrant_edge::EdgeShard; +use qdrant_edge::internal::SnapshotManifest; +use qdrant_edge::{ + Condition, Distance, EdgeConfig, EdgeVectorParams, FieldCondition, Filter, + JsonPath, NamedQuery, PointId, PointInsertOperations, PointOperations, + PointStruct as EdgePoint, PointStructPersisted, QueryEnum, QueryRequest, + Range, ScoringQuery, UpdateOperation, Vectors, WithPayloadInterface, + WithVector, +}; +use serde_json::json; + +const MUTABLE_SHARD_DIR: &str = "./qdrant-edge-directory/mutable"; +const VECTOR_DIMENSION: usize = 4; +const VECTOR_NAME: &str = "my-vector"; + +fs_err::create_dir_all(MUTABLE_SHARD_DIR)?; +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), +}; + +let mutable_shard = EdgeShard::new( + Path::new(MUTABLE_SHARD_DIR), + config, +)?; + +const COLLECTION_NAME: &str = "edge-collection"; +let snapshot_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot" +); + +const IMMUTABLE_SHARD_DIR: &str = "./qdrant-edge-directory/immutable"; +let data_dir = Path::new(IMMUTABLE_SHARD_DIR); + +let restore_dir = tempfile::Builder::new() + .tempdir_in(data_dir.parent().unwrap_or(Path::new(".")))?; +let snapshot_path = restore_dir.path().join("shard.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::get(&snapshot_url) + .header("api-key", QDRANT_API_KEY) + .call()? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&snapshot_path, &bytes)?; + +if data_dir.exists() { + fs_err::remove_dir_all(data_dir)?; +} +fs_err::create_dir_all(data_dir)?; + +EdgeShard::unpack_snapshot(&snapshot_path, data_dir)?; + +let immutable_shard = EdgeShard::load(data_dir, None)?; + +const SYNC_TIMESTAMP_KEY: &str = "timestamp"; +let id = 2u64; +let vector = vec![0.4f32, 0.3, 0.2, 0.1]; +let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs_f64(); +let payload = json!({ + "color": "green", + SYNC_TIMESTAMP_KEY: timestamp, +}); + +let edge_points: Vec = vec![ + EdgePoint::new( + PointId::NumId(id), + Vectors::new_named([(VECTOR_NAME, vector.clone())]), + payload.clone(), + ) + .into(), +]; +mutable_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(edge_points), + ), +))?; + +let rest_point = PointStruct::new( + id, + HashMap::from([(VECTOR_NAME.to_string(), vector)]), + payload.as_object().cloned().unwrap_or_default(), +); +upload_queue.push_back(rest_point); + +let sync_timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs_f64(); + +let current_manifest = immutable_shard.snapshot_manifest()?; + +let update_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot\ + /partial/create" +); + +let temp_dir = tempfile::tempdir_in(data_dir)?; +let partial_snapshot_path = temp_dir.path().join("partial.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::post(&update_url) + .header("api-key", QDRANT_API_KEY) + .send_json(¤t_manifest)? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&partial_snapshot_path, &bytes)?; + +let unpacked_dir = tempfile::tempdir_in(data_dir)?; +EdgeShard::unpack_snapshot(&partial_snapshot_path, unpacked_dir.path())?; +let snapshot_manifest = SnapshotManifest::load_from_snapshot( + unpacked_dir.path(), + None, +)?; + +let immutable_shard = EdgeShard::recover_partial_snapshot( + data_dir, + ¤t_manifest, + unpacked_dir.path(), + &snapshot_manifest, +)?; + +let filter = Filter::new_must(Condition::Field(FieldCondition::new_range( + SYNC_TIMESTAMP_KEY.parse::().unwrap(), + Range { + lte: Some(OrderedFloat(sync_timestamp)), + ..Default::default() + }, +))); + +mutable_shard.update(UpdateOperation::PointOperation( + PointOperations::DeletePointsByFilter(filter), +))?; + +let query = QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: None, + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), +}; + +let mut all_results = mutable_shard.query(query.clone())?; +all_results.extend(immutable_shard.query(query)?); + +all_results.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) +}); + +let mut seen_ids = std::collections::HashSet::new(); +let results: Vec<_> = all_results + .into_iter() + .filter(|p| seen_ids.insert(p.id.clone())) + .take(10) + .collect(); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/update-immutable-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/update-immutable-shard/rust.md new file mode 100644 index 000000000..c20d83d05 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/generated/update-immutable-shard/rust.md @@ -0,0 +1,41 @@ +```rust +let sync_timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs_f64(); + +let current_manifest = immutable_shard.snapshot_manifest()?; + +let update_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot\ + /partial/create" +); + +let temp_dir = tempfile::tempdir_in(data_dir)?; +let partial_snapshot_path = temp_dir.path().join("partial.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::post(&update_url) + .header("api-key", QDRANT_API_KEY) + .send_json(¤t_manifest)? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&partial_snapshot_path, &bytes)?; + +let unpacked_dir = tempfile::tempdir_in(data_dir)?; +EdgeShard::unpack_snapshot(&partial_snapshot_path, unpacked_dir.path())?; +let snapshot_manifest = SnapshotManifest::load_from_snapshot( + unpacked_dir.path(), + None, +)?; + +let immutable_shard = EdgeShard::recover_partial_snapshot( + data_dir, + ¤t_manifest, + unpacked_dir.path(), + &snapshot_manifest, +)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/python.py b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/python.py index fd82e32e4..8dc64cfd4 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/python.py +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/python.py @@ -13,7 +13,7 @@ from qdrant_edge import ( Distance, EdgeConfig, EdgeShard, - VectorDataConfig, + EdgeVectorParams, ) MUTABLE_SHARD_DIR = "./qdrant-edge-directory/mutable" @@ -24,15 +24,15 @@ VECTOR_NAME="my-vector" VECTOR_DIMENSION=4 config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -mutable_shard = EdgeShard(MUTABLE_SHARD_DIR, config) +mutable_shard = EdgeShard.create(MUTABLE_SHARD_DIR, config) # @block-end initialize-mutable-shard # @block-start initialize-immutable-shard @@ -62,7 +62,7 @@ with tempfile.TemporaryDirectory(dir=data_dir.parent) as restore_dir: EdgeShard.unpack_snapshot(str(snapshot_path), str(data_dir)) -immutable_shard = EdgeShard(IMMUTABLE_SHARD_DIR) +immutable_shard = EdgeShard.load(IMMUTABLE_SHARD_DIR) # @block-end initialize-immutable-shard # @block-start dual-write diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/rust.rs b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/rust.rs new file mode 100644 index 000000000..b54a8daa6 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-guide/rust.rs @@ -0,0 +1,217 @@ +use std::collections::HashMap; +use std::path::Path; +use std::time::{SystemTime, UNIX_EPOCH}; + +use ordered_float::OrderedFloat; +use qdrant_client::qdrant::PointStruct; +use qdrant_edge::EdgeShard; +use qdrant_edge::internal::SnapshotManifest; +use qdrant_edge::{ + Condition, Distance, EdgeConfig, EdgeVectorParams, FieldCondition, Filter, + JsonPath, NamedQuery, PointId, PointInsertOperations, PointOperations, + PointStruct as EdgePoint, PointStructPersisted, QueryEnum, QueryRequest, + Range, ScoringQuery, UpdateOperation, Vectors, WithPayloadInterface, + WithVector, +}; +use serde_json::json; + +pub async fn main() -> anyhow::Result<()> { + // @hide-start + const QDRANT_URL: &str = ""; + const QDRANT_API_KEY: &str = ""; + let mut upload_queue: std::collections::VecDeque = + std::collections::VecDeque::new(); + // @hide-end + + // @block-start initialize-mutable-shard + const MUTABLE_SHARD_DIR: &str = "./qdrant-edge-directory/mutable"; + const VECTOR_DIMENSION: usize = 4; + const VECTOR_NAME: &str = "my-vector"; + + fs_err::create_dir_all(MUTABLE_SHARD_DIR)?; + let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), + }; + + let mutable_shard = EdgeShard::new( + Path::new(MUTABLE_SHARD_DIR), + config, + )?; + // @block-end initialize-mutable-shard + + // @block-start initialize-immutable-shard + const COLLECTION_NAME: &str = "edge-collection"; + let snapshot_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot" + ); + + const IMMUTABLE_SHARD_DIR: &str = "./qdrant-edge-directory/immutable"; + let data_dir = Path::new(IMMUTABLE_SHARD_DIR); + + let restore_dir = tempfile::Builder::new() + .tempdir_in(data_dir.parent().unwrap_or(Path::new(".")))?; + let snapshot_path = restore_dir.path().join("shard.snapshot"); + + let mut bytes = Vec::new(); + std::io::copy( + &mut ureq::get(&snapshot_url) + .header("api-key", QDRANT_API_KEY) + .call()? + .into_body() + .into_reader(), + &mut bytes, + )?; + fs_err::write(&snapshot_path, &bytes)?; + + if data_dir.exists() { + fs_err::remove_dir_all(data_dir)?; + } + fs_err::create_dir_all(data_dir)?; + + EdgeShard::unpack_snapshot(&snapshot_path, data_dir)?; + + let immutable_shard = EdgeShard::load(data_dir, None)?; + // @block-end initialize-immutable-shard + + // @block-start dual-write + const SYNC_TIMESTAMP_KEY: &str = "timestamp"; + let id = 2u64; + let vector = vec![0.4f32, 0.3, 0.2, 0.1]; + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs_f64(); + let payload = json!({ + "color": "green", + SYNC_TIMESTAMP_KEY: timestamp, + }); + + let edge_points: Vec = vec![ + EdgePoint::new( + PointId::NumId(id), + Vectors::new_named([(VECTOR_NAME, vector.clone())]), + payload.clone(), + ) + .into(), + ]; + mutable_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(edge_points), + ), + ))?; + + let rest_point = PointStruct::new( + id, + HashMap::from([(VECTOR_NAME.to_string(), vector)]), + payload.as_object().cloned().unwrap_or_default(), + ); + upload_queue.push_back(rest_point); + // @block-end dual-write + + // @block-start update-immutable-shard + let sync_timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs_f64(); + + let current_manifest = immutable_shard.snapshot_manifest()?; + + let update_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot\ + /partial/create" + ); + + let temp_dir = tempfile::tempdir_in(data_dir)?; + let partial_snapshot_path = temp_dir.path().join("partial.snapshot"); + + let mut bytes = Vec::new(); + std::io::copy( + &mut ureq::post(&update_url) + .header("api-key", QDRANT_API_KEY) + .send_json(¤t_manifest)? + .into_body() + .into_reader(), + &mut bytes, + )?; + fs_err::write(&partial_snapshot_path, &bytes)?; + + let unpacked_dir = tempfile::tempdir_in(data_dir)?; + EdgeShard::unpack_snapshot(&partial_snapshot_path, unpacked_dir.path())?; + let snapshot_manifest = SnapshotManifest::load_from_snapshot( + unpacked_dir.path(), + None, + )?; + + let immutable_shard = EdgeShard::recover_partial_snapshot( + data_dir, + ¤t_manifest, + unpacked_dir.path(), + &snapshot_manifest, + )?; + // @block-end update-immutable-shard + + // @block-start delete-synced-points + let filter = Filter::new_must(Condition::Field(FieldCondition::new_range( + SYNC_TIMESTAMP_KEY.parse::().unwrap(), + Range { + lte: Some(OrderedFloat(sync_timestamp)), + ..Default::default() + }, + ))); + + mutable_shard.update(UpdateOperation::PointOperation( + PointOperations::DeletePointsByFilter(filter), + ))?; + // @block-end delete-synced-points + + // @block-start query-both-shards + let query = QueryRequest { + prefetches: vec![], + query: Some(ScoringQuery::Vector(QueryEnum::Nearest(NamedQuery { + query: vec![0.2f32, 0.1, 0.9, 0.7].into(), + using: Some(VECTOR_NAME.to_string()), + }))), + filter: None, + score_threshold: None, + limit: 10, + offset: 0, + params: None, + with_vector: WithVector::Bool(false), + with_payload: WithPayloadInterface::Bool(true), + }; + + let mut all_results = mutable_shard.query(query.clone())?; + all_results.extend(immutable_shard.query(query)?); + + all_results.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + + let mut seen_ids = std::collections::HashSet::new(); + let results: Vec<_> = all_results + .into_iter() + .filter(|p| seen_ids.insert(p.id.clone())) + .take(10) + .collect(); + // @block-end query-both-shards + + Ok(()) +} diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/create-upload-queue/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/create-upload-queue/rust.md new file mode 100644 index 000000000..9c50c9103 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/create-upload-queue/rust.md @@ -0,0 +1,6 @@ +```rust +// This is an in-memory queue. +// For production use cases consider persisting changes. +let mut upload_queue: std::collections::VecDeque = + std::collections::VecDeque::new(); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/python.md index bfd146154..8ee5d9859 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/python.md @@ -3,7 +3,7 @@ from pathlib import Path from qdrant_edge import ( Distance, EdgeConfig, - VectorDataConfig, + EdgeVectorParams, ) SHARD_DIRECTORY = "./qdrant-edge-directory" @@ -12,13 +12,13 @@ VECTOR_DIMENSION=4 Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/rust.md new file mode 100644 index 000000000..30b95e357 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-edge-shard/rust.md @@ -0,0 +1,30 @@ +```rust +const VECTOR_DIMENSION: usize = 4; +const VECTOR_NAME: &str = "my-vector"; + +fs_err::create_dir_all(SHARD_DIRECTORY)?; +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: qdrant_edge::Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), +}; + +let edge_shard = EdgeShard::new( + Path::new(SHARD_DIRECTORY), + config, +)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-server-client/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-server-client/rust.md new file mode 100644 index 000000000..0f628bcbf --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/initialize-server-client/rust.md @@ -0,0 +1,18 @@ +```rust +let server_client = Qdrant::from_url(QDRANT_URL) + .api_key(QDRANT_API_KEY) + .build()?; + +if !server_client.collection_exists(COLLECTION_NAME).await? { + server_client + .create_collection( + CreateCollectionBuilder::new(COLLECTION_NAME).vectors_config( + VectorParamsBuilder::new( + VECTOR_DIMENSION as u64, + Distance::Cosine, + ), + ), + ) + .await?; +} +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/process-upload-queue/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/process-upload-queue/rust.md new file mode 100644 index 000000000..dd3da3ad7 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/process-upload-queue/rust.md @@ -0,0 +1,15 @@ +```rust +const BATCH_SIZE: usize = 10; +let points_to_upload: Vec = upload_queue + .drain(..BATCH_SIZE.min(upload_queue.len())) + .collect(); + +if !points_to_upload.is_empty() { + server_client + .upsert_points(UpsertPointsBuilder::new( + COLLECTION_NAME, + points_to_upload, + )) + .await?; +} +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/python.md index 28629b99a..61899b0c0 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/python.md @@ -27,7 +27,7 @@ with tempfile.TemporaryDirectory(dir=data_dir.parent) as restore_dir: EdgeShard.unpack_snapshot(str(snapshot_path), str(data_dir)) -edge_shard = EdgeShard(SHARD_DIRECTORY) +edge_shard = EdgeShard.load(SHARD_DIRECTORY) manifest = edge_shard.snapshot_manifest() @@ -48,7 +48,7 @@ from pathlib import Path from qdrant_edge import ( Distance, EdgeConfig, - VectorDataConfig, + EdgeVectorParams, ) SHARD_DIRECTORY = "./qdrant-edge-directory" @@ -57,15 +57,15 @@ VECTOR_DIMENSION=4 Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) from qdrant_client import QdrantClient, models diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/python.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/python.md index 1852144be..6f7c735ba 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/python.md +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/python.md @@ -23,5 +23,5 @@ with tempfile.TemporaryDirectory(dir=data_dir.parent) as restore_dir: EdgeShard.unpack_snapshot(str(snapshot_path), str(data_dir)) -edge_shard = EdgeShard(SHARD_DIRECTORY) +edge_shard = EdgeShard.load(SHARD_DIRECTORY) ``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/rust.md new file mode 100644 index 000000000..4e64e8863 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/restore-snapshot/rust.md @@ -0,0 +1,28 @@ +```rust +const SHARD_DIRECTORY: &str = "./qdrant-edge-directory"; +let data_dir = Path::new(SHARD_DIRECTORY); + +let restore_dir = tempfile::Builder::new() + .tempdir_in(data_dir.parent().unwrap_or(Path::new(".")))?; +let snapshot_path = restore_dir.path().join("shard.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::get(&snapshot_url) + .header("api-key", QDRANT_API_KEY) + .call()? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&snapshot_path, &bytes)?; + +if data_dir.exists() { + fs_err::remove_dir_all(data_dir)?; +} +fs_err::create_dir_all(data_dir)?; + +EdgeShard::unpack_snapshot(&snapshot_path, data_dir)?; + +let edge_shard = EdgeShard::load(data_dir, None)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/rust.md new file mode 100644 index 000000000..9d6835c0b --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/rust.md @@ -0,0 +1,176 @@ +```rust +use std::collections::HashMap; +use std::path::Path; + +use qdrant_client::qdrant::{ + CreateCollectionBuilder, Distance, PointStruct, UpsertPointsBuilder, + VectorParamsBuilder, +}; +use qdrant_client::Qdrant; +use qdrant_edge::EdgeShard; +use qdrant_edge::internal::SnapshotManifest; +use qdrant_edge::{ + EdgeConfig, EdgeVectorParams, PointId, PointInsertOperations, + PointOperations, PointStruct as EdgePoint, PointStructPersisted, + UpdateOperation, Vectors, +}; +use serde_json::json; + +const COLLECTION_NAME: &str = "edge-collection"; + +let snapshot_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot" +); + +const SHARD_DIRECTORY: &str = "./qdrant-edge-directory"; +let data_dir = Path::new(SHARD_DIRECTORY); + +let restore_dir = tempfile::Builder::new() + .tempdir_in(data_dir.parent().unwrap_or(Path::new(".")))?; +let snapshot_path = restore_dir.path().join("shard.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::get(&snapshot_url) + .header("api-key", QDRANT_API_KEY) + .call()? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&snapshot_path, &bytes)?; + +if data_dir.exists() { + fs_err::remove_dir_all(data_dir)?; +} +fs_err::create_dir_all(data_dir)?; + +EdgeShard::unpack_snapshot(&snapshot_path, data_dir)?; + +let edge_shard = EdgeShard::load(data_dir, None)?; + +let current_manifest = edge_shard.snapshot_manifest()?; + +let update_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot\ + /partial/create" +); + +let temp_dir = tempfile::tempdir_in(data_dir)?; +let partial_snapshot_path = temp_dir.path().join("partial.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::post(&update_url) + .header("api-key", QDRANT_API_KEY) + .send_json(¤t_manifest)? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&partial_snapshot_path, &bytes)?; + +let unpacked_dir = tempfile::tempdir_in(data_dir)?; +EdgeShard::unpack_snapshot(&partial_snapshot_path, unpacked_dir.path())?; +let snapshot_manifest = SnapshotManifest::load_from_snapshot( + unpacked_dir.path(), + None, +)?; + +let edge_shard = EdgeShard::recover_partial_snapshot( + data_dir, + ¤t_manifest, + unpacked_dir.path(), + &snapshot_manifest, +)?; + +const VECTOR_DIMENSION: usize = 4; +const VECTOR_NAME: &str = "my-vector"; + +fs_err::create_dir_all(SHARD_DIRECTORY)?; +let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: qdrant_edge::Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), +}; + +let edge_shard = EdgeShard::new( + Path::new(SHARD_DIRECTORY), + config, +)?; + +let server_client = Qdrant::from_url(QDRANT_URL) + .api_key(QDRANT_API_KEY) + .build()?; + +if !server_client.collection_exists(COLLECTION_NAME).await? { + server_client + .create_collection( + CreateCollectionBuilder::new(COLLECTION_NAME).vectors_config( + VectorParamsBuilder::new( + VECTOR_DIMENSION as u64, + Distance::Cosine, + ), + ), + ) + .await?; +} + +// This is an in-memory queue. +// For production use cases consider persisting changes. +let mut upload_queue: std::collections::VecDeque = + std::collections::VecDeque::new(); + +let id = 1u64; +let vector = vec![0.1f32, 0.2, 0.3, 0.4]; +let payload = json!({"color": "red"}); + +let edge_points: Vec = vec![ + EdgePoint::new( + PointId::NumId(id), + Vectors::new_named([(VECTOR_NAME, vector.clone())]), + payload.clone(), + ) + .into(), +]; +edge_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(edge_points), + ), +))?; + +let server_point = PointStruct::new( + id, + HashMap::from([(VECTOR_NAME.to_string(), vector)]), + payload.as_object().cloned().unwrap_or_default(), +); +upload_queue.push_back(server_point); + +const BATCH_SIZE: usize = 10; +let points_to_upload: Vec = upload_queue + .drain(..BATCH_SIZE.min(upload_queue.len())) + .collect(); + +if !points_to_upload.is_empty() { + server_client + .upsert_points(UpsertPointsBuilder::new( + COLLECTION_NAME, + points_to_upload, + )) + .await?; +} +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/snapshot-url/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/snapshot-url/rust.md new file mode 100644 index 000000000..ad3fd45a0 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/snapshot-url/rust.md @@ -0,0 +1,7 @@ +```rust +const COLLECTION_NAME: &str = "edge-collection"; + +let snapshot_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot" +); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/update-from-snapshot/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/update-from-snapshot/rust.md new file mode 100644 index 000000000..41d264ebc --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/update-from-snapshot/rust.md @@ -0,0 +1,36 @@ +```rust +let current_manifest = edge_shard.snapshot_manifest()?; + +let update_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot\ + /partial/create" +); + +let temp_dir = tempfile::tempdir_in(data_dir)?; +let partial_snapshot_path = temp_dir.path().join("partial.snapshot"); + +let mut bytes = Vec::new(); +std::io::copy( + &mut ureq::post(&update_url) + .header("api-key", QDRANT_API_KEY) + .send_json(¤t_manifest)? + .into_body() + .into_reader(), + &mut bytes, +)?; +fs_err::write(&partial_snapshot_path, &bytes)?; + +let unpacked_dir = tempfile::tempdir_in(data_dir)?; +EdgeShard::unpack_snapshot(&partial_snapshot_path, unpacked_dir.path())?; +let snapshot_manifest = SnapshotManifest::load_from_snapshot( + unpacked_dir.path(), + None, +)?; + +let edge_shard = EdgeShard::recover_partial_snapshot( + data_dir, + ¤t_manifest, + unpacked_dir.path(), + &snapshot_manifest, +)?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/upsert-point/rust.md b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/upsert-point/rust.md new file mode 100644 index 000000000..807f96d24 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/generated/upsert-point/rust.md @@ -0,0 +1,26 @@ +```rust +let id = 1u64; +let vector = vec![0.1f32, 0.2, 0.3, 0.4]; +let payload = json!({"color": "red"}); + +let edge_points: Vec = vec![ + EdgePoint::new( + PointId::NumId(id), + Vectors::new_named([(VECTOR_NAME, vector.clone())]), + payload.clone(), + ) + .into(), +]; +edge_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(edge_points), + ), +))?; + +let server_point = PointStruct::new( + id, + HashMap::from([(VECTOR_NAME.to_string(), vector)]), + payload.as_object().cloned().unwrap_or_default(), +); +upload_queue.push_back(server_point); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/python.py b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/python.py index 5dfca31ed..04ebb8e58 100644 --- a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/python.py +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/python.py @@ -35,7 +35,7 @@ with tempfile.TemporaryDirectory(dir=data_dir.parent) as restore_dir: EdgeShard.unpack_snapshot(str(snapshot_path), str(data_dir)) -edge_shard = EdgeShard(SHARD_DIRECTORY) +edge_shard = EdgeShard.load(SHARD_DIRECTORY) # @block-end restore-snapshot # @block-start update-from-snapshot @@ -60,7 +60,7 @@ from pathlib import Path from qdrant_edge import ( Distance, EdgeConfig, - VectorDataConfig, + EdgeVectorParams, ) SHARD_DIRECTORY = "./qdrant-edge-directory" @@ -69,15 +69,15 @@ VECTOR_DIMENSION=4 Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True) config = EdgeConfig( - vector_data={ - VECTOR_NAME: VectorDataConfig( + vectors={ + VECTOR_NAME: EdgeVectorParams( size=VECTOR_DIMENSION, distance=Distance.Cosine, ) } ) -edge_shard = EdgeShard(SHARD_DIRECTORY, config) +edge_shard = EdgeShard.create(SHARD_DIRECTORY, config) # @block-end initialize-edge-shard # @block-start initialize-server-client diff --git a/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/rust.rs b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/rust.rs new file mode 100644 index 000000000..d7ac6ea4b --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/edge/synchronization-patterns/rust.rs @@ -0,0 +1,199 @@ +use std::collections::HashMap; +use std::path::Path; + +use qdrant_client::qdrant::{ + CreateCollectionBuilder, Distance, PointStruct, UpsertPointsBuilder, + VectorParamsBuilder, +}; +use qdrant_client::Qdrant; +use qdrant_edge::EdgeShard; +use qdrant_edge::internal::SnapshotManifest; +use qdrant_edge::{ + EdgeConfig, EdgeVectorParams, PointId, PointInsertOperations, + PointOperations, PointStruct as EdgePoint, PointStructPersisted, + UpdateOperation, Vectors, +}; +use serde_json::json; + +pub async fn main() -> anyhow::Result<()> { + // @hide-start + const QDRANT_URL: &str = ""; + const QDRANT_API_KEY: &str = ""; + // @hide-end + + // @block-start snapshot-url + const COLLECTION_NAME: &str = "edge-collection"; + + let snapshot_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot" + ); + // @block-end snapshot-url + + // @block-start restore-snapshot + const SHARD_DIRECTORY: &str = "./qdrant-edge-directory"; + let data_dir = Path::new(SHARD_DIRECTORY); + + let restore_dir = tempfile::Builder::new() + .tempdir_in(data_dir.parent().unwrap_or(Path::new(".")))?; + let snapshot_path = restore_dir.path().join("shard.snapshot"); + + let mut bytes = Vec::new(); + std::io::copy( + &mut ureq::get(&snapshot_url) + .header("api-key", QDRANT_API_KEY) + .call()? + .into_body() + .into_reader(), + &mut bytes, + )?; + fs_err::write(&snapshot_path, &bytes)?; + + if data_dir.exists() { + fs_err::remove_dir_all(data_dir)?; + } + fs_err::create_dir_all(data_dir)?; + + EdgeShard::unpack_snapshot(&snapshot_path, data_dir)?; + + let edge_shard = EdgeShard::load(data_dir, None)?; + // @block-end restore-snapshot + + // @block-start update-from-snapshot + let current_manifest = edge_shard.snapshot_manifest()?; + + let update_url = format!( + "{QDRANT_URL}/collections/{COLLECTION_NAME}/shards/0/snapshot\ + /partial/create" + ); + + let temp_dir = tempfile::tempdir_in(data_dir)?; + let partial_snapshot_path = temp_dir.path().join("partial.snapshot"); + + let mut bytes = Vec::new(); + std::io::copy( + &mut ureq::post(&update_url) + .header("api-key", QDRANT_API_KEY) + .send_json(¤t_manifest)? + .into_body() + .into_reader(), + &mut bytes, + )?; + fs_err::write(&partial_snapshot_path, &bytes)?; + + let unpacked_dir = tempfile::tempdir_in(data_dir)?; + EdgeShard::unpack_snapshot(&partial_snapshot_path, unpacked_dir.path())?; + let snapshot_manifest = SnapshotManifest::load_from_snapshot( + unpacked_dir.path(), + None, + )?; + + let edge_shard = EdgeShard::recover_partial_snapshot( + data_dir, + ¤t_manifest, + unpacked_dir.path(), + &snapshot_manifest, + )?; + // @block-end update-from-snapshot + + // @block-start initialize-edge-shard + const VECTOR_DIMENSION: usize = 4; + const VECTOR_NAME: &str = "my-vector"; + + fs_err::create_dir_all(SHARD_DIRECTORY)?; + let config = EdgeConfig { + on_disk_payload: true, + vectors: HashMap::from([( + VECTOR_NAME.to_string(), + EdgeVectorParams { + size: VECTOR_DIMENSION, + distance: qdrant_edge::Distance::Cosine, + on_disk: Some(true), + quantization_config: None, + multivector_config: None, + datatype: None, + hnsw_config: None, + }, + )]), + sparse_vectors: HashMap::new(), + hnsw_config: Default::default(), + quantization_config: None, + optimizers: Default::default(), + }; + + let edge_shard = EdgeShard::new( + Path::new(SHARD_DIRECTORY), + config, + )?; + // @block-end initialize-edge-shard + + // @block-start initialize-server-client + let server_client = Qdrant::from_url(QDRANT_URL) + .api_key(QDRANT_API_KEY) + .build()?; + + if !server_client.collection_exists(COLLECTION_NAME).await? { + server_client + .create_collection( + CreateCollectionBuilder::new(COLLECTION_NAME).vectors_config( + VectorParamsBuilder::new( + VECTOR_DIMENSION as u64, + Distance::Cosine, + ), + ), + ) + .await?; + } + // @block-end initialize-server-client + + // @block-start create-upload-queue + // This is an in-memory queue. + // For production use cases consider persisting changes. + let mut upload_queue: std::collections::VecDeque = + std::collections::VecDeque::new(); + // @block-end create-upload-queue + + // @block-start upsert-point + let id = 1u64; + let vector = vec![0.1f32, 0.2, 0.3, 0.4]; + let payload = json!({"color": "red"}); + + let edge_points: Vec = vec![ + EdgePoint::new( + PointId::NumId(id), + Vectors::new_named([(VECTOR_NAME, vector.clone())]), + payload.clone(), + ) + .into(), + ]; + edge_shard.update(UpdateOperation::PointOperation( + PointOperations::UpsertPoints( + PointInsertOperations::PointsList(edge_points), + ), + ))?; + + let server_point = PointStruct::new( + id, + HashMap::from([(VECTOR_NAME.to_string(), vector)]), + payload.as_object().cloned().unwrap_or_default(), + ); + upload_queue.push_back(server_point); + // @block-end upsert-point + + // @block-start process-upload-queue + const BATCH_SIZE: usize = 10; + let points_to_upload: Vec = upload_queue + .drain(..BATCH_SIZE.min(upload_queue.len())) + .collect(); + + if !points_to_upload.is_empty() { + server_client + .upsert_points(UpsertPointsBuilder::new( + COLLECTION_NAME, + points_to_upload, + )) + .await?; + } + // @block-end process-upload-queue + + Ok(()) +} diff --git a/qdrant-landing/content/documentation/headless/snippets/tutorial-semantic-search-101/rust.rs b/qdrant-landing/content/documentation/headless/snippets/tutorial-semantic-search-101/rust.rs index d58420322..cc11d9084 100644 --- a/qdrant-landing/content/documentation/headless/snippets/tutorial-semantic-search-101/rust.rs +++ b/qdrant-landing/content/documentation/headless/snippets/tutorial-semantic-search-101/rust.rs @@ -6,8 +6,8 @@ use qdrant_client::Qdrant; pub async fn main() -> anyhow::Result<()> { // @hide-start - let QDRANT_URL = ""; - let QDRANT_API_KEY = ""; + const QDRANT_URL: &str = ""; + const QDRANT_API_KEY: &str = ""; // @hide-end // @block-start client-connection let client = Qdrant::from_url(QDRANT_URL)