Gouzi Mohaled commited on
Commit
2fdbd5c
·
1 Parent(s): 84d2a97

Ajout du dossier docs

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. docs/CODE_OF_CONDUCT.md +128 -0
  2. docs/CONTRIBUTING.md +49 -0
  3. docs/DEVELOPMENT.md +247 -0
  4. docs/QUICK_START.md +209 -0
  5. docs/grpc/docs.md +0 -0
  6. docs/imgs/call-graph-profile.png +0 -0
  7. docs/imgs/flamegraph-profile.png +0 -0
  8. docs/logo.svg +138 -0
  9. docs/redoc/.gitignore +1 -0
  10. docs/redoc/default_version.js +1 -0
  11. docs/redoc/index.html +99 -0
  12. docs/redoc/master/openapi.json +0 -0
  13. docs/redoc/v0.10.0/openapi.json +0 -0
  14. docs/redoc/v0.10.1/openapi.json +0 -0
  15. docs/redoc/v0.10.2/openapi.json +0 -0
  16. docs/redoc/v0.10.3/openapi.json +0 -0
  17. docs/redoc/v0.10.4/openapi.json +0 -0
  18. docs/redoc/v0.10.5/openapi.json +0 -0
  19. docs/redoc/v0.11.0/openapi.json +0 -0
  20. docs/redoc/v0.11.1/openapi.json +0 -0
  21. docs/redoc/v0.11.2/openapi.json +0 -0
  22. docs/redoc/v0.11.3/openapi.json +0 -0
  23. docs/redoc/v0.11.4/openapi.json +0 -0
  24. docs/redoc/v0.11.5/openapi.json +0 -0
  25. docs/redoc/v0.11.6/openapi.json +0 -0
  26. docs/redoc/v0.11.7/openapi.json +0 -0
  27. docs/redoc/v0.4.2/openapi.json +2357 -0
  28. docs/redoc/v0.5.0/openapi.json +0 -0
  29. docs/redoc/v0.5.1/openapi.json +0 -0
  30. docs/redoc/v0.6.0/openapi.json +0 -0
  31. docs/redoc/v0.7.0/openapi.json +0 -0
  32. docs/redoc/v0.8.0/openapi.json +0 -0
  33. docs/redoc/v0.8.1/openapi.json +0 -0
  34. docs/redoc/v0.8.2/openapi.json +0 -0
  35. docs/redoc/v0.8.3/openapi.json +0 -0
  36. docs/redoc/v0.8.4/openapi.json +0 -0
  37. docs/redoc/v0.8.5/openapi.json +0 -0
  38. docs/redoc/v0.8.6/openapi.json +0 -0
  39. docs/redoc/v0.9.0/openapi.json +0 -0
  40. docs/redoc/v0.9.1/openapi.json +0 -0
  41. docs/redoc/v1.0.1/openapi.json +0 -0
  42. docs/redoc/v1.0.2/openapi.json +0 -0
  43. docs/redoc/v1.0.3/openapi.json +0 -0
  44. docs/redoc/v1.1.0/openapi.json +0 -0
  45. docs/redoc/v1.1.1/openapi.json +0 -0
  46. docs/redoc/v1.1.2/openapi.json +0 -0
  47. docs/redoc/v1.1.3/openapi.json +0 -0
  48. docs/redoc/v1.10.x/openapi.json +0 -0
  49. docs/redoc/v1.11.x/openapi.json +0 -0
  50. docs/redoc/v1.12.x/openapi.json +0 -0
docs/CODE_OF_CONDUCT.md ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, religion, or sexual identity
10
+ and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or
31
+ advances of any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email
35
+ address, without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official e-mail address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at
63
+ email: [email protected].
64
+ All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+ All community leaders are obligated to respect the privacy and security of the
67
+ reporter of any incident.
68
+
69
+ ## Enforcement Guidelines
70
+
71
+ Community leaders will follow these Community Impact Guidelines in determining
72
+ the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+ ### 1. Correction
75
+
76
+ **Community Impact**: Use of inappropriate language or other behavior deemed
77
+ unprofessional or unwelcome in the community.
78
+
79
+ **Consequence**: A private, written warning from community leaders, providing
80
+ clarity around the nature of the violation and an explanation of why the
81
+ behavior was inappropriate. A public apology may be requested.
82
+
83
+ ### 2. Warning
84
+
85
+ **Community Impact**: A violation through a single incident or series
86
+ of actions.
87
+
88
+ **Consequence**: A warning with consequences for continued behavior. No
89
+ interaction with the people involved, including unsolicited interaction with
90
+ those enforcing the Code of Conduct, for a specified period of time. This
91
+ includes avoiding interactions in community spaces as well as external channels
92
+ like social media. Violating these terms may lead to a temporary or
93
+ permanent ban.
94
+
95
+ ### 3. Temporary Ban
96
+
97
+ **Community Impact**: A serious violation of community standards, including
98
+ sustained inappropriate behavior.
99
+
100
+ **Consequence**: A temporary ban from any sort of interaction or public
101
+ communication with the community for a specified period of time. No public or
102
+ private interaction with the people involved, including unsolicited interaction
103
+ with those enforcing the Code of Conduct, is allowed during this period.
104
+ Violating these terms may lead to a permanent ban.
105
+
106
+ ### 4. Permanent Ban
107
+
108
+ **Community Impact**: Demonstrating a pattern of violation of community
109
+ standards, including sustained inappropriate behavior, harassment of an
110
+ individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+ **Consequence**: A permanent ban from any sort of public interaction within
113
+ the community.
114
+
115
+ ## Attribution
116
+
117
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+ version 2.0, available at
119
+ https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120
+
121
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct
122
+ enforcement ladder](https://github.com/mozilla/diversity).
123
+
124
+ [homepage]: https://www.contributor-covenant.org
125
+
126
+ For answers to common questions about this code of conduct, see the FAQ at
127
+ https://www.contributor-covenant.org/faq. Translations are available at
128
+ https://www.contributor-covenant.org/translations.
docs/CONTRIBUTING.md ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing to Qdrant
2
+ We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
3
+
4
+ - Reporting a bug
5
+ - Discussing the current state of the code
6
+ - Submitting a fix
7
+ - Proposing new features
8
+
9
+ ## We Develop with GitHub
10
+ We use github to host code, to track issues and feature requests, as well as accept pull requests.
11
+
12
+ ## We Use [GitHub Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests
13
+ Pull requests are the best way to propose changes to the codebase (we use [GitHub Flow](https://docs.github.com/en/get-started/quickstart/github-flow)). We actively welcome your pull requests:
14
+
15
+ 1. Fork the repo and create your branch from `dev`.
16
+ 2. If you've added code that should be tested, add tests.
17
+ 3. If you've changed APIs, update the documentation and API Schema definitions (see [development docs](https://github.com/qdrant/qdrant/blob/master/docs/DEVELOPMENT.md#api-changes))
18
+ 4. Ensure the test suite passes.
19
+ 5. Make sure your code lints (with cargo).
20
+ 6. Issue that pull request!
21
+
22
+ ## Any contributions you make will be under the Apache License 2.0
23
+ In short, when you submit code changes, your submissions are understood to be under the same [Apache License 2.0](https://choosealicense.com/licenses/apache-2.0/) that covers the project. Feel free to contact the maintainers if that's a concern.
24
+
25
+ ## Report bugs using GitHub's [issues](https://github.com/qdrant/qdrant/issues)
26
+ We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/qdrant/qdrant/issues/new/choose); it's that easy!
27
+
28
+ ## Write bug reports with detail, background, and sample code
29
+
30
+ **Great Bug Reports** tend to have:
31
+
32
+ - A quick summary and/or background
33
+ - Steps to reproduce
34
+ - Be specific!
35
+ - Give sample code if you can.
36
+ - What you expected would happen
37
+ - What actually happens
38
+ - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
39
+
40
+ ## Use a Consistent Coding Style
41
+
42
+ If you are modifying Rust code, make sure it has no warnings from Cargo and follow [Rust code style](https://doc.rust-lang.org/1.0.0/style/).
43
+ The project uses [rustfmt](https://github.com/rust-lang/rustfmt) formatter. Please ensure to run it using the
44
+ ```cargo +nightly fmt --all``` command. The project also use [clippy](https://github.com/rust-lang/rust-clippy) lint collection,
45
+ so please ensure running ``cargo clippy --workspace --all-features`` before submitting the PR.
46
+
47
+ ## License
48
+ By contributing, you agree that your contributions will be licensed under its Apache License 2.0.
49
+
docs/DEVELOPMENT.md ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # Developer's guide to Qdrant
3
+
4
+
5
+ ## Build Qdrant
6
+
7
+ ### Docker 🐳
8
+
9
+ Build your own from source
10
+
11
+ ```bash
12
+ docker build . --tag=qdrant/qdrant
13
+ ```
14
+
15
+ Or use latest pre-built image from [DockerHub](https://hub.docker.com/r/qdrant/qdrant)
16
+
17
+ ```bash
18
+ docker pull qdrant/qdrant
19
+ ```
20
+
21
+ To run the container, use the command:
22
+
23
+ ```bash
24
+ docker run -p 6333:6333 qdrant/qdrant
25
+ ```
26
+
27
+ And once you need a fine-grained setup, you can also define a storage path and custom configuration:
28
+
29
+ ```bash
30
+ docker run -p 6333:6333 \
31
+ -v $(pwd)/path/to/data:/qdrant/storage \
32
+ -v $(pwd)/path/to/snapshots:/qdrant/snapshots \
33
+ -v $(pwd)/path/to/custom_config.yaml:/qdrant/config/production.yaml \
34
+ qdrant/qdrant
35
+ ```
36
+
37
+ * `/qdrant/storage` - is the place where Qdrant persists all your data.
38
+ Make sure to mount it as a volume, otherwise docker will drop it with the container.
39
+ - `/qdrant/snapshots` - is the place where Qdrant stores [snapshots](https://qdrant.tech/documentation/concepts/snapshots/)
40
+ * `/qdrant/config/production.yaml` - is the file with engine configuration. You can override any value from the [reference config](https://github.com/qdrant/qdrant/blob/master/config/config.yaml)
41
+
42
+ Now Qdrant should be accessible at [localhost:6333](http://localhost:6333/).
43
+
44
+
45
+ ### Local development
46
+ #### Linux/Debian/MacOS
47
+ To run Qdrant on local development environment you need to install below:
48
+ - Install Rust, follow: [install rust](https://www.rust-lang.org/tools/install)
49
+ - Install `rustfmt` toolchain for Rust
50
+ ```shell
51
+ rustup component add rustfmt
52
+ ```
53
+ - Install dependencies:
54
+ ```shell
55
+ sudo apt-get update -y
56
+ sudo apt-get upgrade -y
57
+ sudo apt-get install -y curl unzip gcc-multilib \
58
+ clang cmake jq \
59
+ g++-9-aarch64-linux-gnu \
60
+ gcc-9-aarch64-linux-gnu
61
+ ```
62
+ - Install `protoc` from source
63
+ ```shell
64
+ PROTOC_VERSION=22.2
65
+ PKG_NAME=$(uname -s | awk '{print ($1 == "Darwin") ? "osx-universal_binary" : (($1 == "Linux") ? "linux-x86_64" : "")}')
66
+
67
+ # curl `proto` source file
68
+ curl -LO https://github.com/protocolbuffers/protobuf/releases//download/v$PROTOC_VERSION/protoc-$PROTOC_VERSION-$PKG_NAME.zip
69
+
70
+ unzip protoc-$PROTOC_VERSION-$PKG_NAME.zip -d $HOME/.local
71
+
72
+ export PATH="$PATH:$HOME/.local/bin"
73
+
74
+ # remove source file if not needed
75
+ rm protoc-$PROTOC_VERSION-$PKG_NAME.zip
76
+
77
+ # check installed `protoc` version
78
+ protoc --version
79
+ ```
80
+ - Build and run the app
81
+ ```shell
82
+ cargo build --release --bin qdrant
83
+
84
+ ./target/release/qdrant
85
+ ```
86
+ - Install Python dependencies for testing
87
+ ```shell
88
+ poetry -C tests install --sync
89
+ ```
90
+ Then you could use `poetry -C run pytest tests/openapi` and `poetry -C run pytest tests/consensus_tests` to run the tests.
91
+ - Use the web UI
92
+
93
+ Web UI repo is [in a separate repo](https://github.com/qdrant/qdrant-web-ui), but there's a utility script to sync it to the `static` folder:
94
+ ```shell
95
+ ./tools/sync-web-ui.sh
96
+ ```
97
+
98
+ ### Nix/NixOS
99
+ If you are using [Nix package manager](https://nixos.org/) (available for Linux and MacOS), you can run `nix-shell` in the project root to get a shell with all dependencies installed.
100
+ It includes dependencies to build Rust code as well as to run Python tests and various tools in the `./tools` directory.
101
+
102
+ ## Profiling
103
+
104
+ There are several benchmarks implemented in Qdrant. Benchmarks are not included in CI/CD and might take some time to execute.
105
+ So the expected approach to benchmarking is to run only ones which might be affected by your changes.
106
+
107
+ To run benchmark, use the following command inside a related sub-crate:
108
+
109
+ ```bash
110
+ cargo bench --bench name_of_benchmark
111
+ ```
112
+
113
+ In this case you will see the execution timings and, if you launched this bench earlier, the difference in execution time.
114
+
115
+ Example output:
116
+
117
+ ```
118
+ scoring-vector/basic-score-point
119
+ time: [111.81 us 112.07 us 112.31 us]
120
+ change: [+19.567% +20.454% +21.404%] (p = 0.00 < 0.05)
121
+ Performance has regressed.
122
+ Found 9 outliers among 100 measurements (9.00%)
123
+ 3 (3.00%) low severe
124
+ 3 (3.00%) low mild
125
+ 2 (2.00%) high mild
126
+ 1 (1.00%) high severe
127
+ scoring-vector/basic-score-point-10x
128
+ time: [111.86 us 112.44 us 113.04 us]
129
+ change: [-1.6120% -0.5554% +0.5103%] (p = 0.32 > 0.05)
130
+ No change in performance detected.
131
+ Found 1 outliers among 100 measurements (1.00%)
132
+ 1 (1.00%) high mild
133
+ ```
134
+
135
+
136
+ ### FlameGraph and call-graph visualisation
137
+ To run benchmarks with profiler to generate FlameGraph - use the following command:
138
+
139
+ ```bash
140
+ cargo bench --bench name_of_benchmark -- --profile-time=60
141
+ ```
142
+
143
+ This command will run each benchmark iterator for `60` seconds and generate FlameGraph svg along with profiling records files.
144
+ These records could later be used to generate visualisation of the call-graph.
145
+
146
+ ![FlameGraph example](./imgs/flamegraph-profile.png)
147
+
148
+ Use [pprof](https://github.com/google/pprof) and the following command to generate `svg` with a call graph:
149
+
150
+ ```bash
151
+ ~/go/bin/pprof -output=profile.svg -svg ${qdrant_root}/target/criterion/${benchmark_name}/${function_name}/profile/profile.pb
152
+ ```
153
+
154
+ ![call-graph example](./imgs/call-graph-profile.png)
155
+
156
+ ### Real-time profiling
157
+
158
+ Qdrant have basic [`tracing`] support with [`Tracy`] profiler and [`tokio-console`] integrations
159
+ that can be enabled with optional features.
160
+
161
+ - [`tracing`] is an _optional_ dependency that can be enabled with `tracing` feature
162
+ - `tracy` feature enables [`Tracy`] profiler integration
163
+ - `console` feature enables [`tokio-console`] integration
164
+ - note, that you'll also have to [pass `--cfg tokio_unstable` arguments to `rustc`][tokio-tracing] to enable this feature
165
+ - by default [`tokio-console`] binds to `127.0.0.1:6669`
166
+ - if you want to connect [`tokio-console`] to Qdrant instance running inside a Docker container
167
+ or on remote server, you can define `TOKIO_CONSOLE_BIND` when running Qdrant to override it
168
+ (e.g., `TOKIO_CONSOLE_BIND=0.0.0.0:6669` to listen on all interfaces)
169
+ - `tokio-tracing` feature explicitly enables [`Tokio` crate tracing][tokio-tracing]
170
+ - note, that you'll also have to [pass `--cfg tokio_unstable` arguments to `rustc`][tokio-tracing] to enable this feature
171
+ - this is required (and enabled automatically) by the `console` feature
172
+ - but you can enable it explicitly with the `tracy` feature, to see Tokio traces in [`Tracy`] profiler
173
+
174
+ Qdrant code is **not** instrumented by default, so you'll have to manually add `#[tracing::instrument]` attributes
175
+ on functions and methods that you want to profile.
176
+
177
+ Qdrant uses [`tracing-log`] as the [`log`] backend, so `log` and `log-always` features of the [`tracing`] crate
178
+ [should _not_ be enabled][tracing-log-warning]!
179
+
180
+ ```rust
181
+ // `tracing` crate is an *optional* dependency in `lib/*` crates, so if you want the code to compile
182
+ // when `tracing` feature is disabled, you have to use `#[cfg_attr(...)]`...
183
+ //
184
+ // See https://doc.rust-lang.org/reference/conditional-compilation.html#the-cfg_attr-attribute
185
+ #[cfg_attr(feature = "tracing", tracing::instrument)]
186
+ fn my_function(some_parameter: String) {
187
+ // ...
188
+ }
189
+
190
+ // ...or if you just want to do some quick-and-dirty profiling, you can use `#[tracing::instrument]`
191
+ // directly, just don't forget to add `--features tracing` when running `cargo` (or add `tracing`
192
+ // to default features in `Cargo.toml`)
193
+ #[tracing::instrument]
194
+ fn some_other_function() {
195
+ // ...
196
+ }
197
+ ```
198
+
199
+ [`tracing`]: https://docs.rs/tracing/latest/tracing/
200
+ [`Tracy`]: https://github.com/wolfpld/tracy
201
+ [`tokio-console`]: https://docs.rs/tokio-console/latest/tokio_console/
202
+ [tokio-tracing]: https://docs.rs/tokio/latest/tokio/#unstable-features
203
+ [`tracing-log`]: https://docs.rs/tracing-log/latest/tracing_log/
204
+ [`log`]: https://docs.rs/log/latest/log/
205
+ [tracing-log-warning]: https://docs.rs/tracing-log/latest/tracing_log/#caution-mixing-both-conversions
206
+
207
+ ## API changes
208
+
209
+ ### REST
210
+
211
+ Qdrant uses the [openapi](https://spec.openapis.org/oas/latest.html) specification to document its API.
212
+
213
+ This means changes to the API must be followed by changes to the specification.
214
+ This is enforced by CI.
215
+
216
+ Here is a quick step-by-step guide:
217
+
218
+ 1. code endpoints and model in Rust
219
+ 2. change specs in `/openapi/*ytt.yaml`
220
+ 3. add new schema definitions to `src/schema_generator.rs`
221
+ 4. run `./tools/generate_openapi_models.sh` to generate specs
222
+ 5. update integration tests `tests/openapi` and run them with `pytest tests/openapi` (use poetry or nix to get `pytest`)
223
+ 6. expose file by starting an HTTP server, for instance `python -m http.server`, in `/docs/redoc`
224
+ 7. validate specs by browsing redoc on `http://localhost:8000/?v=master`
225
+ 8. validate `openapi-merged.yaml` using [swagger editor](https://editor.swagger.io/)
226
+
227
+ ### gRPC
228
+
229
+ Qdrant uses [tonic](https://github.com/hyperium/tonic) to serve gRPC traffic.
230
+
231
+ Our protocol buffers are defined in `lib/api/src/grpc/proto/*.proto`
232
+
233
+ 1. define request and response types using protocol buffers (use [oneOf](https://developers.google.com/protocol-buffers/docs/proto3#oneof) for enums payloads)
234
+ 2. specify RPC methods inside the service definition using protocol buffers
235
+ 3. `cargo build` will generate the struct definitions and a service trait
236
+ 4. implement the service trait in Rust
237
+ 5. start server `cargo run --bin qdrant`
238
+ 6. run integration test `./tests/basic_grpc_test.sh`
239
+ 7. generate docs `./tools/generate_grpc_docs.sh`
240
+
241
+ Here is a good [tonic tutorial](https://github.com/hyperium/tonic/blob/master/examples/routeguide-tutorial.md#defining-the-service) for reference.
242
+
243
+ ### System integration
244
+
245
+ On top of the API definitions, Qdrant has a few system integrations that need to be considered when making changes:
246
+ 1. add new endpoints to the metrics allow lists in `src/common/metrics.rs`
247
+ 2. test the JWT integration in `tests/auth_tests`
docs/QUICK_START.md ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Quick Start
2
+
3
+ This example covers the most basic use-case - collection creation and basic vector search.
4
+ For additional information please refer to the [API documentation](https://api.qdrant.tech/).
5
+
6
+ ## Docker 🐳
7
+
8
+ Use latest pre-built image from [DockerHub](https://hub.docker.com/r/qdrant/qdrant)
9
+
10
+ ```bash
11
+ docker pull qdrant/qdrant
12
+ ```
13
+
14
+ Run it with default configuration:
15
+
16
+ ```bash
17
+ docker run -p 6333:6333 qdrant/qdrant
18
+ ```
19
+
20
+ Build your own from source
21
+
22
+ ```bash
23
+ docker build . --tag=qdrant/qdrant
24
+ ```
25
+
26
+ And once you need a fine-grained setup, you can also define a storage path and custom configuration:
27
+
28
+ ```bash
29
+ docker run -p 6333:6333 \
30
+ -v $(pwd)/path/to/data:/qdrant/storage \
31
+ -v $(pwd)/path/to/snapshots:/qdrant/snapshots \
32
+ -v $(pwd)/path/to/custom_config.yaml:/qdrant/config/production.yaml \
33
+ qdrant/qdrant
34
+ ```
35
+
36
+ - `/qdrant/storage` - is the place where Qdrant persists all your data.
37
+ Make sure to mount it as a volume, otherwise docker will drop it with the container.
38
+ - `/qdrant/snapshots` - is the place where Qdrant stores [snapshots](https://qdrant.tech/documentation/concepts/snapshots/)
39
+ - `/qdrant/config/production.yaml` - is the file with engine configuration. You can override any value from the [reference config](https://github.com/qdrant/qdrant/blob/master/config/config.yaml). In a real production environment, you should enable authentication by setting `service.apiKey`.
40
+ - For production environments, consider also setting [`--read-only`](https://docs.docker.com/reference/cli/docker/container/run/#read-only) and `--user=1000:2000` to further secure your Qdrant instance. Or use [our Helm chart](https://github.com/qdrant/qdrant-helm) or [Qdrant Cloud](https://qdrant.tech/documentation/cloud/) which sets these by default.
41
+
42
+ Now Qdrant should be accessible at [localhost:6333](http://localhost:6333/).
43
+
44
+ ## Create collection
45
+
46
+ First - let's create a collection with dot-production metric.
47
+
48
+ ```bash
49
+ curl -X PUT 'http://localhost:6333/collections/test_collection' \
50
+ -H 'Content-Type: application/json' \
51
+ --data-raw '{
52
+ "vectors": {
53
+ "size": 4,
54
+ "distance": "Dot"
55
+ }
56
+ }'
57
+ ```
58
+
59
+ Expected response:
60
+
61
+ ```json
62
+ {
63
+ "result": true,
64
+ "status": "ok",
65
+ "time": 0.031095451
66
+ }
67
+ ```
68
+
69
+ We can ensure that collection was created:
70
+
71
+ ```bash
72
+ curl 'http://localhost:6333/collections/test_collection'
73
+ ```
74
+
75
+ Expected response:
76
+
77
+ ```json
78
+ {
79
+ "result": {
80
+ "status": "green",
81
+ "vectors_count": 0,
82
+ "segments_count": 5,
83
+ "disk_data_size": 0,
84
+ "ram_data_size": 0,
85
+ "config": {
86
+ "params": {
87
+ "vectors": {
88
+ "size": 4,
89
+ "distance": "Dot"
90
+ }
91
+ },
92
+ "hnsw_config": {
93
+ "m": 16,
94
+ "ef_construct": 100,
95
+ "full_scan_threshold": 10000
96
+ },
97
+ "optimizer_config": {
98
+ "deleted_threshold": 0.2,
99
+ "vacuum_min_vector_number": 1000,
100
+ "default_segment_number": 2,
101
+ "max_segment_size": null,
102
+ "memmap_threshold": null,
103
+ "indexing_threshold": 20000,
104
+ "flush_interval_sec": 5,
105
+ "max_optimization_threads": null
106
+ },
107
+ "wal_config": {
108
+ "wal_capacity_mb": 32,
109
+ "wal_segments_ahead": 0
110
+ }
111
+ }
112
+ },
113
+ "status": "ok",
114
+ "time": 2.1199e-5
115
+ }
116
+ ```
117
+
118
+ ## Add points
119
+
120
+ Let's now add vectors with some payload:
121
+
122
+ ```bash
123
+ curl -L -X PUT 'http://localhost:6333/collections/test_collection/points?wait=true' \
124
+ -H 'Content-Type: application/json' \
125
+ --data-raw '{
126
+ "points": [
127
+ {"id": 1, "vector": [0.05, 0.61, 0.76, 0.74], "payload": {"city": "Berlin"}},
128
+ {"id": 2, "vector": [0.19, 0.81, 0.75, 0.11], "payload": {"city": ["Berlin", "London"] }},
129
+ {"id": 3, "vector": [0.36, 0.55, 0.47, 0.94], "payload": {"city": ["Berlin", "Moscow"] }},
130
+ {"id": 4, "vector": [0.18, 0.01, 0.85, 0.80], "payload": {"city": ["London", "Moscow"] }},
131
+ {"id": 5, "vector": [0.24, 0.18, 0.22, 0.44], "payload": {"count": [0] }},
132
+ {"id": 6, "vector": [0.35, 0.08, 0.11, 0.44]}
133
+ ]
134
+ }'
135
+ ```
136
+
137
+ Expected response:
138
+
139
+ ```json
140
+ {
141
+ "result": {
142
+ "operation_id": 0,
143
+ "status": "completed"
144
+ },
145
+ "status": "ok",
146
+ "time": 0.000206061
147
+ }
148
+ ```
149
+
150
+ ## Search with filtering
151
+
152
+ Let's start with a basic request:
153
+
154
+ ```bash
155
+ curl -L -X POST 'http://localhost:6333/collections/test_collection/points/search' \
156
+ -H 'Content-Type: application/json' \
157
+ --data-raw '{
158
+ "vector": [0.2,0.1,0.9,0.7],
159
+ "top": 3
160
+ }'
161
+ ```
162
+
163
+ Expected response:
164
+
165
+ ```json
166
+ {
167
+ "result": [
168
+ { "id": 4, "score": 1.362, "payload": null, "version": 0 },
169
+ { "id": 1, "score": 1.273, "payload": null, "version": 0 },
170
+ { "id": 3, "score": 1.208, "payload": null, "version": 0 }
171
+ ],
172
+ "status": "ok",
173
+ "time": 0.000055785
174
+ }
175
+ ```
176
+
177
+ But result is different if we add a filter:
178
+
179
+ ```bash
180
+ curl -L -X POST 'http://localhost:6333/collections/test_collection/points/search' \
181
+ -H 'Content-Type: application/json' \
182
+ --data-raw '{
183
+ "filter": {
184
+ "should": [
185
+ {
186
+ "key": "city",
187
+ "match": {
188
+ "value": "London"
189
+ }
190
+ }
191
+ ]
192
+ },
193
+ "vector": [0.2, 0.1, 0.9, 0.7],
194
+ "top": 3
195
+ }'
196
+ ```
197
+
198
+ Expected response:
199
+
200
+ ```json
201
+ {
202
+ "result": [
203
+ { "id": 4, "score": 1.362 },
204
+ { "id": 2, "score": 0.871 }
205
+ ],
206
+ "status": "ok",
207
+ "time": 0.000093972
208
+ }
209
+ ```
docs/grpc/docs.md ADDED
The diff for this file is too large to render. See raw diff
 
docs/imgs/call-graph-profile.png ADDED
docs/imgs/flamegraph-profile.png ADDED
docs/logo.svg ADDED
docs/redoc/.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ /openapi.json
docs/redoc/default_version.js ADDED
@@ -0,0 +1 @@
 
 
1
+ const defaultApiVersion = 'v1.12.x';
docs/redoc/index.html ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>ReDoc</title>
5
+ <!-- needed for adaptive design -->
6
+ <meta charset="utf-8"/>
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
9
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
10
+ integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
11
+
12
+ <!--
13
+ ReDoc doesn't change outer page styles
14
+ -->
15
+ <style>
16
+ body {
17
+ margin: 0;
18
+ padding: 0;
19
+ }
20
+ </style>
21
+ <script src="./default_version.js"></script>
22
+
23
+ <script>
24
+ const url_string = window.location.href;
25
+ const url = new URL(url_string);
26
+ const version = url.searchParams.get("v") || defaultApiVersion;
27
+ </script>
28
+ </head>
29
+ <body>
30
+ <nav class="navbar navbar-light justify-content-between" style="background-color: rgb(250, 250, 250);">
31
+ <a class="navbar-brand" href="#">
32
+ <img src="../logo.svg" height="30">
33
+ </a>
34
+
35
+ <div class="btn-group">
36
+ <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true"
37
+ aria-expanded="false">
38
+ Version
39
+ </button>
40
+ <div class="dropdown-menu dropdown-menu-right">
41
+ <a href="?v=master" class="dropdown-item" type="button">master</a>
42
+ <a href="?v=v1.12.x" class="dropdown-item" type="button">v1.12.x</a>
43
+ <a href="?v=v1.11.x" class="dropdown-item" type="button">v1.11.x</a>
44
+ <a href="?v=v1.10.x" class="dropdown-item" type="button">v1.10.x</a>
45
+ <a href="?v=v1.9.x" class="dropdown-item" type="button">v1.9.x</a>
46
+ <a href="?v=v1.8.x" class="dropdown-item" type="button">v1.8.x</a>
47
+ <a href="?v=v1.7.x" class="dropdown-item" type="button">v1.7.x</a>
48
+ <a href="?v=v1.6.x" class="dropdown-item" type="button">v1.6.x</a>
49
+ <a href="?v=v1.5.x" class="dropdown-item" type="button">v1.5.x</a>
50
+ <a href="?v=v1.4.x" class="dropdown-item" type="button">v1.4.x</a>
51
+ <a href="?v=v1.3.x" class="dropdown-item" type="button">v1.3.x</a>
52
+ <a href="?v=v1.2.x" class="dropdown-item" type="button">v1.2.x</a>
53
+ <a href="?v=v1.1.3" class="dropdown-item" type="button">v1.1.3</a>
54
+ <a href="?v=v1.1.2" class="dropdown-item" type="button">v1.1.2</a>
55
+ <a href="?v=v1.1.1" class="dropdown-item" type="button">v1.1.1</a>
56
+ <a href="?v=v1.1.0" class="dropdown-item" type="button">v1.1.0</a>
57
+ <a href="?v=v1.0.3" class="dropdown-item" type="button">v1.0.3</a>
58
+ <a href="?v=v1.0.2" class="dropdown-item" type="button">v1.0.2</a>
59
+ <a href="?v=v1.0.1" class="dropdown-item" type="button">v1.0.1</a>
60
+ <a href="?v=v0.11.7" class="dropdown-item" type="button">v0.11.7</a>
61
+ </div>
62
+ </div>
63
+
64
+ </nav>
65
+
66
+ <redoc id="redoc-container" spec-url='./openapi.json' theme='
67
+ {
68
+ "colors": {
69
+ "primary": {
70
+ "main": "#bc1439"
71
+ }
72
+ },
73
+ "rightPanel": {
74
+ "backgroundColor": "#182b3a"
75
+ },
76
+ "codeBlock": {
77
+ "backgroundColor": "#182b3a"
78
+ }
79
+ }
80
+ '></redoc>
81
+
82
+ <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
83
+ integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
84
+ crossorigin="anonymous"></script>
85
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
86
+ integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
87
+ crossorigin="anonymous"></script>
88
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
89
+ integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
90
+ crossorigin="anonymous"></script>
91
+
92
+ <script>
93
+ $('#redoc-container').attr("spec-url", "./" + version + "/openapi.json");
94
+ </script>
95
+
96
+ <script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"></script>
97
+
98
+ </body>
99
+ </html>
docs/redoc/master/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.10.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.10.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.10.2/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.10.3/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.10.4/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.10.5/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.2/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.3/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.4/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.5/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.6/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.11.7/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.4.2/openapi.json ADDED
@@ -0,0 +1,2357 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "components": {
3
+ "schemas": {
4
+ "AliasOperations": {
5
+ "anyOf": [
6
+ {
7
+ "additionalProperties": false,
8
+ "description": "Create alternative name for a collection. Collection will be available under both names for search, retrieve,",
9
+ "properties": {
10
+ "create_alias": {
11
+ "properties": {
12
+ "alias_name": {
13
+ "type": "string"
14
+ },
15
+ "collection_name": {
16
+ "type": "string"
17
+ }
18
+ },
19
+ "required": [
20
+ "alias_name",
21
+ "collection_name"
22
+ ],
23
+ "type": "object"
24
+ }
25
+ },
26
+ "required": [
27
+ "create_alias"
28
+ ],
29
+ "type": "object"
30
+ },
31
+ {
32
+ "additionalProperties": false,
33
+ "description": "Delete alias if exists",
34
+ "properties": {
35
+ "delete_alias": {
36
+ "properties": {
37
+ "alias_name": {
38
+ "type": "string"
39
+ }
40
+ },
41
+ "required": [
42
+ "alias_name"
43
+ ],
44
+ "type": "object"
45
+ }
46
+ },
47
+ "required": [
48
+ "delete_alias"
49
+ ],
50
+ "type": "object"
51
+ },
52
+ {
53
+ "additionalProperties": false,
54
+ "description": "Change alias to a new one",
55
+ "properties": {
56
+ "rename_alias": {
57
+ "properties": {
58
+ "new_alias_name": {
59
+ "type": "string"
60
+ },
61
+ "old_alias_name": {
62
+ "type": "string"
63
+ }
64
+ },
65
+ "required": [
66
+ "new_alias_name",
67
+ "old_alias_name"
68
+ ],
69
+ "type": "object"
70
+ }
71
+ },
72
+ "required": [
73
+ "rename_alias"
74
+ ],
75
+ "type": "object"
76
+ }
77
+ ]
78
+ },
79
+ "CollectionConfig": {
80
+ "properties": {
81
+ "hnsw_config": {
82
+ "$ref": "#/components/schemas/HnswConfig"
83
+ },
84
+ "optimizer_config": {
85
+ "$ref": "#/components/schemas/OptimizersConfig"
86
+ },
87
+ "params": {
88
+ "$ref": "#/components/schemas/CollectionParams"
89
+ },
90
+ "wal_config": {
91
+ "$ref": "#/components/schemas/WalConfig"
92
+ }
93
+ },
94
+ "required": [
95
+ "hnsw_config",
96
+ "optimizer_config",
97
+ "params",
98
+ "wal_config"
99
+ ],
100
+ "type": "object"
101
+ },
102
+ "CollectionDescription": {
103
+ "properties": {
104
+ "name": {
105
+ "type": "string"
106
+ }
107
+ },
108
+ "required": [
109
+ "name"
110
+ ],
111
+ "type": "object"
112
+ },
113
+ "CollectionInfo": {
114
+ "description": "Current statistics and configuration of the collection.",
115
+ "properties": {
116
+ "config": {
117
+ "$ref": "#/components/schemas/CollectionConfig"
118
+ },
119
+ "disk_data_size": {
120
+ "description": "Disk space, used by collection",
121
+ "format": "uint",
122
+ "minimum": 0,
123
+ "type": "integer"
124
+ },
125
+ "payload_schema": {
126
+ "additionalProperties": {
127
+ "$ref": "#/components/schemas/PayloadSchemaInfo"
128
+ },
129
+ "description": "Types of stored payload",
130
+ "type": "object"
131
+ },
132
+ "ram_data_size": {
133
+ "description": "RAM used by collection",
134
+ "format": "uint",
135
+ "minimum": 0,
136
+ "type": "integer"
137
+ },
138
+ "segments_count": {
139
+ "description": "Number of segments in collection",
140
+ "format": "uint",
141
+ "minimum": 0,
142
+ "type": "integer"
143
+ },
144
+ "status": {
145
+ "$ref": "#/components/schemas/CollectionStatus"
146
+ },
147
+ "vectors_count": {
148
+ "description": "Number of vectors in collection",
149
+ "format": "uint",
150
+ "minimum": 0,
151
+ "type": "integer"
152
+ }
153
+ },
154
+ "required": [
155
+ "config",
156
+ "disk_data_size",
157
+ "payload_schema",
158
+ "ram_data_size",
159
+ "segments_count",
160
+ "status",
161
+ "vectors_count"
162
+ ],
163
+ "type": "object"
164
+ },
165
+ "CollectionParams": {
166
+ "properties": {
167
+ "distance": {
168
+ "$ref": "#/components/schemas/Distance"
169
+ },
170
+ "vector_size": {
171
+ "description": "Size of a vectors used",
172
+ "format": "uint",
173
+ "minimum": 0,
174
+ "type": "integer"
175
+ }
176
+ },
177
+ "required": [
178
+ "distance",
179
+ "vector_size"
180
+ ],
181
+ "type": "object"
182
+ },
183
+ "CollectionStatus": {
184
+ "enum": [
185
+ "green",
186
+ "yellow",
187
+ "red"
188
+ ],
189
+ "type": "string"
190
+ },
191
+ "CollectionUpdateOperations": {
192
+ "anyOf": [
193
+ {
194
+ "$ref": "#/components/schemas/PointOperations"
195
+ },
196
+ {
197
+ "$ref": "#/components/schemas/PayloadOps"
198
+ },
199
+ {
200
+ "$ref": "#/components/schemas/FieldIndexOperations"
201
+ }
202
+ ]
203
+ },
204
+ "CollectionsResponse": {
205
+ "properties": {
206
+ "collections": {
207
+ "items": {
208
+ "$ref": "#/components/schemas/CollectionDescription"
209
+ },
210
+ "type": "array"
211
+ }
212
+ },
213
+ "required": [
214
+ "collections"
215
+ ],
216
+ "type": "object"
217
+ },
218
+ "Condition": {
219
+ "anyOf": [
220
+ {
221
+ "$ref": "#/components/schemas/FieldCondition"
222
+ },
223
+ {
224
+ "$ref": "#/components/schemas/HasIdCondition"
225
+ },
226
+ {
227
+ "$ref": "#/components/schemas/Filter"
228
+ }
229
+ ]
230
+ },
231
+ "Distance": {
232
+ "description": "Type of internal tags, build from payload Distance function types used to compare vectors",
233
+ "enum": [
234
+ "Cosine",
235
+ "Euclid",
236
+ "Dot"
237
+ ],
238
+ "type": "string"
239
+ },
240
+ "ErrorResponse": {
241
+ "properties": {
242
+ "result": {
243
+ "nullable": true,
244
+ "type": "object"
245
+ },
246
+ "status": {
247
+ "properties": {
248
+ "error": {
249
+ "description": "Description of the occurred error.",
250
+ "type": "string"
251
+ }
252
+ },
253
+ "type": "object"
254
+ },
255
+ "time": {
256
+ "description": "Time spent to process this request",
257
+ "format": "float",
258
+ "type": "number"
259
+ }
260
+ },
261
+ "type": "object"
262
+ },
263
+ "FieldCondition": {
264
+ "properties": {
265
+ "geo_bounding_box": {
266
+ "anyOf": [
267
+ {
268
+ "$ref": "#/components/schemas/GeoBoundingBox"
269
+ },
270
+ {
271
+ "nullable": true
272
+ }
273
+ ],
274
+ "description": "Check if points geo location lies in a given area"
275
+ },
276
+ "geo_radius": {
277
+ "anyOf": [
278
+ {
279
+ "$ref": "#/components/schemas/GeoRadius"
280
+ },
281
+ {
282
+ "nullable": true
283
+ }
284
+ ],
285
+ "description": "Check if geo point is within a given radius"
286
+ },
287
+ "key": {
288
+ "type": "string"
289
+ },
290
+ "match": {
291
+ "anyOf": [
292
+ {
293
+ "$ref": "#/components/schemas/Match"
294
+ },
295
+ {
296
+ "nullable": true
297
+ }
298
+ ],
299
+ "description": "Check if point has field with a given value"
300
+ },
301
+ "range": {
302
+ "anyOf": [
303
+ {
304
+ "$ref": "#/components/schemas/Range"
305
+ },
306
+ {
307
+ "nullable": true
308
+ }
309
+ ],
310
+ "description": "Check if points value lies in a given range"
311
+ }
312
+ },
313
+ "required": [
314
+ "key"
315
+ ],
316
+ "type": "object"
317
+ },
318
+ "FieldIndexOperations": {
319
+ "anyOf": [
320
+ {
321
+ "additionalProperties": false,
322
+ "description": "Create index for payload field",
323
+ "properties": {
324
+ "create_index": {
325
+ "type": "string"
326
+ }
327
+ },
328
+ "required": [
329
+ "create_index"
330
+ ],
331
+ "type": "object"
332
+ },
333
+ {
334
+ "additionalProperties": false,
335
+ "description": "Delete index for the field",
336
+ "properties": {
337
+ "delete_index": {
338
+ "type": "string"
339
+ }
340
+ },
341
+ "required": [
342
+ "delete_index"
343
+ ],
344
+ "type": "object"
345
+ }
346
+ ]
347
+ },
348
+ "Filter": {
349
+ "additionalProperties": false,
350
+ "properties": {
351
+ "must": {
352
+ "description": "All conditions must match",
353
+ "items": {
354
+ "$ref": "#/components/schemas/Condition"
355
+ },
356
+ "nullable": true,
357
+ "type": "array"
358
+ },
359
+ "must_not": {
360
+ "description": "All conditions must NOT match",
361
+ "items": {
362
+ "$ref": "#/components/schemas/Condition"
363
+ },
364
+ "nullable": true,
365
+ "type": "array"
366
+ },
367
+ "should": {
368
+ "description": "At least one of thous conditions should match",
369
+ "items": {
370
+ "$ref": "#/components/schemas/Condition"
371
+ },
372
+ "nullable": true,
373
+ "type": "array"
374
+ }
375
+ },
376
+ "type": "object"
377
+ },
378
+ "GeoBoundingBox": {
379
+ "properties": {
380
+ "bottom_right": {
381
+ "$ref": "#/components/schemas/GeoPoint"
382
+ },
383
+ "top_left": {
384
+ "$ref": "#/components/schemas/GeoPoint"
385
+ }
386
+ },
387
+ "required": [
388
+ "bottom_right",
389
+ "top_left"
390
+ ],
391
+ "type": "object"
392
+ },
393
+ "GeoPoint": {
394
+ "properties": {
395
+ "lat": {
396
+ "format": "double",
397
+ "type": "number"
398
+ },
399
+ "lon": {
400
+ "format": "double",
401
+ "type": "number"
402
+ }
403
+ },
404
+ "required": [
405
+ "lat",
406
+ "lon"
407
+ ],
408
+ "type": "object"
409
+ },
410
+ "GeoRadius": {
411
+ "properties": {
412
+ "center": {
413
+ "$ref": "#/components/schemas/GeoPoint"
414
+ },
415
+ "radius": {
416
+ "description": "Radius of the area in meters",
417
+ "format": "double",
418
+ "type": "number"
419
+ }
420
+ },
421
+ "required": [
422
+ "center",
423
+ "radius"
424
+ ],
425
+ "type": "object"
426
+ },
427
+ "HasIdCondition": {
428
+ "properties": {
429
+ "has_id": {
430
+ "items": {
431
+ "format": "uint64",
432
+ "minimum": 0,
433
+ "type": "integer"
434
+ },
435
+ "type": "array",
436
+ "uniqueItems": true
437
+ }
438
+ },
439
+ "required": [
440
+ "has_id"
441
+ ],
442
+ "type": "object"
443
+ },
444
+ "HnswConfig": {
445
+ "properties": {
446
+ "ef_construct": {
447
+ "description": "Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index.",
448
+ "format": "uint",
449
+ "minimum": 0,
450
+ "type": "integer"
451
+ },
452
+ "full_scan_threshold": {
453
+ "description": "Minimal amount of points for additional payload-based indexing. If payload chunk is smaller than `full_scan_threshold` additional indexing won't be used - in this case full-scan search should be preferred by query planner and additional indexing is not required.",
454
+ "format": "uint",
455
+ "minimum": 0,
456
+ "type": "integer"
457
+ },
458
+ "m": {
459
+ "description": "Number of edges per node in the index graph. Larger the value - more accurate the search, more space required.",
460
+ "format": "uint",
461
+ "minimum": 0,
462
+ "type": "integer"
463
+ }
464
+ },
465
+ "required": [
466
+ "ef_construct",
467
+ "full_scan_threshold",
468
+ "m"
469
+ ],
470
+ "type": "object"
471
+ },
472
+ "HnswConfigDiff": {
473
+ "properties": {
474
+ "ef_construct": {
475
+ "description": "Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index.",
476
+ "format": "uint",
477
+ "minimum": 0,
478
+ "nullable": true,
479
+ "type": "integer"
480
+ },
481
+ "full_scan_threshold": {
482
+ "description": "Minimal amount of points for additional payload-based indexing. If payload chunk is smaller than `full_scan_threshold` additional indexing won't be used - in this case full-scan search should be preferred by query planner and additional indexing is not required.",
483
+ "format": "uint",
484
+ "minimum": 0,
485
+ "nullable": true,
486
+ "type": "integer"
487
+ },
488
+ "m": {
489
+ "description": "Number of edges per node in the index graph. Larger the value - more accurate the search, more space required.",
490
+ "format": "uint",
491
+ "minimum": 0,
492
+ "nullable": true,
493
+ "type": "integer"
494
+ }
495
+ },
496
+ "type": "object"
497
+ },
498
+ "Match": {
499
+ "properties": {
500
+ "integer": {
501
+ "description": "Integer value to match",
502
+ "format": "int64",
503
+ "nullable": true,
504
+ "type": "integer"
505
+ },
506
+ "keyword": {
507
+ "description": "Keyword value to match",
508
+ "nullable": true,
509
+ "type": "string"
510
+ }
511
+ },
512
+ "type": "object"
513
+ },
514
+ "OptimizersConfig": {
515
+ "properties": {
516
+ "deleted_threshold": {
517
+ "description": "The minimal fraction of deleted vectors in a segment, required to perform segment optimization",
518
+ "format": "double",
519
+ "type": "number"
520
+ },
521
+ "flush_interval_sec": {
522
+ "description": "Minimum interval between forced flushes.",
523
+ "format": "uint64",
524
+ "minimum": 0,
525
+ "type": "integer"
526
+ },
527
+ "indexing_threshold": {
528
+ "description": "Maximum number of vectors allowed for plain index. Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md",
529
+ "format": "uint",
530
+ "minimum": 0,
531
+ "type": "integer"
532
+ },
533
+ "max_segment_number": {
534
+ "description": "If the number of segments exceeds this value, the optimizer will merge the smallest segments.",
535
+ "format": "uint",
536
+ "minimum": 0,
537
+ "type": "integer"
538
+ },
539
+ "memmap_threshold": {
540
+ "description": "Maximum number of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmaped file.",
541
+ "format": "uint",
542
+ "minimum": 0,
543
+ "type": "integer"
544
+ },
545
+ "payload_indexing_threshold": {
546
+ "description": "Starting from this amount of vectors per-segment the engine will start building index for payload.",
547
+ "format": "uint",
548
+ "minimum": 0,
549
+ "type": "integer"
550
+ },
551
+ "vacuum_min_vector_number": {
552
+ "description": "The minimal number of vectors in a segment, required to perform segment optimization",
553
+ "format": "uint",
554
+ "minimum": 0,
555
+ "type": "integer"
556
+ }
557
+ },
558
+ "required": [
559
+ "deleted_threshold",
560
+ "flush_interval_sec",
561
+ "indexing_threshold",
562
+ "max_segment_number",
563
+ "memmap_threshold",
564
+ "payload_indexing_threshold",
565
+ "vacuum_min_vector_number"
566
+ ],
567
+ "type": "object"
568
+ },
569
+ "OptimizersConfigDiff": {
570
+ "properties": {
571
+ "deleted_threshold": {
572
+ "description": "The minimal fraction of deleted vectors in a segment, required to perform segment optimization",
573
+ "format": "double",
574
+ "nullable": true,
575
+ "type": "number"
576
+ },
577
+ "flush_interval_sec": {
578
+ "description": "Minimum interval between forced flushes.",
579
+ "format": "uint64",
580
+ "minimum": 0,
581
+ "nullable": true,
582
+ "type": "integer"
583
+ },
584
+ "indexing_threshold": {
585
+ "description": "Maximum number of vectors allowed for plain index. Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md",
586
+ "format": "uint",
587
+ "minimum": 0,
588
+ "nullable": true,
589
+ "type": "integer"
590
+ },
591
+ "max_segment_number": {
592
+ "description": "If the number of segments exceeds this value, the optimizer will merge the smallest segments.",
593
+ "format": "uint",
594
+ "minimum": 0,
595
+ "nullable": true,
596
+ "type": "integer"
597
+ },
598
+ "memmap_threshold": {
599
+ "description": "Maximum number of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmaped file.",
600
+ "format": "uint",
601
+ "minimum": 0,
602
+ "nullable": true,
603
+ "type": "integer"
604
+ },
605
+ "payload_indexing_threshold": {
606
+ "description": "Starting from this amount of vectors per-segment the engine will start building index for payload.",
607
+ "format": "uint",
608
+ "minimum": 0,
609
+ "nullable": true,
610
+ "type": "integer"
611
+ },
612
+ "vacuum_min_vector_number": {
613
+ "description": "The minimal number of vectors in a segment, required to perform segment optimization",
614
+ "format": "uint",
615
+ "minimum": 0,
616
+ "nullable": true,
617
+ "type": "integer"
618
+ }
619
+ },
620
+ "type": "object"
621
+ },
622
+ "PayloadInterface": {
623
+ "anyOf": [
624
+ {
625
+ "$ref": "#/components/schemas/PayloadVariant_for_String"
626
+ },
627
+ {
628
+ "$ref": "#/components/schemas/PayloadVariant_for_int64"
629
+ },
630
+ {
631
+ "$ref": "#/components/schemas/PayloadVariant_for_double"
632
+ },
633
+ {
634
+ "$ref": "#/components/schemas/PayloadInterfaceStrict"
635
+ }
636
+ ]
637
+ },
638
+ "PayloadInterfaceStrict": {
639
+ "anyOf": [
640
+ {
641
+ "properties": {
642
+ "type": {
643
+ "enum": [
644
+ "keyword"
645
+ ],
646
+ "type": "string"
647
+ },
648
+ "value": {
649
+ "$ref": "#/components/schemas/PayloadVariant_for_String"
650
+ }
651
+ },
652
+ "required": [
653
+ "type",
654
+ "value"
655
+ ],
656
+ "type": "object"
657
+ },
658
+ {
659
+ "properties": {
660
+ "type": {
661
+ "enum": [
662
+ "integer"
663
+ ],
664
+ "type": "string"
665
+ },
666
+ "value": {
667
+ "$ref": "#/components/schemas/PayloadVariant_for_int64"
668
+ }
669
+ },
670
+ "required": [
671
+ "type",
672
+ "value"
673
+ ],
674
+ "type": "object"
675
+ },
676
+ {
677
+ "properties": {
678
+ "type": {
679
+ "enum": [
680
+ "float"
681
+ ],
682
+ "type": "string"
683
+ },
684
+ "value": {
685
+ "$ref": "#/components/schemas/PayloadVariant_for_double"
686
+ }
687
+ },
688
+ "required": [
689
+ "type",
690
+ "value"
691
+ ],
692
+ "type": "object"
693
+ },
694
+ {
695
+ "properties": {
696
+ "type": {
697
+ "enum": [
698
+ "geo"
699
+ ],
700
+ "type": "string"
701
+ },
702
+ "value": {
703
+ "$ref": "#/components/schemas/PayloadVariant_for_GeoPoint"
704
+ }
705
+ },
706
+ "required": [
707
+ "type",
708
+ "value"
709
+ ],
710
+ "type": "object"
711
+ }
712
+ ]
713
+ },
714
+ "PayloadOps": {
715
+ "anyOf": [
716
+ {
717
+ "additionalProperties": false,
718
+ "description": "Set payload value, overrides if it is already exists",
719
+ "properties": {
720
+ "set_payload": {
721
+ "properties": {
722
+ "payload": {
723
+ "additionalProperties": {
724
+ "$ref": "#/components/schemas/PayloadInterface"
725
+ },
726
+ "type": "object"
727
+ },
728
+ "points": {
729
+ "description": "Assigns payload to each point in this list",
730
+ "items": {
731
+ "format": "uint64",
732
+ "minimum": 0,
733
+ "type": "integer"
734
+ },
735
+ "type": "array"
736
+ }
737
+ },
738
+ "required": [
739
+ "payload",
740
+ "points"
741
+ ],
742
+ "type": "object"
743
+ }
744
+ },
745
+ "required": [
746
+ "set_payload"
747
+ ],
748
+ "type": "object"
749
+ },
750
+ {
751
+ "additionalProperties": false,
752
+ "description": "Deletes specified payload values if they are assigned",
753
+ "properties": {
754
+ "delete_payload": {
755
+ "properties": {
756
+ "keys": {
757
+ "items": {
758
+ "type": "string"
759
+ },
760
+ "type": "array"
761
+ },
762
+ "points": {
763
+ "description": "Deletes values from each point in this list",
764
+ "items": {
765
+ "format": "uint64",
766
+ "minimum": 0,
767
+ "type": "integer"
768
+ },
769
+ "type": "array"
770
+ }
771
+ },
772
+ "required": [
773
+ "keys",
774
+ "points"
775
+ ],
776
+ "type": "object"
777
+ }
778
+ },
779
+ "required": [
780
+ "delete_payload"
781
+ ],
782
+ "type": "object"
783
+ },
784
+ {
785
+ "additionalProperties": false,
786
+ "description": "Drops all Payload values associated with given points.",
787
+ "properties": {
788
+ "clear_payload": {
789
+ "properties": {
790
+ "points": {
791
+ "items": {
792
+ "format": "uint64",
793
+ "minimum": 0,
794
+ "type": "integer"
795
+ },
796
+ "type": "array"
797
+ }
798
+ },
799
+ "required": [
800
+ "points"
801
+ ],
802
+ "type": "object"
803
+ }
804
+ },
805
+ "required": [
806
+ "clear_payload"
807
+ ],
808
+ "type": "object"
809
+ }
810
+ ],
811
+ "description": "Define operations description for point payloads manipulation"
812
+ },
813
+ "PayloadSchemaInfo": {
814
+ "properties": {
815
+ "data_type": {
816
+ "$ref": "#/components/schemas/PayloadSchemaType"
817
+ },
818
+ "indexed": {
819
+ "type": "boolean"
820
+ }
821
+ },
822
+ "required": [
823
+ "data_type",
824
+ "indexed"
825
+ ],
826
+ "type": "object"
827
+ },
828
+ "PayloadSchemaType": {
829
+ "anyOf": [
830
+ {
831
+ "properties": {
832
+ "type": {
833
+ "enum": [
834
+ "keyword"
835
+ ],
836
+ "type": "string"
837
+ }
838
+ },
839
+ "required": [
840
+ "type"
841
+ ],
842
+ "type": "object"
843
+ },
844
+ {
845
+ "properties": {
846
+ "type": {
847
+ "enum": [
848
+ "integer"
849
+ ],
850
+ "type": "string"
851
+ }
852
+ },
853
+ "required": [
854
+ "type"
855
+ ],
856
+ "type": "object"
857
+ },
858
+ {
859
+ "properties": {
860
+ "type": {
861
+ "enum": [
862
+ "float"
863
+ ],
864
+ "type": "string"
865
+ }
866
+ },
867
+ "required": [
868
+ "type"
869
+ ],
870
+ "type": "object"
871
+ },
872
+ {
873
+ "properties": {
874
+ "type": {
875
+ "enum": [
876
+ "geo"
877
+ ],
878
+ "type": "string"
879
+ }
880
+ },
881
+ "required": [
882
+ "type"
883
+ ],
884
+ "type": "object"
885
+ }
886
+ ]
887
+ },
888
+ "PayloadSelector": {
889
+ "additionalProperties": false,
890
+ "properties": {
891
+ "exclude": {
892
+ "description": "Post-exclude return payload key type",
893
+ "items": {
894
+ "type": "string"
895
+ },
896
+ "type": "array"
897
+ },
898
+ "include": {
899
+ "description": "Include return payload key type",
900
+ "items": {
901
+ "type": "string"
902
+ },
903
+ "type": "array"
904
+ }
905
+ },
906
+ "required": [
907
+ "exclude",
908
+ "include"
909
+ ],
910
+ "type": "object"
911
+ },
912
+ "PayloadType": {
913
+ "anyOf": [
914
+ {
915
+ "properties": {
916
+ "type": {
917
+ "enum": [
918
+ "keyword"
919
+ ],
920
+ "type": "string"
921
+ },
922
+ "value": {
923
+ "items": {
924
+ "type": "string"
925
+ },
926
+ "type": "array"
927
+ }
928
+ },
929
+ "required": [
930
+ "type",
931
+ "value"
932
+ ],
933
+ "type": "object"
934
+ },
935
+ {
936
+ "properties": {
937
+ "type": {
938
+ "enum": [
939
+ "integer"
940
+ ],
941
+ "type": "string"
942
+ },
943
+ "value": {
944
+ "items": {
945
+ "format": "int64",
946
+ "type": "integer"
947
+ },
948
+ "type": "array"
949
+ }
950
+ },
951
+ "required": [
952
+ "type",
953
+ "value"
954
+ ],
955
+ "type": "object"
956
+ },
957
+ {
958
+ "properties": {
959
+ "type": {
960
+ "enum": [
961
+ "float"
962
+ ],
963
+ "type": "string"
964
+ },
965
+ "value": {
966
+ "items": {
967
+ "format": "double",
968
+ "type": "number"
969
+ },
970
+ "type": "array"
971
+ }
972
+ },
973
+ "required": [
974
+ "type",
975
+ "value"
976
+ ],
977
+ "type": "object"
978
+ },
979
+ {
980
+ "properties": {
981
+ "type": {
982
+ "enum": [
983
+ "geo"
984
+ ],
985
+ "type": "string"
986
+ },
987
+ "value": {
988
+ "items": {
989
+ "$ref": "#/components/schemas/GeoPoint"
990
+ },
991
+ "type": "array"
992
+ }
993
+ },
994
+ "required": [
995
+ "type",
996
+ "value"
997
+ ],
998
+ "type": "object"
999
+ }
1000
+ ]
1001
+ },
1002
+ "PayloadVariant_for_GeoPoint": {
1003
+ "anyOf": [
1004
+ {
1005
+ "items": {
1006
+ "$ref": "#/components/schemas/GeoPoint"
1007
+ },
1008
+ "type": "array"
1009
+ },
1010
+ {
1011
+ "$ref": "#/components/schemas/GeoPoint"
1012
+ }
1013
+ ]
1014
+ },
1015
+ "PayloadVariant_for_String": {
1016
+ "anyOf": [
1017
+ {
1018
+ "items": {
1019
+ "type": "string"
1020
+ },
1021
+ "type": "array"
1022
+ },
1023
+ {
1024
+ "type": "string"
1025
+ }
1026
+ ]
1027
+ },
1028
+ "PayloadVariant_for_double": {
1029
+ "anyOf": [
1030
+ {
1031
+ "items": {
1032
+ "format": "double",
1033
+ "type": "number"
1034
+ },
1035
+ "type": "array"
1036
+ },
1037
+ {
1038
+ "format": "double",
1039
+ "type": "number"
1040
+ }
1041
+ ]
1042
+ },
1043
+ "PayloadVariant_for_int64": {
1044
+ "anyOf": [
1045
+ {
1046
+ "items": {
1047
+ "format": "int64",
1048
+ "type": "integer"
1049
+ },
1050
+ "type": "array"
1051
+ },
1052
+ {
1053
+ "format": "int64",
1054
+ "type": "integer"
1055
+ }
1056
+ ]
1057
+ },
1058
+ "PointInsertOperations": {
1059
+ "anyOf": [
1060
+ {
1061
+ "additionalProperties": false,
1062
+ "description": "Inset points from a batch.",
1063
+ "properties": {
1064
+ "batch": {
1065
+ "properties": {
1066
+ "ids": {
1067
+ "items": {
1068
+ "format": "uint64",
1069
+ "minimum": 0,
1070
+ "type": "integer"
1071
+ },
1072
+ "type": "array"
1073
+ },
1074
+ "payloads": {
1075
+ "items": {
1076
+ "additionalProperties": {
1077
+ "$ref": "#/components/schemas/PayloadInterface"
1078
+ },
1079
+ "nullable": true,
1080
+ "type": "object"
1081
+ },
1082
+ "nullable": true,
1083
+ "type": "array"
1084
+ },
1085
+ "vectors": {
1086
+ "items": {
1087
+ "items": {
1088
+ "format": "float",
1089
+ "type": "number"
1090
+ },
1091
+ "type": "array"
1092
+ },
1093
+ "type": "array"
1094
+ }
1095
+ },
1096
+ "required": [
1097
+ "ids",
1098
+ "vectors"
1099
+ ],
1100
+ "type": "object"
1101
+ }
1102
+ },
1103
+ "required": [
1104
+ "batch"
1105
+ ],
1106
+ "type": "object"
1107
+ },
1108
+ {
1109
+ "additionalProperties": false,
1110
+ "description": "Insert points from a list",
1111
+ "properties": {
1112
+ "points": {
1113
+ "items": {
1114
+ "$ref": "#/components/schemas/PointStruct"
1115
+ },
1116
+ "type": "array"
1117
+ }
1118
+ },
1119
+ "required": [
1120
+ "points"
1121
+ ],
1122
+ "type": "object"
1123
+ }
1124
+ ]
1125
+ },
1126
+ "PointOperations": {
1127
+ "anyOf": [
1128
+ {
1129
+ "additionalProperties": false,
1130
+ "description": "Insert or update points",
1131
+ "properties": {
1132
+ "upsert_points": {
1133
+ "$ref": "#/components/schemas/PointInsertOperations"
1134
+ }
1135
+ },
1136
+ "required": [
1137
+ "upsert_points"
1138
+ ],
1139
+ "type": "object"
1140
+ },
1141
+ {
1142
+ "additionalProperties": false,
1143
+ "description": "Delete point if exists",
1144
+ "properties": {
1145
+ "delete_points": {
1146
+ "properties": {
1147
+ "ids": {
1148
+ "items": {
1149
+ "format": "uint64",
1150
+ "minimum": 0,
1151
+ "type": "integer"
1152
+ },
1153
+ "type": "array"
1154
+ }
1155
+ },
1156
+ "required": [
1157
+ "ids"
1158
+ ],
1159
+ "type": "object"
1160
+ }
1161
+ },
1162
+ "required": [
1163
+ "delete_points"
1164
+ ],
1165
+ "type": "object"
1166
+ }
1167
+ ]
1168
+ },
1169
+ "PointRequest": {
1170
+ "properties": {
1171
+ "ids": {
1172
+ "items": {
1173
+ "format": "uint64",
1174
+ "minimum": 0,
1175
+ "type": "integer"
1176
+ },
1177
+ "type": "array"
1178
+ },
1179
+ "with_payload": {
1180
+ "anyOf": [
1181
+ {
1182
+ "$ref": "#/components/schemas/WithPayloadInterface"
1183
+ },
1184
+ {
1185
+ "nullable": true
1186
+ }
1187
+ ]
1188
+ }
1189
+ },
1190
+ "required": [
1191
+ "ids"
1192
+ ],
1193
+ "type": "object"
1194
+ },
1195
+ "PointStruct": {
1196
+ "properties": {
1197
+ "id": {
1198
+ "description": "Point id",
1199
+ "format": "uint64",
1200
+ "minimum": 0,
1201
+ "type": "integer"
1202
+ },
1203
+ "payload": {
1204
+ "additionalProperties": {
1205
+ "$ref": "#/components/schemas/PayloadInterface"
1206
+ },
1207
+ "description": "Payload values (optional)",
1208
+ "nullable": true,
1209
+ "type": "object"
1210
+ },
1211
+ "vector": {
1212
+ "description": "Vector",
1213
+ "items": {
1214
+ "format": "float",
1215
+ "type": "number"
1216
+ },
1217
+ "type": "array"
1218
+ }
1219
+ },
1220
+ "required": [
1221
+ "id",
1222
+ "vector"
1223
+ ],
1224
+ "type": "object"
1225
+ },
1226
+ "Range": {
1227
+ "properties": {
1228
+ "gt": {
1229
+ "description": "point.key > range.gt",
1230
+ "format": "double",
1231
+ "nullable": true,
1232
+ "type": "number"
1233
+ },
1234
+ "gte": {
1235
+ "description": "point.key >= range.gte",
1236
+ "format": "double",
1237
+ "nullable": true,
1238
+ "type": "number"
1239
+ },
1240
+ "lt": {
1241
+ "description": "point.key < range.lt",
1242
+ "format": "double",
1243
+ "nullable": true,
1244
+ "type": "number"
1245
+ },
1246
+ "lte": {
1247
+ "description": "point.key <= range.lte",
1248
+ "format": "double",
1249
+ "nullable": true,
1250
+ "type": "number"
1251
+ }
1252
+ },
1253
+ "type": "object"
1254
+ },
1255
+ "RecommendRequest": {
1256
+ "description": "Search request",
1257
+ "properties": {
1258
+ "filter": {
1259
+ "anyOf": [
1260
+ {
1261
+ "$ref": "#/components/schemas/Filter"
1262
+ },
1263
+ {
1264
+ "nullable": true
1265
+ }
1266
+ ],
1267
+ "description": "Look only for points which satisfies this conditions"
1268
+ },
1269
+ "negative": {
1270
+ "description": "Try to avoid vectors like this",
1271
+ "items": {
1272
+ "format": "uint64",
1273
+ "minimum": 0,
1274
+ "type": "integer"
1275
+ },
1276
+ "type": "array"
1277
+ },
1278
+ "params": {
1279
+ "anyOf": [
1280
+ {
1281
+ "$ref": "#/components/schemas/SearchParams"
1282
+ },
1283
+ {
1284
+ "nullable": true
1285
+ }
1286
+ ],
1287
+ "description": "Additional search params"
1288
+ },
1289
+ "positive": {
1290
+ "description": "Look for vectors closest to those",
1291
+ "items": {
1292
+ "format": "uint64",
1293
+ "minimum": 0,
1294
+ "type": "integer"
1295
+ },
1296
+ "type": "array"
1297
+ },
1298
+ "top": {
1299
+ "description": "Max number of result to return",
1300
+ "format": "uint",
1301
+ "minimum": 0,
1302
+ "type": "integer"
1303
+ }
1304
+ },
1305
+ "required": [
1306
+ "negative",
1307
+ "positive",
1308
+ "top"
1309
+ ],
1310
+ "type": "object"
1311
+ },
1312
+ "Record": {
1313
+ "description": "Point data",
1314
+ "properties": {
1315
+ "id": {
1316
+ "description": "Id of the point",
1317
+ "format": "uint64",
1318
+ "minimum": 0,
1319
+ "type": "integer"
1320
+ },
1321
+ "payload": {
1322
+ "additionalProperties": {
1323
+ "$ref": "#/components/schemas/PayloadType"
1324
+ },
1325
+ "description": "Payload - values assigned to the point",
1326
+ "nullable": true,
1327
+ "type": "object"
1328
+ },
1329
+ "vector": {
1330
+ "description": "Vector of the point",
1331
+ "items": {
1332
+ "format": "float",
1333
+ "type": "number"
1334
+ },
1335
+ "nullable": true,
1336
+ "type": "array"
1337
+ }
1338
+ },
1339
+ "required": [
1340
+ "id"
1341
+ ],
1342
+ "type": "object"
1343
+ },
1344
+ "ScoredPoint": {
1345
+ "properties": {
1346
+ "id": {
1347
+ "description": "Point id",
1348
+ "format": "uint64",
1349
+ "minimum": 0,
1350
+ "type": "integer"
1351
+ },
1352
+ "payload": {
1353
+ "additionalProperties": {
1354
+ "$ref": "#/components/schemas/PayloadType"
1355
+ },
1356
+ "description": "Payload storage",
1357
+ "nullable": true,
1358
+ "type": "object"
1359
+ },
1360
+ "score": {
1361
+ "description": "Points vector distance to the query vector",
1362
+ "format": "float",
1363
+ "type": "number"
1364
+ },
1365
+ "version": {
1366
+ "description": "Point version",
1367
+ "format": "uint64",
1368
+ "minimum": 0,
1369
+ "type": "integer"
1370
+ }
1371
+ },
1372
+ "required": [
1373
+ "id",
1374
+ "score",
1375
+ "version"
1376
+ ],
1377
+ "type": "object"
1378
+ },
1379
+ "ScrollRequest": {
1380
+ "description": "Scroll request - paginate over all points which matches given condition",
1381
+ "properties": {
1382
+ "filter": {
1383
+ "anyOf": [
1384
+ {
1385
+ "$ref": "#/components/schemas/Filter"
1386
+ },
1387
+ {
1388
+ "nullable": true
1389
+ }
1390
+ ],
1391
+ "description": "Look only for points which satisfies this conditions. If not provided - all points."
1392
+ },
1393
+ "limit": {
1394
+ "description": "Page size. Default: 10",
1395
+ "format": "uint",
1396
+ "minimum": 0,
1397
+ "nullable": true,
1398
+ "type": "integer"
1399
+ },
1400
+ "offset": {
1401
+ "description": "Start ID to read points from. Default: 0",
1402
+ "format": "uint64",
1403
+ "minimum": 0,
1404
+ "nullable": true,
1405
+ "type": "integer"
1406
+ },
1407
+ "with_payload": {
1408
+ "anyOf": [
1409
+ {
1410
+ "$ref": "#/components/schemas/WithPayloadInterface"
1411
+ },
1412
+ {
1413
+ "nullable": true
1414
+ }
1415
+ ],
1416
+ "description": "Return point payload with the result. Default: True"
1417
+ },
1418
+ "with_vector": {
1419
+ "description": "Return point vector with the result. Default: false",
1420
+ "nullable": true,
1421
+ "type": "boolean"
1422
+ }
1423
+ },
1424
+ "type": "object"
1425
+ },
1426
+ "ScrollResult": {
1427
+ "description": "Result of the points read request. Contains",
1428
+ "properties": {
1429
+ "next_page_offset": {
1430
+ "description": "Offset which should be used to retrieve a next page result",
1431
+ "format": "uint64",
1432
+ "minimum": 0,
1433
+ "nullable": true,
1434
+ "type": "integer"
1435
+ },
1436
+ "points": {
1437
+ "description": "List of retrieved points",
1438
+ "items": {
1439
+ "$ref": "#/components/schemas/Record"
1440
+ },
1441
+ "type": "array"
1442
+ }
1443
+ },
1444
+ "required": [
1445
+ "points"
1446
+ ],
1447
+ "type": "object"
1448
+ },
1449
+ "SearchParams": {
1450
+ "description": "Additional parameters of the search",
1451
+ "properties": {
1452
+ "hnsw_ef": {
1453
+ "description": "Params relevant to HNSW index /// Size of the beam in a beam-search. Larger the value - more accurate the result, more time required for search.",
1454
+ "format": "uint",
1455
+ "minimum": 0,
1456
+ "nullable": true,
1457
+ "type": "integer"
1458
+ }
1459
+ },
1460
+ "type": "object"
1461
+ },
1462
+ "SearchRequest": {
1463
+ "description": "Search request",
1464
+ "properties": {
1465
+ "filter": {
1466
+ "anyOf": [
1467
+ {
1468
+ "$ref": "#/components/schemas/Filter"
1469
+ },
1470
+ {
1471
+ "nullable": true
1472
+ }
1473
+ ],
1474
+ "description": "Look only for points which satisfies this conditions"
1475
+ },
1476
+ "params": {
1477
+ "anyOf": [
1478
+ {
1479
+ "$ref": "#/components/schemas/SearchParams"
1480
+ },
1481
+ {
1482
+ "nullable": true
1483
+ }
1484
+ ],
1485
+ "description": "Additional search params"
1486
+ },
1487
+ "top": {
1488
+ "description": "Max number of result to return",
1489
+ "format": "uint",
1490
+ "minimum": 0,
1491
+ "type": "integer"
1492
+ },
1493
+ "vector": {
1494
+ "description": "Look for vectors closest to this",
1495
+ "items": {
1496
+ "format": "float",
1497
+ "type": "number"
1498
+ },
1499
+ "type": "array"
1500
+ },
1501
+ "with_payload": {
1502
+ "anyOf": [
1503
+ {
1504
+ "$ref": "#/components/schemas/WithPayloadInterface"
1505
+ },
1506
+ {
1507
+ "nullable": true
1508
+ }
1509
+ ],
1510
+ "description": "Payload interface"
1511
+ }
1512
+ },
1513
+ "required": [
1514
+ "top",
1515
+ "vector"
1516
+ ],
1517
+ "type": "object"
1518
+ },
1519
+ "StorageOperations": {
1520
+ "anyOf": [
1521
+ {
1522
+ "additionalProperties": false,
1523
+ "description": "Create new collection and (optionally) specify index params",
1524
+ "properties": {
1525
+ "create_collection": {
1526
+ "properties": {
1527
+ "distance": {
1528
+ "$ref": "#/components/schemas/Distance"
1529
+ },
1530
+ "hnsw_config": {
1531
+ "anyOf": [
1532
+ {
1533
+ "$ref": "#/components/schemas/HnswConfigDiff"
1534
+ },
1535
+ {
1536
+ "nullable": true
1537
+ }
1538
+ ],
1539
+ "description": "Custom params for HNSW index. If none - values from service configuration file are used."
1540
+ },
1541
+ "name": {
1542
+ "type": "string"
1543
+ },
1544
+ "optimizers_config": {
1545
+ "anyOf": [
1546
+ {
1547
+ "$ref": "#/components/schemas/OptimizersConfigDiff"
1548
+ },
1549
+ {
1550
+ "nullable": true
1551
+ }
1552
+ ],
1553
+ "description": "Custom params for Optimizers. If none - values from service configuration file are used."
1554
+ },
1555
+ "vector_size": {
1556
+ "format": "uint",
1557
+ "minimum": 0,
1558
+ "type": "integer"
1559
+ },
1560
+ "wal_config": {
1561
+ "anyOf": [
1562
+ {
1563
+ "$ref": "#/components/schemas/WalConfigDiff"
1564
+ },
1565
+ {
1566
+ "nullable": true
1567
+ }
1568
+ ],
1569
+ "description": "Custom params for WAL. If none - values from service configuration file are used."
1570
+ }
1571
+ },
1572
+ "required": [
1573
+ "distance",
1574
+ "name",
1575
+ "vector_size"
1576
+ ],
1577
+ "type": "object"
1578
+ }
1579
+ },
1580
+ "required": [
1581
+ "create_collection"
1582
+ ],
1583
+ "type": "object"
1584
+ },
1585
+ {
1586
+ "additionalProperties": false,
1587
+ "description": "Update parameters of the existing collection",
1588
+ "properties": {
1589
+ "update_collection": {
1590
+ "properties": {
1591
+ "name": {
1592
+ "type": "string"
1593
+ },
1594
+ "optimizers_config": {
1595
+ "anyOf": [
1596
+ {
1597
+ "$ref": "#/components/schemas/OptimizersConfigDiff"
1598
+ },
1599
+ {
1600
+ "nullable": true
1601
+ }
1602
+ ],
1603
+ "description": "Custom params for Optimizers. If none - values from service configuration file are used. This operation is blocking, it will only proceed ones all current optimizations are complete"
1604
+ }
1605
+ },
1606
+ "required": [
1607
+ "name"
1608
+ ],
1609
+ "type": "object"
1610
+ }
1611
+ },
1612
+ "required": [
1613
+ "update_collection"
1614
+ ],
1615
+ "type": "object"
1616
+ },
1617
+ {
1618
+ "additionalProperties": false,
1619
+ "description": "Delete collection with given name",
1620
+ "properties": {
1621
+ "delete_collection": {
1622
+ "type": "string"
1623
+ }
1624
+ },
1625
+ "required": [
1626
+ "delete_collection"
1627
+ ],
1628
+ "type": "object"
1629
+ },
1630
+ {
1631
+ "additionalProperties": false,
1632
+ "description": "Perform changes of collection aliases. Alias changes are atomic, meaning that no collection modifications can happen between alias operations.",
1633
+ "properties": {
1634
+ "change_aliases": {
1635
+ "properties": {
1636
+ "actions": {
1637
+ "items": {
1638
+ "$ref": "#/components/schemas/AliasOperations"
1639
+ },
1640
+ "type": "array"
1641
+ }
1642
+ },
1643
+ "required": [
1644
+ "actions"
1645
+ ],
1646
+ "type": "object"
1647
+ }
1648
+ },
1649
+ "required": [
1650
+ "change_aliases"
1651
+ ],
1652
+ "type": "object"
1653
+ }
1654
+ ]
1655
+ },
1656
+ "UpdateResult": {
1657
+ "properties": {
1658
+ "operation_id": {
1659
+ "description": "Sequential number of the operation",
1660
+ "format": "uint64",
1661
+ "minimum": 0,
1662
+ "type": "integer"
1663
+ },
1664
+ "status": {
1665
+ "$ref": "#/components/schemas/UpdateStatus"
1666
+ }
1667
+ },
1668
+ "required": [
1669
+ "operation_id",
1670
+ "status"
1671
+ ],
1672
+ "type": "object"
1673
+ },
1674
+ "UpdateStatus": {
1675
+ "enum": [
1676
+ "acknowledged",
1677
+ "completed"
1678
+ ],
1679
+ "type": "string"
1680
+ },
1681
+ "WalConfig": {
1682
+ "properties": {
1683
+ "wal_capacity_mb": {
1684
+ "description": "Size of a single WAL segment in MB",
1685
+ "format": "uint",
1686
+ "minimum": 0,
1687
+ "type": "integer"
1688
+ },
1689
+ "wal_segments_ahead": {
1690
+ "description": "Number of WAL segments to create ahead of actually used ones",
1691
+ "format": "uint",
1692
+ "minimum": 0,
1693
+ "type": "integer"
1694
+ }
1695
+ },
1696
+ "required": [
1697
+ "wal_capacity_mb",
1698
+ "wal_segments_ahead"
1699
+ ],
1700
+ "type": "object"
1701
+ },
1702
+ "WalConfigDiff": {
1703
+ "properties": {
1704
+ "wal_capacity_mb": {
1705
+ "description": "Size of a single WAL segment in MB",
1706
+ "format": "uint",
1707
+ "minimum": 0,
1708
+ "nullable": true,
1709
+ "type": "integer"
1710
+ },
1711
+ "wal_segments_ahead": {
1712
+ "description": "Number of WAL segments to create ahead of actually used ones",
1713
+ "format": "uint",
1714
+ "minimum": 0,
1715
+ "nullable": true,
1716
+ "type": "integer"
1717
+ }
1718
+ },
1719
+ "type": "object"
1720
+ },
1721
+ "WithPayloadInterface": {
1722
+ "anyOf": [
1723
+ {
1724
+ "type": "boolean"
1725
+ },
1726
+ {
1727
+ "items": {
1728
+ "type": "string"
1729
+ },
1730
+ "type": "array"
1731
+ },
1732
+ {
1733
+ "$ref": "#/components/schemas/PayloadSelector"
1734
+ }
1735
+ ]
1736
+ }
1737
+ }
1738
+ },
1739
+ "externalDocs": {
1740
+ "description": "Find out more about Qdrant aplications and demo",
1741
+ "url": "demo.qdrant.tech"
1742
+ },
1743
+ "info": {
1744
+ "contact": {
1745
+ "email": "[email protected]"
1746
+ },
1747
+ "description": "\nAPI description for Qdrant vector search engine.\n\nThis document describes CRUD and search operations on collections of points (vectors with payload).\n\nQdrant supports any combinations of `should`, `must` and `must_not` conditions, which makes it possible to use in applications when object could not be described solely by vector. It could be location features, availability flags, and other custom properties businesses should take into account.\n## Examples\nThis examples cover the most basic use-cases - collection creation and basic vector search.\n### Create collection\nFirst - let's create a collection with dot-production metric.\n```\ncurl -X POST 'http://localhost:6333/collections' \\\n -H 'Content-Type: application/json' \\\n --data-raw '{\n \"create_collection\": {\n \"name\": \"test_collection\",\n \"vector_size\": 4,\n \"distance\": \"Dot\"\n }\n }'\n```\nExpected response:\n```\n{\n \"result\": true,\n \"status\": \"ok\",\n \"time\": 0.031095451\n}\n```\nWe can ensure that collection was created:\n```\ncurl 'http://localhost:6333/collections/test_collection'\n```\nExpected response:\n```\n{\n \"result\": {\n \"status\": \"green\",\n \"vectors_count\": 0,\n \"segments_count\": 5,\n \"disk_data_size\": 0,\n \"ram_data_size\": 0,\n \"config\": {\n \"params\": {\n \"vector_size\": 4,\n \"distance\": \"Dot\"\n },\n \"hnsw_config\": {\n \"m\": 16,\n \"ef_construct\": 100,\n \"full_scan_threshold\": 10000\n },\n \"optimizer_config\": {\n \"deleted_threshold\": 0.2,\n \"vacuum_min_vector_number\": 1000,\n \"max_segment_number\": 5,\n \"memmap_threshold\": 50000,\n \"indexing_threshold\": 20000,\n \"payload_indexing_threshold\": 10000,\n \"flush_interval_sec\": 1\n },\n \"wal_config\": {\n \"wal_capacity_mb\": 32,\n \"wal_segments_ahead\": 0\n }\n }\n },\n \"status\": \"ok\",\n \"time\": 2.1199e-05\n}\n```\n\n### Add points\nLet's now add vectors with some payload:\n```\ncurl -L -X POST 'http://localhost:6333/collections/test_collection?wait=true' \\ -H 'Content-Type: application/json' \\ --data-raw '{\n \"upsert_points\": {\n \"points\": [\n {\"id\": 1, \"vector\": [0.05, 0.61, 0.76, 0.74], \"payload\": {\"city\": {\"type\": \"keyword\", \"value\": \"Berlin\"}}},\n {\"id\": 2, \"vector\": [0.19, 0.81, 0.75, 0.11], \"payload\": {\"city\": {\"type\": \"keyword\", \"value\": [\"Berlin\", \"London\"] }}},\n {\"id\": 3, \"vector\": [0.36, 0.55, 0.47, 0.94], \"payload\": {\"city\": {\"type\": \"keyword\", \"value\": [\"Berlin\", \"Moscow\"] }}},\n {\"id\": 4, \"vector\": [0.18, 0.01, 0.85, 0.80], \"payload\": {\"city\": {\"type\": \"keyword\", \"value\": [\"London\", \"Moscow\"]}}},\n {\"id\": 5, \"vector\": [0.24, 0.18, 0.22, 0.44], \"payload\": {\"count\": {\"type\": \"integer\", \"value\": [0]}}},\n {\"id\": 6, \"vector\": [0.35, 0.08, 0.11, 0.44]}\n ]\n }\n}'\n```\nExpected response:\n```\n{\n \"result\": {\n \"operation_id\": 0,\n \"status\": \"completed\"\n },\n \"status\": \"ok\",\n \"time\": 0.000206061\n}\n```\n### Search with filtering\nLet's start with a basic request:\n```\ncurl -L -X POST 'http://localhost:6333/collections/test_collection/points/search' \\ -H 'Content-Type: application/json' \\ --data-raw '{\n \"vector\": [0.2,0.1,0.9,0.7],\n \"top\": 3\n}'\n```\nExpected response:\n```\n{\n \"result\": [\n { \"id\": 4, \"score\": 1.362 },\n { \"id\": 1, \"score\": 1.273 },\n { \"id\": 3, \"score\": 1.208 }\n ],\n \"status\": \"ok\",\n \"time\": 0.000055785\n}\n```\nBut result is different if we add a filter:\n```\ncurl -L -X POST 'http://localhost:6333/collections/test_collection/points/search' \\ -H 'Content-Type: application/json' \\ --data-raw '{\n \"filter\": {\n \"should\": [\n {\n \"key\": \"city\",\n \"match\": {\n \"keyword\": \"London\"\n }\n }\n ]\n },\n \"vector\": [0.2, 0.1, 0.9, 0.7],\n \"top\": 3\n}'\n```\nExpected response:\n```\n{\n \"result\": [\n { \"id\": 4, \"score\": 1.362 },\n { \"id\": 2, \"score\": 0.871 }\n ],\n \"status\": \"ok\",\n \"time\": 0.000093972\n}\n```\n",
1748
+ "license": {
1749
+ "name": "Apache 2.0",
1750
+ "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
1751
+ },
1752
+ "title": "Qdrant API",
1753
+ "version": "0.4.2"
1754
+ },
1755
+ "openapi": "3.0.1",
1756
+ "paths": {
1757
+ "/collections": {
1758
+ "get": {
1759
+ "operationId": "get_collections",
1760
+ "responses": {
1761
+ "200": {
1762
+ "content": {
1763
+ "application/json": {
1764
+ "schema": {
1765
+ "properties": {
1766
+ "result": {
1767
+ "$ref": "#/components/schemas/CollectionsResponse"
1768
+ },
1769
+ "status": {
1770
+ "enum": [
1771
+ "ok"
1772
+ ],
1773
+ "type": "string"
1774
+ },
1775
+ "time": {
1776
+ "description": "Time spent to process this request",
1777
+ "format": "float",
1778
+ "type": "number"
1779
+ }
1780
+ },
1781
+ "type": "object"
1782
+ }
1783
+ }
1784
+ },
1785
+ "description": "successful operation"
1786
+ },
1787
+ "default": {
1788
+ "content": {
1789
+ "application/json": {
1790
+ "schema": {
1791
+ "$ref": "#/components/schemas/ErrorResponse"
1792
+ }
1793
+ }
1794
+ },
1795
+ "description": "error"
1796
+ }
1797
+ },
1798
+ "summary": "Get list of existing collections",
1799
+ "tags": [
1800
+ "collections"
1801
+ ]
1802
+ },
1803
+ "post": {
1804
+ "operationId": "update_collections",
1805
+ "requestBody": {
1806
+ "content": {
1807
+ "application/json": {
1808
+ "schema": {
1809
+ "$ref": "#/components/schemas/StorageOperations"
1810
+ }
1811
+ }
1812
+ },
1813
+ "description": "Operation to perform on collections"
1814
+ },
1815
+ "responses": {
1816
+ "200": {
1817
+ "content": {
1818
+ "application/json": {
1819
+ "schema": {
1820
+ "properties": {
1821
+ "result": {
1822
+ "type": "boolean"
1823
+ },
1824
+ "status": {
1825
+ "enum": [
1826
+ "ok"
1827
+ ],
1828
+ "type": "string"
1829
+ },
1830
+ "time": {
1831
+ "description": "Time spent to process this request",
1832
+ "format": "float",
1833
+ "type": "number"
1834
+ }
1835
+ },
1836
+ "type": "object"
1837
+ }
1838
+ }
1839
+ },
1840
+ "description": "successful operation"
1841
+ },
1842
+ "default": {
1843
+ "content": {
1844
+ "application/json": {
1845
+ "schema": {
1846
+ "$ref": "#/components/schemas/ErrorResponse"
1847
+ }
1848
+ }
1849
+ },
1850
+ "description": "error"
1851
+ }
1852
+ },
1853
+ "summary": "Perform update operation on collections",
1854
+ "tags": [
1855
+ "collections"
1856
+ ]
1857
+ }
1858
+ },
1859
+ "/collections/{name}": {
1860
+ "get": {
1861
+ "operationId": "get_collection",
1862
+ "parameters": [
1863
+ {
1864
+ "description": "Name of the collection to retrieve",
1865
+ "in": "path",
1866
+ "name": "name",
1867
+ "required": true,
1868
+ "schema": {
1869
+ "type": "string"
1870
+ }
1871
+ }
1872
+ ],
1873
+ "responses": {
1874
+ "200": {
1875
+ "content": {
1876
+ "application/json": {
1877
+ "schema": {
1878
+ "properties": {
1879
+ "result": {
1880
+ "$ref": "#/components/schemas/CollectionInfo"
1881
+ },
1882
+ "status": {
1883
+ "enum": [
1884
+ "ok"
1885
+ ],
1886
+ "type": "string"
1887
+ },
1888
+ "time": {
1889
+ "description": "Time spent to process this request",
1890
+ "format": "float",
1891
+ "type": "number"
1892
+ }
1893
+ },
1894
+ "type": "object"
1895
+ }
1896
+ }
1897
+ },
1898
+ "description": "successful operation"
1899
+ },
1900
+ "default": {
1901
+ "content": {
1902
+ "application/json": {
1903
+ "schema": {
1904
+ "$ref": "#/components/schemas/ErrorResponse"
1905
+ }
1906
+ }
1907
+ },
1908
+ "description": "error"
1909
+ }
1910
+ },
1911
+ "summary": "Get information about existing collection",
1912
+ "tags": [
1913
+ "collections"
1914
+ ]
1915
+ },
1916
+ "post": {
1917
+ "operationId": "update_points",
1918
+ "parameters": [
1919
+ {
1920
+ "description": "Name of the collection to search in",
1921
+ "in": "path",
1922
+ "name": "name",
1923
+ "required": true,
1924
+ "schema": {
1925
+ "type": "string"
1926
+ }
1927
+ },
1928
+ {
1929
+ "description": "Wait for changes to actually happen? Default: false",
1930
+ "in": "query",
1931
+ "name": "wait",
1932
+ "required": false,
1933
+ "schema": {
1934
+ "type": "boolean"
1935
+ }
1936
+ }
1937
+ ],
1938
+ "requestBody": {
1939
+ "content": {
1940
+ "application/json": {
1941
+ "schema": {
1942
+ "$ref": "#/components/schemas/CollectionUpdateOperations"
1943
+ }
1944
+ }
1945
+ },
1946
+ "description": "Collection update operations"
1947
+ },
1948
+ "responses": {
1949
+ "200": {
1950
+ "content": {
1951
+ "application/json": {
1952
+ "schema": {
1953
+ "properties": {
1954
+ "result": {
1955
+ "$ref": "#/components/schemas/UpdateResult"
1956
+ },
1957
+ "status": {
1958
+ "enum": [
1959
+ "ok"
1960
+ ],
1961
+ "type": "string"
1962
+ },
1963
+ "time": {
1964
+ "description": "Time spent to process this request",
1965
+ "format": "float",
1966
+ "type": "number"
1967
+ }
1968
+ },
1969
+ "type": "object"
1970
+ }
1971
+ }
1972
+ },
1973
+ "description": "successful operation"
1974
+ },
1975
+ "default": {
1976
+ "content": {
1977
+ "application/json": {
1978
+ "schema": {
1979
+ "$ref": "#/components/schemas/ErrorResponse"
1980
+ }
1981
+ }
1982
+ },
1983
+ "description": "error"
1984
+ }
1985
+ },
1986
+ "summary": "Update points (vectors, payloads, indexes) in collection",
1987
+ "tags": [
1988
+ "points"
1989
+ ]
1990
+ }
1991
+ },
1992
+ "/collections/{name}/points": {
1993
+ "post": {
1994
+ "operationId": "get_points",
1995
+ "parameters": [
1996
+ {
1997
+ "description": "Name of the collection to retrieve from",
1998
+ "in": "path",
1999
+ "name": "name",
2000
+ "required": true,
2001
+ "schema": {
2002
+ "type": "string"
2003
+ }
2004
+ }
2005
+ ],
2006
+ "requestBody": {
2007
+ "content": {
2008
+ "application/json": {
2009
+ "schema": {
2010
+ "$ref": "#/components/schemas/PointRequest"
2011
+ }
2012
+ }
2013
+ },
2014
+ "description": "List of points to retrieve"
2015
+ },
2016
+ "responses": {
2017
+ "200": {
2018
+ "content": {
2019
+ "application/json": {
2020
+ "schema": {
2021
+ "properties": {
2022
+ "result": {
2023
+ "items": {
2024
+ "$ref": "#/components/schemas/Record"
2025
+ },
2026
+ "type": "array"
2027
+ },
2028
+ "status": {
2029
+ "enum": [
2030
+ "ok"
2031
+ ],
2032
+ "type": "string"
2033
+ },
2034
+ "time": {
2035
+ "description": "Time spent to process this request",
2036
+ "format": "float",
2037
+ "type": "number"
2038
+ }
2039
+ },
2040
+ "type": "object"
2041
+ }
2042
+ }
2043
+ },
2044
+ "description": "successful operation"
2045
+ },
2046
+ "default": {
2047
+ "content": {
2048
+ "application/json": {
2049
+ "schema": {
2050
+ "$ref": "#/components/schemas/ErrorResponse"
2051
+ }
2052
+ }
2053
+ },
2054
+ "description": "error"
2055
+ }
2056
+ },
2057
+ "summary": "Retrieve points by ids",
2058
+ "tags": [
2059
+ "points"
2060
+ ]
2061
+ }
2062
+ },
2063
+ "/collections/{name}/points/recommend": {
2064
+ "post": {
2065
+ "operationId": "recommend_points",
2066
+ "parameters": [
2067
+ {
2068
+ "description": "Name of the collection to search in",
2069
+ "in": "path",
2070
+ "name": "name",
2071
+ "required": true,
2072
+ "schema": {
2073
+ "type": "string"
2074
+ }
2075
+ }
2076
+ ],
2077
+ "requestBody": {
2078
+ "content": {
2079
+ "application/json": {
2080
+ "schema": {
2081
+ "$ref": "#/components/schemas/RecommendRequest"
2082
+ }
2083
+ }
2084
+ },
2085
+ "description": "Request points based on positive and negative examples."
2086
+ },
2087
+ "responses": {
2088
+ "200": {
2089
+ "content": {
2090
+ "application/json": {
2091
+ "schema": {
2092
+ "properties": {
2093
+ "result": {
2094
+ "items": {
2095
+ "$ref": "#/components/schemas/ScoredPoint"
2096
+ },
2097
+ "type": "array"
2098
+ },
2099
+ "status": {
2100
+ "enum": [
2101
+ "ok"
2102
+ ],
2103
+ "type": "string"
2104
+ },
2105
+ "time": {
2106
+ "description": "Time spent to process this request",
2107
+ "format": "float",
2108
+ "type": "number"
2109
+ }
2110
+ },
2111
+ "type": "object"
2112
+ }
2113
+ }
2114
+ },
2115
+ "description": "successful operation"
2116
+ },
2117
+ "default": {
2118
+ "content": {
2119
+ "application/json": {
2120
+ "schema": {
2121
+ "$ref": "#/components/schemas/ErrorResponse"
2122
+ }
2123
+ }
2124
+ },
2125
+ "description": "error"
2126
+ }
2127
+ },
2128
+ "summary": "Recommend points",
2129
+ "tags": [
2130
+ "points"
2131
+ ]
2132
+ }
2133
+ },
2134
+ "/collections/{name}/points/scroll": {
2135
+ "post": {
2136
+ "description": "Scroll request - paginate over all points which matches given condition",
2137
+ "operationId": "scroll_points",
2138
+ "parameters": [
2139
+ {
2140
+ "description": "Name of the collection to retrieve from",
2141
+ "in": "path",
2142
+ "name": "name",
2143
+ "required": true,
2144
+ "schema": {
2145
+ "type": "string"
2146
+ }
2147
+ }
2148
+ ],
2149
+ "requestBody": {
2150
+ "content": {
2151
+ "application/json": {
2152
+ "schema": {
2153
+ "$ref": "#/components/schemas/ScrollRequest"
2154
+ }
2155
+ }
2156
+ },
2157
+ "description": "Pagination and filter parameters"
2158
+ },
2159
+ "responses": {
2160
+ "200": {
2161
+ "content": {
2162
+ "application/json": {
2163
+ "schema": {
2164
+ "properties": {
2165
+ "result": {
2166
+ "$ref": "#/components/schemas/ScrollResult"
2167
+ },
2168
+ "status": {
2169
+ "enum": [
2170
+ "ok"
2171
+ ],
2172
+ "type": "string"
2173
+ },
2174
+ "time": {
2175
+ "description": "Time spent to process this request",
2176
+ "format": "float",
2177
+ "type": "number"
2178
+ }
2179
+ },
2180
+ "type": "object"
2181
+ }
2182
+ }
2183
+ },
2184
+ "description": "successful operation"
2185
+ },
2186
+ "default": {
2187
+ "content": {
2188
+ "application/json": {
2189
+ "schema": {
2190
+ "$ref": "#/components/schemas/ErrorResponse"
2191
+ }
2192
+ }
2193
+ },
2194
+ "description": "error"
2195
+ }
2196
+ },
2197
+ "summary": "Scroll points",
2198
+ "tags": [
2199
+ "points"
2200
+ ]
2201
+ }
2202
+ },
2203
+ "/collections/{name}/points/search": {
2204
+ "post": {
2205
+ "operationId": "search_points",
2206
+ "parameters": [
2207
+ {
2208
+ "description": "Name of the collection to search in",
2209
+ "in": "path",
2210
+ "name": "name",
2211
+ "required": true,
2212
+ "schema": {
2213
+ "type": "string"
2214
+ }
2215
+ }
2216
+ ],
2217
+ "requestBody": {
2218
+ "content": {
2219
+ "application/json": {
2220
+ "schema": {
2221
+ "$ref": "#/components/schemas/SearchRequest"
2222
+ }
2223
+ }
2224
+ },
2225
+ "description": "Search request with optional filtering"
2226
+ },
2227
+ "responses": {
2228
+ "200": {
2229
+ "content": {
2230
+ "application/json": {
2231
+ "schema": {
2232
+ "properties": {
2233
+ "result": {
2234
+ "items": {
2235
+ "$ref": "#/components/schemas/ScoredPoint"
2236
+ },
2237
+ "type": "array"
2238
+ },
2239
+ "status": {
2240
+ "enum": [
2241
+ "ok"
2242
+ ],
2243
+ "type": "string"
2244
+ },
2245
+ "time": {
2246
+ "description": "Time spent to process this request",
2247
+ "format": "float",
2248
+ "type": "number"
2249
+ }
2250
+ },
2251
+ "type": "object"
2252
+ }
2253
+ }
2254
+ },
2255
+ "description": "successful operation"
2256
+ },
2257
+ "default": {
2258
+ "content": {
2259
+ "application/json": {
2260
+ "schema": {
2261
+ "$ref": "#/components/schemas/ErrorResponse"
2262
+ }
2263
+ }
2264
+ },
2265
+ "description": "error"
2266
+ }
2267
+ },
2268
+ "summary": "Search points",
2269
+ "tags": [
2270
+ "points"
2271
+ ]
2272
+ }
2273
+ },
2274
+ "/collections/{name}/points/{id}": {
2275
+ "get": {
2276
+ "operationId": "get_point",
2277
+ "parameters": [
2278
+ {
2279
+ "description": "Name of the collection to retrieve from",
2280
+ "in": "path",
2281
+ "name": "name",
2282
+ "required": true,
2283
+ "schema": {
2284
+ "type": "string"
2285
+ }
2286
+ },
2287
+ {
2288
+ "description": "Id of the point",
2289
+ "in": "path",
2290
+ "name": "id",
2291
+ "required": true,
2292
+ "schema": {
2293
+ "type": "integer"
2294
+ }
2295
+ }
2296
+ ],
2297
+ "responses": {
2298
+ "200": {
2299
+ "content": {
2300
+ "application/json": {
2301
+ "schema": {
2302
+ "properties": {
2303
+ "result": {
2304
+ "$ref": "#/components/schemas/Record"
2305
+ },
2306
+ "status": {
2307
+ "enum": [
2308
+ "ok"
2309
+ ],
2310
+ "type": "string"
2311
+ },
2312
+ "time": {
2313
+ "description": "Time spent to process this request",
2314
+ "format": "float",
2315
+ "type": "number"
2316
+ }
2317
+ },
2318
+ "type": "object"
2319
+ }
2320
+ }
2321
+ },
2322
+ "description": "successful operation"
2323
+ },
2324
+ "default": {
2325
+ "content": {
2326
+ "application/json": {
2327
+ "schema": {
2328
+ "$ref": "#/components/schemas/ErrorResponse"
2329
+ }
2330
+ }
2331
+ },
2332
+ "description": "error"
2333
+ }
2334
+ },
2335
+ "summary": "Retrieve point by id",
2336
+ "tags": [
2337
+ "points"
2338
+ ]
2339
+ }
2340
+ }
2341
+ },
2342
+ "servers": [
2343
+ {
2344
+ "url": "http://localhost:6333"
2345
+ }
2346
+ ],
2347
+ "tags": [
2348
+ {
2349
+ "description": "Searchable collections of points.",
2350
+ "name": "collections"
2351
+ },
2352
+ {
2353
+ "description": "Float-point vectors with payload.",
2354
+ "name": "points"
2355
+ }
2356
+ ]
2357
+ }
docs/redoc/v0.5.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.5.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.6.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.7.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.2/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.3/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.4/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.5/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.8.6/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.9.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v0.9.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.0.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.0.2/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.0.3/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.1.0/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.1.1/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.1.2/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.1.3/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.10.x/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.11.x/openapi.json ADDED
The diff for this file is too large to render. See raw diff
 
docs/redoc/v1.12.x/openapi.json ADDED
The diff for this file is too large to render. See raw diff