diff --git a/.vscode/python.code-snippets b/.vscode/python.code-snippets index 2ace5f2b7a..251778364c 100644 --- a/.vscode/python.code-snippets +++ b/.vscode/python.code-snippets @@ -1,27 +1,78 @@ { - "Weaviate WCD connect": { - "prefix": "Weaviate-wcd-connect", + "Weaviate Starter Code - Local": { + "prefix": "weaviate-starter-local", + "description": "Create a new Weaviate collection: local w/ Ollama", "body": [ "import weaviate", + "from weaviate.classes.config import Configure, Property, DataType", + "", + "client = weaviate.connect_to_local()", + "", + "collection_name = \"${1:TempCollection}\"", + "", + "client.collections.delete(collection_name)", + "", + "client.collections.create(", + " collection_name,", + " properties=[", + " Property(\"${2:title}\", DataType.TEXT),", + " Property(\"${3:body}\", DataType.TEXT),${4}", + " ],", + " vectorizer_config=[", + " Configure.NamedVectors.text2vec_ollama(", + " name=\"default\",", + " source_properties=[\"${2:title}\", \"${3:body}\"],", + " api_endpoint=\"${5:http://host.docker.internal:11434}\",", + " model=\"${6:snowflake-arctic-embed}\",", + " )", + " ],", + " generative_config=Configure.Generative.text2vec_ollama(", + " api_endpoint=\"${5:http://host.docker.internal:11434}\",", + " model=\"${7:llama3.2}\",", + " )", + ")" + ] + }, + "Weaviate Starter Code - WCD": { + "prefix": "weaviate-starter-wcd", + "description": "Create a new Weaviate collection: WCD w/ Cohere", + "body": [ + "import weaviate", + "from weaviate.classes.config import Configure, Property, DataType", "from weaviate.classes.init import Auth", "import os", "", - "wcd_url = os.environ[\"WCD_DEMO_URL\"]", - "wcd_api_key = os.environ[\"WCD_DEMO_RO_KEY\"]", - "openai_api_key = os.environ[\"OPENAI_APIKEY\"]", - "cohere_api_key = os.environ[\"COHERE_APIKEY\"]", + "cohere_key = os.getenv(\"COHERE_APIKEY\")", + "weaviate_url = os.getenv(\"WEAVIATE_URL\")", + "weaviate_key = os.getenv(\"WEAVIATE_API_KEY\")", "", "client = weaviate.connect_to_weaviate_cloud(", - " cluster_url=wcd_url,", - " auth_credentials=Auth.api_key(wcd_api_key),", - " headers={", - " \"X-OpenAI-Api-Key\": openai_api_key,", - " \"X-Cohere-Api-Key\": cohere_api_key,", - " },", + " cluster_url=weaviate_url,", + " auth_credentials=Auth.api_key(weaviate_key),", + " headers={", + " \"X-Cohere-Api-Key\": cohere_key,", + " }", ")", - "" - ], - "description": "Connect to WCD edu demo instance" + "", + "collection_name = \"${1:TempCollection}\"", + "", + "client.collections.delete(collection_name)", + "", + "client.collections.create(", + " collection_name,", + " properties=[", + " Property(\"${2:title}\", DataType.TEXT),", + " Property(\"${3:body}\", DataType.TEXT),${4}", + " ],", + " vectorizer_config=[", + " Configure.NamedVectors.text2vec_cohere(", + " name=\"default\",", + " source_properties=[\"${2:title}\", \"${3:body}\"]", + " )", + " ],", + " generative_config=Configure.Generative.cohere()", + ")" + ] }, "Code snippet section": { "prefix": "code-section", diff --git a/README.md b/README.md index a36f9ca2c6..633d04c723 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,7 @@ first. ### Node.js Installation Use the [nvm](https://github.com/nvm-sh/nvm) package manager to install Node.js. -The `nvm` project page provides an installation script. - -``` -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash -``` +The `nvm` project page provides an [installation script](https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating). After you install `nvm`, use `nvm` to install Node.js. @@ -24,13 +20,11 @@ After you install `nvm`, use `nvm` to install Node.js. nvm install ``` -By default, `nvm` installs the most recent version of Node.js. Install Node.js -19.9.0 as well. Version 19.9.0 is more compatible with the current -`weaviate.io` project dependencies. +By default, `nvm` installs the most recent version of Node.js. Also install the version of Node.js that is specified in `.github/workflows/pull_requests.yaml`. At the time of writing it is version 20. ``` -nvm install 19.9.0 -nvm use 19.9.0 +nvm install 20 +nvm use 20 ``` ### yarn Installation @@ -105,7 +99,7 @@ the other project dependencies. Switch to the project directory, then use yarn to update the dependencies. ``` -cd weaviate.io +cd weaviate-io yarn install ``` @@ -116,23 +110,10 @@ You may see some warnings during the installation. When the installation completes, start the `yarn` server to test your build. ``` -yarn start & +yarn start ``` -`yarn` builds the project as a static web site and starts a server to host it. -`yarn` also opens a browser window connected to http://localhost:3000/ where -you can see your changes. - -Most changes are reflected live without having to restart the server. - -If you run ``yarn start`` in the foreground (without the "&"), you have to open -a second terminal to continue working on the command line. When you open a -second terminal, be sure to set the correct Node.js version before running -additional `yarn` commands. - -``` -nvm use node 19.9.0 -``` +This will build the site and start a local server, then open http://localhost:3000/ showing the local build. If you close the terminal, the server will stop. Or press `Ctrl+C`/`Cmd+C` to stop the server. ### Build the Web Site @@ -178,7 +159,7 @@ If you are using GitHub pages for hosting, this command is a convenient way to b Code examples in the documentation are in one of two formats: -#### New format +#### Extracted from scripts In many files, you will see a format similar to: @@ -204,7 +185,7 @@ import TSCode from '!!raw-loader!/_includes/code/howto/manage-data.create.ts'; text={TSCode} startMarker="// ValidateObject START" endMarker="// ValidateObject END" - language="ts" + language="tsv2" /> @@ -216,7 +197,7 @@ Here, the `FilteredTextBlock` component loads lines between the `startMarker` an For more information about tests, please see [README-tests.md](./README-tests.md). -#### Legacy format +#### Pure text In some code examples, the code will be written directly inside the `TabItem` component, as shown below. diff --git a/_build_scripts/slack-find-author.sh b/_build_scripts/slack-find-author.sh index 113134bccc..98b834f0dd 100644 --- a/_build_scripts/slack-find-author.sh +++ b/_build_scripts/slack-find-author.sh @@ -4,6 +4,7 @@ set -e # A map of the github contributors that connects to @Slack handles declare -A git_slack_map git_slack_map=( + ["Abdel Rodríguez"]="<@U03R5ELDHHB>" ["Andrzej Liszka"]="<@U036Y4GPB6W>" ["Bob van Luijt"]="<@U6P955HC4>" ["Charlie Harr"]="<@U044XTHRVFA>" @@ -26,15 +27,19 @@ git_slack_map=( ["m-newhauser"]="<@U07K9AJCG2F>" ["Marcin Antas"]="<@U01E5BJ3UV7>" ["Mohamed Shahin"]="<@U05V4HPJ3M0>" + ["Nate Wilkinson"]="<@U06SCMA8ZB9>" ["Parker Duckworth"]="<@U034QPLGSCU>" ["Peter Schramm"]="<@U03MWHJQ7PX>" ["Philip Vollet"]="<@U0573N5V97A>" ["Sebastian Witalec"]="<@U03DENV56CR>" ["Shan-Weaviate"]="<@U05DKAH2ZL1>" + ["Spiros"]="<@U07G6HDV0HK>" ["Stefan Bogdan"]="<@U01DPKTVA93>" ["Svitlana"]="<@U03DQTXFDHS>" ["svitlana-sm"]="<@U03DQTXFDHS>" ["thomashacker"]="<@U056E1ZEM3L>" + ["TuanaCelik"]="<@U07TUMJ1SUS>" + ["Victoria Slocum"]="<@U05K0QFGRGV>" ["Wera"]="<@U043TKSEU5V>" ["Zain Hasan"]="<@U043TKSJQF9>" ["Mohamed Shahin"]="<@U05V4HPJ3M0>" diff --git a/_build_scripts/update-config-versions.js b/_build_scripts/update-config-versions.js index add3353325..31aa4f392a 100644 --- a/_build_scripts/update-config-versions.js +++ b/_build_scripts/update-config-versions.js @@ -1,30 +1,53 @@ const fetch = require('node-fetch'); const getRepoVersion = async (repoName) => { - const response = await fetch( // fetch all release versions - `https://api.github.com/repos/weaviate/${repoName}/releases`, - { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'authorization': // Use the github token if available - (process.env.GH_API_TOKEN) ? - `Bearer ${ process.env.GH_API_TOKEN }` : '' + try { + const response = await fetch( // fetch all release versions + `https://api.github.com/repos/weaviate/${repoName}/releases`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'authorization': // Use the github token if available + (process.env.GH_API_TOKEN) ? + `Bearer ${ process.env.GH_API_TOKEN }` : '' + } } + ); + + // First check if the response was ok + if (!response.ok) { + throw new Error(`GitHub API error: ${response.status} ${response.statusText}`); } - ); - const releases = await response.json(); - const highestVersion = releases - .filter(item => !item.prerelease) // remove pre-release items - .map(item => item.tag_name) // keep only the tag_name - .sort() // sort items alphabetically – ascending - .pop() // the last item contains the highest version (what we need) - .replace('v', '') // remove the v from the name "v1.26.1" => "1.26.1" + const releases = await response.json(); + + // Check if releases is actually an array + if (!Array.isArray(releases)) { + // Debug log to see what we're getting + console.log(`Raw response for ${repoName}:`, JSON.stringify(releases).slice(0, 200)); + console.error(`Unexpected response format for ${repoName}:`, releases); + throw new Error(`Expected array of releases but got ${typeof releases}`); + } + + if (releases.length === 0) { + throw new Error(`No releases found for ${repoName}`); + } - console.log(`${repoName} ${highestVersion}`) + const highestVersion = releases + .filter(item => !item.prerelease) // remove pre-release items + .map(item => item.tag_name) // keep only the tag_name + .sort() // sort items alphabetically – ascending + .pop() // the last item contains the highest version (what we need) + .replace('v', '') // remove the v from the name "v1.26.1" => "1.26.1" - return highestVersion; + console.log(`${repoName} ${highestVersion}`); + return highestVersion; + } catch (error) { + console.error(`Error fetching version for ${repoName}:`, error); + // Maybe return a default version or rethrow depending on your needs + throw error; + } } // Build time versions replace values set in versions-config.json @@ -63,4 +86,4 @@ const updateConfigFile = async () => { }); } -updateConfigFile(); \ No newline at end of file +updateConfigFile(); diff --git a/_includes/ann-deep-96.mdx b/_includes/ann-deep-96.mdx deleted file mode 100644 index dad80423b8..0000000000 --- a/_includes/ann-deep-96.mdx +++ /dev/null @@ -1,80 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - -|efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 16 | 64 | **94.44%** | **9301** | 310 | 3.14ms | 7.21ms | 3305s | -| 128 | 16 | 64 | **96.06%** | **8957** | 299 | 3.28ms | 7.24ms | 3804s | -| 64 | 64 | 64 | **96.84%** | **8760** | 292 | 3.36ms | 6.97ms | 3253s | -| 128 | 32 | 64 | **97.88%** | **8473** | 282 | 3.48ms | 7.4ms | 3533s | -| 128 | 64 | 64 | **98.27%** | **7984** | 266 | 3.66ms | 7.52ms | 3631s | -| 256 | 32 | 64 | **98.78%** | **7916** | 264 | 3.71ms | 7.83ms | 4295s | -| 512 | 32 | 64 | **98.95%** | **7876** | 263 | 3.73ms | 7.47ms | 5477s | -| 256 | 64 | 64 | **99.06%** | **7839** | 261 | 3.75ms | 7.21ms | 4392s | -| 512 | 64 | 64 | **99.32%** | **7238** | 241 | 4.05ms | 7.67ms | 6039s | -| 256 | 64 | 128 | **99.42%** | **5767** | 192 | 5.1ms | 8.39ms | 4392s | -| 512 | 64 | 128 | **99.52%** | **5509** | 184 | 5.34ms | 8.7ms | 6039s | -| 256 | 32 | 256 | **99.66%** | **4672** | 156 | 6.32ms | 10.11ms | 4295s | -| 512 | 32 | 256 | **99.82%** | **4467** | 149 | 6.62ms | 10.29ms | 5477s | -| 512 | 64 | 256 | **99.9%** | **3683** | 123 | 7.97ms | 12.72ms | 6039s | -| 512 | 32 | 512 | **99.94%** | **2842** | 95 | 10.37ms | 15.25ms | 5477s | -| 512 | 64 | 512 | **99.95%** | **2288** | 76 | 12.84ms | 20.72ms | 6039s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 16 | 64 | **91.58%** | **8679** | 289 | 3.35ms | 7.3ms | 3305s | -| 128 | 16 | 64 | **93.68%** | **8402** | 280 | 3.47ms | 6.9ms | 3804s | -| 64 | 32 | 64 | **94.11%** | **8255** | 275 | 3.55ms | 7.61ms | 3275s | -| 64 | 64 | 64 | **94.67%** | **8184** | 273 | 3.58ms | 7.19ms | 3253s | -| 128 | 64 | 64 | **96.95%** | **7575** | 253 | 3.88ms | 7.79ms | 3631s | -| 256 | 32 | 64 | **97.53%** | **7539** | 251 | 3.87ms | 7.81ms | 4295s | -| 512 | 32 | 64 | **97.92%** | **7399** | 247 | 3.96ms | 8.04ms | 5477s | -| 256 | 64 | 64 | **98.15%** | **7287** | 243 | 4.02ms | 7.3ms | 4392s | -| 512 | 64 | 64 | **98.76%** | **6838** | 228 | 4.27ms | 7.96ms | 6039s | -| 256 | 64 | 128 | **98.77%** | **5658** | 189 | 5.2ms | 8.7ms | 4392s | -| 512 | 64 | 128 | **99.23%** | **5233** | 174 | 5.62ms | 9.25ms | 6039s | -| 256 | 32 | 256 | **99.44%** | **4454** | 148 | 6.58ms | 10.11ms | 4295s | -| 512 | 32 | 256 | **99.61%** | **4270** | 142 | 6.89ms | 10.77ms | 5477s | -| 512 | 64 | 256 | **99.78%** | **3534** | 118 | 8.26ms | 12.97ms | 6039s | -| 256 | 32 | 512 | **99.8%** | **2932** | 98 | 10.04ms | 14.79ms | 4295s | -| 512 | 32 | 512 | **99.88%** | **2767** | 92 | 10.64ms | 15.67ms | 5477s | -| 512 | 64 | 512 | **99.93%** | **2233** | 74 | 13.12ms | 21.24ms | 6039s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 512 | 8 | 64 | **72.88%** | **4734** | 158 | 6.06ms | 9.94ms | 4327s | -| 64 | 16 | 64 | **82.08%** | **4645** | 155 | 6.25ms | 9.31ms | 3305s | -| 512 | 16 | 64 | **85.81%** | **4556** | 152 | 6.33ms | 9.56ms | 4922s | -| 64 | 32 | 64 | **86.23%** | **4492** | 150 | 6.43ms | 9.82ms | 3275s | -| 64 | 64 | 64 | **87.25%** | **4488** | 150 | 6.45ms | 9.36ms | 3253s | -| 64 | 32 | 128 | **89.05%** | **4347** | 145 | 6.67ms | 10.05ms | 3275s | -| 512 | 16 | 128 | **89.08%** | **4347** | 145 | 6.65ms | 10.31ms | 4922s | -| 64 | 64 | 128 | **89.88%** | **4284** | 143 | 6.78ms | 9.86ms | 3253s | -| 256 | 32 | 64 | **91.99%** | **4146** | 138 | 7.01ms | 10.36ms | 4295s | -| 512 | 32 | 64 | **92.7%** | **4092** | 136 | 7.08ms | 10.33ms | 5477s | -| 256 | 64 | 64 | **93.85%** | **3917** | 131 | 7.39ms | 10.68ms | 4392s | -| 256 | 32 | 128 | **94.22%** | **3913** | 130 | 7.43ms | 10.74ms | 4295s | -| 512 | 32 | 128 | **94.83%** | **3856** | 129 | 7.54ms | 11.08ms | 5477s | -| 512 | 64 | 64 | **95.14%** | **3816** | 127 | 7.6ms | 11.23ms | 6039s | -| 256 | 64 | 128 | **95.65%** | **3688** | 123 | 7.9ms | 11.12ms | 4392s | -| 128 | 32 | 256 | **96.9%** | **3317** | 111 | 8.78ms | 12.5ms | 3533s | -| 256 | 32 | 256 | **97.91%** | **3182** | 106 | 9.19ms | 12.91ms | 4295s | -| 512 | 32 | 256 | **98.29%** | **3090** | 103 | 9.48ms | 13.16ms | 5477s | -| 256 | 64 | 256 | **98.48%** | **2896** | 97 | 10.1ms | 14.27ms | 4392s | -| 512 | 64 | 256 | **99.02%** | **2707** | 90 | 10.78ms | 15.47ms | 6039s | -| 256 | 32 | 512 | **99.34%** | **2310** | 77 | 12.65ms | 17.56ms | 4295s | -| 512 | 32 | 512 | **99.52%** | **2200** | 73 | 13.27ms | 18.76ms | 5477s | -| 256 | 64 | 512 | **99.53%** | **2032** | 68 | 14.3ms | 21.44ms | 4392s | -| 512 | 64 | 512 | **99.75%** | **1879** | 63 | 15.56ms | 23.65ms | 6039s | - - - diff --git a/_includes/ann-gist-960.mdx b/_includes/ann-gist-960.mdx deleted file mode 100644 index e22c5d0def..0000000000 --- a/_includes/ann-gist-960.mdx +++ /dev/null @@ -1,75 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - -|efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 8 | 64 | **66.6%** | **2759** | 92 | 10.59ms | 13.77ms | 1832s | -| 128 | 8 | 64 | **70.7%** | **2734** | 91 | 10.7ms | 13.97ms | 1861s | -| 512 | 8 | 64 | **75.0%** | **2724** | 91 | 10.78ms | 14.87ms | 2065s | -| 64 | 16 | 64 | **79.8%** | **2618** | 87 | 11.04ms | 14.69ms | 1838s | -| 128 | 16 | 64 | **83.9%** | **2577** | 86 | 11.21ms | 15.55ms | 1904s | -| 256 | 16 | 64 | **87.1%** | **2518** | 84 | 11.54ms | 14.49ms | 2016s | -| 128 | 32 | 64 | **89.6%** | **2425** | 81 | 11.85ms | 15.37ms | 1931s | -| 256 | 32 | 64 | **92.6%** | **2388** | 80 | 12.09ms | 15.99ms | 2074s | -| 256 | 64 | 64 | **94.1%** | **2207** | 74 | 13.08ms | 18.56ms | 2130s | -| 512 | 32 | 64 | **94.6%** | **2073** | 69 | 14.11ms | 17.37ms | 2361s | -| 512 | 32 | 128 | **96.2%** | **1985** | 66 | 14.67ms | 19.32ms | 2361s | -| 512 | 64 | 64 | **96.2%** | **1951** | 65 | 14.7ms | 19.61ms | 2457s | -| 512 | 16 | 256 | **96.2%** | **1839** | 61 | 15.9ms | 19.84ms | 2217s | -| 512 | 64 | 128 | **96.7%** | **1603** | 53 | 18.06ms | 24.44ms | 2457s | -| 512 | 32 | 256 | **98.7%** | **1514** | 50 | 19.16ms | 24.43ms | 2361s | -| 512 | 32 | 512 | **99.1%** | **999** | 33 | 29.12ms | 38.89ms | 2361s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 128 | 8 | 64 | **65.88%** | **2649** | 88 | 11.02ms | 14.89ms | 1861s | -| 512 | 8 | 64 | **69.68%** | **2625** | 88 | 11.03ms | 15.08ms | 2065s | -| 64 | 16 | 64 | **74.17%** | **2557** | 85 | 11.29ms | 15.54ms | 1838s | -| 128 | 16 | 64 | **80.23%** | **2518** | 84 | 11.5ms | 15.54ms | 1904s | -| 64 | 64 | 64 | **81.98%** | **2387** | 80 | 12.11ms | 16.31ms | 1860s | -| 256 | 16 | 64 | **82.87%** | **2355** | 79 | 12.37ms | 17.67ms | 2016s | -| 128 | 64 | 64 | **88.11%** | **2312** | 77 | 12.56ms | 16.57ms | 1952s | -| 256 | 32 | 64 | **89.83%** | **2297** | 77 | 12.55ms | 18.98ms | 2074s | -| 512 | 32 | 64 | **91.85%** | **2002** | 67 | 14.47ms | 20.03ms | 2361s | -| 256 | 64 | 64 | **92.04%** | **1937** | 65 | 14.93ms | 21.48ms | 2130s | -| 512 | 32 | 128 | **94.14%** | **1935** | 65 | 15.05ms | 19.86ms | 2361s | -| 512 | 64 | 64 | **94.72%** | **1860** | 62 | 15.56ms | 21.91ms | 2457s | -| 512 | 64 | 128 | **95.99%** | **1569** | 52 | 18.38ms | 24.81ms | 2457s | -| 256 | 32 | 256 | **96.48%** | **1556** | 52 | 18.6ms | 24.68ms | 2074s | -| 512 | 32 | 256 | **97.76%** | **1483** | 49 | 19.53ms | 25.24ms | 2361s | -| 512 | 64 | 256 | **98.62%** | **1286** | 43 | 22.3ms | 30.06ms | 2457s | -| 512 | 32 | 512 | **99.16%** | **981** | 33 | 29.53ms | 37.97ms | 2361s | -| 512 | 64 | 512 | **99.47%** | **880** | 29 | 32.45ms | 44.66ms | 2457s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 512 | 8 | 64 | **56.05%** | **1997** | 67 | 14.5ms | 20.28ms | 2065s | -| 256 | 8 | 128 | **60.26%** | **1945** | 65 | 14.66ms | 18.39ms | 1938s | -| 64 | 16 | 64 | **61.8%** | **1862** | 62 | 15.42ms | 20.05ms | 1838s | -| 128 | 16 | 64 | **68.05%** | **1832** | 61 | 15.61ms | 20.05ms | 1904s | -| 512 | 16 | 128 | **77.53%** | **1802** | 60 | 16.1ms | 19.07ms | 2217s | -| 128 | 64 | 64 | **78.26%** | **1744** | 58 | 16.59ms | 21.48ms | 1952s | -| 128 | 32 | 128 | **79.71%** | **1713** | 57 | 16.68ms | 21.37ms | 1931s | -| 256 | 32 | 64 | **80.3%** | **1652** | 55 | 17.49ms | 23.8ms | 2074s | -| 512 | 32 | 128 | **86.91%** | **1624** | 54 | 17.83ms | 23.28ms | 2361s | -| 512 | 16 | 256 | **88.31%** | **1515** | 51 | 19.08ms | 24.64ms | 2217s | -| 128 | 32 | 256 | **89.11%** | **1477** | 49 | 19.72ms | 25.54ms | 1931s | -| 256 | 32 | 256 | **92.63%** | **1361** | 45 | 21.34ms | 28.19ms | 2074s | -| 512 | 32 | 256 | **94.49%** | **1308** | 44 | 22.17ms | 29.1ms | 2361s | -| 512 | 64 | 256 | **96.44%** | **1152** | 38 | 24.88ms | 33.15ms | 2457s | -| 256 | 32 | 512 | **96.94%** | **1001** | 33 | 28.71ms | 36.11ms | 2074s | -| 256 | 64 | 512 | **97.87%** | **893** | 30 | 31.91ms | 42.6ms | 2130s | -| 512 | 32 | 512 | **98.04%** | **870** | 29 | 32.84ms | 42.31ms | 2361s | -| 512 | 64 | 512 | **98.8%** | **812** | 27 | 34.96ms | 47.45ms | 2457s | - - - diff --git a/_includes/ann-glove-25.mdx b/_includes/ann-glove-25.mdx deleted file mode 100644 index 3c797af655..0000000000 --- a/_includes/ann-glove-25.mdx +++ /dev/null @@ -1,79 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - -|efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 128 | 8 | 64 | **94.47%** | **19752** | 658 | 1.48ms | 2.49ms | 178s | -| 512 | 8 | 64 | **95.3%** | **19704** | 657 | 1.48ms | 2.61ms | 272s | -| 512 | 16 | 64 | **99.26%** | **17583** | 586 | 1.65ms | 2.82ms | 308s | -| 256 | 16 | 64 | **99.27%** | **17177** | 573 | 1.7ms | 2.67ms | 232s | -| 128 | 32 | 64 | **99.72%** | **15443** | 515 | 1.9ms | 2.83ms | 184s | -| 256 | 32 | 64 | **99.84%** | **15187** | 506 | 1.93ms | 2.82ms | 261s | -| 512 | 32 | 64 | **99.89%** | **14401** | 480 | 2.04ms | 2.93ms | 354s | -| 256 | 64 | 64 | **99.9%** | **13490** | 450 | 2.17ms | 3.17ms | 276s | -| 512 | 64 | 64 | **99.96%** | **12626** | 421 | 2.32ms | 3.37ms | 388s | -| 512 | 64 | 128 | **99.98%** | **8665** | 289 | 3.38ms | 4.82ms | 388s | -| 256 | 32 | 256 | **99.98%** | **7191** | 240 | 4.07ms | 5.77ms | 261s | -| 128 | 64 | 256 | **99.99%** | **6958** | 232 | 4.18ms | 6.17ms | 195s | -| 512 | 32 | 256 | **100.0%** | **6694** | 223 | 4.39ms | 5.99ms | 354s | -| 128 | 32 | 512 | **100.0%** | **4568** | 152 | 6.4ms | 9.27ms | 184s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 128 | 8 | 64 | **91.33%** | **16576** | 553 | 1.75ms | 2.82ms | 178s | -| 256 | 8 | 64 | **91.98%** | **16474** | 549 | 1.76ms | 2.87ms | 205s | -| 512 | 8 | 64 | **92.13%** | **16368** | 546 | 1.77ms | 2.85ms | 272s | -| 64 | 16 | 64 | **96.56%** | **15003** | 500 | 1.93ms | 2.94ms | 160s | -| 512 | 16 | 64 | **97.95%** | **14996** | 500 | 1.92ms | 2.78ms | 308s | -| 64 | 64 | 64 | **98.04%** | **14197** | 473 | 2.05ms | 3.14ms | 167s | -| 128 | 32 | 64 | **99.06%** | **13482** | 449 | 2.17ms | 3.07ms | 184s | -| 256 | 32 | 64 | **99.44%** | **13237** | 441 | 2.2ms | 3.22ms | 261s | -| 512 | 32 | 64 | **99.56%** | **12661** | 422 | 2.31ms | 3.32ms | 354s | -| 256 | 64 | 64 | **99.63%** | **12014** | 400 | 2.43ms | 3.37ms | 276s | -| 512 | 64 | 64 | **99.76%** | **11300** | 377 | 2.58ms | 3.56ms | 388s | -| 512 | 32 | 128 | **99.76%** | **9365** | 312 | 3.14ms | 4.73ms | 354s | -| 256 | 64 | 128 | **99.79%** | **8669** | 289 | 3.34ms | 4.67ms | 276s | -| 512 | 64 | 128 | **99.89%** | **7990** | 266 | 3.65ms | 5.09ms | 388s | -| 256 | 32 | 256 | **99.95%** | **6771** | 226 | 4.32ms | 5.84ms | 261s | -| 512 | 32 | 256 | **99.97%** | **6286** | 210 | 4.66ms | 6.33ms | 354s | -| 512 | 64 | 256 | **99.99%** | **5225** | 174 | 5.55ms | 8.11ms | 388s | -| 256 | 32 | 512 | **100.0%** | **4281** | 143 | 6.84ms | 9.55ms | 261s | -| 512 | 32 | 512 | **100.0%** | **3917** | 131 | 7.47ms | 10.33ms | 354s | -| 256 | 64 | 512 | **100.0%** | **3611** | 120 | 8.03ms | 12.03ms | 276s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 8 | 64 | **78.16%** | **6202** | 207 | 4.55ms | 6.21ms | 152s | -| 256 | 8 | 64 | **80.07%** | **6044** | 201 | 4.59ms | 8.59ms | 205s | -| 64 | 8 | 128 | **81.93%** | **5968** | 199 | 4.73ms | 6.98ms | 152s | -| 512 | 16 | 64 | **91.28%** | **5930** | 198 | 4.75ms | 6.86ms | 308s | -| 64 | 64 | 64 | **92.52%** | **5768** | 192 | 4.91ms | 6.38ms | 167s | -| 128 | 16 | 128 | **93.17%** | **5650** | 188 | 5.02ms | 6.47ms | 185s | -| 128 | 32 | 64 | **94.91%** | **5543** | 185 | 5.13ms | 6.81ms | 184s | -| 256 | 32 | 64 | **96.07%** | **5524** | 184 | 5.12ms | 6.71ms | 261s | -| 512 | 32 | 64 | **96.45%** | **5321** | 177 | 5.32ms | 7.51ms | 354s | -| 128 | 32 | 128 | **96.54%** | **5254** | 175 | 5.42ms | 7.01ms | 184s | -| 256 | 32 | 128 | **97.48%** | **5235** | 175 | 5.43ms | 7.34ms | 261s | -| 512 | 32 | 128 | **97.79%** | **5045** | 168 | 5.65ms | 7.15ms | 354s | -| 256 | 64 | 128 | **98.21%** | **4889** | 163 | 5.86ms | 7.75ms | 276s | -| 512 | 64 | 128 | **98.75%** | **4667** | 156 | 6.13ms | 7.85ms | 388s | -| 128 | 32 | 256 | **99.01%** | **4298** | 143 | 6.71ms | 8.76ms | 184s | -| 256 | 32 | 256 | **99.43%** | **4242** | 141 | 6.77ms | 8.74ms | 261s | -| 512 | 32 | 256 | **99.57%** | **4069** | 136 | 7.1ms | 9.01ms | 354s | -| 256 | 64 | 256 | **99.61%** | **3854** | 128 | 7.47ms | 10.13ms | 276s | -| 512 | 64 | 256 | **99.79%** | **3634** | 121 | 7.92ms | 10.88ms | 388s | -| 256 | 32 | 512 | **99.92%** | **3158** | 105 | 9.18ms | 12.12ms | 261s | -| 512 | 32 | 512 | **99.95%** | **2956** | 99 | 9.8ms | 12.86ms | 354s | -| 512 | 64 | 512 | **99.98%** | **2581** | 86 | 11.21ms | 15.68ms | 388s | - - - diff --git a/_includes/ann-sift-128.mdx b/_includes/ann-sift-128.mdx deleted file mode 100644 index 89e74c43a7..0000000000 --- a/_includes/ann-sift-128.mdx +++ /dev/null @@ -1,75 +0,0 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - -|efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 8 | 64 | **90.91%** | **11445** | 381 | 2.59ms | 3.44ms | 186s | -| 512 | 8 | 64 | **95.74%** | **11391** | 380 | 2.6ms | 3.4ms | 286s | -| 128 | 16 | 64 | **98.52%** | **10443** | 348 | 2.83ms | 3.77ms | 204s | -| 512 | 16 | 64 | **98.69%** | **10287** | 343 | 2.87ms | 3.94ms | 314s | -| 128 | 32 | 64 | **98.92%** | **9760**| 325 | 3.03ms | 4.15ms | 203s | -| 256 | 32 | 64 | **99.0%** | **9462** | 315 | 3.13ms | 4.36ms | 243s | -| 512 | 32 | 64 | **99.22%** | **9249** | 308 | 3.2ms | 4.68ms | 351s | -| 512 | 32 | 128 | **99.29%** | **7155** | 238 | 4.14ms | 5.84ms | 351s | -| 128 | 32 | 256 | **99.34%** | **5694** | 190 | 5.21ms | 6.94ms | 203s | -| 256 | 32 | 512 | **99.37%** | **3578** | 119 | 8.27ms | 11.2ms | 243s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 128 | 8 | 64 | **91.33%** | **16576** | 553 | 1.75ms | 2.82ms | 178s | -| 256 | 8 | 64 | **91.98%** | **16474** | 549 | 1.76ms | 2.87ms | 205s | -| 512 | 8 | 64 | **92.13%** | **16368** | 546 | 1.77ms | 2.85ms | 272s | -| 64 | 16 | 64 | **96.56%** | **15003** | 500 | 1.93ms | 2.94ms | 160s | -| 512 | 16 | 64 | **97.95%** | **14996** | 500 | 1.92ms | 2.78ms | 308s | -| 64 | 64 | 64 | **98.04%** | **14197** | 473 | 2.05ms | 3.14ms | 167s | -| 128 | 32 | 64 | **99.06%** | **13482** | 449 | 2.17ms | 3.07ms | 184s | -| 256 | 32 | 64 | **99.44%** | **13237** | 441 | 2.2ms | 3.22ms | 261s | -| 512 | 32 | 64 | **99.56%** | **12661** | 422 | 2.31ms | 3.32ms | 354s | -| 256 | 64 | 64 | **99.63%** | **12014** | 400 | 2.43ms | 3.37ms | 276s | -| 512 | 64 | 64 | **99.76%** | **11300** | 377 | 2.58ms | 3.56ms | 388s | -| 512 | 32 | 128 | **99.76%** | **9365** | 312 | 3.14ms | 4.73ms | 354s | -| 256 | 64 | 128 | **99.79%** | **8669** | 289 | 3.34ms | 4.67ms | 276s | -| 512 | 64 | 128 | **99.89%** | **7990** | 266 | 3.65ms | 5.09ms | 388s | -| 256 | 32 | 256 | **99.95%** | **6771** | 226 | 4.32ms | 5.84ms | 261s | -| 512 | 32 | 256 | **99.97%** | **6286** | 210 | 4.66ms | 6.33ms | 354s | -| 512 | 64 | 256 | **99.99%** | **5225** | 174 | 5.55ms | 8.11ms | 388s | -| 256 | 32 | 512 | **100.0%** | **4281** | 143 | 6.84ms | 9.55ms | 261s | -| 512 | 32 | 512 | **100.0%** | **3917** | 131 | 7.47ms | 10.33ms | 354s | -| 256 | 64 | 512 | **100.0%** | **3611** | 120 | 8.03ms | 12.03ms | 276s | - - - - -| efConstruction | maxConnections | ef | **Recall** | **QPS** | QPS/vCore | Mean Latency | p99 Latency | Import time | -| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 8 | 64 | **78.16%** | **6202** | 207 | 4.55ms | 6.21ms | 152s | -| 256 | 8 | 64 | **80.07%** | **6044** | 201 | 4.59ms | 8.59ms | 205s | -| 64 | 8 | 128 | **81.93%** | **5968** | 199 | 4.73ms | 6.98ms | 152s | -| 512 | 16 | 64 | **91.28%** | **5930** | 198 | 4.75ms | 6.86ms | 308s | -| 64 | 64 | 64 | **92.52%** | **5768** | 192 | 4.91ms | 6.38ms | 167s | -| 128 | 16 | 128 | **93.17%** | **5650** | 188 | 5.02ms | 6.47ms | 185s | -| 128 | 32 | 64 | **94.91%** | **5543** | 185 | 5.13ms | 6.81ms | 184s | -| 256 | 32 | 64 | **96.07%** | **5524** | 184 | 5.12ms | 6.71ms | 261s | -| 512 | 32 | 64 | **96.45%** | **5321** | 177 | 5.32ms | 7.51ms | 354s | -| 128 | 32 | 128 | **96.54%** | **5254** | 175 | 5.42ms | 7.01ms | 184s | -| 256 | 32 | 128 | **97.48%** | **5235** | 175 | 5.43ms | 7.34ms | 261s | -| 512 | 32 | 128 | **97.79%** | **5045** | 168 | 5.65ms | 7.15ms | 354s | -| 256 | 64 | 128 | **98.21%** | **4889** | 163 | 5.86ms | 7.75ms | 276s | -| 512 | 64 | 128 | **98.75%** | **4667** | 156 | 6.13ms | 7.85ms | 388s | -| 128 | 32 | 256 | **99.01%** | **4298** | 143 | 6.71ms | 8.76ms | 184s | -| 256 | 32 | 256 | **99.43%** | **4242** | 141 | 6.77ms | 8.74ms | 261s | -| 512 | 32 | 256 | **99.57%** | **4069** | 136 | 7.1ms | 9.01ms | 354s | -| 256 | 64 | 256 | **99.61%** | **3854** | 128 | 7.47ms | 10.13ms | 276s | -| 512 | 64 | 256 | **99.79%** | **3634** | 121 | 7.92ms | 10.88ms | 388s | -| 256 | 32 | 512 | **99.92%** | **3158** | 105 | 9.18ms | 12.12ms | 261s | -| 512 | 32 | 512 | **99.95%** | **2956** | 99 | 9.8ms | 12.86ms | 354s | -| 512 | 64 | 512 | **99.98%** | **2581** | 86 | 11.21ms | 15.68ms | 388s | - - - diff --git a/_includes/clients/matrix-intro.md b/_includes/clients/matrix-intro.md deleted file mode 100644 index 7c53efd701..0000000000 --- a/_includes/clients/matrix-intro.md +++ /dev/null @@ -1,53 +0,0 @@ -For links to the client releases associated with the latest Weaviate core releases, expand this section. - -
- Current core and client releases - -|Weaviate Version|Release Date|Python|TypeScript|Go|Java| -|:-|:-|:-:|:-:|:-:|:-:| -| [1.26.5](https://github.com/weaviate/weaviate/releases/tag/v1.26.5) | 2024-09-27 | 4.8.1 | 3.1.4 | 4.15.1 | 4.8.3 | -| [1.26.4](https://github.com/weaviate/weaviate/releases/tag/v1.26.4) | 2024-09-06 | 4.7.1 | '' | '' | 4.8.2 | -| [1.26.3](https://github.com/weaviate/weaviate/releases/tag/v1.26.3) | 2024-08-29 | '' | '' | '' | '' | -| [1.26.2](https://github.com/weaviate/weaviate/releases/tag/v1.26.2) | 2024-08-29 | '' | '' | '' | '' | -| [1.26.1](https://github.com/weaviate/weaviate/releases/tag/v1.26.1) | 2024-07-18 | 4.6.6 | 3.0.8 | 4.14.2 | 4.8.0 | -| [1.26.0](https://github.com/weaviate/weaviate/releases/tag/v1.26.0) | 2024-07-18 | '' | '' | '' | 4.7.0 | - -
- -For links to previous releases, expand this section. - -
- Previous core and client releases - -|Weaviate Version|Release Date|Python|TypeScript|Go|Java| -|:-|:-|:-:|:-:|:-:|:-:| -| [1.25.0](https://github.com/weaviate/weaviate/releases/tag/v1.25.0) | 2024-05-10 | 4.6.0 | 2.1.1 | 4.13.1 | 4.6.0 | -| [1.24.0](https://github.com/weaviate/weaviate/releases/tag/v1.24.0) | 2024-02-27 | 4.5.0 | 2.1.0 | 4.12.0 | 4.5.1 | -| [1.23.0](https://github.com/weaviate/weaviate/releases/tag/v1.23.0) | 2023-12-18 | 3.26.0 | 2.0.0 | '' |4.4.2 | -| [1.22.0](https://github.com/weaviate/weaviate/releases/tag/v1.22.0) | 2023-10-27 | 3.25.0 | '' | 4.10.0 | 4.3.0 | -| [1.21.0](https://github.com/weaviate/weaviate/releases/tag/v1.21.0) | 2023-08-17 | 3.22.1 |1.4.0 | 4.9.0 | 4.2.1 | -| [1.20.0](https://github.com/weaviate/weaviate/releases/tag/v1.20.0) | 2023-07-06 | 3.22.0 | '' | '' | 4.2.0 | -| [1.19.0](https://github.com/weaviate/weaviate/releases/tag/v1.19.0) | 2023-05-04 | 3.17.0 | 1.1.0] | 4.7.1 | 4.0.1 | -| [1.18.0](https://github.com/weaviate/weaviate/releases/tag/v1.18.0) | 2023-03-07 | 3.13.0 | 2.14.5 | 4.6.2 | 3.6.4 | -| [1.17.0](https://github.com/weaviate/weaviate/releases/tag/v1.17.0) | 2022-12-20 | 3.9.0 | 2.14.0 | 4.5.0 | 3.5.0 | -| [1.16.0](https://github.com/weaviate/weaviate/releases/tag/v1.16.0) | 2022-10-31 | 3.8.0 | 2.13.0 | 4.4.0 | 3.4.0 | -| [1.15.0](https://github.com/weaviate/weaviate/releases/tag/v1.15.0) | 2022-09-07 | '' | 2.12.0 | 4.3.0 | 3.3.0 | -| [1.14.0](https://github.com/weaviate/weaviate/releases/tag/v1.14.0) | 2022-07-07 | 3.6.0 | 2.11.0 | 4.2.0 | 3.2.0 | -| [1.13.0](https://github.com/weaviate/weaviate/releases/tag/v1.13.0) | 2022-05-03 | 3.4.2 | 2.9.0 | 4.0.0 | 2.4.0 | -| [1.12.0](https://github.com/weaviate/weaviate/releases/tag/v1.12.0) | 2022-04-05 | 3.4.0 | 2.8.0 | 3.0.0 | '' | -| [1.11.0](https://github.com/weaviate/weaviate/releases/tag/v1.11.0) | 2022-03-14 | 3.2.5 | 2.7.0 | 2.6.0 | 2.3.0 | -| [1.10.0](https://github.com/weaviate/weaviate/releases/tag/v1.10.0) | 2022-01-27 | '' | 2.5.0 | 2.4.1 | 2.1.1 | -| [1.9.0](https://github.com/weaviate/weaviate/releases/tag/v1.9.0) | 2021-12-10 | '' | '' | 2.4.0 | 2.1.0 | -| [1.8.0](https://github.com/weaviate/weaviate/releases/tag/v1.8.0) | 2021-11-30 | '' | '' | '' | '' | -| [1.7.0](https://github.com/weaviate/weaviate/releases/tag/v1.7.0) | 2021-09-01 | 3.1.1 | 2.4.0 | 2.3.0 | 1.1.0 | -| [1.6.0](https://github.com/weaviate/weaviate/releases/tag/v1.6.0) | 2021-08-11 | 2.4.0 | 2.3.0 | 2.2.0 | '' | -| [1.5.0](https://github.com/weaviate/weaviate/releases/tag/v1.5.0) | 2021-07-13 | '' | '' | '' | '' | -| [1.4.0](https://github.com/weaviate/weaviate/releases/tag/v1.4.0) | 2021-06-09 | '' | '' | '' | '' | -| [1.3.0](https://github.com/weaviate/weaviate/releases/tag/v1.3.0) | 2021-04-23 | '' | 2.1.0 | 2.1.0 | 1.0.0 | -| [1.2.0](https://github.com/weaviate/weaviate/releases/tag/v1.2.0) | 2021-03-15 | 2.2.0 | 2.0.0 | 1.1.0 | - | -| [1.1.0](https://github.com/weaviate/weaviate/releases/tag/v1.1.0) | 2021-02-10 | 2.1.0 | '' | '' | - | -| [1.0.0](https://github.com/weaviate/weaviate/releases/tag/v1.0.0) | 2021-01-14 | 2.0.0 | '' | '' | - | - -Note: The TypeScript client replaced the JavaScript client on 2023-03-17. - -
diff --git a/_includes/code/client-libraries/migrate-ts3.ts b/_includes/code/client-libraries/migrate-ts3.ts index 62a5269d0f..b03978b8ea 100644 --- a/_includes/code/client-libraries/migrate-ts3.ts +++ b/_includes/code/client-libraries/migrate-ts3.ts @@ -1,5 +1,5 @@ // CompleteScript // Imports -import weaviate from 'weaviate-client'; +import weaviate, { WeaviateClient} from 'weaviate-client'; import 'dotenv/config'; // END CompleteScript // END Imports @@ -11,15 +11,16 @@ async function main() { // CompleteScript // CreateClient // connect to your Weaviate instance on WCD - const client = await weaviate.connectToWeaviateCloud( - process.env.WEAVIATE_URL || '', - { - authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_API_KEY || ''), - headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_API_KEY || '', - } + const weaviateURL = process.env.WEAVIATE_URL as string + const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string + const openaiKey = process.env.OPENAI_API_KEY as string + + const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), + headers: { + 'X-OpenAI-Api-Key': openaiKey, } - ) + }) // END CompleteScript // END CreateClient // CompleteScript // CreateCollection diff --git a/_includes/code/client-libraries/python_v4.py b/_includes/code/client-libraries/python_v4.py index fcdbabdddb..bcee7158b1 100644 --- a/_includes/code/client-libraries/python_v4.py +++ b/_includes/code/client-libraries/python_v4.py @@ -1,3 +1,5 @@ +import weaviate + # START WVCImportExample import weaviate.classes as wvc # END WVCImportExample @@ -5,15 +7,6 @@ import weaviate_datasets as wd import os -# InstantiationV3API -import weaviate - -client = weaviate.Client( - url="http://localhost:8080", -) -# END InstantiationV3API - - # TryFinallyExample import weaviate diff --git a/_includes/code/configuration/replication-consistency.mdx b/_includes/code/configuration/replication-consistency.mdx index 917c78c825..8209c4767a 100644 --- a/_includes/code/configuration/replication-consistency.mdx +++ b/_includes/code/configuration/replication-consistency.mdx @@ -22,7 +22,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl text={PyCodeV3} startMarker="# START AsyncRepair" endMarker="# END AsyncRepair" - language="py" + language="pyv3" /> @@ -40,7 +40,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl text={TSCodeLegacy} startMarker="// START AsyncRepair" endMarker="// END AsyncRepair" - language="ts" + language="tsv2" /> diff --git a/_includes/code/connections/connect-python-v3.py b/_includes/code/connections/connect-python-v3.py index ee16968786..62b8b5d2ed 100644 --- a/_includes/code/connections/connect-python-v3.py +++ b/_includes/code/connections/connect-python-v3.py @@ -1,5 +1,13 @@ # THIS FILE HASN'T BEEN TESTED TO RUN END-TO-END +# InstantiationV3API +import weaviate + +client = weaviate.Client( + url="http://localhost:8080", +) +# END InstantiationV3API + ##################### ### Cloud connect ### ##################### diff --git a/_includes/code/connections/connect-ts-v3.ts b/_includes/code/connections/connect-ts-v3.ts index 9bf5a6fecb..dbe0825dbd 100644 --- a/_includes/code/connections/connect-ts-v3.ts +++ b/_includes/code/connections/connect-ts-v3.ts @@ -9,12 +9,14 @@ // WEAVIATE_URL your WCD instance URL // WEAVIATE_API_KEY your WCD instance API key + import weaviate, { WeaviateClient } from 'weaviate-client'; -const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WEAVIATE_URL, - { - authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_API_KEY), +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), } ) // END APIKeyWCD @@ -30,10 +32,11 @@ const client: WeaviateClient = await weaviate.connectToWeaviateCloud( import weaviate, { WeaviateClient } from 'weaviate-client'; -const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WEAVIATE_URL, - { - authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_API_KEY), +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), timeout: { init: 30, query: 60, insert: 120 } // Values in seconds } ) @@ -63,8 +66,10 @@ console.log(client) import weaviate from 'weaviate-client' +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string + const client = await weaviate.connectToLocal( - { authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_API_KEY),} + { authCredentials: new weaviate.ApiKey(weaviateKey),} ) console.log(client) @@ -80,10 +85,12 @@ console.log(client) import weaviate from 'weaviate-client' +const cohereKey = process.env.COHERE_API_KEY as string + const client = await weaviate.connectToLocal( { headers: { - 'X-Cohere-Api-Key': process.env.COHERE_API_KEY || '', + 'X-Cohere-Api-Key': cohereKey, } } ) @@ -120,12 +127,14 @@ console.log(client) import weaviate, { WeaviateClient } from 'weaviate-client'; -const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WEAVIATE_URL, - { - authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_API_KEY), +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string +const cohereKey = process.env.COHERE_API_KEY as string + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), headers: { - 'X-Cohere-Api-Key': process.env.COHERE_API_KEY || '', + 'X-Cohere-Api-Key': cohereKey, } } ) @@ -143,6 +152,7 @@ const client: WeaviateClient = await weaviate.connectToWeaviateCloud( import weaviate, { WeaviateClient } from 'weaviate-client'; + const client = await weaviate.connectToCustom( { httpHost: process.env.WEAVIATE_URL, // URL only, no http prefix diff --git a/_includes/code/connections/oidc-connect.mdx b/_includes/code/connections/oidc-connect.mdx index e328836723..e0d64f3a08 100644 --- a/_includes/code/connections/oidc-connect.mdx +++ b/_includes/code/connections/oidc-connect.mdx @@ -23,7 +23,7 @@ import GoCode from '!!raw-loader!/_includes/code/connections/connect.go'; text={PyV3Code} startMarker="# START OIDCConnect" endMarker="# END OIDCConnect" - language="py" + language="pyv3" /> @@ -39,7 +39,7 @@ import GoCode from '!!raw-loader!/_includes/code/connections/connect.go'; text={TsV2Code} startMarker="// START OIDCConnect" endMarker="// END OIDCConnect" - language="js" + language="tsv2" /> diff --git a/_includes/code/core.client.palm.apikey.mdx b/_includes/code/core.client.palm.apikey.mdx index c262941e75..f610352aee 100644 --- a/_includes/code/core.client.palm.apikey.mdx +++ b/_includes/code/core.client.palm.apikey.mdx @@ -11,8 +11,8 @@ client = weaviate.Client( url = "https://WEAVIATE_INSTANCE_URL", # Replace WEAVIATE_INSTANCE_URL with the URL # highlight-start additional_headers = { - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", # Replace with your API key - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", # Replace with your API key + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", # Replace with your API key + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", # Replace with your API key } # highlight-end ) @@ -30,8 +30,8 @@ const client = weaviate.client({ // highlight-start // Replace with your API key headers: { - 'X-Google-Vertex-Api-Key': 'YOUR-VERTEX-API-KEY', // Replace with your API key - 'X-Google-Studio-Api-Key': 'YOUR-AI-STUDIO-API-KEY', // Replace with your API key + 'X-Goog-Vertex-Api-Key': 'YOUR-VERTEX-API-KEY', // Replace with your API key + 'X-Goog-Studio-Api-Key': 'YOUR-AI-STUDIO-API-KEY', // Replace with your API key }, // highlight-end }); @@ -57,8 +57,8 @@ func main() { // highlight-start // Replace with your API key Headers: map[string]string{ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", // Replace with your API key - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", // Replace with your API key + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", // Replace with your API key + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", // Replace with your API key } // highlight-end } @@ -85,8 +85,8 @@ public class App { // highlight-start Map headers = new HashMap() { { // Replace with your API key - put("X-Google-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); - put("X-Google-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); + put("X-Goog-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); + put("X-Goog-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); } }; // highlight-end diff --git a/_includes/code/embedded.instantiate.custom.mdx b/_includes/code/embedded.instantiate.custom.mdx index 87662112f9..c67f9cc1d4 100644 --- a/_includes/code/embedded.instantiate.custom.mdx +++ b/_includes/code/embedded.instantiate.custom.mdx @@ -20,7 +20,7 @@ import TsCodeV2CustomModules from '!!raw-loader!/_includes/code/install/embedded text={PyCodeV3} startMarker="# START CustomModules" endMarker="# END CustomModules" - language="py" + language="pyv3" /> @@ -28,7 +28,7 @@ import TsCodeV2CustomModules from '!!raw-loader!/_includes/code/install/embedded text={TsCodeV2CustomModules} startMarker="// START CustomModules" endMarker="// END CustomModules" - language="js" + language="tsv2" /> diff --git a/_includes/code/embedded.instantiate.mdx b/_includes/code/embedded.instantiate.mdx index 526cfddcef..44c532495e 100644 --- a/_includes/code/embedded.instantiate.mdx +++ b/_includes/code/embedded.instantiate.mdx @@ -19,7 +19,7 @@ import TsCodeV2 from '!!raw-loader!/_includes/code/install/embedded-v2.ts'; text={PyCodeV3} startMarker="# START SimpleInstance" endMarker="# END SimpleInstance" - language="py" + language="pyv3" /> @@ -27,7 +27,7 @@ import TsCodeV2 from '!!raw-loader!/_includes/code/install/embedded-v2.ts'; text={TsCodeV2} startMarker="// START SimpleInstance" endMarker="// END SimpleInstance" - language="js" + language="tsv2" /> diff --git a/_includes/code/embedded.instantiate.module.mdx b/_includes/code/embedded.instantiate.module.mdx index b9cb623510..ee7e307181 100644 --- a/_includes/code/embedded.instantiate.module.mdx +++ b/_includes/code/embedded.instantiate.module.mdx @@ -20,7 +20,7 @@ import TsCodeV2CustomModules from '!!raw-loader!/_includes/code/install/embedded text={PyCodeV3} startMarker="# START CustomModules" endMarker="# END CustomModules" - language="py" + language="pyv3" /> @@ -28,7 +28,7 @@ import TsCodeV2CustomModules from '!!raw-loader!/_includes/code/install/embedded text={TsCodeV2CustomModules} startMarker="// START CustomModules" endMarker="// END CustomModules" - language="js" + language="tsv2" /> diff --git a/_includes/code/generative.groupedtask.examples.py b/_includes/code/generative.groupedtask.examples.py index 985347f7d1..7d7d314bad 100644 --- a/_includes/code/generative.groupedtask.examples.py +++ b/_includes/code/generative.groupedtask.examples.py @@ -16,8 +16,8 @@ "X-OpenAI-Api-Key": os.getenv("OPENAI_APIKEY"), # END GenerativeOpenAI # START GenerativeGoogle - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", # END GenerativeGoogle # START GenerativeHuggingface "X-HuggingFace-Api-Key": "YOUR_HUGGINGFACE_APIKEY", diff --git a/_includes/code/generative.palm.groupedresult.mdx b/_includes/code/generative.palm.groupedresult.mdx index 04f0daf21b..a318467fd2 100644 --- a/_includes/code/generative.palm.groupedresult.mdx +++ b/_includes/code/generative.palm.groupedresult.mdx @@ -20,8 +20,8 @@ import weaviate client = weaviate.Client( url = "https://WEAVIATE_INSTANCE_URL/", # Replace WEAVIATE_INSTANCE_URL with your instance URL additional_headers={ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", } ) @@ -97,8 +97,8 @@ func main() { Host: "WEAVIATE_INSTANCE_URL", // Replace with your instance URL Scheme: "https", Headers: map[string]string{ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", }, } client, err := weaviate.NewClient(cfg) @@ -150,8 +150,8 @@ import io.weaviate.client.v1.graphql.query.fields.Field; public class App { public static void main(String[] args) { Map headers = new HashMap() { { - put("X-Google-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); - put("X-Google-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); + put("X-Goog-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); + put("X-Goog-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); } }; Config config = new Config("https", "WEAVIATE_INSTANCE_URL", headers); // Replace with your instance URL @@ -253,8 +253,8 @@ echo '{ -X POST \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $WEAVIATE_API_KEY" \ - -H "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY" \ - -H "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY" \ + -H "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY" \ + -H "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY" \ -d @- \ https://WEAVIATE_INSTANCE_URL/v1/graphql # Replace WEAVIATE_INSTANCE_URL with your instance URL ``` diff --git a/_includes/code/generative.palm.singleresult.mdx b/_includes/code/generative.palm.singleresult.mdx index c3a285359f..0cc08592a5 100644 --- a/_includes/code/generative.palm.singleresult.mdx +++ b/_includes/code/generative.palm.singleresult.mdx @@ -20,8 +20,8 @@ import weaviate client = weaviate.Client( url = "https://WEAVIATE_INSTANCE_URL", # Replace WEAVIATE_INSTANCE_URL with the URL additional_headers={ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", } ) @@ -96,8 +96,8 @@ func main() { Host: "WEAVIATE_INSTANCE_URL", Scheme: "https", Headers: map[string]string{ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", }, } client, err := weaviate.NewClient(cfg) @@ -152,8 +152,8 @@ import io.weaviate.client.v1.graphql.query.fields.Field; public class App { public static void main(String[] args) { Map headers = new HashMap() { { - put("X-Google-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); - put("X-Google-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); + put("X-Goog-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); + put("X-Goog-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); } }; Config config = new Config("https", "WEAVIATE_INSTANCE_URL", headers); WeaviateClient client = new WeaviateClient(config); @@ -263,8 +263,8 @@ echo '{ -X POST \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $WEAVIATE_API_KEY" \ - -H "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY" \ - -H "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY" \ + -H "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY" \ + -H "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY" \ -d @- \ https://${WEAVIATE_INSTANCE_URL}/v1/graphql ``` diff --git a/_includes/code/generative.singleprompt.examples.py b/_includes/code/generative.singleprompt.examples.py index c4eb68f568..b443f818f5 100644 --- a/_includes/code/generative.singleprompt.examples.py +++ b/_includes/code/generative.singleprompt.examples.py @@ -16,8 +16,8 @@ "X-OpenAI-Api-Key": os.getenv("OPENAI_APIKEY"), # END GenerativeOpenAI # START GenerativeGoogle - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", # END GenerativeGoogle # START GenerativeHuggingface "X-HuggingFace-Api-Key": "YOUR_HUGGINGFACE_APIKEY", diff --git a/_includes/code/graphql.filters.nearText.palm.mdx b/_includes/code/graphql.filters.nearText.palm.mdx index 6a036463b3..aac309929a 100644 --- a/_includes/code/graphql.filters.nearText.palm.mdx +++ b/_includes/code/graphql.filters.nearText.palm.mdx @@ -20,8 +20,8 @@ import weaviate client = weaviate.Client( url="http://localhost:8080", additional_headers={ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", } ) @@ -100,8 +100,8 @@ func main() { Host: "localhost:8080", Scheme: "http", Headers: map[string]string{ - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", }, } client, err := weaviate.NewClient(cfg) @@ -170,8 +170,8 @@ import java.util.Map; public class App { public static void main(String[] args) { Map headers = new HashMap() { { - put("X-Google-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); - put("X-Google-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); + put("X-Goog-Vertex-Api-Key", "YOUR-VERTEX-API-KEY"); + put("X-Goog-Studio-Api-Key", "YOUR-AI-STUDIO-API-KEY"); } }; Config config = new Config("http", "localhost:8080", headers); WeaviateClient client = new WeaviateClient(config); @@ -249,8 +249,8 @@ echo '{ -X POST \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer learn-weaviate' \ - -H "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY" \ - -H "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY" \ + -H "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY" \ + -H "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY" \ -d @- \ https://edu-demo.weaviate.network/v1/graphql ``` diff --git a/_includes/code/graphql.filters.nearText.py b/_includes/code/graphql.filters.nearText.py index cb00221c9e..d635e09d99 100644 --- a/_includes/code/graphql.filters.nearText.py +++ b/_includes/code/graphql.filters.nearText.py @@ -17,8 +17,8 @@ "X-OpenAI-Api-Key": os.getenv("OPENAI_APIKEY"), # END NearTextOpenAI # START NearTextGoogle - "X-Google-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", - "X-Google-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", + "X-Goog-Vertex-Api-Key": "YOUR-VERTEX-API-KEY", + "X-Goog-Studio-Api-Key": "YOUR-AI-STUDIO-API-KEY", # END NearTextGoogle # START NearTextHuggingface "X-HuggingFace-Api-Key": "YOUR_HUGGINGFACE_APIKEY", diff --git a/_includes/code/graphql.get.beacon.mdx b/_includes/code/graphql.get.beacon.mdx index 928e461fc3..565fa45427 100644 --- a/_includes/code/graphql.get.beacon.mdx +++ b/_includes/code/graphql.get.beacon.mdx @@ -22,7 +22,7 @@ import PyCodeV3 from '!!raw-loader!/_includes/code/graphql.get.beacon.v3.py'; text={PyCodeV3} startMarker="# ===== PYTHON EXAMPLE =====" endMarker="# ===== END PYTHON EXAMPLE =====" - language="py" + language="pyv3" /> @@ -167,7 +167,7 @@ echo '{ text={PyCodeV3} startMarker="# ===== GRAPHQL EXAMPLE =====" endMarker="# ===== END GRAPHQL EXAMPLE =====" - language="py" + language="pyv3" /> diff --git a/_includes/code/graphql.get.multitenancy.mdx b/_includes/code/graphql.get.multitenancy.mdx index e3d31f535a..d1d1345441 100644 --- a/_includes/code/graphql.get.multitenancy.mdx +++ b/_includes/code/graphql.get.multitenancy.mdx @@ -22,7 +22,7 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.multi text={PyCodeV3} startMarker="# START Search" endMarker="# END Search" - language="py" + language="pyv3" /> @@ -31,7 +31,7 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.multi text={TSCode} startMarker="// START Search" endMarker="// END Search" - language="ts" + language="tsv2" /> diff --git a/_includes/code/graphql.get.simple.mdx b/_includes/code/graphql.get.simple.mdx index efe548a448..1a7c299339 100644 --- a/_includes/code/graphql.get.simple.mdx +++ b/_includes/code/graphql.get.simple.mdx @@ -20,7 +20,7 @@ import PyCodeV3 from '!!raw-loader!/_includes/code/graphql.get.simple.v3.py'; text={PyCodeV3} startMarker="# ===== PYTHON EXAMPLE =====" endMarker="# ===== END PYTHON EXAMPLE =====" - language="py" + language="pyv3" /> @@ -145,7 +145,7 @@ echo '{ text={PyCodeV3} startMarker="# ===== GRAPHQL EXAMPLE =====" endMarker="# ===== END GRAPHQL EXAMPLE =====" - language="py" + language="pyv3" /> diff --git a/_includes/code/howto/configure.backups.py b/_includes/code/howto/configure.backups.py index 50f1b0db4a..a2543ab6a0 100644 --- a/_includes/code/howto/configure.backups.py +++ b/_includes/code/howto/configure.backups.py @@ -92,9 +92,29 @@ # ===== Cancel ongoing backup ===== # ============================================== +# Note - this will fail in automated tests as the backup is already completed + +# Create the collections, whether they exist or not +client.collections.delete(["Article", "Publication"]) +articles = client.collections.create(name="Article") +publications = client.collections.create(name="Publication") + +articles.data.insert(properties={"title": "Dummy"}) +publications.data.insert(properties={"title": "Dummy"}) + +# Start a backup to cancel +result = client.backup.create( + backup_id="some-unwanted-backup", + backend="filesystem", + include_collections=["Article", "Publication"], + wait_for_completion=False, +) + +print(result) + # START CancelBackup result = client.backup.cancel( - backup_id="my-very-first-backup", + backup_id="some-unwanted-backup", backend="filesystem", ) diff --git a/_includes/code/howto/configure.backups.status.ts b/_includes/code/howto/configure.backups.status.ts index 0cbf9a5c2d..7508a3fb1d 100644 --- a/_includes/code/howto/configure.backups.status.ts +++ b/_includes/code/howto/configure.backups.status.ts @@ -24,3 +24,12 @@ let restoreStatus = await client.backup.getRestoreStatus({ console.log(restoreStatus); // END StatusRestoreBackup + +// START CancelBackup +let cancelStatus = await client.backup.cancel({ + backupId: 'my-very-first-backup', + backend: 'filesystem' +}) + +console.log(cancelStatus); +// END CancelBackup diff --git a/_includes/code/howto/go/docs/mainpkg/search-aggregation_test.go b/_includes/code/howto/go/docs/mainpkg/search-aggregation_test.go index bb1e3954b5..49a8ca957e 100644 --- a/_includes/code/howto/go/docs/mainpkg/search-aggregation_test.go +++ b/_includes/code/howto/go/docs/mainpkg/search-aggregation_test.go @@ -11,7 +11,6 @@ import ( "github.com/weaviate/weaviate-go-client/v4/weaviate/graphql" ) - // =============================== // ===== meta count EXAMPLES ===== // =============================== @@ -42,7 +41,7 @@ func TestMetaCount(t *testing.T) { assert.Contains(t, response.Data["Aggregate"], "JeopardyQuestion") assert.Len(t, response.Data["Aggregate"].(map[string]interface{})["JeopardyQuestion"].([]interface{}), 1) assert.Contains(t, response.Data["Aggregate"].(map[string]interface{})["JeopardyQuestion"].([]interface{})[0], "meta") - + meta := response.Data["Aggregate"].(map[string]interface{})["JeopardyQuestion"].([]interface{})[0].(map[string]interface{})["meta"].(map[string]interface{}) assert.Equal(t, float64(216930), meta["count"]) //or 10,000 if you are using the smaller dataset } @@ -101,7 +100,7 @@ func TestIntProp(t *testing.T) { Fields: []graphql.Field{ {Name: "count"}, {Name: "sum"}, - // highlight-end + // highlight-end }, }). Do(ctx) @@ -112,7 +111,7 @@ func TestIntProp(t *testing.T) { t.Logf("%s", jsonResponse) points := response.Data["Aggregate"].(map[string]interface{})["JeopardyQuestion"].([]interface{})[0].(map[string]interface{})["points"].(map[string]interface{}) - assert.Equal(t, float64(216930), points["count"]) //or 10,000 if you are using the smaller dataset + assert.Equal(t, float64(216930), points["count"]) //or 10,000 if you are using the smaller dataset assert.Equal(t, float64(141871083), points["sum"]) // or 6324100 if you are using the smaller dataset } @@ -209,7 +208,7 @@ func TestNearTextWithDistance(t *testing.T) { WithConcepts([]string{"animals in space"}). // highlight-start WithDistance(0.19)). - // highlight-end + // highlight-end WithFields(graphql.Field{ Name: "points", Fields: []graphql.Field{ @@ -227,6 +226,40 @@ func TestNearTextWithDistance(t *testing.T) { assert.Greater(t, points["sum"].(float64), float64(0)) } +// ========================================= +// ===== Hybrid EXAMPLES ===== +// ========================================= + +func TestHybridAggregate(t *testing.T) { + client := setupClient() + ctx := context.Background() + + // HybridExample + // Go client support coming soon + // END HybridExample + response, err := client.GraphQL().Aggregate(). + WithClassName("JeopardyQuestion"). + WithNearText(client.GraphQL().NearTextArgBuilder(). + WithConcepts([]string{"animals in space"})). + // highlight-start + WithObjectLimit(10). + // highlight-end + WithFields(graphql.Field{ + Name: "points", + Fields: []graphql.Field{ + {Name: "sum"}, + }, + }). + Do(ctx) + + require.NoError(t, err) + jsonResponse, _ := json.MarshalIndent(response, "", " ") + t.Logf("%s", jsonResponse) + + points := response.Data["Aggregate"].(map[string]interface{})["JeopardyQuestion"].([]interface{})[0].(map[string]interface{})["points"].(map[string]interface{}) + assert.Greater(t, points["sum"].(float64), float64(0)) +} + // ================================= // ===== where filter EXAMPLES ===== // ================================= @@ -236,8 +269,8 @@ func TestWhereFilter(t *testing.T) { ctx := context.Background() // START whereFilter - // Add this line to imports: "github.com/weaviate/weaviate-go-client/v4/weaviate/filters" - + // Add this line to imports: "github.com/weaviate/weaviate-go-client/v4/weaviate/filters" + response, err := client.GraphQL().Aggregate(). WithClassName("JeopardyQuestion"). // highlight-start diff --git a/_includes/code/howto/go/docs/model-providers/1-connect-weaviate-embeddings/main.go b/_includes/code/howto/go/docs/model-providers/1-connect-weaviate-embeddings/main.go new file mode 100644 index 0000000000..9c8aadcb28 --- /dev/null +++ b/_includes/code/howto/go/docs/model-providers/1-connect-weaviate-embeddings/main.go @@ -0,0 +1,43 @@ +// START-ANY +// Set these environment variables +// WCD_HOSTNAME your Weaviate instance hostname +// WCD_API_KEY your Weaviate instance API key + +package main + +import ( + "context" + "fmt" + "os" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate-go-client/v4/weaviate/auth" +) + +func main() { + cfg := weaviate.Config{ + Host: os.Getenv("WCD_W_EMB_HOSTNAME"), + Scheme: "https", + AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_W_EMB_API_KEY")}, + Headers: map[string]string{ + "X-Weaviate-Api-Key": os.Getenv("WCD_W_EMB_API_KEY"), + "X-Weaviate-Cluster-Url": fmt.Sprintf("https://%s", os.Getenv("WCD_W_EMB_HOSTNAME")), + }, + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // Work with Weaviate + // END-ANY + isReady, err := client.Misc().ReadyChecker().Do(context.Background()) + if err != nil { + panic(err) + } + fmt.Printf("%v", isReady) + // START-ANY +} + +// END-ANY diff --git a/_includes/code/howto/go/docs/model-providers/1-connect/main.go b/_includes/code/howto/go/docs/model-providers/1-connect/main.go new file mode 100644 index 0000000000..9ffea82a9c --- /dev/null +++ b/_includes/code/howto/go/docs/model-providers/1-connect/main.go @@ -0,0 +1,78 @@ +// START-ANY +// Set these environment variables +// WCD_HOSTNAME your Weaviate instance hostname, excluding the scheme (https://) +// WCD_API_KEY your Weaviate instance API key +// _APIKEY your model provider API key (or token) + +package main + +import ( + "context" + "fmt" + "os" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate-go-client/v4/weaviate/auth" +) + +func main() { + cfg := weaviate.Config{ + Host: os.Getenv("WCD_HOSTNAME"), + Scheme: "https", + AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")}, + // highlight-start + Headers: map[string]string{ + // END-ANY + // START AWSInstantiation + "X-AWS-Access-Key": os.Getenv("AWS_ACCESS_KEY"), + "X-AWS-Secret-Key": os.Getenv("AWS_SECRET_KEY"), + // END AWSInstantiation + // START CohereInstantiation + "X-Cohere-Api-Key": os.Getenv("COHERE_APIKEY"), + // END CohereInstantiation + // START DatabricksInstantiation + "X-Databricks-Token": os.Getenv("DATABRICKS_TOKEN"), + // END DatabricksInstantiation + // START GoogleInstantiation + "X-Goog-Vertex-Key": os.Getenv("VERTEX_APIKEY"), + "X-Goog-Studio-Key": os.Getenv("STUDIO_APIKEY"), + // END GoogleInstantiation + // START HuggingFaceInstantiation + "X-HuggingFace-Api-Key": os.Getenv("HUGGINGFACE_APIKEY"), + // END HuggingFaceInstantiation + // START JinaAIInstantiation + "X-JinaAI-Api-Key": os.Getenv("JINAAI_APIKEY"), + // END JinaAIInstantiation + // START MistralInstantiation + "X-Mistral-Api-Key": os.Getenv("MISTRAL_APIKEY"), + // END MistralInstantiation + // START OpenAIInstantiation + "X-OpenAI-Api-Key": os.Getenv("OPENAI_APIKEY"), + // END OpenAIInstantiation + // START AzureOpenAIInstantiation + "X-Azure-Api-Key": os.Getenv("AZURE_APIKEY"), + // END AzureOpenAIInstantiation + // START VoyageAIInstantiation + "X-VoyageAI-Api-Key": os.Getenv("VOYAGEAI_APIKEY"), + // END VoyageAIInstantiation + // START-ANY + }, + // highlight-end + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // Work with Weaviate + // END-ANY + isReady, err := client.Misc().ReadyChecker().Do(context.Background()) + if err != nil { + panic(err) + } + fmt.Printf("%v", isReady) + // START-ANY +} + +// END-ANY diff --git a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go new file mode 100644 index 0000000000..e44b327cff --- /dev/null +++ b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go @@ -0,0 +1,1087 @@ +// Set these environment variables +// WCD_HOSTNAME your Weaviate instance hostname +// WCD_API_KEY your Weaviate instance API key + +package main + +import ( + "context" + "fmt" + "net/http" + "os" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate-go-client/v4/weaviate/auth" + "github.com/weaviate/weaviate-go-client/v4/weaviate/fault" + "github.com/weaviate/weaviate-go-client/v4/weaviate/graphql" + "github.com/weaviate/weaviate/entities/models" +) + +// START-ANY +// package, imports not shown + +func main() { + // Instantiation not shown + + ctx := context.Background() + + // END-ANY + cfg := weaviate.Config{ + Host: os.Getenv("WCD_HOSTNAME"), + Scheme: "https", + AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")}, + Headers: map[string]string{ + "X-Cohere-Api-Key": os.Getenv("COHERE_APIKEY"), + }, + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerAWSBedrock + // highlight-start + // Define the collection + basicAWSBedrockVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-aws": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "region": "us-east-1", + "service": "bedrock", + "model": "cohere.embed-multilingual-v3", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicAWSBedrockVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerAWSBedrock + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerAWSSagemaker + // highlight-start + // Define the collection + basicAWSSagemakerVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-aws": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "region": "us-east-1", + "service": "sagemaker", + "endpoint": "", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicAWSSagemakerVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerAWSSagemaker + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerAWS + // highlight-start + // Define the collection + awsVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-aws": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "region": "us-east-1", + "service": "bedrock", // "bedrock" or "sagemaker" + "model": "cohere.embed-multilingual-v3", // If using `bedrock`, this is required + // "endpoint": "", // If using `sagemaker`, this is required + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(awsVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerAWS + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerCohere + // highlight-start + // Define the collection + basicCohereVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-cohere": map[string]interface{}{ + "sourceProperties": []string{"title"}, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicCohereVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerCohere + + // START VectorizerCohereCustomModel + // highlight-start + // Define the collection + cohereVectorizerWithModelDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-cohere": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "embed-multilingual-v3.0", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(cohereVectorizerWithModelDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END VectorizerCohereCustomModel + + // START FullVectorizerCohere + // highlight-start + // Define the collection + cohereVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-cohere": map[string]interface{}{ + "sourceProperties": []string{"title"}, + // "model": "embed-multilingual-v3.0", + // "truncate": "END", // "NONE", "START" or "END" + // "base_url": "", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(cohereVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerCohere + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerDatabricks + // highlight-start + // Define the collection + basicDatabricksVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-databricks": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "endpoint": "", // Required for Databricks + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicDatabricksVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerDatabricks + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerGoogleVertex + // highlight-start + // Define the collection + basicGoogleVertexVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-google": map[string]interface{}{ + "project_id": "", + "model_id": "textembedding-gecko@latest", // (Optional) To manually set the model ID + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicGoogleVertexVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerGoogleVertex + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerGoogleStudio + // highlight-start + // Define the collection + basicGoogleStudioVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-google": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model_id": "text-embedding-004", // (Optional) To manually set the model ID + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicGoogleStudioVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerGoogleStudio + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerGoogle + // highlight-start + // Define the collection + googleVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-aws": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "project_id": "", // Required for Vertex AU + "model_id": "textembedding-gecko@latest", // (Optional) To manually set the model ID + "api_endpoint": "", // (Optional) To manually set the API endpoint + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(googleVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerGoogle + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerHuggingFace + // highlight-start + // Define the collection + basicHuggingfaceVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-huggingface": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "sentence-transformers/all-MiniLM-L6-v2", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicHuggingfaceVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerHuggingFace + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerHuggingFace + // highlight-start + // Define the collection + fullHuggingfaceVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-huggingface": map[string]interface{}{ + "sourceProperties": []string{"title"}, + // Note: Use only one of (`model`), (`passage_model` and `query_model`), or (`endpoint_url`) + "model": "sentence-transformers/all-MiniLM-L6-v2", + // "passage_model": "sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base", // Required if using `query_model` + // "query_model": "sentence-transformers/facebook-dpr-question_encoder-single-nq-base", // Required if using `passage_model` + // "endpoint_url": "", + // // Optional parameters + // "wait_for_model": true, + // "use_cache": true, + // "use_gpu": true, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(fullHuggingfaceVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerHuggingFace + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerJinaAI + // highlight-start + // Define the collection + basicJinaVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-jinaai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicJinaVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerJinaAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START VectorizerJinaCustomModel + // highlight-start + // Define the collection + jinaVectorizerWithModelDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-jinaai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "jina-embeddings-v3", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(jinaVectorizerWithModelDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END VectorizerJinaCustomModel + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerJinaAI + // highlight-start + // Define the collection + jinaVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-jinaai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "jina-embeddings-v3", + "dimensions": 512, // e.g. 1024, 512, 256 (only applicable for some models) + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(jinaVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerJinaAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerMistral + // highlight-start + // Define the collection + basicMistralVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-mistral": map[string]interface{}{ + "sourceProperties": []string{"title"}, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicMistralVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerMistral + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerMistral + // highlight-start + // Define the collection + mistralVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-mistral": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "mistral-embed", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(mistralVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerMistral + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerOpenAI + // highlight-start + // Define the collection + basicOpenAIVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-openai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicOpenAIVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerOpenAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START VectorizerOpenAICustomModelV3 + // highlight-start + // Define the collection + openAIVectorizerWithModelDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-openai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "text-embedding-3-large", + "dimensions": 1024, // Optional (e.g. 1024, 512, 256) + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(openAIVectorizerWithModelDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END VectorizerOpenAICustomModelV3 + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START VectorizerOpenAICustomModelLegacy + // highlight-start + // Define the collection + openAIVectorizerWithLegacyModelDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-openai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "ada", + "model_version": "002", + "type": "text", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(openAIVectorizerWithLegacyModelDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END VectorizerOpenAICustomModelLegacy + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerOpenAI + // highlight-start + // Define the collection + openAIVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-openai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "text-embedding-3-large", + "dimensions": 1024, // Parameter only applicable for `v3` model family and newer + "model_version": "002", // Parameter only applicable for `ada` model family and older + "type": "text", // Parameter only applicable for `ada` model family and older + "base_url": "", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(openAIVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerOpenAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerAzureOpenAI + // highlight-start + // Define the collection + basicAzureVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-openai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "resourceName": "", + "deploymentID": "", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicAzureVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerAzureOpenAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerAzureOpenAI + // highlight-start + // Define the collection + azureVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-openai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "resourceName": "", + "deploymentID": "", + // "baseURL": "", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(azureVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerAzureOpenAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START BasicVectorizerVoyageAI + // highlight-start + // Define the collection + basicVoyageVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-voyageai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicVoyageVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerVoyageAI + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START VectorizerVoyageAICustomModel + // highlight-start + // Define the collection + voyageVectorizerWithModelDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-voyageai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + "model": "voyage-3-lite", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(voyageVectorizerWithModelDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END VectorizerVoyageAICustomModel + + // Clean slate: Delete the collection + if err := client.Schema().ClassDeleter().WithClassName("DemoCollection").Do(context.Background()); err != nil { + // Weaviate will return a 400 if the class does not exist, so this is allowed, only return an error if it's not a 400 + if status, ok := err.(*fault.WeaviateClientError); ok && status.StatusCode != http.StatusBadRequest { + panic(err) + } + } + + // START FullVectorizerVoyageAI + // highlight-start + // Define the collection + voyageVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-voyageai": map[string]interface{}{ + "sourceProperties": []string{"title"}, + // "model": "voyage-3-lite", + // "base_url": "", + // "truncate": true, + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(voyageVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerVoyageAI + + // START BasicVectorizerWeaviate + // highlight-start + // Define the collection + basicWeaviateVectorizerDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-weaviate": map[string]interface{}{}, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(basicWeaviateVectorizerDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END BasicVectorizerWeaviate + + // START VectorizerWeaviateCustomModel + // highlight-start + // Define the collection + weaviateVectorizerWithModelDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-weaviate": map[string]interface{}{ + "model": "arctic-embed-m-v1.5", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(weaviateVectorizerWithModelDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END VectorizerWeaviateCustomModel + + // START FullVectorizerWeaviate + // highlight-start + // Define the collection + weaviateVectorizerFullDef := &models.Class{ + Class: "DemoCollection", + VectorConfig: map[string]models.VectorConfig{ + "title_vector": { + Vectorizer: map[string]interface{}{ + "text2vec-weaviate": map[string]interface{}{ + "model": "arctic-embed-m-v1.5", + "dimensions": 256, // Or 756 + "base_url": "", + }, + }, + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(weaviateVectorizerFullDef).Do(ctx) + if err != nil { + panic(err) + } + // highlight-end + // END FullVectorizerWeaviate + + // START BatchImportExample + var sourceObjects = []map[string]string{ + // Objects not shown + // END BatchImportExample + {"title": "The Shawshank Redemption", "description": "Prison drama about hope"}, + {"title": "The Godfather", "description": "Mafia family epic"}, + {"title": "The Dark Knight", "description": "Batman vs Joker thriller"}, + {"title": "Jingle All the Way", "description": "Holiday shopping adventure"}, + {"title": "A Christmas Carol", "description": "Ghost story of redemption"}, + // START BatchImportExample + } + + // highlight-start + // Convert items into a slice of models.Object + objects := []models.PropertySchema{} + for i := range sourceObjects { + objects = append(objects, map[string]interface{}{ + // Populate the object with the data + // END BatchImportExample + "title": sourceObjects[i]["title"], + "description": sourceObjects[i]["description"], + // START BatchImportExample + }) + } + + // Batch write items + batcher := client.Batch().ObjectsBatcher() + for _, dataObj := range objects { + batcher.WithObjects(&models.Object{ + Class: "DemoCollection", + Properties: dataObj, + }) + } + + // Flush + batchRes, err := batcher.Do(ctx) + + // Error handling + if err != nil { + panic(err) + } + for _, res := range batchRes { + if res.Result.Errors != nil { + for _, err := range res.Result.Errors.Error { + if err != nil { + fmt.Printf("Error details: %v\n", *err) + panic(err.Message) + } + } + } + } + // highlight-end + // END BatchImportExample + + // START NearTextExample + // highlight-start + nearTextResponse, err := client.GraphQL().Get(). + WithClassName("DemoCollection"). + WithFields( + graphql.Field{Name: "title"}, + ). + WithNearText(client.GraphQL().NearTextArgBuilder(). + WithConcepts([]string{"A holiday film"})). + WithLimit(2). + Do(ctx) + // highlight-end + + if err != nil { + panic(err) + } + fmt.Printf("%v", nearTextResponse) + // END NearTextExample + + // START HybridExample + // highlight-start + hybridResponse, err := client.GraphQL().Get(). + WithClassName("DemoCollection"). + WithFields( + graphql.Field{Name: "title"}, + ). + WithHybrid(client.GraphQL().HybridArgumentBuilder(). + WithQuery("A holiday film")). + WithLimit(2). + Do(ctx) + // highlight-end + + if err != nil { + panic(err) + } + fmt.Printf("%v", hybridResponse) + // END HybridExample + + // START-ANY +} + +// END-ANY diff --git a/_includes/code/howto/go/docs/quickstart/1_is_ready/main.go b/_includes/code/howto/go/docs/quickstart/1_is_ready/main.go index 92f81c7cc1..17a66b8701 100644 --- a/_includes/code/howto/go/docs/quickstart/1_is_ready/main.go +++ b/_includes/code/howto/go/docs/quickstart/1_is_ready/main.go @@ -15,6 +15,7 @@ import ( ) func main() { + // highlight-start cfg := weaviate.Config{ Host: os.Getenv("WCD_HOSTNAME"), Scheme: "https", @@ -22,6 +23,7 @@ func main() { } client, err := weaviate.NewClient(cfg) + // highlight-end if err != nil { fmt.Println(err) } diff --git a/_includes/code/howto/go/docs/quickstart/2_1_create_collection/main.go b/_includes/code/howto/go/docs/quickstart/2_1_create_collection/main.go index e7802f46a7..a7e50e17ab 100644 --- a/_includes/code/howto/go/docs/quickstart/2_1_create_collection/main.go +++ b/_includes/code/howto/go/docs/quickstart/2_1_create_collection/main.go @@ -2,7 +2,7 @@ // Set these environment variables // WCD_HOSTNAME your Weaviate instance hostname // WCD_API_KEY your Weaviate instance API key -// OPENAI_API_KEY your OpenAI API key +// COHERE_APIKEY your Cohere API key package main @@ -32,10 +32,10 @@ func main() { // Define the collection classObj := &models.Class{ Class: "Question", - Vectorizer: "text2vec-openai", + Vectorizer: "text2vec-cohere", ModuleConfig: map[string]interface{}{ - "text2vec-openai": map[string]interface{}{}, - "generative-openai": map[string]interface{}{}, + "text2vec-cohere": map[string]interface{}{}, + "generative-cohere": map[string]interface{}{}, }, } diff --git a/_includes/code/howto/go/docs/quickstart/2_2_add_objects/main.go b/_includes/code/howto/go/docs/quickstart/2_2_add_objects/main.go index 625b33a0f4..c410fc87e0 100644 --- a/_includes/code/howto/go/docs/quickstart/2_2_add_objects/main.go +++ b/_includes/code/howto/go/docs/quickstart/2_2_add_objects/main.go @@ -2,7 +2,7 @@ // Set these environment variables // WCD_HOSTNAME your Weaviate instance hostname // WCD_API_KEY your Weaviate instance API key -// OPENAI_API_KEY your OpenAI API key +// COHERE_APIKEY your Cohere API key package main @@ -25,7 +25,7 @@ func main() { AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")}, // highlight-start Headers: map[string]string{ - "X-OpenAI-Api-Key": os.Getenv("OPENAI_API_KEY"), + "X-Cohere-Api-Key": os.Getenv("COHERE_APIKEY"), }, // highlight-end } diff --git a/_includes/code/howto/go/docs/quickstart/3_1_neartext/main.go b/_includes/code/howto/go/docs/quickstart/3_1_neartext/main.go index 7cc9e62d7d..8bee24389d 100644 --- a/_includes/code/howto/go/docs/quickstart/3_1_neartext/main.go +++ b/_includes/code/howto/go/docs/quickstart/3_1_neartext/main.go @@ -2,7 +2,7 @@ // Set these environment variables // WCD_HOSTNAME your Weaviate instance hostname // WCD_API_KEY your Weaviate instance API key -// OPENAI_API_KEY your OpenAI API key +// COHERE_APIKEY your Cohere API key package main @@ -23,7 +23,7 @@ func main() { AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")}, // highlight-start Headers: map[string]string{ - "X-OpenAI-Api-Key": os.Getenv("OPENAI_API_KEY"), + "X-Cohere-Api-Key": os.Getenv("COHERE_APIKEY"), }, // highlight-end } diff --git a/_includes/code/howto/go/docs/quickstart/3_2_rag/main.go b/_includes/code/howto/go/docs/quickstart/3_2_rag/main.go index ccd73bd07a..5846172c05 100644 --- a/_includes/code/howto/go/docs/quickstart/3_2_rag/main.go +++ b/_includes/code/howto/go/docs/quickstart/3_2_rag/main.go @@ -2,7 +2,7 @@ // Set these environment variables // WCD_HOSTNAME your Weaviate instance hostname // WCD_API_KEY your Weaviate instance API key -// OPENAI_API_KEY your OpenAI API key +// COHERE_APIKEY your Cohere API key package main @@ -23,7 +23,7 @@ func main() { AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")}, // highlight-start Headers: map[string]string{ - "X-OpenAI-Api-Key": os.Getenv("OPENAI_API_KEY"), + "X-Cohere-Api-Key": os.Getenv("COHERE_APIKEY"), }, // highlight-end } diff --git a/_includes/code/howto/go/docs/quickstart_local/1_is_ready/main.go b/_includes/code/howto/go/docs/quickstart_local/1_is_ready/main.go new file mode 100644 index 0000000000..c6dee0df9d --- /dev/null +++ b/_includes/code/howto/go/docs/quickstart_local/1_is_ready/main.go @@ -0,0 +1,32 @@ +// START InstantiationExample +package main + +import ( + "context" + "fmt" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" +) + +func main() { + // highlight-start + cfg := weaviate.Config{ + Host: "localhost:8080", + Scheme: "http", + } + + client, err := weaviate.NewClient(cfg) + // highlight-end + if err != nil { + fmt.Println(err) + } + + // Check the connection + ready, err := client.Misc().ReadyChecker().Do(context.Background()) + if err != nil { + panic(err) + } + fmt.Printf("%v", ready) +} + +// END InstantiationExample diff --git a/_includes/code/howto/go/docs/quickstart_local/2_1_create_collection/main.go b/_includes/code/howto/go/docs/quickstart_local/2_1_create_collection/main.go new file mode 100644 index 0000000000..bf8f064c7e --- /dev/null +++ b/_includes/code/howto/go/docs/quickstart_local/2_1_create_collection/main.go @@ -0,0 +1,48 @@ +// START CreateCollection +package main + +import ( + "context" + "fmt" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate/entities/models" +) + +func main() { + cfg := weaviate.Config{ + Host: "localhost:8080", + Scheme: "http", + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // highlight-start + // Define the collection + classObj := &models.Class{ + Class: "Question", + Vectorizer: "text2vec-ollama", + ModuleConfig: map[string]interface{}{ + "text2vec-ollama": map[string]interface{}{ // Configure the Ollama embedding integration + "apiEndpoint": "http://host.docker.internal:11434", // Allow Weaviate from within a Docker container to contact your Ollama instance + "model": "nomic-embed-text", // The model to use + }, + "generative-ollama": map[string]interface{}{ // Configure the Ollama generative integration + "apiEndpoint": "http://host.docker.internal:11434", // Allow Weaviate from within a Docker container to contact your Ollama instance + "model": "llama3.2", // The model to use + }, + }, + } + + // add the collection + err = client.Schema().ClassCreator().WithClass(classObj).Do(context.Background()) + if err != nil { + panic(err) + } + // highlight-end +} + +// END CreateCollection diff --git a/_includes/code/howto/go/docs/quickstart_local/2_2_add_objects/main.go b/_includes/code/howto/go/docs/quickstart_local/2_2_add_objects/main.go new file mode 100644 index 0000000000..6f3510605e --- /dev/null +++ b/_includes/code/howto/go/docs/quickstart_local/2_2_add_objects/main.go @@ -0,0 +1,65 @@ +// Import +package main + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate/entities/models" +) + +func main() { + cfg := weaviate.Config{ + Host: "localhost:8080", + Scheme: "http", + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // Retrieve the data + data, err := http.DefaultClient.Get("https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json") + if err != nil { + panic(err) + } + defer data.Body.Close() + + // Decode the data + var items []map[string]string + if err := json.NewDecoder(data.Body).Decode(&items); err != nil { + panic(err) + } + + // highlight-start + // convert items into a slice of models.Object + objects := make([]*models.Object, len(items)) + for i := range items { + objects[i] = &models.Object{ + Class: "Question", + Properties: map[string]any{ + "category": items[i]["Category"], + "question": items[i]["Question"], + "answer": items[i]["Answer"], + }, + } + } + + // batch write items + batchRes, err := client.Batch().ObjectsBatcher().WithObjects(objects...).Do(context.Background()) + if err != nil { + panic(err) + } + for _, res := range batchRes { + if res.Result.Errors != nil { + panic(res.Result.Errors.Error) + } + } + // highlight-end +} + +// END Import diff --git a/_includes/code/howto/go/docs/quickstart_local/3_1_neartext/main.go b/_includes/code/howto/go/docs/quickstart_local/3_1_neartext/main.go new file mode 100644 index 0000000000..fdd18d0809 --- /dev/null +++ b/_includes/code/howto/go/docs/quickstart_local/3_1_neartext/main.go @@ -0,0 +1,45 @@ +// NearText +package main + +import ( + "context" + "fmt" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate-go-client/v4/weaviate/graphql" +) + +func main() { + cfg := weaviate.Config{ + Host: "localhost:8080", + Scheme: "http", + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // highlight-start + ctx := context.Background() + + response, err := client.GraphQL().Get(). + WithClassName("Question"). + WithFields( + graphql.Field{Name: "question"}, + graphql.Field{Name: "answer"}, + graphql.Field{Name: "category"}, + ). + WithNearText(client.GraphQL().NearTextArgBuilder(). + WithConcepts([]string{"biology"})). + WithLimit(2). + Do(ctx) + // highlight-end + + if err != nil { + panic(err) + } + fmt.Printf("%v", response) +} + +// END NearText diff --git a/_includes/code/howto/go/docs/quickstart_local/3_2_rag/main.go b/_includes/code/howto/go/docs/quickstart_local/3_2_rag/main.go new file mode 100644 index 0000000000..6bf7aee1f9 --- /dev/null +++ b/_includes/code/howto/go/docs/quickstart_local/3_2_rag/main.go @@ -0,0 +1,50 @@ +// RAG +package main + +import ( + "context" + "fmt" + + "github.com/weaviate/weaviate-go-client/v4/weaviate" + "github.com/weaviate/weaviate-go-client/v4/weaviate/graphql" +) + +func main() { + cfg := weaviate.Config{ + Host: "localhost:8080", + Scheme: "http", + } + + client, err := weaviate.NewClient(cfg) + if err != nil { + fmt.Println(err) + } + + // highlight-start + ctx := context.Background() + + generatePrompt := "Write a tweet with emojis about these facts." + + gs := graphql.NewGenerativeSearch().GroupedResult(generatePrompt) + + response, err := client.GraphQL().Get(). + WithClassName("Question"). + WithFields( + graphql.Field{Name: "question"}, + graphql.Field{Name: "answer"}, + graphql.Field{Name: "category"}, + ). + WithGenerativeSearch(gs). + WithNearText(client.GraphQL().NearTextArgBuilder(). + WithConcepts([]string{"biology"})). + WithLimit(2). + Do(ctx) + // highlight-end + + if err != nil { + panic(err) + } + fmt.Printf("%v", response) +} + +// END RAG diff --git a/_includes/code/howto/java/pom.xml b/_includes/code/howto/java/pom.xml index e6f6ffee93..a58f5dd6d0 100644 --- a/_includes/code/howto/java/pom.xml +++ b/_includes/code/howto/java/pom.xml @@ -37,6 +37,11 @@ ${weaviate.client.version} test + + org.json + json + 20240303 + org.junit.jupiter junit-jupiter-api diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/manage-data.classes.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/manage-data.classes.java index 4a436d9284..f478ec33f3 100644 --- a/_includes/code/howto/java/src/test/java/io/weaviate/docs/manage-data.classes.java +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/manage-data.classes.java @@ -171,7 +171,7 @@ private void createCollectionWithNamedVectors(String className) { Map text2vecCohere = new HashMap<>(); Map text2vecCohereSettings = new HashMap<>(); text2vecCohereSettings.put("properties", new String[]{ "body" }); - text2vecCohere.put("text2vec_cohere", text2vecCohereSettings); + text2vecCohere.put("text2vec-cohere", text2vecCohereSettings); //Define the vector configurations Map vectorConfig = new HashMap<>(); diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/Connect.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/Connect.java new file mode 100644 index 0000000000..41de8e4815 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/Connect.java @@ -0,0 +1,51 @@ +package io.weaviate.docs.model_providers; + +// START-ANY +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; + +// END-ANY + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +// START-ANY +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key +// _APIKEY Your model provider API key + +public class Connect { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + String cohereKey = System.getenv("COHERE_APIKEY"); + + // highlight-start + Map headers = new HashMap() { { + // END-ANY + // START CohereInstantiation + put("X-Cohere-Api-Key", cohereKey); + // END CohereInstantiation + // START-ANY + } }; + + Config config = new Config("https", host, headers); + // highlight-end + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // check the result + Result result = client.misc().readyChecker().run(); + System.out.println(result.getResult()); + // END-ANY + + assertThat(result.getResult()).isTrue(); + // START-ANY + } +} +// END-ANY diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ConnectWeaviateEmbeddings.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ConnectWeaviateEmbeddings.java new file mode 100644 index 0000000000..e6f5721266 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ConnectWeaviateEmbeddings.java @@ -0,0 +1,43 @@ +package io.weaviate.docs.model_providers; + +// START-ANY + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; + +import static org.assertj.core.api.Assertions.assertThat; + +// START-ANY +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key + +public class ConnectWeaviateEmbeddings { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_W_EMB_HOSTNAME"); + String apiKey = System.getenv("WCD_W_EMB_API_KEY"); + + // highlight-start + Map headers = new HashMap() { { + put("X-Weaviate-Api-Key", apiKey); + put("X-Weaviate-Cluster-Url", "https://" + System.getenv("WCD_W_EMB_HOSTNAME")); + } }; + + // highlight-start + Config config = new Config("https", host, headers); + // highlight-end + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // check the result + Result result = client.misc().readyChecker().run(); + System.out.println(result.getResult()); + + // END-ANY + assertThat(result.getResult()).isTrue(); + // START-ANY + } +} +// END-ANY diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ImportAndQueries.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ImportAndQueries.java new file mode 100644 index 0000000000..b36d8d2125 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ImportAndQueries.java @@ -0,0 +1,140 @@ +package io.weaviate.docs.model_providers; + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.batch.api.ObjectsBatcher; +import io.weaviate.client.v1.data.model.WeaviateObject; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; +import io.weaviate.client.v1.graphql.query.argument.HybridArgument; +import io.weaviate.client.v1.graphql.query.argument.NearTextArgument; +import io.weaviate.client.v1.graphql.query.builder.GetBuilder; +import io.weaviate.client.v1.graphql.query.fields.Field; +import io.weaviate.client.v1.graphql.query.fields.Fields; + +import java.util.*; + +public class ImportAndQueries { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + String cohereKey = System.getenv("COHERE_APIKEY"); + + Map headers = new HashMap() { + { + put("X-Cohere-Api-Key", cohereKey); + } + }; + + Config config = new Config("https", host, headers); + + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // Define source objects + List> sourceObjects = Arrays.asList( + new HashMap() {{ + put("title", "The Shawshank Redemption"); + put("description", ""); + }}, + new HashMap() {{ + put("title", "The Godfather"); + put("description", ""); + }}, + new HashMap() {{ + put("title", "The Dark Knight"); + put("description", ""); + }}, + new HashMap() {{ + put("title", "Jingle All the Way"); + put("description", ""); + }}, + new HashMap() {{ + put("title", "A Christmas Carol"); + put("description", ""); + }} + ); + + // START BatchImportExample + List> objects = new ArrayList<>(); + for (Map sourceObject : sourceObjects) { + HashMap schema = new HashMap<>(); + schema.put("title", sourceObject.get("title")); + schema.put("description", sourceObject.get("description")); + objects.add(schema); + } + + // Batch write items + ObjectsBatcher batcher = client.batch().objectsBatcher(); + for (Map properties : objects) { + batcher.withObject(WeaviateObject.builder() + .className("DemoCollection") + .properties(properties) + // .tenant("tenantA") // If multi-tenancy is enabled, specify the tenant to which the object will be added. + .build() + ); + } + + // Flush + batcher.run(); + // END BatchImportExample + + // START NearTextExample // START HybridExample + // highlight-start + Fields returnFields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("title").build(), + }) + .build(); + + // highlight-end + // START NearTextExample // END HybridExample + // highlight-start + NearTextArgument nearText = NearTextArgument.builder() + .concepts(new String[]{"A holiday film"}) + .build(); + + String nearTextQuery = GetBuilder.builder() + .className("DemoCollection") + .fields(returnFields) + .withNearTextFilter(nearText) + .limit(2) + .build() + .buildQuery(); + // highlight-end + + Result nearTextResult = client.graphQL().raw().withQuery(nearTextQuery).run(); + + if (nearTextResult.hasErrors()) { + System.err.println(nearTextResult.getError()); + } else { + System.out.println("Near Text Results: " + nearTextResult.getResult().getData()); + } + // END NearTextExample + + // START HybridExample + // highlight-start + HybridArgument hybrid = HybridArgument.builder() + .query("A holiday film") + .build(); + + String hybridQuery = GetBuilder.builder() + .className("DemoCollection") + .fields(returnFields) + .withHybridFilter(hybrid) + .limit(2) + .build() + .buildQuery(); + // highlight-end + + Result hybridResult = client.graphQL().raw().withQuery(hybridQuery).run(); + + if (hybridResult.hasErrors()) { + System.err.println(hybridResult.getError()); + } else { + System.out.println("Hybrid Results: " + hybridResult.getResult().getData()); + } + // END HybridExample + } +} diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageCohereTextEmbeddings.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageCohereTextEmbeddings.java new file mode 100644 index 0000000000..2c6a630966 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageCohereTextEmbeddings.java @@ -0,0 +1,65 @@ +package io.weaviate.docs.model_providers; + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.schema.model.WeaviateClass; + +import java.util.HashMap; +import java.util.Map; + +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key +// _APIKEY Your Provider API key + +public class UsageCohereTextEmbeddings { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + String cohereKey = System.getenv("COHERE_APIKEY"); + + Map headers = new HashMap() { + { + put("X-Cohere-Api-Key", cohereKey); + } + }; + + Config config = new Config("https", host, headers); + + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + client.schema().classDeleter().withClassName("DemoCollection").run(); + + // START BasicVectorizerCohere // START VectorizerCohereCustomModel // START FullVectorizerCohere + Map text2vecCohere = new HashMap<>(); + Map text2vecCohereSettings = new HashMap<>(); + + text2vecCohereSettings.put("properties", new String[]{"title"}); + // END BasicVectorizerCohere // START VectorizerCohereCustomModel // START FullVectorizerCohere + text2vecCohereSettings.put("model", new String[]{"embed-multilingual-light-v3.0"}); + // END BasicVectorizerCohere // END VectorizerCohereCustomModel // START FullVectorizerCohere + // text2vecCohereSettings.put("truncate", new String[]{"END"}); // "NONE", "START" or "END" + // text2vecCohereSettings.put("base_url", new String[]{""}); + // START BasicVectorizerCohere // START VectorizerCohereCustomModel // START FullVectorizerCohere + text2vecCohere.put("text2vec-cohere", text2vecCohereSettings); + + // Define the vector configurations + Map vectorConfig = new HashMap<>(); + vectorConfig.put("title_vector", WeaviateClass.VectorConfig.builder() + .vectorIndexType("hnsw") + .vectorizer(text2vecCohere) + .build()); + + // Create the collection "DemoCollection" + WeaviateClass clazz = WeaviateClass.builder() + .className("DemoCollection") + .vectorConfig(vectorConfig) + .build(); + + Result result = client.schema().classCreator().withClass(clazz).run(); + // END BasicVectorizerCohere // END VectorizerCohereCustomModel // END FullVectorizerCohere + } +} diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageWeaviateTextEmbeddings.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageWeaviateTextEmbeddings.java new file mode 100644 index 0000000000..4906884cbe --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageWeaviateTextEmbeddings.java @@ -0,0 +1,58 @@ +package io.weaviate.docs.model_providers; + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.schema.model.WeaviateClass; + +import java.util.HashMap; +import java.util.Map; + +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key +// _APIKEY Your Provider API key + +public class UsageWeaviateTextEmbeddings { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + + Config config = new Config("https", host); + + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + client.schema().classDeleter().withClassName("DemoCollection").run(); + + // START BasicVectorizerWeaviate // START VectorizerWeaviateCustomModel // START FullVectorizerWeaviate + Map text2vecWeaviate = new HashMap<>(); + Map text2vecWeaviateSettings = new HashMap<>(); + + text2vecWeaviateSettings.put("properties", new String[]{"title"}); + // END BasicVectorizerWeaviate // START VectorizerWeaviateCustomModel // START FullVectorizerWeaviate + text2vecWeaviateSettings.put("model", new String[]{"arctic-embed-m-v1.5"}); + // END BasicVectorizerWeaviate // END VectorizerWeaviateCustomModel // START FullVectorizerWeaviate + text2vecWeaviateSettings.put("dimensions", new Integer[]{768}); // 768, 256 + text2vecWeaviateSettings.put("base_url", new String[]{""}); + // START BasicVectorizerWeaviate // START VectorizerWeaviateCustomModel // START FullVectorizerWeaviate + text2vecWeaviate.put("text2vec-weaviate", text2vecWeaviateSettings); + + // Define the vector configurations + Map vectorConfig = new HashMap<>(); + vectorConfig.put("title_vector", WeaviateClass.VectorConfig.builder() + .vectorIndexType("hnsw") + .vectorizer(text2vecWeaviate) + .build()); + + // Create the collection "DemoCollection" + WeaviateClass clazz = WeaviateClass.builder() + .className("DemoCollection") + .vectorConfig(vectorConfig) + .build(); + + Result result = client.schema().classCreator().withClass(clazz).run(); + // END BasicVectorizerWeaviate // END VectorizerWeaviateCustomModel // END FullVectorizerWeaviate + } +} diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/CreateCollection.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/CreateCollection.java new file mode 100644 index 0000000000..1019f42cac --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/CreateCollection.java @@ -0,0 +1,54 @@ +package io.weaviate.docs.quickstart; + +// START CreateCollection + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.schema.model.WeaviateClass; + +import java.util.HashMap; +import java.util.Map; + +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key + +public class CreateCollection { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + + Config config = new Config("https", host); + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // END CreateCollection + client.schema().classDeleter().withClassName("Question").run(); + + // START CreateCollection + // highlight-start + Map text2vecCohereSettings = new HashMap<>(); + Map generativeCohereSettings = new HashMap<>(); + + Map moduleConfig = new HashMap<>(); + moduleConfig.put("text2vec-cohere", text2vecCohereSettings); + moduleConfig.put("generative-cohere", generativeCohereSettings); + + // Create the collection "Question" + WeaviateClass clazz = WeaviateClass.builder() + .className("Question") + .vectorizer("text2vec-cohere") + .moduleConfig(moduleConfig) + .build(); + // highlight-end + + // Review the response + Result result = client.schema().classCreator().withClass(clazz).run(); + System.out.println(result); + Result collectionDefinition = client.schema().classGetter().withClassName("Question").run(); + System.out.println(collectionDefinition.getResult()); + } +} +// END CreateCollection diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/Import.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/Import.java new file mode 100644 index 0000000000..62c5108702 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/Import.java @@ -0,0 +1,69 @@ +package io.weaviate.docs.quickstart; + +// START Import + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.v1.batch.api.ObjectsBatcher; +import io.weaviate.client.v1.data.model.WeaviateObject; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key +// COHERE_APIKEY Your Cohere API key + +public class Import { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + String cohereKey = System.getenv("COHERE_APIKEY"); + + // highlight-start + Map headers = new HashMap() { { + put("X-Cohere-Api-Key", cohereKey); + } }; + + Config config = new Config("https", host, headers); + // highlight-end + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // Get JSON data + URL url = new URL("https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json"); + String jsonData = new BufferedReader(new InputStreamReader(((HttpURLConnection) url.openConnection()).getInputStream())) + .lines().reduce("", String::concat); + + // highlight-start + // Create and execute batch + ObjectsBatcher batcher = client.batch().objectsBatcher(); + + new JSONArray(jsonData).forEach(item -> { + JSONObject json = (JSONObject) item; + HashMap properties = new HashMap<>(); + properties.put("category", json.getString("Category")); + properties.put("question", json.getString("Question")); + properties.put("answer", json.getString("Answer")); + + batcher.withObject(WeaviateObject.builder() + .className("Question") + .properties(properties) + .build()); + }); + + // Flush + batcher.run(); + // highlight-end + } +} +// END Import + diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/IsReady.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/IsReady.java new file mode 100644 index 0000000000..adcd3dafa7 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/IsReady.java @@ -0,0 +1,36 @@ +package io.weaviate.docs.quickstart; + +// START InstantiationExample +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.base.Result; + +// END InstantiationExample +import static org.assertj.core.api.Assertions.assertThat; + +// START InstantiationExample +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key + +public class IsReady { + public static void main(String[] args) throws Exception { + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + + // highlight-start + Config config = new Config("https", host); + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + // highlight-end + + // check the result + Result result = client.misc().readyChecker().run(); + System.out.println(result.getResult()); + + // END InstantiationExample + assertThat(result.getResult()).isTrue(); + // START InstantiationExample + } +} +// END InstantiationExample diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/NearText.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/NearText.java new file mode 100644 index 0000000000..c587dc874e --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/NearText.java @@ -0,0 +1,63 @@ +package io.weaviate.docs.quickstart; + +// START NearText +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; +import io.weaviate.client.v1.graphql.query.argument.NearTextArgument; +import io.weaviate.client.v1.graphql.query.builder.GetBuilder; +import io.weaviate.client.v1.graphql.query.fields.Field; +import io.weaviate.client.v1.graphql.query.fields.Fields; + +import java.util.HashMap; +import java.util.Map; + +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key +// COHERE_APIKEY Your Cohere API key + +public class NearText { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + String cohereKey = System.getenv("COHERE_APIKEY"); + + // highlight-start + Map headers = new HashMap() { { + put("X-Cohere-Api-Key", cohereKey); + } }; + + Config config = new Config("https", host, headers); + // highlight-end + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // highlight-start + NearTextArgument nearText = NearTextArgument.builder() + .concepts(new String[]{"biology"}) + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("Question") + .fields(fields) + .withNearTextFilter(nearText) + .limit(2) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // highlight-end + System.out.println(result.getResult()); + } +} +// END NearText diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/RAG.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/RAG.java new file mode 100644 index 0000000000..fc97656ba4 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/RAG.java @@ -0,0 +1,70 @@ +package io.weaviate.docs.quickstart; + +// START RAG + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateAuthClient; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; +import io.weaviate.client.v1.graphql.query.argument.NearTextArgument; +import io.weaviate.client.v1.graphql.query.builder.GetBuilder; +import io.weaviate.client.v1.graphql.query.fields.Field; +import io.weaviate.client.v1.graphql.query.fields.Fields; +import io.weaviate.client.v1.graphql.query.fields.GenerativeSearchBuilder; + +import java.util.HashMap; +import java.util.Map; + +// Set these environment variables +// WCD_HOSTNAME Your Weaviate instance hostname +// WCD_API_KEY Your Weaviate instance API key +// COHERE_APIKEY Your Cohere API key + +public class RAG { + public static void main(String[] args) throws Exception { + + String host = System.getenv("WCD_HOSTNAME"); + String apiKey = System.getenv("WCD_API_KEY"); + String cohereKey = System.getenv("COHERE_APIKEY"); + + // highlight-start + Map headers = new HashMap() { { + put("X-Cohere-Api-Key", cohereKey); + } }; + + Config config = new Config("https", host, headers); + // highlight-end + WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey); + + // highlight-start + NearTextArgument nearText = NearTextArgument.builder() + .concepts(new String[]{"biology"}) + .build(); + + GenerativeSearchBuilder ragQuery = GenerativeSearchBuilder.builder() + .groupedResultTask("Write a tweet with emojis about these facts.") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("Question") + .fields(fields) + .withNearTextFilter(nearText) + .withGenerativeSearch(ragQuery) + .limit(2) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // highlight-end + System.out.println(result.getResult()); + } +} +// END RAG diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/CreateCollection.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/CreateCollection.java new file mode 100644 index 0000000000..8df1c68a9a --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/CreateCollection.java @@ -0,0 +1,50 @@ +package io.weaviate.docs.quickstart_local; + +// START CreateCollection +import java.util.HashMap; +import java.util.Map; + +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.schema.model.WeaviateClass; + +public class CreateCollection { + public static void main(String[] args) { + Config config = new Config("http", "localhost:8080"); // Replace with your Weaviate endpoint + + WeaviateClient client = new WeaviateClient(config); + + // END CreateCollection + client.schema().classDeleter().withClassName("Question").run(); + + // START CreateCollection + // highlight-start + Map text2vecOllamaSettings = new HashMap<>(); + text2vecOllamaSettings.put("apiEndpoint", "http://host.docker.internal:11434"); // Allow Weaviate from within a Docker container to contact your Ollama instance + text2vecOllamaSettings.put("model", "nomic-embed-text"); // The model to use + + Map generativeOllamaSettings = new HashMap<>(); + generativeOllamaSettings.put("apiEndpoint", "http://host.docker.internal:11434"); // Allow Weaviate from within a Docker container to contact your Ollama instance + generativeOllamaSettings.put("model", "llama3.2"); // The model to use + + Map> moduleConfig = new HashMap<>(); + moduleConfig.put("text2vec-ollama", text2vecOllamaSettings); + moduleConfig.put("generative-ollama", generativeOllamaSettings); + + // Create the collection "Question" + WeaviateClass clazz = WeaviateClass.builder() + .className("Question") + .vectorizer("text2vec-ollama") + .moduleConfig(moduleConfig) + .build(); + // highlight-end + + // Review the response + Result result = client.schema().classCreator().withClass(clazz).run(); + System.out.println(result); + Result collectionDefinition = client.schema().classGetter().withClassName("Question").run(); + System.out.println(collectionDefinition.getResult()); + } +} +// END CreateCollection diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/Import.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/Import.java new file mode 100644 index 0000000000..083e63eec8 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/Import.java @@ -0,0 +1,51 @@ +package io.weaviate.docs.quickstart_local; + +// START Import +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.v1.data.model.WeaviateObject; +import io.weaviate.client.v1.batch.api.ObjectsBatcher; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; + +public class Import { + public static void main(String[] args) throws Exception { + Config config = new Config("http", "localhost:8080"); // Replace with your Weaviate endpoint + + WeaviateClient client = new WeaviateClient(config); + + // Get JSON data + URL url = new URL("https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json"); + String jsonData = new BufferedReader(new InputStreamReader(((HttpURLConnection) url.openConnection()).getInputStream())) + .lines().reduce("", String::concat); + + // highlight-start + // Create and execute batch + ObjectsBatcher batcher = client.batch().objectsBatcher(); + + new JSONArray(jsonData).forEach(item -> { + JSONObject json = (JSONObject) item; + HashMap properties = new HashMap<>(); + properties.put("category", json.getString("Category")); + properties.put("question", json.getString("Question")); + properties.put("answer", json.getString("Answer")); + + batcher.withObject(WeaviateObject.builder() + .className("Question") + .properties(properties) + .build()); + }); + + // Flush + batcher.run(); + // highlight-end + } +} +// END Import + diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/IsReady.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/IsReady.java new file mode 100644 index 0000000000..97bc9be64d --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/IsReady.java @@ -0,0 +1,28 @@ +package io.weaviate.docs.quickstart_local; + +// START InstantiationExample +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; + +// END InstantiationExample +import static org.assertj.core.api.Assertions.assertThat; + +// START InstantiationExample +public class IsReady { + public static void main(String[] args) { + // highlight-start + Config config = new Config("http", "localhost:8080"); + WeaviateClient client = new WeaviateClient(config); + // highlight-end + + // check the result + Result result = client.misc().readyChecker().run(); + System.out.println(result.getResult()); + + // END InstantiationExample + assertThat(result.getResult()).isTrue(); + // START InstantiationExample + } +} +// END InstantiationExample diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/NearText.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/NearText.java new file mode 100644 index 0000000000..69b42d0a5d --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/NearText.java @@ -0,0 +1,44 @@ +package io.weaviate.docs.quickstart_local; + +// START NearText +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; +import io.weaviate.client.v1.graphql.query.argument.NearTextArgument; +import io.weaviate.client.v1.graphql.query.builder.GetBuilder; +import io.weaviate.client.v1.graphql.query.fields.Field; +import io.weaviate.client.v1.graphql.query.fields.Fields; + +public class NearText { + public static void main(String[] args) { + Config config = new Config("http", "localhost:8080"); // Replace with your Weaviate endpoint + + WeaviateClient client = new WeaviateClient(config); + + // highlight-start + NearTextArgument nearText = NearTextArgument.builder() + .concepts(new String[]{"biology"}) + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("Question") + .fields(fields) + .withNearTextFilter(nearText) + .limit(2) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // highlight-end + System.out.println(result.getResult()); + } +} +// END NearText diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/RAG.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/RAG.java new file mode 100644 index 0000000000..cb039fc944 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/RAG.java @@ -0,0 +1,50 @@ +package io.weaviate.docs.quickstart_local; + +// START RAG +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; +import io.weaviate.client.v1.graphql.query.argument.NearTextArgument;; +import io.weaviate.client.v1.graphql.query.builder.GetBuilder; +import io.weaviate.client.v1.graphql.query.fields.GenerativeSearchBuilder; +import io.weaviate.client.v1.graphql.query.fields.Field; +import io.weaviate.client.v1.graphql.query.fields.Fields; + +public class RAG { + public static void main(String[] args) { + Config config = new Config("http", "localhost:8080"); // Replace with your Weaviate endpoint + + WeaviateClient client = new WeaviateClient(config); + + // highlight-start + NearTextArgument nearText = NearTextArgument.builder() + .concepts(new String[]{"biology"}) + .build(); + + GenerativeSearchBuilder ragQuery = GenerativeSearchBuilder.builder() + .groupedResultTask("Write a tweet with emojis about these facts.") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("Question") + .fields(fields) + .withNearTextFilter(nearText) + .withGenerativeSearch(ragQuery) + .limit(2) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // highlight-end + System.out.println(result.getResult()); + } +} +// END RAG diff --git a/_includes/code/howto/java/src/test/java/io/weaviate/docs/search/KeywordSearchTest.java b/_includes/code/howto/java/src/test/java/io/weaviate/docs/search/KeywordSearchTest.java new file mode 100644 index 0000000000..4ae47c1082 --- /dev/null +++ b/_includes/code/howto/java/src/test/java/io/weaviate/docs/search/KeywordSearchTest.java @@ -0,0 +1,374 @@ +package io.weaviate.docs.search; + +import com.google.gson.GsonBuilder; +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.filters.Operator; +import io.weaviate.client.v1.filters.WhereFilter; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; +import io.weaviate.client.v1.graphql.query.argument.Bm25Argument; +import io.weaviate.client.v1.graphql.query.argument.GroupByArgument; +import io.weaviate.client.v1.graphql.query.argument.WhereArgument; +import io.weaviate.client.v1.graphql.query.builder.GetBuilder; +import io.weaviate.client.v1.graphql.query.fields.Field; +import io.weaviate.client.v1.graphql.query.fields.Fields; +import io.weaviate.client.v1.schema.model.DataType; +import io.weaviate.client.v1.schema.model.Property; +import io.weaviate.client.v1.schema.model.Tokenization; +import io.weaviate.client.v1.schema.model.WeaviateClass; +import io.weaviate.docs.helper.EnvHelper; +import java.util.Arrays; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +@Tag("crud") +@Tag("keyword-search") +public class KeywordSearchTest { + + private static WeaviateClient client; + + @BeforeAll + public static void beforeAll() { + String scheme = EnvHelper.scheme("http"); + String host = EnvHelper.host("localhost"); + String port = EnvHelper.port("8080"); + + Config config = new Config(scheme, host + ":" + port); + client = new WeaviateClient(config); + + Result result = client.schema().allDeleter().run(); + assertThat(result).isNotNull() + .withFailMessage(() -> result.getError().toString()) + .returns(false, Result::hasErrors) + .withFailMessage(null) + .returns(true, Result::getResult); + } + + @Test + public void shouldPerformBasicSearch() { + String className = "JeopardyQuestion"; + searchWithBM25(className); + searchWithBM25Score(className); + searchWithBM25OnSelectedProperties(className); + searchWithBM25WithWeights(className); + setTokenization(className); + searchWithBM25LimitOffset(className); + searchWithBM25LimitResultGroups(className); + searchWithBM25GroupResult(className); + searchWithBM25Filter(className); + } + + private void searchWithBM25(String className) { + // START Basic + Bm25Argument keyword = Bm25Argument.builder() + .query("food") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .limit(3) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END Basic + + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void searchWithBM25Score(String className) { + // START Score + Bm25Argument keyword = Bm25Argument.builder() + .query("food") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + Field.builder().name("_additional").fields(new Field[]{ + Field.builder().name("score").build() + }).build() + }) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .limit(3) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END Score + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void searchWithBM25OnSelectedProperties(String className) { + // START Properties + Bm25Argument keyword = Bm25Argument.builder() + .query("food") + .properties(new String[]{ "question" }) + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + Field.builder().name("_additional").fields(new Field[]{ + Field.builder().name("score").build() + }).build() + }) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .limit(3) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END Properties + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void searchWithBM25WithWeights(String className) { + // START Boost + Bm25Argument keyword = Bm25Argument.builder() + .query("food") + .properties(new String[]{ "question^2", "answer" }) + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + Field.builder().name("_additional").fields(new Field[]{ + Field.builder().name("score").build() + }).build() + }) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .limit(3) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END Boost + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void setTokenization(String className) { + // START PropModuleSettings + Property titleProperty = Property.builder() + .name("title") + .description("title of the article") + .dataType(Arrays.asList(DataType.TEXT)) + .tokenization(Tokenization.LOWERCASE) + .build(); + + Property bodyProperty = Property.builder() + .name("body") + .description("body of the article") + .dataType(Arrays.asList(DataType.TEXT)) + .tokenization(Tokenization.WHITESPACE) + .build(); + + //Add the defined properties to the class + WeaviateClass articleClass = WeaviateClass.builder() + .className("Article") + .description("Article Class Description...") + .properties(Arrays.asList(titleProperty, bodyProperty)) + .build(); + + Result result = client.schema().classCreator() + .withClass(articleClass) + .run(); + // END PropModuleSettings + } + + private void searchWithBM25LimitOffset(String className) { + // START limit + Bm25Argument keyword = Bm25Argument.builder() + .query("safety") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .limit(3) + .offset(1) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END limit + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void searchWithBM25LimitResultGroups(String className) { + // START autocut + Bm25Argument keyword = Bm25Argument.builder() + .query("safety") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + }) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .autocut(1) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END autocut + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void searchWithBM25GroupResult(String className) { + // START BM25GroupBy + Bm25Argument keyword = Bm25Argument.builder() + .query("California") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("round").build() + }) + .build(); + + GroupByArgument groupBy = GroupByArgument.builder() + .path(new String[]{ "round" }) + .groups(1) + .objectsPerGroup(3) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .withGroupByArgument(groupBy) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END BM25GroupBy + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + } + + private void searchWithBM25Filter(String className) { + // START Filter + Bm25Argument keyword = Bm25Argument.builder() + .query("food") + .build(); + + Fields fields = Fields.builder() + .fields(new Field[]{ + Field.builder().name("question").build(), + Field.builder().name("answer").build(), + Field.builder().name("round").build(), + Field.builder().name("_additional").fields(new Field[]{ + Field.builder().name("score").build() + }).build() + }) + .build(); + + WhereFilter whereFilter = WhereFilter.builder() + .path(new String[]{ "round" }) // Path to filter by + .operator(Operator.Equal) + .valueText("Double Jeopardy!") + .build(); + + WhereArgument whereArgument = WhereArgument.builder() + .filter(whereFilter) + .build(); + + String query = GetBuilder.builder() + .className("JeopardyQuestion") + .fields(fields) + .withBm25Filter(keyword) + .withWhereFilter(whereArgument) + .limit(3) + .build() + .buildQuery(); + + Result result = client.graphQL().raw().withQuery(query).run(); + // END Filter + if (result.getError() != null) { + System.out.printf("Error inserting object: %s\n", result.getError().getMessages()); + } else { + String json = new GsonBuilder().setPrettyPrinting().create().toJson(result.getResult()); + System.out.println("The result is: " + json); + } + + } +} diff --git a/_includes/code/howto/manage-data.collections-v2.ts b/_includes/code/howto/manage-data.collections-v2.ts index 5fb3ef5aa7..9e7156f916 100644 --- a/_includes/code/howto/manage-data.collections-v2.ts +++ b/_includes/code/howto/manage-data.collections-v2.ts @@ -15,10 +15,10 @@ const client = weaviate.client({ }, }); -// START BasicCreateCollection // START ReadOneCollection // START UpdateCollection +// START BasicCreateCollection // START ReadOneCollection const className = 'Article'; -// END BasicCreateCollection // END ReadOneCollection // END UpdateCollection +// END BasicCreateCollection // END ReadOneCollection // ================================ // ===== CREATE A CLASS ===== @@ -482,6 +482,35 @@ Object.keys(result['moduleConfig']).includes('reranker-cohere'); await client.schema.classDeleter().withClassName(className).do(); +// =============================================== +// ===== UPDATE THE COLLECTION WITH THE RERANKER MODULE ===== +// =============================================== + +const initCollectionWithReranker = { + class: 'Article', + properties: [ + { + name: 'title', + dataType: ['text'], + }, + ], + vectorizer: 'text2vec-openai', // this could be any vectorizer + // highlight-start + moduleConfig: { + 'reranker-cohere': {}, // set your reranker module + }, + // highlight-end +}; + +// Add the class to the schema +result = await client.schema.classCreator().withClass(initCollectionWithReranker).do(); + +// START UpdateReranker +// Collection definition updates are not available in the v2 API. +// Consider upgrading to the v3 API, or deleting and recreating the collection. +// END UpdateReranker + + // =============================================== // ===== CREATE A COLLECTION WITH A GENERATIVE MODULE ===== // =============================================== @@ -546,6 +575,34 @@ Object.keys(result['moduleConfig']).includes('generative-openai'); // Delete the class to recreate it await client.schema.classDeleter().withClassName(className).do(); +// =============================================== +// ===== UPDATE THE COLLECTION WITH THE GENERATIVE MODULE ===== +// =============================================== + +const initCollectionWithGenerative = { + class: 'Article', + properties: [ + { + name: 'title', + dataType: ['text'], + }, + ], + vectorizer: 'text2vec-openai', // this could be any vectorizer + // highlight-start + moduleConfig: { + 'generative-openai': {}, // set your generative module + }, + // highlight-end +}; + +// Add the class to the schema +result = await client.schema.classCreator().withClass(initCollectionWithGenerative).do(); + +// START UpdateGenerative +// Collection definition updates are not available in the v2 API. +// Consider upgrading to the v3 API, or deleting and recreating the collection. +// END UpdateGenerative + // ======================= // ===== REPLICATION ===== // ======================= @@ -694,26 +751,6 @@ try { } // START UpdateCollection -// Define and create a class -const originalClassObj = { - class: className, - vectorIndexConfig: { - distance: 'cosine', // Note the distance metric - }, -}; - -// Add the class to the schema -let originalClassResponse = await client.schema - .classCreator() - .withClass(originalClassObj) - .do(); - -const UpdateCollectionObj = { - class: className, - vectorIndexConfig: { - distance: 'dot', // Note the distance metric - }, -}; - -// Update the class definition -// Not yet available in TS +// Collection definition updates are not available in the v2 API. +// Consider upgrading to the v3 API, or deleting and recreating the collection. +// END UpdateCollection diff --git a/_includes/code/howto/manage-data.collections-v3.py b/_includes/code/howto/manage-data.collections-v3.py index 663da7c633..6169eb19ea 100644 --- a/_includes/code/howto/manage-data.collections-v3.py +++ b/_includes/code/howto/manage-data.collections-v3.py @@ -357,6 +357,44 @@ client.schema.delete_class(class_name) +# =============================================== +# ===== UPDATE THE COLLECTION WITH THE RERANKER MODULE ===== +# =============================================== + +# Clean slate +if client.schema.exists(class_name): + client.schema.delete_class(class_name) + +class_obj = { + "class": "Article", + "vectorizer": "text2vec-openai", # set your vectorizer module + # highlight-start + "moduleConfig": { + "reranker-voyageai": {} # set your reranker module + } + # highlight-end +} + +# START UpdateReranker +class_obj = { + # highlight-start + "moduleConfig": { + "reranker-cohere": {} # Update your reranker module + } + # highlight-end +} + +client.schema.update_config("Article", class_obj) +# END UpdateReranker + +# Test +result = client.schema.get(class_name) +assert "reranker-cohere" in result["moduleConfig"].keys() + +# Delete the class to recreate it +client.schema.delete_class(class_name) + + # =============================================== # ===== CREATE A COLLECTION WITH A GENERATIVE MODULE ===== # =============================================== @@ -418,6 +456,46 @@ client.schema.delete_class(class_name) +# =============================================== +# ===== UPDATE THE COLLECTION WITH THE GENERATIVE MODULE ===== +# =============================================== + +# Clean slate +if client.schema.exists(class_name): + client.schema.delete_class(class_name) + +class_obj = { + "class": "Article", + "vectorizer": "text2vec-openai", # set your vectorizer module + # highlight-start + "moduleConfig": { + "generative-openai": {} # set your generative module + } + # highlight-end +} + +client.schema.create_class(class_obj) + +# START UpdateGenerative +class_obj = { + "class": "Article", + # highlight-start + "moduleConfig": { + "generative-cohere": {} # Update your generative module + } + # highlight-end +} + +client.schema.create_class(class_obj) +# END UpdateGenerative + +# Test +result = client.schema.get(class_name) +assert "generative-cohere" in result["moduleConfig"].keys() + +# Delete the class to recreate it +client.schema.delete_class(class_name) + # ======================= # ===== REPLICATION ===== # ======================= diff --git a/_includes/code/howto/manage-data.collections.py b/_includes/code/howto/manage-data.collections.py index d7e3b8ae6b..9330a6b76c 100644 --- a/_includes/code/howto/manage-data.collections.py +++ b/_includes/code/howto/manage-data.collections.py @@ -272,6 +272,43 @@ client.collections.delete("Article") +# =============================================== +# ===== UPDATE A COLLECTION'S RERANKER MODULE ===== +# =============================================== + +client.collections.delete("Article") + +from weaviate.classes.config import Configure, Property, DataType + +client.collections.create( + "Article", + vectorizer_config=Configure.Vectorizer.text2vec_openai(), + # highlight-start + reranker_config=Configure.Reranker.voyageai() + # highlight-end +) + +# START UpdateReranker +from weaviate.classes.config import Reconfigure + +collection = client.collections.get("Article") + +collection.config.update( + # highlight-start + reranker_config=Reconfigure.Reranker.cohere() # Update the reranker module + # highlight-end +) +# END UpdateReranker + +# Test +collection = client.collections.get("Article") +config = collection.config.get() +assert config.reranker_config.reranker == "reranker-cohere" + +# Delete the collection to recreate it +client.collections.delete("Article") + + # =============================================== # ===== CREATE A COLLECTION WITH A GENERATIVE MODULE ===== # =============================================== @@ -327,6 +364,43 @@ client.collections.delete("Article") +# =============================================== +# ===== UPDATE A COLLECTION'S GENERATIVE MODULE ===== +# =============================================== + +client.collections.delete("Article") + +from weaviate.classes.config import Configure, Property, DataType + +client.collections.create( + "Article", + vectorizer_config=Configure.Vectorizer.text2vec_openai(), + # highlight-start + generative_config=Configure.Generative.openai() + # highlight-end +) + +# START UpdateGenerative +from weaviate.classes.config import Reconfigure + +collection = client.collections.get("Article") + +collection.config.update( + # highlight-start + generative_config=Reconfigure.Generative.cohere() # Update the generative module + # highlight-end +) +# END UpdateGenerative + +# Test +collection = client.collections.get("Article") +config = collection.config.get() +assert config.generative_config.generative == "generative-cohere" + +# Delete the collection to recreate it +client.collections.delete("Article") + + # =========================== # ===== MODULE SETTINGS ===== # =========================== @@ -491,6 +565,41 @@ client.close() +# ============================================== +# ===== ALL REPLICATION SETTINGS +# ============================================== + +# Connect to a setting with 3 replicas +client = weaviate.connect_to_local( + port=8180 # Port for demo setup with 3 replicas +) + +# Clean slate +client.collections.delete("Article") + +# START AllReplicationSettings +from weaviate.classes.config import Configure, ReplicationDeletionStrategy + +client.collections.create( + "Article", + # highlight-start + replication_config=Configure.replication( + factor=3, + async_enabled=True, # Enable asynchronous repair + deletion_strategy=ReplicationDeletionStrategy.TIME_BASED_RESOLUTION, # Added in v1.28; Set the deletion conflict resolution strategy + ) + # highlight-end +) +# END AllReplicationSettings + +# Test +collection = client.collections.get("Article") +config = collection.config.get() +assert config.replication_config.async_enabled == True +assert config.replication_config.deletion_strategy == ReplicationDeletionStrategy.TIME_BASED_RESOLUTION + +client.close() + # ==================== # ===== SHARDING ===== # ==================== diff --git a/_includes/code/howto/manage-data.collections.ts b/_includes/code/howto/manage-data.collections.ts index a6be39cf70..25662788af 100644 --- a/_includes/code/howto/manage-data.collections.ts +++ b/_includes/code/howto/manage-data.collections.ts @@ -8,12 +8,14 @@ import assert from 'assert'; import weaviate, { WeaviateClient, vectorIndex } from 'weaviate-client'; import { vectorizer, reranker, generative, dataType, tokenization, configure, reconfigure, vectorDistances } from 'weaviate-client'; -const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WCD_URL, - { - authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY), - headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY, // Replace with your inference API key +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string +const openaiKey = process.env.OPENAI_API_KEY as string + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), + headers: { + 'X-OpenAI-Api-Key': openaiKey, // Replace with your inference API key } } ) @@ -21,6 +23,14 @@ const client: WeaviateClient = await weaviate.connectToWeaviateCloud( const collectionName = 'Article' let result + +/* +// START UpdateCollection +import { reconfigure } from 'weaviate-client'; + +// END UpdateCollection +*/ + // START UpdateCollection // START ReadOneCollection // START ModifyParam let articles = client.collections.get('Article') // END UpdateCollection // END ReadOneCollection // END ModifyParam @@ -679,18 +689,20 @@ console.log(JSON.stringify(allCollections, null, 2)); articles = client.collections.get('Article') -/* // START UpdateCollection -import { reconfigure } from 'weaviate-client'; - -// END UpdateCollection -*/ -// START UpdateCollection // highlight-start -articles.config.update({ +await articles.config.update({ invertedIndex: reconfigure.invertedIndex({ - bm25k1: 1.5 + bm25k1: 1.5 // Change the k1 parameter from 1.2 + }), + vectorizers: reconfigure.vectorizer.update({ + vectorIndexConfig: reconfigure.vectorIndex.hnsw({ + quantizer: reconfigure.vectorIndex.quantizer.pq(), + ef: 4, + filterStrategy: 'acorn', // Available from Weaviate v1.27.0 + }), + }) }) // highlight-end diff --git a/_includes/code/howto/manage-data.import-v3.py b/_includes/code/howto/manage-data.import-v3.py index de01dc686b..d13f68d8fb 100644 --- a/_includes/code/howto/manage-data.import-v3.py +++ b/_includes/code/howto/manage-data.import-v3.py @@ -172,7 +172,7 @@ # Settings for displaying the import progress counter = 0 -interval = 20 # print progress every this many records; should be bigger than the batch_size +interval = 200 # print progress every this many records; should be bigger than the batch_size def add_object(obj) -> None: global counter diff --git a/_includes/code/howto/manage-data.import.py b/_includes/code/howto/manage-data.import.py index 7b3517cc5e..3398c71719 100644 --- a/_includes/code/howto/manage-data.import.py +++ b/_includes/code/howto/manage-data.import.py @@ -344,10 +344,10 @@ # Settings for displaying the import progress counter = 0 -interval = 100 # print progress every this many records; should be bigger than the batch_size +interval = 200 # print progress every this many records; should be bigger than the batch_size print("JSON streaming, to avoid running out of memory on large files...") -with client.batch.fixed_size(batch_size=200) as batch: +with client.batch.fixed_size(batch_size=100) as batch: with open("jeopardy_1k.json", "rb") as f: objects = ijson.items(f, "item") for obj in objects: @@ -393,7 +393,7 @@ # Settings for displaying the import progress counter = 0 -interval = 100 # print progress every this many records; should be bigger than the batch_size +interval = 200 # print progress every this many records; should be bigger than the batch_size def add_object(obj) -> None: global counter @@ -402,7 +402,7 @@ def add_object(obj) -> None: "answer": obj["Answer"], } - with client.batch.fixed_size(batch_size=200) as batch: + with client.batch.fixed_size(batch_size=100) as batch: batch.add_object( collection="JeopardyQuestion", properties=properties, diff --git a/_includes/code/howto/manage-data.multi-tenancy.ts b/_includes/code/howto/manage-data.multi-tenancy.ts index e7a874a945..fa428c1180 100644 --- a/_includes/code/howto/manage-data.multi-tenancy.ts +++ b/_includes/code/howto/manage-data.multi-tenancy.ts @@ -3,12 +3,20 @@ import assert from 'assert'; import weaviate, { WeaviateClient } from 'weaviate-client'; +/* +// START UpdateAutoMT +import { reconfigure } from 'weaviate-client'; + +// END UpdateAutoMT +*/ + + const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WCD_URL, + process.env.WCD_URL as string, { - authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY), + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY, // Replace with your inference API key + 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY as string, // Replace with your inference API key } } ) @@ -66,9 +74,16 @@ const result = await client.collections.create({ // ========================== { -// START enable autoMT -// Coming soon -// END enable autoMT +// START UpdateAutoMT +const multiCollection = client.collections.get('MultiTenancyCollection'); + +await multiCollection.config.update({ + multiTenancy: weaviate.reconfigure.multiTenancy({ + autoTenantActivation: true, + autoTenantCreation: true, + }), +}); +// END UpdateAutoMT } // ================================ @@ -117,8 +132,8 @@ assert.ok(['tenantA', 'tenantB'].includes(tenants[1].name)); // ===== Get tenants from a collection by name ===== // ======================================= { -// START GetTenantsByName -const multiCollection = client.collections.get('MultiTenancyCollection'); +// START GetTenantsByName +const multiCollection = client.collections.get('MultiTenancyCollection'); // highlight-start const tenants = await multiCollection.tenants.getByNames(['tenantA', 'tenantB']) @@ -133,7 +148,7 @@ console.log(tenants) { // START GetOneTenant -const multiCollection = client.collections.get('MultiTenancyCollection'); +const multiCollection = client.collections.get('MultiTenancyCollection'); // highlight-start const tenant = await multiCollection.tenants.getByName('tenantA') @@ -268,7 +283,7 @@ await multiTenantA.data.insert({ // ===================== { // START Search -const multiCollection = client.collections.get('MultiTenancyCollection'); +const multiCollection = client.collections.get('MultiTenancyCollection'); // highlight-start const multiTenantA = multiCollection.withTenant('tenantA') diff --git a/_includes/code/howto/search.aggregate-v2.ts b/_includes/code/howto/search.aggregate-v2.ts index 01226d0e9c..cc63517418 100644 --- a/_includes/code/howto/search.aggregate-v2.ts +++ b/_includes/code/howto/search.aggregate-v2.ts @@ -169,6 +169,21 @@ assert.deepEqual(result.data.Aggregate.JeopardyQuestion[0], { points: { sum: 300 // End test +// ========================================= +// ===== Hybrid EXAMPLES ===== +// ========================================= + +// HybridExample +// TS client support coming soon +// END HybridExample + +// Test +assert('JeopardyQuestion' in result.data.Aggregate); +assert.equal(result.data.Aggregate.JeopardyQuestion.length, 1); +assert.deepEqual(result.data.Aggregate.JeopardyQuestion[0], { points: { sum: 4600 } }); +// End test + + // ================================= // ===== where filter EXAMPLES ===== // ================================= @@ -195,4 +210,4 @@ console.log(JSON.stringify(result, null, 2)); assert('JeopardyQuestion' in result.data.Aggregate); assert.equal(result.data.Aggregate.JeopardyQuestion.length, 1); assert.deepEqual(result.data.Aggregate.JeopardyQuestion[0], { meta: { count: 285 } }); -// End test \ No newline at end of file +// End test diff --git a/_includes/code/howto/search.aggregate-v3.py b/_includes/code/howto/search.aggregate-v3.py index 5b514261bb..40da416bb8 100644 --- a/_includes/code/howto/search.aggregate-v3.py +++ b/_includes/code/howto/search.aggregate-v3.py @@ -439,6 +439,72 @@ ) +# ========================================= +# ===== nearTextWithLimit EXAMPLES ===== +# ========================================= + +# HybridExample +response = ( + client.query + .aggregate("JeopardyQuestion") + .with_hybrid({ + "query": "animals in space" + }) + # highlight-start + .with_object_limit(10) + # highlight-end + .with_fields("points { sum }") + .do() +) +print(json.dumps(response, indent=2)) +# END HybridExample + + +gql_query = """ +# GraphQLHybridExample +{ + Aggregate { + JeopardyQuestion( + hybrid: { + query: "animals in space" + } + # highlight-start + objectLimit: 10 + # highlight-end + ) { + points { + sum + } + } + } +} +# END GraphQLHybridExample +""" +gqlresponse = client.query.raw(gql_query) + +# Test results +assert gqlresponse == response +# END Test results + +expected_response = ( +# ResultsHybridExample +{ + "data": { + "Aggregate": { + "JeopardyQuestion": [ + { + "points": { + "sum": 6700 + } + } + ] + } + } +} +# END ResultsHybridExample +) + + # ================================= # ===== where filter EXAMPLES ===== # ================================= diff --git a/_includes/code/howto/search.aggregate.py b/_includes/code/howto/search.aggregate.py index b685205d79..cdce8b45f4 100644 --- a/_includes/code/howto/search.aggregate.py +++ b/_includes/code/howto/search.aggregate.py @@ -142,6 +142,32 @@ # End test + +# ========================================= +# ===== hybrid EXAMPLES ===== +# ========================================= + +# HybridExample +from weaviate.classes.query import Metrics + +jeopardy = client.collections.get("JeopardyQuestion") +response = jeopardy.aggregate.hybrid( + query="animals in space", + # highlight-start + object_limit=10, + # highlight-end + return_metrics=Metrics("points").number(sum_=True), +) + +print(response.properties["points"].sum_) +# END HybridExample + + +# Tests +assert response.properties["points"].sum_ > 0 +# End test + + # ============================ # ===== nearTextWithDistance EXAMPLES ===== # ============================ diff --git a/_includes/code/howto/search.aggregate.ts b/_includes/code/howto/search.aggregate.ts index 1028c4e360..b3924ae3b6 100644 --- a/_includes/code/howto/search.aggregate.ts +++ b/_includes/code/howto/search.aggregate.ts @@ -4,13 +4,13 @@ import assert from 'assert'; import weaviate, { WeaviateClient } from 'weaviate-client'; const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WCD_URL, + process.env.WCD_URL as string, { - authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY), + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY, // Replace with your inference API key + 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY as string, // Replace with your inference API key } - } + } ) // MetaCount TS // TextProp TS // IntProp TS // groupBy TS // nearTextWithLimit TS // nearTextWithDistance TS // whereFilter TS @@ -94,7 +94,7 @@ console.log(JSON.stringify(result.properties, null, 2)); // ============================ { // groupBy TS - + const result = await jeopardy.aggregate.groupBy.overAll({ // highlight-start groupBy: { property: 'round' } @@ -120,7 +120,7 @@ console.log(JSON.stringify(result, null, 2)); // ========================================= { // nearTextWithLimit TS - + const result = await jeopardy.aggregate.nearText('animals in space', { // highlight-start objectLimit: 10, @@ -143,15 +143,15 @@ console.log(result.properties['points'].sum); // ============================ { // nearTextWithDistance TS - + const result = await jeopardy.aggregate.nearText(['animals in space'],{ // highlight-start distance: 0.19, // highlight-end - returnMetrics: jeopardy.metrics.aggregate('points').number(['sum']) + returnMetrics: jeopardy.metrics.aggregate('points').number(["sum"]) }) -console.log(result.properties['points'].sum); +console.log(result.properties['points']); // END nearTextWithDistance TS // Test @@ -161,12 +161,27 @@ console.log(result.properties['points'].sum); // End test } +// ========================================= +// ===== Hybrid EXAMPLES ===== +// ========================================= +{ +// HybridExample +// TS client support coming soon +// END HybridExample + + // Test + // assert('JeopardyQuestion' in result.data.Aggregate); + // assert.equal(result.data.Aggregate.JeopardyQuestion.length, 1); + // assert.deepEqual(result.data.Aggregate.JeopardyQuestion[0], { points: { sum: 4600 } }); + // End test + } + // ================================= // ===== where filter EXAMPLES ===== // ================================= { // whereFilter TS - + const result = await jeopardy.aggregate.overAll({ // highlight-start filters: jeopardy.filter.byProperty('round').equal('Final Jeopardy!') diff --git a/_includes/code/howto/search.hybrid-v3.py b/_includes/code/howto/search.hybrid-v3.py index 444fd2c28e..98af3218f0 100644 --- a/_includes/code/howto/search.hybrid-v3.py +++ b/_includes/code/howto/search.hybrid-v3.py @@ -10,10 +10,10 @@ # Instantiate the client with the user/password and OpenAI api key client = weaviate.Client( - "https://edu-demo.weaviate.network", - auth_client_secret=weaviate.auth.AuthApiKey("learn-weaviate"), + os.getenv("WCD_DEMO_URL"), # Replace with your Weaviate URL + auth_client_secret=weaviate.auth.AuthApiKey(os.getenv("WCD_DEMO_RO_KEY")), # If authentication is on. Replace with your Weaviate instance API key additional_headers={ - "X-OpenAI-Api-Key": os.environ["OPENAI_API_KEY"] + "X-OpenAI-Api-Key": os.getenv("OPENAI_APIKEY") # Replace with your OPENAI API key } ) diff --git a/_includes/code/howto/search.hybrid.py b/_includes/code/howto/search.hybrid.py index 85da3a0d0e..cb596e9ee6 100644 --- a/_includes/code/howto/search.hybrid.py +++ b/_includes/code/howto/search.hybrid.py @@ -302,10 +302,10 @@ # End test # ========================================= -# ===== Hybrid with vector similarity ===== +# ===== Hybrid with vector parameters ===== # ========================================= -# START VectorSimilarityPython +# START VectorParametersPython from weaviate.classes.query import HybridVector, Move, HybridFusion jeopardy = client.collections.get("JeopardyQuestion") @@ -321,6 +321,27 @@ alpha=0.75, limit=5, ) +# END VectorParametersPython + +assert len(response.objects) <= 5 +assert len(response.objects) > 0 + +# ========================================= +# ===== Hybrid with vector similarity threshold ===== +# ========================================= + +# START VectorSimilarityPython +from weaviate.classes.query import HybridVector, Move, HybridFusion + +jeopardy = client.collections.get("JeopardyQuestion") +response = jeopardy.query.hybrid( + query="California", + # highlight-start + max_vector_distance=0.4, # Maximum threshold for the vector search component + # highlight-end + alpha=0.75, + limit=5, +) # END VectorSimilarityPython assert len(response.objects) <= 5 diff --git a/_includes/code/howto/search.hybrid.ts b/_includes/code/howto/search.hybrid.ts index 79f1c429aa..ad72d3394a 100644 --- a/_includes/code/howto/search.hybrid.ts +++ b/_includes/code/howto/search.hybrid.ts @@ -9,11 +9,11 @@ import assert from 'assert'; import weaviate from 'weaviate-client'; const client = await weaviate.connectToWeaviateCloud( - process.env.WCD_URL, + process.env.WCD_URL as string, { - authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY), + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY, // Replace with your inference API key + 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY as string, // Replace with your inference API key } } ) @@ -235,7 +235,8 @@ const result = await jeopardy.query.hybrid('California', { }, // maxVectorDistance support coming soon alpha: 0.75, - limit: 5 + limit: 5, + }) for (let object of result.objects) { diff --git a/_includes/code/howto/search.image.ts b/_includes/code/howto/search.image.ts index 60c7168073..e5962f5f85 100644 --- a/_includes/code/howto/search.image.ts +++ b/_includes/code/howto/search.image.ts @@ -7,27 +7,27 @@ import assert from 'assert'; +let result // ================================================= // ===== Helper functions to convert to base64 ===== // ================================================= // START helper base64 functions -import { readFileSync } from 'fs' +const imageURL = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Deutsches_Museum_Portrait_4.jpg/500px-Deutsches_Museum_Portrait_4.jpg' -const urlToBase64 = async (imageUrl) => { +async function urlToBase64(imageUrl: string) { const response = await fetch(imageUrl); const content = await response.buffer(); return content.toString('base64'); } -urlToBase64('https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Deutsches_Museum_Portrait_4.jpg/500px-Deutsches_Museum_Portrait_4.jpg') - .then(base64 => { console.log(base64) }); - +const base64 = await urlToBase64(imageURL) +console.log(base64) // END helper base64 functions - // Helper function – get base64 representation from a local file +// Helper function – get base64 representation from a local file // This example is for NodeJS const fileToBase64 = (file: string) => { return readFileSync(file, { encoding: 'base64' }); @@ -44,12 +44,12 @@ import fs from 'fs'; const client = await weaviate.connectToWeaviateCloud( 'WCD-URL', - { - authCredentials: new weaviate.ApiKey('WEAVIATE-API-KEY'), - headers: { - 'X-OpenAI-Api-Key': 'OPENAI-API-KEY', // Replace with your inference API key - } - } + { + authCredentials: new weaviate.ApiKey('WEAVIATE-API-KEY'), + headers: { + 'X-OpenAI-Api-Key': 'OPENAI-API-KEY', // Replace with your inference API key + } + } ) const imageUrl = 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Welchcorgipembroke.JPG/640px-Welchcorgipembroke.JPG' @@ -59,27 +59,55 @@ const response = await fetch(imageUrl); const content = await response.buffer(); { -// START search with base64 -// Perform query -const myCollection = client.collections.get('Dog'); + // START search with base64 + import { toBase64FromMedia } from 'weaviate-client'; -// highlight-start -const base64String = 'SOME_BASE_64_REPRESENTATION'; -// highlight-end + const myCollection = client.collections.get('Dog'); + const filePath = './images/search-image.jpg' + // highlight-start + const base64String = await toBase64FromMedia(file.path) + // highlight-end -// highlight-start -const result = await myCollection.query.nearImage(base64String, { -// highlight-end - returnProperties: ['breed'], - limit: 1, - // targetVector: 'vector_name' // required when using multiple named vectors -}) + // Perform query + // highlight-start + const result = await myCollection.query.nearImage(base64String, { + returnProperties: ['breed'], + limit: 1, + // targetVector: 'vector_name' // required when using multiple named vectors + }) + // highlight-end -console.log(JSON.stringify(result.objects, null, 2)); -// END search with base64 + console.log(JSON.stringify(result.objects, null, 2)); + // END search with base64 -// Tests -// assert.deepEqual(result.data['Get']['Dog'], [{ 'breed': 'Corgi' }]); + // Tests + // assert.deepEqual(result.data['Get']['Dog'], [{ 'breed': 'Corgi' }]); +} + +{ + // START search with Blob + // Perform query + const myCollection = client.collections.get('Dog'); + + // highlight-start + const url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Welchcorgipembroke.JPG/640px-Welchcorgipembroke.JPG' + const response = await fetch(url); + const blob = await response.buffer(); + // highlight-end + + // highlight-start + const result = await myCollection.query.nearImage(blob, { + // highlight-end + returnProperties: ['breed'], + limit: 1, + // targetVector: 'vector_name' // required when using multiple named vectors + }) + + console.log(JSON.stringify(result.objects, null, 2)); + // END search with Blob + + // Tests + // assert.deepEqual(result.data['Get']['Dog'], [{ 'breed': 'Corgi' }]); } // ==================================== @@ -87,23 +115,18 @@ console.log(JSON.stringify(result.objects, null, 2)); // ==================================== fs.writeFileSync('image.jpg', content); { -// START ImageFileSearch -const myCollection = client.collections.get('Dog'); - -// highlight-start -// Read the file -const image = await fs.promises.readFile('image.jpg'); -// highlight-end - -// Query based on the image content -const result = await myCollection.query.nearImage(image, { - returnProperties: ['breed'], - limit: 1, - // targetVector: 'vector_name' // required when using multiple named vectors -}) - -console.log(JSON.stringify(result.objects, null, 2)); -// END ImageFileSearch + // START ImageFileSearch + const myCollection = client.collections.get('Dog'); + + // Query based on the image content + const result = await myCollection.query.nearImage('./images/search-image.jpg', { + returnProperties: ['breed'], + limit: 1, + // targetVector: 'vector_name' // required when using multiple named vectors + }) + + console.log(JSON.stringify(result.objects, null, 2)); + // END ImageFileSearch } // Tests @@ -134,3 +157,15 @@ console.log(JSON.stringify(result, null, 2)); // Tests assert.equal(result.data['Get']['Dog'][0]['breed'], 'Corgi'); + +const displayRes = ` +// START Expected base64 results +[{ + metadata: {}, + properties: { name: '000ada55d36b4bcb.jpg' }, + references: undefined, + uuid: 'd2528234-1576-4033-b17f-081fe051bee0', + vectors: {} +}] +// END Expected base64 results +` diff --git a/_includes/code/howto/search.multi-target-v3.ts b/_includes/code/howto/search.multi-target-v3.ts index 54f78e0d06..798035acd5 100644 --- a/_includes/code/howto/search.multi-target-v3.ts +++ b/_includes/code/howto/search.multi-target-v3.ts @@ -34,7 +34,7 @@ result = await jeopardy.query.nearText('a wild animal', { result.objects.forEach((item) => { console.log(JSON.stringify(item.properties, null, 2)); - console.log(JSON.stringify(item.metadata.distance, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); }); // END MultiBasic @@ -49,6 +49,8 @@ var resp = await jeopardy.query.fetchObjects({ var v1 = resp.objects[0].vectors.jeopardy_questions_vector; var v2 = resp.objects[0].vectors.jeopardy_answers_vector; +var v3 = resp.objects[1].vectors.jeopardy_answers_vector; + // START MultiTargetNearVector jeopardy = client.collections.get('JeopardyTiny'); @@ -68,7 +70,7 @@ result = await jeopardy.query.nearVector({ result.objects.forEach((item) => { console.log(JSON.stringify(item.properties, null, 2)); - console.log(JSON.stringify(item.metadata.distance, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); }); // END MultiTargetNearVector @@ -89,7 +91,7 @@ result = await jeopardy.query.nearText('a wild animal', { result.objects.forEach((item) => { console.log(JSON.stringify(item.properties, null, 2)); - console.log(JSON.stringify(item.metadata.distance, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); }); // END MultiTargetWithSimpleJoin @@ -113,7 +115,7 @@ result = await jeopardy.query.nearText('a wild animal', { result.objects.forEach((item) => { console.log(JSON.stringify(item.properties, null, 2)); - console.log(JSON.stringify(item.metadata.distance, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); }); // END MultiTargetManualWeights @@ -137,8 +139,56 @@ result = await jeopardy.query.nearText('a wild animal', { result.objects.forEach((item) => { console.log(JSON.stringify(item.properties, null, 2)); - console.log(JSON.stringify(item.metadata.distance, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); }); // END MultiTargetRelativeScore + +// START MultiTargetMultipleNearVectorsV1 +jeopardy = client.collections.get('JeopardyTiny'); + +result = await jeopardy.query.nearVector({ + // highlight-start + // Specify the query vectors for each target vector. where v1, v2.. are vectors + 'jeopardy_questions_vector': v1, + 'jeopardy_answers_vector': [v2, v3] + // highlight-end +}, { + limit: 2, + // Specify the target vectors as a list + targetVector: ['jeopardy_questions_vector', 'jeopardy_answers_vector'], + returnMetadata: ['distance'], +}); + +result.objects.forEach((item) => { + console.log(JSON.stringify(item.properties, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); +}); +// END MultiTargetMultipleNearVectorsV1 + +// START MultiTargetMultipleNearVectorsV2 +jeopardy = client.collections.get('JeopardyTiny'); + +result = await jeopardy.query.nearVector({ + // highlight-start + 'jeopardy_questions_vector': v1, + 'jeopardy_answers_vector': [v2, v3] +}, { + limit: 2, + // Specify the target vectors as a list + targetVector: jeopardy.multiTargetVector.manualWeights({ + "jeopardy_questions_vector": 10, + "jeopardy_answers_vector": [30, 30], // Matches the order of the vectors above + }), + // highlight-end + returnMetadata: ['distance'], +}); + +result.objects.forEach((item) => { + console.log(JSON.stringify(item.properties, null, 2)); + console.log(JSON.stringify(item.metadata?.distance, null, 2)); +}); +// END MultiTargetMultipleNearVectorsV2 + + client.close(); diff --git a/_includes/code/howto/search.multi-target-v4.py b/_includes/code/howto/search.multi-target-v4.py index 1d24a21bc6..af8671ffa4 100644 --- a/_includes/code/howto/search.multi-target-v4.py +++ b/_includes/code/howto/search.multi-target-v4.py @@ -167,7 +167,7 @@ # END MultiTargetMultipleNearVectorsV1 # START MultiTargetMultipleNearVectorsV2 -from weaviate.classes.query import MetadataQuery +from weaviate.classes.query import TargetVectors, MetadataQuery collection = client.collections.get("JeopardyTiny") diff --git a/_includes/code/python/howto.configure.rbac.permissions.py b/_includes/code/python/howto.configure.rbac.permissions.py new file mode 100644 index 0000000000..baeab65d3b --- /dev/null +++ b/_includes/code/python/howto.configure.rbac.permissions.py @@ -0,0 +1,95 @@ +import weaviate +from weaviate import WeaviateClient + +# START-ANY +from weaviate.classes.rbac import Permissions + +# END-ANY +from weaviate.classes.init import Auth + +admin_client = weaviate.connect_to_local( + # Use custom port defined in tests/docker-compose-rbac.yml (without showing the user) + port=8580, + grpc_port=50551, + auth_credentials=Auth.api_key("admin-key") +) + +def reset_user(user: str, client: WeaviateClient): + # Clean slate + current_roles = client.roles.by_user(user) # check if user exists + for k in current_roles.keys(): + client.roles.revoke_from_user(role_names=k, user=user) # revoke all roles + +# ================================================================= +# =============== EXAMPLE: READ + WRITE PERMISSIONS +# ================================================================= + +# Clean slate +reset_user("other-user", client=admin_client) +admin_client.roles.delete("rw_role_target_collections") # delete if exists + +# START ReadWritePermissionDefinition +# Define permissions (example confers read+write rights to collections starting with "TargetCollection_") +admin_permissions = [ + Permissions.collections( + collection="TargetCollection_*", + create_collection=True, + read_config=True, + update_config=True, + delete_collection=True, + ), + Permissions.data( + collection="TargetCollection_*", + create=True, + read=True, + update=True, + delete=True + ), + Permissions.backup(collection="TargetCollection_*", manage=True), + Permissions.nodes(collection="TargetCollection_*", read=True), + Permissions.cluster(read=True), +] + +# Create a new role and assign it to a user +admin_client.roles.create(role_name="rw_role_target_collections", permissions=admin_permissions) +admin_client.roles.assign_to_user(role_names="rw_role_target_collections", user="other-user") +# END ReadWritePermissionDefinition + +# ===== TEST ===== basic checks to see if the role was created +user_permissions = admin_client.roles.by_user("other-user") + +assert "rw_role_target_collections" in user_permissions.keys() +assert user_permissions["rw_role_target_collections"].collections_permissions[0].collection == "TargetCollection_*" +assert user_permissions["rw_role_target_collections"].name == "rw_role_target_collections" + +# ================================================================= +# =============== EXAMPLE: VIEWER PERMISSIONS +# ================================================================= + +# Clean slate +reset_user("other-user", client=admin_client) +admin_client.roles.delete("viewer_role_target_collections") # delete if exists + +# START ViewerPermissionDefinition +# Define permissions (example confers viewer rights to collections starting with "TargetCollection_") +viewer_permissions = [ + Permissions.collections( + collection="TargetCollection_*", + read_config=True, + ), + Permissions.data(collection="TargetCollection_*", read=True), +] + +# Create a new role and assign it to a user +admin_client.roles.create(role_name="viewer_role_target_collections", permissions=viewer_permissions) +admin_client.roles.assign_to_user(role_names="viewer_role_target_collections", user="other-user") +# END ViewerPermissionDefinition + +# ===== TEST ===== basic checks to see if the role was created +user_permissions = admin_client.roles.by_user("other-user") + +assert "viewer_role_target_collections" in user_permissions.keys() +assert user_permissions["viewer_role_target_collections"].collections_permissions[0].collection == "TargetCollection_*" +assert user_permissions["viewer_role_target_collections"].name == "viewer_role_target_collections" + +admin_client.close() diff --git a/_includes/code/python/howto.configure.rbac.roles.py b/_includes/code/python/howto.configure.rbac.roles.py new file mode 100644 index 0000000000..fc2df06eb4 --- /dev/null +++ b/_includes/code/python/howto.configure.rbac.roles.py @@ -0,0 +1,152 @@ +from weaviate.classes.rbac import Permissions + +# START AdminClient +import weaviate +from weaviate.classes.init import Auth + +# Connect to Weaviate as Admin +admin_client = weaviate.connect_to_local( + # END AdminClient + # Use custom port defined in tests/docker-compose-rbac.yml (without showing the user) + port=8580, + grpc_port=50551, + # START AdminClient + auth_credentials=Auth.api_key("admin-key") +) +# END AdminClient + +jane_client = weaviate.connect_to_local( + port=8580, grpc_port=50551, auth_credentials=Auth.api_key("jane-key") +) + +# # START CreateRole +# admin_client.roles.create(role_name="devrel") +# # END CreateRole + +# START AddRoleAtCreate +from weaviate.classes.rbac import Permissions + +permissions = [ + Permissions.collections( + collection="Test_*", + read_config=True, + create_collection=False, + delete_collection=False, + ), + Permissions.collections( + collection="Test_DevRel", + read_config=True, + create_collection=True, + delete_collection=True, + ), +] + +admin_client.roles.create( + role_name="devrel", permissions=permissions +) +# END AddRoleAtCreate +assert "devrel" in admin_client.roles.list_all().keys() + +# START AddRoles +from weaviate.classes.rbac import Permissions + +permissions = [ + Permissions.data(collection="Test_DevRel", read=True, create=True), + Permissions.data(collection="Test_*", read=True, create=False) +] + +admin_client.roles.add_permissions(permissions=permissions, role_name="devrel") +# END AddRoles + +# START ManageRoles +from weaviate.classes.rbac import Permissions + +permissions = [ + Permissions.roles(role="devrel", read=True, manage=True), + Permissions.roles(role="devrel-*", read=True, manage=False) +] + +admin_client.roles.create(role_name="devrel-admin", permissions=permissions) +# END ManageRoles + +# START ClusterAndNodePermissions +from weaviate.classes.rbac import Permissions + +permissions = [ + Permissions.cluster(read=True), + Permissions.nodes(collection="Test_DevRel", verbosity="verbose", read=True) +] + +admin_client.roles.add_permissions(permissions=permissions, role_name="devrel-admin") +# END ClusterAndNodePermissions + + +# START AssignRole +admin_client.roles.assign_to_user(role_names="devrel", user="jane-doe") +# END AssignRole +assert "devrel" in admin_client.roles.by_user(user="jane-doe") + +# START ListCurrentUserRoles +print(admin_client.roles.of_current_user()) +# END ListCurrentUserRoles + +# START ListUserRoles +user_roles = admin_client.roles.by_user(user="jane-doe") + +for role in user_roles: + print(role) +# END ListUserRoles +assert any(permission.collection == "Test_DevRel" for permission in user_roles["devrel"].collections_permissions) + +# START CheckRoleExists +print(admin_client.roles.exists(role_name="role-name")) # Returns True or False +# END CheckRoleExists + +# START InspectRole +print(admin_client.roles.by_name(role_name="devrel")) +# END InspectRole + +# START AssignedUsers +assigned_users = admin_client.roles.assigned_users(role_name="devrel") + +for user in assigned_users: + print(user) +# END AssignedUsers +assert "jane-doe" in assigned_users + +# START ListAllRoles +all_roles = admin_client.roles.list_all() + +for role_name, role in all_roles.items(): + print(role_name, role) +# END ListAllRoles + +# START RemovePermissions +from weaviate.classes.rbac import Permissions + +permissions = [ + Permissions.collections( + collection="Test_DevRel", + read_config=True, + create_collection=True, + delete_collection=True, + ), + Permissions.data(collection="Test_*", read=True, create=False) +] + +admin_client.roles.remove_permissions( + role_name="devrel", permissions=permissions +) +# END RemovePermissions + +# START RevokeRoles +admin_client.roles.revoke_from_user(role_names=["devrel"], user="jane-doe") +# END RevokeRoles +assert "devrel" not in admin_client.roles.by_user(user="jane-doe") + +# START DeleteRole +admin_client.roles.delete(role_name="devrel") +# END DeleteRole + +admin_client.close() +jane_client.close() diff --git a/_includes/code/python/local.quickstart.create_collection.py b/_includes/code/python/local.quickstart.create_collection.py new file mode 100644 index 0000000000..490360ec5a --- /dev/null +++ b/_includes/code/python/local.quickstart.create_collection.py @@ -0,0 +1,31 @@ +# CreateCollection +import weaviate +from weaviate.classes.config import Configure + +client = weaviate.connect_to_local() + +# END CreateCollection + +# NOT SHOWN TO THE USER - DELETE EXISTING COLLECTION +client.collections.delete("Question") + +# CreateCollection +# highlight-start +questions = client.collections.create( + name="Question", + vectorizer_config=Configure.Vectorizer.text2vec_ollama( # Configure the Ollama embedding integration + api_endpoint="http://host.docker.internal:11434", # Allow Weaviate from within a Docker container to contact your Ollama instance + model="nomic-embed-text", # The model to use + ), + generative_config=Configure.Generative.ollama( # Configure the Ollama generative integration + api_endpoint="http://host.docker.internal:11434", # Allow Weaviate from within a Docker container to contact your Ollama instance + model="llama3.2", # The model to use + ) +) +# highlight-end +# CreateCollection + +client.close() # Free up resources +# END CreateCollection + + diff --git a/_includes/code/python/local.quickstart.import_objects.py b/_includes/code/python/local.quickstart.import_objects.py new file mode 100644 index 0000000000..f50480ecc1 --- /dev/null +++ b/_includes/code/python/local.quickstart.import_objects.py @@ -0,0 +1,25 @@ +# Import +import weaviate +import requests, json + +client = weaviate.connect_to_local() + +resp = requests.get( + "https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json" +) +data = json.loads(resp.text) + +# highlight-start +questions = client.collections.get("Question") + +with questions.batch.dynamic() as batch: + for d in data: + batch.add_object({ + "answer": d["Answer"], + "question": d["Question"], + "category": d["Category"], + }) +# highlight-end + +client.close() # Free up resources +# END Import diff --git a/_includes/code/python/local.quickstart.is_ready.py b/_includes/code/python/local.quickstart.is_ready.py new file mode 100644 index 0000000000..878f8b4bc8 --- /dev/null +++ b/_includes/code/python/local.quickstart.is_ready.py @@ -0,0 +1,11 @@ +# InstantiationExample +import weaviate + +# highlight-start +client = weaviate.connect_to_local() +# highlight-end + +print(client.is_ready()) # Should print: `True` + +client.close() # Free up resources +# END InstantiationExample diff --git a/_includes/code/python/local.quickstart.query.neartext.py b/_includes/code/python/local.quickstart.query.neartext.py new file mode 100644 index 0000000000..9fe80928ad --- /dev/null +++ b/_includes/code/python/local.quickstart.query.neartext.py @@ -0,0 +1,20 @@ +# NearText +import weaviate +import json + +client = weaviate.connect_to_local() + +questions = client.collections.get("Question") + +# highlight-start +response = questions.query.near_text( + query="biology", + limit=2 +) +# highlight-end + +for obj in response.objects: + print(json.dumps(obj.properties, indent=2)) + +client.close() # Free up resources +# END NearText diff --git a/_includes/code/python/local.quickstart.query.rag.py b/_includes/code/python/local.quickstart.query.rag.py new file mode 100644 index 0000000000..504bd929f9 --- /dev/null +++ b/_includes/code/python/local.quickstart.query.rag.py @@ -0,0 +1,19 @@ +# RAG +import weaviate + +client = weaviate.connect_to_local() + +questions = client.collections.get("Question") + +# highlight-start +response = questions.generate.near_text( + query="biology", + limit=2, + grouped_task="Write a tweet with emojis about these facts." +) +# highlight-end + +print(response.generated) # Inspect the generated text + +client.close() # Free up resources +# END RAG diff --git a/_includes/code/python/quickstart.create_collection.py b/_includes/code/python/quickstart.create_collection.py index 20632f1511..5c0f8c7dfd 100644 --- a/_includes/code/python/quickstart.create_collection.py +++ b/_includes/code/python/quickstart.create_collection.py @@ -14,6 +14,7 @@ ) # END CreateCollection + # NOT SHOWN TO THE USER - DELETE EXISTING COLLECTION client.collections.delete("Question") @@ -21,8 +22,8 @@ # highlight-start questions = client.collections.create( name="Question", - vectorizer_config=Configure.Vectorizer.text2vec_openai(), # Configure the OpenAI embedding integration - generative_config=Configure.Generative.openai() # Configure the OpenAI generative AI integration + vectorizer_config=Configure.Vectorizer.text2vec_cohere(), # Configure the Cohere embedding integration + generative_config=Configure.Generative.cohere() # Configure the Cohere generative AI integration ) # highlight-end # CreateCollection diff --git a/_includes/code/python/quickstart.import_objects.py b/_includes/code/python/quickstart.import_objects.py index be4449b618..3718cd1ab8 100644 --- a/_includes/code/python/quickstart.import_objects.py +++ b/_includes/code/python/quickstart.import_objects.py @@ -6,14 +6,13 @@ # Best practice: store your credentials in environment variables wcd_url = os.environ["WCD_URL"] wcd_api_key = os.environ["WCD_API_KEY"] -openai_api_key = os.environ["OPENAI_APIKEY"] +cohere_api_key = os.environ["COHERE_APIKEY"] -# Import # ShortImport client = weaviate.connect_to_weaviate_cloud( cluster_url=wcd_url, # Replace with your Weaviate Cloud URL auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key # highlight-start - headers={"X-OpenAI-Api-Key": openai_api_key}, # Replace with your OpenAI API key + headers={"X-Cohere-Api-Key": cohere_api_key}, # Replace with your Cohere API key # highlight-end ) @@ -33,7 +32,6 @@ "category": d["Category"], }) # highlight-end -# Import # END ShortImport client.close() # Free up resources # END Import diff --git a/_includes/code/python/quickstart.query.neartext.py b/_includes/code/python/quickstart.query.neartext.py index 3b083c22fa..68ea1245ba 100644 --- a/_includes/code/python/quickstart.query.neartext.py +++ b/_includes/code/python/quickstart.query.neartext.py @@ -6,14 +6,13 @@ # Best practice: store your credentials in environment variables wcd_url = os.environ["WCD_URL"] wcd_api_key = os.environ["WCD_API_KEY"] -openai_api_key = os.environ["OPENAI_APIKEY"] +cohere_api_key = os.environ["COHERE_APIKEY"] -# NearText # ShortNearText client = weaviate.connect_to_weaviate_cloud( cluster_url=wcd_url, # Replace with your Weaviate Cloud URL auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key # highlight-start - headers={"X-OpenAI-Api-Key": openai_api_key}, # Replace with your OpenAI API key + headers={"X-Cohere-Api-Key": cohere_api_key}, # Replace with your Cohere API key # highlight-end ) @@ -28,7 +27,6 @@ for obj in response.objects: print(json.dumps(obj.properties, indent=2)) -# NearText # END ShortNearText client.close() # Free up resources # END NearText diff --git a/_includes/code/python/quickstart.query.rag.py b/_includes/code/python/quickstart.query.rag.py index c8955d7cab..b8e7b73dba 100644 --- a/_includes/code/python/quickstart.query.rag.py +++ b/_includes/code/python/quickstart.query.rag.py @@ -6,14 +6,13 @@ # Best practice: store your credentials in environment variables wcd_url = os.environ["WCD_URL"] wcd_api_key = os.environ["WCD_API_KEY"] -openai_api_key = os.environ["OPENAI_APIKEY"] +cohere_api_key = os.environ["COHERE_APIKEY"] -# RAG # ShortRAG client = weaviate.connect_to_weaviate_cloud( cluster_url=wcd_url, # Replace with your Weaviate Cloud URL auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key # highlight-start - headers={"X-OpenAI-Api-Key": openai_api_key}, # Replace with your OpenAI API key + headers={"X-Cohere-Api-Key": cohere_api_key}, # Replace with your Cohere API key # highlight-end ) @@ -28,7 +27,6 @@ # highlight-end print(response.generated) # Inspect the generated text -# RAG # END ShortRAG client.close() # Free up resources # END RAG diff --git a/_includes/code/quickstart.autoschema.connect.docker.mdx b/_includes/code/quickstart.autoschema.connect.docker.mdx index f9994f2533..46398dc145 100644 --- a/_includes/code/quickstart.autoschema.connect.docker.mdx +++ b/_includes/code/quickstart.autoschema.connect.docker.mdx @@ -21,7 +21,7 @@ import EndToEndTSCode from '!!raw-loader!/_includes/code/quickstart/endtoend.ts' text={EndToEndTSCode} startMarker="// DockerInstantiationExample" endMarker="// END DockerInstantiationExample" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart.byov.all.py b/_includes/code/quickstart.byov.all.py index 6c85a29320..7aa9e8495a 100644 --- a/_includes/code/quickstart.byov.all.py +++ b/_includes/code/quickstart.byov.all.py @@ -12,59 +12,60 @@ client = weaviate.connect_to_local() -try: +# ===== Create schema ===== +import weaviate.classes as wvc - # ===== Create schema ===== - import weaviate.classes as wvc +# Create the collection. Weaviate's autoschema feature will infer properties when importing. +questions = client.collections.create( + "Question", + vectorizer_config=wvc.config.Configure.Vectorizer.none(), +) - # Create the collection. Weaviate's autoschema feature will infer properties when importing. - questions = client.collections.create( - "Question", - vectorizer_config=wvc.config.Configure.Vectorizer.none(), - ) +# ===== Import data ===== +import requests - # ===== Import data ===== - import requests +fname = "jeopardy_tiny_with_vectors_all-OpenAI-ada-002.json" # This file includes pre-generated vectors +url = f"https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/{fname}" +resp = requests.get(url) +data = json.loads(resp.text) # Load data - fname = "jeopardy_tiny_with_vectors_all-OpenAI-ada-002.json" # This file includes pre-generated vectors - url = f"https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/{fname}" - resp = requests.get(url) - data = json.loads(resp.text) # Load data +question_objs = list() +for i, d in enumerate(data): + question_objs.append(wvc.data.DataObject( + properties={ + "answer": d["Answer"], + "question": d["Question"], + "category": d["Category"], + }, + vector=d["vector"] + )) - question_objs = list() - for i, d in enumerate(data): - question_objs.append(wvc.data.DataObject( - properties={ - "answer": d["Answer"], - "question": d["Question"], - "category": d["Category"], - }, - vector=d["vector"] - )) +questions = client.collections.get("Question") +questions.data.insert_many(question_objs) - questions = client.collections.get("Question") - questions.data.insert_many(question_objs) # This uses batching under the hood +# ===== Query ===== +query_vector = [0.0042927247,-0.007413445,0.00034457954,-0.01897398,-0.00251218,0.020693844,-0.027351381,-0.008647864,-0.000042449385,-0.012337249,-0.006678342,0.0072608762,0.0051838635,-0.020555146,0.00017055604,0.028821588,0.047351733,-0.0045319796,0.008959935,-0.012323379,-0.008585449,0.022483058,0.0013869869,-0.01801696,-0.0014806085,0.01269093,0.021539906,-0.03592296,-0.0024116235,-0.012087591,0.014369184,-0.0019261781,-0.03506303,-0.028932547,-0.008162417,-0.026949156,-0.011782453,0.00049628125,0.018044699,0.011213789,0.014452403,0.028072614,-0.010957196,-0.0006033393,-0.008876716,-0.008079199,-0.011789389,-0.007517469,-0.028960286,-0.0059328363,0.006758094,0.021997612,-0.004521577,-0.015506513,-0.010208224,-0.014577232,-0.004726158,0.025714736,-0.0025104464,-0.016421925,-0.025922785,-0.00038467214,-0.021054462,0.019611996,-0.013315074,0.0014346646,-0.0017857456,0.01572843,-0.01003485,-0.008675603,0.02323203,0.0033079637,0.0056970487,-0.0129405875,0.035534605,-0.010769953,-0.023010112,-0.001464138,-0.008932196,0.015700692,0.010166614,-0.022483058,0.00788502,0.0029698857,0.018710453,0.0029768206,-0.014341445,0.008897521,-0.013141701,-0.037115768,0.0148546295,0.004067339,-0.0060680676,0.02529864,-0.027601039,0.021345729,-0.010721409,0.033676043,-0.0191959,-0.06807332,-0.009812932,0.015312335,-0.010825433,-0.018613365,-0.02110994,0.006248376,0.008550774,0.0044556954,0.023134941,-0.026990766,-0.010097264,0.021623125,-0.0070979055,-0.04798975,0.0006449489,-0.0011338618,0.0033894493,-0.011172179,0.0053641717,-0.010430141,0.021484427,-0.012885109,0.010298378,-0.013003002,0.019917132,0.010832367,-0.04235858,-0.010222093,-0.0017658077,0.009466185,0.023564907,0.01998648,0.0036928526,0.01162295,-0.022413708,0.016421925,-0.008842042,0.0043065944,-0.017503774,-0.031262685,0.007739387,0.033787,-0.040583238,-0.00029863563,0.003266354,0.025423469,0.012579971,0.023759086,0.0168935,0.0042996593,0.015437164,-0.0035125443,0.029043505,0.0031709988,-0.0038350187,-0.0030479038,-0.009889216,0.008696408,0.0022053092,0.003027099,-0.009507795,0.0028918677,0.012406598,-0.022344358,0.009695038,0.017462164,0.007059763,0.012316444,-0.0020596755,-0.019487167,-0.0132734645,0.038197618,-0.022385968,0.030153096,0.00017857457,0.019736823,0.010624319,0.0026023341,-0.014715931,0.0079405,-0.024965765,0.026200183,0.018627234,0.0108670425,-0.0010913853,0.009181853,0.01484076,-0.0072192666,0.031207206,-0.020638365,-0.004466098,0.016061308,0.0054855333,0.004379411,-0.6910524,-0.032178096,0.009660364,-0.005471663,0.012371923,0.0264221,0.007586818,-0.0030929807,-0.012434337,0.011678429,0.019320728,-0.0058392147,-0.009098634,-0.015132027,-0.013571667,-0.030014396,0.008328856,-0.03281611,0.008481425,0.002597133,-0.024008743,-0.0026543462,-0.009015415,-0.011983567,0.009154114,0.0044799675,0.018155659,-0.018821413,-0.008890586,-0.007989044,-0.0075729485,0.0119211525,-0.000356499,-0.0021550308,0.019487167,0.0044314233,-0.0039737173,0.028280662,0.021317989,0.043828785,-0.01319718,-0.030097615,0.0011035214,0.012815759,-0.022691106,0.028211314,0.016602233,-0.0020648767,0.023981003,0.015756171,0.012337249,0.0019556514,0.01583939,0.018710453,0.02334299,-0.0115536,0.017531514,-0.008946066,-0.0024619016,-0.0015447567,-0.010069525,0.0008317587,-0.014743671,-0.027295902,-0.02328751,0.027878437,-0.032483235,0.009743583,0.019917132,-0.010215159,0.022330489,0.022815935,-0.014604972,-0.0008096536,-0.0001595035,0.016075179,0.022372099,-0.0052601476,-0.015132027,0.0032004723,0.0068309107,-0.010083395,-0.02106833,-0.0066228625,0.028904807,-0.020915762,-0.007628428,0.010478686,0.0037240598,0.0037136574,0.014299835,0.02868289,0.0009223463,-0.0052428106,-0.014702061,0.009701974,-0.011810194,-0.0084952945,0.00659859,-0.013044612,-0.005218538,0.000095517884,0.021248639,0.010346922,0.011352488,0.0045909267,-0.004670678,0.020763194,0.044022962,-0.021539906,0.0077809966,-0.00095181976,-0.0062934533,0.010714474,-0.00017369844,-0.033592824,0.0066089923,-0.0025104464,0.021997612,-0.01805857,-0.0023474754,0.0060819373,0.006276116,-0.011962762,0.0061720917,0.01590874,-0.018946242,-0.020888023,-0.017670212,0.0003892232,0.017795041,0.013377489,0.011269269,-0.015464904,0.028252924,0.009681169,0.015534253,-0.020541277,0.010679799,-0.007836476,-0.027073985,-0.015561993,0.005603427,-0.0010081661,-0.013342814,-0.006154754,-0.022427578,-0.0022053092,-0.019279119,0.012933653,0.017448295,0.012815759,0.0019105745,0.028849328,0.034674674,-0.023689736,-0.0062449086,-0.0008872382,-0.0068690525,0.013516188,0.010561905,0.01814179,-0.018391447,0.003644308,-0.0026716834,-0.017032199,-0.0070181536,0.015173636,-0.0076006884,-0.04776783,0.01110283,-0.03919625,-0.015451034,0.010242898,0.011123635,0.0003929074,-0.017808912,0.01603357,0.021387339,-0.0055479477,-0.016297096,-0.0038107466,-0.020333229,-0.0032958277,0.018405316,0.0031796675,0.032316796,0.020555146,-0.004365541,0.012933653,0.009951631,0.02227501,0.0012266166,0.0085299695,0.019182028,0.009819867,0.0014468007,0.010020981,-0.0030704422,0.02314881,0.04449454,-0.00095702097,0.01794761,-0.011095895,0.0017319999,-0.042968854,-0.0022139777,-0.038197618,0.021595387,0.015437164,0.0070909704,-0.020236138,0.0027913111,-0.039473645,0.012614646,0.012316444,-0.009743583,0.001855095,-0.019681344,-0.009743583,0.00084866263,-0.017157027,0.00058080076,-0.00075634127,0.0057143862,0.017198637,0.011858738,0.012420468,-0.00026157705,-0.013849064,0.017420555,-0.0037517995,-0.001249155,0.0019539178,0.00023535434,0.02323203,0.013439903,-0.018987851,0.039751045,0.018641103,-0.0019660539,0.009119439,0.01319718,-0.0072678113,0.010464816,-0.008821237,0.016505145,0.008710277,0.0009656896,-0.0037726043,-0.006210234,-0.0020388707,-0.033620562,-0.001653115,0.01678254,-0.021359598,0.016297096,0.022857545,0.012240159,0.026935285,0.009743583,0.005721321,0.004119351,-0.0048717917,0.008821237,0.0018377576,0.00633853,-0.01159521,-0.023398468,0.008412075,-0.03287159,-0.022496928,0.0030635074,-0.01271867,0.009188788,0.021539906,-0.0035749588,0.0062969206,-0.008751887,-0.0121846795,-0.00661246,-0.0108670425,0.00954247,0.017517645,0.0061408845,-0.013509252,-0.012191615,-0.010485621,-0.00028606606,0.009965501,-0.01697672,0.0140640475,0.012538361,0.0042476472,-0.0034223902,-0.010804628,0.007732452,-0.014494013,-0.010423207,-0.0030756434,-0.0034657335,-0.0132387895,0.0005292222,-0.006678342,0.0117269745,0.008800432,-0.0062449086,-0.022427578,-0.018419186,-0.017795041,0.012288704,0.0028329208,-0.0077948663,0.0013878538,-0.0072192666,0.014604972,-0.008328856,-0.005766398,0.026852066,-0.0041505583,-0.019209769,-0.005579155,-0.02644984,-0.013682626,0.074231535,0.022982374,-0.011747779,0.04737947,0.0021376936,-0.023315249,-0.010811563,-0.0041366885,0.00527055,-0.01907107,0.006158222,-0.027060114,0.018280488,0.005957109,-0.011858738,0.0072539416,-0.014452403,-0.02220566,0.015326206,-0.0036928526,-0.017906,-0.024008743,0.0070008165,0.027129464,0.0033287685,0.0022798597,-0.0025416536,0.02231662,-0.006650602,-0.026269533,-0.003377313,0.0046360036,0.008536904,0.012462078,0.0075660134,0.019223638,0.016740931,0.0013055014,0.0001641629,-0.012545297,0.01585326,0.020929633,0.010069525,-0.018779803,0.0101042,-0.021775695,-0.0098476065,0.033481862,-0.00319007,-0.0024237595,0.019501036,0.006761561,-0.0073787705,-0.016879631,0.009403771,0.009112504,0.0047608325,0.015367815,-0.007177657,-0.00002692705,-0.027129464,-0.044217143,0.020444186,0.0017944142,0.0011052552,-0.009653429,-0.038475018,0.0013497117,-0.023592647,0.000589036,0.0035957636,-0.029820219,-0.00023080329,-0.022496928,0.008079199,-0.00632466,0.029293163,-0.011928087,0.0046810806,0.030125355,-0.0018932371,0.0013809188,-0.0026526125,-0.030069876,0.0044418257,0.0068447804,-0.0009275475,-0.0065188385,0.011401032,0.021900523,0.0061339494,0.004902999,0.02653306,0.005773333,-0.0012517556,0.00581841,0.01994487,0.020263879,-0.00839127,-0.012323379,0.0025728608,-0.023065591,-0.00661246,0.010485621,0.008210963,0.0032351469,0.0011980099,0.031290423,-0.014161136,0.007725517,0.028849328,-0.007049361,0.018155659,0.0148685,0.0041332208,0.019528776,0.0056450367,0.01801696,0.005246278,-0.0220947,-0.001432064,-0.028100355,0.013689561,0.017642474,-0.0050139576,-0.016796412,0.00212209,-0.016560623,-0.013849064,0.0007424714,-0.016089048,0.023967134,0.0030739098,-0.032677412,-0.03206714,-0.009986306,-0.019833913,0.021886652,-0.020818673,-0.011498122,0.0005365906,0.005274018,0.021914393,-0.023093332,-0.0018446926,-0.047240775,-0.01058271,-0.0022538537,-0.014923979,0.024674498,-0.013960023,-0.0022746585,-0.007864215,-0.010769953,-0.0071637873,-0.049238034,-0.022011481,-0.019958742,0.043745566,0.018641103,0.019847782,-0.016435795,0.01697672,0.016158398,0.0028953352,0.0068690525,0.004972348,0.013793585,-0.035867482,0.0191959,0.028655149,-0.006137417,0.017725693,-0.008897521,0.0023145343,0.04208118,-0.003514278,-0.020901892,-0.0026006005,-0.0135369925,-0.014098722,0.0072400714,-0.0021966405,0.014979458,-0.009244268,-0.001380052,0.006449489,-0.0015967686,-0.012108396,-0.019931002,0.03292707,-0.024521928,0.031013027,-0.017545383,-0.004667211,-0.009473121,-0.0020683443,-0.008536904,-0.002578062,0.008113873,0.0028294532,0.019736823,0.00086599996,0.0027965123,-0.0048059095,0.0063940096,-0.0034900059,-0.011525861,0.010624319,-0.014618842,0.010506426,-0.0016297096,-0.016200008,-0.03284385,0.0064078793,0.011241529,-0.0075452086,0.01693511,-0.0121846795,-0.010284508,0.038585976,-0.0045077074,0.013966958,-0.012808824,0.030985286,0.037726045,0.0015369549,-0.026796587,-0.008370466,-0.0013289069,-0.0003181401,0.02323203,0.0074689244,0.007621493,-0.027878437,0.0070181536,0.009154114,-0.012559166,-0.03706029,0.021803435,0.016297096,0.0012985665,-0.019778432,0.00033179327,-0.024951894,0.026297271,0.0065708505,-0.003065241,-0.013100091,-0.008516099,0.0007281681,0.009313617,0.0016600499,0.03270515,0.011879543,0.005801073,-0.012635451,-0.0038904983,-0.013044612,0.009459251,-0.0046845484,0.024050353,-0.01572843,0.0044834353,0.005048632,-0.0076769725,0.0003972417,-0.012469012,-0.004670678,0.03481337,-0.018322097,-0.0064182817,-0.011616015,0.02657467,0.019917132,0.010624319,-0.0038731608,-0.017725693,-0.026227923,-0.0062449086,0.022594016,0.023925524,0.0011884744,-0.012087591,-0.0014702061,-0.0063697374,-0.007857281,-0.0042615174,-0.000051063875,-0.015561993,-0.007808736,0.009944696,0.00954247,0.017808912,0.0052948226,-0.015783912,-0.0026543462,0.024660626,-0.02337073,0.027448472,-0.02117929,-0.016213877,-0.025423469,0.0069141295,-0.0012768948,-0.025173813,0.02539573,-0.017059939,-0.023551038,-0.012420468,-0.020901892,0.018211138,0.0026803522,-0.02016679,0.019667475,-0.01114444,0.017323466,-0.033287685,-0.043662347,0.023010112,-0.014396924,0.0055375453,0.0048891287,-0.011026545,0.009805998,0.014285965,0.013183311,-0.006137417,-0.024840936,-0.017184768,-0.026075354,0.020846413,-0.00029235083,-0.022066962,-0.013786649,-0.011511991,-0.012656256,0.012045981,0.0026283402,-0.0051838635,-0.0026664822,-0.008259507,0.023981003,0.011858738,-0.021623125,-0.0034657335,-0.0028936013,-0.010707539,-0.023426209,0.0075244037,-0.00037773722,0.030319534,0.0071707224,-0.0052358755,-0.018322097,0.010138874,-0.024147442,-0.018710453,0.024410969,0.005291355,0.021872783,0.0001582032,0.0069279997,0.0029109388,-0.0015733633,0.015284596,-0.026685627,-0.0052636154,0.0025173812,-0.006130482,0.02231662,-0.009133309,-0.010978001,-0.023981003,0.021581516,-0.007063231,0.0048925965,0.00223825,-0.004847519,0.0050659697,-0.0082664415,0.023634257,0.010430141,0.014244355,0.015367815,-0.019501036,-0.009930826,0.013301204,-0.015340075,-0.024757717,-0.008065329,-0.016338706,-0.008751887,0.036366798,-0.011574405,-0.0129405875,0.022108572,-0.010326117,0.015783912,0.018821413,-0.0024358958,0.0066401996,0.0016513813,-0.007878086,-0.014369184,-0.0057109185,-0.027642649,-0.0047296253,0.014729801,-0.00065751845,0.020763194,-0.01210146,0.0009795595,-0.013349749,-0.0024653692,-0.024258401,-0.0013471111,-0.0051630586,0.015298465,0.021650866,-0.02314881,-0.02427227,0.0000668571,-0.018322097,-0.007933565,-0.011498122,0.010908652,-0.0074758595,0.0090570245,0.005100644,-0.018419186,-0.014383054,-0.0051457216,0.012788019,-0.022843674,-0.010138874,0.17021103,-0.031345904,0.0020614092,0.024091963,-0.004341269,0.005180396,0.019182028,-0.0011312612,0.0013644483,0.016408054,0.0028173171,-0.0062379735,-0.01106122,0.00850223,0.008897521,-0.0047747022,-0.02334299,-0.012801889,-0.0202084,-0.014181941,0.0033305022,-0.0015196175,-0.0083011165,-0.03167878,0.031123986,0.0016505144,-0.01003485,-0.021997612,0.004341269,-0.0058946945,-0.011241529,-0.016477404,-0.00028324872,-0.009785193,-0.019639734,0.0076561677,-0.0029525484,0.0037275273,0.016477404,0.00036668466,0.0036720478,0.010783823,0.029209943,-0.027573299,0.0009691571,0.034646932,-0.0055652848,-0.017906,0.009133309,0.01592261,-0.031651042,0.01803083,-0.0057906704,0.032400016,0.0072955512,-0.0072539416,0.013030742,0.0019747226,0.006775431,0.023564907,-0.027143333,0.01586713,-0.018585624,0.018114049,-0.01059658,0.010360792,-0.011310878,0.010125005,0.0028398556,-0.015312335,-0.015104287,-0.0025936656,-0.022066962,0.010395466,-0.028128095,-0.019889392,0.041581865,0.0356733,0.0190572,0.010055655,0.000041853415,0.0025919317,-0.018918501,-0.022372099,-0.010749148,-0.027198814,0.015284596,0.020263879,-0.014937849,0.01803083,-0.019556515,-0.0023925523,-0.020569015,-0.024008743,0.010201288,0.018086309,-0.006560448,0.030402754,-0.029154465,0.0106381895,-0.028627409,0.016768672,0.03181748,0.0007095305,-0.0006332462,0.0031467266,-0.027184943,0.0055340775,0.0022573213,-0.018710453,0.0006384474,-0.017378947,-0.005128384,-0.008398206,0.0022642561,0.019806173,0.0023682802,-0.016283225,0.0190572,-0.013190245,-0.015007198,-0.010229029,0.0122193545,0.011331683,-0.008516099,-0.007989044,-0.014188876,0.018238878,0.009043154,-0.040444538,-0.011213789,-0.0019383142,0.0014476676,-0.006449489,-0.017254118,-0.0006939269,-0.018835282,-0.013703431,-0.02434162,0.011747779,-0.0025364524,0.0007021621,-0.0036339057,0.007489729,-0.0034848046,-0.014951719,0.03167878,0.012753344,-0.005176929,-0.022732716,-0.016505145,-0.005097177,-0.026255662,-0.008842042,0.010887847,-0.000096547294,-0.00951473,-0.03481337,0.0070146862,0.007975175,-0.022427578,0.0053086923,0.03511851,-0.012302574,0.013335879,-0.018654974,-0.18252748,0.0028346544,0.024577407,-0.029709259,0.027864566,0.025797956,0.002408156,-0.0002698123,0.005759463,0.0030877795,0.012801889,0.0074550547,-0.04152639,-0.0018689649,-0.012857368,-0.0084952945,-0.000054964774,0.011331683,0.0029178737,0.010804628,0.023828436,-0.020693844,0.011498122,-0.022774326,0.007115243,0.018405316,0.0005461261,0.009327487,-0.0040846765,-0.028544191,-0.010686734,-0.018488536,0.017281856,-0.0012309508,-0.0150488075,0.014799151,-0.011872608,-0.027711999,-0.01708768,0.008321921,0.0059120315,0.040860634,0.013446838,-0.0037483322,0.005152656,0.012073721,0.009001545,0.012788019,0.027351381,-0.026366621,0.0042337775,-0.0018013492,0.0030756434,0.005430054,0.033315424,0.0012734274,-0.043939743,0.025950525,-0.02099898,-0.006151287,-0.021012852,-0.028433232,0.020721585,-0.016879631,-0.010520295,-0.0135369925,-0.024258401,0.0103746625,-0.019931002,0.003027099,0.008204027,-0.013176376,0.024716107,-0.012919783,0.0058808243,-0.0012612912,0.0066540698,0.010811563,-0.0015248187,-0.0140640475,-0.02228888,0.025978265,-0.012489817,-0.018807542,0.0085646445,-0.0014832091,-0.0016305764,0.0018308227,-0.007056296,-0.016019698,0.0046186666,-0.024091963,-0.018738193,-0.021470558,0.01482689,0.027947785,-0.007850346,0.012288704,-0.0026976895,-0.014563362,0.014175006,-0.00047027523,-0.0048856614,0.011505056,0.04760139,-0.0046498734,0.019667475,-0.008536904,0.027975526,0.0023006645,-0.009570209,-0.0010359058,0.012018242,0.035867482,-0.0077671264,0.007760192,-0.012510622,-0.01159521,0.0038731608,-0.009951631,0.040943854,-0.0036616453,-0.0190572,0.0127464095,0.0006341131,-0.015353945,-0.10768566,-0.02848871,-0.00011756881,0.02644984,-0.011935023,0.021942133,-0.031207206,0.014674322,0.0074273148,0.031872958,-0.019445557,-0.002134226,-0.01893237,-0.010097264,0.0011399299,0.007933565,-0.0043308665,-0.009882282,-0.0069349343,0.036810633,0.005305225,-0.0076492326,0.006054198,0.014563362,-0.011401032,0.011851803,-0.0024896415,0.03706029,0.008349661,-0.0019209769,0.002571127,-0.019778432,0.007760192,-0.032316796,-0.008356596,0.0006618528,-0.014618842,-0.014341445,0.016047439,-0.0033374373,0.02314881,0.007205397,0.021207029,-0.017739562,0.011435707,-0.013710366,0.0012274834,0.004719223,-0.0022642561,-0.026963025,-0.010360792,0.00084172765,-0.018474666,-0.00082742434,0.0093899015,-0.013107026,-0.0028727967,0.02002809,-0.009632624,-0.0014754073,0.010353858,0.0016383782,-0.0068933247,0.04435584,0.008363531,-0.015742302,-0.02321816,-0.026130833,0.027850697,-0.023509428,0.016019698,0.03256645,-0.025936656,0.011151374,-0.019306857,0.0129405875,-0.016671583,0.010548036,0.02013905,-0.022815935,-0.009126374,-0.019140419,0.016130658,-0.020804804,0.026644018,0.011588275,-0.005128384,-0.006664472,0.008086134,0.002212244,-0.0153816845,0.008294182,0.021415077,-0.009854542,-0.0032299457,-0.0010731812,-0.01482689,-0.027309772,0.00066098594,0.010450946,-0.012316444,-0.007871151,-0.072456196,0.0009197457,0.008204027,-0.005371107,0.017628603,0.0020267346,0.005381509,-0.0079405,0.009896152,0.02965378,-0.015298465,0.018322097,-0.0013601141,-0.02432775,-0.019140419,-0.028294533,0.035534605,0.02016679,0.020041961,0.015312335,0.022663366,-0.0050798394,0.037975702,0.0039355755,-0.023856174,-0.007822606,-0.0023162682,0.010215159,-0.013897609,-0.028031005,0.01055497,-0.011338618,-0.00012883807,0.026865937,0.0074550547,-0.017434426,0.014077917,0.00034067867,-0.00013642316,0.06025071,-0.02525703,-0.03620036,-0.0070909704,-0.009438446,0.01215694,0.01800309,-0.027004635,0.02009744,0.0064529567,-0.01316944,0.0061998316,0.013550862,-0.02119316,-0.034646932,-0.012045981,-0.010409337,0.019681344,0.0080029145,0.011935023,-0.0077879312,0.028155833,0.048433583,0.0026526125,0.00042476473,-0.014168072,-0.00633853,-0.009230398,-0.008162417,0.012371923,-0.030957548,-0.0200697,-0.00948699,0.0026335414,0.005031295,0.019098809,-0.008308051,-0.02319042,0.008959935,-0.0030635074,0.028627409,0.025548298,0.016269356,-0.016574493,0.026741108,0.023634257,0.024993503,-0.01678254,0.009029285,0.012045981,0.0071637873,-0.007961305,0.015756171,0.0061270148,-0.003606166,0.026810456,0.014660452,-0.005825345,-0.014230486,0.005142254,0.0134676425,-0.014660452,-0.007080568,0.0054508587,-0.020555146,-0.0020926164,-0.0039667827,-0.026158573,-0.042663716,-0.009570209,0.013980828,0.019681344,0.004802442,-0.010721409,0.006702614,-0.025492819,0.016089048,-0.006990414,-0.01798922,-0.018169528,0.037753783,0.021359598,0.011775519,0.023634257,0.010936392,0.00850223,0.01214307,0.028877066,-0.0057698656,0.0021671671,0.0044140858,0.012801889,-0.008807367,-0.029293163,-0.010229029,-0.0018134854,-0.023842305,0.0101458095,0.017739562,-0.029431863,0.047934268,0.0026266065,-0.004015327,0.016089048,-0.02205309,0.012337249,0.014244355,0.020360967,-0.04260824,-0.010797693,0.009070895,-0.0006332462,0.0036789828,-0.0140293725,-0.032122616,-0.0036893853,-0.01904333,0.019265248,0.002271191,-0.0055132727,-0.0018464263,-0.0055028703,0.029764738,0.009327487,-0.02868289,-0.0085646445,0.014168072,-0.0011243263,-0.0057109185,-0.024022613,0.028932547,0.0028450568,-0.04629762,-0.011338618,0.0070250886,-0.00013393092,-0.021720216,-0.007961305,0.012801889,0.028072614,-0.0042407126,0.018682713,-0.019722953,-0.022538537,-0.0032507505,0.010645124,-0.021803435,-0.020763194,-0.025992135] - # ===== Query ===== - query_vector = [0.0042927247,-0.007413445,0.00034457954,-0.01897398,-0.00251218,0.020693844,-0.027351381,-0.008647864,-0.000042449385,-0.012337249,-0.006678342,0.0072608762,0.0051838635,-0.020555146,0.00017055604,0.028821588,0.047351733,-0.0045319796,0.008959935,-0.012323379,-0.008585449,0.022483058,0.0013869869,-0.01801696,-0.0014806085,0.01269093,0.021539906,-0.03592296,-0.0024116235,-0.012087591,0.014369184,-0.0019261781,-0.03506303,-0.028932547,-0.008162417,-0.026949156,-0.011782453,0.00049628125,0.018044699,0.011213789,0.014452403,0.028072614,-0.010957196,-0.0006033393,-0.008876716,-0.008079199,-0.011789389,-0.007517469,-0.028960286,-0.0059328363,0.006758094,0.021997612,-0.004521577,-0.015506513,-0.010208224,-0.014577232,-0.004726158,0.025714736,-0.0025104464,-0.016421925,-0.025922785,-0.00038467214,-0.021054462,0.019611996,-0.013315074,0.0014346646,-0.0017857456,0.01572843,-0.01003485,-0.008675603,0.02323203,0.0033079637,0.0056970487,-0.0129405875,0.035534605,-0.010769953,-0.023010112,-0.001464138,-0.008932196,0.015700692,0.010166614,-0.022483058,0.00788502,0.0029698857,0.018710453,0.0029768206,-0.014341445,0.008897521,-0.013141701,-0.037115768,0.0148546295,0.004067339,-0.0060680676,0.02529864,-0.027601039,0.021345729,-0.010721409,0.033676043,-0.0191959,-0.06807332,-0.009812932,0.015312335,-0.010825433,-0.018613365,-0.02110994,0.006248376,0.008550774,0.0044556954,0.023134941,-0.026990766,-0.010097264,0.021623125,-0.0070979055,-0.04798975,0.0006449489,-0.0011338618,0.0033894493,-0.011172179,0.0053641717,-0.010430141,0.021484427,-0.012885109,0.010298378,-0.013003002,0.019917132,0.010832367,-0.04235858,-0.010222093,-0.0017658077,0.009466185,0.023564907,0.01998648,0.0036928526,0.01162295,-0.022413708,0.016421925,-0.008842042,0.0043065944,-0.017503774,-0.031262685,0.007739387,0.033787,-0.040583238,-0.00029863563,0.003266354,0.025423469,0.012579971,0.023759086,0.0168935,0.0042996593,0.015437164,-0.0035125443,0.029043505,0.0031709988,-0.0038350187,-0.0030479038,-0.009889216,0.008696408,0.0022053092,0.003027099,-0.009507795,0.0028918677,0.012406598,-0.022344358,0.009695038,0.017462164,0.007059763,0.012316444,-0.0020596755,-0.019487167,-0.0132734645,0.038197618,-0.022385968,0.030153096,0.00017857457,0.019736823,0.010624319,0.0026023341,-0.014715931,0.0079405,-0.024965765,0.026200183,0.018627234,0.0108670425,-0.0010913853,0.009181853,0.01484076,-0.0072192666,0.031207206,-0.020638365,-0.004466098,0.016061308,0.0054855333,0.004379411,-0.6910524,-0.032178096,0.009660364,-0.005471663,0.012371923,0.0264221,0.007586818,-0.0030929807,-0.012434337,0.011678429,0.019320728,-0.0058392147,-0.009098634,-0.015132027,-0.013571667,-0.030014396,0.008328856,-0.03281611,0.008481425,0.002597133,-0.024008743,-0.0026543462,-0.009015415,-0.011983567,0.009154114,0.0044799675,0.018155659,-0.018821413,-0.008890586,-0.007989044,-0.0075729485,0.0119211525,-0.000356499,-0.0021550308,0.019487167,0.0044314233,-0.0039737173,0.028280662,0.021317989,0.043828785,-0.01319718,-0.030097615,0.0011035214,0.012815759,-0.022691106,0.028211314,0.016602233,-0.0020648767,0.023981003,0.015756171,0.012337249,0.0019556514,0.01583939,0.018710453,0.02334299,-0.0115536,0.017531514,-0.008946066,-0.0024619016,-0.0015447567,-0.010069525,0.0008317587,-0.014743671,-0.027295902,-0.02328751,0.027878437,-0.032483235,0.009743583,0.019917132,-0.010215159,0.022330489,0.022815935,-0.014604972,-0.0008096536,-0.0001595035,0.016075179,0.022372099,-0.0052601476,-0.015132027,0.0032004723,0.0068309107,-0.010083395,-0.02106833,-0.0066228625,0.028904807,-0.020915762,-0.007628428,0.010478686,0.0037240598,0.0037136574,0.014299835,0.02868289,0.0009223463,-0.0052428106,-0.014702061,0.009701974,-0.011810194,-0.0084952945,0.00659859,-0.013044612,-0.005218538,0.000095517884,0.021248639,0.010346922,0.011352488,0.0045909267,-0.004670678,0.020763194,0.044022962,-0.021539906,0.0077809966,-0.00095181976,-0.0062934533,0.010714474,-0.00017369844,-0.033592824,0.0066089923,-0.0025104464,0.021997612,-0.01805857,-0.0023474754,0.0060819373,0.006276116,-0.011962762,0.0061720917,0.01590874,-0.018946242,-0.020888023,-0.017670212,0.0003892232,0.017795041,0.013377489,0.011269269,-0.015464904,0.028252924,0.009681169,0.015534253,-0.020541277,0.010679799,-0.007836476,-0.027073985,-0.015561993,0.005603427,-0.0010081661,-0.013342814,-0.006154754,-0.022427578,-0.0022053092,-0.019279119,0.012933653,0.017448295,0.012815759,0.0019105745,0.028849328,0.034674674,-0.023689736,-0.0062449086,-0.0008872382,-0.0068690525,0.013516188,0.010561905,0.01814179,-0.018391447,0.003644308,-0.0026716834,-0.017032199,-0.0070181536,0.015173636,-0.0076006884,-0.04776783,0.01110283,-0.03919625,-0.015451034,0.010242898,0.011123635,0.0003929074,-0.017808912,0.01603357,0.021387339,-0.0055479477,-0.016297096,-0.0038107466,-0.020333229,-0.0032958277,0.018405316,0.0031796675,0.032316796,0.020555146,-0.004365541,0.012933653,0.009951631,0.02227501,0.0012266166,0.0085299695,0.019182028,0.009819867,0.0014468007,0.010020981,-0.0030704422,0.02314881,0.04449454,-0.00095702097,0.01794761,-0.011095895,0.0017319999,-0.042968854,-0.0022139777,-0.038197618,0.021595387,0.015437164,0.0070909704,-0.020236138,0.0027913111,-0.039473645,0.012614646,0.012316444,-0.009743583,0.001855095,-0.019681344,-0.009743583,0.00084866263,-0.017157027,0.00058080076,-0.00075634127,0.0057143862,0.017198637,0.011858738,0.012420468,-0.00026157705,-0.013849064,0.017420555,-0.0037517995,-0.001249155,0.0019539178,0.00023535434,0.02323203,0.013439903,-0.018987851,0.039751045,0.018641103,-0.0019660539,0.009119439,0.01319718,-0.0072678113,0.010464816,-0.008821237,0.016505145,0.008710277,0.0009656896,-0.0037726043,-0.006210234,-0.0020388707,-0.033620562,-0.001653115,0.01678254,-0.021359598,0.016297096,0.022857545,0.012240159,0.026935285,0.009743583,0.005721321,0.004119351,-0.0048717917,0.008821237,0.0018377576,0.00633853,-0.01159521,-0.023398468,0.008412075,-0.03287159,-0.022496928,0.0030635074,-0.01271867,0.009188788,0.021539906,-0.0035749588,0.0062969206,-0.008751887,-0.0121846795,-0.00661246,-0.0108670425,0.00954247,0.017517645,0.0061408845,-0.013509252,-0.012191615,-0.010485621,-0.00028606606,0.009965501,-0.01697672,0.0140640475,0.012538361,0.0042476472,-0.0034223902,-0.010804628,0.007732452,-0.014494013,-0.010423207,-0.0030756434,-0.0034657335,-0.0132387895,0.0005292222,-0.006678342,0.0117269745,0.008800432,-0.0062449086,-0.022427578,-0.018419186,-0.017795041,0.012288704,0.0028329208,-0.0077948663,0.0013878538,-0.0072192666,0.014604972,-0.008328856,-0.005766398,0.026852066,-0.0041505583,-0.019209769,-0.005579155,-0.02644984,-0.013682626,0.074231535,0.022982374,-0.011747779,0.04737947,0.0021376936,-0.023315249,-0.010811563,-0.0041366885,0.00527055,-0.01907107,0.006158222,-0.027060114,0.018280488,0.005957109,-0.011858738,0.0072539416,-0.014452403,-0.02220566,0.015326206,-0.0036928526,-0.017906,-0.024008743,0.0070008165,0.027129464,0.0033287685,0.0022798597,-0.0025416536,0.02231662,-0.006650602,-0.026269533,-0.003377313,0.0046360036,0.008536904,0.012462078,0.0075660134,0.019223638,0.016740931,0.0013055014,0.0001641629,-0.012545297,0.01585326,0.020929633,0.010069525,-0.018779803,0.0101042,-0.021775695,-0.0098476065,0.033481862,-0.00319007,-0.0024237595,0.019501036,0.006761561,-0.0073787705,-0.016879631,0.009403771,0.009112504,0.0047608325,0.015367815,-0.007177657,-0.00002692705,-0.027129464,-0.044217143,0.020444186,0.0017944142,0.0011052552,-0.009653429,-0.038475018,0.0013497117,-0.023592647,0.000589036,0.0035957636,-0.029820219,-0.00023080329,-0.022496928,0.008079199,-0.00632466,0.029293163,-0.011928087,0.0046810806,0.030125355,-0.0018932371,0.0013809188,-0.0026526125,-0.030069876,0.0044418257,0.0068447804,-0.0009275475,-0.0065188385,0.011401032,0.021900523,0.0061339494,0.004902999,0.02653306,0.005773333,-0.0012517556,0.00581841,0.01994487,0.020263879,-0.00839127,-0.012323379,0.0025728608,-0.023065591,-0.00661246,0.010485621,0.008210963,0.0032351469,0.0011980099,0.031290423,-0.014161136,0.007725517,0.028849328,-0.007049361,0.018155659,0.0148685,0.0041332208,0.019528776,0.0056450367,0.01801696,0.005246278,-0.0220947,-0.001432064,-0.028100355,0.013689561,0.017642474,-0.0050139576,-0.016796412,0.00212209,-0.016560623,-0.013849064,0.0007424714,-0.016089048,0.023967134,0.0030739098,-0.032677412,-0.03206714,-0.009986306,-0.019833913,0.021886652,-0.020818673,-0.011498122,0.0005365906,0.005274018,0.021914393,-0.023093332,-0.0018446926,-0.047240775,-0.01058271,-0.0022538537,-0.014923979,0.024674498,-0.013960023,-0.0022746585,-0.007864215,-0.010769953,-0.0071637873,-0.049238034,-0.022011481,-0.019958742,0.043745566,0.018641103,0.019847782,-0.016435795,0.01697672,0.016158398,0.0028953352,0.0068690525,0.004972348,0.013793585,-0.035867482,0.0191959,0.028655149,-0.006137417,0.017725693,-0.008897521,0.0023145343,0.04208118,-0.003514278,-0.020901892,-0.0026006005,-0.0135369925,-0.014098722,0.0072400714,-0.0021966405,0.014979458,-0.009244268,-0.001380052,0.006449489,-0.0015967686,-0.012108396,-0.019931002,0.03292707,-0.024521928,0.031013027,-0.017545383,-0.004667211,-0.009473121,-0.0020683443,-0.008536904,-0.002578062,0.008113873,0.0028294532,0.019736823,0.00086599996,0.0027965123,-0.0048059095,0.0063940096,-0.0034900059,-0.011525861,0.010624319,-0.014618842,0.010506426,-0.0016297096,-0.016200008,-0.03284385,0.0064078793,0.011241529,-0.0075452086,0.01693511,-0.0121846795,-0.010284508,0.038585976,-0.0045077074,0.013966958,-0.012808824,0.030985286,0.037726045,0.0015369549,-0.026796587,-0.008370466,-0.0013289069,-0.0003181401,0.02323203,0.0074689244,0.007621493,-0.027878437,0.0070181536,0.009154114,-0.012559166,-0.03706029,0.021803435,0.016297096,0.0012985665,-0.019778432,0.00033179327,-0.024951894,0.026297271,0.0065708505,-0.003065241,-0.013100091,-0.008516099,0.0007281681,0.009313617,0.0016600499,0.03270515,0.011879543,0.005801073,-0.012635451,-0.0038904983,-0.013044612,0.009459251,-0.0046845484,0.024050353,-0.01572843,0.0044834353,0.005048632,-0.0076769725,0.0003972417,-0.012469012,-0.004670678,0.03481337,-0.018322097,-0.0064182817,-0.011616015,0.02657467,0.019917132,0.010624319,-0.0038731608,-0.017725693,-0.026227923,-0.0062449086,0.022594016,0.023925524,0.0011884744,-0.012087591,-0.0014702061,-0.0063697374,-0.007857281,-0.0042615174,-0.000051063875,-0.015561993,-0.007808736,0.009944696,0.00954247,0.017808912,0.0052948226,-0.015783912,-0.0026543462,0.024660626,-0.02337073,0.027448472,-0.02117929,-0.016213877,-0.025423469,0.0069141295,-0.0012768948,-0.025173813,0.02539573,-0.017059939,-0.023551038,-0.012420468,-0.020901892,0.018211138,0.0026803522,-0.02016679,0.019667475,-0.01114444,0.017323466,-0.033287685,-0.043662347,0.023010112,-0.014396924,0.0055375453,0.0048891287,-0.011026545,0.009805998,0.014285965,0.013183311,-0.006137417,-0.024840936,-0.017184768,-0.026075354,0.020846413,-0.00029235083,-0.022066962,-0.013786649,-0.011511991,-0.012656256,0.012045981,0.0026283402,-0.0051838635,-0.0026664822,-0.008259507,0.023981003,0.011858738,-0.021623125,-0.0034657335,-0.0028936013,-0.010707539,-0.023426209,0.0075244037,-0.00037773722,0.030319534,0.0071707224,-0.0052358755,-0.018322097,0.010138874,-0.024147442,-0.018710453,0.024410969,0.005291355,0.021872783,0.0001582032,0.0069279997,0.0029109388,-0.0015733633,0.015284596,-0.026685627,-0.0052636154,0.0025173812,-0.006130482,0.02231662,-0.009133309,-0.010978001,-0.023981003,0.021581516,-0.007063231,0.0048925965,0.00223825,-0.004847519,0.0050659697,-0.0082664415,0.023634257,0.010430141,0.014244355,0.015367815,-0.019501036,-0.009930826,0.013301204,-0.015340075,-0.024757717,-0.008065329,-0.016338706,-0.008751887,0.036366798,-0.011574405,-0.0129405875,0.022108572,-0.010326117,0.015783912,0.018821413,-0.0024358958,0.0066401996,0.0016513813,-0.007878086,-0.014369184,-0.0057109185,-0.027642649,-0.0047296253,0.014729801,-0.00065751845,0.020763194,-0.01210146,0.0009795595,-0.013349749,-0.0024653692,-0.024258401,-0.0013471111,-0.0051630586,0.015298465,0.021650866,-0.02314881,-0.02427227,0.0000668571,-0.018322097,-0.007933565,-0.011498122,0.010908652,-0.0074758595,0.0090570245,0.005100644,-0.018419186,-0.014383054,-0.0051457216,0.012788019,-0.022843674,-0.010138874,0.17021103,-0.031345904,0.0020614092,0.024091963,-0.004341269,0.005180396,0.019182028,-0.0011312612,0.0013644483,0.016408054,0.0028173171,-0.0062379735,-0.01106122,0.00850223,0.008897521,-0.0047747022,-0.02334299,-0.012801889,-0.0202084,-0.014181941,0.0033305022,-0.0015196175,-0.0083011165,-0.03167878,0.031123986,0.0016505144,-0.01003485,-0.021997612,0.004341269,-0.0058946945,-0.011241529,-0.016477404,-0.00028324872,-0.009785193,-0.019639734,0.0076561677,-0.0029525484,0.0037275273,0.016477404,0.00036668466,0.0036720478,0.010783823,0.029209943,-0.027573299,0.0009691571,0.034646932,-0.0055652848,-0.017906,0.009133309,0.01592261,-0.031651042,0.01803083,-0.0057906704,0.032400016,0.0072955512,-0.0072539416,0.013030742,0.0019747226,0.006775431,0.023564907,-0.027143333,0.01586713,-0.018585624,0.018114049,-0.01059658,0.010360792,-0.011310878,0.010125005,0.0028398556,-0.015312335,-0.015104287,-0.0025936656,-0.022066962,0.010395466,-0.028128095,-0.019889392,0.041581865,0.0356733,0.0190572,0.010055655,0.000041853415,0.0025919317,-0.018918501,-0.022372099,-0.010749148,-0.027198814,0.015284596,0.020263879,-0.014937849,0.01803083,-0.019556515,-0.0023925523,-0.020569015,-0.024008743,0.010201288,0.018086309,-0.006560448,0.030402754,-0.029154465,0.0106381895,-0.028627409,0.016768672,0.03181748,0.0007095305,-0.0006332462,0.0031467266,-0.027184943,0.0055340775,0.0022573213,-0.018710453,0.0006384474,-0.017378947,-0.005128384,-0.008398206,0.0022642561,0.019806173,0.0023682802,-0.016283225,0.0190572,-0.013190245,-0.015007198,-0.010229029,0.0122193545,0.011331683,-0.008516099,-0.007989044,-0.014188876,0.018238878,0.009043154,-0.040444538,-0.011213789,-0.0019383142,0.0014476676,-0.006449489,-0.017254118,-0.0006939269,-0.018835282,-0.013703431,-0.02434162,0.011747779,-0.0025364524,0.0007021621,-0.0036339057,0.007489729,-0.0034848046,-0.014951719,0.03167878,0.012753344,-0.005176929,-0.022732716,-0.016505145,-0.005097177,-0.026255662,-0.008842042,0.010887847,-0.000096547294,-0.00951473,-0.03481337,0.0070146862,0.007975175,-0.022427578,0.0053086923,0.03511851,-0.012302574,0.013335879,-0.018654974,-0.18252748,0.0028346544,0.024577407,-0.029709259,0.027864566,0.025797956,0.002408156,-0.0002698123,0.005759463,0.0030877795,0.012801889,0.0074550547,-0.04152639,-0.0018689649,-0.012857368,-0.0084952945,-0.000054964774,0.011331683,0.0029178737,0.010804628,0.023828436,-0.020693844,0.011498122,-0.022774326,0.007115243,0.018405316,0.0005461261,0.009327487,-0.0040846765,-0.028544191,-0.010686734,-0.018488536,0.017281856,-0.0012309508,-0.0150488075,0.014799151,-0.011872608,-0.027711999,-0.01708768,0.008321921,0.0059120315,0.040860634,0.013446838,-0.0037483322,0.005152656,0.012073721,0.009001545,0.012788019,0.027351381,-0.026366621,0.0042337775,-0.0018013492,0.0030756434,0.005430054,0.033315424,0.0012734274,-0.043939743,0.025950525,-0.02099898,-0.006151287,-0.021012852,-0.028433232,0.020721585,-0.016879631,-0.010520295,-0.0135369925,-0.024258401,0.0103746625,-0.019931002,0.003027099,0.008204027,-0.013176376,0.024716107,-0.012919783,0.0058808243,-0.0012612912,0.0066540698,0.010811563,-0.0015248187,-0.0140640475,-0.02228888,0.025978265,-0.012489817,-0.018807542,0.0085646445,-0.0014832091,-0.0016305764,0.0018308227,-0.007056296,-0.016019698,0.0046186666,-0.024091963,-0.018738193,-0.021470558,0.01482689,0.027947785,-0.007850346,0.012288704,-0.0026976895,-0.014563362,0.014175006,-0.00047027523,-0.0048856614,0.011505056,0.04760139,-0.0046498734,0.019667475,-0.008536904,0.027975526,0.0023006645,-0.009570209,-0.0010359058,0.012018242,0.035867482,-0.0077671264,0.007760192,-0.012510622,-0.01159521,0.0038731608,-0.009951631,0.040943854,-0.0036616453,-0.0190572,0.0127464095,0.0006341131,-0.015353945,-0.10768566,-0.02848871,-0.00011756881,0.02644984,-0.011935023,0.021942133,-0.031207206,0.014674322,0.0074273148,0.031872958,-0.019445557,-0.002134226,-0.01893237,-0.010097264,0.0011399299,0.007933565,-0.0043308665,-0.009882282,-0.0069349343,0.036810633,0.005305225,-0.0076492326,0.006054198,0.014563362,-0.011401032,0.011851803,-0.0024896415,0.03706029,0.008349661,-0.0019209769,0.002571127,-0.019778432,0.007760192,-0.032316796,-0.008356596,0.0006618528,-0.014618842,-0.014341445,0.016047439,-0.0033374373,0.02314881,0.007205397,0.021207029,-0.017739562,0.011435707,-0.013710366,0.0012274834,0.004719223,-0.0022642561,-0.026963025,-0.010360792,0.00084172765,-0.018474666,-0.00082742434,0.0093899015,-0.013107026,-0.0028727967,0.02002809,-0.009632624,-0.0014754073,0.010353858,0.0016383782,-0.0068933247,0.04435584,0.008363531,-0.015742302,-0.02321816,-0.026130833,0.027850697,-0.023509428,0.016019698,0.03256645,-0.025936656,0.011151374,-0.019306857,0.0129405875,-0.016671583,0.010548036,0.02013905,-0.022815935,-0.009126374,-0.019140419,0.016130658,-0.020804804,0.026644018,0.011588275,-0.005128384,-0.006664472,0.008086134,0.002212244,-0.0153816845,0.008294182,0.021415077,-0.009854542,-0.0032299457,-0.0010731812,-0.01482689,-0.027309772,0.00066098594,0.010450946,-0.012316444,-0.007871151,-0.072456196,0.0009197457,0.008204027,-0.005371107,0.017628603,0.0020267346,0.005381509,-0.0079405,0.009896152,0.02965378,-0.015298465,0.018322097,-0.0013601141,-0.02432775,-0.019140419,-0.028294533,0.035534605,0.02016679,0.020041961,0.015312335,0.022663366,-0.0050798394,0.037975702,0.0039355755,-0.023856174,-0.007822606,-0.0023162682,0.010215159,-0.013897609,-0.028031005,0.01055497,-0.011338618,-0.00012883807,0.026865937,0.0074550547,-0.017434426,0.014077917,0.00034067867,-0.00013642316,0.06025071,-0.02525703,-0.03620036,-0.0070909704,-0.009438446,0.01215694,0.01800309,-0.027004635,0.02009744,0.0064529567,-0.01316944,0.0061998316,0.013550862,-0.02119316,-0.034646932,-0.012045981,-0.010409337,0.019681344,0.0080029145,0.011935023,-0.0077879312,0.028155833,0.048433583,0.0026526125,0.00042476473,-0.014168072,-0.00633853,-0.009230398,-0.008162417,0.012371923,-0.030957548,-0.0200697,-0.00948699,0.0026335414,0.005031295,0.019098809,-0.008308051,-0.02319042,0.008959935,-0.0030635074,0.028627409,0.025548298,0.016269356,-0.016574493,0.026741108,0.023634257,0.024993503,-0.01678254,0.009029285,0.012045981,0.0071637873,-0.007961305,0.015756171,0.0061270148,-0.003606166,0.026810456,0.014660452,-0.005825345,-0.014230486,0.005142254,0.0134676425,-0.014660452,-0.007080568,0.0054508587,-0.020555146,-0.0020926164,-0.0039667827,-0.026158573,-0.042663716,-0.009570209,0.013980828,0.019681344,0.004802442,-0.010721409,0.006702614,-0.025492819,0.016089048,-0.006990414,-0.01798922,-0.018169528,0.037753783,0.021359598,0.011775519,0.023634257,0.010936392,0.00850223,0.01214307,0.028877066,-0.0057698656,0.0021671671,0.0044140858,0.012801889,-0.008807367,-0.029293163,-0.010229029,-0.0018134854,-0.023842305,0.0101458095,0.017739562,-0.029431863,0.047934268,0.0026266065,-0.004015327,0.016089048,-0.02205309,0.012337249,0.014244355,0.020360967,-0.04260824,-0.010797693,0.009070895,-0.0006332462,0.0036789828,-0.0140293725,-0.032122616,-0.0036893853,-0.01904333,0.019265248,0.002271191,-0.0055132727,-0.0018464263,-0.0055028703,0.029764738,0.009327487,-0.02868289,-0.0085646445,0.014168072,-0.0011243263,-0.0057109185,-0.024022613,0.028932547,0.0028450568,-0.04629762,-0.011338618,0.0070250886,-0.00013393092,-0.021720216,-0.007961305,0.012801889,0.028072614,-0.0042407126,0.018682713,-0.019722953,-0.022538537,-0.0032507505,0.010645124,-0.021803435,-0.020763194,-0.025992135] +import time +time.sleep(1) # Sleep so we don't query before async indexing finishes - response = questions.query.near_vector( - near_vector=query_vector, - limit=2, - return_metadata=wvc.query.MetadataQuery(certainty=True) - ) +response = questions.query.near_vector( + near_vector=query_vector, + limit=2, + return_metadata=wvc.query.MetadataQuery(certainty=True) +) - print(response) +print(response) - # ===== Test import ===== - # ===== Test query results ===== - assert len(response.objects) == 2 - assert type(response.objects[0].metadata.certainty) == float - assert type(response.objects[0].properties) == dict +# ===== Test import ===== - client.collections.delete("Question") +# ===== Test query results ===== +assert len(response.objects) == 2 +assert type(response.objects[0].metadata.certainty) == float +assert type(response.objects[0].properties) == dict + +client.collections.delete("Question") -finally: - client.close() +client.close() diff --git a/_includes/code/quickstart.byov.all.ts b/_includes/code/quickstart.byov.all.ts index ed07420c9d..1f53109d66 100644 --- a/_includes/code/quickstart.byov.all.ts +++ b/_includes/code/quickstart.byov.all.ts @@ -3,11 +3,14 @@ import weaviate, { WeaviateClient } from 'weaviate-client' import { vectorizer } from 'weaviate-client'; -const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - 'WEAVIATE_INSTANCE_URL', { // Replace WEAVIATE_INSTANCE_URL with your instance URL - authCredentials: new weaviate.ApiKey('WEAVIATE_INSTANCE_API_KEY'), +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string +const openaiKey = process.env.OPENAI_API_KEY as string + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_API_KEY || '', // Replace with your inference API key + 'X-OpenAI-Api-Key': openaiKey, // Replace with your inference API key } } ) diff --git a/_includes/code/quickstart.byov.schema.mdx b/_includes/code/quickstart.byov.schema.mdx index 5c99819c66..4c9d829338 100644 --- a/_includes/code/quickstart.byov.schema.mdx +++ b/_includes/code/quickstart.byov.schema.mdx @@ -39,7 +39,7 @@ import ByovAllShCode from '!!raw-loader!/_includes/code/quickstart.byov.all.sh'; text={ByovAllTsCodeLegacy} startMarker="// Class definition" endMarker="// Import data" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/clients.install.mdx b/_includes/code/quickstart/clients.install.mdx index 19fa10977f..2b911fe007 100644 --- a/_includes/code/quickstart/clients.install.mdx +++ b/_includes/code/quickstart/clients.install.mdx @@ -4,7 +4,7 @@ import TabItem from '@theme/TabItem'; -Install the latest, [Python client `v4`](/developers/weaviate/client-libraries/python), by adding `weaviate-client` to your Python environment with `pip`.

+Install the latest, [Python client `v4`](/developers/weaviate/client-libraries/python), by adding `weaviate-client` to your Python environment with `pip`:

```bash @@ -14,7 +14,7 @@ pip install -U weaviate-client
-Install the latest, [JS/TS client `v3`](/developers/weaviate/client-libraries/typescript/typescript-v3), by adding `weaviate-client` to your project with `npm`.:

+Install the latest, [JS/TS client `v3`](/developers/weaviate/client-libraries/typescript/typescript-v3), by adding `weaviate-client` to your project with `npm`:

```bash npm install weaviate-client diff --git a/_includes/code/quickstart/collection.definition.mdx b/_includes/code/quickstart/collection.definition.mdx index 768e211c23..ccf63a9eae 100644 --- a/_includes/code/quickstart/collection.definition.mdx +++ b/_includes/code/quickstart/collection.definition.mdx @@ -44,7 +44,7 @@ import GoCollectionDefine from '!!raw-loader!/_includes/code/quickstart/go-colle text={EndToEndTSCodeLegacy} startMarker="// START CreateCollection" endMarker="// END CreateCollection" - language="ts" + language="tsv2" />
diff --git a/_includes/code/quickstart/connect.withkey.mdx b/_includes/code/quickstart/connect.withkey.mdx index 444ea5197f..32a17a907e 100644 --- a/_includes/code/quickstart/connect.withkey.mdx +++ b/_includes/code/quickstart/connect.withkey.mdx @@ -47,7 +47,7 @@ import GoConnectCode from '!!raw-loader!/_includes/code/quickstart/go-connect.go text={EndToEndTSCodeLegacy} startMarker="// InstantiationExample" endMarker="// END InstantiationExample" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/endtoend.mdx b/_includes/code/quickstart/endtoend.mdx index fde30475ae..9eb4292300 100644 --- a/_includes/code/quickstart/endtoend.mdx +++ b/_includes/code/quickstart/endtoend.mdx @@ -38,7 +38,7 @@ import GoCreateAll from '!!raw-loader!/_includes/code/quickstart/go-create-run-a text={EndToEndTSCodeLegacy} startMarker="// EndToEndExample" endMarker="// END EndToEndExample" - language="ts" + language="tsv2" />
diff --git a/_includes/code/quickstart/endtoend.ts b/_includes/code/quickstart/endtoend.ts index 7eb84e62e1..1bf715c6f6 100644 --- a/_includes/code/quickstart/endtoend.ts +++ b/_includes/code/quickstart/endtoend.ts @@ -20,15 +20,16 @@ const client: WeaviateClient = weaviate.client({ // EndToEndExample // InstantiationExample // NearTextExample import weaviate, { WeaviateClient } from 'weaviate-client'; -const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - process.env.WCD_URL, - { - authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY), - headers: { - 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY, // Replace with your inference API key - } - } -) +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string +const openaiKey = process.env.OPENAI_API_KEY as string + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), + headers: { + 'X-OpenAI-Api-Key': openaiKey, // Replace with your inference API key + } +}) // END EndToEndExample // END InstantiationExample // END NearTextExample diff --git a/_includes/code/quickstart/generativesearch.grouped.mdx b/_includes/code/quickstart/generativesearch.grouped.mdx index b87850e118..0ee3b96d38 100644 --- a/_includes/code/quickstart/generativesearch.grouped.mdx +++ b/_includes/code/quickstart/generativesearch.grouped.mdx @@ -56,7 +56,7 @@ import GoGenGrouped from '!!raw-loader!/_includes/code/quickstart/go-query-gener text={EndToEndTSCodeLegacy} startMarker="// GenerativeSearchGroupedTaskExample" endMarker="// END GenerativeSearchGroupedTaskExample" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/generativesearch.single.mdx b/_includes/code/quickstart/generativesearch.single.mdx index 6e6a88a895..e32608b002 100644 --- a/_includes/code/quickstart/generativesearch.single.mdx +++ b/_includes/code/quickstart/generativesearch.single.mdx @@ -56,7 +56,7 @@ import GoGenerative from '!!raw-loader!/_includes/code/quickstart/go-query-gener text={EndToEndTSCodeLegacy} startMarker="// GenerativeSearchExample" endMarker="// END GenerativeSearchExample" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/import.custom.vectors.mdx b/_includes/code/quickstart/import.custom.vectors.mdx index eb6d9f29b6..a78d678f46 100644 --- a/_includes/code/quickstart/import.custom.vectors.mdx +++ b/_includes/code/quickstart/import.custom.vectors.mdx @@ -32,7 +32,7 @@ import EndToEndTSCode from '!!raw-loader!/_includes/code/quickstart/endtoend.ts' text={EndToEndTSCode} startMarker="// Import data with custom vectors" endMarker="// END Import data with custom vectors" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/import.mdx b/_includes/code/quickstart/import.mdx index 995477aed1..c11925062a 100644 --- a/_includes/code/quickstart/import.mdx +++ b/_includes/code/quickstart/import.mdx @@ -37,7 +37,7 @@ import GoImportObjects from '!!raw-loader!/_includes/code/quickstart/go-add-obje text={EndToEndTSCodeLegacy} startMarker="// Import data function" endMarker="// END Import data function" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/local.quickstart.create_collection.mdx b/_includes/code/quickstart/local.quickstart.create_collection.mdx new file mode 100644 index 0000000000..7678a3eca8 --- /dev/null +++ b/_includes/code/quickstart/local.quickstart.create_collection.mdx @@ -0,0 +1,78 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/_includes/code/python/local.quickstart.create_collection.py'; +import TSCode from '!!raw-loader!/_includes/code/typescript/local.quickstart.create_collection.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart_local/2_1_create_collection/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/CreateCollection.java'; + + + + + + + + + + + + + + + + + + + + + + + + + +```bash +curl -X POST \ +-H "Content-Type: application/json" \ +-d '{ + "class": "Question", + "vectorizer": "text2vec-ollama", + "moduleConfig": { + "text2vec-ollama": { + "apiEndpoint": "http://host.docker.internal:11434", + "model": "nomic-embed-text", + }, + "generative-ollama": { + "apiEndpoint": "http://host.docker.internal:11434", + "model": "llama3.2", + } + } +}' \ +"http://localhost:8080/v1/schema" +``` + + + diff --git a/_includes/code/quickstart/local.quickstart.import_objects.mdx b/_includes/code/quickstart/local.quickstart.import_objects.mdx new file mode 100644 index 0000000000..94a6ef1df7 --- /dev/null +++ b/_includes/code/quickstart/local.quickstart.import_objects.mdx @@ -0,0 +1,109 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/_includes/code/python/local.quickstart.import_objects.py'; +import TSCode from '!!raw-loader!/_includes/code/typescript/local.quickstart.import_objects.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart_local/2_2_add_objects/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/Import.java'; + + + + + + + + + + + + + + + + + + + + + + + + + +:::note +- Download the `jeopardy_tiny.json` file from [here](https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json) before running the following script. +- This assumes you have `jq` installed. +::: + +```bash +# Set batch size +BATCH_ENDPOINT="http://localhost:8080/v1/batch/objects" +BATCH_SIZE=100 + +# Read the JSON file and loop through its entries +lines_processed=0 +batch_data="{\"objects\": [" + +cat jeopardy_tiny.json | jq -c '.[]' | while read line; do + # Concatenate lines + line=$(echo "$line" | jq "{class: \"Question\", properties: {answer: .Answer, question: .Question, category: .Category}}") + if [ $lines_processed -eq 0 ]; then + batch_data+=$line + else + batch_data+=",$line" + fi + + lines_processed=$((lines_processed + 1)) + + # If the batch is full, send it to the API using curl + if [ $lines_processed -eq $BATCH_SIZE ]; then + batch_data+="]}" + + curl -X POST "$BATCH_ENDPOINT" \ + -H "Content-Type: application/json" \ + -d "$batch_data" + echo "" # Print a newline for better output formatting + + # Reset the batch data and counter + lines_processed=0 + batch_data="{\"objects\": [" + fi +done + +# Send the remaining data (if any) to the API using curl +if [ $lines_processed -ne 0 ]; then + batch_data+="]}" + + curl -X POST "$BATCH_ENDPOINT" \ + -H "Content-Type: application/json" \ + -d "$batch_data" + echo "" # Print a newline for better output formatting +fi +``` + + + diff --git a/_includes/code/quickstart/local.quickstart.is_ready.mdx b/_includes/code/quickstart/local.quickstart.is_ready.mdx new file mode 100644 index 0000000000..c7959cfdf6 --- /dev/null +++ b/_includes/code/quickstart/local.quickstart.is_ready.mdx @@ -0,0 +1,65 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/_includes/code/python/local.quickstart.is_ready.py'; +import TSCode from '!!raw-loader!/_includes/code/typescript/local.quickstart.is_ready.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart_local/1_is_ready/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/IsReady.java'; + + + + + + + + + + + + + + + + + + + + + + + + + +```bash +curl -w "\nResponse code: %{http_code}\n" \ + http://localhost:8080/v1/.well-known/ready + +# You should see "Response code: 200" if the instance is ready +``` + + + diff --git a/_includes/code/quickstart/local.quickstart.query.neartext.mdx b/_includes/code/quickstart/local.quickstart.query.neartext.mdx new file mode 100644 index 0000000000..0053fef1cf --- /dev/null +++ b/_includes/code/quickstart/local.quickstart.query.neartext.mdx @@ -0,0 +1,81 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/_includes/code/python/local.quickstart.query.neartext.py'; +import TSCode from '!!raw-loader!/_includes/code/typescript/local.quickstart.query.neartext.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart_local/3_1_neartext/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/NearText.java'; + + + + + + + + + + + + + + + + + + + + + + + + + +```bash +echo '{ + "query": "{ + Get { + Question ( + limit: 2 + nearText: { + concepts: [\"biology\"], + } + ) { + question + answer + category + } + } + }" +}' | tr -d "\n" | curl \ + -X POST \ + -H 'Content-Type: application/json' \ + -d @- \ + http://localhost:8080/v1/graphql +``` + + + diff --git a/_includes/code/quickstart/local.quickstart.query.rag.mdx b/_includes/code/quickstart/local.quickstart.query.rag.mdx new file mode 100644 index 0000000000..cdb5fc66c3 --- /dev/null +++ b/_includes/code/quickstart/local.quickstart.query.rag.mdx @@ -0,0 +1,93 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/_includes/code/python/local.quickstart.query.rag.py'; +import TSCode from '!!raw-loader!/_includes/code/typescript/local.quickstart.query.rag.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart_local/3_2_rag/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart_local/RAG.java'; + + + + + + + + + + + + + + + + + + + + + + + + + +```bash +echo '{ + "query": "{ + Get { + Question ( + limit: 2 + nearText: { + concepts: [\"biology\"], + } + ) { + question + answer + category + _additional { + generate( + groupedResult: { + task: \"\"\" + Write a tweet with emojis about these facts. + \"\"\" + } + ) { + groupedResult + error + } + } + } + } + }" +}' | tr -d "\n" | curl \ + -X POST \ + -H 'Content-Type: application/json' \ + -d @- \ + http://localhost:8080/v1/graphql +``` + + + diff --git a/_includes/code/quickstart/neartext.mdx b/_includes/code/quickstart/neartext.mdx index a0b4e76f66..9005f10d3f 100644 --- a/_includes/code/quickstart/neartext.mdx +++ b/_includes/code/quickstart/neartext.mdx @@ -63,7 +63,7 @@ import GoNearText from '!!raw-loader!/_includes/code/quickstart/go-query-neartex text={EndToEndTSCodeLegacy} startMarker="// NearTextExample" endMarker="// END NearTextExample" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/neartext.where.mdx b/_includes/code/quickstart/neartext.where.mdx index 03f5e68a09..3e40e37b10 100644 --- a/_includes/code/quickstart/neartext.where.mdx +++ b/_includes/code/quickstart/neartext.where.mdx @@ -56,7 +56,7 @@ import GoWhereFilter from '!!raw-loader!/_includes/code/quickstart/go-query-filt text={EndToEndTSCodeLegacy} startMarker="// NearTextWhereExample" endMarker="// END NearTextWhereExample" - language="ts" + language="tsv2" /> diff --git a/_includes/code/quickstart/quickstart.create_collection.mdx b/_includes/code/quickstart/quickstart.create_collection.mdx index 465b5d3b52..52a0e0ad32 100644 --- a/_includes/code/quickstart/quickstart.create_collection.mdx +++ b/_includes/code/quickstart/quickstart.create_collection.mdx @@ -4,6 +4,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/python/quickstart.create_collection.py'; import TSCode from '!!raw-loader!/_includes/code/typescript/quickstart.create_collection.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/2_1_create_collection/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/CreateCollection.java'; @@ -40,43 +41,18 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/2_1_cr title="quickstart/2_1_create_collection/main.go" /> -{/* -```java - -package io.weaviate; - -import java.util.ArrayList; -import io.weaviate.client.Config; -import io.weaviate.client.WeaviateClient; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.schema.model.DataType; -import io.weaviate.client.v1.schema.model.Property; -import io.weaviate.client.v1.schema.model.WeaviateClass; - -public class App { - public static void main(String[] args) { - Config config = new Config("https", "WEAVIATE_INSTANCE_URL/"); // Replace with your Weaviate endpoint - - WeaviateClient client = new WeaviateClient(config); - - // we will create the class "Question" and the properties - WeaviateClass clazz = WeaviateClass.builder() - .className("Question") - .vectorizer("text2vec-openai") - .build(); + + - // add the schema - Result result = client.schema().classCreator().withClass(clazz).run(); - if (result.hasErrors()) { - System.out.println(result.getError()); - return; - } - } -} -``` + - */} ```bash @@ -89,10 +65,10 @@ curl -X POST \ -H "Authorization: Bearer $WCD_API_KEY" \ -d '{ "class": "Question", - "vectorizer": "text2vec-openai", + "vectorizer": "text2vec-cohere", "moduleConfig": { - "text2vec-openai": {}, - "generative-openai": {} + "text2vec-cohere": {}, + "generative-cohere": {} } }' \ "$WCD_URL/v1/schema" diff --git a/_includes/code/quickstart/quickstart.import_objects.mdx b/_includes/code/quickstart/quickstart.import_objects.mdx index b50e684641..330350f4c3 100644 --- a/_includes/code/quickstart/quickstart.import_objects.mdx +++ b/_includes/code/quickstart/quickstart.import_objects.mdx @@ -4,6 +4,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/python/quickstart.import_objects.py'; import TSCode from '!!raw-loader!/_includes/code/typescript/quickstart.import_objects.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/2_2_add_objects/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/Import.java'; @@ -40,43 +41,17 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/2_2_ad title="quickstart/2_2_import/main.go" /> -{/* - -```java - -package io.weaviate; - -import java.util.ArrayList; -import io.weaviate.client.Config; -import io.weaviate.client.WeaviateClient; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.schema.model.DataType; -import io.weaviate.client.v1.schema.model.Property; -import io.weaviate.client.v1.schema.model.WeaviateClass; - -public class App { - public static void main(String[] args) { - Config config = new Config("https", "WEAVIATE_INSTANCE_URL/"); // Replace with your Weaviate endpoint - - WeaviateClient client = new WeaviateClient(config); - - // we will create the class "Question" and the properties - WeaviateClass clazz = WeaviateClass.builder() - .className("Question") - .vectorizer("text2vec-openai") - .build(); - - // add the schema - Result result = client.schema().classCreator().withClass(clazz).run(); - if (result.hasErrors()) { - System.out.println(result.getError()); - return; - } - } -} -``` - */} + + + + :::note @@ -88,7 +63,7 @@ public class App { # Best practice: store your credentials in environment variables # export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL # export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key -# export OPENAI_API_KEY="YOUR_API_KEY" # Your OpenAI API key +# export COHERE_APIKEY="YOUR_API_KEY" # Your Cohere API key # Set batch size BATCH_ENDPOINT="$WCD_URL/v1/batch/objects" @@ -116,7 +91,7 @@ cat jeopardy_tiny.json | jq -c '.[]' | while read line; do curl -X POST "$BATCH_ENDPOINT" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $WCD_API_KEY" \ - -H "X-OpenAI-Api-Key: $OPENAI_API_KEY" \ + -H "X-Cohere-Api-Key: $COHERE_APIKEY" \ -d "$batch_data" echo "" # Print a newline for better output formatting @@ -133,7 +108,7 @@ if [ $lines_processed -ne 0 ]; then curl -X POST "$BATCH_ENDPOINT" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $WCD_API_KEY" \ - -H "X-OpenAI-Api-Key: $OPENAI_API_KEY" \ + -H "X-Cohere-Api-Key: $COHERE_APIKEY" \ -d "$batch_data" echo "" # Print a newline for better output formatting fi diff --git a/_includes/code/quickstart/quickstart.is_ready.mdx b/_includes/code/quickstart/quickstart.is_ready.mdx index 9fe6a3a4ed..1532768df0 100644 --- a/_includes/code/quickstart/quickstart.is_ready.mdx +++ b/_includes/code/quickstart/quickstart.is_ready.mdx @@ -4,6 +4,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/python/quickstart.is_ready.py'; import TSCode from '!!raw-loader!/_includes/code/typescript/quickstart.is_ready.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/1_is_ready/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/IsReady.java'; @@ -40,43 +41,17 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/1_is_r title="quickstart/1_check_readiness/main.go" /> -{/* -```java - -package io.weaviate; - -import java.util.ArrayList; -import io.weaviate.client.Config; -import io.weaviate.client.WeaviateClient; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.schema.model.DataType; -import io.weaviate.client.v1.schema.model.Property; -import io.weaviate.client.v1.schema.model.WeaviateClass; - -public class App { - public static void main(String[] args) { - Config config = new Config("https", "WEAVIATE_INSTANCE_URL/"); // Replace with your Weaviate endpoint - - WeaviateClient client = new WeaviateClient(config); - - // we will create the class "Question" and the properties - WeaviateClass clazz = WeaviateClass.builder() - .className("Question") - .vectorizer("text2vec-openai") - .build(); - - // add the schema - Result result = client.schema().classCreator().withClass(clazz).run(); - if (result.hasErrors()) { - System.out.println(result.getError()); - return; - } - } -} -``` + + + - */} ```bash diff --git a/_includes/code/quickstart/quickstart.query.neartext.mdx b/_includes/code/quickstart/quickstart.query.neartext.mdx index e4d76889a2..b429a8855e 100644 --- a/_includes/code/quickstart/quickstart.query.neartext.mdx +++ b/_includes/code/quickstart/quickstart.query.neartext.mdx @@ -4,6 +4,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/python/quickstart.query.neartext.py'; import TSCode from '!!raw-loader!/_includes/code/typescript/quickstart.query.neartext.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/3_1_neartext/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/NearText.java'; @@ -40,50 +41,24 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/3_1_ne title="quickstart/3_1_neartext/main.go" /> -{/* -```java - -package io.weaviate; - -import java.util.ArrayList; -import io.weaviate.client.Config; -import io.weaviate.client.WeaviateClient; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.schema.model.DataType; -import io.weaviate.client.v1.schema.model.Property; -import io.weaviate.client.v1.schema.model.WeaviateClass; - -public class App { - public static void main(String[] args) { - Config config = new Config("https", "WEAVIATE_INSTANCE_URL/"); // Replace with your Weaviate endpoint - - WeaviateClient client = new WeaviateClient(config); - - // we will create the class "Question" and the properties - WeaviateClass clazz = WeaviateClass.builder() - .className("Question") - .vectorizer("text2vec-openai") - .build(); - - // add the schema - Result result = client.schema().classCreator().withClass(clazz).run(); - if (result.hasErrors()) { - System.out.println(result.getError()); - return; - } - } -} -``` + + + - */} ```bash # Best practice: store your credentials in environment variables # export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL # export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key -# export OPENAI_API_KEY="YOUR_API_KEY" # Your OpenAI API key +# export COHERE_APIKEY="YOUR_API_KEY" # Your Cohere API key echo '{ "query": "{ @@ -104,7 +79,7 @@ echo '{ -X POST \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $WCD_API_KEY" \ - -H "X-OpenAI-Api-Key: $OPENAI_API_KEY" \ + -H "X-Cohere-Api-Key: $COHERE_APIKEY" \ -d @- \ $WCD_URL/v1/graphql ``` diff --git a/_includes/code/quickstart/quickstart.query.rag.mdx b/_includes/code/quickstart/quickstart.query.rag.mdx index 54ebf847f2..d97a28c7a4 100644 --- a/_includes/code/quickstart/quickstart.query.rag.mdx +++ b/_includes/code/quickstart/quickstart.query.rag.mdx @@ -4,6 +4,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/python/quickstart.query.rag.py'; import TSCode from '!!raw-loader!/_includes/code/typescript/quickstart.query.rag.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/3_2_rag/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/quickstart/RAG.java'; @@ -40,50 +41,24 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/quickstart/3_2_ra title="quickstart/3_2_rag/main.go" /> -{/* -```java - -package io.weaviate; - -import java.util.ArrayList; -import io.weaviate.client.Config; -import io.weaviate.client.WeaviateClient; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.schema.model.DataType; -import io.weaviate.client.v1.schema.model.Property; -import io.weaviate.client.v1.schema.model.WeaviateClass; - -public class App { - public static void main(String[] args) { - Config config = new Config("https", "WEAVIATE_INSTANCE_URL/"); // Replace with your Weaviate endpoint - - WeaviateClient client = new WeaviateClient(config); - - // we will create the class "Question" and the properties - WeaviateClass clazz = WeaviateClass.builder() - .className("Question") - .vectorizer("text2vec-openai") - .build(); - - // add the schema - Result result = client.schema().classCreator().withClass(clazz).run(); - if (result.hasErrors()) { - System.out.println(result.getError()); - return; - } - } -} -``` + + + - */} ```bash # Best practice: store your credentials in environment variables # export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL # export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key -# export OPENAI_API_KEY="YOUR_API_KEY" # Your OpenAI API key +# export COHERE_APIKEY="YOUR_API_KEY" # Your Cohere API key echo '{ "query": "{ @@ -116,7 +91,7 @@ echo '{ -X POST \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $WCD_API_KEY" \ - -H "X-OpenAI-Api-Key: $OPENAI_API_KEY" \ + -H "X-Cohere-Api-Key: $COHERE_APIKEY" \ -d @- \ $WCD_URL/v1/graphql ``` diff --git a/_includes/code/schema.things.create.replication.mdx b/_includes/code/schema.things.create.replication.mdx index d43d186099..e665958f52 100644 --- a/_includes/code/schema.things.create.replication.mdx +++ b/_includes/code/schema.things.create.replication.mdx @@ -22,7 +22,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl text={PyCodeV3} startMarker="# START ReplicationSettings" endMarker="# END ReplicationSettings" - language="py" + language="pyv3" /> @@ -40,7 +40,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl text={TSCodeLegacy} startMarker="// START ReplicationSettings" endMarker="// END ReplicationSettings" - language="ts" + language="tsv2" /> diff --git a/_includes/code/starter-guides/custom-vectors-ts3.ts b/_includes/code/starter-guides/custom-vectors-ts3.ts index 64e3dc8d01..b09ab3978b 100644 --- a/_includes/code/starter-guides/custom-vectors-ts3.ts +++ b/_includes/code/starter-guides/custom-vectors-ts3.ts @@ -16,11 +16,11 @@ const WCD_API_KEY=process.env["WCD_API_KEY"]; const OPENAI_API_KEY=process.env["OPENAI_API_KEY"]; const client: WeaviateClient = await weaviate.connectToWeaviateCloud( - WCD_URL, + WCD_URL as string, { - authCredentials: new weaviate.ApiKey(WCD_API_KEY), + authCredentials: new weaviate.ApiKey(WCD_API_KEY as string), headers: { - 'X-OpenAI-Api-Key': OPENAI_API_KEY, + 'X-OpenAI-Api-Key': OPENAI_API_KEY as string, } } ) diff --git a/_includes/code/typescript/local.quickstart.create_collection.ts b/_includes/code/typescript/local.quickstart.create_collection.ts new file mode 100644 index 0000000000..2ca5b25d8f --- /dev/null +++ b/_includes/code/typescript/local.quickstart.create_collection.ts @@ -0,0 +1,26 @@ +// CreateCollection +import weaviate, { WeaviateClient, vectorizer, generative } from 'weaviate-client'; + +const client: WeaviateClient = await weaviate.connectToLocal(); + +// END CreateCollection +// Delete this collection if it already exists +await client.collections.delete('Question'); + +// CreateCollection +// highlight-start +await client.collections.create({ + name: 'Question', + vectorizers: vectorizer.text2VecOllama({ // Configure the Ollama embedding integration + apiEndpoint: 'http://host.docker.internal:11434', // Allow Weaviate from within a Docker container to contact your Ollama instance + model: 'nomic-embed-text', // The model to use + }), + generative: generative.ollama({ // Configure the Ollama generative integration + apiEndpoint: 'http://host.docker.internal:11434', // Allow Weaviate from within a Docker container to contact your Ollama instance + model: 'llama3.2', // The model to use + }), +}); +// highlight-end + +client.close(); // Close the client connection +// END CreateCollection diff --git a/_includes/code/typescript/local.quickstart.import_objects.ts b/_includes/code/typescript/local.quickstart.import_objects.ts new file mode 100644 index 0000000000..910c239832 --- /dev/null +++ b/_includes/code/typescript/local.quickstart.import_objects.ts @@ -0,0 +1,28 @@ +// Import +import weaviate, { WeaviateClient } from 'weaviate-client'; + +const client: WeaviateClient = await weaviate.connectToLocal(); + +// Load data +async function getJsonData() { + const file = await fetch( + 'https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json' + ); + return file.json(); +} + +// highlight-start +// Note: The TS client does not have a `batch` method yet +// We use `insertMany` instead, which sends all of the data in one request +async function importQuestions() { + const questions = client.collections.get('Question'); + const data = await getJsonData(); + const result = await questions.data.insertMany(data); + console.log('Insertion response: ', result); +} + +await importQuestions(); +// highlight-end + +client.close(); // Close the client connection +// END Import diff --git a/_includes/code/typescript/local.quickstart.is_ready.ts b/_includes/code/typescript/local.quickstart.is_ready.ts new file mode 100644 index 0000000000..f218b7b6ee --- /dev/null +++ b/_includes/code/typescript/local.quickstart.is_ready.ts @@ -0,0 +1,13 @@ +// InstantiationExample +import weaviate, { WeaviateClient } from 'weaviate-client'; + +// highlight-start +const client: WeaviateClient = await weaviate.connectToLocal(); +// highlight-end + +var clientReadiness = await client.isReady(); + +console.log(clientReadiness); // Should return `true` + +client.close(); // Close the client connection +// END InstantiationExample diff --git a/_includes/code/typescript/local.quickstart.query.neartext.ts b/_includes/code/typescript/local.quickstart.query.neartext.ts new file mode 100644 index 0000000000..8692e96cd5 --- /dev/null +++ b/_includes/code/typescript/local.quickstart.query.neartext.ts @@ -0,0 +1,19 @@ +// NearText +import weaviate, { WeaviateClient } from 'weaviate-client'; + +const client: WeaviateClient = await weaviate.connectToLocal(); + +// highlight-start +const questions = client.collections.get('Question'); + +const result = await questions.query.nearText('biology', { + limit: 2, +}); +// highlight-end + +result.objects.forEach((item) => { + console.log(JSON.stringify(item.properties, null, 2)); +}); + +client.close(); // Close the client connection +// END NearText diff --git a/_includes/code/typescript/local.quickstart.query.rag.ts b/_includes/code/typescript/local.quickstart.query.rag.ts new file mode 100644 index 0000000000..98e6287f84 --- /dev/null +++ b/_includes/code/typescript/local.quickstart.query.rag.ts @@ -0,0 +1,23 @@ +// RAG +import weaviate, { WeaviateClient } from 'weaviate-client'; + +const client: WeaviateClient = await weaviate.connectToLocal(); + +// highlight-start +const questions = client.collections.get('Question'); + +const result = await questions.generate.nearText( + 'biology', + { + groupedTask: 'Write a tweet with emojis about these facts.', + }, + { + limit: 2, + } +); +// highlight-end + +console.log(result.generated); + +client.close(); // Close the client connection +// END RAG diff --git a/_includes/code/typescript/quickstart.create_collection.ts b/_includes/code/typescript/quickstart.create_collection.ts index 5d5b2b4498..695f58c3f1 100644 --- a/_includes/code/typescript/quickstart.create_collection.ts +++ b/_includes/code/typescript/quickstart.create_collection.ts @@ -20,8 +20,8 @@ await client.collections.delete('Question'); // highlight-start await client.collections.create({ name: 'Question', - vectorizers: vectorizer.text2VecOpenAI(), - generative: generative.openAI(), + vectorizers: vectorizer.text2VecCohere(), + generative: generative.cohere(), }); // highlight-end diff --git a/_includes/code/typescript/quickstart.import_objects.ts b/_includes/code/typescript/quickstart.import_objects.ts index 4636c907d5..da6fbbbc97 100644 --- a/_includes/code/typescript/quickstart.import_objects.ts +++ b/_includes/code/typescript/quickstart.import_objects.ts @@ -4,7 +4,7 @@ import weaviate, { WeaviateClient } from 'weaviate-client'; // Best practice: store your credentials in environment variables const wcdUrl = process.env.WCD_URL as string; const wcdApiKey = process.env.WCD_API_KEY as string; -const openAIKey = process.env.OPENAI_APIKEY as string; +const cohereKey = process.env.COHERE_APIKEY as string; const client: WeaviateClient = await weaviate.connectToWeaviateCloud( wcdUrl, // Replace with your Weaviate Cloud URL @@ -12,7 +12,7 @@ const client: WeaviateClient = await weaviate.connectToWeaviateCloud( authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key // highlight-start headers: { - 'X-OpenAI-Api-Key': openAIKey, // Replace with your OpenAI API key + 'X-Cohere-Api-Key': cohereKey, // Replace with your Cohere API key }, // highlight-end } diff --git a/_includes/code/typescript/quickstart.is_ready.ts b/_includes/code/typescript/quickstart.is_ready.ts index 4ce963b68b..98ed119363 100644 --- a/_includes/code/typescript/quickstart.is_ready.ts +++ b/_includes/code/typescript/quickstart.is_ready.ts @@ -5,12 +5,14 @@ import weaviate, { WeaviateClient } from 'weaviate-client'; const wcdUrl = process.env.WCD_URL as string; const wcdApiKey = process.env.WCD_API_KEY as string; +// highlight-start const client: WeaviateClient = await weaviate.connectToWeaviateCloud( wcdUrl, // Replace with your Weaviate Cloud URL { authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key } ); +// highlight-end var clientReadiness = await client.isReady(); console.log(clientReadiness); // Should return `true` diff --git a/_includes/code/typescript/quickstart.query.neartext.ts b/_includes/code/typescript/quickstart.query.neartext.ts index e8d1c66351..621e6064bf 100644 --- a/_includes/code/typescript/quickstart.query.neartext.ts +++ b/_includes/code/typescript/quickstart.query.neartext.ts @@ -4,7 +4,7 @@ import weaviate, { WeaviateClient } from 'weaviate-client'; // Best practice: store your credentials in environment variables const wcdUrl = process.env.WCD_URL as string; const wcdApiKey = process.env.WCD_API_KEY as string; -const openAIKey = process.env.OPENAI_APIKEY as string; +const cohereKey = process.env.COHERE_APIKEY as string; const client: WeaviateClient = await weaviate.connectToWeaviateCloud( wcdUrl, // Replace with your Weaviate Cloud URL @@ -12,7 +12,7 @@ const client: WeaviateClient = await weaviate.connectToWeaviateCloud( authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key // highlight-start headers: { - 'X-OpenAI-Api-Key': openAIKey, // Replace with your OpenAI API key + 'X-Cohere-Api-Key': cohereKey, // Replace with your Cohere API key }, // highlight-end } diff --git a/_includes/code/typescript/quickstart.query.rag.ts b/_includes/code/typescript/quickstart.query.rag.ts index 3a32fb9dc5..ed2d16aa08 100644 --- a/_includes/code/typescript/quickstart.query.rag.ts +++ b/_includes/code/typescript/quickstart.query.rag.ts @@ -4,7 +4,7 @@ import weaviate, { WeaviateClient } from 'weaviate-client'; // Best practice: store your credentials in environment variables const wcdUrl = process.env.WCD_URL as string; const wcdApiKey = process.env.WCD_API_KEY as string; -const openAIKey = process.env.OPENAI_APIKEY as string; +const cohereKey = process.env.COHERE_APIKEY as string; const client: WeaviateClient = await weaviate.connectToWeaviateCloud( wcdUrl, // Replace with your Weaviate Cloud URL @@ -12,7 +12,7 @@ const client: WeaviateClient = await weaviate.connectToWeaviateCloud( authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key // highlight-start headers: { - 'X-OpenAI-Api-Key': openAIKey, // Replace with your OpenAI API key + 'X-Cohere-Api-Key': cohereKey, // Replace with your Cohere API key }, // highlight-end } diff --git a/_includes/collection-mutable-parameters.mdx b/_includes/collection-mutable-parameters.mdx index 42570cbd77..0dbde5d731 100644 --- a/_includes/collection-mutable-parameters.mdx +++ b/_includes/collection-mutable-parameters.mdx @@ -8,6 +8,10 @@ - `additions` - `preset` - `removals` +- `moduleConfig` (generative & reranker modules only, from `1.26.8` and `v1.27.1`) +- `multiTenancyConfig` + - `autoTenantCreation` (introduced in `v1.25.0`) + - `autoTenantActivation` (introduced in `v1.25.2`) - `replicationConfig` - `asyncEnabled` (introduced in `v1.26.0`) - `factor` (not mutable in `v1.25` or higher) @@ -28,6 +32,3 @@ - `distribution` - `skip` - `vectorCacheMaxObjects` -- `MultiTenancyConfig` - - `autoTenantCreation` (introduced in `v1.25.0`) - - `autoTenantActivation` (introduced in `v1.25.2`) diff --git a/_includes/gcp.token.expiry.notes.mdx b/_includes/gcp.token.expiry.notes.mdx index 0b33a80090..74a8a0cd08 100644 --- a/_includes/gcp.token.expiry.notes.mdx +++ b/_includes/gcp.token.expiry.notes.mdx @@ -39,7 +39,7 @@ def re_instantiate_weaviate() -> weaviate.Client: client = weaviate.Client( url = "https://WEAVIATE_INSTANCE_URL", # Replace WEAVIATE_INSTANCE_URL with the URL additional_headers = { - "X-Google-Vertex-Api-Key": token, + "X-Goog-Vertex-Api-Key": token, } ) return client @@ -98,7 +98,7 @@ def re_instantiate_weaviate() -> weaviate.Client: cluster_url="https://WEAVIATE_INSTANCE_URL", # Replace WEAVIATE_INSTANCE_URL with the URL auth_credentials=Auth.api_key(weaviate_api_key), # Replace with your Weaviate Cloud key headers={ - "X-Google-Vertex-Api-Key": token, + "X-Goog-Vertex-Api-Key": token, }, ) return client diff --git a/_includes/mutable-generative-config.md b/_includes/mutable-generative-config.md new file mode 100644 index 0000000000..62b56d904f --- /dev/null +++ b/_includes/mutable-generative-config.md @@ -0,0 +1,3 @@ +:::info Generative model integration mutability +A collection's `generative` model integration configuration is mutable from `v1.25.23`, `v1.26.8` and `v1.27.1`. See [this section](/developers/weaviate/manage-data/collections#update-the-generative-model-integration) for details on how to update the collection configuration. +::: diff --git a/_includes/mutable-reranker-config.md b/_includes/mutable-reranker-config.md new file mode 100644 index 0000000000..bbbe9eaf1d --- /dev/null +++ b/_includes/mutable-reranker-config.md @@ -0,0 +1,3 @@ +:::info Generative model integration mutable from `v1.25.23`, `v1.26.8` and `v1.27.1` +A collection's `reranker` model integration configuration is mutable from `v1.25.23`, `v1.26.8` and `v1.27.1`. See [this section](/developers/weaviate/manage-data/collections#update-the-reranker-model-integration) for details on how to update the collection configuration. +::: diff --git a/_includes/release-history.md b/_includes/release-history.md new file mode 100644 index 0000000000..ae1929ad77 --- /dev/null +++ b/_includes/release-history.md @@ -0,0 +1,45 @@ +This table lists the Weaviate core versions and corresponding client library versions. + +| Weaviate
([GitHub][cWeaviate]) | First
release date | Python
([GitHub][cPython]) | TypeScript/
JavaScript
([GitHub][cTypeScript]) | Go
([GitHub][cGo]) | Java
([GitHub][cJava]) | +| :- | :- | :-: | :-: | :-: | :-: | +| 1.28.x | 2024-12-11 | 4.10.x | TBC | TBC | TBC | +| 1.27.x | 2024-10-16 | 4.9.x | 3.2.x | 4.16.x | 5.0.x
4.9.x | +| 1.26.x | 2024-07-22 | 4.7.x | 3.1.x | 4.15.x | 4.8.x | +| 1.25.x | 2024-05-10 | 4.6.x | 2.1.x | 4.13.x | 4.6.x | +| 1.24.x | 2024-02-27 | 4.5.x | 2.0.x | 4.10.x | 4.4.x | +| 1.23.x | 2023-12-18 | 3.26.x | 1.5.x | 4.10.x | 4.4.x | +| 1.22.x | 2023-10-27 | 3.25.x | 1.5.x | 4.10.x | 4.3.x | +| 1.21.x | 2023-08-17 | 3.22.x | 1.4.x | 4.9.x | 4.2.x | +| 1.20.x | 2023-07-06 | 3.22.x | 1.1.x | 4.7.x | 4.2.x | +| 1.19.x | 2023-05-04 | 3.17.x | 1.1.x[1](#typescript-client-change)| 4.7.x | 4.0.x | +| 1.18.x | 2023-03-07 | 3.13.x | 2.14.x | 4.6.x | 3.6.x | +| 1.17.x | 2022-12-20 | 3.9.x | 2.14.x | 4.5.x | 3.5.x | +| 1.16.x | 2022-10-31 | 3.8.x | 2.13.x | 4.4.x | 3.4.x | +| 1.15.x | 2022-09-07 | 3.6.x | 2.12.x | 4.3.x | 3.3.x | +| 1.14.x | 2022-07-07 | 3.6.x | 2.11.x | 4.2.x | 3.2.x | +| 1.13.x | 2022-05-03 | 3.4.x | 2.9.x | 4.0.x | 2.4.x | +| 1.12.x | 2022-04-05 | 3.4.x | 2.8.x | 3.0.x | 2.3.x | +| 1.11.x | 2022-03-14 | 3.2.x | 2.7.x | 2.6.x | 2.3.x | +| 1.10.x | 2022-01-27 | 3.1.x | 2.5.x | 2.4.x | 2.1.x | +| 1.9.x | 2021-12-10 | 3.1.x | 2.4.x | 2.4.x | 2.1.x | +| 1.8.x | 2021-11-30 | 3.1.x | 2.4.x | 2.3.x | 1.1.x | +| 1.7.x | 2021-09-01 | 3.1.x | 2.4.x | 2.3.x | 1.1.x | +| 1.6.x | 2021-08-11 | 2.4.x | 2.3.x | 2.2.x | 1.0.x | +| 1.5.x | 2021-07-13 | 2.2.x | 2.1.x | 2.1.x | 1.0.x | +| 1.4.x | 2021-06-09 | 2.2.x | 2.1.x | 2.1.x | 1.0.x | +| 1.3.x | 2021-04-23 | 2.2.x | 2.1.x | 2.1.x | 1.0.x | +| 1.2.x | 2021-03-15 | 2.2.x | 2.0.x | 1.1.x | - | +| 1.1.x | 2021-02-10 | 2.1.x | - | - | - | +| 1.0.x | 2021-01-14 | 2.0.x | - | - | - | + +#### TypeScript client change + +The [TypeScript client](https://github.com/weaviate/typescript-client) replaced the [JavaScript client](https://github.com/weaviate/weaviate-javascript-client) on 2023-03-17. + +[comment]: # ( repo links ) + +[cWeaviate]: https://github.com/weaviate/weaviate/releases +[cPython]: https://github.com/weaviate/weaviate-python-client/releases +[cTypeScript]: https://github.com/weaviate/typescript-client/releases +[cGo]: https://github.com/weaviate/weaviate-go-client/releases +[cJava]: https://github.com/weaviate/java-client/releases diff --git a/_includes/tokenization_definition.mdx b/_includes/tokenization_definition.mdx index 616a9e4d2c..5127a6b0bd 100644 --- a/_includes/tokenization_definition.mdx +++ b/_includes/tokenization_definition.mdx @@ -6,4 +6,5 @@ | `field` | Index the whole field after trimming whitespace characters. | `Hello, (beautiful) world` | | `trigram` | Split the property as rolling trigrams. | `Hel`, `ell`, `llo`, `lo,`, ... | | `gse` | Use the `gse` tokenizer to split the property. | [See `gse` docs](https://pkg.go.dev/github.com/go-ego/gse#section-readme) | -| `kagome_kr` | Use the `Kagome` tokenizer with a Korean dictionary to split the property. | [See `kagome` docs](https://github.com/ikawaha/kagome) and the [Korean dictionary](https://github.com/ikawaha/kagome-dict-ko) | +| `kagome_ja` | Use the `Kagome` tokenizer with a Japanese (IPA) dictionary to split the property. | [See `kagome` docs](https://github.com/ikawaha/kagome) and the [dictionary](https://github.com/ikawaha/kagome-dict/). | +| `kagome_kr` | Use the `Kagome` tokenizer with a Korean dictionary to split the property. | [See `kagome` docs](https://github.com/ikawaha/kagome) and the [Korean dictionary](https://github.com/ikawaha/kagome-dict-ko). | diff --git a/apple-and-weaviate/2024-07-02-create-and-load-a-weaviate-cluster/index.mdx b/apple-and-weaviate/2024-07-02-create-and-load-a-weaviate-cluster/index.mdx index 3fcee03133..332596aca4 100644 --- a/apple-and-weaviate/2024-07-02-create-and-load-a-weaviate-cluster/index.mdx +++ b/apple-and-weaviate/2024-07-02-create-and-load-a-weaviate-cluster/index.mdx @@ -9,12 +9,9 @@ image: ./img/hero.png --- ![Set up a Weaviate Cluster on WCD and load in book data using a python data pipeline that can be searched through your iOS and other Apple Ecosystem Applications.](./img/hero.png) - -## Overview - In this article we will setup a Weaviate Cluster and load the same books data used in the article [IOS Intro - Search with Benefits](/apple-and-weaviate/apple-apps-part-1). -You can download the resources used in this blog [here](https://github.com/weaviate/BookRecs/blob/main/blog-resources/article05.zip). +You can download the resources used in this blog [here](https://github.com/weaviate/BookRecs/blob/main/blog-resources/article05.zip). ### Quckstart @@ -50,11 +47,11 @@ Create an Xcode Project using External Builder as described in **External Builde ![create-xcode-project](./img/create-xcode-project.png) -## Install Weaviate Client +## Install Weaviate Client From the root directory of your Xcode Project, install the Weaviate Client. - pip install -U weaviate-client + pip install -U weaviate-client Refer to the section **Install Python Packages and Setup a Virtual Environment** in the article **External Builder (Xcode) for Python** for guidance diff --git a/apple-and-weaviate/2024-07-02-external-builder-xcode-for-python/index.mdx b/apple-and-weaviate/2024-07-02-external-builder-xcode-for-python/index.mdx index c031219e6c..84ee2d2a7f 100644 --- a/apple-and-weaviate/2024-07-02-external-builder-xcode-for-python/index.mdx +++ b/apple-and-weaviate/2024-07-02-external-builder-xcode-for-python/index.mdx @@ -9,8 +9,6 @@ image: ./img/external-builder-hero.png --- ![Use Xcode to run your Python datapipelines. This article explains how you can set up external builders to integrate Python into your Xcode workflows.](./img/external-builder-hero.png) -## Overview - Xcode itself isn't built for directly developing and building Python projects. However, you can leverage external builders to integrate Python development into your Xcode workflow. Using Xcode to run python scripts is an alternative to using a native to python playground like Jupyter while allowing you to use a development tool you are familiar with. diff --git a/apple-and-weaviate/2024-07-02-running-python-on-your-mac/index.mdx b/apple-and-weaviate/2024-07-02-running-python-on-your-mac/index.mdx index c68203cb87..2777bd70eb 100644 --- a/apple-and-weaviate/2024-07-02-running-python-on-your-mac/index.mdx +++ b/apple-and-weaviate/2024-07-02-running-python-on-your-mac/index.mdx @@ -9,8 +9,6 @@ image: ./img/python-on-mac-hero.png --- ![Many data science frameworks are written in Python. In this article we'll get set up to run Python on your Mac!](./img/python-on-mac-hero.png) -## Overview - Weaviate and other data science frameworks are making Python a powerful tool for data analysis on the Mac. Get ready to use them in your workflow. ![overview-python](./img/overview-python.png) @@ -32,7 +30,7 @@ There are several ways to get Python up and running on your Mac: 1. Official Python Installer: Download the latest version directly from the [Python website](https://www.python.org/downloads/). This is a straightforward approach. -2. [Anaconda](https://anaconda.cloud/getting-started): This popular distribution includes Python along with a vast collection of scientific computing and data science packages. This method simplifies installation and is recommended. +2. [Anaconda](https://anaconda.cloud/getting-started): This popular distribution includes Python along with a vast collection of scientific computing and data science packages. This method simplifies installation and is recommended. 3. Homebrew: This package manager allows you to install various software on your Mac, including Python. It offers flexibility for managing multiple Python versions. @@ -54,8 +52,8 @@ Consider having a project01 directory that includes a volume calculator applicat Let's walk through setting up a virtual environment for your Python project, assuming you already have user installed version of Python in place. We'll use the project01 directory as an example: -Navigate to the project directory: Open your terminal and use the cd command to switch to the directory containing your project files. For instance, if project01 is on your desktop, you might type... - +Navigate to the project directory: Open your terminal and use the cd command to switch to the directory containing your project files. For instance, if project01 is on your desktop, you might type... + cd ~/Desktop/project01. **Create the virtual environment**: Use the following command in your terminal, replacing the last venv parameter with your desired virtual environment name: @@ -65,7 +63,7 @@ Navigate to the project directory: Open your terminal and use the cd command to This creates a new directory named venv in your project directory. It contains all the necessary files for a separate Python environment. -**Activate the virtual environment**: Tell your terminal to use the newly created virtual environment. +**Activate the virtual environment**: Tell your terminal to use the newly created virtual environment. source venv/bin/activate @@ -91,15 +89,15 @@ These commands help you verify your Python setup: **Version of Python**: -This will display the version of Python currently in use by your terminal. +This will display the version of Python currently in use by your terminal. On my Mac, it currently shows Python 3.11.7. - python --version + python --version **Path to Python Executable**: -This will show the location of the Python executable (via an alias) that your terminal is using. +This will show the location of the Python executable (via an alias) that your terminal is using. which python diff --git a/authors.yml b/authors.yml index 9454412f00..213d9c3f2e 100644 --- a/authors.yml +++ b/authors.yml @@ -7,11 +7,15 @@ alea: name: Alea Abed title: Head of Marketing image_url: /img/people/icon/alea.jpg +alvin: + name: Alvin Richards + title: Head of Product + image_url: /img/people/icon/alvin.jpg ara: name: Ara Gonzalez title: People Operations Manager url: https://linkedin.com/in/aranzazugonzalez - image_url: /img/people/icon/ara.png + image_url: /img/people/icon/ara.jpg bob: name: Bob van Luijt title: CEO @@ -21,7 +25,7 @@ byron: name: Byron Voorbach title: Head of Customer Success url: https://github.com/byronvoorbach - image_url: /img/people/icon/byron.png + image_url: /img/people/icon/byron.jpg connor: name: Connor Shorten title: Product Researcher @@ -61,12 +65,12 @@ ieva: name: Ieva Urbaite title: Marketing url: https://www.linkedin.com/in/ievaurbaite/ - image_url: /img/people/icon/ieva.png + image_url: /img/people/icon/ieva.jpg jessie: name: Jessie de Groot title: Head of People and Culture url: https://linkedin.com/in/jessiedegroot/ - image_url: /img/people/icon/jessie.png + image_url: /img/people/icon/jessie.jpg jp: name: Joon-Pil (JP) Hwang title: Educator @@ -79,7 +83,7 @@ laura: image_url: /img/people/icon/laura.jpg leonie: name: Leonie Monigatti - title: Developer Advocate + title: Machine Learning Engineer url: https://www.linkedin.com/in/804250ab/ image_url: /img/people/icon/leonie.jpg marion: @@ -91,7 +95,7 @@ mary: name: Mary Newhauser title: Machine Learning Engineer url: https://www.linkedin.com/in/mary-newhauser-02273551/ - image_url: /img/people/icon/mary.png + image_url: /img/people/icon/mary.jpg pete: name: Peter Schramm title: WCD Tech Lead @@ -111,7 +115,7 @@ svitlana: name: Svitlana Smolianova title: Head of Design url: https://linkedin.com/in/svitlana-sm - image_url: /img/people/icon/svitlana.png + image_url: /img/people/icon/svitlana.jpg zain: name: Zain Hasan title: Developer Advocate @@ -121,12 +125,12 @@ john: name: John Trengrove title: Head of Applied Research url: https://github.com/trengrj - image_url: /img/people/icon/john.png + image_url: /img/people/icon/john.jpg shukri: name: Mohd Shukri Hasan title: Integration Solution Engineer url: https://github.com/hsm207 - image_url: /img/people/icon/shukri.jpeg + image_url: /img/people/icon/shukri.jpg tommy: name: Tommy Smith title: Polyglot Engineer @@ -136,12 +140,12 @@ jerry: name: Jerry Liu title: Co-Founder/CEO LlamaIndex url: https://github.com/jerryjliu - image_url: /img/people/icon/jerry.png + image_url: /img/people/icon/jerry.jpg sam: name: Sam Stoelinga title: Contributor to Substratus.AI url: https://github.com/samos123 - image_url: /img/people/icon/sam.png + image_url: /img/people/icon/sam.jpg femke: name: Femke Plantinga title: Content Manager @@ -159,12 +163,12 @@ victoria: name: Victoria Slocum title: Machine Learning Engineer url: https://www.linkedin.com/in/victorialslocum/ - image_url: /img/people/icon/victoria.png + image_url: /img/people/icon/victoria.jpg adam: name: Adam Chan title: Developer Growth Engineer url: https://www.linkedin.com/in/itsajchan/ - image_url: /img/people/icon/adam.png + image_url: /img/people/icon/adam.jpg asdine: name: Asdine El Hrychy title: Software Engineer @@ -174,22 +178,32 @@ ajit: name: Ajit Mistry title: Developer Growth Intern url: https://github.com/ajit283 - image_url: /img/people/icon/ajit.png + image_url: /img/people/icon/ajit.jpg amir: name: Amir Houieh title: Founder & CEO of Unbody url: https://www.unbody.io/ - image_url: /img/people/icon/amir.jpeg + image_url: /img/people/icon/amir.jpg +hossein: + name: Hossein Mehrabi + title: Founder & CTO of Unbody + url: https://github.com/jeangovil + image_url: /img/people/icon/hossein.jpg charles: name: Charles Frye title: AI Engineer url: https://twitter.com/charles_irl - image_url: /img/people/icon/charles-modal.png + image_url: /img/people/icon/charles-modal.jpg randy: name: Randy Fong title: Senior iOS Developer url: https://www.linkedin.com/in/randy-fong-1530545/ - image_url: /img/people/icon/randy.jpeg + image_url: /img/people/icon/randy.jpg +aman: + name: Aman Sharma + title: CTO @Lamatic.ai + url: https://www.linkedin.com/in/amanintech + image_url: /img/people/icon/aman.jpg charles-pierse: name: Charles Pierse title: Head of Weaviate Labs @@ -204,5 +218,29 @@ deepti: name: Deepti Naidu title: Partner Solution Engineer url: https://www.linkedin.com/in/deeptinaidu/ - image_url: /img/people/icon/deepti.png - + image_url: /img/people/icon/deepti.jpg +tony: + name: Tony Le + title: Business Development Director + url: https://www.linkedin.com/in/tony-l-35a305b/ + image_url: /img/people/icon/tony.jpg +jobi: + name: Jobi George + title: Head of Partnerships + url: https://www.linkedin.com/in/jobigeorge/ + image_url: /img/people/icon/jobi.jpg +spiros: + name: Spiros + title: Head of Security + url: https://github.com/spiros-spiros + image_url: /img/people/icon/spiros.jpg +staci: + name: Staci Blue + title: Event Marketing Manager + url: https://www.linkedin.com/in/staci-blue/ + image_url: /img/people/icon/staci.jpg +charly: + name: Charly Poly + title: Developer Marketer at Inngest + url: https://www.linkedin.com/in/charly-poly/ + image_url: /img/people/icon/charly.jpeg diff --git a/blog/2021-01-25-history-of-weaviate/img/vector-space.jpeg b/blog/2021-01-25-history-of-weaviate/img/vector-space.jpeg deleted file mode 100644 index d3ce150bba..0000000000 Binary files a/blog/2021-01-25-history-of-weaviate/img/vector-space.jpeg and /dev/null differ diff --git a/blog/2021-01-25-history-of-weaviate/img/vector-space.jpg b/blog/2021-01-25-history-of-weaviate/img/vector-space.jpg new file mode 100644 index 0000000000..5406ef1666 Binary files /dev/null and b/blog/2021-01-25-history-of-weaviate/img/vector-space.jpg differ diff --git a/blog/2021-01-25-history-of-weaviate/img/weaviate-console.jpeg b/blog/2021-01-25-history-of-weaviate/img/weaviate-console.jpeg deleted file mode 100644 index c41cd66ab5..0000000000 Binary files a/blog/2021-01-25-history-of-weaviate/img/weaviate-console.jpeg and /dev/null differ diff --git a/blog/2021-01-25-history-of-weaviate/img/weaviate-console.jpg b/blog/2021-01-25-history-of-weaviate/img/weaviate-console.jpg new file mode 100644 index 0000000000..3fb40de26b Binary files /dev/null and b/blog/2021-01-25-history-of-weaviate/img/weaviate-console.jpg differ diff --git a/blog/2021-01-25-history-of-weaviate/index.mdx b/blog/2021-01-25-history-of-weaviate/index.mdx index 7b28dd96cf..85fd5f4001 100644 --- a/blog/2021-01-25-history-of-weaviate/index.mdx +++ b/blog/2021-01-25-history-of-weaviate/index.mdx @@ -52,7 +52,7 @@ Finding more context around a word has to do with a concept called disambiguatio To validate if we could disambiguate the word "apple" the following simple step was taken. What if we looked for all the words that are in the neighborhood of the space in between "apple" and "fruit"? Turns out the results are way better! We can disambiguate by moving through the hyperspace while using individual words as beacons to navigate. -![Vector Space](./img/vector-space.jpeg) +![Vector Space](./img/vector-space.jpg) In the next step, the goal was to validate if we could keep semantic meaning when storing a data object in the hyperspace by calculating the centroid using the individual words as beacons. We did that as follows, the title of this Vogue article: "Louis Vuitton's New Capsule with League of Legends Brings French High Fashion to Online Gaming — and Vice Versa". @@ -90,7 +90,7 @@ Examples of implementations include: classification of invoices into categories, ## The Future Weaviate will stay fully open source for the community to use. The team is growing to accelerate building Weaviate and supporting users. We are releasing new features very frequently, like new vector indexes and search pipeline features, and Weaviate Cloud and Weaviate Query App. -![Weaviate Console](./img/weaviate-console.jpeg) +![Weaviate Console](./img/weaviate-console.jpg) ## Listen to Bob's story at the Open Source Data Want to learn more about the background of Vector Search and how the ecosystem is developing? [Listen to Sam Ramji from DataStax interviewing Bob van Luijt about Vector Search and the AI stack.](https://www.datastax.com/resources/podcast/vector-search-ai-stack-more-bob-van-luijt). diff --git a/blog/2022-06-23-the-ai-first-database-ecosystem/img/hero.jpeg b/blog/2022-06-23-the-ai-first-database-ecosystem/img/hero.jpg similarity index 100% rename from blog/2022-06-23-the-ai-first-database-ecosystem/img/hero.jpeg rename to blog/2022-06-23-the-ai-first-database-ecosystem/img/hero.jpg diff --git a/blog/2022-06-23-the-ai-first-database-ecosystem/index.mdx b/blog/2022-06-23-the-ai-first-database-ecosystem/index.mdx index 143cdfa6bc..7ffef54845 100644 --- a/blog/2022-06-23-the-ai-first-database-ecosystem/index.mdx +++ b/blog/2022-06-23-the-ai-first-database-ecosystem/index.mdx @@ -4,12 +4,12 @@ slug: the-ai-first-database-ecosystem authors: [bob] date: 2022-06-23 tags: ['concepts'] -image: ./img/hero.jpeg +image: ./img/hero.jpg # canonical-url: https://www.forbes.com/sites/forbestechcouncil/2022/06/23/the-ai-first-database-ecosystem/ # canonical-name: Forbes description: "Learn about the vision of the AI-First Database Ecosystem, which drives the R&D of the databases of the future." --- -![The AI-First Database Ecosystem](./img/hero.jpeg) +![The AI-First Database Ecosystem](./img/hero.jpg) diff --git a/blog/2022-09-07-weaviate-1-15-release/img/ordered-imports.png b/blog/2022-09-07-weaviate-1-15-release/img/ordered-imports.png index 9d5dd92251..a1eb529eb9 100644 Binary files a/blog/2022-09-07-weaviate-1-15-release/img/ordered-imports.png and b/blog/2022-09-07-weaviate-1-15-release/img/ordered-imports.png differ diff --git a/blog/2022-09-13-why-is-vector-search-so-fast/img/hero.png b/blog/2022-09-13-why-is-vector-search-so-fast/img/hero.png deleted file mode 100644 index bab4344706..0000000000 Binary files a/blog/2022-09-13-why-is-vector-search-so-fast/img/hero.png and /dev/null differ diff --git a/blog/2022-09-13-why-is-vector-search-so-fast/index.mdx b/blog/2022-09-13-why-is-vector-search-so-fast/index.mdx deleted file mode 100644 index 1c338f38a7..0000000000 --- a/blog/2022-09-13-why-is-vector-search-so-fast/index.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Why is Vector Search so fast? -slug: why-is-vector-search-so-fast -authors: [laura] -date: 2022-09-13 -tags: ['search'] -image: ./img/hero.png -description: "Vector Databases can run semantic queries on multi-million datasets in milliseconds. How is that possible?" ---- -![Why is Vector Search so fast?](./img/hero.png) - - - -## Why is this so incredibly fast? - -Whenever I talk about vector search, I like to demonstrate it with an example of a semantic search. To add the wow factor, I like to run my queries on a Wikipedia dataset, which is populated with over 28 million paragraphs sourced from Wikipedia. - -For example, I can query Weaviate for articles related to: "urban planning in Europe", and the vector database (in the case of my demo – [Weaviate](/developers/weaviate/)) responds with a series of articles about the topic, such as "The cities designed to be capitals".
-You can try it for yourself by following this [link](https://link.weaviate.io/3LiVxqp), which is already pre-populated with the above question. Press the play button, to see the magic happen. - -Here is the thing, finding the correct answer in a gigantic repository of unstructured data is not the most impressive part of this demonstration (I mean, it is very impressive), but it is the 🚀 speed at which it all happens. It takes a fraction of a second for the UI to show the results. - -We are talking about a semantic search query, which **takes milliseconds** to find an answer in a dataset containing **28 million paragraphs**. Interestingly enough, it takes longer to render the results than it takes the vector database to find the answer. - -*Note, a semantic search is unlike a regular keywords search (which matches keywords like-for-like), but instead, we are searching for answers based on the semantic meaning of our query and data.* - -The inevitable question that follows up this demonstration is always: - -> Why is this so incredibly fast? - -## What is a vector search? -To answer this question we need to look at how vector databases work. - -Vector databases index data, unlike other databases, based on data vectors (or vector embeddings). Vector embeddings capture the meaning and context of data, usually predicted by Machine Learning models. - -At the time of entry/import (or any significant changes to data objects), for every new/updated data object, vector databases use Machine Learning models to predict and calculate vector embeddings, which then are stored together with the object. - -> Every data object in a dataset gets a vector - -In a nutshell, vector embeddings are an array of numbers, which can be used as coordinates in a high-dimensional space. Although it is hard to imagine coordinates in more than 3-dimensional space (x, y, z), we can still use the vectors to compute the distance between vectors, which can be used to indicate similarity between objects.
- -There are many different distance metrics, like [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) and [Euclidean distance (L2 distance)](https://en.wikipedia.org/wiki/Euclidean_distance). - -### The search part -In a similar fashion, whenever we run a query (like: "What is the tallest building in Berlin?"), a vector database can also convert it to a "query" vector. The task of a vector database is to identify and retrieve a list of vectors that are closest to the given vector of your query, using a distance metric and a search algorithm. - -This is a bit like a game of boules – where the small marker (jack) is the location of our query vector, and the balls (boules) are our data vectors – and we need to find the boules that are nearest to the marker. - -## k-nearest neighbors (kNN) -One way to find similar vectors is with a simple [k-nearest neighbors (kNN) algorithm](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm), which returns the k nearest vectors, by comparing every data vector in the database to the query vector. - -In our boules example (as illustraded below), with 6 boules, the kNN algorithm would measure the distance between the jack and each of the 6 boules on the ground. This would result in 6 separate calaculations. - -kNN search in a game of Boules - -*[Figure 1 - kNN search in a game of Boules.]* - -### A kNN search is computationally very expensive -Comparing a search vector with 10, 100, or 1000 data vectors in just two dimensions is an easy job. But of course, in the real world, we are more likely to deal with millions (like in the Wikipedia dataset) or even billions of data items. In addition, the number of dimensions that most ML models use in semantic search goes up to hundreds or thousands of dimensions! - -The *brute* force of a **kNN search is computationally very expensive** - and depending on the size of your database, a single query could take anything from several seconds to even hours (yikes😅). If you compare a vector with 300 dimensions with 10M vectors, the vector search would need to do 300 x 10M = 3B computations! The number of required calculations increases linearly with the number of data points (O(n)) (Figure 2). - -kNN - O(n) complexity - -*[Figure 2 - O(n) and O(log n) complexity]* - -In summary, kNN search doesn't scale well, and it is hard to image using it with a large dataset in production. - -## The answer - Approximate nearest neighbors (ANN) -Instead of comparing vectors one by one, vector databases use [Approximate Nearest Neighbor (ANN) algorithms](https://en.wikipedia.org/wiki/Nearest_neighbor_search#Approximation_methods), which trade off a bit of accuracy (hence the A in the name) for a huge gain in speed. - -ANN algorithms may not return the true k nearest vectors, but they are very efficient. ANN algorithms maintain good performance (sublinear time, e.g. (poly)logarithmic complexity, see Figure 2) on very large-scale datasets. - -*Note that most vector databases allow you to configure how your ANN algorithm should behave. This lets you find the right balance between the **recall tradeoff** (the fraction of results that are the true top-k nearest neighbors), **latency**, **throughput** (queries per second) and **import time**.*
-*For a great example, check [Weaviate benchmarks](/developers/weaviate/benchmarks/ann#sift1m-1m-128d-vectors-l2-distance), to see how three parameters – [efConstruction, maxConnections and ef](/developers/weaviate/benchmarks/ann#what-is-being-measured) - affect recall, latency, throughput and import times.* - -### Examples of ANN algorithms -Examples of ANN methods are: -* **trees** – e.g. [ANNOY](https://github.com/spotify/annoy) (Figure 3), -* **proximity** **graphs** - e.g. [HNSW](https://arxiv.org/abs/1603.09320) (Figure 4), -* **clustering** - e.g. [FAISS](https://github.com/facebookresearch/faiss), -* **hashing** - e.g. [LSH](https://en.wikipedia.org/wiki/Locality-sensitive_hashing), -* **vector compression** - e.g. [PQ](https://ieeexplore.ieee.org/document/5432202) or [SCANN](https://ai.googleblog.com/2020/07/announcing-scann-efficient-vector.html). - -![ANNOY](./img/ann-annoy.png)
-*[Figure 3 - Tree-based ANN search]* - -Which algorithm works best depends on your project. Performance can be measured in terms of latency, throughput (queries per second), build time, and accuracy (recall). These four components often have a tradeoff, so it depends on the use case which method works best. - -So, while ANN is not some magic method that will always find the true k nearest neighbors in a dataset, it can find a pretty good approximation of the true k neighbors. And it can do this in a fraction of the time! - -## HNSW in Weaviate -[Weaviate](/developers/weaviate/) is a great example of a vector database that uses ANN algorithms to offer ultra-fast queries. The first ANN algorithm introduced to Weaviate is a custom implementation of [Hierarchical Navigable Small World graphs (HNSW)](/developers/weaviate/concepts/vector-index#hnsw). - -HNSW - -*[Figure 4 - Proximity graph-based ANN search]* - -Check out [Weaviate ANN benchmarks](/developers/weaviate/benchmarks/ann) to see how HNSW performed on realistic large-scale datasets. You can use it to compare the tradeoffs between recall, QPS, latency, and import time.
-You will find it interesting to see, that Weaviate can maintain very high recall rates (>95%), whilst keeping high throughput and low latency (both in milliseconds). That is exactly what you need for fast, but reliable vector search! - -## Summary -A quick recap: -* Vector databases use Machine Learning models to calculate and attach Vector embeddings to all data objects -* Vector embeddings capture the meaning and context of data -* Vector databases offer super fast queries thanks to ANN algorithms -* ANN algorithms trade a small amount of accuracy for huge gains in performance - -*Of course, there is a lot more going on in a vector database that makes it so efficient. But that is content for another article.😉* - -## Learn more -The Weaviate Core team is currently working on research and implementation for other ANN algorithms. We are going to publish some of our findings in the next couple of weeks. So, stay tuned for more content on the topic. - -Until then, you can listen to a [podcast about ANN Benchmarks](https://youtu.be/kG3ji89AFyQ) with Connor and Etienne from Weaviate. - -import WhatsNext from '/_includes/what-next.mdx'; - - diff --git a/blog/2022-10-11-ann-algorithms-vamana-vs-hnsw/index.mdx b/blog/2022-10-11-ann-algorithms-vamana-vs-hnsw/index.mdx index 626ae59ff4..411fffbc85 100644 --- a/blog/2022-10-11-ann-algorithms-vamana-vs-hnsw/index.mdx +++ b/blog/2022-10-11-ann-algorithms-vamana-vs-hnsw/index.mdx @@ -25,7 +25,7 @@ In this series of blog posts, we will take you on a journey with us as we resear In this article, we will cover the need for disk-based solutions, explore Vamana (how it works and contrast it against HNSW), and present the result of Vamana implementation. -> If you are new to vector databases and ANN, I recommend you to read "[Why is Vector Search so Fast?](/blog/why-is-vector-search-so-fast)"
+> If you are new to vector databases and ANN, I recommend you to read "[Why is Vector Search so Fast?](/blog/vector-search-explained)"
> The article explains what vector databases are and how they work. ## Need for approximation diff --git a/blog/2022-10-18-how-to-build-an-image-search-application-with-weaviate/index.mdx b/blog/2022-10-18-how-to-build-an-image-search-application-with-weaviate/index.mdx index 92d3636b4a..01415ae3d6 100644 --- a/blog/2022-10-18-how-to-build-an-image-search-application-with-weaviate/index.mdx +++ b/blog/2022-10-18-how-to-build-an-image-search-application-with-weaviate/index.mdx @@ -25,7 +25,7 @@ This blog post assumes you are familiar with vector search, as well as with spin * [Docker Installation](https://docs.docker.com/engine/install/) -[Check out this article](/blog/why-is-vector-search-so-fast) to learn more about why vector databases are so fast and how they work. +[Check out this article](/blog/vector-search-explained) to learn more about why vector databases are so fast and how they work. We will provide code snippets in this post, but you can check out the full code base in the [Weaviate Examples GitHub repo](https://github.com/weaviate/weaviate-examples) under the `nearest-neighbor-dog-search` directory. We encourage you to follow along with us by cloning the repository! diff --git a/blog/2022-12-01-vector-library-vs-vector-database/index.mdx b/blog/2022-12-01-vector-library-vs-vector-database/index.mdx index 498db27fdf..68e3c1714c 100644 --- a/blog/2022-12-01-vector-library-vs-vector-database/index.mdx +++ b/blog/2022-12-01-vector-library-vs-vector-database/index.mdx @@ -15,7 +15,7 @@ In the world of Vector Search, we use **vector embeddings** – generated by **M We can use [vector distance functions](/blog/distance-metrics-in-vector-search) like euclidean distance or cosine distance to determine if these objects are similar to other objects in the collection. However, to do this we need to compare the distances between the query vector and **every** vector in the collection. This type of calculation can be difficult to scale to millions or billions of vectors. -This is why we have **Vector Databases** and **Vector Libraries**. They both use the Approximate Nearest Neighbor (ANN) algorithm to search through vectors in a tiny fraction of the time. You can learn more about this topic from ["Why Vectors Search is so Fast."](/blog/why-is-vector-search-so-fast) +This is why we have **[Vector Databases](/blog/what-is-a-vector-database/)** and **Vector Libraries**. They both use the Approximate Nearest Neighbor (ANN) algorithm to search through vectors in a tiny fraction of the time. You can learn more about this topic from ["Why Vectors Search is so Fast."](/blog/vector-search-explained) ## The Big Question So, if both vector databases and vector libraries allow you to efficiently search through your vectors. What are the key differences between them, and why/when should you choose one over the other? diff --git a/blog/2022-12-20-weaviate-1-17-release/img/bm25.png b/blog/2022-12-20-weaviate-1-17-release/img/bm25.png index f41a28f890..441b55e94a 100644 Binary files a/blog/2022-12-20-weaviate-1-17-release/img/bm25.png and b/blog/2022-12-20-weaviate-1-17-release/img/bm25.png differ diff --git a/blog/2022-12-20-weaviate-1-17-release/img/faster-startup.png b/blog/2022-12-20-weaviate-1-17-release/img/faster-startup.png index 67a62a7c68..3102064bd3 100644 Binary files a/blog/2022-12-20-weaviate-1-17-release/img/faster-startup.png and b/blog/2022-12-20-weaviate-1-17-release/img/faster-startup.png differ diff --git a/blog/2022-12-20-weaviate-1-17-release/img/hero.png b/blog/2022-12-20-weaviate-1-17-release/img/hero.png index c463b81a4c..57f8e9be0a 100644 Binary files a/blog/2022-12-20-weaviate-1-17-release/img/hero.png and b/blog/2022-12-20-weaviate-1-17-release/img/hero.png differ diff --git a/blog/2022-12-20-weaviate-1-17-release/img/hybrid-search.png b/blog/2022-12-20-weaviate-1-17-release/img/hybrid-search.png index ab992e14ca..132721b755 100644 Binary files a/blog/2022-12-20-weaviate-1-17-release/img/hybrid-search.png and b/blog/2022-12-20-weaviate-1-17-release/img/hybrid-search.png differ diff --git a/blog/2022-12-20-weaviate-1-17-release/img/other-improvements.png b/blog/2022-12-20-weaviate-1-17-release/img/other-improvements.png index 67a62a7c68..3102064bd3 100644 Binary files a/blog/2022-12-20-weaviate-1-17-release/img/other-improvements.png and b/blog/2022-12-20-weaviate-1-17-release/img/other-improvements.png differ diff --git a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/LSM-stores.png b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/LSM-stores.png index eb69001fe2..59254170f7 100644 Binary files a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/LSM-stores.png and b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/LSM-stores.png differ diff --git a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/batch-objects-latency.png b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/batch-objects-latency.png index 5d6d0a1327..59779078db 100644 Binary files a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/batch-objects-latency.png and b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/batch-objects-latency.png differ diff --git a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/gear.png b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/gear.png index f48f1bfcb6..ef8ab14bcb 100644 Binary files a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/gear.png and b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/gear.png differ diff --git a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/hero.png b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/hero.png index fbecff99a0..6bed5a859d 100644 Binary files a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/hero.png and b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/hero.png differ diff --git a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/magnifying-glass.png b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/magnifying-glass.png index c104281515..96c28ca4ab 100644 Binary files a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/magnifying-glass.png and b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/magnifying-glass.png differ diff --git a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/number-of-vectors-imported.png b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/number-of-vectors-imported.png index c4d76b7000..8915d236c0 100644 Binary files a/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/number-of-vectors-imported.png and b/blog/2022-12-27-details-behind-the-sphere-dataset-in-weaviate/img/number-of-vectors-imported.png differ diff --git a/blog/2023-01-03-hybrid-search-explained/index.mdx b/blog/2023-01-03-hybrid-search-explained/index.mdx index d5755ddbc0..9cc00f9529 100644 --- a/blog/2023-01-03-hybrid-search-explained/index.mdx +++ b/blog/2023-01-03-hybrid-search-explained/index.mdx @@ -23,7 +23,7 @@ Sparse and dense vectors are calculated with distinct algorithms. Sparse vectors Note, the current implementation of hybrid search in Weaviate uses BM25/BM25F and vector search. -If you’re interested to learn about how dense vector indexes are built and optimized in Weaviate, check out this [article](/blog/why-is-vector-search-so-fast). +If you’re interested to learn about how dense vector indexes are built and optimized in Weaviate, check out this [article](/blog/vector-search-explained). ### BM25 BM25 builds on the keyword scoring method [TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) (Term-Frequency Inverse-Document Frequency) by taking the [Binary Independence Model](https://en.wikipedia.org/wiki/Binary_Independence_Model) from the IDF calculation and adding a normalization penalty that weighs a document’s length relative to the average length of all the documents in the database. @@ -39,7 +39,7 @@ BM25F was also implemented in Weaviate `1.17`. BM25F is a variant of BM25 that a ### Dense Vectors Dense vectors represent information stored in a database; this includes text, images, and other types of data. These embeddings are generated from machine learning models that convert data to vectors. The vectors are densely packed with information and are mostly made up of non-zero values. The meaning of each value in the vector depends on the machine learning model that you used. -Vector databases, like [Weaviate](/developers/weaviate/), store these embeddings and calculate the distance between the two vectors. [Distance metrics](/blog/distance-metrics-in-vector-search) show how similar or dissimilar two vector embeddings are. The search query is converted to a vector, similar to the data vectors, and the distance value determines how close the vectors are. +[Vector databases](/blog/what-is-a-vector-database/), like [Weaviate](/developers/weaviate/), store these embeddings and calculate the distance between the two vectors. [Distance metrics](/blog/distance-metrics-in-vector-search) show how similar or dissimilar two vector embeddings are. The search query is converted to a vector, similar to the data vectors, and the distance value determines how close the vectors are. ![Hybrid Search](./img/hybrid-search-explained.png) @@ -102,7 +102,7 @@ With just a few lines of code, you can start using hybrid search. You can run a ## Summary -This article explained the concept of hybrid search. In the context of the Weaviate vector database, hybrid search is a combination of keyword search and semantic search. By combining these two types of searches, hybrid search queries can lead to more relevant results in use cases where you want to leverage the power of semantic search but also rely on exact matches of certain keywords, such as product or brand names. +This article explained the concept of hybrid search. In the context of the Weaviate vector database, hybrid search is a combination of keyword search and semantic search. By combining these two types of searches, hybrid search queries can lead to more relevant results in use cases where you want to leverage the power of semantic search but also rely on exact matches of certain keywords, such as product or brand names. Check out the [documentation](/developers/weaviate/api/graphql/search-operators#hybrid) for more information on hybrid search! diff --git a/blog/2023-01-16-vector-embeddings-explained/index.mdx b/blog/2023-01-16-vector-embeddings-explained/index.mdx index ca43f789f2..df074dc5cd 100644 --- a/blog/2023-01-16-vector-embeddings-explained/index.mdx +++ b/blog/2023-01-16-vector-embeddings-explained/index.mdx @@ -20,7 +20,7 @@ Semantic searches (as well as question answering) are essentially searches by si How can computers mimic our understanding of language, and similarities of words or paragraphs? To tackle this problem, semantic search uses at its core a data structure called vector embedding (or simply, vector or embedding), which is an array of numbers. Here's how the semantic search above works, step by step: 1. The [vector database](https://weaviate.io/blog/vector-library-vs-vector-database) computes a vector embedding for each data object as it is inserted or updated into the database, using a given model. -2. The embeddings are placed into an index, so that the database can [quickly](https://weaviate.io/blog/why-is-vector-search-so-fast) perform searches. +2. The embeddings are placed into an index, so that the database can [quickly](https://weaviate.io/blog/vector-search-explained) perform searches. 3. For each query, * a vector embedding is computed using the same model that was used for the data objects. * using a special algorithm, the database finds the [closest](https://weaviate.io/blog/distance-metrics-in-vector-search) vectors to the given vector computed for the query. @@ -80,7 +80,7 @@ If we look at each of the 5 elements of the vectors, we can see quickly that cat But where do these numbers come from? That’s where the real magic is, and where advances in modern deep learning have made a huge impact. ## How to create vector embeddings? -The magic of vector search resides primarily in how the embeddings are generated for each entity and the query, and secondarily in how to efficiently search within very large datasets (see our “[Why is Vector Search so Fast](https://weaviate.io/blog/why-is-vector-search-so-fast)” article for the latter). +The magic of vector search resides primarily in how the embeddings are generated for each entity and the query, and secondarily in how to efficiently search within very large datasets (see our “[Why is Vector Search so Fast](https://weaviate.io/blog/vector-search-explained)” article for the latter). As we mentioned, vector embeddings can be generated for various media types such as text, images, audio and others. For text, vectorization techniques have evolved tremendously over the last decade, from the venerable [word2vec (2013)](https://en.wikipedia.org/wiki/Word2vec), to the state-of-the-art transformer models era, spurred by the release of [BERT](https://en.wikipedia.org/wiki/BERT_(language_model)) in [2018](https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html). ### Word-level dense vector models (word2vec, GloVe, etc.)​ @@ -103,7 +103,7 @@ Some of the potential downsides include: Despite these downsides, transformer models have been wildly successful. Countless text vectorizer models have proliferated over the recent past. Plus, many more vectorizer models exist for other data types such as audio, video and images, to name a few. Some models, such as [CLIP](https://openai.com/blog/clip/), are capable of vectorizing multiple data types (images and text in this case) into one vector space, so that an image can be searched by its content using only text. ## Vector embedding visualization -Below we can see what vector embeddings of data objects in a vector space could look like. The image shows each object embedded as a 3-dimensional vectors for ease of understanding, realistically a vector can be anywhere from ~100 to 4000 dimensions. +Below we can see what vector embeddings of data objects in a vector space could look like. The image shows each object embedded as a 3-dimensional vectors for ease of understanding, realistically a vector can be anywhere from ~100 to 4000 dimensions. In the following image, you can see the vectors for the words “Wolf” and “Dog” are close to each other because dogs are direct descendants of wolves. Close to the dog, you can see the word “Cat,” which is similar to the word “Dog” because both are animals that are also common pets. But further away, on the right-hand side, you can see words that represent fruit, such as “Apple” or “Banana”, which are close to each other but further away from the animal terms. @@ -125,7 +125,7 @@ Vector embeddings capture the semantic relationship between data objects in nume Now that you have a good understanding of what vector embeddings are and how vector embeddings are created, you might also be interested in the following articles: * [What is a vector database?](https://weaviate.io/blog/what-is-a-vector-database) * [Distance metrics for nearest neighbor search](https://weaviate.io/blog/distance-metrics-in-vector-search) -* [Why is vector search so fast?](https://weaviate.io/blog/why-is-vector-search-so-fast) +* [Why is vector search so fast?](https://weaviate.io/blog/vector-search-explained) **Last Updated On**: August 27th, 2024 diff --git a/blog/2023-01-24-how-ai-creates-art/img/denoisingimage.jpg b/blog/2023-01-24-how-ai-creates-art/img/denoisingimage.jpg new file mode 100644 index 0000000000..5473a667a0 Binary files /dev/null and b/blog/2023-01-24-how-ai-creates-art/img/denoisingimage.jpg differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/denoisingimage.png b/blog/2023-01-24-how-ai-creates-art/img/denoisingimage.png deleted file mode 100644 index 3a0c332a2e..0000000000 Binary files a/blog/2023-01-24-how-ai-creates-art/img/denoisingimage.png and /dev/null differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/hero.png b/blog/2023-01-24-how-ai-creates-art/img/hero.png index 005b8d98fa..6c10d9c151 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/hero.png and b/blog/2023-01-24-how-ai-creates-art/img/hero.png differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/mscoco.png b/blog/2023-01-24-how-ai-creates-art/img/mscoco.png index 287e11388b..cf4aa4f1d0 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/mscoco.png and b/blog/2023-01-24-how-ai-creates-art/img/mscoco.png differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/noising_denoising.png b/blog/2023-01-24-how-ai-creates-art/img/noising_denoising.png index c5ee3a5d06..248069251c 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/noising_denoising.png and b/blog/2023-01-24-how-ai-creates-art/img/noising_denoising.png differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/noisingimage.jpg b/blog/2023-01-24-how-ai-creates-art/img/noisingimage.jpg new file mode 100644 index 0000000000..d142fdbf5d Binary files /dev/null and b/blog/2023-01-24-how-ai-creates-art/img/noisingimage.jpg differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/noisingimage.png b/blog/2023-01-24-how-ai-creates-art/img/noisingimage.png deleted file mode 100644 index 8a70b9948b..0000000000 Binary files a/blog/2023-01-24-how-ai-creates-art/img/noisingimage.png and /dev/null differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/perception_of_the_world.jpg b/blog/2023-01-24-how-ai-creates-art/img/perception_of_the_world.jpg index 324483c4f0..4183d48a49 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/perception_of_the_world.jpg and b/blog/2023-01-24-how-ai-creates-art/img/perception_of_the_world.jpg differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/searching_through_multi_dimensional_vector_space.jpg b/blog/2023-01-24-how-ai-creates-art/img/searching_through_multi_dimensional_vector_space.jpg index 084a3ac9ca..8bd18661b7 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/searching_through_multi_dimensional_vector_space.jpg and b/blog/2023-01-24-how-ai-creates-art/img/searching_through_multi_dimensional_vector_space.jpg differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/the_mona_lisa_drip_painted.jpg b/blog/2023-01-24-how-ai-creates-art/img/the_mona_lisa_drip_painted.jpg index 161dd0faf3..67dcdc633b 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/the_mona_lisa_drip_painted.jpg and b/blog/2023-01-24-how-ai-creates-art/img/the_mona_lisa_drip_painted.jpg differ diff --git a/blog/2023-01-24-how-ai-creates-art/img/three_images.png b/blog/2023-01-24-how-ai-creates-art/img/three_images.png index d17ba6b3a6..846301b620 100644 Binary files a/blog/2023-01-24-how-ai-creates-art/img/three_images.png and b/blog/2023-01-24-how-ai-creates-art/img/three_images.png differ diff --git a/blog/2023-01-24-how-ai-creates-art/index.mdx b/blog/2023-01-24-how-ai-creates-art/index.mdx index 1e3bcd9188..af03c0d3d7 100644 --- a/blog/2023-01-24-how-ai-creates-art/index.mdx +++ b/blog/2023-01-24-how-ai-creates-art/index.mdx @@ -45,7 +45,7 @@ The question then becomes how diffusion models can learn (or even approximate) t ![noising gif](./img/noise.gif) *[Source](https://yang-song.net/blog/2021/score/)* -![noising images](./img/noisingimage.png) +![noising images](./img/noisingimage.jpg) *[Source](https://huggingface.co/blog/annotated-diffusion)* This “noising” process, shown in the images above allows us to take training set images and add known quantities of noise to it until it becomes completely random noise. This process takes images from a state of having high probability of being found in the training set to having a low probability of existing in the training set. @@ -55,7 +55,7 @@ Once the “noising” step is completed, then we can use these clean and noisy ![denoising gif](./img/denoise.gif) *[Source](https://yang-song.net/blog/2021/score/)* -![denoising images](./img/denoisingimage.png) +![denoising images](./img/denoisingimage.jpg) *[Source](https://huggingface.co/blog/annotated-diffusion)* Now if we take this trained diffusion model and just give it a random static image and run the de-noising process it will transform the static image into an image that resembles images in the training set! diff --git a/blog/2023-01-31-weaviate-podcast-search/img/andrew-huberman-search.png b/blog/2023-01-31-weaviate-podcast-search/img/andrew-huberman-search.png index 3f74dd4439..db8fd4e277 100644 Binary files a/blog/2023-01-31-weaviate-podcast-search/img/andrew-huberman-search.png and b/blog/2023-01-31-weaviate-podcast-search/img/andrew-huberman-search.png differ diff --git a/blog/2023-01-31-weaviate-podcast-search/img/hero.png b/blog/2023-01-31-weaviate-podcast-search/img/hero.png index 4fad17e560..531aa86d04 100644 Binary files a/blog/2023-01-31-weaviate-podcast-search/img/hero.png and b/blog/2023-01-31-weaviate-podcast-search/img/hero.png differ diff --git a/blog/2023-01-31-weaviate-podcast-search/img/podcast-search.png b/blog/2023-01-31-weaviate-podcast-search/img/podcast-search.png index 7c310209bb..c27f277e4f 100644 Binary files a/blog/2023-01-31-weaviate-podcast-search/img/podcast-search.png and b/blog/2023-01-31-weaviate-podcast-search/img/podcast-search.png differ diff --git a/blog/2023-02-21-combining-langchain-and-weaviate/img/hero.png b/blog/2023-02-21-combining-langchain-and-weaviate/img/hero.png index c6123182a2..ce6c267713 100644 Binary files a/blog/2023-02-21-combining-langchain-and-weaviate/img/hero.png and b/blog/2023-02-21-combining-langchain-and-weaviate/img/hero.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/Ann.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/Ann.png index 8cfb60ad51..a2110c82f3 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/Ann.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/Ann.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/hero.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/hero.png index fcbc1b87c4..b040a9610f 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/hero.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/hero.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image10.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image10.png index 034de0a170..dac90263fe 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image10.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image10.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image11.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image11.png index 9e0a9aae19..2ca045bfdf 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image11.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image11.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image12.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image12.png index c4eaf0d432..77bcc30940 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image12.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image12.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image13.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image13.png index afff633552..2cb93fbe71 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image13.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image13.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image14.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image14.png index 95f9075d1b..e41458f0b3 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image14.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image14.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image15.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image15.png index 7fc2649ae0..0efe70f932 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image15.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image15.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image16.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image16.png index 86c8423caa..3e641016ac 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image16.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image16.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image5.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image5.png index 90f4eb8479..a57d41883a 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image5.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image5.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image6.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image6.png index 73a2062721..1b4b48e8e3 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image6.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image6.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image7.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image7.png index 4781621b83..c2cc7033df 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image7.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image7.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image8.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image8.png index 64428a1320..047dc97dcc 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image8.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image8.png differ diff --git a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image9.png b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image9.png index f04e1f17fe..a98e62ab9e 100644 Binary files a/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image9.png and b/blog/2023-03-14-ann-algorithms-hnsw-pq/img/image9.png differ diff --git a/blog/2023-03-23-what-are-llms/img/ChatGPT-2.jpg b/blog/2023-03-23-what-are-llms/img/ChatGPT-2.jpg new file mode 100644 index 0000000000..028dc26228 Binary files /dev/null and b/blog/2023-03-23-what-are-llms/img/ChatGPT-2.jpg differ diff --git a/blog/2023-03-23-what-are-llms/img/ChatGPT-2.png b/blog/2023-03-23-what-are-llms/img/ChatGPT-2.png deleted file mode 100644 index 0d72bd4298..0000000000 Binary files a/blog/2023-03-23-what-are-llms/img/ChatGPT-2.png and /dev/null differ diff --git a/blog/2023-03-23-what-are-llms/img/twitter1.jpeg b/blog/2023-03-23-what-are-llms/img/twitter1.jpeg deleted file mode 100644 index ae32dd8111..0000000000 Binary files a/blog/2023-03-23-what-are-llms/img/twitter1.jpeg and /dev/null differ diff --git a/blog/2023-03-23-what-are-llms/img/twitter1.jpg b/blog/2023-03-23-what-are-llms/img/twitter1.jpg new file mode 100644 index 0000000000..065c7a1fbc Binary files /dev/null and b/blog/2023-03-23-what-are-llms/img/twitter1.jpg differ diff --git a/blog/2023-03-23-what-are-llms/img/twitter2.jpg b/blog/2023-03-23-what-are-llms/img/twitter2.jpg new file mode 100644 index 0000000000..9491db44fc Binary files /dev/null and b/blog/2023-03-23-what-are-llms/img/twitter2.jpg differ diff --git a/blog/2023-03-23-what-are-llms/img/twitter2.png b/blog/2023-03-23-what-are-llms/img/twitter2.png deleted file mode 100644 index 255642f2c5..0000000000 Binary files a/blog/2023-03-23-what-are-llms/img/twitter2.png and /dev/null differ diff --git a/blog/2023-03-23-what-are-llms/img/wheeloffortune.jpeg b/blog/2023-03-23-what-are-llms/img/wheeloffortune.jpeg deleted file mode 100644 index 593a24eb9c..0000000000 Binary files a/blog/2023-03-23-what-are-llms/img/wheeloffortune.jpeg and /dev/null differ diff --git a/blog/2023-03-23-what-are-llms/img/wheeloffortune.jpg b/blog/2023-03-23-what-are-llms/img/wheeloffortune.jpg new file mode 100644 index 0000000000..26aab4396d Binary files /dev/null and b/blog/2023-03-23-what-are-llms/img/wheeloffortune.jpg differ diff --git a/blog/2023-03-23-what-are-llms/index.mdx b/blog/2023-03-23-what-are-llms/index.mdx index 106478c4fc..26845e2c86 100644 --- a/blog/2023-03-23-what-are-llms/index.mdx +++ b/blog/2023-03-23-what-are-llms/index.mdx @@ -22,7 +22,7 @@ In this blog we discuss: When OpenAI launched ChatGPT at the end of 2022, more than one million people had tried the model in just a week and that trend has only continued with monthly active users for the chatbot service reaching over 100 Million, quicker than any service before, as reported by [Reuters](https://www.reuters.com/technology/chatgpt-sets-record-fastest-growing-user-base-analyst-note-2023-02-01/) and [Yahoo Finance](https://finance.yahoo.com/news/chatgpt-on-track-to-surpass-100-million-users-faster-than-tiktok-or-instagram-ubs-214423357.html?guccounter=1). Since then, OpenAI has been iteratively improving the underlying model, announcing the release of GPT (Generative Pretrained Transformer) 4.0 last week, with new and improved capabilities. It wouldn’t be hyperbole to say that Natural Language Processing (NLP) and Generative Large Language Models (LLMs) have taken the world by storm. -![gpt100](./img/ChatGPT-2.png) +![gpt100](./img/ChatGPT-2.jpg) Though ChatGPT was not the first AI chatbot that has been released to the public, what really surprised people about this particular service was the breadth and depth of knowledge it had and its ability to articulate that knowledge with human-like responses. Aside from this, the generative aspect of this model is also quite apparent as it can hallucinate situations and dream up vivid details to fill in descriptions when prompted to do so. This gives the chatbot service somewhat of a human-like “creativity” - which is what adds a whole new dimension of utility for the service, as well as a wow factor to the user experience! @@ -41,7 +41,7 @@ This explains why LLMs know something about basically everything but it still do To understand how LLMs work let's consider a scenario. Imagine you are on the Wheel of Fortune game show and are tasked with completing the following phrase: -![wheel](./img/wheeloffortune.jpeg) +![wheel](./img/wheeloffortune.jpg) The vast majority of you, I bet, would answer: "EASY! It’s: '**ANOTHER FEATHER *I*N YO*U*R *C*A*P***'." And you would be correct! But humor me for a second while I play devil’s advocate and propose an alternative: Why not: “**ANOTHER FEATHER *O*N YO*U*R *C*A*T***”? This is a perfectly structured and complete English sentence. Why, then, did no one think of this alternative as a potential completion of the phrase? @@ -72,7 +72,7 @@ One current limitation of LLMs, which can prevent them from attaining points 3 a GPT 3.5 | GPT 4.0 :-------------------------:|:-------------------------: -![t1](./img/twitter1.jpeg) | ![t2](./img/twitter2.png) +![t1](./img/twitter1.jpg) | ![t2](./img/twitter2.jpg) These LLMs are distilling the information they read from vast amounts of interactions between words. So both humans and LLMs in their unique ways build a statistical understanding of the language they are trained on. diff --git a/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-dark.png b/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-dark.png index 9d5d26438a..9487d811fe 100644 Binary files a/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-dark.png and b/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-dark.png differ diff --git a/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-light.png b/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-light.png index fae1a63b4a..d9e18244de 100644 Binary files a/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-light.png and b/blog/2023-03-28-monitoring-weaviate-in-production/img/Weaviate-monitoring-weaviate-in-prod-light.png differ diff --git a/blog/2023-03-28-monitoring-weaviate-in-production/img/datadog-summary.png b/blog/2023-03-28-monitoring-weaviate-in-production/img/datadog-summary.png index 3a38c7d364..94a8312e94 100644 Binary files a/blog/2023-03-28-monitoring-weaviate-in-production/img/datadog-summary.png and b/blog/2023-03-28-monitoring-weaviate-in-production/img/datadog-summary.png differ diff --git a/blog/2023-03-28-monitoring-weaviate-in-production/img/hero.png b/blog/2023-03-28-monitoring-weaviate-in-production/img/hero.png index 08f3da085c..4f22acc6d5 100644 Binary files a/blog/2023-03-28-monitoring-weaviate-in-production/img/hero.png and b/blog/2023-03-28-monitoring-weaviate-in-production/img/hero.png differ diff --git a/blog/2023-03-28-monitoring-weaviate-in-production/img/query-latency.png b/blog/2023-03-28-monitoring-weaviate-in-production/img/query-latency.png index 5ca22ecb2e..81a9c51201 100644 Binary files a/blog/2023-03-28-monitoring-weaviate-in-production/img/query-latency.png and b/blog/2023-03-28-monitoring-weaviate-in-production/img/query-latency.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-dark.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-dark.png index 9334a949de..8f627a6aa2 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-dark.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-dark.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-light.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-light.png index 2b37d1c249..ce975c7ba0 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-light.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/diagram-light.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/gdbtweet.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/gdbtweet.png index 16e05379aa..70d257552e 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/gdbtweet.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/gdbtweet.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/hero.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/hero.png index 0068ebc667..cf05396b30 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/hero.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/hero.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic1.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic1.png index e6e98bd50c..4716d4c0ed 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic1.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic1.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic10.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic10.png index 1c791658e2..76422df910 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic10.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic10.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic11.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic11.png index 1d74ab11e2..ff0e22de50 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic11.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic11.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic12.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic12.png index b2ad1ef743..875c570b0c 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic12.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic12.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic13.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic13.png index 8156af4d06..69fad085b9 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic13.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic13.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic2.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic2.png index 08c43822dd..a248b97a37 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic2.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic2.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic3.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic3.png index 62c14a6347..8b07a086e6 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic3.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic3.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic4.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic4.png index b5fba008e6..911c3e6af3 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic4.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic4.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic5.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic5.png index 00646b165b..951b3819dc 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic5.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic5.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic6.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic6.png index daa3e951c4..ce8cf33a12 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic6.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic6.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic7.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic7.png index c74d601ac4..0f669125a8 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic7.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic7.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic8.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic8.png index 5bbc049493..aef42c83f6 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic8.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic8.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic9.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic9.png index 71c71e80e1..9c5824f558 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/pic9.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/pic9.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-dark.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-dark.png index f7b8cea9a6..2d9b40e88d 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-dark.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-dark.png differ diff --git a/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-light.png b/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-light.png index a8707a7fe9..23a4aed932 100644 Binary files a/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-light.png and b/blog/2023-04-04-weaviate-retrieval-plugin/img/plugin-light.png differ diff --git a/blog/2023-04-11-ranking-models/img/animation.png b/blog/2023-04-11-ranking-models/img/animation.png index 05f797f05b..d09131092b 100644 Binary files a/blog/2023-04-11-ranking-models/img/animation.png and b/blog/2023-04-11-ranking-models/img/animation.png differ diff --git a/blog/2023-04-11-ranking-models/img/hero.png b/blog/2023-04-11-ranking-models/img/hero.png index 8879e17d23..253de549f0 100644 Binary files a/blog/2023-04-11-ranking-models/img/hero.png and b/blog/2023-04-11-ranking-models/img/hero.png differ diff --git a/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-dark.png b/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-dark.png index dc185e3918..11be9a305c 100644 Binary files a/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-dark.png and b/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-dark.png differ diff --git a/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-light.png b/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-light.png index 1d1868446f..61a210ec64 100644 Binary files a/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-light.png and b/blog/2023-04-18-autogpt-and-weaviate/img/Weaviate-auto-gpt-light.png differ diff --git a/blog/2023-04-18-autogpt-and-weaviate/img/hero.png b/blog/2023-04-18-autogpt-and-weaviate/img/hero.png index 949c978bb9..177cc45e80 100644 Binary files a/blog/2023-04-18-autogpt-and-weaviate/img/hero.png and b/blog/2023-04-18-autogpt-and-weaviate/img/hero.png differ diff --git a/blog/2023-04-25-auth-in-weaviate/index.mdx b/blog/2023-04-25-auth-in-weaviate/index.mdx index d2b13e304d..031bb59c10 100644 --- a/blog/2023-04-25-auth-in-weaviate/index.mdx +++ b/blog/2023-04-25-auth-in-weaviate/index.mdx @@ -15,8 +15,6 @@ description: "Videos on authentication: an overview, how to log in, how to set i import ReactPlayer from 'react-player/lazy' -## Overview - Authentication is one of those topics that we get quite a few questions about. And we can see why. It's a big, complex topic, and even within Weaviate, there are many options available which can make it seem quite confusing. The core concept of authentication is relatively simple. When a client (e.g. a Weaviate client) sends a request to a server (e.g. a Weaviate database), it includes a "secret" that provides some assurances to Weaviate as to who that request is coming from, so that it can operate on that information. diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/areyahavingfunmrkrabs.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/areyahavingfunmrkrabs.png index 57cb25861e..af9308148e 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/areyahavingfunmrkrabs.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/areyahavingfunmrkrabs.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-dark.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-dark.png index 9334a949de..8f627a6aa2 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-dark.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-dark.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-light.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-light.png index 2b37d1c249..ce975c7ba0 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-light.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/diagram-light.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/error.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/error.png index a9f7cfd5e3..5c9236bd74 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/error.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/error.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/hackathon.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/hackathon.png index 2f6dc86e8f..46df01211d 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/hackathon.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/hackathon.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/hero.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/hero.png index 03d74b5827..770ea69da6 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/hero.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/hero.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/openaiapi.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/openaiapi.png index 6175289fa7..02f5544eb3 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/openaiapi.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/openaiapi.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-dark.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-dark.png index f7b8cea9a6..2d9b40e88d 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-dark.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-dark.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-light.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-light.png index a8707a7fe9..23a4aed932 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-light.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/plugin-light.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/swagger.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/swagger.png index 5c6e5a24d8..435100a31f 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/swagger.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/swagger.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/test1.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/test1.png index 64115f004b..db04c62987 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/test1.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/test1.png differ diff --git a/blog/2023-04-27-how-to-chatgpt-plugin/img/test2.png b/blog/2023-04-27-how-to-chatgpt-plugin/img/test2.png index 4cdb49ab3d..c1152db1a8 100644 Binary files a/blog/2023-04-27-how-to-chatgpt-plugin/img/test2.png and b/blog/2023-04-27-how-to-chatgpt-plugin/img/test2.png differ diff --git a/blog/2023-05-04-weaviate-1-19-release/img/datatypes.png b/blog/2023-05-04-weaviate-1-19-release/img/datatypes.png index c319749da6..ae0cf58079 100644 Binary files a/blog/2023-05-04-weaviate-1-19-release/img/datatypes.png and b/blog/2023-05-04-weaviate-1-19-release/img/datatypes.png differ diff --git a/blog/2023-05-04-weaviate-1-19-release/img/gencohere.png b/blog/2023-05-04-weaviate-1-19-release/img/gencohere.png index 6d6935869a..6c39b02c37 100644 Binary files a/blog/2023-05-04-weaviate-1-19-release/img/gencohere.png and b/blog/2023-05-04-weaviate-1-19-release/img/gencohere.png differ diff --git a/blog/2023-05-04-weaviate-1-19-release/img/groupby.png b/blog/2023-05-04-weaviate-1-19-release/img/groupby.png index 9a1e330a29..300e1953ed 100644 Binary files a/blog/2023-05-04-weaviate-1-19-release/img/groupby.png and b/blog/2023-05-04-weaviate-1-19-release/img/groupby.png differ diff --git a/blog/2023-05-04-weaviate-1-19-release/img/grpc.png b/blog/2023-05-04-weaviate-1-19-release/img/grpc.png index fd8dc628dd..a442ae01aa 100644 Binary files a/blog/2023-05-04-weaviate-1-19-release/img/grpc.png and b/blog/2023-05-04-weaviate-1-19-release/img/grpc.png differ diff --git a/blog/2023-05-04-weaviate-1-19-release/img/hero.png b/blog/2023-05-04-weaviate-1-19-release/img/hero.png index 2cc370f3fb..8936be458a 100644 Binary files a/blog/2023-05-04-weaviate-1-19-release/img/hero.png and b/blog/2023-05-04-weaviate-1-19-release/img/hero.png differ diff --git a/blog/2023-05-04-weaviate-1-19-release/img/tunableconsistency.png b/blog/2023-05-04-weaviate-1-19-release/img/tunableconsistency.png index d31e417f1e..6bf4c9148c 100644 Binary files a/blog/2023-05-04-weaviate-1-19-release/img/tunableconsistency.png and b/blog/2023-05-04-weaviate-1-19-release/img/tunableconsistency.png differ diff --git a/blog/2023-05-05-generative-feedback-loops/index.mdx b/blog/2023-05-05-generative-feedback-loops/index.mdx index 1b268481d2..d349c27169 100644 --- a/blog/2023-05-05-generative-feedback-loops/index.mdx +++ b/blog/2023-05-05-generative-feedback-loops/index.mdx @@ -19,7 +19,7 @@ Enter Large Language Models (LLMs), a world changing technology that enables tra The internet cut out the newspaper, now content can be delivered directly to you. Now we are going a step further, modifying content itself based on your personal preferences! Not only are we able to bring content with a great UX to people, but now we can generate content, in real time, based on existing information in the database to create an ever better and more personalized experience! -In this article, we are going to illustrate the concept of **Generative Feedback Loops with LLMs**. Retrieving information from the Weaviate Vector Database to prompt Weaviate’s generative module and then vectorizing and saving these generations **back** into the database! Now we can semantically search through the generated content, as well as add symbolic metadata about it. +In this article, we are going to illustrate the concept of **Generative Feedback Loops with LLMs**. Retrieving information from the Weaviate [Vector Database](/blog/what-is-a-vector-database/) to prompt Weaviate’s generative module and then vectorizing and saving these generations **back** into the database! Now we can semantically search through the generated content, as well as add symbolic metadata about it. We will step into the shoes of AirBnB and implement a Generative Feedback Loop to process `Listing` objects. This shows how LLMs let us supercharge user experience by creating custom advertisements based on user preferences. We retrieve information about users from the DB, give that + information about the Listing to the LLM, and save the resulting custom advertisement back to the database. diff --git a/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-dark.png b/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-dark.png index 6e11e40251..d7b662562b 100644 Binary files a/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-dark.png and b/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-dark.png differ diff --git a/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-light.png b/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-light.png index e71bbf7f4d..a0edeb2c63 100644 Binary files a/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-light.png and b/blog/2023-05-23-pdfs-to-weaviate/img/Weaviate-ingesting-light.png differ diff --git a/blog/2023-05-23-pdfs-to-weaviate/img/donut.png b/blog/2023-05-23-pdfs-to-weaviate/img/donut.png index 3a413b43c2..89b9b7da76 100644 Binary files a/blog/2023-05-23-pdfs-to-weaviate/img/donut.png and b/blog/2023-05-23-pdfs-to-weaviate/img/donut.png differ diff --git a/blog/2023-05-23-pdfs-to-weaviate/img/hero.png b/blog/2023-05-23-pdfs-to-weaviate/img/hero.png index 7c4e5136fb..143bab76b3 100644 Binary files a/blog/2023-05-23-pdfs-to-weaviate/img/hero.png and b/blog/2023-05-23-pdfs-to-weaviate/img/hero.png differ diff --git a/blog/2023-05-30-private-LLM/index.mdx b/blog/2023-05-30-private-LLM/index.mdx index 10436f1490..7af74c40c3 100644 --- a/blog/2023-05-30-private-LLM/index.mdx +++ b/blog/2023-05-30-private-LLM/index.mdx @@ -57,7 +57,7 @@ Let’s dig deeper into locally deployed LLMs, and see how companies can more se ## Locally Running LLMs With Custom Data -Prior to discussing how you can run OSS LLMs locally, let's discuss how you can get any LLM, local or remote, to answer prompts grounded in your custom data. The key ingredient here is to store the documents that you want to use to provide the LLM custom context, in a [vector database](https://weaviate.io/blog/what-is-a-vector-database) so that when needed the LLM can look up and retrieve the relevant documents and consume them to learn more context prior to generating a prompt. This not only provides the LLM custom data and context where it previously had none, but it also prevents hallucinations, since you help provide the LLM with relevant information, greatly reducing the chances it will make something up to fulfill the prompt. This process is known as [retrieval augmented generation (RAG)](https://arxiv.org/pdf/2005.11401.pdf) since you are augmenting the generation process of the LLM with retrieved documents from your vector database. +Prior to discussing how you can run OSS LLMs locally, let's discuss how you can get any LLM, local or remote, to answer prompts grounded in your custom data. The key ingredient here is to store the documents that you want to use to provide the LLM custom context, in a [vector database](/blog/what-is-a-vector-database) so that when needed the LLM can look up and retrieve the relevant documents and consume them to learn more context prior to generating a prompt. This not only provides the LLM custom data and context where it previously had none, but it also prevents hallucinations, since you help provide the LLM with relevant information, greatly reducing the chances it will make something up to fulfill the prompt. This process is known as [retrieval augmented generation (RAG)](https://arxiv.org/pdf/2005.11401.pdf) since you are augmenting the generation process of the LLM with retrieved documents from your vector database. Currently, RAG is a 4-step process illustrated in the figure below: diff --git a/blog/2023-06-13-llms-and-search/img/hero.png b/blog/2023-06-13-llms-and-search/img/hero.png index 3ba6b1f67f..bde0a712f4 100644 Binary files a/blog/2023-06-13-llms-and-search/img/hero.png and b/blog/2023-06-13-llms-and-search/img/hero.png differ diff --git a/blog/2023-06-13-llms-and-search/img/qa-example.png b/blog/2023-06-13-llms-and-search/img/qa-example.png index 9c9b91a18b..abf742fa71 100644 Binary files a/blog/2023-06-13-llms-and-search/img/qa-example.png and b/blog/2023-06-13-llms-and-search/img/qa-example.png differ diff --git a/blog/2023-06-13-llms-and-search/img/tree-of-thought.png b/blog/2023-06-13-llms-and-search/img/tree-of-thought.png index aaf7810288..99462daf64 100644 Binary files a/blog/2023-06-13-llms-and-search/img/tree-of-thought.png and b/blog/2023-06-13-llms-and-search/img/tree-of-thought.png differ diff --git a/blog/2023-06-13-llms-and-search/img/wiki-example.png b/blog/2023-06-13-llms-and-search/img/wiki-example.png index fc47996e7d..f3a46bf98f 100644 Binary files a/blog/2023-06-13-llms-and-search/img/wiki-example.png and b/blog/2023-06-13-llms-and-search/img/wiki-example.png differ diff --git a/blog/2023-06-22-llamaindex-and-weaviate/img/hero.png b/blog/2023-06-22-llamaindex-and-weaviate/img/hero.png index 3211bb076c..716e796795 100644 Binary files a/blog/2023-06-22-llamaindex-and-weaviate/img/hero.png and b/blog/2023-06-22-llamaindex-and-weaviate/img/hero.png differ diff --git a/blog/2023-06-22-llamaindex-and-weaviate/index.mdx b/blog/2023-06-22-llamaindex-and-weaviate/index.mdx index 9b9b24d02d..0086e28b88 100644 --- a/blog/2023-06-22-llamaindex-and-weaviate/index.mdx +++ b/blog/2023-06-22-llamaindex-and-weaviate/index.mdx @@ -74,7 +74,7 @@ nodes = parser.get_nodes_from_documents(blogs) Here, we use the SimpleDirectoryReader to load in all documents from a given directory. We then use our `SimpleNodeParser` to chunk up the source documents into Node objects (text chunks). -The next step is to 1) define a `WeaviateVectorStore`, and 2) build a vector index over this vector store using LlamaIndex. +The next step is to 1) define a `WeaviateVectorStore`, and 2) build a [vector index](/developers/weaviate/concepts/vector-index) over this vector store using LlamaIndex. ```python from llama_index.vector_stores import WeaviateVectorStore diff --git a/blog/2023-06-27-multimodal-models/img/vectorspace.png b/blog/2023-06-27-multimodal-models/img/vectorspace.png index 190d37259f..86eb53519d 100644 Binary files a/blog/2023-06-27-multimodal-models/img/vectorspace.png and b/blog/2023-06-27-multimodal-models/img/vectorspace.png differ diff --git a/blog/2023-07-18-automated-testing/index.mdx b/blog/2023-07-18-automated-testing/index.mdx index 5af3d7399e..d3f9e1ff06 100644 --- a/blog/2023-07-18-automated-testing/index.mdx +++ b/blog/2023-07-18-automated-testing/index.mdx @@ -53,7 +53,7 @@ Such complexity makes it important to test the application as a whole, and not j text={TSCode} startMarker="// START Connect" endMarker="// Client is now ready to accept requests" - language="js" + language="tsv2" /> @@ -131,7 +131,7 @@ If you have yet to install the required dependencies, run the following command: text={TSCode} startMarker="// START ConnectAndCleanup" endMarker="// Client connected and schema cleared" - language="ts" + language="tsv2" /> @@ -162,7 +162,7 @@ Here, the integration test will consist of checking that the class was created w text={TSCode} startMarker="// Create the class" endMarker="// Class created successfully" - language="ts" + language="tsv2" /> @@ -206,7 +206,7 @@ The test is simple; it verifies that all specified objects have been imported by text={TSCode} startMarker="// Import objects from the JSON file" endMarker="// Import completed successfully" - language="ts" + language="tsv2" /> @@ -244,7 +244,7 @@ Depending on your application and usage, you may find that the top result change text={TSCode} startMarker="// Run a test query" endMarker="// Query test completed" - language="ts" + language="tsv2" /> @@ -282,7 +282,7 @@ The code below brings together the setup and tests we've implemented so far - if text={TSCode} startMarker="// START Connect" endMarker="// END all" - language="ts" + language="tsv2" /> diff --git a/blog/2023-08-01-vector-database/img/database_architecture.png b/blog/2023-08-01-vector-database/img/database_architecture.png new file mode 100644 index 0000000000..a91c43bd35 Binary files /dev/null and b/blog/2023-08-01-vector-database/img/database_architecture.png differ diff --git a/blog/2023-08-01-vector-database/index.mdx b/blog/2023-08-01-vector-database/index.mdx index 2ee019b967..b1396bc9b2 100644 --- a/blog/2023-08-01-vector-database/index.mdx +++ b/blog/2023-08-01-vector-database/index.mdx @@ -4,8 +4,9 @@ slug: what-is-a-vector-database authors: [leonie, zain] date: 2023-08-01 image: ./img/hero.png +hide_table_of_contents: true tags: ['concepts'] -description: "Vector databases explained by their core concepts of vector embeddings, vector search, and vector indexing" +description: "What is a Vector Database? Explaination of core concepts, such as vector embeddings, vector search, and vector indexing" --- @@ -21,38 +22,37 @@ If you have just recently heard the term “vector database” for the first tim The excitement around vector databases - sometimes referred to as AI databases - is closely related to the release of ChatGPT. Since late 2022, the public has started to understand the capabilities of state-of-the-art large language models (LLMs), while developers have realized that vector databases can enhance these models further. -This article will walk through and explain some of their core concepts, such as [vector embeddings](/blog/vector-embeddings-explained) and [vector search](/blog/why-is-vector-search-so-fast). Then, we will dive into the technical details of how distance metrics are used in vector search and how vector indexes enable efficient retrieval. Once we have a fundamental understanding, we will discuss vector database use cases and the current tool landscape. +This article will explain some of their core concepts, such as [vector embeddings](/blog/vector-embeddings-explained) and [vector search](/blog/vector-search-explained). Then, we will dive into the technical details of using distance metrics in vector search and how [vector indexes](/developers/weaviate/concepts/vector-index) enable efficient retrieval. Once we have a fundamental understanding, we will discuss use cases and the current tool landscape. ## What is a Vector Database? A vector database indexes, stores, and provides access to structured or unstructured data (e.g., text or images) alongside its vector embeddings, which are the data's numerical representation. It allows users to find and retrieve similar objects quickly at scale in production. ![Definition](img/definition.png) -Because of its search capabilities, a vector database is sometimes also called a vector search engine. - -This section introduces the core concepts of vector databases. We will discuss what vector embeddings are, how they enable similarity search, and how they accelerate it. +Because of its search capabilities, it is sometimes also called a vector search engine. ## How Do Vector Databases Work?​ -Imagine all the files on your computer, you could have text documents, images, songs, videos etc. A vector database can take each file and, using machine learning models, represent/embed them as vectors. In this translation from, human understandable, text, images and more into, machine understandable, vectors it tries to preserve as much of the meaning and semantics of the data as possible. +Vector databases retrieve data objects with vector search. Vector search uses vector embeddings, which are machine-understandable formats of human-understandable data objects, such as text documents, images, songs, videos, and so on. Vector databases also use vector indexing to retrieve data objects at scale. + +This section introduces these core concepts. We will discuss what vector embeddings are, how they enable similarity search, and how they accelerate it. -Once we have all the data embedded into vector representations we can now perform vector search. Let's say you want to search for photos from your vacation, so you type “family vacation in Prague” into the navigator search bar, a vector database would turn that text query into a vector and then search for the object vectors in closest proximity to the query vector. These could be text documents describing the vacation or even pictures you took and those files are then returned to you. Let’s unpack the concept of vector embeddings and vector search further below! ### Vector Embeddings​ -When you think of data, you probably think of neatly organized numbers in spreadsheets. This type of data is called structured data because it can easily be stored in tabular format. But roughly 80% of today’s data is said to be unstructured. Examples of unstructured data are images, text (e.g., documents, social media posts, or emails), or time series data (e.g., audio files, sensor data, or video). The problem with this type of data is that it is difficult to store it in an organized way so you can easily find what you are looking for. +When you think of data, you probably think of neatly organized numbers in spreadsheets. This type of data is called structured data because it can easily be stored in tabular format. However, roughly 80% of today’s data is said to be unstructured. Examples of unstructured data are images, text (e.g., documents, social media posts, or emails), or time series data (e.g., audio files, sensor data, or video). The problem with this type of data is that it is difficult to store it in an organized way so you can easily find what you are looking for. -But innovations in Artificial Intelligence (AI) and Machine Learning have enabled us to numerically represent unstructured data without losing its semantic meaning in so-called vector embeddings. A vector embedding is just a long list of numbers, each describing a feature of the data object. +But innovations in Artificial Intelligence (AI) and Machine Learning (ML) have enabled us to numerically represent unstructured data without losing its semantic meaning in so-called vector embeddings. A vector embedding is just a long list of numbers, each describing a feature of the data object. An example is how we numerically represent colors [in the RGB system](https://huggingface.co/spaces/jphwang/colorful_vectors), where each number in the vector describes how red, green, or blue a color is. E.g., the following green color can be represented as [6, 205, 0] in the RGB system. ![RGB system](img/Untitled.png) -But fitting more complex data, such as words, sentences, or text, into a meaningful series of numbers isn’t trivial. This is where Machine Learning models come in: Machine Learning models enable us to represent the contextual meaning of, e.g., a word as a vector because they have learned to represent the relationship between different words in a vector space. These types of Machine Learning models that can generate embeddings from unstructured data are also called embedding model or vectorizer. +But fitting more complex data, such as words, sentences, or text, into a meaningful series of numbers isn’t trivial. This is where AI models come in: AI models enable us to represent the contextual meaning of, e.g., a word as a vector because they have learned to represent the relationship between different words in a vector space. AI models that can generate embeddings from unstructured data are also called embedding models or vectorizers. Below, you can see an example of the three-dimensional vector space of the RGB system with a few sample data points (colors). ![rgb-color-vector-space](img/Untitled-1.png) -Depending on the used embedding model, the data can be represented in different vector spaces, which can differ in the number of dimensions, ranging from tens to thousands, where the precision of the representation increases with increasing dimensions. In the color example, there are also different ways to represent a color numerically. E.g., you can represent the previous green color in the RGB system as [6, 205, 0] or in the CMYK system as [97, 0, 100, 20]. +Different embedding models represent data in different vector spaces. Vector spaces can differ in the number of dimensions, ranging from tens to thousands, where the precision of the representation increases with increasing dimensions. In the color example, there are also different ways to represent a color numerically. For example, you can represent the previous green color in the RGB system as [6, 205, 0] or in the CMYK system as [97, 0, 100, 20]. This is why it is important to use the same embedding model for all your data to ensure it is in the respective vector space. @@ -63,7 +63,7 @@ For now, let’s consider a simpler example with numerical representations of wo ![vector embeddings](img/vector-embeddings.jpg) ### Vector Search -Vector embeddings allow us to find and retrieve similar objects from the vector database by searching for objects that are close to each other in the vector space, which is called vector search, similarity search, or semantic search. +Vector embeddings allow us to find and retrieve similar objects by searching for objects that are close to each other in the vector space. This concept is called [vector search](/blog/vector-search-explained), similarity search, or semantic search. Similarly to how we can find similar vectors for the word "Dog", we can find similar vectors to a search query. For example, to find words similar to the word “Kitten”, we can generate a vector embedding for this query term - also called a query vector - and retrieve all its nearest neighbors, such as the word “Cat”, as illustrated below. @@ -71,32 +71,30 @@ Similarly to how we can find similar vectors for the word "Dog", we can find sim As the concept of semantic search is based on the contextual meaning, it allows for a more human-like search experience by retrieving relevant search results that match the user's intent. This advantage makes vector search important for applications, that are e.g., sensitive to typos or synonyms. -The numerical representation of a data object allows us to apply mathematical operations to them, such as calculating the distance between two vector representations to determine their similarity. To calculate the distance between two vectors, you can use several similarity measures. E.g., Weaviate supports the following distance metrics: +The numerical representation of a data object allows us to apply mathematical operations to them. For example you can calculate the distance between two vector representations to determine their similarity. You can use several similarity measures to calculate the distance between two vectors. E.g., Weaviate supports the following distance metrics: * **Squared Euclidean or L2-squared distance** calculates the straight-line distance between two vectors. Its range is [0, ∞], where 0 represents identical vectors, and larger values represent increasingly dissimilar vectors. * **Manhattan or L1 distance** calculates the sum of the lengths of the projections of the line segment between the points onto the coordinate axes. Its range is [0, ∞], where 0 represents identical vectors, and larger values represent increasingly dissimilar vectors. -* **Cosine similarity** calculates the cosine of the angle between two vectors. In Weaviate, the cosine distance is used for the complement of cosine similarity. Its range is [0, 2], where 0 represents identical vectors, and 2 represents vectors that point in opposite directions. -* **Dot product** calculates the product of the magnitudes of two vectors and the cosine of the angle between them. Its range is [-∞, ∞], where 0 represents orthogonal vectors, and larger values represent increasingly similar vectors. In Weaviate, the negative dot product is used to keep the intuition that larger values represent increasingly dissimilar vectors. -* Hamming distance calculates the number of differences between vectors at each dimension. +* **Cosine similarity** calculates the cosine of the angle between two vectors. Weaviate uses the cosine distance for the complement of cosine similarity. Its range is [0, 2], where 0 represents identical vectors, and 2 represents vectors that point in opposite directions. +* **Dot product** calculates the product of the magnitudes of two vectors and the cosine of the angle between them. Its range is [-∞, ∞], where 0 represents orthogonal vectors, and larger values represent increasingly similar vectors. Weaviate uses the negative dot product to keep the intuition that larger values represent increasingly dissimilar vectors. +* **Hamming distance** calculates the number of differences between vectors at each dimension. ![distance metrics](img/similarity-measures.jpg) -As you can see, there are many different similarity measures. As a rule of thumb, select the same metric as the one used to train the Machine Learning model. If you are unsure which one was used, you can usually find this information on the hosting service’s site, e.g., [OpenAI’s ada-002 uses cosine similarity](https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use) or [MiniLM hosted on Hugging Face supports cosine similarity, dot product, and Euclidean distance](https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1#technical-details). +As you can see, there are many different similarity measures. As a rule of thumb, select the same metric as the one used to train the ML model. Suppose you are unsure which one was used. In that case, you can usually find this information on the hosting service’s site, e.g., [OpenAI’s ada-002 uses cosine similarity](https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use) or [MiniLM hosted on Hugging Face supports cosine similarity, dot product, and Euclidean distance](https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1#technical-details). To learn more about the different distance metrics, you can continue reading our blog post on [What are Distance Metrics in Vector Search?](/blog/distance-metrics-in-vector-search) -## Vector Database Architecture - ### Vector Indexing for Approximate Nearest Neighbor Approach​ -Vector indexing is the process of organizing vector embeddings in a way that data can be retrieved efficiently. +Vector indexing is the process of organizing vector embeddings so that data can be retrieved efficiently. -When you want to find the closest items to a given query vector, the brute force approach would be to use the k-Nearest Neighbors (kNN) algorithm. But calculating the similarity between your query vector and every entry in the vector database requires a lot of computational resources, especially if you have large datasets with millions or even billions of data points, because the required calculations increase linearly (O(n)) with the dimensionality and the number of data points. +When you want to find the closest items to a given query vector, the brute force approach would be to use the k-Nearest Neighbors (kNN) algorithm. But calculating the similarity between your query vector and every entry in the vector database requires a lot of computational resources, especially if you have large datasets with millions or even billions of data points. This is because the required calculations increase linearly (O(n)) with the dimensionality and the number of data points. -A more efficient solution to find similar objects is to use an **approximate nearest neighbor (ANN) approach**. The underlying idea is to pre-calculate the distances between the vector embeddings and organize and store similar vectors close to each other (e.g., in clusters or a graph), so that you can later find similar objects faster. This process is called vector indexing. Note that the speed gains are traded in for some accuracy because the ANN approach returns only the approximate results. +A more efficient solution to find similar objects is to use an **approximate nearest neighbor (ANN) approach**. The underlying idea is to pre-calculate the distances between the vector embeddings. Then you can organize and store similar vectors close to each other (e.g., in clusters or a graph), so that you can later find similar objects faster. This process is called vector indexing. Note that the speed gains are traded in for some accuracy because the ANN approach returns only the approximate results. -In the previous example, one option would be to pre-calculate some clusters, e.g., animals, fruits, and so on. So, when you query the vector database for "Kitten", you could start your search by only looking at the closest animals and not waste time calculating the distances between all fruits and other non-animal objects. More specifically, the ANN algorithm can help you to start the search in a region near, e.g., four-legged animals. Then, the algorithm would also prevent you from venturing further from relevant results, as the objects are pre-organized by similarity. +In the previous example, one option would be to pre-calculate some clusters, e.g., animals, fruits, and so on. So, when you query the database for "Kitten", you could start your search by only looking at the closest animals and not waste time calculating the distances between all fruits and other non-animal objects. More specifically, the ANN algorithm can help you to start the search in a region near, e.g., four-legged animals. Then, the algorithm would also prevent you from venturing further from relevant results. ![Vector indexing for Approximate Nearest Neighbor](img/vector-indexing.jpg) -The above example roughly describes the concept of the Hierarchical Navigable Small World (HNSW) algorithm, which is the default ANN algorithm in Weaviate. However, there are several ANN algorithms to index the vectors, which can be categorized into the following groups: +The above example roughly describes the Hierarchical Navigable Small World (HNSW) algorithm. It is also the default ANN algorithm in Weaviate. However, there are several ANN algorithms to index the vectors, which can be categorized into the following groups: * Clustering-based index (e.g., [FAISS](https://github.com/facebookresearch/faiss)) * Proximity graph-based index (e.g., [HNSW](https://arxiv.org/abs/1603.09320)) * Tree-based index (e.g., [ANNOY](https://github.com/spotify/annoy)) @@ -105,16 +103,25 @@ The above example roughly describes the concept of the Hierarchical Navigable Sm Note that indexing enables fast retrieval at query time, but it can take a lot of time to build the index initially. -Further reading: [Why Is Vector Search So Fast](/blog/why-is-vector-search-so-fast) +Further reading: [Why Is Vector Search So Fast](/blog/vector-search-explained) + +## Vector Database Architecture + +Since vector databases do not only store vector embeddings but also the original data objects, their architecture consists of multiple indices. + +Below you can see an example of the [Weaviate vector database architecture](/developers/weaviate/concepts#weaviate-architecture). +![Database architecture](img/database_architecture.png) + +Users can create any number of indices and each index can contain any number of shards. Shards can be dsitributed and/or replicated across nodes in the cluster. A shard always contains object, inverted, and vector storage. Vector storage is not affected by LSM segmentation. -## Vector Database Use Cases -Vector databases’ search capabilities can be used in various applications ranging from classical Machine Learning use cases, such as natural language processing, computer vision, and recommender systems, to providing long-term memory to LLMs in modern applications. +## Vector Database Use Cases +A wide variety of applications use the search capabilities of vector databases. They range from classical ML use cases, such as natural language processing (NLP), computer vision, and recommender systems, to providing long-term memory to LLMs in modern applications. -The **most popular use case of vector search engines is naturally for search**. Because a vector database can help find similar objects, it is predestined for applications where you might want to find similar products, movies, books, songs, etc. That’s why vector search engines are also **used in recommendation systems** as a restated task of search. +The **most popular use case of vector databases is naturally for search**. Because a vector search can help find similar objects, it is predestined for applications where you might want to find similar products, movies, books, songs, etc. That’s why they are also **used in recommendation systems** as a restated search task. -With the rise of LLMs, **vector databases have already been used to enhance modern Generative AI applications**.You might have already come across the term that vector databases provide LLMs with long-term memory. LLMs are stateless, which means that they immediately forget what you have just discussed if you don’t store this information in, e.g., a vector database and thus provide them with a state. This enables LLMs to hold an actual conversation. Also, you can store the domain-specific context in a vector database to minimize the LLM from hallucinating. Other popular examples of vector databases improving the capabilities of LLMs are question-answering and retrieval-augmented generation. +With the rise of LLMs, **many modern Generative AI applications use vector databases as an external knowledge source**. You might have already come across the term that they provide LLMs with long-term memory. LLMs are stateless, which means that they immediately forget what you have just discussed if you don’t store this information in, e.g., a vector database and thus provide them with a state. This enables LLMs to hold an actual conversation. Also, you can store additional information in them as part of a[retrieval-augmented generation (RAG)](/blog/introduction-to-rag) pipeline to reduce hallucinations. -Here is an example [demo](https://github.com/weaviate/healthsearch-demo) called [HealthSearch](https://weaviate.io/blog/healthsearch-demo) of a [Weaviate](http://weaviate.io/) vector database in action together with an LLM showcasing the potential of leveraging user-written reviews and queries to retrieve supplement products based on specific health effects. +Here is an example [demo](https://github.com/weaviate/healthsearch-demo) called [HealthSearch](https://weaviate.io/blog/healthsearch-demo) of a [Weaviate](http://weaviate.io/) vector database in action together with an LLM showcasing the potential of leveraging user-written reviews and queries to retrieve supplement products based on specific health effects. ![example-use-case-llm-vector-database](img/image8.png) @@ -122,15 +129,15 @@ Here is an example [demo](https://github.com/weaviate/healthsearch-demo) called Although vector databases are AI-native and specifically designed to handle vector embeddings and enable efficient vector search, alternatives like [vector libraries](https://weaviate.io/blog/vector-library-vs-vector-database) and vector-capable databases exist as well. ### Vector Database vs. Traditional (Relational) Database​ -The main difference between a traditional (relational) database and a modern vector database comes from the type of data they were optimized for. While a relational database is designed to store structured data in columns, a vector database is also optimized to store unstructured data (e.g., text, images, or audio) and their vector embeddings. +The main difference between a modern vector and a traditional (relational) database comes from the type of data they were optimized for. While a relational database is designed to store structured data in columns, a vector database is also optimized to store unstructured data (e.g., text, images, or audio) and their vector embeddings. -Because vector databases and relational databases are optimized for different types of data, they also differ in the way data is stored and retrieved. In a relational database, data is stored in columns and retrieved by keyword matches in traditional search. In contrast, vector databases also store the vector embeddings of the original data, which enables efficient semantic search. Because vector search is capable of semantically understanding your search terms, it doesn't rely on retrieving relevant search results based on exact matches, which makes it robust to typos and synonyms. +Because vector and relational databases are optimized for different types of data, they also differ in how data is stored and retrieved. In a relational database, data is stored in columns and retrieved by keyword matches in traditional search. In contrast, vector databases also store the original data's vector embeddings, enabling efficient semantic search. Because vector search can semantically understand your search terms, it doesn't rely on retrieving relevant search results based on exact matches. This makes it robust to synonyms. For example, imagine you have a database that stores Jeopardy questions, and you want to retrieve all questions that contain an animal. Because search in traditional databases relies on keyword matches, you would have to create a big query that queries all animals (e.g., contains "dog", or contains "cat", or contains "wolf", etc.). With semantic search, you could simply query for the concept of "animals". ![Traditional search vs. vector search](img/Traditional_Search_X_Vector_Search.jpg) -Because most vector databases do not only store vector embeddings but store them together with the original source data, they are not only capable of vector search but also enable traditional keyword search. Some vector databases like Weaviate even support [hybrid search](https://weaviate.io/blog/hybrid-search-explained) capabilities that combine vector search with keyword search. +Because most vector databases do not only store vector embeddings but store them together with the original source data, they are not only capable of vector search but also enable traditional keyword search. Some, like Weaviate, even support [hybrid search](https://weaviate.io/blog/hybrid-search-explained) capabilities that combine vector search with keyword search. ### Vector Database vs. Vector-Capable Database (SQL and NoSQL)​ Today, many existing databases have already enabled vector support and vector search. However, they usually don’t index the vector embeddings, which makes the vector search slow. Thus, an advantage of AI-native vector databases over vector-capable databases is their efficiency in vector search due to vector indexing. @@ -148,7 +155,7 @@ A graph database stores data in nodes and edges, representing entities and their ### Vector Database vs. Vector Store -A vector store is a more lightweight system or library designed specifically to store and retrieve vector embeddings and it focuses more on managing vectors and supports basic operations like indexing and querying. A vector database on the other hand not only stores and retrieves vector embeddings but also offers comprehensive database functionalities such as distributed storage, scaling, security, and support for complex queries. +A vector store is a lighter system or library designed specifically to store and retrieve vector embeddings. It focuses more on managing vectors and supports basic operations like indexing and querying. A vector database, on the other hand, not only stores and retrieves vector embeddings but also offers comprehensive database functionalities such as distributed storage, scaling, security, and support for complex queries. ## Vector Database FAQs @@ -156,27 +163,30 @@ This section answers some common questions about vector databases. ### Why we need vector databases -Vector databases are essential for efficiently managing and searching high-dimensional vector embeddings, enabling real-time accurate similarity searches that perform a critical function in the AI-native app stack. +Vector databases are essential for efficiently managing and searching high-dimensional vector embeddings. They enable real-time accurate similarity searches, which are critical in the AI-native app stack. ### Why Use a Vector Database?​ -Vector databases have become a critical component in the AI-native app stack, particularly for managing the vast amounts of unstructured data that organizations generate, such as images, text, and audio. Unlike traditional databases, which struggle with unstructured data, vector databases efficiently store, search, and analyze this data by leveraging high-dimensional vector representations, or embeddings. This capability is particularly beneficial where the ability to retrieve relevant information quickly and accurately is critical. For example, in recommendation systems or natural language processing (NLP) tasks, vector databases enable businesses to unlock valuable insights, leading to more informed decision-making and improved personalization. Furthermore, vector databases enable human-like semantic search capabilities, allowing businesses to find products, content, or information that closely matches a user's query. This not only improves user experience and engagement but also drives customer specific personalization. +Vector databases have become a critical component in the AI-native app stack, particularly for managing the vast amounts of unstructured data that organizations generate, such as images, text, and audio. Unlike traditional databases, which struggle with unstructured data, vector databases efficiently store, search, and analyze this data by leveraging high-dimensional vector representations or embeddings. This capability is particularly beneficial where the ability to retrieve relevant information quickly and accurately is critical. -The scalability and performance offered by vector databases are crucial as businesses grow and data volumes increase. These databases are optimized for handling large-scale, high-dimensional vectors, ensuring that data retrieval remains fast and accurate even at scale. This scalability is vital for AI applications that require real-time data processing, such as chatbots, fraud detection, and other interactive AI systems. Additionally, vector databases integrate seamlessly with existing AI workflows, including LLM orchestration frameworks, embedding model providers, and inference engines. This integration simplifies the deployment and scaling of production-level retrieval-augmented generation (RAG) applications, making it easier for businesses to harness the full potential of AI. By providing a specialized infrastructure for storing and retrieving vectors, vector databases reduce the complexity and cost associated with AI development, allowing organizations to focus on innovation and delivering personalized experiences to their customers. +For example, in recommendation systems or NLP tasks, vector databases enable businesses to unlock valuable insights, leading to more informed decision-making and improved personalization. Furthermore, they enable human-like semantic search capabilities, allowing businesses to find products, content, or information that closely match a user's query. This not only improves user experience and engagement but also drives customer-specific personalization. + +Vector databases' scalability and performance are crucial as businesses grow and data volumes increase. These databases are optimized for handling large-scale, high-dimensional vectors, ensuring that data retrieval remains fast and accurate even at scale. This scalability is vital for AI applications that require real-time data processing, such as chatbots, fraud detection, and other interactive AI systems. + +Additionally, vector databases integrate seamlessly with existing AI workflows, including LLM orchestration frameworks, embedding model providers, and inference engines. This integration simplifies the deployment and scaling of production-level RAG applications, making it easier for businesses to harness AI's full potential. By providing a specialized infrastructure for storing and retrieving vectors, vector databases reduce the complexity and cost associated with AI development, allowing organizations to focus on innovation and delivering personalized experiences to their customers. ### How to use a vector database -Store vector embeddings in the database, index them for efficient retrieval, and perform similarity searches to find the most relevant data points. +Store vector embeddings in the database, index them for efficient retrieval and perform similarity searches to find the most relevant data points. ### How to choose a vector database - -A vector database should be chosen by assessing latency of searches, memory footprint as object count scales up, recall and retrieval relevancy, cost efficiency and integration capabilities with your existing stack and AI tools such as language models and embedding models. +Selection criteria for vector databases are search latency, memory footprint as object count scales up, recall and retrieval relevancy, cost efficiency, and integration capabilities with your existing stack and AI tools, such as language models and embedding models. ## Summary​ This article explained that vector databases are a type of database that indexes, stores, and provides access to structured or unstructured data alongside its vector embeddings. Vector databases like [Weaviate](http://weaviate.io/) allow for efficient similarity search and retrieval of data based on their vector distance or vector similarity at scale. -We covered core concepts around vector databases, such as vector embeddings, and discussed that vector databases enable efficient vector search by leveraging ANN algorithms. Additionally, we explored other vector database tools and discussed the advantages of vector databases over traditional and vector-capable databases and vector libraries. +We covered their core concepts, such as vector embeddings, and discussed that they enable efficient vector search by leveraging ANN algorithms. Additionally, we explored other vector search tools and discussed the advantages of vector databases over traditional and vector-capable databases and vector libraries. -**Last Updated On**: September 18th, 2024 +**Last Updated On**: November 189th, 2024 import WhatNext from '/_includes/what-next.mdx' diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine-example.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine-example.png index 6cbfdfa58e..4d6642fcad 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine-example.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine-example.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine.png index e92d8d61ab..bbc4e00fbd 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/cosine.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/direction.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/direction.png index 27795da2d7..ce85f544ff 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/direction.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/direction.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/dot-product.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/dot-product.png index f3747f89e9..7fb839b7dc 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/dot-product.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/dot-product.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/equation1.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/equation1.png index 6721b2d50b..10d04aceb2 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/equation1.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/equation1.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/hamming-and-bpr.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/hamming-and-bpr.png index 6bb99a909d..9e7b92c0b6 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/hamming-and-bpr.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/hamming-and-bpr.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/hero.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/hero.png index c23fc858e3..cdd36787be 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/hero.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/hero.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-equation.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-equation.png index e1a0edf190..6e109b2589 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-equation.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-equation.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-formula.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-formula.png index a1ff6005f4..67f00b8d11 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-formula.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/l2-formula.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan-example.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan-example.png index 09585be165..d0d4090f40 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan-example.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan-example.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan.png index ec6951bbdd..29599bdf91 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/manhattan.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/img/vectors-example.png b/blog/2023-08-15-distance-metrics-in-vector-search/img/vectors-example.png index 8fa705dd60..69d65c5b1d 100644 Binary files a/blog/2023-08-15-distance-metrics-in-vector-search/img/vectors-example.png and b/blog/2023-08-15-distance-metrics-in-vector-search/img/vectors-example.png differ diff --git a/blog/2023-08-15-distance-metrics-in-vector-search/index.mdx b/blog/2023-08-15-distance-metrics-in-vector-search/index.mdx index 9d820b9e8f..6ab7308b6e 100644 --- a/blog/2023-08-15-distance-metrics-in-vector-search/index.mdx +++ b/blog/2023-08-15-distance-metrics-in-vector-search/index.mdx @@ -50,7 +50,7 @@ The best thing is, vector databases can **query large datasets**, containing * Without getting too much into details, one of the big reasons why vector databases are so fast is because they use the **Approximate Nearest Neighbor** (ANN) algorithm to index data based on vectors. ANN algorithms organize indexes so that the vectors that are closely related are stored next to each other. -Check out this article to learn ["Why is Vector Search are so Fast"](/blog/why-is-vector-search-so-fast) and how vector databases work. +Check out this article to learn ["Why is Vector Search are so Fast"](/blog/vector-search-explained) and how vector databases work. ### Why are there Different Distance Metrics? diff --git a/blog/2023-09-11-weaviate-gorilla-part-1/img/1.png b/blog/2023-09-11-weaviate-gorilla-part-1/img/1.png index 9907fdcf07..927be89e36 100644 Binary files a/blog/2023-09-11-weaviate-gorilla-part-1/img/1.png and b/blog/2023-09-11-weaviate-gorilla-part-1/img/1.png differ diff --git a/blog/2023-09-11-weaviate-gorilla-part-1/img/2.png b/blog/2023-09-11-weaviate-gorilla-part-1/img/2.png index 6809d323ea..7e751e0220 100644 Binary files a/blog/2023-09-11-weaviate-gorilla-part-1/img/2.png and b/blog/2023-09-11-weaviate-gorilla-part-1/img/2.png differ diff --git a/blog/2023-09-11-weaviate-gorilla-part-1/img/3.png b/blog/2023-09-11-weaviate-gorilla-part-1/img/3.png index cdaefc08e9..bbb9856fc5 100644 Binary files a/blog/2023-09-11-weaviate-gorilla-part-1/img/3.png and b/blog/2023-09-11-weaviate-gorilla-part-1/img/3.png differ diff --git a/blog/2023-09-11-weaviate-gorilla-part-1/img/4.png b/blog/2023-09-11-weaviate-gorilla-part-1/img/4.png index 26319013f3..9eced34fc6 100644 Binary files a/blog/2023-09-11-weaviate-gorilla-part-1/img/4.png and b/blog/2023-09-11-weaviate-gorilla-part-1/img/4.png differ diff --git a/blog/2023-09-11-weaviate-gorilla-part-1/img/5.png b/blog/2023-09-11-weaviate-gorilla-part-1/img/5.png index dd1ac12471..77ffc0b1eb 100644 Binary files a/blog/2023-09-11-weaviate-gorilla-part-1/img/5.png and b/blog/2023-09-11-weaviate-gorilla-part-1/img/5.png differ diff --git a/blog/2023-09-11-weaviate-gorilla-part-1/img/hero.png b/blog/2023-09-11-weaviate-gorilla-part-1/img/hero.png index 4b946c96e1..b2104414fd 100644 Binary files a/blog/2023-09-11-weaviate-gorilla-part-1/img/hero.png and b/blog/2023-09-11-weaviate-gorilla-part-1/img/hero.png differ diff --git a/blog/2023-09-26-collections-python-client/img/hero.png b/blog/2023-09-26-collections-python-client/img/hero.png index b3cc201320..56031dde65 100644 Binary files a/blog/2023-09-26-collections-python-client/img/hero.png and b/blog/2023-09-26-collections-python-client/img/hero.png differ diff --git a/blog/2023-09-26-collections-python-client/img/inverted-index-hints.png b/blog/2023-09-26-collections-python-client/img/inverted-index-hints.png index d41af10189..66bfee60b9 100644 Binary files a/blog/2023-09-26-collections-python-client/img/inverted-index-hints.png and b/blog/2023-09-26-collections-python-client/img/inverted-index-hints.png differ diff --git a/blog/2023-10-02-hacktoberfest-2023/img/hacktoberfest_2023_demo.mp4 b/blog/2023-10-02-hacktoberfest-2023/img/hacktoberfest_2023_demo.mp4 index 7a04c39e72..4c1abe66a8 100644 Binary files a/blog/2023-10-02-hacktoberfest-2023/img/hacktoberfest_2023_demo.mp4 and b/blog/2023-10-02-hacktoberfest-2023/img/hacktoberfest_2023_demo.mp4 differ diff --git a/blog/2023-10-02-hacktoberfest-2023/img/weaviate-demos.png b/blog/2023-10-02-hacktoberfest-2023/img/weaviate-demos.png index 693c6ee6a2..c04eeb5ee3 100644 Binary files a/blog/2023-10-02-hacktoberfest-2023/img/weaviate-demos.png and b/blog/2023-10-02-hacktoberfest-2023/img/weaviate-demos.png differ diff --git a/blog/2023-10-02-hacktoberfest-2023/img/weaviate-hacktoberfest-2023.png b/blog/2023-10-02-hacktoberfest-2023/img/weaviate-hacktoberfest-2023.png index 0d37229442..41c6109cec 100644 Binary files a/blog/2023-10-02-hacktoberfest-2023/img/weaviate-hacktoberfest-2023.png and b/blog/2023-10-02-hacktoberfest-2023/img/weaviate-hacktoberfest-2023.png differ diff --git a/blog/2023-11-15-moonsift-story/img/hero.png b/blog/2023-11-15-moonsift-story/img/hero.png index 9916177a62..ffec81d48b 100644 Binary files a/blog/2023-11-15-moonsift-story/img/hero.png and b/blog/2023-11-15-moonsift-story/img/hero.png differ diff --git a/blog/2023-11-15-moonsift-story/img/image1.png b/blog/2023-11-15-moonsift-story/img/image1.png index 9cdc04e0ce..3130b772ab 100644 Binary files a/blog/2023-11-15-moonsift-story/img/image1.png and b/blog/2023-11-15-moonsift-story/img/image1.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/agents.png b/blog/2023-11-21-rag-evaluation/img/agents.png index 5134ec76ed..7b0491628b 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/agents.png and b/blog/2023-11-21-rag-evaluation/img/agents.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/chunk.png b/blog/2023-11-21-rag-evaluation/img/chunk.png index 60bb5e42fa..53c751b81a 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/chunk.png and b/blog/2023-11-21-rag-evaluation/img/chunk.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/hero.png b/blog/2023-11-21-rag-evaluation/img/hero.png index bbc491bd42..9404e8b6b3 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/hero.png and b/blog/2023-11-21-rag-evaluation/img/hero.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/multi-index.png b/blog/2023-11-21-rag-evaluation/img/multi-index.png index e87fce7814..55928ce1b9 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/multi-index.png and b/blog/2023-11-21-rag-evaluation/img/multi-index.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/rag-eval.png b/blog/2023-11-21-rag-evaluation/img/rag-eval.png index 336fbb993f..7b1da63af0 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/rag-eval.png and b/blog/2023-11-21-rag-evaluation/img/rag-eval.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/ragas-score.png b/blog/2023-11-21-rag-evaluation/img/ragas-score.png index 328021923c..07bb3bbe98 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/ragas-score.png and b/blog/2023-11-21-rag-evaluation/img/ragas-score.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/sql-router.png b/blog/2023-11-21-rag-evaluation/img/sql-router.png index ea89619a38..dc2b97734c 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/sql-router.png and b/blog/2023-11-21-rag-evaluation/img/sql-router.png differ diff --git a/blog/2023-11-21-rag-evaluation/img/sub-question.png b/blog/2023-11-21-rag-evaluation/img/sub-question.png index 862a2b541c..ecd3393f25 100644 Binary files a/blog/2023-11-21-rag-evaluation/img/sub-question.png and b/blog/2023-11-21-rag-evaluation/img/sub-question.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/any2any_D.png b/blog/2023-12-05-multimodal-RAG/img/any2any_D.png index 2a6f7f9ba3..0d14c97783 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/any2any_D.png and b/blog/2023-12-05-multimodal-RAG/img/any2any_D.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/any2any_L.png b/blog/2023-12-05-multimodal-RAG/img/any2any_L.png index 7ed3a6b0b3..16f169cbf0 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/any2any_L.png and b/blog/2023-12-05-multimodal-RAG/img/any2any_L.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/cross_modal.png b/blog/2023-12-05-multimodal-RAG/img/cross_modal.png index cfb9c15b0c..8d896db2b2 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/cross_modal.png and b/blog/2023-12-05-multimodal-RAG/img/cross_modal.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/hero.png b/blog/2023-12-05-multimodal-RAG/img/hero.png index 9d527b9bb3..05e50f8cfb 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/hero.png and b/blog/2023-12-05-multimodal-RAG/img/hero.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/image_a.png b/blog/2023-12-05-multimodal-RAG/img/image_a.png index 0312dec553..6ba214c615 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/image_a.png and b/blog/2023-12-05-multimodal-RAG/img/image_a.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/image_b.png b/blog/2023-12-05-multimodal-RAG/img/image_b.png index 7f9e4017b9..25d9900a35 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/image_b.png and b/blog/2023-12-05-multimodal-RAG/img/image_b.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/mmRAG_D.png b/blog/2023-12-05-multimodal-RAG/img/mmRAG_D.png index 68d76801d6..40cc9fed71 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/mmRAG_D.png and b/blog/2023-12-05-multimodal-RAG/img/mmRAG_D.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/mm_RAG_L.png b/blog/2023-12-05-multimodal-RAG/img/mm_RAG_L.png index a6e9c04eb4..98334f1082 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/mm_RAG_L.png and b/blog/2023-12-05-multimodal-RAG/img/mm_RAG_L.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/puppy.png b/blog/2023-12-05-multimodal-RAG/img/puppy.png index 8205a46d0a..a260e97e42 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/puppy.png and b/blog/2023-12-05-multimodal-RAG/img/puppy.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/puppy_dalle.png b/blog/2023-12-05-multimodal-RAG/img/puppy_dalle.png index e418dcdd55..68453a44e4 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/puppy_dalle.png and b/blog/2023-12-05-multimodal-RAG/img/puppy_dalle.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/unified_emb_D.png b/blog/2023-12-05-multimodal-RAG/img/unified_emb_D.png index 8894fda3d2..9192814e82 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/unified_emb_D.png and b/blog/2023-12-05-multimodal-RAG/img/unified_emb_D.png differ diff --git a/blog/2023-12-05-multimodal-RAG/img/unified_emb_L.png b/blog/2023-12-05-multimodal-RAG/img/unified_emb_L.png index 8adeef32df..1da715c9d1 100644 Binary files a/blog/2023-12-05-multimodal-RAG/img/unified_emb_L.png and b/blog/2023-12-05-multimodal-RAG/img/unified_emb_L.png differ diff --git a/blog/2023-12-19-weaviate-1-23-release/img/generative-anyscale.png b/blog/2023-12-19-weaviate-1-23-release/img/generative-anyscale.png index 899780880d..b77cf62bb3 100644 Binary files a/blog/2023-12-19-weaviate-1-23-release/img/generative-anyscale.png and b/blog/2023-12-19-weaviate-1-23-release/img/generative-anyscale.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/Group_2596.png b/blog/2023-12-26-weaviate-recap/img/Group_2596.png new file mode 100644 index 0000000000..e1fc3a3b5a Binary files /dev/null and b/blog/2023-12-26-weaviate-recap/img/Group_2596.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/Group_2596_(1).png b/blog/2023-12-26-weaviate-recap/img/Group_2596_(1).png deleted file mode 100644 index ea565b318a..0000000000 Binary files a/blog/2023-12-26-weaviate-recap/img/Group_2596_(1).png and /dev/null differ diff --git a/blog/2023-12-26-weaviate-recap/img/Group_2597.png b/blog/2023-12-26-weaviate-recap/img/Group_2597.png index ebe5b9887f..a750ed1122 100644 Binary files a/blog/2023-12-26-weaviate-recap/img/Group_2597.png and b/blog/2023-12-26-weaviate-recap/img/Group_2597.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/Recap_2023.png b/blog/2023-12-26-weaviate-recap/img/Recap_2023.png index ead51206e9..b6b38642b0 100644 Binary files a/blog/2023-12-26-weaviate-recap/img/Recap_2023.png and b/blog/2023-12-26-weaviate-recap/img/Recap_2023.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/Weaviate-hero_(1).gif b/blog/2023-12-26-weaviate-recap/img/Weaviate-hero.gif similarity index 100% rename from blog/2023-12-26-weaviate-recap/img/Weaviate-hero_(1).gif rename to blog/2023-12-26-weaviate-recap/img/Weaviate-hero.gif diff --git a/blog/2023-12-26-weaviate-recap/img/hackathons.png b/blog/2023-12-26-weaviate-recap/img/hackathons.png index 50520e5367..ce9fb78d6f 100644 Binary files a/blog/2023-12-26-weaviate-recap/img/hackathons.png and b/blog/2023-12-26-weaviate-recap/img/hackathons.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/hero.png b/blog/2023-12-26-weaviate-recap/img/hero.png index 685f4713fa..7b612e3a60 100644 Binary files a/blog/2023-12-26-weaviate-recap/img/hero.png and b/blog/2023-12-26-weaviate-recap/img/hero.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/workshops.png b/blog/2023-12-26-weaviate-recap/img/workshops.png new file mode 100644 index 0000000000..5e30e89ab8 Binary files /dev/null and b/blog/2023-12-26-weaviate-recap/img/workshops.png differ diff --git a/blog/2023-12-26-weaviate-recap/img/workshops_3.png b/blog/2023-12-26-weaviate-recap/img/workshops_3.png deleted file mode 100644 index 5375f64e82..0000000000 Binary files a/blog/2023-12-26-weaviate-recap/img/workshops_3.png and /dev/null differ diff --git a/blog/2023-12-26-weaviate-recap/index.mdx b/blog/2023-12-26-weaviate-recap/index.mdx index db8572e662..8bef4575b6 100644 --- a/blog/2023-12-26-weaviate-recap/index.mdx +++ b/blog/2023-12-26-weaviate-recap/index.mdx @@ -42,7 +42,7 @@ In the realm of Generative AI, especially with the emergence of OpenAI's ChatGPT Our in-house projects, [Verba, an open-source RAG app](https://github.com/weaviate/Verba) and [Health Search](https://github.com/weaviate/healthsearch-demo) built by [Edward Schmuhl](https://www.linkedin.com/in/edwardschmuhl/), and other projects like [Leonie Monigatti's](https://www.linkedin.com/in/804250ab/) [Awesome-Moviate](https://github.com/weaviate-tutorials/awesome-moviate) and [Adam Chan](https://www.linkedin.com/in/itsajchan/)'s [Recommendation System](https://github.com/itsajchan/Create-JSON-Data-with-AI) have pushed the boundaries of what's possible with vector databases applicable to different industry use cases. -![build with weaviate](img/Group_2596_(1).png) +![build with weaviate](img/Group_2596.png) ### Community projects @@ -73,7 +73,7 @@ Every week, [Zain](https://www.linkedin.com/in/zainhas/), [JP](https://www.linke Later in the year, we teamed up with [DeepLearningAI](https://www.deeplearning.ai/) to create a short course with [Sebastian](https://www.linkedin.com/in/sebawita/) and [Zain](https://www.linkedin.com/in/zainhas/), "[Vector Databases: from Embeddings to Applications with Weaviate](https://www.deeplearning.ai/short-courses/vector-databases-embeddings-applications/)." It’s been a year packed with learning. -![workshops](img/workshops_3.png) +![workshops](img/workshops.png) ## Building a Global Community @@ -100,7 +100,7 @@ Nominate your hero [here](https://docs.google.com/forms/d/e/1FAIpQLSePtgvTPZGx2g As we keep building, learning, and collaborating, we're excited to see the innovations that 2024 will bring. 💫 -![Weaviate Hero](img/Weaviate-hero_(1).gif) +![Weaviate Hero](img/Weaviate-hero.gif) import WhatNext from '/_includes/what-next.mdx' diff --git a/blog/2024-01-23-typescript-multimodal-search/img/hero.png b/blog/2024-01-23-typescript-multimodal-search/img/hero.png index d3bbcfd786..eab5d2d6a9 100644 Binary files a/blog/2024-01-23-typescript-multimodal-search/img/hero.png and b/blog/2024-01-23-typescript-multimodal-search/img/hero.png differ diff --git a/blog/2024-01-23-typescript-multimodal-search/img/multimodal-1.png b/blog/2024-01-23-typescript-multimodal-search/img/multimodal-1.png index bc7466e44a..d01405217b 100644 Binary files a/blog/2024-01-23-typescript-multimodal-search/img/multimodal-1.png and b/blog/2024-01-23-typescript-multimodal-search/img/multimodal-1.png differ diff --git a/blog/2024-01-23-typescript-multimodal-search/img/multimodal-2.png b/blog/2024-01-23-typescript-multimodal-search/img/multimodal-2.png index d636326114..dbfd351248 100644 Binary files a/blog/2024-01-23-typescript-multimodal-search/img/multimodal-2.png and b/blog/2024-01-23-typescript-multimodal-search/img/multimodal-2.png differ diff --git a/blog/2024-01-23-typescript-multimodal-search/img/mumose-1.gif b/blog/2024-01-23-typescript-multimodal-search/img/mumose-1.gif deleted file mode 100644 index 6d5cb56386..0000000000 Binary files a/blog/2024-01-23-typescript-multimodal-search/img/mumose-1.gif and /dev/null differ diff --git a/blog/2024-01-23-typescript-multimodal-search/img/project-demo.mp4 b/blog/2024-01-23-typescript-multimodal-search/img/project-demo.mp4 new file mode 100644 index 0000000000..4ffebf20b3 Binary files /dev/null and b/blog/2024-01-23-typescript-multimodal-search/img/project-demo.mp4 differ diff --git a/blog/2024-01-23-typescript-multimodal-search/index.mdx b/blog/2024-01-23-typescript-multimodal-search/index.mdx index e64d79e708..0a7c9e7856 100644 --- a/blog/2024-01-23-typescript-multimodal-search/index.mdx +++ b/blog/2024-01-23-typescript-multimodal-search/index.mdx @@ -514,7 +514,12 @@ Here was call the `vectorSearch()` server action we created above and pass the q ### Final Result Then you should be able to search like this -![the final multimodal search project](./img/mumose-1.gif) +import multimodalVideo from './img/project-demo.mp4'; + + ## Conclusion diff --git a/blog/2024-02-01-py-client-v4-release/index.mdx b/blog/2024-02-01-py-client-v4-release/index.mdx index 37d58e8076..54b8717c9d 100644 --- a/blog/2024-02-01-py-client-v4-release/index.mdx +++ b/blog/2024-02-01-py-client-v4-release/index.mdx @@ -12,6 +12,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PythonCode from '!!raw-loader!/_includes/code/client-libraries/python_v4.py'; +import PythonV3Code from '!!raw-loader!/_includes/code/connections/connect-python-v3.py'; import ManageCollectionsCode from '!!raw-loader!/_includes/code/howto/manage-data.collections.py'; ![Weaviate Python Client v4 Release](./img/hero.png) @@ -106,7 +107,7 @@ Here is an example that really captures the difference between the `v4` and `v3` text={CollectionsV3} startMarker="# START CreateCollectionWithProperties" endMarker="# END CreateCollectionWithProperties" - language="python" + language="pyv3" /> @@ -180,7 +181,7 @@ Direct instantiation with full control over the parameters is also possible, too \ No newline at end of file + diff --git a/blog/2024-03-13-weaviate-champions/img/framework.png b/blog/2024-03-13-weaviate-champions/img/framework.png index 9aaa9ef765..91ff90cc80 100644 Binary files a/blog/2024-03-13-weaviate-champions/img/framework.png and b/blog/2024-03-13-weaviate-champions/img/framework.png differ diff --git a/blog/2024-03-13-weaviate-champions/img/hero.png b/blog/2024-03-13-weaviate-champions/img/hero.png index 6a2b9b56b5..b094df541c 100644 Binary files a/blog/2024-03-13-weaviate-champions/img/hero.png and b/blog/2024-03-13-weaviate-champions/img/hero.png differ diff --git a/blog/2024-03-13-weaviate-champions/img/map..001.png b/blog/2024-03-13-weaviate-champions/img/map..001.png deleted file mode 100644 index ddc819f549..0000000000 Binary files a/blog/2024-03-13-weaviate-champions/img/map..001.png and /dev/null differ diff --git a/blog/2024-03-13-weaviate-champions/img/patrice_bourgougnon.png b/blog/2024-03-13-weaviate-champions/img/patrice_bourgougnon.png index 513d93d0c7..61c15b77ee 100644 Binary files a/blog/2024-03-13-weaviate-champions/img/patrice_bourgougnon.png and b/blog/2024-03-13-weaviate-champions/img/patrice_bourgougnon.png differ diff --git a/blog/2024-03-13-weaviate-champions/img/ron_parker.png b/blog/2024-03-13-weaviate-champions/img/ron_parker.png index fb1d5c49a8..08aee34fc2 100644 Binary files a/blog/2024-03-13-weaviate-champions/img/ron_parker.png and b/blog/2024-03-13-weaviate-champions/img/ron_parker.png differ diff --git a/blog/2024-03-13-weaviate-champions/img/travis_rehl.png b/blog/2024-03-13-weaviate-champions/img/travis_rehl.png index 5a63c25eab..abd88eec32 100644 Binary files a/blog/2024-03-13-weaviate-champions/img/travis_rehl.png and b/blog/2024-03-13-weaviate-champions/img/travis_rehl.png differ diff --git a/blog/2024-03-19-hurricane-blog-gfls/img/ALTO.png b/blog/2024-03-19-hurricane-blog-gfls/img/ALTO.png index bcb1a27c05..6e5012fb95 100644 Binary files a/blog/2024-03-19-hurricane-blog-gfls/img/ALTO.png and b/blog/2024-03-19-hurricane-blog-gfls/img/ALTO.png differ diff --git a/blog/2024-03-19-hurricane-blog-gfls/img/hero.png b/blog/2024-03-19-hurricane-blog-gfls/img/hero.png index 1bbbeabe53..e0e8cf92fe 100644 Binary files a/blog/2024-03-19-hurricane-blog-gfls/img/hero.png and b/blog/2024-03-19-hurricane-blog-gfls/img/hero.png differ diff --git a/blog/2024-03-20-typescript-client-beta/img/inverted-index-hints.png b/blog/2024-03-20-typescript-client-beta/img/inverted-index-hints.png index f07f9404fc..3327d27f03 100644 Binary files a/blog/2024-03-20-typescript-client-beta/img/inverted-index-hints.png and b/blog/2024-03-20-typescript-client-beta/img/inverted-index-hints.png differ diff --git a/blog/2024-03-28-hybrid-search-typescript/img/quote-finder-screenshot.png b/blog/2024-03-28-hybrid-search-typescript/img/quote-finder-screenshot.png index 5e3d129860..f1a2f512d1 100644 Binary files a/blog/2024-03-28-hybrid-search-typescript/img/quote-finder-screenshot.png and b/blog/2024-03-28-hybrid-search-typescript/img/quote-finder-screenshot.png differ diff --git a/blog/2024-04-02-binary-quantization/img/bq_vecs.png b/blog/2024-04-02-binary-quantization/img/bq_vecs.png index 39dda44750..c70956943a 100644 Binary files a/blog/2024-04-02-binary-quantization/img/bq_vecs.png and b/blog/2024-04-02-binary-quantization/img/bq_vecs.png differ diff --git a/blog/2024-04-02-binary-quantization/img/hero.png b/blog/2024-04-02-binary-quantization/img/hero.png index def1f6d1dd..d4c3c98d8a 100644 Binary files a/blog/2024-04-02-binary-quantization/img/hero.png and b/blog/2024-04-02-binary-quantization/img/hero.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image11.png b/blog/2024-04-02-binary-quantization/img/image11.png index 8eb6015d8f..de384aa6ac 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image11.png and b/blog/2024-04-02-binary-quantization/img/image11.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image13.png b/blog/2024-04-02-binary-quantization/img/image13.png index 7217185db2..cc3c12f16c 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image13.png and b/blog/2024-04-02-binary-quantization/img/image13.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image14.jpg b/blog/2024-04-02-binary-quantization/img/image14.jpg index 6d2126f855..c9b81b97d8 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image14.jpg and b/blog/2024-04-02-binary-quantization/img/image14.jpg differ diff --git a/blog/2024-04-02-binary-quantization/img/image14.png b/blog/2024-04-02-binary-quantization/img/image14.png new file mode 100644 index 0000000000..30296ca455 Binary files /dev/null and b/blog/2024-04-02-binary-quantization/img/image14.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image15.png b/blog/2024-04-02-binary-quantization/img/image15.png index 0802381cfa..68606a3262 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image15.png and b/blog/2024-04-02-binary-quantization/img/image15.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image16.png b/blog/2024-04-02-binary-quantization/img/image16.png index 9088437873..90ce2e1c35 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image16.png and b/blog/2024-04-02-binary-quantization/img/image16.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image17.png b/blog/2024-04-02-binary-quantization/img/image17.png index 1b6831e7a8..813a50ce8f 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image17.png and b/blog/2024-04-02-binary-quantization/img/image17.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image18.png b/blog/2024-04-02-binary-quantization/img/image18.png index 60297f8b42..7d98413cc7 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image18.png and b/blog/2024-04-02-binary-quantization/img/image18.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image19.png b/blog/2024-04-02-binary-quantization/img/image19.png index 6305b74be5..328c5343a8 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image19.png and b/blog/2024-04-02-binary-quantization/img/image19.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image20.png b/blog/2024-04-02-binary-quantization/img/image20.png index 555da380bc..d0470e99a0 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image20.png and b/blog/2024-04-02-binary-quantization/img/image20.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image21.png b/blog/2024-04-02-binary-quantization/img/image21.png index 13f80debf0..3d9f5dbfd4 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image21.png and b/blog/2024-04-02-binary-quantization/img/image21.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image22.png b/blog/2024-04-02-binary-quantization/img/image22.png index 9d6fed61e8..f0219ff416 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image22.png and b/blog/2024-04-02-binary-quantization/img/image22.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image24.png b/blog/2024-04-02-binary-quantization/img/image24.png index 971b4fee88..a9c582c161 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image24.png and b/blog/2024-04-02-binary-quantization/img/image24.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image3.png b/blog/2024-04-02-binary-quantization/img/image3.png index 5e83ee8542..926206276d 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image3.png and b/blog/2024-04-02-binary-quantization/img/image3.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image4.png b/blog/2024-04-02-binary-quantization/img/image4.png index d614129c40..baf72db3ef 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image4.png and b/blog/2024-04-02-binary-quantization/img/image4.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image6.png b/blog/2024-04-02-binary-quantization/img/image6.png index c8320a68d2..16749069f7 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image6.png and b/blog/2024-04-02-binary-quantization/img/image6.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image7.png b/blog/2024-04-02-binary-quantization/img/image7.png index 58040dc83f..45aa66df1a 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image7.png and b/blog/2024-04-02-binary-quantization/img/image7.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image8.png b/blog/2024-04-02-binary-quantization/img/image8.png index 24870d8265..c2d14f4788 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image8.png and b/blog/2024-04-02-binary-quantization/img/image8.png differ diff --git a/blog/2024-04-02-binary-quantization/img/image9.png b/blog/2024-04-02-binary-quantization/img/image9.png index 5b021932b1..8148ceb383 100644 Binary files a/blog/2024-04-02-binary-quantization/img/image9.png and b/blog/2024-04-02-binary-quantization/img/image9.png differ diff --git a/blog/2024-04-17-dspy-optimizers/img/RAG-optimization-dashboard.png b/blog/2024-04-17-dspy-optimizers/img/RAG-optimization-dashboard.png index a8de3b82a7..a25b182e1a 100644 Binary files a/blog/2024-04-17-dspy-optimizers/img/RAG-optimization-dashboard.png and b/blog/2024-04-17-dspy-optimizers/img/RAG-optimization-dashboard.png differ diff --git a/blog/2024-04-17-dspy-optimizers/img/hero.png b/blog/2024-04-17-dspy-optimizers/img/hero.png index 9ddc165da3..30522c4948 100644 Binary files a/blog/2024-04-17-dspy-optimizers/img/hero.png and b/blog/2024-04-17-dspy-optimizers/img/hero.png differ diff --git a/blog/2024-04-23-unbody-weaviate/img/diagram-1.png b/blog/2024-04-23-unbody-weaviate/img/diagram-1.png index 65d79d29f7..c29aa8151a 100644 Binary files a/blog/2024-04-23-unbody-weaviate/img/diagram-1.png and b/blog/2024-04-23-unbody-weaviate/img/diagram-1.png differ diff --git a/blog/2024-04-23-unbody-weaviate/img/diagram-2.png b/blog/2024-04-23-unbody-weaviate/img/diagram-2.png index 45a564357d..ca6c224fa1 100644 Binary files a/blog/2024-04-23-unbody-weaviate/img/diagram-2.png and b/blog/2024-04-23-unbody-weaviate/img/diagram-2.png differ diff --git a/blog/2024-04-23-unbody-weaviate/img/diagram-3.png b/blog/2024-04-23-unbody-weaviate/img/diagram-3.png index 3fcecb1b3d..e279dff3ec 100644 Binary files a/blog/2024-04-23-unbody-weaviate/img/diagram-3.png and b/blog/2024-04-23-unbody-weaviate/img/diagram-3.png differ diff --git a/blog/2024-04-23-unbody-weaviate/img/hero.png b/blog/2024-04-23-unbody-weaviate/img/hero.png index 53f58f731c..ebabe7b353 100644 Binary files a/blog/2024-04-23-unbody-weaviate/img/hero.png and b/blog/2024-04-23-unbody-weaviate/img/hero.png differ diff --git a/blog/2024-04-23-unbody-weaviate/img/search-plugin.png b/blog/2024-04-23-unbody-weaviate/img/search-plugin.png index adeb2fc5ae..bcec5f5a8b 100644 Binary files a/blog/2024-04-23-unbody-weaviate/img/search-plugin.png and b/blog/2024-04-23-unbody-weaviate/img/search-plugin.png differ diff --git a/blog/2024-04-24-next-recap/img/group-pic.jpg b/blog/2024-04-24-next-recap/img/group-pic.jpg new file mode 100644 index 0000000000..c320ec51eb Binary files /dev/null and b/blog/2024-04-24-next-recap/img/group-pic.jpg differ diff --git a/blog/2024-04-24-next-recap/img/group-pic.png b/blog/2024-04-24-next-recap/img/group-pic.png deleted file mode 100644 index 5735f4a0ab..0000000000 Binary files a/blog/2024-04-24-next-recap/img/group-pic.png and /dev/null differ diff --git a/blog/2024-04-24-next-recap/index.mdx b/blog/2024-04-24-next-recap/index.mdx index 9f4fe6f91b..866d616f5e 100644 --- a/blog/2024-04-24-next-recap/index.mdx +++ b/blog/2024-04-24-next-recap/index.mdx @@ -53,7 +53,7 @@ Next is Google Cloud’s big annual conference, so of course we were waiting to ## Weaviate winners We’re a fully remote company, so our team has a ton of fun when we’re together in person. It’s always a good time getting the crowd excited for our booth giveaways and seeing the joy in their faces when they win (or don’t and can have a good laugh about it). This time around we gave away clicky-clacky Keychron keyboards and some crowd-favorite Lego sets. -![Group pic](./img/group-pic.png) +![Group pic](./img/group-pic.jpg) ## What comes next? **Google I/O**: Google’s developer conference is happening on May 14th in Mountain View, CA. Keep an eye out for some big announcements, maybe even from your favorite vector database. 😉 diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/hero.jpg b/blog/2024-04-30-find-waldo-with-weaviate/img/hero.jpg new file mode 100644 index 0000000000..7a912cb598 Binary files /dev/null and b/blog/2024-04-30-find-waldo-with-weaviate/img/hero.jpg differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/hero.png b/blog/2024-04-30-find-waldo-with-weaviate/img/hero.png deleted file mode 100644 index 518371b315..0000000000 Binary files a/blog/2024-04-30-find-waldo-with-weaviate/img/hero.png and /dev/null differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/image1.png b/blog/2024-04-30-find-waldo-with-weaviate/img/image1.png index 895bf9772f..caf31e296b 100644 Binary files a/blog/2024-04-30-find-waldo-with-weaviate/img/image1.png and b/blog/2024-04-30-find-waldo-with-weaviate/img/image1.png differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/image2.jpg b/blog/2024-04-30-find-waldo-with-weaviate/img/image2.jpg new file mode 100644 index 0000000000..b8e048cb1c Binary files /dev/null and b/blog/2024-04-30-find-waldo-with-weaviate/img/image2.jpg differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/image2.png b/blog/2024-04-30-find-waldo-with-weaviate/img/image2.png deleted file mode 100644 index ac58a5a21d..0000000000 Binary files a/blog/2024-04-30-find-waldo-with-weaviate/img/image2.png and /dev/null differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/image3.png b/blog/2024-04-30-find-waldo-with-weaviate/img/image3.png index ef2e8717a0..ab93fbf802 100644 Binary files a/blog/2024-04-30-find-waldo-with-weaviate/img/image3.png and b/blog/2024-04-30-find-waldo-with-weaviate/img/image3.png differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/img/image4.jpg b/blog/2024-04-30-find-waldo-with-weaviate/img/image4.jpg index 52b65bdf20..190605f6fa 100644 Binary files a/blog/2024-04-30-find-waldo-with-weaviate/img/image4.jpg and b/blog/2024-04-30-find-waldo-with-weaviate/img/image4.jpg differ diff --git a/blog/2024-04-30-find-waldo-with-weaviate/index.mdx b/blog/2024-04-30-find-waldo-with-weaviate/index.mdx index 67e9bae188..f7cb1da563 100644 --- a/blog/2024-04-30-find-waldo-with-weaviate/index.mdx +++ b/blog/2024-04-30-find-waldo-with-weaviate/index.mdx @@ -5,10 +5,10 @@ description: 'Dive into using Weaviate for image recognition to find the "needle authors: [jon] date: 2024-04-30 tags: ['how-to', 'search'] -image: ./img/hero.png +image: ./img/hero.jpg --- -![Using image recognition to find Waldo](./img/hero.png) +![Using image recognition to find Waldo](./img/hero.jpg) :::info GitHub Repo @@ -140,7 +140,7 @@ else: reassembled_image.show() # This will display the reassembled image with highlighted parts ``` -![Waldo image re-assembled and highlighted](./img/image2.png) +![Waldo image re-assembled and highlighted](./img/image2.jpg) It worked! Using Weaviate I was able to find Waldo in a group of images. This has a lot of implications on the application. Using the same technique you could utilize a large corpus of image data to create an image lookup system. diff --git a/blog/2024-05-08-Modal-and-Weaviate/img/example.png b/blog/2024-05-08-Modal-and-Weaviate/img/example.png index ca41cf1b63..364dc52627 100644 Binary files a/blog/2024-05-08-Modal-and-Weaviate/img/example.png and b/blog/2024-05-08-Modal-and-Weaviate/img/example.png differ diff --git a/blog/2024-05-08-Modal-and-Weaviate/img/hero.png b/blog/2024-05-08-Modal-and-Weaviate/img/hero.png index 9414fabffd..904ba1eb58 100644 Binary files a/blog/2024-05-08-Modal-and-Weaviate/img/hero.png and b/blog/2024-05-08-Modal-and-Weaviate/img/hero.png differ diff --git a/blog/2024-05-08-Modal-and-Weaviate/index.mdx b/blog/2024-05-08-Modal-and-Weaviate/index.mdx index 01485eaacb..ce49576e37 100644 --- a/blog/2024-05-08-Modal-and-Weaviate/index.mdx +++ b/blog/2024-05-08-Modal-and-Weaviate/index.mdx @@ -61,9 +61,9 @@ In this section, we walk through some of the key Weaviate features we used to im 5. [Batch Imports](#batch-imports) ### Async Indexing -Importing data into a vector database is a two-step process: 1. Object creation, and 2. Vector index construction. Typically, the database won’t receive another batch of objects until it has finished indexing the prior batch. Weaviate `1.22` introduced [async indexing](/developers/weaviate/release-notes/release_1_22#asynchronous-vector-indexing-experimental) to speed up data ingestion. +Importing data into a vector database is a two-step process: 1. Object creation, and 2. Vector index construction. Typically, the database won’t receive another batch of objects until it has finished indexing the prior batch. Weaviate `1.22` introduced [async indexing](/developers/weaviate/release-notes/older-releases/release_1_22#asynchronous-vector-indexing-experimental) to speed up data ingestion. -Async indexing speeds up object ingestion by separating it from the vector index construction process. Rather than waiting for the new objects to be indexed, the objects are put in an in-memory queue before getting indexed. Since we imported millions of objects, it was important to enable this feature to reduce the import time. +Async indexing speeds up object ingestion by separating it from the [vector index](/developers/weaviate/concepts/vector-index) construction process. Rather than waiting for the new objects to be indexed, the objects are put in an in-memory queue before getting indexed. Since we imported millions of objects, it was important to enable this feature to reduce the import time. For open-source users, you can enable it by adding `ASYNC_INDEXING=true` in your environment variable, or you can enable it through Weaviate Cloud. diff --git a/blog/2024-05-14-instabase-and-weaviate/img/hero.png b/blog/2024-05-14-instabase-and-weaviate/img/hero.png index 6859e59fea..bf603c072b 100644 Binary files a/blog/2024-05-14-instabase-and-weaviate/img/hero.png and b/blog/2024-05-14-instabase-and-weaviate/img/hero.png differ diff --git a/blog/2024-05-20-weaviate-1-25-release/_core-1-25-include.mdx b/blog/2024-05-20-weaviate-1-25-release/_core-1-25-include.mdx index 224ae6291b..fa60b02253 100644 --- a/blog/2024-05-20-weaviate-1-25-release/_core-1-25-include.mdx +++ b/blog/2024-05-20-weaviate-1-25-release/_core-1-25-include.mdx @@ -66,6 +66,10 @@ This release brings important new integrations with third party APIs. ### OctoAI integration +import OctoAIDeprecationNote from '/developers/weaviate/model-providers/octoai/_includes/octoai_deprecation.md'; + + + With version 1.25 we’re announcing an integration with OctoAI which will make it even easier for users to access many open source embedding and language models such as Llama3-70b, Mixtral-8x22b and more. We are releasing two integrations: text2vec-octoai and generative-octoai that integrate Weaviate and the OctoAI service. OctoAI provides hosted inference services for embedding models and large language models. diff --git a/blog/2024-05-20-weaviate-1-25-release/img/dynamic.png b/blog/2024-05-20-weaviate-1-25-release/img/dynamic.png index d611ff5133..04d71c822e 100644 Binary files a/blog/2024-05-20-weaviate-1-25-release/img/dynamic.png and b/blog/2024-05-20-weaviate-1-25-release/img/dynamic.png differ diff --git a/blog/2024-05-20-weaviate-1-25-release/img/hero.png b/blog/2024-05-20-weaviate-1-25-release/img/hero.png index 5ee8c74967..2729e31ee8 100644 Binary files a/blog/2024-05-20-weaviate-1-25-release/img/hero.png and b/blog/2024-05-20-weaviate-1-25-release/img/hero.png differ diff --git a/blog/2024-05-20-weaviate-1-25-release/img/raft-weaviate.png b/blog/2024-05-20-weaviate-1-25-release/img/raft-weaviate.png index 558029e857..34926b5b72 100644 Binary files a/blog/2024-05-20-weaviate-1-25-release/img/raft-weaviate.png and b/blog/2024-05-20-weaviate-1-25-release/img/raft-weaviate.png differ diff --git a/blog/2024-05-21-local-rag-ollama/img/hero.png b/blog/2024-05-21-local-rag-ollama/img/hero.png index c64abb6974..a8cc3561a8 100644 Binary files a/blog/2024-05-21-local-rag-ollama/img/hero.png and b/blog/2024-05-21-local-rag-ollama/img/hero.png differ diff --git a/blog/2024-05-21-local-rag-ollama/img/rag-ollama-diagram.png b/blog/2024-05-21-local-rag-ollama/img/rag-ollama-diagram.png index dc1668a4d9..cd8f82e6ff 100644 Binary files a/blog/2024-05-21-local-rag-ollama/img/rag-ollama-diagram.png and b/blog/2024-05-21-local-rag-ollama/img/rag-ollama-diagram.png differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/example.jpeg b/blog/2024-05-28-retrieval-evaluation-metrics/img/example.jpeg deleted file mode 100644 index ad23eb5947..0000000000 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/example.jpeg and /dev/null differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/example.jpg b/blog/2024-05-28-retrieval-evaluation-metrics/img/example.jpg new file mode 100644 index 0000000000..189d1a7706 Binary files /dev/null and b/blog/2024-05-28-retrieval-evaluation-metrics/img/example.jpg differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/hero.png b/blog/2024-05-28-retrieval-evaluation-metrics/img/hero.png index 526412f73a..27d513c51d 100644 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/hero.png and b/blog/2024-05-28-retrieval-evaluation-metrics/img/hero.png differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/map.jpeg b/blog/2024-05-28-retrieval-evaluation-metrics/img/map.jpeg deleted file mode 100644 index 8b450b4239..0000000000 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/map.jpeg and /dev/null differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/map.jpg b/blog/2024-05-28-retrieval-evaluation-metrics/img/map.jpg new file mode 100644 index 0000000000..4111628598 Binary files /dev/null and b/blog/2024-05-28-retrieval-evaluation-metrics/img/map.jpg differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/mrr.jpeg b/blog/2024-05-28-retrieval-evaluation-metrics/img/mrr.jpeg deleted file mode 100644 index 8b8ece0eb1..0000000000 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/mrr.jpeg and /dev/null differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/mrr.jpg b/blog/2024-05-28-retrieval-evaluation-metrics/img/mrr.jpg new file mode 100644 index 0000000000..b30681308e Binary files /dev/null and b/blog/2024-05-28-retrieval-evaluation-metrics/img/mrr.jpg differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/ndcg.jpeg b/blog/2024-05-28-retrieval-evaluation-metrics/img/ndcg.jpeg deleted file mode 100644 index 4f02b522ac..0000000000 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/ndcg.jpeg and /dev/null differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/ndcg.jpg b/blog/2024-05-28-retrieval-evaluation-metrics/img/ndcg.jpg new file mode 100644 index 0000000000..fd1eaf74aa Binary files /dev/null and b/blog/2024-05-28-retrieval-evaluation-metrics/img/ndcg.jpg differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/precision.jpeg b/blog/2024-05-28-retrieval-evaluation-metrics/img/precision.jpeg deleted file mode 100644 index e934b70422..0000000000 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/precision.jpeg and /dev/null differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/precision.jpg b/blog/2024-05-28-retrieval-evaluation-metrics/img/precision.jpg new file mode 100644 index 0000000000..14a6b5ae7f Binary files /dev/null and b/blog/2024-05-28-retrieval-evaluation-metrics/img/precision.jpg differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/recall.jpeg b/blog/2024-05-28-retrieval-evaluation-metrics/img/recall.jpeg deleted file mode 100644 index 67349f435f..0000000000 Binary files a/blog/2024-05-28-retrieval-evaluation-metrics/img/recall.jpeg and /dev/null differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/img/recall.jpg b/blog/2024-05-28-retrieval-evaluation-metrics/img/recall.jpg new file mode 100644 index 0000000000..5bf8373617 Binary files /dev/null and b/blog/2024-05-28-retrieval-evaluation-metrics/img/recall.jpg differ diff --git a/blog/2024-05-28-retrieval-evaluation-metrics/index.mdx b/blog/2024-05-28-retrieval-evaluation-metrics/index.mdx index e066c3a832..c17e0e6000 100644 --- a/blog/2024-05-28-retrieval-evaluation-metrics/index.mdx +++ b/blog/2024-05-28-retrieval-evaluation-metrics/index.mdx @@ -18,7 +18,7 @@ This article gives a comprehensive overview of commonly used evaluation metrics To explain how each of the following metrics is calculated, this article uses a minimal example dataset of eight pastries - to stay in line with the bagel example our colleagues used in their recent [discussion on how to choose and evaluate an embedding model](https://youtu.be/lpdN3aw-yTg?si=CHzV9zS_L2-rdUel) - as shown below. -![example dataset](./img/example.jpeg) +![example dataset](./img/example.jpg) We will use the [`pytrec_eval` Python package](https://github.com/cvangysel/pytrec_eval) to showcase how you can evaluate your retrieval or recommendation pipelines in your code. Check out the code in the [related GitHub repository](https://github.com/weaviate/recipes/blob/main/weaviate-features/evaluation/evaluation_metrics_information_retrieval.ipynb). @@ -50,7 +50,7 @@ $$ =\frac{\text{Number of relevant items in K}}{\text{Total number of items in K}} $$ -![precision.jpeg](./img/precision.jpeg) +![precision.jpg](./img/precision.jpg) With `pytrec_eval` you can evaluate your search results as follows: @@ -95,7 +95,7 @@ $$ =\frac{\text{Number of relevant items in K}}{\text{Total number of relevant items}} $$ -![recall.jpeg](./img/recall.jpeg) +![recall](./img/recall.jpg) With `pytrec_eval` you can evaluate your search results as follows: @@ -126,7 +126,7 @@ $$ \text{RR} = \frac{1}{\text{Rank of the first relevant item}} $$ -![mrr.jpeg](./img/mrr.jpeg) +![mrr](./img/mrr.jpg) Note that the MRR metric is not available in the `pytrec_eval` package as of this writing. @@ -144,7 +144,7 @@ $$ \text{AP@K} = \frac{1}{N}\sum_{k=1}^{K}\text{Precision(k)}\times \text{rel(k)} $$ -![map.jpeg](./img/map.jpeg) +![map](./img/map.jpg) This is also the default metric used in the [Massive Text Embedding Benchmark (MTEB) Leaderboard](https://huggingface.co/spaces/mteb/leaderboard) for the **Reranking** category. @@ -197,7 +197,7 @@ $$ \text{DCG@K} = \sum_{k=1}^K\frac{\text{rel}_i}{\log_2(i+1)} $$ -![ndcg.jpeg](./img/ndcg.jpeg) +![ndcg](./img/ndcg.jpg) This is the default metric used in the [MTEB Leaderboard](https://huggingface.co/spaces/mteb/leaderboard) for the **Retrieval** category. diff --git a/blog/2024-06-04-how-to-choose-an-embedding-model/img/embedding_model.png b/blog/2024-06-04-how-to-choose-an-embedding-model/img/embedding_model.png index 4930ad4550..38fd5f7474 100644 Binary files a/blog/2024-06-04-how-to-choose-an-embedding-model/img/embedding_model.png and b/blog/2024-06-04-how-to-choose-an-embedding-model/img/embedding_model.png differ diff --git a/blog/2024-06-04-how-to-choose-an-embedding-model/img/hero.png b/blog/2024-06-04-how-to-choose-an-embedding-model/img/hero.png index 40ce8340d7..39f55ff94e 100644 Binary files a/blog/2024-06-04-how-to-choose-an-embedding-model/img/hero.png and b/blog/2024-06-04-how-to-choose-an-embedding-model/img/hero.png differ diff --git a/blog/2024-06-04-how-to-choose-an-embedding-model/img/mteb.png b/blog/2024-06-04-how-to-choose-an-embedding-model/img/mteb.png index cbea8a00dd..ef911e32f4 100644 Binary files a/blog/2024-06-04-how-to-choose-an-embedding-model/img/mteb.png and b/blog/2024-06-04-how-to-choose-an-embedding-model/img/mteb.png differ diff --git a/blog/2024-06-18-openais-matryoshka-embeddings/img/MRLvar.png b/blog/2024-06-18-openais-matryoshka-embeddings/img/MRLvar.png index 2ad276bf48..204e9f52fc 100644 Binary files a/blog/2024-06-18-openais-matryoshka-embeddings/img/MRLvar.png and b/blog/2024-06-18-openais-matryoshka-embeddings/img/MRLvar.png differ diff --git a/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_formula.png b/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_formula.png new file mode 100644 index 0000000000..c1299e7e94 Binary files /dev/null and b/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_formula.png differ diff --git a/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_representation_learning.png b/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_representation_learning.png index f325d1be21..f5c3306af1 100644 Binary files a/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_representation_learning.png and b/blog/2024-06-18-openais-matryoshka-embeddings/img/Matryoshka_representation_learning.png differ diff --git a/blog/2024-06-18-openais-matryoshka-embeddings/img/OLDvar.jpeg b/blog/2024-06-18-openais-matryoshka-embeddings/img/OLDvar.jpeg deleted file mode 100644 index 42791a0666..0000000000 Binary files a/blog/2024-06-18-openais-matryoshka-embeddings/img/OLDvar.jpeg and /dev/null differ diff --git a/blog/2024-06-18-openais-matryoshka-embeddings/img/OLDvar.png b/blog/2024-06-18-openais-matryoshka-embeddings/img/OLDvar.png new file mode 100644 index 0000000000..66ded07820 Binary files /dev/null and b/blog/2024-06-18-openais-matryoshka-embeddings/img/OLDvar.png differ diff --git a/blog/2024-06-18-openais-matryoshka-embeddings/index.mdx b/blog/2024-06-18-openais-matryoshka-embeddings/index.mdx index 7222703494..c1c45d5263 100644 --- a/blog/2024-06-18-openais-matryoshka-embeddings/index.mdx +++ b/blog/2024-06-18-openais-matryoshka-embeddings/index.mdx @@ -34,6 +34,8 @@ Retrieval performance over representation size for Matryoshka embeddings. (This The magic behind how MRL is carried out is all in the loss function which is optimized when training these models! If previously the loss function was **L**, for MRL we break down the loss function into the sum of the losses on individual vector dimension ranges: `Loss_Total = L(upto 8d) + L(upto 16d) + L(upto 32d) + ... + L(upto 2048d)`. With this new nested loss function there is an incentive for the model to capture information in each sub-section of the vector. +![Matryoshka representation learning formula](./img/Matryoshka_formula.png) + After modifying the loss you get these truncatable vectors for free wihtout any additional costs - this works on almost all loss functions and pre-existing models can be finetuned to output MRL vectors! This means that MRL is very easy to adopt and apply to pretrained models. ## Detailed Analysis of Matryoshka Embeddings @@ -45,7 +47,7 @@ In this analysis below we sampled 10k random vectors from the dataset above and |Matryoshka Vectors | Non-Matryoshka Vectors | |:-------------------------:|:-------------------------: | -| ![MRL](./img/MRLvar.png) | ![OLD](./img/OLDvar.jpeg) | +| ![MRL](./img/MRLvar.png) | ![OLD](./img/OLDvar.png) | This graphs shows the smoothed standard deviation per dimension across 10k random samples from DBpedia embedded with the new `text-emb3-large` model and the old `ada-002` model. diff --git a/blog/2024-06-25-ny-roadshow-recap/img/hero.png b/blog/2024-06-25-ny-roadshow-recap/img/hero.png index 324db6f705..29bafee611 100644 Binary files a/blog/2024-06-25-ny-roadshow-recap/img/hero.png and b/blog/2024-06-25-ny-roadshow-recap/img/hero.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/cluster-api-key.png b/blog/2024-07-09-verba-with-local-llm/img/cluster-api-key.png index 47d90d454d..48e37b55c6 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/cluster-api-key.png and b/blog/2024-07-09-verba-with-local-llm/img/cluster-api-key.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/cluster-details.png b/blog/2024-07-09-verba-with-local-llm/img/cluster-details.png index 92d5ed2e71..d8af24566c 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/cluster-details.png and b/blog/2024-07-09-verba-with-local-llm/img/cluster-details.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/hero.png b/blog/2024-07-09-verba-with-local-llm/img/hero.png index f6bbacb93f..b2ed472d3a 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/hero.png and b/blog/2024-07-09-verba-with-local-llm/img/hero.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/verba-browser.png b/blog/2024-07-09-verba-with-local-llm/img/verba-browser.png index 934956d47c..6f9ccc94ec 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/verba-browser.png and b/blog/2024-07-09-verba-with-local-llm/img/verba-browser.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/verba-ollama-configured.png b/blog/2024-07-09-verba-with-local-llm/img/verba-ollama-configured.png index 1411eff0d8..331e6d8dd0 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/verba-ollama-configured.png and b/blog/2024-07-09-verba-with-local-llm/img/verba-ollama-configured.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/verba-rag-config.png b/blog/2024-07-09-verba-with-local-llm/img/verba-rag-config.png index 0ea30beae9..2f5cde707d 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/verba-rag-config.png and b/blog/2024-07-09-verba-with-local-llm/img/verba-rag-config.png differ diff --git a/blog/2024-07-09-verba-with-local-llm/img/weaviate-cloud-console.png b/blog/2024-07-09-verba-with-local-llm/img/weaviate-cloud-console.png index 31b41d2f82..156dd954a5 100644 Binary files a/blog/2024-07-09-verba-with-local-llm/img/weaviate-cloud-console.png and b/blog/2024-07-09-verba-with-local-llm/img/weaviate-cloud-console.png differ diff --git a/blog/2024-07-17-js-june-recap/img/hero.png b/blog/2024-07-17-js-june-recap/img/hero.png index 420c48f4e9..9da16a1abe 100644 Binary files a/blog/2024-07-17-js-june-recap/img/hero.png and b/blog/2024-07-17-js-june-recap/img/hero.png differ diff --git a/blog/2024-07-17-js-june-recap/img/js-ts-weaviate.png b/blog/2024-07-17-js-june-recap/img/js-ts-weaviate.png index 3bef2aa851..164f3d8e54 100644 Binary files a/blog/2024-07-17-js-june-recap/img/js-ts-weaviate.png and b/blog/2024-07-17-js-june-recap/img/js-ts-weaviate.png differ diff --git a/blog/2024-07-17-js-june-recap/img/models.png b/blog/2024-07-17-js-june-recap/img/models.png index 0718f68413..064842fa54 100644 Binary files a/blog/2024-07-17-js-june-recap/img/models.png and b/blog/2024-07-17-js-june-recap/img/models.png differ diff --git a/blog/2024-07-17-js-june-recap/img/multimodal.png b/blog/2024-07-17-js-june-recap/img/multimodal.png index 4fe4b55e4a..a32c17440f 100644 Binary files a/blog/2024-07-17-js-june-recap/img/multimodal.png and b/blog/2024-07-17-js-june-recap/img/multimodal.png differ diff --git a/blog/2024-07-17-js-june-recap/img/rag.png b/blog/2024-07-17-js-june-recap/img/rag.png index 3d9cdc5d1b..9dbaa908fe 100644 Binary files a/blog/2024-07-17-js-june-recap/img/rag.png and b/blog/2024-07-17-js-june-recap/img/rag.png differ diff --git a/blog/2024-07-25-advanced-rag/img/hero.png b/blog/2024-07-25-advanced-rag/img/hero.png index c89bedf960..fe023d7ec8 100644 Binary files a/blog/2024-07-25-advanced-rag/img/hero.png and b/blog/2024-07-25-advanced-rag/img/hero.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image1.png b/blog/2024-07-25-advanced-rag/img/image1.png index d3a4dd4993..977c55ae57 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image1.png and b/blog/2024-07-25-advanced-rag/img/image1.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image10.png b/blog/2024-07-25-advanced-rag/img/image10.png index aa681c0440..138ecf35c6 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image10.png and b/blog/2024-07-25-advanced-rag/img/image10.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image11.png b/blog/2024-07-25-advanced-rag/img/image11.png index 84c3dc5edf..2150bd7664 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image11.png and b/blog/2024-07-25-advanced-rag/img/image11.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image2.png b/blog/2024-07-25-advanced-rag/img/image2.png index 8555d217bf..3b270f2e69 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image2.png and b/blog/2024-07-25-advanced-rag/img/image2.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image3.png b/blog/2024-07-25-advanced-rag/img/image3.png index c7bb95e520..b1ef661591 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image3.png and b/blog/2024-07-25-advanced-rag/img/image3.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image4.png b/blog/2024-07-25-advanced-rag/img/image4.png index e3612175a2..71092de0a8 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image4.png and b/blog/2024-07-25-advanced-rag/img/image4.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image5.png b/blog/2024-07-25-advanced-rag/img/image5.png index d6b95d69f2..3f18d4d924 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image5.png and b/blog/2024-07-25-advanced-rag/img/image5.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image6.png b/blog/2024-07-25-advanced-rag/img/image6.png index e34d7d2dda..474262a424 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image6.png and b/blog/2024-07-25-advanced-rag/img/image6.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image7.png b/blog/2024-07-25-advanced-rag/img/image7.png index 63c7c979fc..dcff3cf84c 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image7.png and b/blog/2024-07-25-advanced-rag/img/image7.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image8.png b/blog/2024-07-25-advanced-rag/img/image8.png index 9d5ef386ba..54a021cc21 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image8.png and b/blog/2024-07-25-advanced-rag/img/image8.png differ diff --git a/blog/2024-07-25-advanced-rag/img/image9.png b/blog/2024-07-25-advanced-rag/img/image9.png index 4d1852a7ed..39826b621b 100644 Binary files a/blog/2024-07-25-advanced-rag/img/image9.png and b/blog/2024-07-25-advanced-rag/img/image9.png differ diff --git a/blog/2024-07-31-weaviate-1-26-release/img/Charts.jpg b/blog/2024-07-31-weaviate-1-26-release/img/Charts.jpg index 43d9d190a3..0dbb15d0d7 100644 Binary files a/blog/2024-07-31-weaviate-1-26-release/img/Charts.jpg and b/blog/2024-07-31-weaviate-1-26-release/img/Charts.jpg differ diff --git a/blog/2024-07-31-weaviate-1-26-release/img/Range.jpg b/blog/2024-07-31-weaviate-1-26-release/img/Range.jpg index 95dbd44490..4ff7f8ab61 100644 Binary files a/blog/2024-07-31-weaviate-1-26-release/img/Range.jpg and b/blog/2024-07-31-weaviate-1-26-release/img/Range.jpg differ diff --git a/blog/2024-07-31-weaviate-1-26-release/img/SQ.jpg b/blog/2024-07-31-weaviate-1-26-release/img/SQ.jpg index 5c03803a39..57039f8b5f 100644 Binary files a/blog/2024-07-31-weaviate-1-26-release/img/SQ.jpg and b/blog/2024-07-31-weaviate-1-26-release/img/SQ.jpg differ diff --git a/blog/2024-07-31-weaviate-1-26-release/img/hero.png b/blog/2024-07-31-weaviate-1-26-release/img/hero.png index c79b16069e..81fb65e064 100644 Binary files a/blog/2024-07-31-weaviate-1-26-release/img/hero.png and b/blog/2024-07-31-weaviate-1-26-release/img/hero.png differ diff --git a/blog/2024-08-22-zooviate/img/arch-diagram.png b/blog/2024-08-22-zooviate/img/arch-diagram.png index 894ea8401b..d2f041f3c5 100644 Binary files a/blog/2024-08-22-zooviate/img/arch-diagram.png and b/blog/2024-08-22-zooviate/img/arch-diagram.png differ diff --git a/blog/2024-08-22-zooviate/img/hero.png b/blog/2024-08-22-zooviate/img/hero.png index 1f03525d57..79c61bf0c4 100644 Binary files a/blog/2024-08-22-zooviate/img/hero.png and b/blog/2024-08-22-zooviate/img/hero.png differ diff --git a/blog/2024-08-22-zooviate/img/w-icon-vectorsearch-4.png b/blog/2024-08-22-zooviate/img/w-icon-vectorsearch-4.png index 32296ce11c..2617308e10 100644 Binary files a/blog/2024-08-22-zooviate/img/w-icon-vectorsearch-4.png and b/blog/2024-08-22-zooviate/img/w-icon-vectorsearch-4.png differ diff --git a/blog/2024-08-22-zooviate/img/wcd-screenshot.png b/blog/2024-08-22-zooviate/img/wcd-screenshot.png index 334dd85b08..13a59d5644 100644 Binary files a/blog/2024-08-22-zooviate/img/wcd-screenshot.png and b/blog/2024-08-22-zooviate/img/wcd-screenshot.png differ diff --git a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/Screenshot_2024-06-26_at_1.58.10_PM.png b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/Screenshot_2024-06-26_at_1.58.10_PM.png deleted file mode 100644 index 33bc61a814..0000000000 Binary files a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/Screenshot_2024-06-26_at_1.58.10_PM.png and /dev/null differ diff --git a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/Screenshot_2024-06-26_at_7.35.43_PM.png b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/Screenshot_2024-06-26_at_7.35.43_PM.png deleted file mode 100644 index 6b6f63b689..0000000000 Binary files a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/Screenshot_2024-06-26_at_7.35.43_PM.png and /dev/null differ diff --git a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/document-sample.png b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/document-sample.png new file mode 100644 index 0000000000..a568fd8324 Binary files /dev/null and b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/document-sample.png differ diff --git a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/hero.png b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/hero.png index c781989809..e1645d7a46 100644 Binary files a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/hero.png and b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/hero.png differ diff --git a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/summary.png b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/summary.png new file mode 100644 index 0000000000..f92370906a Binary files /dev/null and b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/img/summary.png differ diff --git a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/index.mdx b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/index.mdx index d2affefdba..17fa3c3f2b 100644 --- a/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/index.mdx +++ b/blog/2024-09-03-enriching-and-ingesting-data-into-weaviate-with-aryn/index.mdx @@ -159,7 +159,7 @@ This output is truncated for brevity Each document in the DocSet now contains a list of elements that make up the document, including bounding boxes and text content. The following is a sample of a document after partitioning. Note that the table and figure are correctly identified, as are the individual cells in the table. -![Screenshot 2024-06-26 at 7.35.43 PM.png](img//Screenshot_2024-06-26_at_7.35.43_PM.png) +![document sample](img/document-sample.png) ## Sycamore Transforms: Entity Extraction and Summarization @@ -481,7 +481,7 @@ The summaries contain a text description of the image, as well as metadata about Note that Sycamore leverages the structural information from the `partition` transform to improve the quality of the summary. For instance, for the following figure, the image contains only the bar chart, which does not have any axes. Sycamore recognizes that the caption is associated with the image and sends it to the LLM to aid with summarization. Because of this, the summary accurately indicates that the graphs show a distribution of house prices. -![Screenshot 2024-06-26 at 1.58.10 PM.png](img/Screenshot_2024-06-26_at_1.58.10_PM.png) +![summary](img/summary.png) Summary: diff --git a/blog/2024-09-05-late-chunking/img/chunking-strategies.png b/blog/2024-09-05-late-chunking/img/chunking-strategies.png index 3955da5ac7..87153cc6aa 100644 Binary files a/blog/2024-09-05-late-chunking/img/chunking-strategies.png and b/blog/2024-09-05-late-chunking/img/chunking-strategies.png differ diff --git a/blog/2024-09-05-late-chunking/img/goldilocks.png b/blog/2024-09-05-late-chunking/img/goldilocks.png index 5d6969341b..788c585f15 100644 Binary files a/blog/2024-09-05-late-chunking/img/goldilocks.png and b/blog/2024-09-05-late-chunking/img/goldilocks.png differ diff --git a/blog/2024-09-05-late-chunking/img/hero.png b/blog/2024-09-05-late-chunking/img/hero.png index f3a6072cbc..aca787cba0 100644 Binary files a/blog/2024-09-05-late-chunking/img/hero.png and b/blog/2024-09-05-late-chunking/img/hero.png differ diff --git a/blog/2024-09-10-python-v3-api-deprecation/index.mdx b/blog/2024-09-10-python-v3-api-deprecation/index.mdx index 5c520ac9ec..f2cd0f98ee 100644 --- a/blog/2024-09-10-python-v3-api-deprecation/index.mdx +++ b/blog/2024-09-10-python-v3-api-deprecation/index.mdx @@ -39,7 +39,7 @@ Here's an illustrative example of the difference between the two versions. Note text={PyCodeV3} startMarker="# START SetVectorIndexParams" endMarker="# END SetVectorIndexParams" - language="py" + language="pyv3" /> diff --git a/blog/2024-09-17-better-ecommerce-typescript/img/final-application.png b/blog/2024-09-17-better-ecommerce-typescript/img/final-application.png index 03af05f60b..08d6d3c639 100644 Binary files a/blog/2024-09-17-better-ecommerce-typescript/img/final-application.png and b/blog/2024-09-17-better-ecommerce-typescript/img/final-application.png differ diff --git a/blog/2024-10-10-wealingo-demo/img/image.png b/blog/2024-10-10-wealingo-demo/img/image.png index 8049efb9af..def7cf1bc9 100644 Binary files a/blog/2024-10-10-wealingo-demo/img/image.png and b/blog/2024-10-10-wealingo-demo/img/image.png differ diff --git a/blog/2024-10-10-wealingo-demo/img/image1.png b/blog/2024-10-10-wealingo-demo/img/image1.png index 0baceffd4b..545f8bdcd9 100644 Binary files a/blog/2024-10-10-wealingo-demo/img/image1.png and b/blog/2024-10-10-wealingo-demo/img/image1.png differ diff --git a/blog/2024-10-10-wealingo-demo/img/image2.png b/blog/2024-10-10-wealingo-demo/img/image2.png index 56e84c5c7a..5fad126089 100644 Binary files a/blog/2024-10-10-wealingo-demo/img/image2.png and b/blog/2024-10-10-wealingo-demo/img/image2.png differ diff --git a/blog/2024-10-10-wealingo-demo/img/image3.png b/blog/2024-10-10-wealingo-demo/img/image3.png index 46b11f52e3..457fb625ad 100644 Binary files a/blog/2024-10-10-wealingo-demo/img/image3.png and b/blog/2024-10-10-wealingo-demo/img/image3.png differ diff --git a/blog/2024-10-10-wealingo-demo/img/image4.png b/blog/2024-10-10-wealingo-demo/img/image4.png index fc31d453d3..4a0c09986b 100644 Binary files a/blog/2024-10-10-wealingo-demo/img/image4.png and b/blog/2024-10-10-wealingo-demo/img/image4.png differ diff --git a/blog/2024-10-15-introduction-to-rag/img/hero.png b/blog/2024-10-15-introduction-to-rag/img/hero.png index 24bd9ca71a..10266aeaba 100644 Binary files a/blog/2024-10-15-introduction-to-rag/img/hero.png and b/blog/2024-10-15-introduction-to-rag/img/hero.png differ diff --git a/blog/2024-10-15-introduction-to-rag/img/rag-advanced-rag.png b/blog/2024-10-15-introduction-to-rag/img/rag-advanced-rag.png index 1c1a50bc80..8bc1779484 100644 Binary files a/blog/2024-10-15-introduction-to-rag/img/rag-advanced-rag.png and b/blog/2024-10-15-introduction-to-rag/img/rag-advanced-rag.png differ diff --git a/blog/2024-10-15-introduction-to-rag/img/rag-base.png b/blog/2024-10-15-introduction-to-rag/img/rag-base.png index f8be67d1a0..25f6479757 100644 Binary files a/blog/2024-10-15-introduction-to-rag/img/rag-base.png and b/blog/2024-10-15-introduction-to-rag/img/rag-base.png differ diff --git a/blog/2024-10-15-introduction-to-rag/img/rag-evaluation.png b/blog/2024-10-15-introduction-to-rag/img/rag-evaluation.png index fc5b5c189b..bb7ea0c4ed 100644 Binary files a/blog/2024-10-15-introduction-to-rag/img/rag-evaluation.png and b/blog/2024-10-15-introduction-to-rag/img/rag-evaluation.png differ diff --git a/blog/2024-10-15-introduction-to-rag/img/rag-stages.png b/blog/2024-10-15-introduction-to-rag/img/rag-stages.png index c89697f802..b034291048 100644 Binary files a/blog/2024-10-15-introduction-to-rag/img/rag-stages.png and b/blog/2024-10-15-introduction-to-rag/img/rag-stages.png differ diff --git a/blog/2024-10-15-introduction-to-rag/img/rag-workflow.png b/blog/2024-10-15-introduction-to-rag/img/rag-workflow.png index e4fec016ad..1e73e3669e 100644 Binary files a/blog/2024-10-15-introduction-to-rag/img/rag-workflow.png and b/blog/2024-10-15-introduction-to-rag/img/rag-workflow.png differ diff --git a/blog/2024-10-15-introduction-to-rag/index.mdx b/blog/2024-10-15-introduction-to-rag/index.mdx index 25c329c007..16b565eee4 100644 --- a/blog/2024-10-15-introduction-to-rag/index.mdx +++ b/blog/2024-10-15-introduction-to-rag/index.mdx @@ -168,7 +168,7 @@ For a more in-depth exploration of this topic, check out our blog post on [advan **AI agents** are autonomous systems that can interpret information, formulate plans, and make decisions. When added to a RAG pipeline, agents can reformulate user queries and re-retrieve more relevant information if initial results are inaccurate or irrelevant. Agentic RAG can also handle more complex queries that require multi-step reasoning, like comparing information across multiple documents, asking follow-up questions, and iteratively adjusting retrieval and generation strategies. -To take a closer look at a RAG pipeline that incorporates agents and utilizes advanced techniques like text chunking and reranking, check out this [post](https://www.llamaindex.ai/blog/agentic-rag-with-llamaindex-2721b8a49ff6) and accompanying [notebook](https://github.com/cobusgreyling/LlamaIndex/blob/d8902482a247c76c7902ded143a875d5580f072a/Agentic_RAG_Multi_Document_Agents-v1.ipynb) on the LlamaIndex blog. +To take a closer look at a RAG pipeline that incorporates agents, check out this [blog on Agentic RAG](/blog/what-is-agentic-rag/). ### Graph RAG diff --git a/blog/2024-10-29-low-code-builder-lamatic/img/data-indexing-flow.png b/blog/2024-10-29-low-code-builder-lamatic/img/data-indexing-flow.png new file mode 100644 index 0000000000..647eeaf896 Binary files /dev/null and b/blog/2024-10-29-low-code-builder-lamatic/img/data-indexing-flow.png differ diff --git a/blog/2024-10-29-low-code-builder-lamatic/img/gen-ops-cycle.png b/blog/2024-10-29-low-code-builder-lamatic/img/gen-ops-cycle.png new file mode 100644 index 0000000000..6fba904638 Binary files /dev/null and b/blog/2024-10-29-low-code-builder-lamatic/img/gen-ops-cycle.png differ diff --git a/blog/2024-10-29-low-code-builder-lamatic/img/hero.png b/blog/2024-10-29-low-code-builder-lamatic/img/hero.png new file mode 100644 index 0000000000..98eaa07d2b Binary files /dev/null and b/blog/2024-10-29-low-code-builder-lamatic/img/hero.png differ diff --git a/blog/2024-10-29-low-code-builder-lamatic/img/lamatic-value.png b/blog/2024-10-29-low-code-builder-lamatic/img/lamatic-value.png new file mode 100644 index 0000000000..a6eae290e4 Binary files /dev/null and b/blog/2024-10-29-low-code-builder-lamatic/img/lamatic-value.png differ diff --git a/blog/2024-10-29-low-code-builder-lamatic/img/retrieval-and-response-flow.png b/blog/2024-10-29-low-code-builder-lamatic/img/retrieval-and-response-flow.png new file mode 100644 index 0000000000..0e384feb2c Binary files /dev/null and b/blog/2024-10-29-low-code-builder-lamatic/img/retrieval-and-response-flow.png differ diff --git a/blog/2024-10-29-low-code-builder-lamatic/index.mdx b/blog/2024-10-29-low-code-builder-lamatic/index.mdx new file mode 100644 index 0000000000..118b2b0c02 --- /dev/null +++ b/blog/2024-10-29-low-code-builder-lamatic/index.mdx @@ -0,0 +1,126 @@ +--- +title: Build Contextual GenAI Apps in low code with Lamatic and Weaviate +slug: low-code-builder-lamatic +authors: [adam, aman] +date: 2024-10-29 +tags: ['concepts'] +image: ./img/hero.png +description: 'Learn about Retrieval Augmented Generation (RAG), including architecture, use cases, implementation, and evaluation.' +--- +![Introduction to Retrieval Augmented Generation (RAG)](./img/hero.png) + +Large Language Models (LLMs) and Vector Databases have revolutionized knowledge management and automation. Retrieval pipelines now enable businesses with vast data repositories to provide their employees with instant access to crucial insights and answers. However, implementing these systems effectively requires a certain level of expertise. There's always a risk of misapplying AI, which is best avoided. + +Weaviate simplifies this process by offering an easy way to launch a serverless vector database instance and develop retrieval-based applications such as vector search and RAG chatbots. [Lamatic.ai](http://Lamatic.ai) takes this convenience a step further by providing serverless middleware that allows you to seamlessly integrate these features into your product. This approach eliminates the need for hiring specialized technical talent, extensive learning curves, and managing complex infrastructure. + + +## About Lamatic.ai: Empowering High-Performance GenAI + +Lamatic is a comprehensive managed platform that combines a low-code visual builder, Weaviate, and integrations with various apps and models. It enables users to build, test, and deploy high-performance GenAI applications on the edge, all within minutes. + +Key offerings of [Lamatic.ai](http://Lamatic.ai) include: + +- **Intuitive Managed Backend:** Facilitates drag-and-drop connectivity to your preferred models, data sources, tools, and applications +- **Collaborative Development Environment:** Enables teams to collaboratively build, test, and refine sophisticated GenAI workflows in a unified space +- **Seamless Prototype to Production Pipeline:** Features weaviate and self-documenting GraphQL API that automatically scales on Serverless Edge infrastructure + +![Lamatic key offerings](./img/lamatic-value.png) + +# Leveraging [Lamatic.ai](http://Lamatic.ai) and Weaviate for Effortless Contextual App Development + +[Lamatic.ai](http://Lamatic.ai) offers a powerful, fully managed GenAI stack that includes Weaviate. This innovative platform allows users to harness advanced AI technologies without requiring deep technical expertise. Let's explore how you can build a simple contextual chatbot using [Lamatic.ai](http://Lamatic.ai), following three key phases: Build, Connect, and Deploy. + +## Build: Creating Your GenAI Flows + +The first step is to build your flows. A flow is a visual representation of your GenAI app's logic. For our contextual chatbot, we'll need two flows: + +1. Data Indexing Flow: + +![data indexing flow](./img/data-indexing-flow.png) + +This flow automatically fetches files from a data source (like Google Drive) and indexes them into the VectorDB. It periodically checks for new changes and updates the index accordingly. + + + +2. Retrieval and Response Flow: + +![retrieval and response flow](./img/retrieval-and-response-flow.png) + +This flow is triggered by a Slack command (e.g., /ask) and responds with answers based on the indexed data. It retrieves relevant information from the VectorDB and uses an LLM to generate a response. + + + +## Connect: Integrating Your Components + +After setting up your flows, connect the necessary components: + +- Apps: Integrate with Google Drive for data sourcing and Slack for user interaction. +- Models: Choose and connect your preferred LLM for vectorization and querying. +- Vector Store: Set up a Weaviate vector store within [Lamatic.ai](http://Lamatic.ai). + +## Deploy: Bringing Your Chatbot to Life + +Before deployment, thoroughly test your flows using [Lamatic.ai](http://Lamatic.ai)'s built-in debug options. Once you're satisfied with the performance, hit deploy to launch your project on the Edge. The indexing flow will start populating your Weaviate Store, and soon your Slack users can start asking questions using the /ask command. + +> The beauty of this approach is its versatility. With these same building blocks, you can create a wide range of applications that leverage contextual information from various sources. Let your imagination run wild! You can find more apps, templates and models here +> +> +> [Lamatic.ai Hub](https://hub.lamatic.ai/) +> + +--- + +# 10 tips on building reliable Contextual apps with low code + +![gen ops cycle](./img/gen-ops-cycle.png) + +1. **Research Thoroughly:** Understand the problem domain and explore available technologies through academic papers, industry reports, and expert opinions. +2. **Study Existing Cases:** Learn from successful implementations by examining case studies and engaging with professionals who've tackled similar challenges. +3. **Plan Comprehensively:** Develop a detailed roadmap outlining project milestones, resources, risks, and contingencies before starting development. +4. **Test Multiple Approaches:** Experiment with various strategies through prototypes, simulations, or A/B tests to find the most effective solution. +5. **Handle Edge Cases:** Identify and resolve potential issues through comprehensive testing, including stress tests and unusual scenarios. +6. **Seek User Feedback:** Engage with existing users to gather insights on relevance and usability through surveys, interviews, and usability tests. +7. **Integrate Strategically:** Analyze your app's ecosystem to implement features where they provide the most value to users. +8. **Automate Data Flows:** Create efficient, self-maintaining data pipelines with robust error handling and automated reporting. +9. **Monitor Continuously:** Implement tracking systems to monitor performance and user interactions in real-time using analytics tools and custom dashboards. +10. **Optimize Iteratively:** Refine your application based on user feedback, performance metrics, and market trends through regular review cycles. + +--- + +# Potential Applications + +1. **Intelligent Documentation Assistant for Slack** +Create a Slack bot that provides instant answers from your documentation, enhancing team productivity and knowledge sharing. For example, GenAI Collective significantly improved their event organizers' experience by implementing an answer bot within their apps, reducing response times and increasing efficiency. +2. **Enhanced Website Search with Vector and Hybrid Capabilities** +Use advanced search techniques to improve website navigation and content discovery, leading to a better user experience. For instance, [84000.co](http://84000.co) incorporated a hybrid search system to make Buddhist translations easily discoverable, combining traditional keyword search with AI-powered semantic understanding for more accurate results. +3. **Integrated Image and Text Generation** +Integrate GenAI features like image generation and content creation directly within your app. [Dinnerfy.com](http://Dinnerfy.com) exemplifies this by offering AI-generated recipe images and descriptions, enhancing user engagement and providing a more interactive culinary experience. +4. **Automated Information Extraction and Summarization** +Extract key information, score, and summarize large volumes of data. [Traq.ai](http://Traq.ai) demonstrates this capability by automatically summarizing and scoring customer calls, providing valuable insights for businesses to improve their customer service and sales strategies. + +# Go Beyond + +The examples above merely scratch the surface of what's achievable with [Lamatic.ai](http://Lamatic.ai). The possibilities are truly limitless. Rather than investing time and resources in recruiting scarce talent and managing complex infrastructure, focus on realizing your unique use case. +We believe tools like [lamatic.ai](http://lamatic.ai) are pivotal in democratizing AI, making it more accessible to businesses of all sizes and ultimately improving lives. The low-code approach offered by [Lamatic.ai](http://Lamatic.ai) transforms complex technical concepts such as vector databases, text chunking, and model selection into intuitive, approachable processes. This simplification breaks down barriers that have traditionally deterred many from exploring AI applications. + +Furthermore, the platform's extensive library of templates and pre-built configurations significantly accelerates the development process. This allows businesses to rapidly prototype, iterate, and scale their AI solutions without getting bogged down in technical intricacies. By lowering the entry barrier and speeding up development cycles, [Lamatic.ai](http://Lamatic.ai) empowers organizations to focus on innovation and problem-solving rather than wrestling with infrastructure and code. + +The impact of such accessible AI tools extends beyond individual businesses. As more organizations leverage AI capabilities, we anticipate a ripple effect of innovation across industries, leading to enhanced products, services, and customer experiences. This democratization of AI technology has the potential to drive economic growth, foster competition, and ultimately contribute to societal progress on a global scale. + +Ready to explore further? Sign up for Lamatic AI or schedule a complimentary 1:1 AI workshop to discuss your specific use case. + +For those looking to bring Vector Database capabilities closer to their application infrastructure, get started with Weaviate Cloud today. + + + +import WhatsNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-10-29-weaviate-1-27-release/_core-1-27-include.mdx b/blog/2024-10-29-weaviate-1-27-release/_core-1-27-include.mdx new file mode 100644 index 0000000000..889762b372 --- /dev/null +++ b/blog/2024-10-29-weaviate-1-27-release/_core-1-27-include.mdx @@ -0,0 +1,188 @@ +Weaviate `1.27` is here! + +Here are the release ⭐️*highlights*⭐️! + +![Weaviate 1.27](./img/hero.png) + +- [**Big filtered search improvements**](#improved-filtered-search) +- [**Multi-target vector search enhancement**](#multi-target-vector-search-enhancement) +- [**Jina V3 embedding support**](#jina-v3-embedding-support) +- [**Cancel backups**](#cancel-backups) +- [**Other changes**](#other-changes) + +## Improved Filtered Search + +Weaviate `1.27` introduces a new filtering strategy with big benefits for performance and scalability. + +This exciting new search strategy/algorithm comes from our Applied Research team. Weaviate's new filtered search implementation is inspired by the popular [`ACORN`](https://arxiv.org/html/2403.04871v1) paper, improving on it to make it even better for Weaviate users. + +Weaviate's ACORN algorithm will particularly benefit those of you with very large datasets. More specifically, it should significantly improve performance challenges with negatively correlated filtered HNSW searches. + +:::tip What is a negatively correlated filtered search? + +A filtered search combines the structured, rule-based inclusion and exclusion of entities with the vector-based similarity search. The structured part is the filter, and the vector-based part is the search. +
+ +In a negatively correlated filtered search, the filter disproportionately removes entities that would be most similar to the search query, as shown below. + +
+ +

Range query section graphic

+ +
An illustration of vector query / filter correlation (original from https://arxiv.org/html/2403.04871v1).
+ +
+ +This type of filtered search can be slower than other filtered searches. As in the figure, the vector search starts at the "wrong" end of the vector space, where the most similar entities are removed by the filter. +
+ +The new ACORN filter strategy in Weaviate `1.27` dramatically improves the filtered vector search performance in situations like this. + +::: + +### How does ACORN work? + +The ACORN algorithm improves filtered search performance in three different ways: + +- Objects that do not meet the filters are ignored in distance calculations. +- The algorithm reaches the relevant part of the HNSW graph faster, by using a multi-hop approach to evaluate the neighborhood of candidates. +- The entry points are randomly seeded to speed up convergence to the filtered zone. + +This implementation is [Weaviate's own version](/developers/weaviate/concepts/filtering) of that described in the original paper, with modifications to make it even better for Weaviate users. + +### How to use ACORN + +ACORN can be enabled as the filter strategy by setting `filterStrategy` for the relevant HNSW vector index [in the collection configuration](/developers/weaviate/manage-data/collections#set-vector-index-parameters). + +:::note Note: Filter strategy parameter not yet supported by all clients +At the time of writing, the `filterStrategy` parameter is not yet supported by all Weaviate clients. It will be added to all clients shortly. +::: + +According to our internal tests, the ACORN algorithm generally improves the filtered vector search performances, with the most significant improvements in negatively correlated filtered searches. + +Note that there may be a small cost in recall, but our testing has found this to be minimal if not negligible. + +We are really excited for you to try it out. + +:::tip Who should use ACORN? +We think that ACORN will benefit most users. But, we especially encourage you to try it out if you have experienced challenges with filtered HNSW searches. +::: + +:::note Tell us about your experience ACORN +We would love to hear from you about your experiences with ACORN. Please drop by to [our forum](https://forum.weaviate.io/t/acorn-feedback-mega-thread/7240) and tell us about it! +::: + +## Multi-Target Vector Search Enhancement + +In Weaviate `1.27`, multi-target vector search has been improved further to allow searching the [same vector field multiple times](/developers/weaviate/search/multi-vector#specify-query-vectors) in one query. + +These new options provide even more flexibility for comprehensive searches through your data with Weaviate. + +Take a look at the [multi-target vector search page](/developers/weaviate/search/multi-vector) for more examples. + +:::info What is a multi-target vector search? + +Weaviate `1.26` introduced [multi-target vector searches](/developers/weaviate/search/multi-vector), where one search query can search across multiple target vectors. +
+ +For example, you can search a product object with a query, and compare the query to the product's: +- title vector and +- description vector + +In one search! + +::: + +## Jina V3 embedding support + +Weaviate's [Jina AI embedding integration](/developers/weaviate/model-providers/jinaai/embeddings) now supports Jina AI's new V3 embeddings. + +### How to use the v3 embedding model + +From your perspective, all you have to set is the model name, to `jina-embeddings-v3` [here](/developers/weaviate/model-providers/jinaai/embeddings#configure-the-vectorizer). + +With the v3 model, you can optionally specify the `dimensions` parameter in the collection configuration with the Jina AI model integration. This will set Weaviate's Jina AI model integration to obtain vectors of the correct length. You can balance your search quality needs here with resource usage. + +Note you can combine Weaviate's [quantization techniques](/developers/weaviate/starter-guides/managing-resources/compression) with this to further manage resource usage. + +See the [Jina AI model integration page](/developers/weaviate/model-providers/jinaai/embeddings) for information on how to use this model. + +You can find more information about the model on [JinaAI's website](https://jina.ai/news/jina-embeddings-v3-a-frontier-multilingual-embedding-model/). + +:::info About Jina AI's v3 embedding model + +This model is a multilingual model that remains small and efficient while performing well on standard retrieval benchmarks. +
+ +The v3 model adopts binary passage retrieval capabilities, which understands the difference between the database entries (`passages`) and the user `queries`. + +Weaviate automatically implements this for convenience, embedding objects as `passages` during import, and as `queries` during `nearText` search. +
+ +Furthermore, the v3 model produces Matryoshka-style embeddings, This means that the generated embeddings can be truncated to suit the required precision. + +::: + +## Cancel backups + +[Creating backups](/developers/weaviate/configuration/backups) is a big part of database administration, especially in a production setting. + +In some cases, however, a backup process may be unwanted. Perhaps a backup was triggered by accident, or a backup process may be stuck. + +To address this, we have added a backup cancellation feature. Now, an unwanted, ongoing backup process can be stopped instead of consuming valuable CPU cycles. + +Backups can be cancelled [through a supported Weaviate client](/developers/weaviate/configuration/backups#cancel-backup), or through the [REST endpoint](/developers/weaviate/api/rest). + +## Other changes + +### Case sensitive vectorization + +:::info How does Weaviate vectorize text? +Weaviate [integrates with embedding model providers](/developers/weaviate/model-providers) in order to conveniently vectorize data during import. +::: + +From `v1.27`, text is no longer lowercased by default before vectorization. + +This change reflects the modern embeddings' capabilities to deal with uppercase (vs lowercase) characters. We expect that any changes to embeddings here will be very small, but we expect this to be closer to how modern embedding models expect inputs to look. + +If you prefer the previous behavior where the inputs are lowercased before import, set the `LOWERCASE_VECTORIZATION_INPUT` [environment variable](/developers/weaviate/config-refs/env-vars#general) to `true`. + +### Google modules renamed + +The Weaviate modules that underpin its [Google model integrations](/developers/weaviate/model-providers/google) have been renamed. Historically, they were named after the `PaLM` generation of models, thus having names `text2vec-palm`, `generative-palm`, `multi2vec-palm`. + +They have been renamed to `text2vec-google`, `generative-google`, `multi2vec-google` respectively. + +These modules are aliased under-the-hood in Weaviate, so your existing codebase will continue to work. However, we recommend updating your existing code if you are upgrading Weaviate so that your codebase follows the latest conventions. + +### PQ training set sampling + +[Product quantization (PQ)](/developers/weaviate/concepts/vector-quantization#product-quantization) is a technique used to compress vectors for efficient storage and retrieval. + +PQ requires calculation of centroids using a training set. From `1.27`, if you have ingested more objects than the training set size, Weaviate will now sample the training set from the ingested objects. This should make it more likely that the training set is representative of the data. + +### Reliability and performance improvements + +Between `1.26` and `1.27`, Weaviate's database and applied research teams have been hard at work, making significant improvements under-the-hood for reliability and performance improvements. + +We won't list them all here, but they include: +- improvements to BM25 & hybrid query performance +- data (LSM) store improvements, +- cluster (Raft) improvements, +- tombstone cleanup improvements + +and many more. + +As always, we recommend updating your version of Weaviate to the latest available patch release (e.g. `1.26.2` ➡️ `1.26.5`). And we encourage you to consider upgrading to the latest release (e.g. `1.26.2` ➡️ `1.27.0`). + +:::info Release notes +For a full list of changes, see the [release notes for each version](https://github.com/weaviate/weaviate/tags). +::: + +## Summary + +Enjoy the new features and improvements in Weaviate `1.27`. The release is available open-source as always [on GitHub](https://github.com/weaviate/weaviate/releases/tag/v1.27.0), and is available for new Sandboxes on [Weaviate Cloud](https://console.weaviate.cloud/). So please give it a try! + +It will be available for Serverless clusters on Weaviate Cloud soon as well. + +Thanks for reading, see you next time 👋! diff --git a/blog/2024-10-29-weaviate-1-27-release/img/hero.png b/blog/2024-10-29-weaviate-1-27-release/img/hero.png new file mode 100644 index 0000000000..a288638f65 Binary files /dev/null and b/blog/2024-10-29-weaviate-1-27-release/img/hero.png differ diff --git a/blog/2024-10-29-weaviate-1-27-release/img/query-correlation.png b/blog/2024-10-29-weaviate-1-27-release/img/query-correlation.png new file mode 100644 index 0000000000..c518437fc4 Binary files /dev/null and b/blog/2024-10-29-weaviate-1-27-release/img/query-correlation.png differ diff --git a/blog/2024-10-29-weaviate-1-27-release/index.mdx b/blog/2024-10-29-weaviate-1-27-release/index.mdx new file mode 100644 index 0000000000..0d15e312d8 --- /dev/null +++ b/blog/2024-10-29-weaviate-1-27-release/index.mdx @@ -0,0 +1,18 @@ +--- +title: Weaviate 1.27 Release +slug: weaviate-1-27-release +authors: [jp] +date: 2024-10-29 +image: ./img/hero.png +tags: ['release', 'engineering'] +description: "1.27 adds filtered search and multi-target vector improvements, Jina V3 embedding support and more!" + +--- + +import Core127 from './_core-1-27-include.mdx'; + + + +import WhatsNext from '/_includes/what-next.mdx' + + diff --git a/blog/2024-11-05-what-is-agentic-rag/img/Components_of_an_AI_agent.png b/blog/2024-11-05-what-is-agentic-rag/img/Components_of_an_AI_agent.png new file mode 100644 index 0000000000..f9ad6a1baa Binary files /dev/null and b/blog/2024-11-05-what-is-agentic-rag/img/Components_of_an_AI_agent.png differ diff --git a/blog/2024-11-05-what-is-agentic-rag/img/Multi_Agent_RAG_System.png b/blog/2024-11-05-what-is-agentic-rag/img/Multi_Agent_RAG_System.png new file mode 100644 index 0000000000..226b096f02 Binary files /dev/null and b/blog/2024-11-05-what-is-agentic-rag/img/Multi_Agent_RAG_System.png differ diff --git a/blog/2024-11-05-what-is-agentic-rag/img/ReAct.png b/blog/2024-11-05-what-is-agentic-rag/img/ReAct.png new file mode 100644 index 0000000000..49fa126ec2 Binary files /dev/null and b/blog/2024-11-05-what-is-agentic-rag/img/ReAct.png differ diff --git a/blog/2024-11-05-what-is-agentic-rag/img/Single_Agent_RAG_System_(Router).png b/blog/2024-11-05-what-is-agentic-rag/img/Single_Agent_RAG_System_(Router).png new file mode 100644 index 0000000000..21629b01f3 Binary files /dev/null and b/blog/2024-11-05-what-is-agentic-rag/img/Single_Agent_RAG_System_(Router).png differ diff --git a/blog/2024-11-05-what-is-agentic-rag/img/Vanilla_RAG.png b/blog/2024-11-05-what-is-agentic-rag/img/Vanilla_RAG.png new file mode 100644 index 0000000000..1b0056765e Binary files /dev/null and b/blog/2024-11-05-what-is-agentic-rag/img/Vanilla_RAG.png differ diff --git a/blog/2024-11-05-what-is-agentic-rag/img/hero.png b/blog/2024-11-05-what-is-agentic-rag/img/hero.png new file mode 100644 index 0000000000..423d82db9a Binary files /dev/null and b/blog/2024-11-05-what-is-agentic-rag/img/hero.png differ diff --git a/blog/2024-11-05-what-is-agentic-rag/index.mdx b/blog/2024-11-05-what-is-agentic-rag/index.mdx new file mode 100644 index 0000000000..082ff3f3ef --- /dev/null +++ b/blog/2024-11-05-what-is-agentic-rag/index.mdx @@ -0,0 +1,260 @@ +--- +title: What is Agentic RAG +slug: what-is-agentic-rag +authors: [erika, leonie] +date: 2024-11-05 +tags: ['concepts'] +image: ./img/hero.png +description: 'Learn about Agentic Retrieval Augmented Generation (RAG), including architecture, implementation, and and difference to vanilla RAG.' +--- +![Agentic Retrieval Augmented Generation (RAG)](./img/hero.png) + + +While Retrieval-Augmented Generation (RAG) dominated 2023, [agentic workflows are driving massive progress in 2024](https://x.com/AndrewYNg/status/1770897666702233815?lang=en). The usage of AI agents opens up new possibilities for building more powerful, robust, and versatile Large Language Model(LLM)-powered applications. One possibility is enhancing RAG pipelines with AI agents in agentic RAG pipelines. + +This article introduces you to the concept of agentic RAG, its implementation, and its benefits and limitations. + +## Fundamentals of Agentic RAG + +Agentic RAG describes an AI agent-based implementation of RAG. Before we go any further, let’s quickly recap the fundamental concepts of RAG and AI agents. + +### What is Retrieval-Augmented Generation (RAG) + +[Retrieval-Augmented Generation (RAG)](https://weaviate.io/blog/introduction-to-rag) is a technique for building LLM-powered applications. It leverages an external knowledge source to provide the LLM with relevant context and reduce hallucinations. + +A naive RAG pipeline consists of a retrieval component (typically composed of an embedding model and a vector database) and a generative component (an LLM). At inference time, the user query is used to run a similarity search over the indexed documents to retrieve the most similar documents to the query and provide the LLM with additional context. + +![Vanilla RAG](./img/Vanilla_RAG.png) + +Typical RAG applications have two considerable limitations: + +1. The naive RAG pipeline only considers one external knowledge source. However, some solutions might require two external knowledge sources, and some solutions might require external tools and APIs, such as web searches. +2. They are a one-shot solution, which means that context is retrieved once. There is no reasoning or validation over the quality of the retrieved context. + +### What are Agents in AI Systems + +With the popularity of LLMs, new paradigms of AI agents and multi-agent systems have emerged. AI agents are LLMs with a role and task that have access to memory and external tools. The reasoning capabilities of LLMs help the agent plan the required steps and take action to complete the task at hand. + +Thus, the core components of an AI agent are: + +- LLM (with a role and a task) +- Memory (short-term and long-term) +- Planning (e.g., reflection, self-critics, query routing, etc.) +- Tools (e.g., calculator, web search, etc.) + +![Components of an AI agent](./img/Components_of_an_AI_agent.png) + +One popular framework is the [ReAct framework](https://arxiv.org/abs/2210.03629). A ReAct agent can handle sequential multi-part queries while maintaining state (in memory) by combining routing, query planning, and tool use into a single entity. + +> ReAct = Reason + Act (with LLMs) + + +The process involves the following steps: + +1. Thought: Upon receiving the user query, the agent reasons about the next action to take +2. Action: the agent decides on an action and executes it (e.g., tool use) +3. Observation: the agent observes the feedback from the action +4. This process iterates until the agent completes the task and responds to the user. + + ![ReAct framework](./img/ReAct.png) + + +## What is Agentic RAG? + +Agentic RAG describes an AI agent-based implementation of RAG. Specifically, it incorporates AI agents into the RAG pipeline to orchestrate its components and perform additional actions beyond simple information retrieval and generation to overcome the limitations of the non-agentic pipeline. + +> Agentic RAG describes an AI agent-based implementation of RAG. + +### How does Agentic RAG work? + +Although agents can be incorporated in different stages of the RAG pipeline, agentic RAG most commonly refers to the use of agents in the retrieval component. + +Specifically, the retrieval component becomes agentic through the use of retrieval agents with access to different retriever tools, such as: + +- Vector search engine (also called a query engine) that performs vector search over a vector index (like in typical RAG pipelines) +- Web search +- Calculator +- Any API to access software programmatically, such as email or chat programs +- and many more. + +The RAG agent can then reason and act over the following example retrieval scenarios: + +1. Decide whether to retrieve information or not +2. Decide which tool to use to retrieve relevant information +3. Formulate the query itself +4. Evaluate the retrieved context and decide whether it needs to re-retrieve. + +### Agentic RAG Architecture + +In contrast to the sequential naive RAG architecture, the core of the agentic RAG architecture is the agent. Agentic RAG architectures can have various levels of complexity. In the simplest form, a single-agent RAG architecture is a simple router. However, you can also add multiple agents into a multi-agent RAG architecture. This section discusses the two fundamental RAG architectures. + +**Single-Agent RAG (Router)** + +In its simplest form, agentic RAG is a router. This means you have at least two external knowledge sources, and the agent decides which one to retrieve additional context from. However, the external knowledge sources don't have to be limited to (vector) databases. You can retrieve further information from tools as well. For example, you can conduct a web search, or you could use an API to retrieve additional information from Slack channels or your email accounts. + +![Single Agent RAG System (Router).png](./img/Single_Agent_RAG_System_(Router).png) + +**Multi-agent RAG Systems** + +As you can guess, the single-agent system also has its limitations because it's limited to only one agent with reasoning, retrieval, and answer generation in one. Therefore, it is beneficial to chain multiple agents into a multi-agent RAG application. + +For example, you can have one master agent who coordinates information retrieval among multiple specialized retrieval agents. For instance, one agent could retrieve information from proprietary internal data sources. Another agent could specialize in retrieving information from your personal accounts, such as email or chat. Another agent could also specialize in retrieving public information from web searches. + +![Multi Agent RAG System.png](./img/Multi_Agent_RAG_System.png) + +### Beyond Retrieval Agents + +The above example shows the usage of different retrieval agents. However, you could also use agents for purposes other than retrieval. The possibilities of agents in the RAG system are manifold. + +## Agentic RAG vs. (Vanilla) RAG + +While the fundamental concept of RAG (sending a query, retrieving information, and generating a response) remains the same, **tool use generalizes it,** making it more flexible and powerful. + +Think of it this way: Common (vanilla) RAG is like being at the library (before smartphones existed) to answer a specific question. Agentic RAG, on the other hand, is like having a smartphone in your hand with a web browser, a calculator, your emails, etc. + +| | Vanilla RAG | Agentic RAG | +| --- | --- | --- | +| Access to external tools | No | Yes | +| Query pre-processing | No | Yes | +| Multi-step retrieval | No | Yes | +| Validation of retrieved information | No | Yes | + +## Implementing Agentic RAG + +As outlined earlier, agents are comprised of multiple components. To build an agentic RAG pipeline, there are two options: a language model with function calling or an agent framework. Both implementations get to the same result, it will just depend on the control and flexibility you want. + +### Language Models with Function Calling + +Language models are the main component of agentic RAG systems. The other component is tools, which enable the language model access to external services. Language models with function calling offer a way to build an agentic system by allowing the model to interact with predefined tools. Language model providers have added this feature to their clients. + +In June 2023, [OpenAI released function calling](https://platform.openai.com/docs/assistants/tools/function-calling) for `gpt-3.5-turbo` and `gpt-4`. It enabled these models to reliably connect GPT’s capabilities with external tools and APIs. Developers quickly started building applications that plugged `gpt-4` into code executors, databases, calculators, and more. + +[Cohere](https://docs.cohere.com/v2/docs/tool-use) further launched their connectors API to add tools to the Command-R suite of models. Additionally, [Anthropic](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) and [Google](https://ai.google.dev/gemini-api/docs/function-calling) launched function calling for Claude and Gemini. By powering these models with external services, it can access and cite web resources, execute code and more. + +Function calling isn’t only for proprietary models. Ollama introduced tool support for popular open-source models like `Llama3.2`, `nemotron-mini`, and [others](https://ollama.com/search?c=tools). + +To build a tool, you first need to define the function. In this snippet, we’re writing a function that is using Weaviate’s [hybrid search](https://weaviate.io/developers/weaviate/search/hybrid) to retrieve objects from the database: + +```python +def get_search_results(query: str) -> str: + """Sends a query to Weaviate's Hybrid Search. Parses the response into a {k}:{v} string.""" + + response = blogs.query.hybrid(query, limit=5) + + stringified_response = "" + for idx, o in enumerate(response.objects): + stringified_response += f"Search Result: {idx+1}:\n" + for prop in o.properties: + stringified_response += f"{prop}:{o.properties[prop]}" + stringified_response += "\n" + + return stringified_response +``` + +We will then pass the function to the language model via a `tools_schema`. The schema is then used in the prompt to the language model: + +```python +tools_schema=[{ + 'type': 'function', + 'function': { + 'name': 'get_search_results', + 'description': 'Get search results for a provided query.', + 'parameters': { + 'type': 'object', + 'properties': { + 'query': { + 'type': 'string', + 'description': 'The search query.', + }, + }, + 'required': ['query'], + }, + }, +}] +``` + +Since you’re connecting to the language model API directly, you’ll need to write a loop that routes between the language model and tools: + +```python +def ollama_generation_with_tools(user_message: str, + tools_schema: List, tool_mapping: Dict, + model_name: str = "llama3.1") -> str: + messages=[{ + "role": "user", + "content": user_message + }] + response = ollama.chat( + model=model_name, + messages=messages, + tools=tools_schema + ) + if not response["message"].get("tool_calls"): + return response["message"]["content"] + else: + for tool in response["message"]["tool_calls"]: + function_to_call = tool_mapping[tool["function"]["name"]] + print(f"Calling function {function_to_call}...") + function_response = function_to_call(tool["function"]["arguments"]["query"]) + messages.append({ + "role": "tool", + "content": function_response, + }) + + final_response = ollama.chat(model=model_name, messages=messages) + return final_response["message"]["content"] +``` + +Your query will then look like this: + +```python +ollama_generation_with_tools("How is HNSW different from DiskANN?", + tools_schema=tools_schema, tool_mapping=tool_mapping) +``` + +You can follow along [this recipe](https://github.com/weaviate/recipes/blob/main/integrations/llm-frameworks/function-calling/ollama/ollama-weaviate-agents.ipynb) to recreate the above. + +### Agent Frameworks + +Agent Frameworks such as DSPy, LangChain, CrewAI, LlamaIndex, and Letta have emerged to facilitate building applications with language models. These frameworks simplify building agentic RAG systems by plugging pre-built templates together. + +- DSPy supports [ReAct](https://dspy-docs.vercel.app/deep-dive/modules/react/) agents and [Avatar](https://github.com/stanfordnlp/dspy/blob/main/examples/agents/avatar_langchain_tools.ipynb) optimization. Avatar optimization describes the use of automated prompt engineering for the descriptions of each tool. +- [LangChain](https://www.langchain.com/) provides many services for working with tools. LangChain’s [LCEL](https://python.langchain.com/v0.1/docs/expression_language/) and [LangGraph](https://www.langchain.com/langgraph) frameworks further offer built-in tools. +- [LlamaIndex](https://www.llamaindex.ai/) further introduces the QueryEngineTool, a collection of templates for retrieval tools. +- [CrewAI](https://www.crewai.com/) is one of the leading frameworks for developing multi-agent systems. One of the key concepts utilized for tool use is sharing tools amongst agents. +- [Swarm](https://github.com/openai/swarm) is a framework built by OpenAI for multi-agent orchestration. Swarm similarly focuses on how tools are shared amongst agents. +- [Letta](https://docs.letta.com/introduction) interfaces reflecting and refining an internal world model as functions. This entails potentially using search results to update the agent’s memory of the chatbot user, in addition to responding to the question. + +## Why are Enterprises Adopting Agentic RAG + +Enterprises are moving on from vanilla RAG to building agentic RAG applications. [Replit released an agent](https://docs.replit.com/replitai/agent) that helps developers build and debug software. Additionally, [Microsoft announced copilots](https://blogs.microsoft.com/blog/2024/10/21/new-autonomous-agents-scale-your-team-like-never-before/) that work alongside users to provide suggestions in completing tasks. These are only a few examples of agents in production and the possibilities are endless. + +### Benefits of Agentic RAG + +The shift from vanilla RAG to agentic RAG allows these systems to produce more accurate responses, perform tasks autonomously, and better collaborate with humans. + +The benefit of agentic RAG lies primarily in the improved quality of retrieved additional information. By adding agents with access to tool use, the retrieval agent can route queries to specialized knowledge sources. Furthermore, the reasoning capabilities of the agent enable a layer of validation of the retrieved context before it is used for further processing. As a result, agentic RAG pipelines can lead to more robust and accurate responses. + +### Limitations of Agentic RAG + +However, there are always two sides to every coin. Using an AI agent a for subtask means incorporating an LLM to do a task. This comes with the limitations of using LLMs in any application, such as added latency and unreliability. Depending on the reasoning capabilities of the LLM, an agent may fail to complete a task sufficiently (or even at all). It is important to incorporate proper failure modes to help an AI agent get unstuck when they are unable to complete a task. + +## Summary + +This blog discussed the concept of agentic RAG, which involves incorporating agents into the RAG pipeline. Although agents can be used for many different purposes in a RAG pipeline, agentic RAG most often involves using retrieval agents with access to tools to generalize retrieval. + +This article discussed agentic RAG architectures using single-agent and multi-agent systems and their differences from vanilla RAG pipelines. + +With the rise and popularity of AI agent systems, many different frameworks are evolving for implementing agentic RAG, such as LlamaIndex, LangGraph, or CrewAI. + +Finally, this article discussed the benefits and limitations of agentic RAG pipelines. + +## Further Resources + +- [Notebook](https://github.com/weaviate/recipes/blob/main/integrations/llm-frameworks/function-calling/openai/openai-swarm.ipynb) using Swarm +- [Notebook](https://github.com/weaviate/recipes/tree/main/integrations/llm-frameworks/letta) using Letta and Weaviate +- [Notebooks](https://github.com/weaviate/recipes/tree/main/integrations/llm-frameworks/function-calling/ollama) on using function calling in Ollama +- [Notebook](https://github.com/weaviate/recipes/blob/main/integrations/llm-frameworks/agentic-rag-benchmark/vanilla-rag-vs-agentic-rag.ipynb) on Vanilla RAG versus Agentic RAG + +import WhatsNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.2-dark.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.2-dark.png new file mode 100644 index 0000000000..05aa704912 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.2-dark.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.2-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.2-light.png new file mode 100644 index 0000000000..9abefd44d7 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.2-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.3-dark.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.3-dark.png new file mode 100644 index 0000000000..f841c17d18 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.3-dark.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.3-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.3-light.png new file mode 100644 index 0000000000..4cbfb21100 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.3-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.4-dark.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.4-dark.png new file mode 100644 index 0000000000..f4320b3070 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.4-dark.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.4-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.4-light.png new file mode 100644 index 0000000000..8e999aa153 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.4-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.5-dark.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.5-dark.png new file mode 100644 index 0000000000..a28db5e445 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.5-dark.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.5-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.5-light.png new file mode 100644 index 0000000000..21da971b08 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-0.5-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-correlated-0.2-dark.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-correlated-0.2-dark.png new file mode 100644 index 0000000000..ea551b4ab5 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-correlated-0.2-dark.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-correlated-0.2-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-correlated-0.2-light.png new file mode 100644 index 0000000000..540375e221 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-500k-filtered-dot-correlated-0.2-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-dot-filtered-negative-dark.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-dot-filtered-negative-dark.png new file mode 100644 index 0000000000..2996ab8e39 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-dot-filtered-negative-dark.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-dot-filtered-negative-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-dot-filtered-negative-light.png new file mode 100644 index 0000000000..cd26a1ca1e Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/beir-cohere-dot-filtered-negative-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/graph-example.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/graph-example.png new file mode 100644 index 0000000000..5017d860e3 Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/graph-example.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/hero-light.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/hero-light.png new file mode 100644 index 0000000000..c8bf68194f Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/hero-light.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/img/hero.png b/blog/2024-11-19-speed-up-filtered-vector-search/img/hero.png new file mode 100644 index 0000000000..f3784224fa Binary files /dev/null and b/blog/2024-11-19-speed-up-filtered-vector-search/img/hero.png differ diff --git a/blog/2024-11-19-speed-up-filtered-vector-search/index.mdx b/blog/2024-11-19-speed-up-filtered-vector-search/index.mdx new file mode 100644 index 0000000000..203003e6cf --- /dev/null +++ b/blog/2024-11-19-speed-up-filtered-vector-search/index.mdx @@ -0,0 +1,243 @@ +--- +title: How we speed up filtered vector search with ACORN +slug: speed-up-filtered-vector-search +authors: [abdel, john, jp] +date: 2024-11-19 +tags: ['concepts', 'engineering', 'research'] +image: ./img/hero-light.png +description: 'Learn about the challenges of filtered vector search and how Weaviate tackles them with ACORN.' +--- +![How we speed up filtered vector search with ACORN](./img/hero.png#gh-dark-mode-only) +![How we speed up filtered vector search with ACORN](./img/hero-light.png#gh-light-mode-only) + +Vector embeddings have revolutionized how we think about search, especially across large datasets. Weaviate’s vector and hybrid search capabilities power recommendation engines, content management systems, and e-commerce sites. + +A “search”, however, is a complex animal. It is rare that a search query is as simple as “find items most similar to `comfortable dress shoes`. A query in the wild often requires that the resulting objects also meet certain criteria - like, `deliverable to my location`, `tan in color`, and `under $200`. In other words, they require traditional “filters” along with a “search”. + +This seemingly simple requirement creates a fascinating technical challenge. + +Do we filter first and then search for similarity? Search first and filter later? How does this affect the overall query quality and performance? Does the relationship between the search and filter criteria matter? + +In this post, we'll talk about how Weaviate has added a new filter strategy called ANN Constraint-Optimized Retrieval Network, commonly referred to as ACORN. ACORN is an innovative solution that we are very excited about. But before we get to all of that, let’s first explore these challenges at a high level, starting with the “pre-filtering” solution. + +## Pre-filtering for vector search + +One way to solve the filtered search problem is to apply the filter first over the data, and then perform the vector search. This is called a “pre-filtering” approach, and in its simplest form, is very straightforward. The search will determine which objects match the filter, skip the HNSW graph index, and just brute force these filtered objects. + +```mermaid +flowchart LR +%% Define main flow nodes +Start["🔍 Search Query"] --> Filter["📑 Apply Filters"] +Filter --> BruteForce["⚡ Brute Force Vector Search"] +BruteForce --> Results["✨ Search Results"] + +%% Group the pre-filtering process +subgraph prefilter ["Pre-filtering Search"] +direction LR +Filter +BruteForce +end + +%% Style nodes +style Start fill:#ffffff,stroke:#B9C8DF,color:#130C49 +style Filter fill:#ffffff,stroke:#B9C8DF,color:#130C49 +style BruteForce fill:#ffffff,stroke:#B9C8DF,color:#130C49 +style Results fill:#ffffff,stroke:#B9C8DF,color:#130C49 + +%% Style subgraph +style prefilter fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + +Brute force over a small amount of data is actually quite fast especially if the filters reduce the dataset to a manageable number of objects. But this approach will quickly become slower as the number of filtered objects increase, as brute force query performance scales linearly with the dataset size. When using HNSW as the vector index in Weaviate, we use this approach for small filters (configurable by the `flatSearchCutOff` parameter). + +Now, what is a “smarter” solution for when you still have too many objects after applying the filter? In this case one option is post-filtering. + +## Post-filtering for vector search + +So, what is post-filtering? As the name suggests, post-filtering means we first search for the closest vectors to our query using the HNSW graph index, and then we apply the filter. + +```mermaid +flowchart LR +%% Define main flow nodes +Start["🔍 Search Query"] --> VectorSearch["⚡ Vector Search"] +VectorSearch --> Filter["📑 Apply Filters"] +Filter --> Results["✨ Search Results"] + +%% Group the post-filtering process +subgraph postfilter ["Post-filtering Search"] +direction LR +VectorSearch +Filter +end + +%% Style nodes +style Start fill:#ffffff,stroke:#B9C8DF,color:#130C49 +style VectorSearch fill:#ffffff,stroke:#B9C8DF,color:#130C49 +style Filter fill:#ffffff,stroke:#B9C8DF,color:#130C49 +style Results fill:#ffffff,stroke:#B9C8DF,color:#130C49 + +%% Style subgraph +style postfilter fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + +This poses some questions immediately, however. Suppose we need to select the top 10 similar vectors to our query that includes a filter. We know that applying a filter over the results set will reduce its number. So, the search results prior to filtering must contain more results. But just how many more should it contain? Including more results will slow down the search, but not including enough may mean we end up with fewer than the desired number (10) once the filter is applied. + +We could estimate this based on the selectivity of the filter. For example, if we have a filter that roughly passes one objects out of 10, then we could obtain an unfiltered results set of 100 and expect to end up with 10 results post-filtering. + +However it is hard to estimate this accurately. A filter’s selectivity will vary, depending on the distribution of the filtered vectors and its correlation with the query vector. + +Imagine you have a filter on the price of the objects in an e-commerce dataset. We would expect that all else being equal, objects of similar prices would be more likely to be similar than those of vastly different prices. For example, consider an e-commerce site selling products with “ring” in the product name. Perhaps the site is, “Rings ‘r Us”. In this site’s vector index, diamond rings are likely to be closer in vector space as well as price, while novelty rings or even bike chain rings are likely to be in a different region in the search space. + +In other words, it is possible that your filter has correlation to your query. If you search for example for diamond rings with a high price filter, you might end up with a search result where most objects pass the filter. In this scenario, it will be a waste of performance to search for 100 objects in order to only select 10 in the filtering phase. + +In this high correlation situation the filter will pass a much larger portion of the results than 10%. Conversely, if we search for diamond rings also but with a very low price, chances are we will not obtain a result set where most objects will pass the filter. In this scenario, if we only fetch 100 objects in order to send 10 back, when we apply the filter we might end up without any objects at all. + +So in situations such as these, the algorithm designer could be faced with a choice, balancing the risk of insufficient results being found and achieving acceptable search performance. + +## Weaviate filtered search, pre-ACORN + +Up until the introduction of ACORN, Weaviate combined both solutions. As explained before, we use the `flatSearchCutOff` param to trigger switching between the two solutions. The post-filtering solution, however, is enhanced by filtering the result set inline while searching. + +This means that we explore the graph unfiltered but before we add candidates to the result set, we check whether each object passes the filter or not. In this way, we can dynamically identify the point where we need to stop our filtered search. We call this filter strategy `sweeping` and it is an effective approach, with some caveats. + +As mentioned before, traversing of the graph is performed without taking the filter into consideration. The drawback of this is that, especially with low correlation, it is possible to have situations where a significant percentage of objects do not pass the filter and so will never make it to the final result set. This causes unnecessary distance calculations which negatively impacts query performance. + +Can we just ignore those vectors for objects that will not pass the filter during the traversal of the graph? As it turns out - no, as we then risk disconnecting the graph, which breaks the connectivity needed for the HNSW search algorithm to greedily search through neighboring nodes. Disconnecting portions of the graph can dramatically reduce the result quality, as measured in recall. + +This is especially true when looking for cheap diamond rings with a very selective filter. Using a partly disconnected graph, it is possible that there is no path at all from the entry point in the graph for our query vector to the region of the search space where the results should be. + +As a result, the search performance (i.e. speed/throughput) can degrade even though HNSW is generally very fast. Given sufficiently large graphs, and restrictive enough filters with low correlation to the query vector, the search performance may start to be problematically slow. + +There exist some solutions that attempt to solve this problem. One example is the [Filtered DiskANN algorithm](https://harsha-simhadri.org/pubs/Filtered-DiskANN23.pdf). This solution aims to keep the graph connected for a predefined set of filters by adding some connections that would normally not exist in the graph. Although clever, it requires anticipating the filters and associated connections in advance, which may not even be possible sometimes. Imagine, again, the case where you have price involved. It would be impossible to anticipate all possible filters around it. + +Another alternative is [ACORN](https://arxiv.org/abs/2403.04871). We found ACORN much more appealing because it is filter-agnostic so doesn't require knowledge of what filters will be performed at index time. + +After learning about it, and [discussing](https://youtu.be/PxJ7FpbopKY) the topic with one of the authors of the paper, we decided this would be a good addition to Weaviate. We discuss the solution in detail next. + +## ACORN + +The original ACORN paper builds upon HNSW and provides two variants ACORN-1 and ACORN-γ. Our explanation will focus on ACORN-1 here which is the basis for Weaviate's implementation. + +The very first difference of ACORN from the normal HNSW algorithm is the elimination of normal triangle pruning. While the max connections parameter limits the graph size, ACORN avoids pruning to avoid disconnecting the graph for some filters. The graph requires compression given the different traversal approach, which we will cover after explaining the mechanism. + +The resulting graph is much larger without pruning. Once we filter our graph, however, to only consider connections where out-neighbors pass the filter criteria, the effective graph size will be manageable. + +The crucial difference is in how the neighborhood is expanded in ACORN to keep connectivity of the graph high. The main risk with filtering connections is that you could prune good paths as an intervening vector fails to pass the filter. As an example, consider the following: + +![An illustration of a graph vector index](./img/graph-example.png) + +Let's assume we are searching for the top two closest neighbors of the blue query vector in this graph. + +The green dots illustrate vectors whose objects pass the filter, and the gray those that do not. Ideally, the search algorithm could follow the graph from an entry point to the target region. Starting from the red entry point, the graph would traverse to the vector labeled A, then to the vector labeled B as the distances reduce in that direction. From here, the algorithm should be able to find vector E through C and F through D. The problem is that if C and D are disconnected and thus not evaluated, then the search algorithm cannot find E and F. On the other hand, if considering C and D means we need to calculate the distance between the query vector and those vectors, going back to the above challenge of high resource usage. + +So, how does ACORN solve this issue? It cleverly uses a two-hop based expansion of the neighborhood, evaluating nodes that are two hops away rather than one. This means that E and F become out-neighbors of B, as they are two hops away. This speeds up traversal of a graph as you can imagine, and help to ameliorate challenges of low correlation between the filter and the query vector. + +Now let’s discuss how this strategy enables compression. Notice that vector A now has out-neighbors B and C, but C is also an out-neighbor of B. As a result there is no need to explicitly add C to the out-neighbors of A, as the B to C connection can be used to find C from A. We compress the connections of A by removing C from the list of A’s out-neighbors and only keep it on B. + +ACORN is a fascinating algorithm. If you would like to read more about it, we encourage you to refer to the [original paper](https://arxiv.org/abs/2403.04871). Our implementation of ACORN involved a few customizations - let’s touch on that before we wrap up. + +## Weaviate implementation of ACORN + +The Weaviate implementation of ACORN differs from that of the paper in a few ways. + +The first important change is during building the graph. While it is true that a different pruning logic helps keep the graph connected, we decided not to modify the indexing from “vanilla” HNSW. + +We did this mainly to limit resource overhead from unpruned nodes, and found the impact to recall acceptable. This came with the added benefit that for existing users of Weaviate, ACORN can be enabled without any requirement to reindex existing data. + +The second important difference is how we explore the graph while querying. Weaviate's ACORN implementation conditionally evaluates whether to use the two-hop expansion. + +If the first hop passes the filter, then the algorithm traverses the graph normally since the second hop will be explored anyway as the search progresses. We only use the two-hop expansion if the connecting node does not pass the filter. This means that when there is not a uniform distribution of the filtered nodes in the graph, our algorithm will operate as a regular HNSW in areas where a dense amount of nodes pass the filter and as ACORN where a sparse amount of nodes pass the filter. + +The third difference is how we seed additional entry points at layer zero of the graph to better deal with the problem of queries having low correlation to the filter. + +The challenge is that if we land in a region of the search space where barely any nodes pass the filter, we need to expand the search in all directions away from the query until we reach a region with nodes passing the filter. + +To better understand this, imagine you are looking for diamond rings around a low price point. In normal HNSW, the entrypoint on the base layer is influenced by distance calculations on higher layers so generally the entrypoint will land near the vector for “diamond rings”, however in this location very few nodes may match the price filter. + +The search will eventually find some low priced jewelry, but it can require the algorithm to search through a huge number of objects in the graph. The outcome is that the search performance will suffer. We found seeding additional entry points that match the filter to be very effective in improving performance here. + +## Internal test results - ACORN vs pre-ACORN + +We next show some experiments using for filtered vector search and differing correlation between the filters and the queries. You can easily test ACORN with your own data in Weaviate by [switching the filtering strategy in the collection definition to sweeping or acorn](/developers/weaviate/manage-data/collections#set-vector-index-parameters). The [benchmark tool](https://github.com/weaviate/weaviate-benchmarking) has been updated to easily test your data with the flags `-–filter` to signal that we are doing a filtered test, pre-filtering disabled with `--flatSearchCutoff` set to zero, and `-–filterStrategy` which accepts acorn as a valid strategy to indicate that we want to activate the new logic during querying. + +### Low correlation between filters and queries + +Here, we built collections out of the [Cohere's BEIR embeddings](https://huggingface.co/datasets/Cohere/beir-embed-english-v3). We merged different BEIR datasets together and used the source of data as the filter. This allows for us to construct both high and low correlated queries if the query vector has a filter matching or not matching its original dataset. + +Firstly, let's show some test results where we sample from the NQ and MSMARCO datasets, use query vectors from NQ but filter for MSMARCO and vary the percentage from 20% to 50%. The selectivity rate is the percentage of objects that pass the filter. The higher the selectivity rate, the more objects pass the filter and the easier it is to find the target region in the search space. + +The `acorn` line represents the new ACORN implementation, while the `sweeping` line represents the original Weaviate implementation. The y-axis shows the throughput in queries per second (QPS), while the x-axis shows the search quality (recall). The search quality is controlled by setting the `ef` parameter in the vector index configuration. The higher the `ef`, the better the search quality, but the slower the search. + +If we take a look at these figures, a very interesting pattern emerges. The `sweeping` implementation performs quite well at high selectivity rates, but the performance begins to drop as the selectivity rate decreases. + +**50% selectivity** + +![ACORN vs SWEEPING, 50% selectivity](./img/beir-cohere-500k-filtered-dot-0.5-dark.png#gh-dark-mode-only) +![ACORN vs SWEEPING, 50% selectivity](./img/beir-cohere-500k-filtered-dot-0.5-light.png#gh-light-mode-only) + +**40% selectivity** + +![ACORN vs SWEEPING, 40% selectivity](./img/beir-cohere-500k-filtered-dot-0.4-dark.png#gh-dark-mode-only) +![ACORN vs SWEEPING, 40% selectivity](./img/beir-cohere-500k-filtered-dot-0.4-light.png#gh-light-mode-only) + +**30% selectivity** + +![ACORN vs SWEEPING, 30% selectivity](./img/beir-cohere-500k-filtered-dot-0.3-dark.png#gh-dark-mode-only) +![ACORN vs SWEEPING, 30% selectivity](./img/beir-cohere-500k-filtered-dot-0.3-light.png#gh-light-mode-only) + +**20% selectivity** + +![ACORN vs SWEEPING, 20% selectivity](./img/beir-cohere-500k-filtered-dot-0.2-dark.png#gh-dark-mode-only) +![ACORN vs SWEEPING, 20% selectivity](./img/beir-cohere-500k-filtered-dot-0.2-light.png#gh-light-mode-only) + +When we look at the differences between graphs of the 50% and 20% selectivity rates, we can see that the relative positions between the two implementations are somewhat reversed. At 50% selectivity, the `sweeping` implementation performs better than the `acorn` implementation. However, at 20% selectivity, the `acorn` implementation is much faster than the `sweeping` implementation. + +For low selectivity rates (at 20%), it is worth noting that the query throughput (QPS) of the `sweeping` implementation can be half the throughput of the `acorn` implementation at the same recall level. Here, we start to see benefits of the ACORN algorithm's ability to maintain graph connectivity and traverse the graph more efficiently. + +Next, let's look at the results when the correlation between filters and queries are very low. + +### Very low correlation between filters and queries + +This is where the ACORN implementation really shows its value. In this example, we increased the number of datasets and kept low correlated filtering. This means that queries would target different datasets and thus we should expect a low correlation between the filters and queries. The results are shown in the image below. + +![ACORN vs SWEEPING, low correlation](./img/beir-cohere-dot-filtered-negative-dark.png#gh-dark-mode-only) +![ACORN vs SWEEPING, low correlation](./img/beir-cohere-dot-filtered-negative-light.png#gh-light-mode-only) + +Under these settings, we can observe that Weaviate’s ACORN implementation significantly outperforms (an order of magnitude, in fact) the original sweeping algorithm. The difference here is such that the previous throughput (QPS) would have been a significant potential bottleneck, whereas our ACORN algorithm performs comparably to the previous scenario. The explanation for this disparity is that the old logic ends up performing nearly a brute force over the full graph while ACORN can find the target region much faster. + +You could imagine it makes little sense to have such a low correlation between filters and queries but in practice, this is actually not that unusual and just depends on the semantics of the filter. + +By preventing occurrences of such bottlenecks, Weaviate with the new ACORN search strategy is able to ensure that vector and hybrid search systems do not get bogged down when these “unusual” but sometimes quite common / real-world queries. + +### High correlation between filter and queries + +Finally let's show what happens with highly correlated queries using the same NQ and MSMARCO datasets as before. + +![ACORN vs SWEEPING, high correlation](./img/beir-cohere-500k-filtered-dot-correlated-0.2-dark.png#gh-dark-mode-only) +![ACORN vs SWEEPING, high correlation](./img/beir-cohere-500k-filtered-dot-correlated-0.2-light.png#gh-light-mode-only) + +Here we see `sweeping` is still faster because due to the high correlation, the results from a filtered vs unfiltered vector search are very similar and the `sweeping` algorithm does very little extra calculations. + +To address these variations we are exploring a dynamic filter strategy. Currently as of Weaviate 1.27, the `acorn` filter strategy is opt-in and will automatically switch back to sweeping if it detects a high selectivity filter. We are looking further into dynamic selection of filtering strategy based on filter match rates while exploring the graph. + +## Conclusions + +Vector search with filtering is a common requirement in real-world applications, but achieving both high performance and accuracy can be challenging. This is especially so when filters and queries have low correlation. ACORN provides an elegant solution to this problem by maintaining graph connectivity through two-hop expansion, without requiring any special indexing or predefined filter configurations. + +ACORN presents a very interesting approach to improving filtered vector search on HNSW. Especially around low selectivity filters, the new search strategy is able to ensure that a vector/hybrid search system performs well regardless of the filter. + +Our implementation in Weaviate builds on ACORN's strengths while adding practical optimizations: + +- No re-indexing required - works with existing HNSW indexes +- Adaptive two-hop expansion that switches between HNSW and ACORN based on filter density +- Smart handling of entry points for better performance + +The results speak for themselves: up to 10x performance improvement in challenging scenarios where filters and queries have low correlation, while maintaining good performance in other cases. This makes filtered vector search more robust and predictable. + +Ready to try it out? ACORN is available in [Weaviate 1.27](/blog/weaviate-1-27-release/) and newer. Simply enable it in your collection configuration and start experimenting with your own datasets. We're excited to hear about your experiences and use cases! + +For more information on using ACORN in Weaviate, check out our [documentation](/developers/weaviate/), such as [how to enable ACORN](/developers/weaviate/manage-data/collections#set-vector-index-parameters), and [how to perform filtered searches](/developers/weaviate/search/filters). + +import WhatsNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2022-09-13-why-is-vector-search-so-fast/img/ann-annoy.png b/blog/2024-11-21-vector-search-explained/img/ann-annoy.png similarity index 100% rename from blog/2022-09-13-why-is-vector-search-so-fast/img/ann-annoy.png rename to blog/2024-11-21-vector-search-explained/img/ann-annoy.png diff --git a/blog/2022-09-13-why-is-vector-search-so-fast/img/ann-hnsw.png b/blog/2024-11-21-vector-search-explained/img/ann-hnsw.png similarity index 100% rename from blog/2022-09-13-why-is-vector-search-so-fast/img/ann-hnsw.png rename to blog/2024-11-21-vector-search-explained/img/ann-hnsw.png diff --git a/blog/2024-11-21-vector-search-explained/img/any2any_L.png b/blog/2024-11-21-vector-search-explained/img/any2any_L.png new file mode 100644 index 0000000000..2840bc0873 Binary files /dev/null and b/blog/2024-11-21-vector-search-explained/img/any2any_L.png differ diff --git a/blog/2024-11-21-vector-search-explained/img/hero.png b/blog/2024-11-21-vector-search-explained/img/hero.png new file mode 100644 index 0000000000..ee349c813a Binary files /dev/null and b/blog/2024-11-21-vector-search-explained/img/hero.png differ diff --git a/blog/2022-09-13-why-is-vector-search-so-fast/img/knn-boules.png b/blog/2024-11-21-vector-search-explained/img/knn-boules.png similarity index 100% rename from blog/2022-09-13-why-is-vector-search-so-fast/img/knn-boules.png rename to blog/2024-11-21-vector-search-explained/img/knn-boules.png diff --git a/blog/2022-09-13-why-is-vector-search-so-fast/img/knn-linear.png b/blog/2024-11-21-vector-search-explained/img/knn-linear.png similarity index 100% rename from blog/2022-09-13-why-is-vector-search-so-fast/img/knn-linear.png rename to blog/2024-11-21-vector-search-explained/img/knn-linear.png diff --git a/blog/2024-11-21-vector-search-explained/img/rag.png b/blog/2024-11-21-vector-search-explained/img/rag.png new file mode 100644 index 0000000000..fcf447b4a0 Binary files /dev/null and b/blog/2024-11-21-vector-search-explained/img/rag.png differ diff --git a/blog/2024-11-21-vector-search-explained/img/vector-search.png b/blog/2024-11-21-vector-search-explained/img/vector-search.png new file mode 100644 index 0000000000..9f2ab1ff54 Binary files /dev/null and b/blog/2024-11-21-vector-search-explained/img/vector-search.png differ diff --git a/blog/2024-11-21-vector-search-explained/index.mdx b/blog/2024-11-21-vector-search-explained/index.mdx new file mode 100644 index 0000000000..3f57916206 --- /dev/null +++ b/blog/2024-11-21-vector-search-explained/index.mdx @@ -0,0 +1,297 @@ +--- +title: Vector Search Explained +slug: vector-search-explained +authors: [victoria] +date: 2024-11-21 +tags: ['concepts'] +image: ./img/hero.png +description: "Learn about vector search, a technique that uses mathematical representations of data to find similar items in large data sets." +--- + +![Vector Search Explained](./img/hero.png) + +Vector search has fundamentally shifted how we approach information retrieval in modern development. It operates on numerical representations of data called vector embeddings, which capture the semantic meaning in a vector space. Vector search can identify related objects without requiring exact text matches, making it increasingly important for modern information retrieval systems, particularly in AI-native applications where traditional search systems fall short. + +## What is vector search? + +Vector search is a technique for finding and retrieving similar items in large datasets by comparing their vector representations, which are numerical encodings of their features. Unlike traditional search that relies on exact matches, vector search looks for similarity based on meaning or context. It's used in applications like image retrieval, recommendation systems, and search engines. + +## How does vector search work? + +Vector search works by converting data and queries into [vector embeddings](https://weaviate.io/blog/vector-embeddings-explained). Vector embeddings are generated by language models that learn to capture the meaning and context of data within numerical representations. + +![Vector Search](./img/vector-search.png) + +At the time of entry/import (or any significant changes to data objects), every data object, and the query, are converted into numerical vector representations using [embedding models](https://weaviate.io/blog/how-to-choose-an-embedding-model). Every data object in a dataset gets a vector, and this is compared to the query vector at search time. + +In a nutshell, vector embeddings are an array of numbers, which can be used as coordinates in a high-dimensional space. Although it is hard to imagine coordinates in more than 3-dimensional space (x, y, z), we can still use the vectors to compute the distance between vectors, which can be used to indicate similarity between objects. There are many different [distance metrics](https://weaviate.io/blog/distance-metrics-in-vector-search), like [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) and [Euclidean distance (L2 distance)](https://en.wikipedia.org/wiki/Euclidean_distance). + +Whenever we run a query (like: "What is the tallest building in Berlin?"), a vector search system will convert it to a "query" vector. The task of a vector database is to identify and retrieve a list of vectors that are closest to the vector of your query, using a distance metric and a search algorithm. + +This is a bit like a game of boules – where the small marker (jack) is the location of our query vector, and the balls (boules) are our data vectors – and we need to find the boules that are nearest to the marker. + +An example of a search algorithm is a [k-nearest neighbors (kNN) algorithm](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm), which returns the k nearest vectors, by calculating a similarity score for every data vector in the database to the query vector. In our boules example, with 6 boules, the kNN algorithm would measure the distance between the jack and each of the 6 boules on the ground. This would result in 6 separate calculations. + +kNN search in a game of Boules + +*[kNN search in a game of Boules.]* + +## How to implement Vector Search (from scratch) in Python + +We can implement a simple vector search solution from scratch with just a few lines of code in Python. + +Let’s start by installing the OpenAI python package to generate vector embeddings for our text, and numpy to do our similarity calculations. + +``` +pip install openai +pip install numpy +``` + +We can then import all our dependencies, set our \`OPENAI\_API\_KEY\`, and define our list of sentences. + +```py +from openai import OpenAI +from dotenv import load_dotenv +import os +import numpy as np + +load_dotenv() + +client = OpenAI( + api_key=os.getenv("OPENAI_API_KEY"), +) + +sentences = [ + "Best pizza places nearby.", + "Popular breakfast spots in New York.", + "Top-rated seafood restaurants in Miami.", + "Cheap hotels near the beach.", + "Recipes for quick pasta dishes.", +] +``` + +We can use OpenAI to generate vector embeddings for every sentence, and store these in a new dictionary. + +```py +def get_embedding(text, model="text-embedding-3-small"): + embedding = client.embeddings.create(input=[text], model=model).data[0].embedding + return embedding + +sentence_vectors = {} +for sentence in sentences: + embedding = get_embedding(sentence) + sentence_vectors[sentence] = embedding + +``` + +To calculate the similarity score between the query and each sentence, we can use [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) scoring method. + +```py +def calculate_cosine_similarity(query_vector, vector): + return np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector)) +``` + +Finally, this function will take our query, convert it to a vector, and calculate the similarity score between every query vector and document vector. Then, it will order the results based on relevance, and return the top two scored sentences. + +```py +def get_top_n_similar(query_sentence, n=2): + query_embedding = get_embedding(query_sentence) + + similarities = {sentence: calculate_cosine_similarity(query_embedding, sentence_vectors[sentence]) for sentence in sentences} + + sorted_similarities = dict(sorted(similarities.items(), key=lambda x: x[1], reverse=True)) + top_matches = list(sorted_similarities.items())[:n] + + for sentence, score in top_matches: + print(f"Similarity: {score:.4f} - {sentence}") +``` + +You can see that even though the query and the first returned sentence don’t have all the words in common, it still scores as a high match because the *meaning* is very similar. + +```py +query_sentence = "Find the best pizza restaurant close to me." +get_top_n_similar(query_sentence, n=2) +``` + +``` +Similarity: 0.7056 - Best pizza places nearby. +Similarity: 0.3585 - Top-rated seafood restaurants in Miami. +``` + +Although this method is able to give us similar items based on text vectors, it’s pretty inefficient. Manually computing cosine similarity over every vector in a large dataset can become computationally expensive fast. Also, without an indexing mechanism, all the vectors are stored in their raw form, requiring high memory consumption and slowing down search speeds. And finally, just storing the vectors and text objects in a dictionary means we lack structured database features. + +To fix all these problems, we can use a vector database to store and search through our vectors. + +## Vector search in vector databases + +Vector search, also called semantic search, using a vector database is able to handle large amounts of [unstructured data](https://weaviate.io/learn/knowledgecards/unstructured-data-objects) (think paragraphs instead of spreadsheets) quickly and efficiently, and provides relevant results in search and recommendation systems based on semantic similarity rather than exact matches. This can allow you to do advanced search through millions of documents, for example, [a Wikipedia dataset with over 28 million paragraphs](https://huggingface.co/datasets/weaviate/wiki-sample). + +If we query for articles related to: "urban planning in Europe", the vector database (like [Weaviate](https://weaviate.io/developers/weaviate)) responds with a series of articles about the topic, such as "The cities designed to be capitals". + +Finding the correct answer in a gigantic repository of unstructured data is not the most impressive part of [vector databases](https://weaviate.io/blog/what-is-a-vector-database) (I mean, it is very impressive), but it is the 🚀 speed at which it all happens. To find the most relevant answer to our semantic search query, it only takes milliseconds in a dataset containing 28 million paragraphs. This is super important when dealing with massive amounts of data, like in recommendation engines or large document datasets. + +The inevitable question that follows up this explanation is always: Why is this so incredibly fast? + +### Approximate nearest neighbors (ANN) + +Instead of comparing vectors one by one, most vector databases use [Approximate Nearest Neighbor (ANN) algorithms](https://weaviate.io/learn/knowledgecards/ann-approximate-nearest-neighbor), which trade off a bit of accuracy (hence the A in the name) for a huge gain in speed. + +ANN algorithms may not return the true k nearest vectors, but they are very efficient. ANN algorithms maintain good performance (sublinear time, e.g. (poly)logarithmic complexity) on very large-scale datasets. + +kNN - O(n) complexity + +*[O(n) and O(log n) complexity]* + +Note that most vector databases allow you to configure how your ANN algorithm should behave. This lets you find the right balance between the recall tradeoff (the fraction of results that are the true top-k nearest neighbors), latency, throughput (queries per second) and import time. + +### Examples of ANN algorithms + +Examples of ANN methods are: + +* trees – e.g. [ANNOY](https://github.com/spotify/annoy) (Figure 3), +* proximity graphs \- e.g. [HNSW](https://arxiv.org/abs/1603.09320) (Figure 4), +* clustering \- e.g. [FAISS](https://github.com/facebookresearch/faiss), +* hashing \- e.g. [LSH](https://en.wikipedia.org/wiki/Locality-sensitive_hashing) + +![ANNOY](./img/ann-annoy.png)
+*[Tree-based ANN search]* + +Which algorithm works best depends on your project. Performance can be measured in terms of latency, throughput (queries per second), build time, and accuracy (recall). These four components often have a tradeoff, so it depends on the use case which method works best. +So, while ANN is not some magic method that will always find the true k nearest neighbors in a dataset, it can find a pretty good approximation of the true k neighbors. And it can do this in a fraction of the time! + +### HNSW in Weaviate + +[Weaviate](https://weaviate.io/developers/weaviate) is a great example of a vector database that uses ANN algorithms to offer ultra-fast queries. The ANN algorithm that Weaviate uses is a custom implementation of [Hierarchical Navigable Small World graphs (HNSW)](https://weaviate.io/developers/weaviate/concepts/vector-index#hnsw). + +HNSW + +*[HNSW - Proximity graph-based ANN search]* + +HNSW works by organizing vectors into a hierarchical, multi-layered graph structure, which allows for fast navigation through the dataset during search. The structure of HNSW balances longer distances for faster search in upper layers and shorter distances for accurate search in lower layers. + +In Weaviate's implementation, HNSW is enhanced to support full [CRUD operations](https://weaviate.io/blog/crud-support-in-weaviate) and allows for real-time querying, updates, and deletions, with features like incremental disk writes for crash recovery and [asynchronous cleanup processes](https://github.com/nmslib/hnswlib/issues/4#issuecomment-678315156) for maintaining index freshness. + +Check out [Weaviate ANN benchmarks](https://weaviate.io/developers/weaviate/benchmarks/ann) to see how HNSW performed on realistic large-scale datasets. You can use it to compare the tradeoffs between recall, QPS, latency, and import time. + +You will find it interesting to see that Weaviate can maintain very high recall rates (\>95%), whilst keeping high throughput and low latency (both in milliseconds). That is exactly what you need for fast, but reliable vector search\! + +If you’re interested in benchmarking for your own dataset, [check out this webinar](https://events.weaviate.io/benchmarking-webinar). + +### ANN vs. KNN + +kNN, or [k-nearest neighbors (kNN) algorithm](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm), differs from ANN because it calculates a similarity score for *every data vector* in the database compared to the query vector, much like our vector search from scratch example above + +Comparing a query vector with 10, 100, or 1000 data vectors in just two dimensions is an easy job. But of course, in the real world, we are more likely to deal with millions (like in the Wikipedia dataset) or even billions of data items. In addition, the number of dimensions that most embedding models use in semantic search goes up to hundreds or thousands of dimensions\! + +The *brute force* of a kNN search is computationally very expensive \- and depending on the size of your database, a single query could take anything from several seconds to even hours (yikes 😅). If you compare a vector with 300 dimensions with 10M vectors, the search system would need to do 300 x 10M = 3B computations\! The number of required calculations increases linearly with the number of data points (O(n)). + +In summary, kNN search doesn't scale well, and it is hard to imagine using it with a large dataset in production. + +## Types of vector search + +Vector search is not just limited to text, or even text in a single language. Anything can be converted into a vector with the right embedding model, whether it’s images, audio, video, or multi-lingual documents. This means we can develop multi-modal or multi-lingual semantic search systems that can handle a variety of data formats, languages, or search types. + +### Image Vector Search + +[Image vector search](https://weaviate.io/developers/weaviate/search/image) converts images into vector representations to enable similarity searches between images. The vector embeddings encode features like colors, shapes, and textures so that you can search for images based on visual similarity rather than metadata alone. This type of search is frequently used in fields like e-commerce for finding visually similar products, or in content moderation. + +### Audio Vector Search + +Audio vector search transforms audio files into vectors to power similarity search based on sound characteristics, such as tone, rhythm, or melody. This is used in applications like music discovery platforms, sound effect libraries, and voice recognition systems. + +### Video Vector Search + +Video vector search converts videos into vector embeddings through methods like sampling frames or analyzing scene features for search based on visual and sometimes audio similarity. This method is popular in applications like content libraries, surveillance, and media databases. + +### Multimodal Vector Search + +![multimodal vector search](./img/any2any_L.png) + +[Multimodal vector search](https://weaviate.io/developers/academy/py/starter_multimodal_data/mm_searches/multimodal) combines different data types—like text, images, and audio—in the same vector space for cross-type comparisons. For example, you could find images or audio most similar to a text query, like retrieving images of a lion or a lion’s roar based on a description alone. This can be used in applications to search across various media formats, like e-commerce, digital asset management, and social media platforms. + +### Multilingual Vector Search + +Multilingual vector search can compare text across languages by embedding it into the same vector space. For instance, a query in English could retrieve documents, captions, or content in other languages, such as French or Chinese, describing similar concepts. These cross-lingual searches can power applications like global e-commerce, multilingual customer support, and international content discovery. + +### Hybrid Search + +[Hybrid search](https://weaviate.io/blog/hybrid-search-explained) combines multiple search types, usually vector search and keyword search, in a single system. By combining traditional keyword search with semantic search, we get the best of both worlds: semantic context \+ specific keywords. Semantic search works great for understanding the general meaning of the documents and query, but it doesn’t prioritize exact matches such as names, industry-specific jargon, or rare words, which can be helpful in many types of applications. But without semantic search (only keyword), the results can miss relevant semantic information and context about the desired topic. Combining these two methods can improve both the accuracy and relevance of search results. + +## Benefits of vector search + +[Traditional keyword-based search systems](https://weaviate.io/learn/knowledgecards/keyword-search) can only match *exact terms or phrases*, or key words, in text. In contrast, vector search returns similar items based on their underlying context or meaning, and works with a variety of data types, including text, images, audio or video. For example, a search for "healthy snacks" might return semantically related terms like "nutritious food" or "low-calorie treats", or in the case of a [multimodal system](https://weaviate.io/learn/knowledgecards/multimodal-embeddings-models), pictures of granola bars or fruit. + +This is why vector search is often also called semantic search. It enables a more “human-like” search experience, allowing users to find related objects without needing to have the exact right words in their query. + +## Vector search use cases + +Vector search can power a variety of different applications and use cases, from advanced search systems, to recommendation systems, to chatbots. + +### Search Systems + +Vector search can be applied to a wide range of different search systems, from billion-scale e-commerce applications to multi-modal and multi-lingual search apps to internal document search in large enterprises. For example, in e-commerce, semantic search can recommend products based on customer intent, even if they don't have the exact keywords in their search query. With the right embedding model selection, you could create [multilingual](https://weaviate.io/blog/weaviate-non-english-languages), like [WeaLingo](https://weaviate.io/blog/wealingo-demo), or [multimodal](https://weaviate.io/developers/academy/py/starter_multimodal_data/mm_searches/multimodal) search apps out of the box. Vector search can also speed up result time for use cases like enterprise search, because the ANN algorithms allow for such fast retrieval speeds over large numbers of unstructured documents. + +### Recommendation Systems + +Vector search can be used in [recommendation systems](https://weaviate.io/workbench/recommender) to recommend similar products, movies, or content based on user preferences by finding items with similar vector representations, even without shared metadata or tags. This is widely used in social media apps, news sites, or e-commerce stores. + +### Retrieval Augmented Generation (RAG) + +[Retrieval Augmented Generation](https://weaviate.io/blog/introduction-to-rag), or RAG, is a popular use case of vector search used in applications like chatbots or question-answering systems. RAG is just vector search with an extra added step \- the similar results returned by the vector database are given to a large language model (LLM) to generate a contextually relevant response to the user’s query. RAG helps minimize model hallucinations, increase accuracy of responses, and allows generative models to access specialized knowledge to answer complex, data-driven queries. + +Semantic search is great for RAG applications because of its speed and ability to search for documents based on meaning, rather than exact matches. + +![RAG](./img/rag.png) + +## Vector search solutions + +There are a few different ways to enable vector search in applications: + +[**Vector indexing libraries**](https://weaviate.io/blog/vector-library-vs-vector-database#vector-libraries) such as [FAISS](https://github.com/facebookresearch/faiss), [Annoy](https://github.com/spotify/annoy), and [ScaNN](https://github.com/google-research/google-research/tree/master/scann), are optimized for in-memory similarity searches and only store vectors, not the data objects they originate from. Their indexes are generally immutable, meaning they can’t be updated dynamically without rebuilding. Additionally, vector libraries often require all data to be imported before querying, which can limit their flexibility in dynamic or constantly updating environments. These libraries are good for applications that involve static data and do not need full CRUD operations or persistence capabilities. + +**Vector-capable databases** extend traditional databases with vector search capabilities, allowing businesses to incorporate semantic search while leveraging existing database features. These solutions generally struggle with reliability and speed at scale. + +[**Vector databases**](https://weaviate.io/blog/what-is-a-vector-database) (such as Weaviate) offer a comprehensive solution to semantic search use cases, supporting vector indexing and also managing data persistence, scaling, and integration with the AI ecosystem. They have flexible solutions for a variety of use cases, from AI applications at scale to users who are just getting started. + +A **vector search engine** is often used interchangeably with a vector database, but they are technically different: a vector search engine focuses only on the retrieval layer, while a vector database includes additional features like storage, data management, and clustering. + +## Vector search FAQs + +### Semantic search vs Vector search + +In terms of formal definitions, vector search is just the process of arranging vector embeddings, or vectors, into a vector index to perform similarity searches, while semantic search builds on the basic definition of vector search to return more relevant results based on the meaning of text rather than exact terms. In practice, though, vector search and semantic search are often used interchangeably. + +### Vector search vs Keyword search + +Vector search finds similar items based on the semantic meaning of the data, while keyword search relies on exact word matches or phrase occurrences. Vector search can handle unstructured, multimodal data (like text, images or audio) and find related concepts, while keyword search is more suited for structured text data where exact phrasing is important. + +### How is vector search conducted at scale? + +Vector databases use Approximate Nearest Neighbor (ANN) algorithms to speed up search time for large datasets. With ANN algorithms, vector search can return similar items to the query within a few milliseconds, even out of billions of objects. + +## Summary + +A quick recap: +* Vector search, also called semantic search, can identify related objects without requiring exact text matches, allowing users to search based on semantic meaning rather than exact keywords. +* It uses machine learning models to generate vector embeddings for all data objects and the query, and doing math calculations to determine similarity. +* Vector embeddings capture the meaning and context of data. +* Vector databases offer super fast responses to queries thanks to ANN algorithms. +* ANN algorithms trade a small amount of accuracy for huge gains in speed. +* Different types of vector search include hybrid search or multimodal search for images, audio, or video. +* Use cases of vector search include Retrieval Augmented Generation (RAG), recommendation systems, or search systems. + +import WhatsNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-11-26-aws-partnership/img/hero.png b/blog/2024-11-26-aws-partnership/img/hero.png new file mode 100644 index 0000000000..7e19980a36 Binary files /dev/null and b/blog/2024-11-26-aws-partnership/img/hero.png differ diff --git a/blog/2024-11-26-aws-partnership/index.md b/blog/2024-11-26-aws-partnership/index.md new file mode 100644 index 0000000000..361c6cdef0 --- /dev/null +++ b/blog/2024-11-26-aws-partnership/index.md @@ -0,0 +1,67 @@ +--- +title: "Weaviate on AWS: Our Journey as an AWS GenAI Startup" +slug: aws-and-weaviate +authors: [jobi, tony] +date: 2024-11-26 +tags: ['partnerships'] +image: ./img/hero.png +description: "Learn about the partnership between AWS and Weaviate." +--- + +![AWS and Weaviate](./img/hero.png) + +With AWS [re:Invent 2024 approaching](https://reinvent.awsevents.com/), we would like to reflect on our remarkable journey with Amazon Web Services (AWS) and share how our partnership has evolved over the past eighteen months. What began as initial integration discussions has developed into a comprehensive collaboration that continues to provide value to our customers. + +From day one, we recognized that cloud hyperscalers would be critical to our go-to-market strategy. We strategically bet on AWS, seeing strong alignment in target market segments. While we compete with first-party cloud offerings like many ISVs, we've found that this healthy competition **drives innovation** and ultimately **benefits** and **gives choices to our customers**. Customers choose what is best for them, and this is a value that both the companies align on for the [ultimate customer centricity](https://aws.amazon.com/executive-insights/content/the-imperatives-of-customer-centric-innovation/). + +## Embracing the Co-build, Co-market, Co-sell model + +Establishing our partnerships on a solid foundation required us to invest upfront in key differentiators. We focused on taking the time to build these elements before scaling our go-to-market strategy. We aimed to invest wisely, create **strong differentiators**, and ensure our selling motions aligned with internal and external stakeholders. With this solid foundation, we are now fostering a win-win partnership and delighting our joint customers. + +## Building on Solid Ground + +The Weaviate core database runs natively on Amazon Elastic Kubernetes Service (EKS), providing enterprise-grade scalability and deployment flexibility. By leveraging Kubernetes, we can cater to our customers' needs, whether they require a serverless, multi-tenant solution managed by us or an enterprise-grade, single-tenant option. In the latter case, customers can use our managed services or deploy the same software directly from their environment, receiving enterprise support from Weaviate. + +We have expanded our technical integration portfolio to include native support for both Amazon SageMaker, aimed at data engineers building applications from the ground up, and Amazon Bedrock, which caters to data scientists who prefer a straightforward, no-fuss approach to deploying generative AI applications with their chosen foundation models. This expansion continues our commitment to supporting all user personas we target. + +Most of the Generative AI buzz is over GPUs and model training, but many production applications run fine on commodity hardware. With cost performance becoming a bigger and bigger issue for production-scale deployments, we are seeing a trend toward AWS Graviton-based deployments. Today, a handful of customers happily run their Knowledge Bases and Q&A apps running fully on gravitation SKUs. + +## Co-Marketing Success + +We have focused on telling a compelling "better together" story with AWS from the beginning. Our account and partner marketing teams at AWS have provided exceptional support for early-stage startups like ours. Additionally, with the executive sponsorship at the AWS leadership level, we receive the necessary support to grow our early go-to-market strategy. So far, our co-marketing efforts have produced impressive results over the past year: + +* Conducted four successful joint roadshows in San Francisco, Chicago, Seattle, and London. +* Secured over 20+ customer wins with Morningstar, Instabase, Cisco, Bunq, and others +* Established joint marketing campaigns, case studies, and webinars, generating significant results. +* Utilized Marketing Development Funds (MDF) effectively, with a strategic focus on AWS MDF funds. +* Implemented digital marketing initiatives, including co-branded content creation. +* Developed success stories, case studies, and solution briefs. +* Participated at re:Invent 2023 and in the partner showcase events like spotlight. + +We have also achieved significant program milestones, such as AWS Generative AI Competency certification, and we are a top-tier participant in the ISV Accelerate program. This success could not have happened without the contributions from teams throughout Weaviate, especially the outstanding work of our partner marketing team. + +## Meeting Customers where they are + +We have focused on close collaboration with AWS sellers from the beginning, opening up new joint opportunities. Tapping into cloud commitment drawdown through private offers has been a significant accelerator. + +Understanding that customers have varying needs and preferences, whether in deployment or procurement, we've structured our offerings to provide maximum flexibility. Whether through marketplace purchases, cloud commitment drawdowns, or direct engagement, we're committed to making Weaviate accessible through their preferred channels. Cloud marketplaces are essential to our customer journey. Whether customers are trying out SaaS serverless listings or testing Weaviate through its AWS Kubernetes marketplace listing, these marketplaces play a crucial role. + +## Join us at re:Invent + +As we prepare for AWS re:Invent in Las Vegas from December 2nd to December 5th, we can't wait to talk to you in person and hear about your generative AI journeys. We invite you to [visit us at re:invent](https://events.weaviate.io/aws-reinvent-2024) to learn more about how Weaviate and AWS work together to deliver the next generation AI-native stack. + +We'll demonstrate our latest integrations, share customer success stories, and provide insights into our roadmap for 2024. If you're attending re:Invent, we'd love to connect and discuss how Weaviate and AWS can help accelerate your AI initiatives. + +The past eighteen months have been transformative for our partnership with AWS, but we believe the best is yet to come. See you at re:Invent! + +What you can expect to see when you visit our booth, **#1506**: + +* A few demos showcasing hybrid search, Generative Feedback Loops (GFL), and Retrieval Augmented Generation (RAG) +* Our new Weaviate comic book \- “The Vector Vault” +* Limited edition stickers & hats +* Weaviate's friendly experts + +We'll share a few demos showing the power of Weaviate and our features. We're expanding [Wealingo](https://github.com/weaviate/wealingo-demo) to include features like multi-tenancy, Generative Feedback Loops (GFLs), and more. + +We will have daily prizes given to the lucky winners of our raffle. You can also book a meeting with us in our private meeting space to learn all about Weaviate, our integration with AWS, and more. [Book your slot today](https://calendly.com/events-weaviate/weaviate-aws-reinvent), space is limited. + diff --git a/blog/2024-12-03-weaviate-embeddings/img/hero.jpg b/blog/2024-12-03-weaviate-embeddings/img/hero.jpg new file mode 100644 index 0000000000..0aed51687c Binary files /dev/null and b/blog/2024-12-03-weaviate-embeddings/img/hero.jpg differ diff --git a/blog/2024-12-03-weaviate-embeddings/img/weaviate-embeddings.png b/blog/2024-12-03-weaviate-embeddings/img/weaviate-embeddings.png new file mode 100644 index 0000000000..d75eb4a216 Binary files /dev/null and b/blog/2024-12-03-weaviate-embeddings/img/weaviate-embeddings.png differ diff --git a/blog/2024-12-03-weaviate-embeddings/index.mdx b/blog/2024-12-03-weaviate-embeddings/index.mdx new file mode 100644 index 0000000000..09e70656ed --- /dev/null +++ b/blog/2024-12-03-weaviate-embeddings/index.mdx @@ -0,0 +1,53 @@ +--- +title: Introducing Weaviate Embeddings +slug: introducing-weaviate-embeddings +authors: [alvin, charles-pierse] +date: 2024-12-03 +tags: ['release'] +image: ./img/hero.jpg +description: "Say goodbye to the headaches of creating and managing vector embeddings." +--- + +![Weaviate Embeddings](./img/hero.jpg) + +If you’re building AI applications and have struggled with embedding provider rate limits, being locked in with a single provider or model, or the overhead of self-hosting models, you’re in good company. So many developers face unnecessary friction when it comes to creating and managing vector embeddings, a critical function of their AI pipelines. + +We’re excited to announce that [**Weaviate Embeddings**](/developers/wcs/embeddings), a new embedding service in Weaviate Cloud that makes creating vector embeddings as easy as possible for AI developers, is now available in preview. + +## The need for model flexibility + +The landscape of Gen AI and machine learning models is evolving at a crazy pace, with new models being released almost daily. From large language models (LLMs), to vertical-specific, multimodal, open-source, and commercial models—developers are faced with an overwhelming amount of options. When you’re locked in with a single provider, it’s difficult to swap models and try new ones. Open-source models are becoming increasingly popular, but the complexity of self-hosting is one many teams don’t have the time or inclination to do, they simply want to focus on building new application capabilities and creating new business outcomes. + +Weaviate has always prioritized model flexibility in our architecture, and we’ll continue to offer easy ways to integrate with external model providers via pre-built APIs. Weaviate Embeddings introduces the ability to run embedding models directly within Weaviate Cloud, without the need to connect to an external provider. + +In preview, Weaviate Embeddings offers Snowflake’s [Arctic-Embed](https://github.com/Snowflake-Labs/arctic-embed) open-source text embedding model which has scored impressively in industry benchmarks (although we’re fans of you running your own benchmarks). You can learn more about it [here](https://www.snowflake.com/engineering-blog/arctic-embed-m-v1-5-enterprise-retrieval/). We’ll soon add support for class-leading commercial multilingual and multimodal models. Users will be able to create vector embeddings for a variety of models, and compare the results and recall accuracy for their use case. This simplifies selecting the right model for the problem you are trying to solve. + +## Freedom from rate limits + +Most external embedding APIs impose strict rate limits or batch processing with lengthy turnaround times, which slows down your entire pipeline, or even worse creates unnecessary latency for the search experience you are building. One of our customers recently told us that they’ve had to rebuild their entire document syncing pipeline around the fact that they were constantly running into rate limits with their commercial provider. Other customers struggle with throughput, stability, cost, and recall quality using existing services. + +With Weaviate Embeddings, there are no artificial constraints. Our infrastructure is built to handle high-throughput use cases, efficiently processing large volumes of embeddings per second without compromising performance. Whether you’re importing billions of documents or performing real-time vector searches, Weaviate Embeddings scales with you, without slowing you down. Pricing is based on tokens consumed. + +![With Weaviate Embeddings, your data and embedding models run within the same service](./img/weaviate-embeddings.png) + + +## AI-ready data, with less friction + +Our goal is to give developers flexibility of choice, while providing levers to make building AI applications easier and more efficient. With Weaviate Embeddings, you get: + +* **Leading OSS and proprietary models:** Access cutting-edge open source and proprietary models. At preview, we will offer Snowflake Arctic-Embed (open-source) with commercial models coming early next year. +* **Co-located models and data:** Reduce latency and improve performance by hosting both your data and your models in Weaviate Cloud. +* **Cost efficient and GPU-powered:** Leverage GPU-powered inference and cost-efficient performance. Pay-as-you-go pricing based on tokens consumed means you only pay for what you use. You get full control, including the ability to optimize embedding dimensions based on your specific use case. +* **Secure, enterprise-ready deployment:** Weaviate is SOC2-certified, with security features like role-based access controls and strict data isolation. + +## A foundation for the future + +Weaviate Embeddings is the bedrock of our future hosted model offerings. Upcoming advancements and releases will include multimodal models, dedicated hosting, and fine-tuned, optimized models tailored to your collection—laying the groundwork for exceptional retrieval quality across any domain. And this is just the beginning—stay tuned for exciting updates in the months ahead! + +## Give it a try + +To learn more about Weaviate Embeddings, check out the [docs](https://weaviate.io/developers/wcs/embeddings), sign up for our [upcoming webinar](https://webinars.techstronglearning.com/simplify-building-ai-native-embedding-models-and-vector-databases), or request [preview access](https://events.weaviate.io/embeddings-preview) and we’ll get in touch. + +import WhatsNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-12-04-unbody-weaviate-2/img/hero.jpg b/blog/2024-12-04-unbody-weaviate-2/img/hero.jpg new file mode 100644 index 0000000000..5640f37fd3 Binary files /dev/null and b/blog/2024-12-04-unbody-weaviate-2/img/hero.jpg differ diff --git a/blog/2024-12-04-unbody-weaviate-2/index.mdx b/blog/2024-12-04-unbody-weaviate-2/index.mdx new file mode 100644 index 0000000000..5b15208a3d --- /dev/null +++ b/blog/2024-12-04-unbody-weaviate-2/index.mdx @@ -0,0 +1,182 @@ +--- +title: 'Unbody’s Approach to Expanding Weaviate’s Generative Capabilities' +slug: unbody-weaviate-extension +description: "Unbody has enhanced Weaviate's generative capabilities by developing a custom Generative API that addresses limitations such as static project configurations, limited RAG syntax, and text-only input restrictions." +authors: [hossein] +date: 2024-12-04 +tags: [] +image: ./img/hero.jpg +--- + +![AI-First Technology](./img/hero.jpg) + +Two years ago, we faced a critical question at [Unbody](https://unbody.io/): how could we build a development stack that was not just AI-enabled but truly AI-native? Like many developers, we started with familiar tools like MongoDB, but we quickly realized that traditional databases weren’t designed to handle the demands of AI-driven workflows. That’s when we turned to [Weaviate](https://weaviate.io/), an AI-native vector database. + +Unbody is an AI-native development stack designed to unify AI and product development into a single workflow. Weaviate fits perfectly into this vision, as [this blog post](/blog/unbody-weaviate) outlined. It became a core part of our stack, powering generative features and helping us deliver a flexible, AI-ready experience. + +Fast-forward to today: while Weaviate has been a strong foundation, we’ve encountered limitations in its generative capabilities as our needs evolved. Instead of moving away, we decided to expand it. By building a custom extension to its generative endpoint, we tailored it specifically for Unbody’s requirements. + +In this post, we’ll share how we extended Weaviate to create a more dynamic and adaptable generative API for our unique use case. + +## Challenge + +While Weaviate's [generative module (Retrieval Augmented Generation (RAG))](/developers/weaviate/configuration/modules#generative-model-integrations) initially met our user's needs, we encountered limitations as their requirements became more sophisticated. The [generative features](/developers/weaviate/search/generative) proved inflexible when dealing with evolving demands, especially for advanced scenarios. + +### 1. Static Configuration at Project Creation + +Weaviate's generative search module supported multiple generative providers, such as OpenAI, Cohere, PaLM, GPT4All, and others. However, at the project creation stage, users were required to lock in specific settings, including: + +- Model name +- Temperature +- Top-k, max tokens, and other related parameters + +While this setup worked well in the early stages, it presented significant challenges later. If a different generative provider or parameter was required, our users had to create a new project —a project in Unbody is an isolated data space— with the new settings. This meant deploying an entirely new Weaviate instance to accommodate the changes. This added friction when adapting to users' evolving needs and made the process inefficient. + +:::info +This [feature was enabled](https://github.com/weaviate/weaviate/pull/6112) in Weaviate [`v.1.27.1`](https://github.com/weaviate/weaviate/releases/tag/v1.27.1) +::: + +### 2. Limited Retrieval-Augmented Generation (RAG) Syntax + +Another major issue was the limited flexibility in Weaviate’s support for Retrieval-Augmented Generation (RAG). While simple prompts combined with data retrieval from the database worked in some cases, more complex interactions often required: + +- **Separation of System and User Prompts:** In scenarios where users interact with data, there’s often a need to distinctly separate the system’s instructions (system prompt) from the user’s input (user prompt). This becomes essential for use cases like chatbots or complex conversation flows. Without this, supporting advanced RAG functionalities or chat completions wasn’t feasible. +- **Simplistic Template Engine:** The built-in template engine was relatively basic. It allowed users to insert string-typed fields directly from the objects they were executing RAG on. However, many users required a more powerful templating system that could handle advanced scenarios like dynamic data injection, context creation, or flexible template structures. There was no built-in way to filter or transform data, which limited our ability to create custom structures needed for more sophisticated workflows. + +### 3. Text-Only Input Limitation + +A third challenge arose when it came to input types. The generative method within Weaviate only accepted textual content as input, regardless of the model being used. This posed a limitation for our users' projects where they needed to use images as input. Being restricted to text input limited our users’ ability to fully leverage the capabilities of multi-modal models, preventing them from building more interactive and media-rich applications. + +## Solution + +The challenges we faced with Weaviate’s built-in generative features led us to decouple the generative module from the database to achieve increased flexibility. + +To address these needs, we developed a **Generative API** and created a custom module that integrates Weaviate into this API. This solution provides us with greater flexibility and scalability. + +This solution provides the ability to dynamically select models and providers, ensuring that Unbody projects are no longer tied to the static configurations set during project creation. This flexibility allows developers to switch models or adjust parameters on the fly, without having to redeploy or set up new projects. + +Additionally, the new generative module overcomes the limitations of text-only inputs, now supporting image-based prompts as well. This opens up multi-modal capabilities, enabling richer interactions and media-driven applications. We also introduced a more sophisticated templating engine that allows for advanced data manipulation and transformation, providing custom context creation and more complex workflows. + +With these improvements, our solution now offers: + +**Dynamic Model and Parameters** + +Users can switch between models like GPT-4 or Cohere without the need for redeployment, ensuring adaptability for a range of generative tasks. Additionally, it's possible to customize generative requests further with various parameters such as max tokens and temperature. This ensures more control over the generated content. + +```graphql +{ + Get { + TextBlock { + _additional { + generate( + groupedResult: { + task: """ + prompt... + """ + properties: ["text"] + options: { + model: "gpt-4o", + maxTokens: 1024, + temperature: 0 + } + } + ) { + groupedResult + } + } + } + } +} +``` + +**Multi-Modal Input Support** + +The module allows image inputs alongside text, unlocking the potential of models like GPT-4 Vision for richer, interactive applications. + +```graphql +await unbody.get.imageBlock + .limit(2) + .generate.fromMany({ + messages: [ + { + content: 'Describe these images', + }, + { + type: 'image', + content: '$..url', + }, + ], + }) + .exec() +``` + +**Enhanced Chat Completions** + +The system supports conversation flows by distinguishing between system and user roles, making it ideal for building interactive chatbots and retrieval-augmented generation (RAG) scenarios. + +```tsx +await unbody.get.textBlock + .generate.fromMany({ + messages: [ + { + role: "system", + content: 'System prompt...', + }, + ...history, + { + role: "user", + content: "user prompt" + } + ], + }) + .exec() +``` + +**Advanced Data Transformation** + +Our Generative API integrates JQ, a powerful JSON processor, to enable sophisticated data transformation directly within API calls. This integration allows developers to dynamically filter, manipulate, and transform JSON data on-the-fly, eliminating the need for separate data processing steps. Using the `vars` option, query results can be transformed into JSON-serializable data and injected into message content, providing a streamlined workflow for complex data handling. + +```json +vars: [ + { + "formatter": "jq", + "name": "document", + "expression": "{ originalName, text }" + } +] + +await unbody.get.googleDoc + .generate.fromOne({ + messages: [ + { + content: "prompt... \n DOCUMENT: {document}", + } + ], + }) + .exec() +``` + +## What's Next + +As we continue to refine and expand our generative capabilities, we're focused on introducing several key features to enhance flexibility, performance, and functionality. Here's a glimpse of what's on our roadmap: + +### 1. Structured Output + +We plan to introduce structured output capabilities, allowing developers to enforce specific formats in model responses. By implementing output validation and schema support, we'll ensure that generated content follows predefined structures, making it seamless to integrate with existing systems and workflows. + +### 2. Support for Streaming + +To improve the responsiveness of our generative models, we are working on adding streaming support to both Unbody’s Generative API (REST) and the GraphQL API. This will enable users to receive partial outputs as they are generated, reducing latency and improving user experience, particularly for applications like real-time chat or large content generation tasks. + +### 3. Tool/Function Calling + +We’re exploring ways to integrate support for tool and function calling within the generative API. This feature would enable models to automatically trigger predefined functions or interact with external systems, enhancing their ability to handle complex workflows and dynamic tasks without manual intervention. + +### 4. Broader Model and Provider Support + +We plan to expand the range of supported providers and models, including fine-tuned models designed for specific tasks, such as coding. This will offer developers more options to tailor their generative models to specialized use cases, whether it’s code generation, legal document drafting, or other domain-specific applications. + + +import WhatNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-12-11-hybrid-search-ja/img/hero.png b/blog/2024-12-11-hybrid-search-ja/img/hero.png new file mode 100644 index 0000000000..10d80c5425 Binary files /dev/null and b/blog/2024-12-11-hybrid-search-ja/img/hero.png differ diff --git a/blog/2024-12-11-hybrid-search-ja/img/hybrid-search-results.jpg b/blog/2024-12-11-hybrid-search-ja/img/hybrid-search-results.jpg new file mode 100644 index 0000000000..b03b0fec8e Binary files /dev/null and b/blog/2024-12-11-hybrid-search-ja/img/hybrid-search-results.jpg differ diff --git a/blog/2024-12-11-hybrid-search-ja/img/hybrid-search.jpg b/blog/2024-12-11-hybrid-search-ja/img/hybrid-search.jpg new file mode 100644 index 0000000000..c5f6178f6a Binary files /dev/null and b/blog/2024-12-11-hybrid-search-ja/img/hybrid-search.jpg differ diff --git a/blog/2024-12-11-hybrid-search-ja/img/keyword-search-results.jpg b/blog/2024-12-11-hybrid-search-ja/img/keyword-search-results.jpg new file mode 100644 index 0000000000..3cd242f78c Binary files /dev/null and b/blog/2024-12-11-hybrid-search-ja/img/keyword-search-results.jpg differ diff --git a/blog/2024-12-11-hybrid-search-ja/index.mdx b/blog/2024-12-11-hybrid-search-ja/index.mdx new file mode 100644 index 0000000000..5652f63369 --- /dev/null +++ b/blog/2024-12-11-hybrid-search-ja/index.mdx @@ -0,0 +1,229 @@ +--- +title: 'ハイブリッド検索とは?' +slug: hybrid-search-ja +description: "ハイブリッド検索の説明とKAGOME_JAトークナイザーを使った実装" +authors: [leonie] +date: 2024-12-11 +tags: ['concepts'] +image: ./img/hero.png +--- + +![ハイブリッド検索](./img/hero.png) + +ハイブリッド検索は、複数の検索アルゴリズムを組み合わせることで、検索結果の精度や関連性を向上させる技術です。一般的に、ハイブリッド検索とはキーワード検索とベクトル検索を組み合わせた方法を指します。これら二つのアルゴリズムの強みを活用することで、ユーザーに効果的な検索体験を提供します。 + +Weaviate[ベクトルデータベース](/blog/what-is-a-vector-database)におけるハイブリッド検索では、スパースベクトルとデンスベクトルの両方が利用されます。 +スパースベクトルにはトークナイザーが必要ですが、Weaviate `v1.28` では日本語テキスト向けに新しいトークナイザー`KAGOME_JA`が導入されました。 + +このブログ記事では、ハイブリッド検索の基本を学び、日本語テキストで`KAGOME_JA`トークナイザーを使ったWeaviateのハイブリッド検索の方法を解説します。 + +## ハイブリッド検索の説明 + +Weaviateのハイブリッド検索は、デンスベクトルとスパースベクトルを統合して、それぞれの検索手法の利点を活かします。 +これら二つのベクトルは異なるアルゴリズムによって計算されます。 + +![ハイブリッド検索](./img/hybrid-search.jpg) + +### キーワード検索 + +キーワード検索にはスパースベクトルを使用します。 +スパースベクトルは、主にゼロ値が多く一部に非ゼロ値を持つ構造をしており、デンスベクトルは主に非ゼロ値で構成されています。 +スパース埋め込みは、[BM25](https://en.wikipedia.org/wiki/Okapi_BM25) や [SPLADE](https://arxiv.org/abs/2107.05720) のようなアルゴリズムから生成されます。 +Weaviateにおける現在のハイブリッド検索実装では、BM25/BM25Fが使用されています。 + +スパース埋め込みを生成するためには、トークナイザーが必要です。 +Weaviateでは、日本語テキスト向けに以下の[3つのトークナイザーが利用可能](/developers/academy/py/tokenization/options)です。 + +| トークナイザー | `TRIGAM` | `GSE` | `KAGOME_JA`
(Weaviate `v1.28`で導入) | +| :---- | :---- | :---- | :---- | +| メリット | 辞書不要
部分一致する | 辞書にある単語をできるだけ
部分一致する | 辞書にある単語
不要な結果が出ない | +| デメリット | 不自然な単語がある
出てくる単語が多数 | 英単語は1文字ずつに分割
不自然な単語がある
辞書が必要 | 単語中の部分一致はしない
辞書が必要 +*Source: [Jun Ohtani](https://x.com/johtani)* + +### ベクトル検索 + +ベクトル検索にはデンスベクトルを使用します。 +デンス埋め込みは、[GloVe](https://text2vec.org/glove.html)や[Transformers](https://huggingface.co/docs/transformers/index)といった機械学習モデルから生成されます。これらのベクトルは情報が密に詰まっており、ほとんどが非ゼロ値で構成されています。ベクトルデータベースはこれらの埋め込みを保存し、二つのベクトル間の距離を計算します。この[距離メトリクス](/blog/distance-metrics-in-vector-search)により、二つのベクトル埋め込みがどれほど類似しているか、または異なるかがわかります。検索クエリもデータベクトルと同様にベクトルに変換され、その距離値によってベクトルの近さが決まります。 + +### 融合アルゴリズム + +キーワード検索とベクトル検索の結果を単一のランキングリストに統合する方法はいくつかあります。Weaviate `v1.20`以降では、以下の2つのアルゴリズムが利用可能です: + +* `rankedFusion` +* `relativeScoreFusion` + +これらの融合アルゴリズムについての詳細は、[こちらの記事](/blog/hybrid-search-fusion-algorithms#fusion-algorithms)で解説されています。 + +さらに、alphaパラメータを用いてキーワード検索とベクトル検索の結果の重み付けを調整できます: + +* `alpha = 0`:キーワード検索のみ +* `alpha = 1`:ベクトル検索のみ +* `alpha = 0.5`:スパースとデンスのベクトルを均等に重み付け + +## ハイブリット検索のメリット + +ハイブリッド検索は、ベクトル検索の機能を活用しつつ、正確なキーワード一致も必要とする検索システムに理想的です。 + +例えば、「春のドレス」というクエリを考えてみましょう。通常のキーワード検索やベクトル検索に比べて、ハイブリッド検索を使用する方がより良い結果を得られます。デンスベクトル表現では「春」が花柄や軽い素材を意味すると解釈され、キーワード検索では「ドレス」という単語に正確に一致します。 +このように、ハイブリッド検索はスパースベクトルとデンスベクトルの両方の利点を活かします。 + +一般的に、デンスベクトルはクエリの文脈を理解するのに優れており、スパースベクトルはキーワード一致に優れています。 + +## Weaviateのハイブリッド検索 実装 + +これで、ハイブリッド検索の概要と日本語テキストへの応用がわかるようになったと思います。`KAGOME_JA`トークナイザーを活用して、Weaviateでさらに効果的な検索を実現しましょう! + +```py +data = [ + ["スポーツ用レギンス", "吸湿速乾性に優れた素材で作られたレギンス。ジムやヨガ、ランニングに最適です。"], + ["点線模様の長靴", "雨の日のおしゃれにぴったりの長靴。ユニークな点線模様が特徴です。"], + ["トレンチコート", "クラシックなデザインのトレンチコート。春や秋の軽い羽織りに最適な一着です。"], + ["ひまわりの模様のドレス", "明るいひまわり柄が夏らしい印象のドレス。軽やかで涼しい素材が魅力です。"], + ["ライトカーディガン", "肌寒い日の重ね着に便利なライトカーディガン。軽量で持ち運びにも便利です。"], + ["フローラルミニスカート", "春や夏にぴったりの花柄ミニスカート。華やかなデザインで女性らしさを引き立てます。"], + ["ピンクのスカート", "柔らかなピンク色がかわいらしいスカート。シンプルなデザインでコーディネートしやすいです。"], + ["カシミアセーター", "高級感のあるカシミア素材で作られたセーター。寒い冬に暖かさとスタイルを提供します。"], + ["ライトウールスカーフ", "秋や冬にぴったりのウールスカーフ。軽量で肌触りが良く、暖かさをプラスします。"], + ["ニットドレス", "柔らかく暖かい素材で作られたニットドレス。寒い季節のカジュアルスタイルに最適です。"], + ["ミディプリーツスカート", "エレガントなシルエットが特徴のプリーツスカート。どんなトップスとも相性抜群です。"], + ["花柄の傘", "雨の日を明るくしてくれる花柄デザインの傘。軽量で使いやすい構造です。"], + ["長袖の紺色のドレス", "落ち着いた紺色がエレガントな長袖ドレス。フォーマルな場にも最適です。"], + ["春の花柄ドレス", "春の装いにぴったりの鮮やかな花柄ドレス。柔らかい素材で着心地も抜群です。"], + ["ボア付きデニムジャケット", "冬の寒さから守るボア付きデニムジャケット。カジュアルスタイルにぴったりです。"], + ["レザーアンクルブーツ", "シックで洗練されたデザインのレザーアンクルブーツ。秋冬の装いにおすすめです。"], + ["防水ジャケット", "雨の日の外出を快適にする防水ジャケット。軽量で動きやすいデザインが魅力です。"], + ["シンプルな黒のタートルネック", "どんなスタイルにも合わせやすい黒のタートルネック。秋冬の重ね着に最適です。"], + ["シフォンブラウス", "軽やかで女性らしいデザインのシフォンブラウス。春や夏のフォーマルな場にもおすすめです。"] +] +``` + +### 1. Weaviate データベース作成 + +日本語のKAGOMEトークナイザーを使用したハイブリッド検索をWeaviateで利用するには、Weaviate`v1.28`以降のバージョンを使用していることを確認する必要があります。以下の手順で、[Dockerを使用してWeaviateベクトルデータベースのインスタンスをローカル環境にセットアップ](/developers/weaviate/installation/docker-compose)できます: + +``` +docker run -p 8080:8080 -p 50051:50051 -e ENABLE_TOKENIZER_KAGOME_JA='true' -e ENABLE_MODULES='text2vec-cohere' cr.weaviate.io/semitechnologies/weaviate:1.28.1 +``` + +次は[Weaviate ClientのPythonライブラリ](/developers/weaviate/client-libraries)を準備します。バージョン4.9.6以上が必要です。 + +``` +!pip install weaviate-client +``` + +### 2. Weaviateの接続情報をセットアップ + +次に、Weaviate Clientを初期化します。Weaviateに接続するための設定では、Cohereの埋め込みモデルを使用するため、CohereのAPIキーが必要です。 + +```py +import weaviate, os + +# Connect to your local Weaviate instance deployed with Docker +client = weaviate.connect_to_local( + headers={ + "X-COHERE-Api-Key": os.environ["COHERE_API_KEY"] + } +) +``` + +### 3. データコレクションの定義 + +次に、クラスを作成して[Schema](developers/weaviate/config-refs/schema)を定義します。クラスは、オブジェクトを格納するデータコレクションです。クラスのSchemaには、Cohereの多言語(日本語対応)埋め込みモデル `embed-multilingual-v3.0` を定義します。また、`KAGOME_JA`トークナイザーを有効化します。 + +```py +import weaviate.classes.config as wc + +client.collections.create( + name="ClothingItems", + vectorizer_config=wc.Configure.Vectorizer.text2vec_cohere( + model="embed-multilingual-v3.0", ), + properties=[ + wc.Property(name="item", + data_type=wc.DataType.TEXT, + tokenization=wc.Tokenization.KAGOME_JA + ), + wc.Property(name="description", + data_type=wc.DataType.TEXT, + tokenization=wc.Tokenization.KAGOME_JA + ), + ] +) +``` + +### 4. データ登録 + +次に、WeaviateのClientを使用してデータを登録します。 + +```py +# Get a collection object for "ClothingItems" +clothes = client.collections.get("ClothingItems") + +with clothes.batch.dynamic() as batch: + for d in data: + batch.add_object({ + "item": d[0], + "description" : d[1], + }) +``` + +### 5. クエリ方法 + +これでベクトルデータベースのセットアップが完了し、クエリを実行できる状態になりました。 + +まずは、シンプルなBM25クエリから始めましょう。 + +```py +response = clothes.query.bm25( + query="ドレス", + limit=3 +) + +for item in response.objects: + print(f"{item.properties['item']}: {item.properties['description']}") +``` + +結果は以下の通りです。ご覧のとおり、検索結果には「ドレス」というキーワードに一致するアイテムのみが含まれています。 + +``` +長袖の紺色のドレス: 落ち着いた紺色がエレガントな長袖ドレス。フォーマルな場にも最適です。 +ニットドレス: 柔らかく暖かい素材で作られたニットドレス。寒い季節のカジュアルスタイルに最適です。 +ひまわりの模様のドレス: 明るいひまわり柄が夏らしい印象のドレス。軽やかで涼しい素材が魅力です。 +``` + +![keyword-search-results](./img/keyword-search-results.jpg) + +では、前の例で説明したハイブリッド検索クエリを試してみましょう。 + +```py +response = clothes.query.hybrid( + query="春のドレス", + alpha=0.8, + limit=3 +) + +for item in response.objects: + print(f"{item.properties['item']}: {item.properties['description']}") +``` + +結果は以下の通りです。ご覧のとおり、検索結果には「ドレス」というキーワードに一致するアイテムと、春に適した花柄のアイテムの両方が含まれています。最後のアイテムは「ドレス」というキーワードには一致していませんが、それでも花柄のスカートが含まれています。これは、alpha値を0.8に設定しており、キーワード検索よりもベクトル検索を優先しているためです。 + +``` +春の花柄ドレス: 春の装いにぴったりの鮮やかな花柄ドレス。柔らかい素材で着心地も抜群です。 +ひまわりの模様のドレス: 明るいひまわり柄が夏らしい印象のドレス。軽やかで涼しい素材が魅力です。 +フローラルミニスカート: 春や夏にぴったりの花柄ミニスカート。華やかなデザインで女性らしさを引き立てます。 +``` + +![hybrid-search-results](./img/hybrid-search-results.jpg) + + +## まとめ + +この記事では、ハイブリッド検索の概念について説明しました。Weaviateベクトルデータベースにおけるハイブリッド検索は、キーワード検索とベクトル検索を組み合わせたものです。これら二つの検索を統合することで、ベクトル検索の強力な機能を活用しながら、製品名やブランド名など特定のキーワードの正確な一致も必要とするユースケースで、より関連性の高い結果を得ることができます。 + +日本語テキストに対して、Weaviateではキーワード検索およびハイブリッド検索のために3つの異なるトークナイザーを選択できるようになりました。上記のKAGOME\_JAトークナイザーを使用したハイブリッド検索の例について、コードは[このノートブック](https://github.com/weaviate/recipes/blob/main/weaviate-features/hybrid-search/hybrid_search_cohere_japanese.ipynb)で確認できます。 + +ハイブリッド検索の詳細については、[ドキュメント](/developers/weaviate/api/graphql/search-operators#hybrid)をご覧ください! + +import WhatNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-12-12-weaviate-1-28-release/_core-1-28-include.mdx b/blog/2024-12-12-weaviate-1-28-release/_core-1-28-include.mdx new file mode 100644 index 0000000000..0e4ea82d48 --- /dev/null +++ b/blog/2024-12-12-weaviate-1-28-release/_core-1-28-include.mdx @@ -0,0 +1,147 @@ +Weaviate `1.28` brings enterprise-grade security, faster indexing, and improved multilingual support to your vector database. This release introduces role-based access control (RBAC), enhanced async indexing improvements, and native Japanese language support - making Weaviate more secure, faster, and globally accessible than ever. + +Here are the key highlights: + +Here are the release ⭐️*highlights*⭐️! + +![Weaviate 1.28](./img/hero.png) + +- [**Improved security 👤🔐: Role-based access control preview**](#role-based-access-control-rbac️) +- [**Speedier, more robust 🏎️ async vector indexing**](#async-indexing-improvements) +- [**Conflict resolution improvements 🤝 for deletions**](#conflict-resolution-improvements) +- [**New Japanese 🇯🇵 `kagome_ja` tokenizer for keyword/hybrid search**](#new-japanese-tokenizer) +- [**Groundwork for Keyword & Hybrid search 🔠 improvements: BlockMax WAND**](#blockmax-wand-experimental) +- [**Improvements since 1.27**](#other-improvements) + - [**Voyage AI Multimodal model support**](#voyage-ai-multimodal-model-support) + - [**Weaviate Embeddings**](#weaviate-embeddings) + +## Role-based access control (RBAC)️ + +Weaviate `1.28` introduces role-based access control (RBAC) as a technical preview, offering more granular control over user permissions. + +:::caution 🚧 Technical Preview +Role-based access control (RBAC) is added `v1.28` as a **technical preview**. This means that the feature is still under development and may change in future releases, including potential breaking changes. **We do not recommend using this feature in production environments at this time.** +
+ +We appreciate [your feedback](https://forum.weaviate.io/) on this feature. +::: + +This powerful new feature is another big step that is built for our power and enterprise users. It allows you to provide granular sets of permissions through built-in and custom roles to control access to your Weaviate instance. + +With RBAC, you can: + +- Assign built-in roles (`admin`, `viewer`) to users for common access patterns +- Create custom roles with fine-grained permissions for different resources +- Assign multiple roles to users +- Control access at various levels including collections, objects, backups, and cluster operations + +![Authorization flow as an image](./img/authz-diagram.png) + +For example, you could create roles like: + +A "data scientist" role with read-only access to specific collections +An "app service" role that can only write to certain collections +A "backup operator" role that can only manage backups +A "devops" role with access to view cluster and node metadata + +Permissions can be as specific as needed - from broad access to all collections down to operations on individual collections. The system is additive, meaning if a user has multiple roles, they'll gain the combined permissions of all their roles. + +To learn more, check out our [Authentication](/developers/weaviate/configuration/authentication) and [Authorization and RBAC](/developers/weaviate/configuration/authorization) documentation, along with the [Roles](/developers/weaviate/configuration/roles) guide. + +While RBAC is currently in technical preview (meaning there might be changes before the final release), we're excited to get feedback from the community on this important security feature. For production environments, we recommend continuing to use the existing authentication and authorization mechanisms for now. + +## Async indexing improvements + +We've enhanced our [asynchronous vector indexing](/developers/weaviate/concepts/vector-index#asynchronous-indexing) feature in `v1.28`, making it more robust and capable than ever. While async indexing (introduced in `v1.22`) already helped speed up batch imports by handling vector indexing in the background, we've now expanded its capabilities and rebuilt its foundations. + +The async indexing system now handles all operations related to the vector index, including: +- Single object imports +- Object deletions +- Object updates +- All batch operations (as before) + +This results in a unified system that is more robust, and also more performant. One reason is that it reduces lock contention, which can slow down indexing operations if multiple requests are trying to update the index at the same time. + +Another change is that we've replaced the previous in-memory queue with an on-disk queue system. This architectural change reduces memory usage. + +This feature is particularly valuable when you're working with large datasets. While the object store updates immediately, vector indexing happens in the background, allowing your requests to complete faster. + +Want to try it out? Just set `ASYNC_INDEXING=true` in your environment variables. Weaviate Cloud users can enable it with a single click in the Cloud Console. + +As you can see, we are still making improvements to the async indexing feature. This is still marked as **experimental**, so we'd love to hear your feedback on how it's working for you. + +## Conflict resolution improvements + +When running Weaviate across multiple replicas, it's crucial to maintain [consistency](/developers/weaviate/concepts/replication-architecture/consistency) across the cluster. One common challenge is how to handle conflicts when objects are deleted, as a deleted object might be mistaken for an object that is yet to be created. + +`v1.28` introduces three deletion resolution strategies that you can choose from based on your needs: + +- `DeleteOnConflict`: The most conservative option that ensures deletions are always honored. Once an object is marked for deletion, it stays deleted across all replicas. +- `TimeBasedResolution`: A timestamp-based approach where the most recent operation wins. For example, if an object is deleted and then recreated later, the recreation takes precedence. But if the deletion happened after the recreation attempt, the object stays deleted. +- `NoAutomatedResolution`: The classic approach (and default setting) for those who prefer manual control over conflict resolution. + +These strategies work seamlessly with Weaviate's existing replication and repair features to ensure your data stays consistent across your cluster, while giving you control over how deletion conflicts should be handled. + +This improvement is particularly valuable for production deployments where data consistency is critical and manual intervention should be minimized. + +To use this feature, [set the deletion strategy at the collection level under replication settings](/developers/weaviate/manage-data/collections#replication-settings). + +### New Japanese tokenizer + +We 🫶 our community, and seeing Weaviate usage grow around the world. So we are very excited to show off this feature that expands our existing set of keyword tokenizers for Japanese text. Especially so as it was contributed to us by [Jun Ohtani](https://github.com/johtani), a Weaviate community user! + +This feature adds a new Japanese tokenizer, `kagome_ja`, to Weaviate's keyword and hybrid search capabilities. This tokenizer uses the [Kagome](https://github.com/ikawaha/kagome) library, a morphological analyzer for Japanese text, to break down Japanese text into individual tokens for indexing and searching. + +To use this tokenizer, set the `ENABLE_TOKENIZER_KAGOME_JA` [environment variable](/developers/weaviate/config-refs/env-vars) to `true`, and set the [tokenization method](/developers/weaviate/config-refs/schema#kagome_ja-tokenization-method) for the relevant properties to `kagome_ja`. + +## BlockMax WAND (Experimental) + +:::caution 🚧 Experimental Feature +This iteration of BlockMax WAND is not for production use. +
+ +Currently, this feature must be enabled before ingesting any data, as it requires a different form of an inverted index. For this experimental version, we do not support migrations. The disk format may change in future releases, which will require a re-index, meaning a potential re-ingestion of data. +::: + +BM25 searches form the foundation of Weaviate's keyword and hybrid search capabilities, so we're always looking for further improvements. + +`v1.28` lays the groundwork for this by introducing an experimental implementation for the [BlockMax WAND](http://engineering.nyu.edu/~suel/papers/bmw.pdf) algorithm. This highly experimental feature aims to speed up BM25 and hybrid searches by more efficiently evaluating search results, using "blocks" of documents to reduce the number of calculations needed. + +While this feature isn't ready for production use, we're including it in 1.28 for those interested in testing and providing feedback. You can try it out by enabling two environment variables: + +- `USE_INVERTED_SEARCHABLE: true`: Enables an experimental disk format optimized for BlockMax WAND +- `USE_BLOCKMAX_WAND: true`: Activates the BlockMax WAND algorithm for queries + +We're excited about the potential performance improvements this could bring to keyword and hybrid search in future releases. + +## Other improvements + +### Voyage AI Multimodal model support + +![Voyage AI embeddings integration schematic](../../developers/weaviate/model-providers/_includes/integration_voyageai_embedding.png) + +Weaviate recently added support for [Voyage AI's Multimodal model](https://blog.voyageai.com/2024/11/12/voyage-multimodal-3/), a powerful model that combines text and image embeddings for multimodal search. + +This model integration was added to Weaviate recently, with `v1.27.8`, `v1.26.12` and `v1.25.28`. You can now use the [Voyage AI model integration](/developers/weaviate/model-providers/voyageai) to build AI-driven applications that can search for objects based on both text and image data. + +Note: Client support and official documentation will follow very soon + +### Weaviate Embeddings + +![Weaviate Embeddings](https://weaviate.io/img/site/weaviate-embedding-image.svg) + +In case you missed it, we recently introduced a new service called [Weaviate Embeddings](/developers/wcs/embeddings). This service provides secure, scalable embedding generation as a fully managed service, tightly integrated with Weaviate Cloud instances. + +This allows you to generate text embeddings using single authentication, and benefits of unified billing with your Weaviate Cloud account. Read more about it in our [announcement blog post](/blog/introducing-weaviate-embeddings). + +## Summary + +Ready to Get Started? + +Enjoy the new features and improvements in Weaviate `1.28`. The release is available open-source as always [on GitHub](https://github.com/weaviate/weaviate/releases/tag/v1.28.0), and will be available for new Sandboxes on [Weaviate Cloud](https://console.weaviate.cloud/) very shortly. + +For those of you upgrading a self-hosted version, please check the [migration guide](/developers/weaviate/more-resources/migration#general-upgrade-instructions) for detailed instructions. + +It will be available for Serverless clusters on Weaviate Cloud soon as well. + +Thanks for reading, see you next time 👋! diff --git a/blog/2024-12-12-weaviate-1-28-release/img/authz-diagram.png b/blog/2024-12-12-weaviate-1-28-release/img/authz-diagram.png new file mode 100644 index 0000000000..234db9b706 Binary files /dev/null and b/blog/2024-12-12-weaviate-1-28-release/img/authz-diagram.png differ diff --git a/blog/2024-12-12-weaviate-1-28-release/img/hero.png b/blog/2024-12-12-weaviate-1-28-release/img/hero.png new file mode 100644 index 0000000000..f10d7efcb1 Binary files /dev/null and b/blog/2024-12-12-weaviate-1-28-release/img/hero.png differ diff --git a/blog/2024-12-12-weaviate-1-28-release/index.mdx b/blog/2024-12-12-weaviate-1-28-release/index.mdx new file mode 100644 index 0000000000..c5cc7eb79c --- /dev/null +++ b/blog/2024-12-12-weaviate-1-28-release/index.mdx @@ -0,0 +1,18 @@ +--- +title: Weaviate 1.28 Release +slug: weaviate-1-28-release +authors: [jp] +date: 2024-12-12 +image: ./img/hero.png +tags: ['release', 'engineering'] +description: "Read about a preview of role-based access control, improved indexing, Weaviate Embeddings, new Voyage Multimodal model and a Japanese BM25 tokenizer!" + +--- + +import Core128 from './_core-1-28-include.mdx'; + + + +import WhatsNext from '/_includes/what-next.mdx' + + diff --git a/blog/2024-12-17-hardening-oss/img/harden.jpg b/blog/2024-12-17-hardening-oss/img/harden.jpg new file mode 100644 index 0000000000..92b8bfa079 Binary files /dev/null and b/blog/2024-12-17-hardening-oss/img/harden.jpg differ diff --git a/blog/2024-12-17-hardening-oss/index.mdx b/blog/2024-12-17-hardening-oss/index.mdx new file mode 100644 index 0000000000..90435f6e33 --- /dev/null +++ b/blog/2024-12-17-hardening-oss/index.mdx @@ -0,0 +1,41 @@ +--- +title: 'Hardening your Weaviate OSS Installation' +slug: hardening-oss +description: "Moving your Weaviate OSS instance into production? Check out our handy guide to securing your Weaviate database in the cloud, including all the helpful modules we’ve added to make it as easy as possible to keep your vectors safe." +authors: [spiros] +date: 2024-12-17 +tags: [how-to] +image: ./img/harden.jpg +--- + +![Secure Weaviate](./img/harden.jpg) + +At Weaviate, we take the protection of your data seriously. Our information security measures continuously evolve and adapt to threats we see out there in the wilds of the internet. +An area we are seeing more and more within our community is successful Weaviate projects that have been put into production using our [Open Source product](https://github.com/weaviate/weaviate). With Weaviate Open Source you’re in control of your data, the Weaviate environment and the infrastructure it’s hosted on. In fact, we’ve built Weaviate with a range of [modules](/developers/weaviate/configuration/modules) that can make your transition from hackathon to startup to customer-ready easy and safe. +Managing a Weaviate installation as part of a wider application at scale can be challenging and will introduce risks that are not faced by small projects or experiments. That’s why today we’re launching our [OSS Hardening Guide.](/img/site/Security-Checklist.pdf) This document contains hints and tips to use the built-in tools that are part of Weaviate and its hosting infrastructure in order to maximise the confidentiality, integrity and availability of your installation. + +## Risk-based thinking +Not every Weaviate installation needs the same security investment as ‘Fort Knox’ but it is difficult to know how much security is appropriate when deploying in production. +Behind the scenes in the Weaviate security team, we strongly believe that the best security and investment decisions are reached through risk-based thinking. The first step to hardening your Weaviate OSS installation should be to consider the risks that you face; is the data that you’ll be storing sensitive in any way? are you subject to any industry or national regulation? what about your end users - will they expect a certain level of security? +Once you have determined your risks, it’s time to see what mitigations you can implement in order to manage them. Head to our OSS Hardening Guide to understand what is available within Weaviate. While measures such as [Role-based Access Control](/developers/weaviate/configuration/authorization), automatic [Backup](/developers/weaviate/configuration/backups) capability and [Replication](/developers/weaviate/configuration/replication) can help you design a set of easy-to-implement controls to manage access and availability, you will also want to consider encryption both for data in transit and in storage. +Remember the principal of defense-in-depth: always configure multiple security controls in case one fails. + +:::info +All modern information security frameworks require some form of risk assessment, so you're already ahead once your customers start asking for evidence of that practice! +::: + +## Testing before production +It’s a good idea to test your Weaviate security measures to make sure that they are correctly configured before you launch. In particular, we recommend that you use an online SSL checker to make sure your encryption in transit is working, and that you test that you can restore your backups should the worst happen. +Now is a good time to go back to your risks and mitigations, and assure yourself that the measures you’re implemented are actually managing the risk - for instance, if you’ve used replication to make sure your service can survive if a node fails, have you tested to verify that’s the case? +If this service is especially critical, you may wish to engage the service of a third party penetration testing company to assist you with your assurance. If you choose to do this, we recommend ensuring your tester is CREST certified. + +## Ongoing Maintenance +Sadly, information security is not a ‘set and forget kind’ of job. There are a number of regular activities that we recommend are scheduled and operated as often as you think necessary. Remember that risk-based thinking should be practiced whenever a major change takes place in your environment, whether that’s the rollout of a new major version, the introduction of a new feature, expanding into a different customer base or reaching a company growth milestone. Involving a diverse range of thinkers can improve your identification, understanding and treatment of risk as well. +We release new versions of Weaviate all the time, and strongly advise OSS users to stay within one major release of our latest version if possible. These releases will contain security fixes and improvements, as well as exciting new features. We will also patch any third party vulnerabilities that are identified by the open source community and our security partners. + +## Stay safe out there! +In summary, going from development to production is an incredible journey, and our OSS Hardening Guide, your risk-based thinking coupled with some testing, it can be a safe and secure one as well. + +import WhatNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2024-12-18-recap-london-roadshow/img/hero.png b/blog/2024-12-18-recap-london-roadshow/img/hero.png new file mode 100644 index 0000000000..d9d3d36866 Binary files /dev/null and b/blog/2024-12-18-recap-london-roadshow/img/hero.png differ diff --git a/blog/2024-12-18-recap-london-roadshow/index.mdx b/blog/2024-12-18-recap-london-roadshow/index.mdx new file mode 100644 index 0000000000..bdfb83acf0 --- /dev/null +++ b/blog/2024-12-18-recap-london-roadshow/index.mdx @@ -0,0 +1,115 @@ +--- +title: 'Recap: London Roadshow' +slug: recap-london-roadshow +description: "The Weaviate team was in London last month, where the presentations were packed with insights from the field, real-world use cases, and inspiration for what’s next in AI. From streamlining development to tackling challenges in nuclear energy, here’s a recap of the standout moments." +authors: [staci] +date: 2024-12-18 +tags: [] +image: ./img/hero.png +--- + +![AI in Prod London](./img/hero.png) + +--- + +**AI in Action: Lessons from the Real World** + +The Weaviate team was in London last month, where the presentations were packed with insights from the field, real-world use cases, and inspiration for what’s next in AI. From streamlining development to tackling challenges in nuclear energy, here’s a recap of the standout moments. + +--- + +### **1. Mastering Vector Databases** + +Our CTO & Co-Founder, Etienne Dilocker dove deep into two emerging use cases for large-scale projects: + +- **E-commerce search** handling **1-10 billion embeddings** with sub-second queries, powered by HNSW indexing and smart optimizations. +- **Email RAG** using a multi-tenant setup to process hundreds of thousands of smaller datasets with sub-second speed. + +Both examples proved there’s no one-size-fits-all solution—your approach should depend on the data and the problem you’re solving. + +--- + +### **2. OLIVER’s AI Sandbox and Experimentation** + +Andy Hoare, Senior Business Analyst, from the marketing agency **OLIVER** shared how the company scaled from 500 to 5,000 people in 10 years, while making AI experimentation a core part of their strategy. Their **AI Sandbox** has **1,250+ users**, generating **10,000 images a month** and powering **10 million chat interactions**. + +He spoke about the following projects: + +- **Slipstream** is changing how clients and agencies work together by empowering clients to create more comprehensive and efficient briefs and allowing agencies to work smarter and faster. +- **C2PA** is a transparency initiative for AI-generated content that enables OLIVER to maintain a duty of care to its clients and audiences and build trust as a content creator. +- **Share of Model,** with Jellyfish, measures brand perception within AI models. + +Andy’s advice? Experiment often, fail fast, and find great tech partners to support your growth. + +
+ +
+ +--- + +### **3. AI Meets Nuclear Decommissioning** + +Willem van Asperen and Derek Van Gelderen from **PA Consulting** shared their innovative use of AI in the nuclear sector. At **Sellafield Limited**, they’re solving business-critical challenges, like: + +- A wave of retirements shrinking their workforce by **20%** in the next five years. +- Document reviews that used to take **12 months**. + +Their solutions included: + +- **SLComply.ai**, which automates compliance and slashes administrative time by **90%**. +- **DANI**, a GenAI-powered assistant that processes documents in minutes instead of months. +- **Genie**, a system that connects LLMs, databases, and operational tools to make workflows seamless. + +PA Consulting’s use of Weaviate to scale its document and compliance tools highlights the power of vector search and AI in transforming workflows. By integrating Weaviate, they’re achieving greater efficiency, accuracy, and scalability all while remaining user centric. + +
+ +
+ +--- + +### **4. Building AI-Native Software with Unbody.io** + +Amir Huieh, CEO & Co-Founder of **unbody.io**, shared his journey from running a computer vision and NLP to founding Unbody, an AI-first startup. He broke down the difference between **AI-native** apps (where AI is the core) and **AI-enhanced** ones (where AI is just a bonus). + +Amir showed how integrating **Weaviate** helped his team streamline their development stack, cutting out unnecessary layers. Demos included: + +- A **healthcare platform** that matches patients with therapists. +- An **AI blogging tool** that turns videos into full articles. +- A **desktop organizer** for simplifying digital clutter. + +And the big news? **Unbody is going open source!** Amir invited the community to [jump in and contribute](http://unbody.io/blog/going-oss). + +
+ +
+ +--- + +### **Key Takeaways** + +Across every session, a few key themes stood out: + +- **Simplify where you can**: Merging AI and traditional stacks saves time and headaches. +- **Experiment boldly**: Whether it’s a sandbox or open source, trying new things (and failing fast) is the way to grow. +- **AI is solving real problems**: From nuclear compliance to blogging tools, the impact is tangible and exciting. + +The future of AI is collaborative, creative, and just getting started. Let’s keep building, learning, and sharing! + +import WhatNext from '/_includes/what-next.mdx'; + + diff --git a/blog/2025-01-07-inngest-ai-workflows/img/demo.gif b/blog/2025-01-07-inngest-ai-workflows/img/demo.gif new file mode 100644 index 0000000000..6144e6741d Binary files /dev/null and b/blog/2025-01-07-inngest-ai-workflows/img/demo.gif differ diff --git a/blog/2025-01-07-inngest-ai-workflows/img/hero.png b/blog/2025-01-07-inngest-ai-workflows/img/hero.png new file mode 100644 index 0000000000..8f690462e5 Binary files /dev/null and b/blog/2025-01-07-inngest-ai-workflows/img/hero.png differ diff --git a/blog/2025-01-07-inngest-ai-workflows/img/image1.png b/blog/2025-01-07-inngest-ai-workflows/img/image1.png new file mode 100644 index 0000000000..7309a4165f Binary files /dev/null and b/blog/2025-01-07-inngest-ai-workflows/img/image1.png differ diff --git a/blog/2025-01-07-inngest-ai-workflows/img/image2.png b/blog/2025-01-07-inngest-ai-workflows/img/image2.png new file mode 100644 index 0000000000..044c1622cc Binary files /dev/null and b/blog/2025-01-07-inngest-ai-workflows/img/image2.png differ diff --git a/blog/2025-01-07-inngest-ai-workflows/img/image3.png b/blog/2025-01-07-inngest-ai-workflows/img/image3.png new file mode 100644 index 0000000000..70beaa807d Binary files /dev/null and b/blog/2025-01-07-inngest-ai-workflows/img/image3.png differ diff --git a/blog/2025-01-07-inngest-ai-workflows/index.mdx b/blog/2025-01-07-inngest-ai-workflows/index.mdx new file mode 100644 index 0000000000..0a33b3e448 --- /dev/null +++ b/blog/2025-01-07-inngest-ai-workflows/index.mdx @@ -0,0 +1,279 @@ +--- +title: 'Building Agentic Workflows with Inngest' +slug: inngest-ai-workflows +description: "Automate your RAG pipelines and dive into Workflow Driven Agentic Applications that leverage Inngest and Weaviate." +authors: [daniel, charly] +date: 2025-01-07 +tags: [] +image: ./img/hero.png +--- + +![Building Agentic Workflows with Inngest](./img/hero.png) + +--- +AI workflows are the backbone of all AI applications, whether you are building RAG pipelines, agentic workflows, or AI agents. Since 2023, most AI applications have relied on static AI workflows like RAG pipelines. In 2024, the concept of agentic workflows—*workflows with dynamic steps planned by LLMs*—surfaced to cope with the limitations of static workflows, such as hallucination, a lack of relevancy, or flexibility. + +It has been announced that 2025 will be the race for AI Agents, and having the right tools to build flexible and robust AI workflows will be crucial. For this reason, we are happy to partner with [Inngest](https://www.inngest.com/?utm_source=weaviate&utm_content=article&utm_campaign=workflow-dinner-generator), a workflow engine already used by tens of thousands of developers and handling over 100 million daily runs. + +This article will show you how to use Inngest and Weaviate to build an agentic RAG pipeline that generates the perfect dinner menu based on tastes, allergies, and the number of attendees. + +The finished demo is [available on GitHub](https://github.com/inngest/weaviate-agentic-workflow) so that you can follow the steps locally. + +## Step 1: Setup our Dinner Generator Agentic Workflow architecture + +Our Dinner Generator workflow relies on three datasets available on Huggingface: + +- `Thefoodprocessor/cuisine_type`: a dataset of pairs of recipes and cuisine types (ex: “Italian”) +- `Thefoodprocessor/ingredients_alternatives`: a dataset of recipe and matching ingredients alternatives for known allergies +- `Thefoodprocessor/wine_type`: a list of pairs of recipes and wine pairings + +Once those datasets are loaded into our Weaviate cluster, our workflow is triggered with an [Inngest Event](https://www.inngest.com/docs/features/events-triggers?utm_source=weaviate&utm_content=article&utm_campaign=workflow-dinner-generator) with the following properties: + +``` +{ + "data": { + "participantsCount": 4, + "preferences": ["no nuts", "vegan"], + "cuisine_type": "Italian" + } +} +``` + +Triggered by the above event, our Inngest agentic workflow goes through the following steps: + + +![An Inngest Workflow](./img/image3.png) + +1. First, our workflow will retrieve some recipes from the `Thefoodprocessorcuisinetype` Weaviate collection. +2. Then, using the OpenAI `gpt-4` model, it will try to see if the food preferences contain some allergies. + 2.1 If some allergies are found, an extra step is dynamically performed to retrieve some ingredient alternatives from the `Thefoodprocessoringredientsalternatives` collection. +3. Then, an OpenAI call is performed to generate a menu (with some ingredient alternatives, if any) +4. Another weaviate collection query is performed against the `Thefoodprocessorwinetype` collection to find wines matching the generated menu. +5. An additional OpenAI call is made to select the wine and update the dinner menu. +6. Finally, a shopping list is generated from the final dinner menu. + +*The agentic nature of our dinner generator workflow resides in its ability to fetch additional information when allergies are mentioned in the food preferences.* + +The following section shows how Inngest and Weaviate make building such agentic and data-intensive workflows easy. + +## Step 2: Quick and easy embedding with Weaviate vectorizer + +[Huggingface datasets are available as `.parquet` files](https://huggingface.co/Thefoodprocessor), primarily designed for Python scripts. +For this reason, [our repository](https://github.com/inngest/weaviate-agentic-workflow) contains the translated`.json` files to facilitate processing in Node.js. +The `npm run load` script leverages Weaviate [batching](https://weaviate.io/developers/weaviate/client-libraries/typescript/typescript-v3#batch-inserts) and [vectorizer](https://weaviate.io/blog/typescript-client-stable-release#vectorizer-configuration) APIs to create new collections with a few lines of code: + +```javascript +async function processJsonFile( + filePath: string, + client: any, + batchSize: number = 100 +) { + const jsonData = JSON.parse(await fs.readFile(filePath, "utf-8")); + let count = 0; + let records: any[] = []; + + // Create collection name from filename (without extension) + const collectionName = path + .basename(filePath, ".json") + .replace(/[^a-zA-Z0-9]/g, "") // Remove special characters + .replace(/^[0-9]/, "C$&"); // Prefix with 'C' if starts with number + + const properties = Object.keys(jsonData[0]); + + // Create collection for this file + const collection = await client.collections.create({ + name: collectionName, + properties: properties.map((property) => ({ + name: property, + dataType: "text" as const, + })), + // Use Weaviate vectorize to create embeddings + vectorizers: [ + weaviate.configure.vectorizer.text2VecOpenAI({ + name: "recipe_vector", + sourceProperties: properties as any, + }), + ], + }); + + for (const record of jsonData) { + const { id: _, ...cleanRecord } = record; + + records.push({ + class: collectionName, + properties: cleanRecord, + }); + + count++; + + // we push new records in batches using Weaviate's insertMany() + if (count % batchSize === 0) { + console.log( + `Processing batch from ${path.basename(filePath)}: ${ + records.length + } records` + ); + await collection.data.insertMany(records); + records = []; + } + } + + // Process any remaining records + if (records.length > 0) { + console.log( + `Processing final batch from ${path.basename(filePath)}: ${ + records.length + } records` + ); + await collection.data.insertMany(records); + } + + return { count, collectionName }; +} + +``` + +When embedding thousands of records, Weaviate’s `vectorizer` and `insertMany()` APIs save us from handling rate limits with OpenAI’s embedding API. + +With our Weaviate collections ready, let’s look at the agentic workflow implementation. + +## Step 3: Combine Weaviate and Inngest DX to build our Agentic Workflow + +Inngest enables us to create AI workflows with a simple TypeScript API while Weaviate enable us to quickly retrieve data from our vectorized collections: + +```javascript +import { openai } from "inngest"; +import { inngest } from "./inngest-client"; +import { weaviate } from "./weaviate-client"; + +export const generateMeal = inngest.createFunction( + { id: "generate-meal", concurrency: 10 }, + { event: "meal.generate" }, + async ({ event, step }) => { + // retrieve the input parameters from our trigger event + const { participantsCount, preferences, cuisine_type } = event.data; + + // Query relevant recipes based on cusine type preference + let relevantRecipes = await step.run("query-recipes", async () => { + const collection = weaviate.collections.get("Thefoodprocessorcuisinetype"); + const query = cuisine_type; + + const result = await collection.query.nearText(query, { + limit: 10, + }); + + return result.objects.map((r) => r.properties.recipe).join(`\n`); + }); + + const allergiesAnalysis = await step.ai.infer("Allergies analysis", { + model: openai({ model: "gpt-4" }), + body: { + messages: [ + { + role: "system", + content: + 'Given the following list meal requirements, return a list of allergies, if not allergies, return "not allergies"', + }, + { + role: "user", + content: preferences.join(", "), + }, + ], + temperature: 0.7, + }, + }); + + // ... +}); +``` + +*Please refer to the [repository’s README for instructions on setting up Inngest](https://github.com/inngest/weaviate-agentic-workflow).* +An AI Workflow built with Inngest is composed of steps defined with `step.run()` or `step.ai.infer()`. With these two APIs, each step of our AI workflow will benefit from automatic retries, concurrency, and throttling control. +Our Weaviate query, wrapped in `step.run()` will benefit from the `concurrency` configured in the Inngest Function definition, preventing any overload on our cluster. + +### Zooming on `step.ai.infer()`: a faster way to develop AI Workflows + +Using `step.ai.infer()` to perform LLM calls brings two significant improvements: + +1. The LLM requests get highlighted in the Inngest DevServer (*your local version of Inngest*), enabling you to **inspect the token usage, the input and output of the LLM**, and **re-run the given step with a new prompt**. + + *Here is our `”Allergies analysis”` LLM step displayed in the Inngest Dev Server:* + ![](./img/image2.png) + +2. The LLM requests are **offloaded to Inngest’s infrastructure**, making it easier to deploy workflows on **serverless platforms such as Vercel**. + +### Agentic workflow steps as simple conditional statements + +Let’s come back to our workflow and add our dynamic query to the `Thefoodprocessoringredientsalternatives` Weaviate collection based on the result of our `”Allergies analysis”` LLM step. +Achieving such agentic pattern with Inngest only takes simple conditional statements: + +```javascript +import { openai } from "inngest"; +import { inngest } from "./inngest-client"; +import { weaviate } from "./weaviate-client"; + +export const generateMeal = inngest.createFunction( + { id: "generate-meal", concurrency: 10 }, + { event: "meal.generate" }, + async ({ event, step }) => { + // retrieve the input parameters from our trigger event + const { participantsCount, preferences, cuisine_type } = event.data; + + // Query relevant recipes based on cusine type preference + let relevantRecipes = await step.run("query-recipes", async () => { + // ... + }); + + // Look for allergies in the food preferences + const allergiesAnalysis = await step.ai.infer("Allergies analysis", { + // ... + }); + + let ingredientsAlternatives: any[] = []; + + // run a conditional step based on `allergiesAnalysis` result + if (allergiesAnalysis.choices[0].message.content !== "not allergies") { + // Query relevant recipes based on cusine type preference + ingredientsAlternatives = await step.run( + "query-ingredients-alternatives", + async () => { + const collection = client.collections.get( + "Thefoodprocessoringredientsalternatives" + ); + const query = allergiesAnalysis.choices[0].message.content!; + + const result = await collection.query.nearText(query, { + limit: 10, + }); + + return result.objects; + } + ); + } + + + // ... +}); +``` + +Starting our dinner generator workflow with food preferences including `”no nuts”` triggers the `"query-ingredients-alternatives"` Weaviate query step based on the detection of the `"Allergies analysis"` LLM step. + +![Architectural Diagram](./img/image1.png) + +The following steps of our Dinner generator workflow leverage Weaviate’s `collection.query.nearText()` and Inngest’s `step.ai.infer()` APIs similarly generate the menu, get the relevant wine pairing, and generate the shopping list. +Let’s now see our Dinner generator in action. + +## Try it out: Generate a unique Dinner menu + +The above code and setup instructions are available in our recipes repository and can be run locally using the Inngest Dev Server. +You’ll be able to generate multiple menu variations by trying different food preferences or cuisine types: + +![Weaviate Inngest Demo](./img/demo.gif) + +This article covered how Weaviate’s rich embedding and query APIs make indexing and querying large vectorized datasets easy. It also demonstrated how Inngest’s composable API enables writing robust and dynamic workflows with simple APIs. + +This demo only scratches the surface of how combining Weaviate and Inngest can enable. If you want to build Agentic workflows with more autonomy, such as AI Agents, you should look at [Weaviate Generative Search](https://weaviate.io/developers/weaviate/model-providers/openai#generative-ai-models-for-rag) and Inngest’s new [AgentKit library](https://agentkit.inngest.com/overview). Or, you can wait for our next article on AI Agents. + +import WhatNext from '/_includes/what-next.mdx'; + + diff --git a/developers/academy/deployment/k8s/index.md b/developers/academy/deployment/k8s/index.md index 0dba165467..4c023749ab 100644 --- a/developers/academy/deployment/k8s/index.md +++ b/developers/academy/deployment/k8s/index.md @@ -1,8 +1,12 @@ --- title: "Run Weaviate on Kubernetes" +description: "Learn how to deploy Weaviate with Kubernetes, covering setup, management, and scalability tips." sidebar_position: 100 --- + + + import LearningGoals from '/src/components/Academy/learningGoals.jsx'; import CourseUnits from '/src/components/Academy/courseUnits.jsx'; import { courseData } from '/src/components/Academy/courseData.js' diff --git a/developers/academy/js/_snippets/intro_next_steps_js.mdx b/developers/academy/js/_snippets/intro_next_steps_js.mdx new file mode 100644 index 0000000000..9137857b82 --- /dev/null +++ b/developers/academy/js/_snippets/intro_next_steps_js.mdx @@ -0,0 +1,32 @@ +Congratulations! You have completed this introductory course on Weaviate. + +Now that you have completed this course, you may be interested in exploring our documentation or the Academy for more advanced courses. + +Some of our more popular resources include: + +### Documentation + +- How-to guides + - [How-to: manage data](/developers/weaviate/manage-data/index.md): Code examples for *create*, *update* and *delete* operations. + - [How-to: search](/developers/weaviate/search/index.md): Code examples for all types of search operations. + - [How-to: configure Weaviate](/developers/weaviate/configuration/index.md): Guides for configuring Weaviate, such as [PQ](/developers/weaviate/configuration/compression/pq-compression.md) and [BQ](/developers/weaviate/configuration/compression/bq-compression.md) compression, [backups](/developers/weaviate/configuration/backups.md) and [replication](/developers/weaviate/configuration/replication.md). +- [Concepts guides](/developers/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. +- [API reference](/developers/weaviate/api/index.md): Detailed information about Weaviate's APIs. + +### Academy + +- [Working with Text](/developers/academy/js/starter_text_data): Learn how to use work with text data in Weaviate. +- [Which search is right for me?](/developers/academy/js/standalone/which_search): Learn about the different types of searches in Weaviate and when to use them. + + +import CTASocials from './cta_socials.mdx'; + + + +See you soon! 👋 + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/_standalone/_want-stack/_snippets/index.ts b/developers/academy/js/_standalone/_want-stack/_snippets/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/developers/academy/js/_standalone/_want-stack/index.md b/developers/academy/js/_standalone/_want-stack/index.md new file mode 100644 index 0000000000..35bc081129 --- /dev/null +++ b/developers/academy/js/_standalone/_want-stack/index.md @@ -0,0 +1,62 @@ +--- +title: What is the WANT stack +sidebar_position: 10 +--- + +## What is the WANT + +### What is WANT + +Weaviate, AI, Next.js and Typescript. + +The want stack is collection of technologies that simplify the process of build AI Native Applications. + + +#### Weaviate + +Weaviate is a vector database, it gives you these benefits +- vector search +- dynamic generative model selection (you don't get stuck) + +#### AI + +- this ties heavily into everything else, AI is at the center of AI native, leveraging the flexibility of weaviate and teh vastness of its integrations, you can bring AI to your application from embeddings, to generative models to rerankers or recommenders. Without any tie in. The goal is to give you the most flexibility without the burden on choosing + +#### Next.js (or Nuxt.js) + +This brings modern web development, + + +#### Typescript + +Typescript.. add content + + + +### Building WANT applications + +- Resources +- Starter templates +- Learning + + +[Embed Youtube Course] + +A vector search is also versatile. It can be used to search multiple data modalities (e.g. text, images, audio, etc.), and across multiple languages. + + +## Learning objectives + +import LearningGoalsExp from '/src/components/Academy/learningGoalsExp.mdx'; + + + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/_standalone/client-server/10_why-client-server.mdx b/developers/academy/js/_standalone/client-server/10_why-client-server.mdx new file mode 100644 index 0000000000..526c59e34b --- /dev/null +++ b/developers/academy/js/_standalone/client-server/10_why-client-server.mdx @@ -0,0 +1,58 @@ +--- +title: What is the client-server architecture +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; + + +## What and Why + +### What is the client-server architecture + +A client-server application is one that runs on a client device while accessing information from a remote server. + +In the context of building applications with Weaviate, this means you would have a server as an intermediary to handle all interactions with your database as opposed to interacting with your database directly from your client application. + +This section aims to guide you through how to do that as you build applications with the Weaviate Typescript v3 client: [weaviate-client](https://www.npmjs.com/package/weaviate-client). + + + + + +### Why client-server + + +Besides the requirements of running the [weaviate-client](https://weaviate.io/developers/weaviate/client-libraries/typescript/typescript-v3#node-support-only), the client-server architecture is reliably more secure than interactions directly from the client. + +Having a client-server approach means you can optimize your use of Weaviate by implementing one or more of the following.. + +- Load Balancing +- User and Session Management +- Security related Middleware + + + + +### Using the weaviate-client + +Install the client by following these instructions. A big benefit of using the new v3 client is the introduction of the gRPC protocol. A fast, more reliable platform to handle interactions with the database at scale. Unfortunately, gRPC does not support browser-based client development. + +The v3 client uses gRPC to connect to your Weaviate instance. The client supports Node.js, server-based development. It does not support browser-based web client development. + + +In the next sections we'll look at how to build client-server applications with.. +- [Using backend web frameworks](./20_building-client-server.mdx) +- [Using fullstack web frameworks](./30_fullstack.mdx) + + + +### Best Practices + +As mentioned, it is recommended to use these, + +As you build applications it is important to think about the following +- Your API Tokens and where in your architecture they live +- Sanitize and validate all user inputs +- Implement CORS (Cross-Origin Resource Sharing) correctly diff --git a/developers/academy/js/_standalone/client-server/20_building-client-server.mdx b/developers/academy/js/_standalone/client-server/20_building-client-server.mdx new file mode 100644 index 0000000000..4c7c3863e9 --- /dev/null +++ b/developers/academy/js/_standalone/client-server/20_building-client-server.mdx @@ -0,0 +1,95 @@ +--- +title: Using backend web frameworks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/20_backend.js'; + + +## Building backend web frameworks + +This approach involves having two separate tools. One to build you server application; ideally a backend framework and another to build your client application. For this example, we will be using [Express.js](https://expressjs.com/en/starter/hello-world.html) + +### Building a server + +#### 1. Initialize a Node.js application + +To build a server, we will use Express as an example. + +In a new directory, run +```bash +npm init +``` +#### 2. Install relevant project dependencies including the weaviate-client + +```bash +npm install express dotenv weaviate +``` + +#### 2. Create your project credentials including.. +- Your Weaviate cluster URL and API key +- Your Cohere API key + +and add them to your `.env` file. + + + + + + +ok.. + +#### 2. Initialize Weaviate +Paste the following in `config/weaviate.js` + + + + + +Ok.. + +#### 2. Create your server + + + + + +ok.. + + +#### 5. Run your server with +In your terminal type +```bash +node app.js +``` + +Your server should be running on `localhost:3000` + + + +### Adding a client application + +With our server built, we can now make a call from a client application. We'll can create a basic client application with HTML and Javascript. + + + +Alternatively, in [Hoppscotch](https://hoppscotch.io/), + + diff --git a/developers/academy/js/_standalone/client-server/30_fullstack.mdx b/developers/academy/js/_standalone/client-server/30_fullstack.mdx new file mode 100644 index 0000000000..63f813c132 --- /dev/null +++ b/developers/academy/js/_standalone/client-server/30_fullstack.mdx @@ -0,0 +1,203 @@ +--- +title: Using fullstack web frameworks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; + + +## Using Fullstack Frameworks + +This approach involves having a single tool to build both your server application and client application. In modern web development terms, such a tool is called a fullstack web frameworks. For this example, we will be using [Nuxt.js](nuxt.com/docs/getting-started/installation), and [Next.js](https://nextjs.org/) + + +### Using Next.js + +#### 1. Create a Next.js application with the command below. + +```bash +create-next-app –ts –app +``` +#### 2. Install relevant project dependencies including the Weaviate client with the command below. + +```bash +npm install weaviate-client +``` + +#### 2. Create your project credentials including.. +- Your Weaviate cluster URL and API key +- Your Cohere API key + +... and add them to a `.env` file. + +#### 3. Initialize Weaviate + +Create a file in `utils/weaviate.ts` and paste the following code + +```ts +import weaviate from "weaviate-client"; + +const client = await weaviate.connectToWeaviateCloud(process.env.WEAVIATE_HOST_URL as string,{ + authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_ADMIN_KEY as string), + headers: { + 'X-Cohere-Api-Key': process.env.COHERE_API_KEY as string + } + }, +); +``` + +#### 4. Create an action to run on the server + +Next in `./utils/action.ts`, paste the following code. +```ts +"use server"; + +import { connectToDB } from './weaviate.ts' + +export async function vectorSearch(searchTerm: string) { + + const myCollection = client.collections.get('MyCollectionName'); + + const response = await myCollection.query.nearText(searchTerm, { + limit: 8, + returnMetadata: ['distance'], + }) + + return response + } +``` + +#### 5. Fetch data from your server in your client application. +In the `./app` folder, paste the following code in `page.tsx` +```tsx + +import { vectorSearch } from '@/utils/action.ts'; + +export default async function Home() { + const search = "water sports i can win a medal in" + const data = await vectorSearch(search); + + return ( + + +

+ { data } +

+ + + ) + +} + +``` + +et voila. Find a fully working application here to try out and build from as you see you fit. + + +### Using Nuxt.js + +#### 1. Create a Nuxt.js application with the command below. +```bash +npx nuxi@latest init +``` +#### 2. Install relevant project dependencies including the Weaviate client with the command below. +```bash +npm install weaviate-client dotenv zod tsc +``` +#### 2. Create your project credentials including.. +- Your Weaviate cluster URL and API key +- Your Cohere API key + +Add your env vars to your `..env` file and follow the [Nuxt.js](https://nuxt.com/docs/guide/directory-structure/env) convention on environment variables. + +#### 3. Create a API route to server requests from the client + +In `server/api` create a file called `search.ts` + +```ts + +import weaviate, { WeaviateClient } from "weaviate-client" +import { z } from 'zod' + +export default defineLazyEventHandler(async () => { + const config = useRuntimeConfig() + +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(config.weaviateHostURL,{ + authCredentials: new weaviate.ApiKey(config.weaviateReadKey), + headers: { + 'X-Cohere-Api-Key': config.cohereApiKey, + } + } +) + +const responseSchema = z.object({ + query: z.string(), +}) + +async function vectorSearch(searchTerm:string) { + const myProductCollection = client.collections.get('TestProduct') + +const response = await myProductCollection.query.nearText(searchTerm, { limit : 10 }) + +return response.objects + + +} + + return defineEventHandler<{query: { query: string } }>(async (event) => { + + const result = await getValidatedQuery(event, body => responseSchema.safeParse(body)) + if (!result.success) + throw result.error.issues + + const searchTerm = result.data.query + + return await vectorSearch(searchTerm) + }) +}) + +``` + +#### 4. Fetch data from your server in your client application. + +In `app.vue` paste the following code. + +```html + + + + +``` + +et voila.. Find a fully working application here to try out and build from as you see you fit. + + +### Other frameworks + + +Although only detailing these, you can build with Weaviate using the following fullstack frameworks. + +- Solid +- Angular + +To mention a few. + + diff --git a/developers/academy/js/_standalone/client-server/_snippets/20_backend.js b/developers/academy/js/_standalone/client-server/_snippets/20_backend.js new file mode 100644 index 0000000000..7874679c27 --- /dev/null +++ b/developers/academy/js/_standalone/client-server/_snippets/20_backend.js @@ -0,0 +1,66 @@ +// START weaviate.js +import weaviate from 'weaviate-client' +import dotenv from 'dotenv'; + +dotenv.config(); + +export const connectToDB = async () => { + try { + const client = await weaviate.connectToWeaviateCloud(process.env.WEAVIATE_HOST_URL,{ + authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_READ_KEY), + headers: { + 'X-Cohere-Api-Key': process.env.COHERE_API_KEY || '', + } + } + ) + console.log(`We are connected! ${await client.isReady()}`); + return client + } catch (error) { + console.error(`Error: ${error.message}`); + process.exit(1); + } +}; + +// END weaviate.js +const dotEnv = ``` +// START .env +COHERE_API_KEY= +WEAVIATE_HOST_URL= +WEAVIATE_ADMIN_KEY= +WEAVIATE_READ_KEY= +OPENAI_API_KEY= +// END .env +``` + +// START app.js +import express from 'express'; +import { connectToDB } from './config/weaviate.js'; + +const app = express(); +const port = 3005 + +const client = await connectToDB(); + +app.get('/', async function(req, res, next) { + var searchTerm = req.query.searchTerm; + + const wikipedia = client.collections.get("Wikipedia") + + try { + const response = await wikipedia.query.nearText(searchTerm, { + limit: 5 + }) + + res.send(response.objects) + } catch (error) { + console.error(`Error: ${error.message}`); + } + }) + +app.listen(port, () => { + console.log(`App listening on port ${port}`) +}) + + + +// END app.js \ No newline at end of file diff --git a/developers/academy/js/_standalone/client-server/_snippets/30_fullstack.js b/developers/academy/js/_standalone/client-server/_snippets/30_fullstack.js new file mode 100644 index 0000000000..769cd0def3 --- /dev/null +++ b/developers/academy/js/_standalone/client-server/_snippets/30_fullstack.js @@ -0,0 +1,71 @@ +// START weaviate.js + +import weaviate from 'weaviate-client' +import dotenv from 'dotenv'; + +dotenv.config(); + +export const connectToDB = async () => { + try { + const client = await weaviate.connectToWeaviateCloud(process.env.WEAVIATE_HOST_URL,{ + authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_READ_KEY), + headers: { + 'X-Cohere-Api-Key': process.env.COHERE_API_KEY || '', + } + } + ) + console.log(`We are connected! ${await client.isReady()}`); + return client + } catch (error) { + console.error(`Error: ${error.message}`); + process.exit(1); + } +}; + +// END weaviate.js + +// .env +` +COHERE_API_KEY= +WEAVIATE_HOST_URL= +WEAVIATE_ADMIN_KEY= +WEAVIATE_READ_KEY= +OPENAI_API_KEY= +` +// END .env + + +// START app.js +import express from 'express'; +import { connectToDB } from './config/weaviate.js'; + +const app = express(); +const port = 3005 + +const client = await connectToDB(); + + + +app.get('/', async function(req, res, next) { + var searchTerm = req.query.searchTerm; + + const wikipedia = client.collections.get("Wikipedia") + + try { + const response = await wikipedia.query.nearText(searchTerm, { + limit: 5 + }) + + res.send(response.objects) + } catch (error) { + console.error(`Error: ${error.message}`); + } + }) + +app.listen(port, () => { + console.log(`App listening on port ${port}`) +}) + + + +// END app.js \ No newline at end of file diff --git a/developers/academy/js/_standalone/client-server/index.md b/developers/academy/js/_standalone/client-server/index.md new file mode 100644 index 0000000000..652457b00d --- /dev/null +++ b/developers/academy/js/_standalone/client-server/index.md @@ -0,0 +1,25 @@ +--- +title: Building client-server Applications +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; + + +## Overview + +It is recommended that you employ the client-server architecture as you build applications using the [weaviate-client](https://www.npmjs.com/package/weaviate-client). + +We will get into why this is and detail various paths you could follow as you build applications in Javascript + + + +We will go over.. +- What the client-server architecture is +- Why we opt for the client-server approach +- How to build client-server applications with.. + - Fullstack frameworks and, + - Backend web frameworks. + + diff --git a/developers/academy/js/_standalone/index.md b/developers/academy/js/_standalone/index.md new file mode 100644 index 0000000000..13c1a747dc --- /dev/null +++ b/developers/academy/js/_standalone/index.md @@ -0,0 +1,16 @@ +--- +title: Short units +sidebar_position: 900 +--- + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; +import CourseUnits from '/src/components/Academy/courseUnits.jsx'; +import { courseData } from '/src/components/Academy/courseData.js' + +## Overview + +This section hosts short, standalone units that you can read independently of any other topics. + +## Units + + diff --git a/developers/academy/js/_standalone/using-ml-models/10_embedding.mdx b/developers/academy/js/_standalone/using-ml-models/10_embedding.mdx new file mode 100644 index 0000000000..824fabd41c --- /dev/null +++ b/developers/academy/js/_standalone/using-ml-models/10_embedding.mdx @@ -0,0 +1,125 @@ +--- +title: Understanding Embedding models +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/10_embedding.ts'; + + +### What are embedding models + +Embedding models are machine learning models trained to represent information as an array of numbers, frequently referred to as vector embeddings. Vectors or vector embeddings are numeric representations of data that represent certain properties or features. This representation can be used to efficiently search through objects in a vector space. + + + + + +### When to use embedding models + +Embeddings are the worker horses behind modern search and Retrieval-Augmented Generation (RAG) applications. They are great for.. + +- **Search:** Results of searches are ranked by the distance from an input query vector. +- **Classification:** Items are classified by what category their vector representation is closest to. +- **Recommendations:** Items with similar vector representations are recommended to users. + + +### Applications of embedding models + +Embedding models, like most machine learning models are typically limited to one or more modalities. + +We use modality to describe the type of input or output that a machine learning model can process or interact with to run. Typically, embedding modals fall into two buckets, uni-modal or multimodal. + + + + +- Uni-modal Embeddings + +Uni-modal embeddings represents a single modality in a multidimensional vector space. Examples of these are text to vector models by cohere or image to vector models + + + + +- Multimodal Embeddings +Multimodal embeddings represent multiple modalities in a multidimensional space. Allowing cross modal retrieval and clustering. CLIP is a popular multimodal model that can create embeddings of text, audio and video data. + + + + + + +### Using embedding models in Weaviate + +Weaviate takes most of the complexity of generating and managing embeddings away! Weaviate is configured to support many different vectorizer models and vectorizer service providers. It also gives you the option of providing your own vectors. + +In Weaviate, vector embeddings power hybrid and semantic search. + +Lets walk through what its like to use embeddings in Weaviate. + +## Connect to a Weaviate instance + + + + + +Initialize your connection with Weaviate and add relevant env vars + +## Defining a collection with vectorizer code + + + + + +When creating a collection in Weaviate, we define what embedding model we want to use. In this example we use a uni-modal text to vector model by cohere to embed our data. We also have `sourceProperties` + +We have the option of picking what properties in our data we can create models from. + +We can also set multiple vectorizers, see [named vectors] + + +## Importing data + + + + + +Once our collection is created, we import data. Our data is vectorized at import time and we can make semantic search queries on it. + + + +## making a search with vectors in responses + + + + + + +Here we make a query and set `showVectors` as true so we can see the objects' vectors in our response. Read more about [search here](https://weaviate.io/developers/weaviate/concepts/search) + + + +Various embedding models differ when it comes to performance and ability, [you can read this article on embeddings](https://weaviate.io/blog/how-to-choose-an-embedding-model) so you have an idea of what to think about as you about picking one. + + + diff --git a/developers/academy/js/_standalone/using-ml-models/20_generative.mdx b/developers/academy/js/_standalone/using-ml-models/20_generative.mdx new file mode 100644 index 0000000000..4ae925c319 --- /dev/null +++ b/developers/academy/js/_standalone/using-ml-models/20_generative.mdx @@ -0,0 +1,126 @@ +--- +title: Understanding Generative models +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/20_generative.ts'; + + +### What are generative models + +Generative models are machine learning models that when prompted, can generate original data guided by instructions in the prompt i.e. text, images, and other forms. This original data is derived from data it was trained on but does not mimic it like for like. + + + +Generative Models encompass so many types of models, we will specifically focus on large language models (LLMs). + +### When to use generative models + +Generative models are stars in the limelight of retrieval augmented generation (RAG) and agentic workflows. They are great for... + +- **Translation:** Models can perform zero-shot translate text from one language to another with extremely high accuracy. +- **Code Generation:** Models can take high-level instructions and turn them into functional custom code. +- **Image Generation:** Models can consistently generate high quality images from text instructions in a prompt. + +### Applications of generative models + + +Large Language Models (LLMs), like Anthropics Claudes series of models, or Google's Gemini are specialized types of generative models focused on text data. These models, like most machine learning models are typically limited to one or more modalities. + +We use modality to describe the type of input or output that a machine learning model can process or interact with to run. Typically, generative modals fall into two buckets, uni-modal or multimodal. + + + + + +- Uni-modal generation + +In the context on LLMs, uni-modal generation defines a models ability to generate content and receive instructions in a single modality, this modality is usually text. + + + + +- Multimodal Generation +In the context on LLMs, multimodal generation defines a models ability to generate and receive instructions in multiple modalities. This can range from text input to generation or even image input to audio generation. + + + + +### Using generative models in Weaviate + +Weaviate is configured to support many generative models and generative model providers. You can even plug in your own generative model too depending on where in the weaviate workflow you need generative capabilities. + + +In Weaviate, generative models power our generative search. Lets walk through what its like to use generative models in Weaviate. + +## Connect to a Weaviate instance + + + + + +Initialize your connection with Weaviate and add relevant environment variables + +## Defining a collection with vectorizer code + + + + + +When creating a collection in Weaviate, we define what generative model we want to use. In this example we use a text generation model by Cohere to generate new data. + +## Importing data + + + + + +Once our collection is created, we import data. Our data is vectorized at import time and we can make semantic search queries on it. We can then use the results of these searches as context for our interactions with large language models. + +## Making a single prompt generative search + + + + + +Here we use a `singlePrompt` to make `n` requests to the langauge model where `n` is the number of responses we get from our search. We use `limit` to strictly define the number of responses we get. We can place responses from each response into our prompt with this format `{ answer }` i.e we want the answer property from our search response to be translated in french. + +## Making a grouped task generative search + + + + + + +Here we use the `groupedTask` prompt format to group all the response from our search and send them alongside our prompt as context for what ever we are requesting. You can see with `groupedProperties` we only pass the answer property from all the results we get as context to the large language model, giving us control of what information will inform the models output. + + + +Various generative models differ when it comes to performance and ability, [you can take a look at our integrations page](https://weaviate.io/developers/weaviate/model-providers) to have a better idea of what options you can use. \ No newline at end of file diff --git a/developers/academy/js/_standalone/using-ml-models/_img/embedding_model-bae274b0162e29fa1df717a97a696bc3.png b/developers/academy/js/_standalone/using-ml-models/_img/embedding_model-bae274b0162e29fa1df717a97a696bc3.png new file mode 100644 index 0000000000..4930ad4550 Binary files /dev/null and b/developers/academy/js/_standalone/using-ml-models/_img/embedding_model-bae274b0162e29fa1df717a97a696bc3.png differ diff --git a/developers/academy/js/_standalone/using-ml-models/_snippets/10_embedding.ts b/developers/academy/js/_standalone/using-ml-models/_snippets/10_embedding.ts new file mode 100644 index 0000000000..ee73bab376 --- /dev/null +++ b/developers/academy/js/_standalone/using-ml-models/_snippets/10_embedding.ts @@ -0,0 +1,83 @@ +// START Connect +import weaviate, { WeaviateClient } from 'weaviate-client' +import axios from 'axios'; + +// END Connect +import 'dotenv/config' + +// START Connect +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string +const cohereKey = process.env.COHERE_API_KEY as string + +// Connect to your Weaviate instance +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL,{ + authCredentials: new weaviate.ApiKey(weaviateKey), + headers: { + 'X-Cohere-Api-Key': cohereKey, // Replace with your inference API key + } + } +) +// END Connect + // Delete the "JeopardyQuestion" collection if it exists + await client.collections.delete('JeopardyQuestion'); + + if (await client.collections.exists('JeopardyQuestion') == false) { + + // Create a collection with both a vectorizer and generative model +// START Collection +await client.collections.create({ + name: 'JeopardyQuestion', + properties: [ + { + name: 'Category', + dataType: 'text' as const, + description: 'Category of the question', + }, + { + name: 'Question', + dataType: 'text' as const, + description: 'The question', + }, + { + name: 'Answer', + dataType: 'text' as const, + description: 'The answer', + } + ], + // Define your Cohere vectorizer and generative model + vectorizers: weaviate.configure.vectorizer.text2VecCohere({ + sourceProperties: ["Question", "Answer"] + }), +}); +// END Collection + + } + + try { +// START Importing +let jeopardyCollection = client.collections.get('JeopardyQuestion'); +// Download data to import into the "JeopardyQuestion" collection +const url = 'https://raw.githubusercontent.com/weaviate/weaviate-examples/main/jeopardy_small_dataset/jeopardy_tiny.json' +const jeopardyQuestions = await axios.get(url); + +// Bulk insert downloaded data into the "JeopardyQuestion" collection +await jeopardyCollection.data.insertMany(jeopardyQuestions.data) +// END Importing + console.log('Data Imported'); + } catch (e) { + console.error(e); + } +// START Search +const jeopardyCollection = client.collections.get('JeopardyQuestion'); + +const searchResults = await jeopardyCollection.query.nearText(['question about animals'], { + limit: 3, + returnMetadata: ['distance'], // Return the distance of results from the query vector + includeVector: false // Change to true to include objects' vectors in your response +}) + +console.log("Near Text objects for:", JSON.stringify(searchResults, null, 2)); +// END Search + + diff --git a/developers/academy/js/_standalone/using-ml-models/_snippets/20_generative.ts b/developers/academy/js/_standalone/using-ml-models/_snippets/20_generative.ts new file mode 100644 index 0000000000..d0fd909f99 --- /dev/null +++ b/developers/academy/js/_standalone/using-ml-models/_snippets/20_generative.ts @@ -0,0 +1,93 @@ +// START Connect +import weaviate, { WeaviateClient } from 'weaviate-client' +import axios from 'axios'; + +// END Connect + +import 'dotenv/config' + +// START Connect +const weaviateURL = process.env.WEAVIATE_URL as string +const weaviateKey = process.env.WEAVIATE_ADMIN_KEY as string +const cohereKey = process.env.COHERE_API_KEY as string + +// Connect to your Weaviate instance +const client: WeaviateClient = await weaviate.connectToWeaviateCloud(weaviateURL,{ + authCredentials: new weaviate.ApiKey(weaviateKey), + headers: { + 'X-Cohere-Api-Key': cohereKey, // Replace with your inference API key + } + } +) +// END Connect + + // Delete the "JeopardyQuestion" collection if it exists + await client.collections.delete('JeopardyQuestion'); + + if (await client.collections.exists('JeopardyQuestion') == false) { +// START Collection +await client.collections.create({ + name: 'JeopardyQuestion', + properties: [ + { + name: 'Category', + dataType: 'text' as const, + description: 'Category of the question', + }, + { + name: 'Question', + dataType: 'text' as const, + description: 'The question', + }, + { + name: 'Answer', + dataType: 'text' as const, + description: 'The answer', + } + ], + // Define your Cohere vectorizer and generative model + vectorizers: weaviate.configure.vectorizer.text2VecCohere(), + // highlight-start + generative: weaviate.configure.generative.cohere() + // highlight-start +}); +// END Collection + +} + + try { +// START Importing +let jeopardyCollection = client.collections.get('JeopardyQuestion'); + +// Download data to import into the "JeopardyQuestion" collection +const url = 'https://raw.githubusercontent.com/weaviate/weaviate-examples/main/jeopardy_small_dataset/jeopardy_tiny.json' +const jeopardyQuestions = await axios.get(url); + +// Bulk insert downloaded data into the "JeopardyQuestion" collection +await jeopardyCollection.data.insertMany(jeopardyQuestions.data) + +console.log('Data Imported'); +// END Importing + } catch (e) { + console.error(e); + } + + const myCollection = client.collections.get('JeopardyQuestion'); +// START SingleGenerative +const genResult = await myCollection.generate.nearText("african elephant in savanna", { + singlePrompt: "translate {answer} into french for me", +}) + +for (const item of genResult.objects) { + console.log("Single generated concept:", item.generated); +} +// END SingleGenerative + +// START GroupedGenerative +const groupedGenResult = await myCollection.generate.nearText("african elephant in savanna", { + groupedTask: "Summarize all the results received into a single informational paragraph?", + groupedProperties: ["answer"] +}) + +console.log("Grouped generated concept:", groupedGenResult.generated); +// END GroupedGenerative diff --git a/developers/academy/js/_standalone/using-ml-models/index.md b/developers/academy/js/_standalone/using-ml-models/index.md new file mode 100644 index 0000000000..d26e70ac18 --- /dev/null +++ b/developers/academy/js/_standalone/using-ml-models/index.md @@ -0,0 +1,41 @@ +--- +title: Picking ML Models +sidebar_position: 10 +--- + +## Unit overview + + +Weaviate lets you interact with two types of machine learning models - generative models and embedding models. + +This serves to help you understand, on a basic level the functioning and utility of both types of models. +We will explore scenarios where each model type thrives in and look at what things to consider when picking sub groups of models. + +Then, we will also discuss the role of each of these models in building AI-Native applications ranging from chatbots, and RAG Apps to Agentic systems. + +- **[Embedding Models](./10_embedding.mdx)** +- **[Generative Models](./20_generative.mdx)** + + + +### Prerequisites + +- A Node environment with `weaviate-client` installed. +- Familiarity with Weaviate's search capabilities. +- Intermediate coding proficiency (e.g. Javascript) + +## Learning objectives + +import LearningGoalsExp from '/src/components/Academy/learningGoalsExp.mdx'; + + + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/_standalone/which-search/05_review.mdx b/developers/academy/js/_standalone/which-search/05_review.mdx new file mode 100644 index 0000000000..8912c9393c --- /dev/null +++ b/developers/academy/js/_standalone/which-search/05_review.mdx @@ -0,0 +1,118 @@ +--- +title: Review of search types +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/05_review.ts'; + +## Overview + +Weaviate offers three primary search types - namely **vector**, **keyword**, and **hybrid** searches. Let's briefly recap what they are, and how they work. + +### Code examples + +These code examples are runnable, with the [`v3` Weaviate Typescript client](/developers/weaviate/client-libraries/typescript/typescript-v3.mdx). Connect to the pre-configured demo instance of Weaviate with the following code, and try the examples below. + + + + + + + + + +## Vector search + +A vector search finds objects with the most similar vectors to the query vector. + +Because each vector is a numerical representation of the underlying object, a vector similarity can be thought of as a similarity in meaning. Therefore a vector search is also called "semantic search". + +In Weaviate, you can search for objects with similar vectors in any of the following ways: + +With a source medium (e.g. text or image): + + + + + + + + + +With a vector: + + + + + + + + + +With an existing Weaviate object: + + + + + + + + + +## Keyword search + +A keyword search finds objects whose keywords (i.e. tokens) are the most relevant to the keywords (i.e. tokens) of the query. The relevance is determined by the [BM25F algorithm](https://en.wikipedia.org/wiki/Okapi_BM25). + +Intuitively, the BM25F algorithm determines "relevance" by considering how often a keyword appears in each field of the object, relative to how commonly the keyword appears in the entire dataset. + + + + + + + + + +## Hybrid search + +A hybrid search combines the results of a vector search and a keyword search. This is done by performing both searches, and them combining the two search results with a "fusion" algorithm. + + + + + + + + diff --git a/developers/academy/js/_standalone/which-search/10_strengths.mdx b/developers/academy/js/_standalone/which-search/10_strengths.mdx new file mode 100644 index 0000000000..d7b1dd5b80 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/10_strengths.mdx @@ -0,0 +1,203 @@ +--- +title: Strengths of each search type +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/10_strengths.ts'; + + +## Overview + +These different search types are offered because they each have different characteristics, and therefore different strengths. + +Let's explore the relative strengths of each search type. + +## Strengths of vector search + +### Robustness + +A vector is a numerical representation of the underlying object's meaning. As a result, a vector search is robust to any changes that don't affect the meaning of the object. + +More concretely, a vector of "cat", for example, will be similar to a vector of "kitten", "feline", and "pet", even though their spellings are very different. + +See this in action below, where we search for "cat" and "kitten" using vector search. + + + + + + + + + +You see that the results for "cat" and "kitten" are very similar. + +In other words, the vectors for "cat" and "kitten" are similar in meaning, because the model can "understand" meaning. + + + +Similarly, a vector of "cat" is similar to the vector of "cat" with a spelling mistake, such as "caat", or "catt". + + + + + + + + + +Here, the results are basically identical. + + + +This robustness is a key strength of vector search, as it means that the searcher does not need to know the exact words used in the dataset. This is particularly useful when the concepts being searched for are not well-defined, or when the searcher is not familiar with the dataset. + +### Versatility + +A vector search is also versatile. It can be used to search multiple data modalities (e.g. text, images, audio, etc.), and across multiple languages. + +This is because the vector is a numerical representation of the underlying object's meaning, and therefore the same vector can be used to represent the same meaning, regardless of the data modality or language. + +In fact, some models are capable of search across multiple data modalities, or multiple languages (or both!). This is made possible by using a model that can convert the data into comparable vectors, regardless of the data modality or language. + +![Vectorization across multiple modalities](./_img/multimodal_example.png) + +## Strengths of keyword search + +### Exactitude + +Keyword search is ideal for situations where locating precise matches are required. This is particularly useful in scenarios where there exist exact terms to search for, such as academic research, searches through domain-specific data or technical troubleshooting. + +The ability to return results that precisely match the search terms ensures that users receive the most relevant information for their specific queries. + +More concretely, take a look at the example below, where we search for "imaging". + + + + + + + + + +And when we inspect the results: + + + +A search for "imaging" using a keyword search returns the one result that contains that specific word. + + +## Strengths of hybrid search + +A key strength of hybrid search is its resiliency. Let's explore this in more detail. + +### Resiliency + +A hybrid search is resilient as it combines top results from both vector and keyword search. This helps to mitigate either search's shortcomings. + +Take a look at the hybrid search example below. + + + + + + + + + +We can inspect the results here: + + + +You can see that as well as the keyword search result above (for "imaging"), we get a semantically relevant result (for "X-rays"). + +Because hybrid search combines the results of both vector and keyword search, it will find objects that score well on at least one of the search types. This approach has the effect of complementing each search type. + + + diff --git a/developers/academy/js/_standalone/which-search/20_selection.mdx b/developers/academy/js/_standalone/which-search/20_selection.mdx new file mode 100644 index 0000000000..cb12999bc5 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/20_selection.mdx @@ -0,0 +1,104 @@ +--- +title: Selecting the right search type +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/20_selection.ts'; + + +## Overview + +Selecting the right search type is key for effective search tasks. Let's explore how to select the right search type for your needs. + + +## Rules of thumb + + +### When to use vector search + +Vector search is the most robust and versatile search type. As such, it is well-suited for situations where the the meaning, or the vector representation, is of the highest importance. + +In cross-modal, object-based or multi-lingual searches, vector search may be the only viable option. + +Start with vector search for: + +- **Non-text, or cross-modal searches**: Essential for searching across different types of media, like finding images using text descriptions or vice versa. +- **Object-based searches**: For finding similar objects to an extracted text chunk, image, or video, vector search is likely the only viable solution. +- **Multi-lingual contexts**: The go-to choice for handling searches in multiple languages, where traditional keyword-based search may fall short. +- **Complex query understanding**: Vector search excels in interpreting and responding to complex queries that require understanding context or nuances in language. + +### When to use keyword search + +Keyword search is useful when there is an expectation or requirement to match the exact search terms. This can be the case for specific domains such as legal, medical or technical areas where the exact terminology is important. + +Keyword search is also useful when the user is unlikely to make mistakes in inputs and is inputting a predictable set of terms, such as through a sanitized form or a drop-down menu. + +In summary, start with keyword search for: + +**Exact term matching**: Ideal in domains like legal, medical, or technical fields where specific terminology is crucial. +**Predictable user inputs**: Works well when users are expected to input a defined set of terms, like through forms or drop-down menus. +**Simple and direct queries**: Effective for straightforward search needs where the complexity of natural language processing is not required. +**Fast and specific results**: Suitable for quick retrieval of information based on specific keywords or phrases. + +### When to use hybrid search + +Hybrid search is a great choice for "messy" situations. + +Because hybrid search combines results sets from both vector and keyword searches, it is able to provide a good balance between the robustness of vector search and the exactitude of keyword search. + +As a result, hybrid search is a generally good choice for most search needs that do not fall into the specific use cases of vector or keyword search. + +In summary, consider hybrid search for: + +- **Broad topic ranges**: Effective in scenarios where the target corpus covers a wide array of subjects, requiring a versatile search approach. +- **Versatile search scenarios**: Useful for real-life scenarios that often require a combination of results from both vector and keyword searches. +- **Unpredictable user inputs**: Ideal for many real-life scenarios where the user has free reign over the query. Some user queries may be aimed at direct matches while others' queries may be more about the overall meaning. + + + diff --git a/developers/academy/js/_standalone/which-search/30_strategies.mdx b/developers/academy/js/_standalone/which-search/30_strategies.mdx new file mode 100644 index 0000000000..01e63e3001 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/30_strategies.mdx @@ -0,0 +1,164 @@ +--- +title: Strategies to improve search results +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!./_snippets/30_strategies.ts'; + + +## Overview + +In addition to selecting the right search types, there are also strategies you can employ to improve the quality of your search results. + +Let's explore some of these strategies. + +## Improve vector search + +The key to improving vector search is to make sure that the vector representation of the object is fit for purpose, so as to suit the search needs. + +### Vectorizer selection + +Unless you are inserting data with your own vectors, you will be using a Weaviate vectorizer module, and a model within that module, to generate vectors for your data. + +The choice of vectorizer module and model is important, as it will determine what aspects of the data are captured in the vector representation, and how well the model is able to "understand" the data. + +First and foremost, you should select a vectorizer module that is best suited for your data type. For example, if you are working with text data, you should use the `text2vec` module, and if you are using image or multi-modal data, you should likely use the `multi2vec` module. + +We will cover vectorizer selection in another unit. But, if you are not sure where to start, try: +- `text2vec-cohere`, or `text2vec-openai` for text data (API-based) + - Cohere offers a multi-lingual model that can be used with over 100 languages. +- `multi2vec-clip` for image or image and text data. + +If you are working with text and prefer to run a local inference container, try `text2vec-transformers`, with a popular model such as `sentence-transformers/all-MiniLM-L12-v2`. + +### Try a re-ranker + +Re-ranker modules are a great way to improve the quality of your search results. + +A re-ranker module is a module that takes in the results of a vector search, and re-ranks the results based on additional criteria, or a different model. This allows a higher-quality (but slower) model to be used for re-ranking, while still benefiting from the fast first stage search. + +For example, you can use the `text2vec-cohere` module to perform a vector search, and then use the `reranker-cohere` module to re-rank the results using a different model. + +### Property selection + +Vectorization captures the "meaning" of the object. Accordingly, if a property is not relevant to the criteria to be applied for search, it should be excluded from the vectorization process. + +As an example, if a product object includes metadata such as its manufacturing process or location, and the vector search is intended to be based on the product's features, then the properties for manufacturing process and location should be excluded from the vectorization process. + +You can do this by specifying whether to skip a property during vectorization, as shown below. Note that you can do the same with the collection name, and the property name. + + + + + + + + + +### Chunking + +Chunking refers to the process of splitting a text into smaller chunks, and vectorizing each chunk separately. This is very important, as it defines how much information each vector contains. + +As a rule of thumb, the more granular the search needs, the smaller the chunk size should be. For example, if you are searching for specific concepts and ideas, you should chunk data into smaller units such as sentences or small windows of text. Alternatively, if you are searching for broader concepts, such as finding relevant chapters or books, you might chunk text accordingly. + +Read more about it in the [chunking unit](../../standalone/chunking/index.mdx) of Weaviate Academy. + +## Improve keyword search + +### Tokenization + +Although we refer to BM25 search as a "keyword" search, in reality the exact matches are for "tokens", rather than words. This is a different tokenization process to that used for generating vector embeddings, but instead, it is used to build the inverted index for BM25 searches and filtering. + +Accordingly, the tokenization process is very important, as it determines what tokens are used for matching. + +The available options are: `word`, `lowercase`, `whitespace`, and `field`. The default (`word`) might be sufficient for prose, but for text where exact matches including case and symbols are important, something like `whitespace` might be more appropriate. + +Available tokenization options: + +import TokenizationDefinition from '/_includes/tokenization_definition.mdx'; + + + +You can set tokenization in the collection configuration. + + + + + + + + + +### Select and boost properties + +If you observe that matches in some properties are having too much of an impact, you can exclude them from the search, and/or boost the importance certain properties. + +For example, matches in the `description` property might be more important than matches in the `notes` property. You can specify this at query time. + + + + + + + + + +## Improve hybrid search + +### Alpha + +The alpha parameter determines the balance between the vector and keyword search results. + +If you want to configure your search to be more vector-based, you can increase the alpha value. Conversely, if you want to configure your search to be more keyword-based, you can decrease the alpha value. + + + + + + + + + +### Fusion algorithm + +The fusion algorithm determines how the results from the vector and keyword searches are combined. + +By default, an inverse of the ranks from each results set are summed, in what is called the "ranked fusion" algorithm. However, you can also use the "relative score fusion" algorithm, which sums normalized scores from each results set. + +Generally, we have found that the "relative score fusion" algorithm works better, but you should try both to see which works best for your use case. + + + + + + + + + diff --git a/developers/academy/js/_standalone/which-search/_30_improve_search.mdx b/developers/academy/js/_standalone/which-search/_30_improve_search.mdx new file mode 100644 index 0000000000..2447a084e3 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/_30_improve_search.mdx @@ -0,0 +1,13 @@ +--- +title: Improving search +--- + +- Evaluating search quality +- Improving search quality + - Vectorizer + - Data structure + - Search type +- Improving search speed + - Inference speed + - Resource demands + - Query bottlenecks diff --git a/developers/academy/js/_standalone/which-search/_img/multimodal_example.png b/developers/academy/js/_standalone/which-search/_img/multimodal_example.png new file mode 100644 index 0000000000..628d4d5be1 Binary files /dev/null and b/developers/academy/js/_standalone/which-search/_img/multimodal_example.png differ diff --git a/developers/academy/js/_standalone/which-search/_snippets/05_review.ts b/developers/academy/js/_standalone/which-search/_snippets/05_review.ts new file mode 100644 index 0000000000..8df9d034f4 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/_snippets/05_review.ts @@ -0,0 +1,112 @@ +import weaviate, { WeaviateClient, WeaviateReturn } from "weaviate-client" +// START connectionCode +let client: WeaviateClient + + +client = await weaviate.connectToWeaviateCloud(process.env.WCD_URL as string, { + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY as string, // Replace with your inference API key + } +} +) +// END connectionCode + + +// START nearTextExample // START nearVectorExample // START nearObjectExample // START bm25Example // START hybridExample +type NonGenericReturn = WeaviateReturn +let response: NonGenericReturn + +const questions = client.collections.get("JeopardyQuestion") + +// END nearTextExample // END nearVectorExample // END nearObjectExample // END bm25Example // END hybridExample + +// START nearTextExample +response = questions.query.nearText("space travel", // Your query string + { + limit: 2 + } +) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.properties) +} +// END nearTextExample +// assert len(response.objects) == 2 +// assert "question" in response.objects[0].properties.keys() + +response = questions.query.nearText("space travel", { + limit: 1, + includeVector: true +} +) +let vectorInput = response.objects[0].vectors +let objectInput = response.objects[0].uuid + +// START nearVectorExample +response = questions.query.nearVector(vectorInput, // Your vectors + { + limit: 2 + } +) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.properties) +} +// END nearVectorExample + +// assert len(response.objects) == 2 +// assert "question" in response.objects[0].properties.keys() + +// START nearObjectExample +response = questions.query.nearObject(objectInput, // Your object UUID + { + limit: 2 + } +) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.properties) +} +// END nearObjectExample + + +// assert len(response.objects) == 2 +// assert "question" in response.objects[0].properties.keys() + +// START bm25Example +response = questions.query.bm25("space travel", // Your query string + { + limit: 2 + } +) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.properties) +} +// END bm25Example + +// assert len(response.objects) == 2 +// assert "question" in response.objects[0].properties.keys() + + +// START hybridExample +response = questions.query.hybrid("space travel", // Your query string + { + limit: 2 + } +) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.properties) +} + +// END hybridExample + +// assert len(response.objects) == 2 +// assert "question" in response.objects[0].properties.keys() diff --git a/developers/academy/js/_standalone/which-search/_snippets/10_strengths.ts b/developers/academy/js/_standalone/which-search/_snippets/10_strengths.ts new file mode 100644 index 0000000000..994c0ca581 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/_snippets/10_strengths.ts @@ -0,0 +1,164 @@ +import weaviate, { WeaviateClient, WeaviateReturn } from "weaviate-client" + +let client: WeaviateClient +type NonGenericReturn = WeaviateReturn +let response: NonGenericReturn +// # END-ANY + +client = await weaviate.connectToWeaviateCloud(process.env.WCD_URL as string,{ + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY as string, // Replace with your inference API key + } + } + ) + +// START robustnessExampleWords +for (const query of ["cat", "kitten"]) { + const question = client.collections.get("JeopardyQuestion") + + response = await question.query.nearText(query,{ + limit: 1, + returnMetadata: ['distance'], + returnProperties: ["question", "answer"] + }) + + for (const item of response.objects) { + console.log(`\n===== Search results for ${query} =====`) + console.log("Distance:", item.metadata?.distance) + console.log(item.properties) + } +} +// END robustnessExampleWords +// assert length(response.objects) == 1 +// assert "question" in response.objects[0].properties.keys() + + +const example = ` +// START responseRobustnessExampleWords +===== Search results for cat ===== +Distance: 0.170 +{ + "answer": "Fat cat", + "question": "A flabby tabby" +} + +===== Search results for kitten ===== +Distance: 0.150 +{ + "answer": "Fat cat", + "question": "A flabby tabby" +} +// END responseRobustnessExampleWords +` + +// START robustnessExampleSpelling +for (const query of ["cat", "catt", "caat"]) { + const question = client.collections.get("JeopardyQuestion") + + response = await question.query.nearText(query,{ + limit: 1, + returnMetadata: ['distance'], + returnProperties: ["question", "answer"] + }) + + for (const item of response.objects) { + console.log(`\n===== Search results for ${query} =====`) + console.log("Distance:", item.metadata?.distance) + console.log(item.properties) + } +} + +// END robustnessExampleSpelling + +// assert len(response.objects) == 1 +// assert "question" in response.objects[0].properties.keys() + + +const example2 = ` +// START responseRobustnessExampleSpelling +===== Search results for cat ===== +Distance: 0.170 +{ + "answer": "Fat cat", + "question": "A flabby tabby" +} + +===== Search results for catt ===== +Distance: 0.177 +{ + "answer": "Fat cat", + "question": "A flabby tabby" +} + +===== Search results for caat ===== +Distance: 0.184 +{ + "answer": "Fat cat", + "question": "A flabby tabby" +} +// END responseRobustnessExampleSpelling +` + +// START bm25Example // START hybridExample +const question = client.collections.get("JeopardyQuestion") +// END bm25Example // END hybridExample + +// START bm25Example + +response = await question.query.bm25("imaging",{ // Your query string + limit: 2, + returnProperties: ["question", "answer"] + }) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.properties) +} +// END bm25Example + +// assert "question" in response.objects[0].properties.keys() + +const example3 = ` +// START bm25Results +49fe3d7c-61a5-5916-99bb-052d07c7c251 +{ + "answer": "magnetic resonance imaging", + "question": "MRI, which stands for this, cannot be used on patients with pacemakers or artificial metal joints" +} +// END bm25Results +` + +// START hybridExample + +response = await question.query.hybrid("imaging", { // Your query string + limit: 2, + returnMetadata: ["score"], + returnProperties: ["question", "answer"] + }) + +for (const item of response.objects) { + console.log(item.uuid) + console.log(item.metadata?.score) + console.log(item.properties) +} + +// END hybridExample + +// assert "question" in response.objects[0].properties.keys() + + +` +// START hybridResults +49fe3d7c-61a5-5916-99bb-052d07c7c251 +{ + "answer": "magnetic resonance imaging", + "question": "MRI, which stands for this, cannot be used on patients with pacemakers or artificial metal joints" +} +9041bce6-b5d1-5637-bcbe-2ebb8a689fe0 +{ + "answer": "X-rays", + "question": "These electromagnetic rays used to take pictures of your insides were originally known as Roentgen rays" +} +// END hybridResults +` diff --git a/developers/academy/js/_standalone/which-search/_snippets/20_selection.ts b/developers/academy/js/_standalone/which-search/_snippets/20_selection.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/developers/academy/js/_standalone/which-search/_snippets/30_strategies.ts b/developers/academy/js/_standalone/which-search/_snippets/30_strategies.ts new file mode 100644 index 0000000000..94d1523744 --- /dev/null +++ b/developers/academy/js/_standalone/which-search/_snippets/30_strategies.ts @@ -0,0 +1,127 @@ +import weaviate, { CollectionConfig, CollectionConfigCreate, WeaviateClient, WeaviateReturn } from "weaviate-client" + +let client: WeaviateClient + +client = await weaviate.connectToWeaviateCloud(process.env.WCD_URL as string,{ + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-OpenAI-Api-Key': process.env.OPENAI_APIKEY as string, // Replace with your inference API key + } + } +) + +client.collections.delete("Product") + +// START skipVectorizationExample // START tokenizationExample +let products: CollectionConfigCreate +// END skipVectorizationExample // END tokenizationExample + +// START skipVectorizationExample +products = await client.collections.create({ + name: "Product", + vectorizers: weaviate.configure.vectorizer.text2VecOpenAI({ + // highlight-start + vectorizeCollectionName: true + // highlight-end + }), + properties: [{ + name: "name", + dataType: weaviate.configure.dataType.TEXT, + // highlight-start + vectorizePropertyName: true + // highlight-end + }, + { + name: "description", + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: "manufacturing_process", + dataType: weaviate.configure.dataType.TEXT, + // highlight-start + skipVectorization: true, // Skip unwanted property + //highlight-end + }] +}) +// END skipVectorizationExample + +client.collections.delete("Product") + +client.collections.delete("SomeCollection") + +// START tokenizationExample + +products = await client.collections.create({ + name: "SomeCollection", + properties: [{ + name: "name", + dataType: weaviate.configure.dataType.TEXT, + // highlight-start + tokenization: weaviate.configure.tokenization.WORD // Default + // highlight-end + }, + { + name: "description", + dataType: weaviate.configure.dataType.TEXT, + tokenization: weaviate.configure.tokenization.WHITESPACE // Will keep case & special characters + }, + { + name: "email", + dataType: weaviate.configure.dataType.TEXT, + // highlight-start + tokenization: weaviate.configure.tokenization.FIELD // Do not tokenize at all + // highlight-end + }] +}) +// END tokenizationExample + + +client.collections.delete("SomeCollection") + +// START selectAndBoostExample // START adjustAlpha // START changeFusionType +type NonGenericReturn = WeaviateReturn +let response: NonGenericReturn + +const questions = client.collections.get("JeopardyQuestion") + +// END selectAndBoostExample // END adjustAlpha // END changeFusionType + + +// START selectAndBoostExample +response = questions.query.bm25("animal",{ // Your query string + limit: 5, + queryProperties: ["question^3", "answer"] // Boost the impact of "question" property by 3 + } +) + +for (const item of response.objects) { + console.log(item.properties) +} +// END selectAndBoostExample + +// START adjustAlpha +response = questions.query.hybrid("imaging",{ // Your query string + limit: 5, + alpha: 0.1, // Mostly a vector search (Try it with alpha=0.9) + } +) + +for (const item of response.objects) { + console.log(item.properties) +} +// END adjustAlpha + + + +// START changeFusionType +response = questions.query.hybrid("imaging",{ // Your query string + limit: 5, + fusionType: "RelativeScore", + alpha: 0.1, // Mostly a vector search (Try it with alpha=0.9) + } +) + +for (const item of response.objects) { + console.log(item.properties) +} +// END changeFusionType diff --git a/developers/academy/js/_standalone/which-search/index.md b/developers/academy/js/_standalone/which-search/index.md new file mode 100644 index 0000000000..6b81f63eec --- /dev/null +++ b/developers/academy/js/_standalone/which-search/index.md @@ -0,0 +1,50 @@ +--- +title: Which search is right for me? +sidebar_position: 10 +--- + +## Unit overview + + + + + + + +Weaviate offers three distinct search methods - namely **vector**, **keyword**, and **hybrid** searches. + +Each method has its unique strengths and applicabilities, making the selection critical to the success of your search-related tasks. + +This section compares these search types to equip you with the knowledge to intuit when and why to employ each of these search methodologies. + +We will explore how the choice of search type impacts not only the quality of the search results but also the overall performance of the search operation. + +Then, we will also discuss strategies to improve the quality of search results, as well as the performance of the search operation. + + +### Prerequisites + +- A Node.js environment with `weaviate-client` installed. +- Familiarity with Weaviate's search capabilities. +- Intermediate coding proficiency (e.g. Javascript). + +## Learning objectives + +import LearningGoalsExp from '/src/components/Academy/learningGoalsExp.mdx'; + + + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/101_setup_weaviate/10_client.mdx b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/10_client.mdx new file mode 100644 index 0000000000..67bc24408c --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/10_client.mdx @@ -0,0 +1,37 @@ +--- +title: Weaviate Typescript client +description: Client Setup for Multimodal Data in Weaviate +--- + +## Installation + +The latest Weaviate TypeScript client library can be installed using npm. The client library is tested on Node v18 and later. Install it using the following command: + +```bash +npm install weaviate-client +``` + +The latest major version is `v3` (e.g. `3.x.x`). You can check the version like so: + +```bash +npm view weaviate-client version +``` + +## Basic usage + +You can import the Weaviate client library like so: + +```typescript +import weaviate, { generateUuid5, ApiKey } from "weaviate-client" +``` + +The client provides sets of helper functions (e.g. `generateUuid5, ApiKey`) to make it easier to interact with Weaviate. + +Next, we'll show you how create a Weaviate instance and connect to it. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx new file mode 100644 index 0000000000..edb85e0d90 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx @@ -0,0 +1,67 @@ +--- +title: "Option 1: A cloud WCD instance" +description: "Create a Weaviate instance on WCS for scalable, cloud-based data projects." +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../../_snippets/101_connect.mts'; + +Here, you will create a Weaviate Cloud (WCD) instance. WCD is a fully managed Weaviate instance that runs in the cloud. It's a great way to get started with Weaviate, as it requires no installation or maintenance. + +### Log in to the WCD Console + +Go to the [WCD Console](https://console.weaviate.cloud/) and log in with your credentials. If you don't have an account yet, you can sign up by clicking on the Register here link from the login screen. + +### Create a Weaviate instance + +From the console, go to the Dashboard and click on the Create cluster button. From the following screen: + +- Select the "Free sandbox" tab +- Provide a cluster name +- Set "Enable authentication" to "Yes" + +Click on the Create button to create your Weaviate instance. The process will take a few minutes. + +### Retrieve your Weaviate instance details + +Once the instance is created, you will be able see its details by clicking on the Details button. Find the cluster URL and the API key. + +You will need these details to connect to your Weaviate instance. + +### Connect to your WCD instance + +To connect to the Weaviate Cloud (WCD) instance, you need to use the cluster URL and the API key. You can find these details in the WCD Console. + +Use the `connectToWeaviateCloud()` function to connect to your WCD instance. + + + +#### Provide inference API keys + +Some Weaviate modules can use inference APIs for vectorizing data or large language model integration. You can provide the API keys for these services to Weaviate at instantiation. + +This course uses VoyageAI, so you can provide the VoyageAI API key to Weaviate through `headers: {"X-VoyageAI-Api-Key": }` as shown below: + + + +:::note What next? +If you have completed this, you can skip the next page [Option 2: A local Weaviate instance](./20_create_docker.mdx) and continue with [Communicate with Weaviate](../30_communicate.mdx). +::: + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx new file mode 100644 index 0000000000..af3632a709 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx @@ -0,0 +1,93 @@ +--- +title: "Option 2: A local Docker instance" +description: "Set up Weaviate with Docker for a quick and customizable local deployment." +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../../_snippets/101_connect.mts'; + +:::note Have you already created a Weaviate instance? +If you have [created a cloud instance](./10_create_wcs.mdx) of Weaviate, you can skip this page and continue with [Communicate with Weaviate](../30_communicate.mdx). +::: + +Here, you will create a Weaviate instance using Docker. + +### Download and run the docker-compose file + +Install Docker on your machine. We recommend following the [official Docker installation guide](https://docs.docker.com/get-docker/). + +Create a new directory and navigate to it in your terminal. Then, create a new file called `docker-compose.yml` and add the following content: + +```yaml +--- +version: '3.4' +services: + weaviate_anon: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 50051:50051 + restart: on-failure:0 + environment: + COHERE_APIKEY: $COHERE_APIKEY + VOYAGEAI_APIKEY: $VOYAGEAI_APIKEY + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + DEFAULT_VECTORIZER_MODULE: 'none' + ENABLE_MODULES: 'text2vec-cohere,multi2vec-voyageai,generative-cohere' + BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' + CLUSTER_HOSTNAME: 'node1' +... +``` + +### Create a Weaviate instance + +Run the following command to start Weaviate: + +```bash +docker compose up -d +``` + +### Your Weaviate instance details + +Once the instance is created, you can access it at `http://localhost:8080`. + +### Connect to your Weaviate instance + +To connect to the Weaviate instance, use the `connectToLocal()` function. + + + +#### Provide inference API keys + +Some Weaviate modules can use inference APIs for vectorizing data or large language model integration. You can provide the API keys for these services to Weaviate at instantiation. + +This course uses VoyageAI, so you can provide the VoyageAI API key to Weaviate through `headers: {"X-VoyageAI-Api-Key": }` as shown below: + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/index.mdx b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/index.mdx new file mode 100644 index 0000000000..53c348780e --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/20_create_instance/index.mdx @@ -0,0 +1,19 @@ +--- +title: Create a Weaviate instance +description: "Create a new Weaviate instance tailored for text data applications." +--- + +For this unit, you can choose to create a Weaviate Cloud (WCD) instance or a local Docker instance. + +- [Create a Weaviate Cloud (WCD) instance](./10_create_wcs.mdx) + - If you want a managed service and don't want to worry about installation and maintenance. +- [Create a local Docker instance](./20_create_docker.mdx) + - If you want to run Weaviate on your local machine, or want to have full control over the installation and maintenance. + +Either option is fine for this course. If you're not sure which to choose, we recommend starting with a WCD instance. + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/101_setup_weaviate/30_communicate.mdx b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/30_communicate.mdx new file mode 100644 index 0000000000..9f190e9a82 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/30_communicate.mdx @@ -0,0 +1,64 @@ +--- +title: Communicate with Weaviate +description: Communication Setup for Multimodal Data +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/101_connect.mts'; + +Here, we'll perform basic operations to communicate with Weaviate using the TypeScript client library. + +### Check Weaviate status + +You can check whether the Weaviate instance is up using the `isLive` function. + + + +### Retrieve server meta information + +You can retrieve meta information about the Weaviate instance using the `getMeta` function. + + + +This will print the server meta information to the console. The output will look similar to the following: + +
+ Example getMeta() output + + +
+ +### Close the connection + +After you have finished using the Weaviate client, you should close the connection. This frees up resources and ensures that the connection is properly closed. + +We suggest using a `try`-`finally` block as a best practice. For brevity, we will not include the `try`-`finally` blocks in the remaining code snippets. + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + \ No newline at end of file diff --git a/developers/academy/js/starter_multimodal_data/101_setup_weaviate/index.mdx b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/index.mdx new file mode 100644 index 0000000000..0c72f66c40 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/101_setup_weaviate/index.mdx @@ -0,0 +1,26 @@ +--- +title: Set up Weaviate +description: Weaviate Setup for Multimodal Data +--- + + + + + + + + +## Learning objectives + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/102_mm_collections/10_preparation.mdx b/developers/academy/js/starter_multimodal_data/102_mm_collections/10_preparation.mdx new file mode 100644 index 0000000000..55ff47bc9d --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/102_mm_collections/10_preparation.mdx @@ -0,0 +1,36 @@ +--- +title: Preparation +--- + +In this section you are going to populate your Weaviate instance with a movie dataset, using the multi-modal, Cohere Embed 3 models to embed the text and image data. + +### Weaviate instance + +Make sure to have your Weaviate instance set up. You should have [created an instance](../101_setup_weaviate/20_create_instance/index.mdx) and be able to connect to it. + +### Source data + +We are going to use a movie dataset sourced from [TMDB](https://www.themoviedb.org/). The dataset can be found in this [GitHub repository](https://raw.githubusercontent.com/weaviate-tutorials/edu-datasets/main/movies_data_1990_2024.json), and it contains bibliographic information on ~700 movies released between 1990 and 2024. + +As a multimodal project, we'll also use [corresponding posters for each movie](https://raw.githubusercontent.com/weaviate-tutorials/edu-datasets/main/movies_data_1990_2024_posters.zip), which are available in the same repository. + +
+ See sample text data + +| | backdrop_path | genre_ids | id | original_language | original_title | overview | popularity | poster_path | release_date | title | video | vote_average | vote_count | +|---:|:---------------------------------|:----------------|-----:|:--------------------|:----------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------:|:---------------------------------|:---------------|:----------------------------|:--------|---------------:|-------------:| +| 0 | /3Nn5BOM1EVw1IYrv6MsbOS6N1Ol.jpg | [14, 18, 10749] | 162 | en | Edward Scissorhands | A small suburban town receives a visit from a castaway unfinished science experiment named Edward. | 45.694 | /1RFIbuW9Z3eN9Oxw2KaQG5DfLmD.jpg | 1990-12-07 | Edward Scissorhands | False | 7.7 | 12305 | +| 1 | /sw7mordbZxgITU877yTpZCud90M.jpg | [18, 80] | 769 | en | GoodFellas | The true story of Henry Hill, a half-Irish, half-Sicilian Brooklyn kid who is adopted by neighbourhood gangsters at an early age and climbs the ranks of a Mafia family under the guidance of Jimmy Conway. | 57.228 | /aKuFiU82s5ISJpGZp7YkIr3kCUd.jpg | 1990-09-12 | GoodFellas | False | 8.5 | 12106 | +| 2 | /6uLhSLXzB1ooJ3522ydrBZ2Hh0W.jpg | [35, 10751] | 771 | en | Home Alone | Eight-year-old Kevin McCallister makes the most of the situation after his family unwittingly leaves him behind when they go on Christmas vacation. But when a pair of bungling burglars set their sights on Kevin's house, the plucky kid stands ready to defend his territory. By planting booby traps galore, adorably mischievous Kevin stands his ground as his frantic mother attempts to race home before Christmas Day. | 3.538 | /onTSipZ8R3bliBdKfPtsDuHTdlL.jpg | 1990-11-16 | Home Alone | False | 7.4 | 10599 | +| 3 | /vKp3NvqBkcjHkCHSGi6EbcP7g4J.jpg | [12, 35, 878] | 196 | en | Back to the Future Part III | The final installment of the Back to the Future trilogy finds Marty digging the trusty DeLorean out of a mineshaft and looking for Doc in the Wild West of 1885. But when their time machine breaks down, the travelers are stranded in a land of spurs. More problems arise when Doc falls for pretty schoolteacher Clara Clayton, and Marty tangles with Buford Tannen. | 28.896 | /crzoVQnMzIrRfHtQw0tLBirNfVg.jpg | 1990-05-25 | Back to the Future Part III | False | 7.5 | 9918 | +| 4 | /3tuWpnCTe14zZZPt6sI1W9ByOXx.jpg | [35, 10749] | 114 | en | Pretty Woman | When a millionaire wheeler-dealer enters a business contract with a Hollywood hooker Vivian Ward, he loses his heart in the bargain. | 97.953 | /hVHUfT801LQATGd26VPzhorIYza.jpg | 1990-03-23 | Pretty Woman | False | 7.5 | 7671 | + +
+ +Next, you will create a corresponding object collection and import the data. + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/102_mm_collections/20_create_collection.mdx b/developers/academy/js/starter_multimodal_data/102_mm_collections/20_create_collection.mdx new file mode 100644 index 0000000000..4b2c6ad9b7 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/102_mm_collections/20_create_collection.mdx @@ -0,0 +1,89 @@ +--- +title: Create a collection +description: Creating Multimodal Data Collections +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/102_collection.mts'; + +Weaviate stores data in "collections". A collection is a set of objects that share the same data structure. In our movie database, we might have a collection of movies, a collection of actors, and a collection of reviews. + +Here we will create a collection of movies. + +## Code + +This example creates a collection for the movie data: + + + +Each collection definition must have a name. Then, you can define additional parameters like we've done in this example. + +## Explain the code + +### Properties + +Properties are the object attributes that you want to store in the collection. Each property has a name and a data type. + +In our movie database, we have properties like `title`, `release_date` and `genre_ids`, with data types like `TEXT` (string), `DATE` (date), or `INT` (integer). It's also possible to have arrays of integers, like we have with `genre_ids`. + +As a multimodal object, we also have the `poster` property which is the image data, which is saved as a `BLOB` (binary large object) data type. + +#### Auto-schema + +Weaviate can automatically [infer the schema](/developers/weaviate/config-refs/schema/index.md#auto-schema) from the data. However, it's a good practice to define the properties explicitly, for better control and to avoid surprises. + +### Vectorizer configuration + +If you do not specify the vector yourself, Weaviate will use a specified vectorizer to generate vector embeddings from your data. + +In this code example, we specify the `multi2vec-voyageai` module. This module uses the **voyage-multimodal-3** model to generate vector embeddings from the text and image data. + +You can specify any number of text and image properties to be used for vectorization, and weight them differently. The weights are used to determine the relative importance of each property in the vector embedding generation process. In this example, we vectorize the `poster` property (an image) with a 90% weight and the `title` property (a string) with a 10% weight. + + + +### Generative configuration + +If you wish to use your collection with a generative model (e.g. a large language model), you must specify the generative module. + +In this code example, we specify the `cohere` module (`generative-cohere` is the full name) with default options. + + + +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +### TypeScript named imports + +The code example makes use of named imports such as `vectorizer` and `configure`. They are defined in the `weaviate` module and are used during the collection definition. + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/102_mm_collections/30_import_data.mdx b/developers/academy/js/starter_multimodal_data/102_mm_collections/30_import_data.mdx new file mode 100644 index 0000000000..3d274c01d0 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/102_mm_collections/30_import_data.mdx @@ -0,0 +1,107 @@ +--- +title: Import data +description: Importing Data into Multimodal Data Collections +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/102_collection.mts'; + +## Code + +This example imports the movie data into our collection. + + + +The code: +- Loads the source text and image data +- Gets the collection +- Loops through the data and: + - Finds corresponding image to the text + - Converts the image to base64 + - Bulk inserts objects in batches of 20 +- Prints out any import errors + +## Explain the code + +### Preparation + +We use the native Node.js `fetch()` to load the data from the source, in this case a JSON file containing text data and a Zip file containing posters. The text data is then converted to a JSON object for easier manipulation and the images are extracted from the Zip file. + +Then, we create a collection object (with `client.collections.get`) so we can interact with the collection. + +### Iterating over data + +The `for` loop is used in conjunction with `Object.keys()` to iterate through the elements in our JSON file. While iterating we increment the counter variable that lets us bulk insert objects in batches. + + + + +### Add data to the Object + +#### Convert data types and build the Object + +The data is converted from a string to the correct data types for Weaviate. For example, the `release_date` is converted to a `Date` object, and the `genre_ids` are converted to a list of integers. + + + +To save the image data as a `BLOB` (binary large object) data type, we convert the image to base64 using the helpful `toBase64FromMedia` utility that comes with the Weaviate client. + + + +After converting data to the correct format, we build the object by its properties preparing it to be inserted into Weaviate. + +#### Bulk insert data + +Then we create on object that includes the uuid generated with `generateUuid5` from Weaviate and the object containing properties we previously define, we push this object to `itemsToInsert` for them to be bulk inserted with `insertMany()` once the batch is ready. + + + +### Error handling + +If you have any errors in your bulk insertion, you want to know something went wrong. That way you can decide how to handle them, such as by raising an exception. In this example, we simply print out that there was an error with the import. + + + +## Where do the vectors come from? + +When sends the items to Weaviate, the objects are added to the collection. In our case, the movie collection. + +Recall that the collection has a vectorizer module, and we do not specify vectors here. So Weaviate uses the specified vectorizer to generate vector embeddings from the data. + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/102_mm_collections/index.mdx b/developers/academy/js/starter_multimodal_data/102_mm_collections/index.mdx new file mode 100644 index 0000000000..5ad92db5a1 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/102_mm_collections/index.mdx @@ -0,0 +1,26 @@ +--- +title: Populate the database +description: Multimodal Data Collections Overview +--- + + + + + + + + +## Learning objectives + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/103_mm_searches/10_multimodal.mdx b/developers/academy/js/starter_multimodal_data/103_mm_searches/10_multimodal.mdx new file mode 100644 index 0000000000..d8c03e94a9 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/103_mm_searches/10_multimodal.mdx @@ -0,0 +1,145 @@ +--- +title: Multimodal search +description: Multimodal Search Methodology +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/103_searches.mts'; + +With Weaviate, you can perform semantic searches to find similar items based on their meaning. This is done by comparing the vector embeddings of the items in the database. + +As we are using a multimodal model, we can search for objects based on their similarity to any of the supported modalities. Meaning that we can search for movies based on their similarity to a text or an image. + +## Image query + +### Code + +This example finds entries in "Movie" based on their similarity to [this image of the International Space Station](https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/International_Space_Station_after_undocking_of_STS-132.jpg/440px-International_Space_Station_after_undocking_of_STS-132.jpg), and prints out the title and release year of the top 5 matches. + +
+ Query image + +![International Space Station](https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/International_Space_Station_after_undocking_of_STS-132.jpg/440px-International_Space_Station_after_undocking_of_STS-132.jpg) + +
+ + + +### Explain the code + +The results are based on similarity of the vector embeddings between the query and the database object. In this case, the vectorizer module generates an embedding of the input image. + +The `limit` parameter here sets the maximum number of results to return. + +The `returnMetadata` parameter takes an array of strings to set metadata to return in the search results. The current query returns the vector distance to the query. + + +
+ Example results + +Posters for the top 5 matches: +Interstellar +Gravity +Arrival +Armageddon +Godzilla + +Weaviate output: + +```text +Interstellar 2014 157336 +Distance to query: 0.354 + +Gravity 2013 49047 +Distance to query: 0.384 + +Arrival 2016 329865 +Distance to query: 0.386 + +Armageddon 1998 95 +Distance to query: 0.400 + +Godzilla 1998 929 +Distance to query: 0.441 +``` + +
+ +### Response object + +The returned object is an instance of a custom class. Its `objects` attribute is a list of search results, each object being an instance of another custom class. + +Each returned object will: +- Include all properties and its UUID by default except those with blob data types. + - Since the `poster` property is a blob, it is not included by default. + - To include the `poster` property, you must specify it and the other properties to fetch in the `returnProperties` parameter. +- Not include any other information (e.g. references, metadata, vectors.) by default. + + +## Text search + +### Code + +This example finds entries in "Movie" based on their similarity to the query "red", and prints out the title and release year of the top 5 matches. + + + +### Explain the code + +The results are based on similarity of the vector embeddings between the query and the database object. In this case, the vectorizer module generates an embedding of the input text. + +The remaining parameters are the same as in the previous example. + +
+ Example results + +Posters for the top 5 matches: +Deadpool 2 +Bloodshot +Deadpool +300 +The Hunt for Red October + +Weaviate output: + +```text +Deadpool 2 2018 383498 +Distance to query: 0.670 + +Bloodshot 2020 338762 +Distance to query: 0.677 + +Deadpool 2016 293660 +Distance to query: 0.678 + +300 2007 1271 +Distance to query: 0.682 + +The Hunt for Red October 1990 1669 +Distance to query: 0.683 +``` + +
+ +### Response object + +The returned object is in the same format as in the previous example. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/103_mm_searches/20_keyword_hybrid.mdx b/developers/academy/js/starter_multimodal_data/103_mm_searches/20_keyword_hybrid.mdx new file mode 100644 index 0000000000..a73e857202 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/103_mm_searches/20_keyword_hybrid.mdx @@ -0,0 +1,105 @@ +--- +title: Keyword & Hybrid search +description: Hybrid Keyword Searches in Multimodal Collections +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/103_searches.mts'; + +You can also perform keyword (BM25) searches to find items based on their keyword similarity, or hybrid searches that combine BM25 and semantic/vector searches. + +## Keyword search + +### Code + +This example finds entries in "Movie" with the highest keyword search scores for the term "history", and prints out the title and release year of the top 5 matches. + + + +### Explain the code + +The results are based on a keyword search score using what's called the [BM25f](https://en.wikipedia.org/wiki/Okapi_BM25) algorithm. + +The `limit` parameter here sets the maximum number of results to return. + +The `returnMetadata` parameter takes an array of strings to set metadata to return in the search results. The current query returns the `score`, which is the BM25 score of the result. + +
+ Example results + +```text +American History X 1998 +BM25 score: 2.707 + +A Beautiful Mind 2001 +BM25 score: 1.896 + +Legends of the Fall 1994 +BM25 score: 1.663 + +Hacksaw Ridge 2016 +BM25 score: 1.554 + +Night at the Museum 2006 +BM25 score: 1.529 +``` + +
+ + +## Hybrid search + +### Code + +This example finds entries in "Movie" with the highest hybrid search scores for the term "history", and prints out the title and release year of the top 5 matches. + + + +### Explain the code + +The results are based on a hybrid search score. A hybrid search blends results of BM25 and semantic/vector searches. + +The `limit` parameter here sets the maximum number of results to return. + +The `returnMetadata` parameter takes an array of strings to set metadata to return in the search results. The current query returns the `score`, which is the hybrid score of the result. + +
+ Example results + +```text +Legends of the Fall 1994 +Hybrid score: 0.016 + +Hacksaw Ridge 2016 +Hybrid score: 0.016 + +A Beautiful Mind 2001 +Hybrid score: 0.015 + +The Butterfly Effect 2004 +Hybrid score: 0.015 + +Night at the Museum 2006 +Hybrid score: 0.012 +``` + +
+ + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/103_mm_searches/30_filters.mdx b/developers/academy/js/starter_multimodal_data/103_mm_searches/30_filters.mdx new file mode 100644 index 0000000000..b9ad7aadd8 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/103_mm_searches/30_filters.mdx @@ -0,0 +1,55 @@ +--- +title: Filters +description: Filters for Multimodal Searches +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/103_searches.mts'; + +Filters can be used to precisely refine search results. You can filter by properties as well as metadata, and you can combine multiple filters with `and` or `or` conditions to further narrow down the results. + +### Code + +This example finds entries in "Movie" based on their similarity to the query "dystopian future", only from those released after 2010. It prints out the title and release year of the top 5 matches. + + + +## Explain the code + +This query is identical to [that shown earlier](./10_multimodal.mdx) for search, but with the addition of a filter. The `filters` parameter makes use of the `filter` namespace to set the filter conditions. The current query filters the results to only include those with a release year after 2010. + +
+ Example results + +```text +Dune 2021 +Distance to query: 0.199 + +Tenet 2020 +Distance to query: 0.200 + +Mission: Impossible - Dead Reckoning Part One 2023 +Distance to query: 0.207 + +Onward 2020 +Distance to query: 0.214 + +Jurassic World Dominion 2022 +Distance to query: 0.216 +``` + +
+ + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/103_mm_searches/index.mdx b/developers/academy/js/starter_multimodal_data/103_mm_searches/index.mdx new file mode 100644 index 0000000000..a12cd26008 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/103_mm_searches/index.mdx @@ -0,0 +1,26 @@ +--- +title: Perform searches +description: Multimodal Searches Overview +--- + + + + + + + + +## Learning objectives + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/104_mm_rag/10_setup.mdx b/developers/academy/js/starter_multimodal_data/104_mm_rag/10_setup.mdx new file mode 100644 index 0000000000..ecd42c2c13 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/104_mm_rag/10_setup.mdx @@ -0,0 +1,40 @@ +--- +title: "RAG: Overview" +description: Setting up Multimodal RAG +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/102_collection.mts'; + +### Motivation + +Retrieval augmented generation (RAG) is a way to combine the best of both worlds: the retrieval capabilities of semantic search and the generation capabilities of AI models such as large language models. This allows you to retrieve objects from a Weaviate instance and then generate outputs based on the retrieved objects. + +### Setup + +When we created a collection, we specified the `generative` parameter as shown here. + + + +This selects a generative module that will be used to generate outputs based on the retrieved objects. In this case, we're using the `cohere` module, and the `command` family of large language models. + +As we did before with the vectorizer module, you will require an API key from the provider of the generative module. In this case, you will need an API key from Cohere. + +### RAG queries + +RAG queries are also called 'generative' queries in Weaviate. You can access these functions through the `generate` submodule of the collection object. + +Each generative query works in addition to the regular search query, and will perform a RAG query on each retrieved object. + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/104_mm_rag/20_single_prompt.mdx b/developers/academy/js/starter_multimodal_data/104_mm_rag/20_single_prompt.mdx new file mode 100644 index 0000000000..5ac9281905 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/104_mm_rag/20_single_prompt.mdx @@ -0,0 +1,57 @@ +--- +title: "'Single prompt' generation" +description: Single Prompt for Multimodal RAG +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/104_rag.mts'; + +A 'single prompt' generation wil perform RAG queries on each retrieved object. This is useful when you want to transform each object separately, with the same prompt. + +### Code + +This example finds entries in "Movie" based on their similarity to [this image of the International Space Station](https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/International_Space_Station_after_undocking_of_STS-132.jpg/440px-International_Space_Station_after_undocking_of_STS-132.jpg). Then, instructs the large language model to translate the title of each movie into French. + +Each of the results are then printed out to the console. + + + +## Explain the code + +You must pass on one or more properties to the `singlePrompt` parameter through braces, as we've done here with `"... {title} ..."`. This will instruct Weaviate to pass on the `title` property from each retrieved object to the large language model. + +
+ Example results + +```text +Interstellar +Interstellaire +Gravity +Gravité +Arrival +Arrivée +Armageddon +Armageddon +Godzilla +Godzilla +``` + +
+ +### Response object + +Each response object is similar to that from a regular search query, with an additional `generated` attribute. This attribute will contain the generated output for each object. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/104_mm_rag/30_grouped_task.mdx b/developers/academy/js/starter_multimodal_data/104_mm_rag/30_grouped_task.mdx new file mode 100644 index 0000000000..2bee636b35 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/104_mm_rag/30_grouped_task.mdx @@ -0,0 +1,60 @@ +--- +title: "'Grouped task' generation" +description: Grouped Task for Multimodal RAG +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TSCode from '!!raw-loader!../_snippets/104_rag.mts'; + +A 'grouped task' generation wil perform RAG queries on the set of retrieved objects. This is useful when you want to transform the set of objects as a whole, with one prompt. + +### Code + +This example finds entries in "MovieMM" based on their similarity to [this image of the International Space Station](https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/International_Space_Station_after_undocking_of_STS-132.jpg/440px-International_Space_Station_after_undocking_of_STS-132.jpg). Then, instructs the large language model to find commonalities between them. + +Each of the results are then printed out to the console. + + + +## Explain the code + +For `groupedTask` queries, you simply pass on the prompt to the `groupedTask` parameter. This will instruct Weaviate to pass on the: +- text properties from all retrieved objects, and +- the prompt + +to the large language model. + +
+ Example results + +```text +Interstellar +Gravity +Arrival +Armageddon +Godzilla +These movies all involve space exploration, extraterrestrial beings, or catastrophic events threatening Earth. They all deal with themes of survival, human ingenuity, and the unknown mysteries of the universe. +``` + +
+ +### Optional parameters + +You can also pass on a list of properties to be used, as the `groupedProperties` parameter. This can be useful to reduce the amount of data passed on to the large language model and omit irrelevant properties. + +### Response object + +A RAG query with the `groupedTask` parameter will return a response with an additional `generated` attribute. This attribute will contain the generated output for the set of objects. + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/104_mm_rag/index.mdx b/developers/academy/js/starter_multimodal_data/104_mm_rag/index.mdx new file mode 100644 index 0000000000..6ff1328176 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/104_mm_rag/index.mdx @@ -0,0 +1,26 @@ +--- +title: LLMs and Weaviate (RAG) +description: Multimodal Retrieval-Augmented Generation (RAG) Overview +--- + + + + + + + + +## Learning objectives + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/900_next_steps.mdx b/developers/academy/js/starter_multimodal_data/900_next_steps.mdx new file mode 100644 index 0000000000..0ae0708103 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/900_next_steps.mdx @@ -0,0 +1,7 @@ +--- +title: Next steps +--- + +import IntroNextSteps from '../_snippets/intro_next_steps_js.mdx'; + + diff --git a/developers/academy/js/starter_multimodal_data/_snippets/101_connect.mts b/developers/academy/js/starter_multimodal_data/_snippets/101_connect.mts new file mode 100644 index 0000000000..d6a5742e2a --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/_snippets/101_connect.mts @@ -0,0 +1,171 @@ +// DockerInstantiation // WCDInstantiation // WCDAPIKeyInstantiation // DockerInstantiation // DockerAPIKeyInstantiation // TryFinallyCloseDemo +import weaviate, { WeaviateClient } from "weaviate-client"; +let client: WeaviateClient; +// END DockerInstantiation // END WCDInstantiation // END WCDAPIKeyInstantiation // END DockerInstantiation // END DockerAPIKeyInstantiation // END TryFinallyCloseDemo + + +// WCDInstantiation + +client = await weaviate.connectToWeaviateCloud( + process.env.WCD_URL as string, { + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), +}) + +// END WCDInstantiation + +client.close() + +// WCDAPIKeyInstantiation + +client = await weaviate.connectToWeaviateCloud( + process.env.WCD_URL as string, { + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string, // Replace with your inference API key + } +}) +// END WCDAPIKeyInstantiation + +client.close() + +// DockerInstantiation + +client = await weaviate.connectToLocal() +// END DockerInstantiation + +client.close() + +// DockerAPIKeyInstantiation + +client = await weaviate.connectToLocal({ + host: '...', + headers: { + 'X-VoyageAI-Api-Key': process.env.VOYAGEAI_APIKEY as string, // Replace with your inference API key + } +}) +// END DockerAPIKeyInstantiation + +// PollLiveness +if (await client.isLive()) { + // Run operations with the client if it is live +} +// END PollLiveness + + +// GetMeta +console.log(await client.getMeta()) +// END GetMeta + + +const outputString = +// OutputGetMeta +{ + hostname: 'http://[::]:8080', + modules: { + 'backup-gcs': { + bucketName: 'weaviate-wcs-prod-cust-europe-west3-workloads-backups', + rootName: '55a78146-dae1-4609-90ce-556db01f4a61' + }, + 'generative-anyscale': { + documentationHref: 'https://docs.anyscale.com/endpoints/overview', + name: 'Generative Search - Anyscale' + }, + 'generative-aws': { + documentationHref: 'https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html', + name: 'Generative Search - AWS' + }, + 'generative-cohere': { + documentationHref: 'https://docs.cohere.com/reference/chat', + name: 'Generative Search - Cohere' + }, + 'generative-mistral': { + documentationHref: 'https://docs.mistral.ai/api/', + name: 'Generative Search - Mistral' + }, + 'generative-openai': { + documentationHref: 'https://platform.openai.com/docs/api-reference/completions', + name: 'Generative Search - OpenAI' + }, + 'generative-google': { + documentationHref: 'https://cloud.google.com/vertex-ai/docs/generative-ai/chat/test-chat-prompts', + name: 'Generative Search - Google' + }, + 'multi2vec-google': { + documentationHref: 'https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-multimodal-embeddings', + name: 'Google Multimodal Module' + }, + 'qna-openai': { + documentationHref: 'https://platform.openai.com/docs/api-reference/completions', + name: 'OpenAI Question & Answering Module' + }, + 'ref2vec-centroid': {}, + 'reranker-cohere': { + documentationHref: 'https://txt.cohere.com/rerank/', + name: 'Reranker - Cohere' + }, + 'reranker-voyageai': { + documentationHref: 'https://docs.voyageai.com/reference/reranker-api', + name: 'Reranker - VoyageAI' + }, + 'text2vec-aws': { + documentationHref: 'https://docs.aws.amazon.com/bedrock/latest/userguide/titan-embedding-models.html', + name: 'AWS Module' + }, + 'text2vec-cohere': { + documentationHref: 'https://docs.cohere.ai/embedding-wiki/', + name: 'Cohere Module' + }, + 'text2vec-huggingface': { + documentationHref: 'https://huggingface.co/docs/api-inference/detailed_parameters#feature-extraction-task', + name: 'Hugging Face Module' + }, + 'text2vec-jinaai': { + documentationHref: 'https://jina.ai/embeddings/', + name: 'JinaAI Module' + }, + 'text2vec-openai': { + documentationHref: 'https://platform.openai.com/docs/guides/embeddings/what-are-embeddings', + name: 'OpenAI Module' + }, + 'text2vec-google': { + documentationHref: 'https://cloud.google.com/vertex-ai/docs/generative-ai/embeddings/get-text-embeddings', + name: 'Google Module' + }, + 'text2vec-voyageai': { + documentationHref: 'https://docs.voyageai.com/docs/embeddings', + name: 'VoyageAI Module' + } + }, + version: '1.25.5' +} +// END OutputGetMeta + + + +client.close() + +client = await weaviate.connectToWeaviateCloud( + process.env.WCD_URL as string, + { + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string, // Replace with your inference API key + } + } +) + +// TryFinallyCloseDemo + +// Instantiate your client (not shown). e.g.: +// client = weaviate.connectToWeaviateCloud(...) or +// client = weaviate.connectToLocal(...) + +try { + if (await client.isLive()) { + // Work with the client here + // ... + } +} finally { // This will always be executed, even if an exception is raised + client.close() // Close the connection & release resources +} +// END TryFinallyCloseDemo diff --git a/developers/academy/js/starter_multimodal_data/_snippets/102_collection.mts b/developers/academy/js/starter_multimodal_data/_snippets/102_collection.mts new file mode 100644 index 0000000000..a01ca6f2d0 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/_snippets/102_collection.mts @@ -0,0 +1,210 @@ +import { promises as fs } from 'fs'; +import { join } from 'path'; +import AdmZip from 'adm-zip'; +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; +import 'dotenv/config' + +// CreateMovieCollection // SubmoduleImport // BatchImportData +import weaviate from "weaviate-client"; +// END BatchImportData // END CreateMovieCollection // END SubmoduleImport +// CreateMovieCollection // SubmoduleImport +import { WeaviateClient, configure, vectorizer, toBase64FromMedia } from "weaviate-client"; +// END CreateMovieCollection // END SubmoduleImport + + +// BatchImportData +import { generateUuid5 } from "weaviate-client"; + +// END BatchImportData + +// BatchImportData +let client: WeaviateClient; +// CreateMovieCollection // END BatchImportData + +// END CreateMovieCollection + +const wcdURL = process.env.WCD_URL as string; +const wcdApikey = process.env.WCD_API_KEY as string; +const cohereApiKey = process.env.COHERE_API_KEY as string; +const voyageApiKey = process.env.VOYAGEAI_API_KEY as string; + + + +// client = await weaviate.connectToWeaviateCloud(wcdURL, { +// authCredentials: new weaviate.ApiKey(wcdApikey), +// } +// ) +// CreateMovieCollection +// Instantiate your client (not shown). e.g.: +// const requestHeaders = {'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string,} +// client = weaviate.connectToWeaviateCloud(..., headers: requestHeaders) or +// client = weaviate.connectToLocal(..., headers: requestHeaders) + +// END CreateMovieCollection + +const requestHeaders = { 'X-VoyageAI-Api-Key': voyageApiKey, + 'X-Cohere-Api-Key': cohereApiKey + } + + +client = await weaviate.connectToWeaviateCloud(wcdURL, { + authCredentials: new weaviate.ApiKey(wcdApikey), + headers: requestHeaders +} +) +// END CreateMovieCollection + +// Actual instantiation + +client.collections.delete("Movie") + +// CreateMovieCollection +await client.collections.create({ + name: "Movie", + properties: [ + { name: "title", dataType: configure.dataType.TEXT }, + { name: "overview", dataType: configure.dataType.TEXT }, + { name: "vote_average", dataType: configure.dataType.NUMBER }, + { name: "genre_ids", dataType: configure.dataType.INT_ARRAY }, + { name: "release_date", dataType: configure.dataType.DATE }, + { name: "tmdb_id", dataType: configure.dataType.INT }, + { name: "poster", dataType: configure.dataType.BLOB } + ], + // Define the vectorizer module + vectorizers: vectorizer.multi2VecVoyageAI({ + imageFields: [{ name: "poster", weight: 0.9 }], + textFields: [{ name: "title", weight: 0.1 }], + model: "voyage-multimodal-3" + }), + // Define the generative module + generative: configure.generative.cohere(), + // END generativeDefinition // CreateMovieCollection +}) + +client.close() +// END CreateMovieCollection + +const weaviateURL = process.env.WCD_URL as string +const weaviateKey = process.env.WCD_API_KEY as string +const cohereKey = process.env.COHERE_API_KEY as string +const voyageaiKey = process.env.VOYAGEAI_API_KEY as string + +client = await weaviate.connectToWeaviateCloud(weaviateURL, { + authCredentials: new weaviate.ApiKey(weaviateKey), + headers: { + 'X-VoyageAI-Api-Key': voyageaiKey, // Replace with your inference API key + 'X-Cohere-Api-Key': cohereKey, // Replace with your inference API key + } +}) + +// BatchImportData + +// Instantiate your client (not shown). e.g.: +// client = weaviate.connectToWeaviateCloud(...) or +// client = weaviate.connectToLocal(...) + +// END BatchImportData + +// BatchImportData +const dataUrl = "https://raw.githubusercontent.com/weaviate-tutorials/edu-datasets/main/movies_data_1990_2024.json" +const textResponse = await fetch(dataUrl) +const data = await textResponse.json() + +// Get current file's directory +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const imgDir = join(__dirname, "images"); + + +// Create directory if it doesn't exist +await fs.mkdir(imgDir, { recursive: true }); + +// Download images +const postersUrl = "https://raw.githubusercontent.com/weaviate-tutorials/edu-datasets/main/movies_data_1990_2024_posters.zip"; +const postersPath = join(imgDir, "movies_data_1990_2024_posters.zip"); + +const response = await fetch(postersUrl); +if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); +} +const arrayBuffer = await response.arrayBuffer(); +const buffer = Buffer.from(arrayBuffer); + +// Write the zip file +await fs.writeFile(postersPath, buffer); + +// Unzip the files +const zip = new AdmZip(postersPath); +zip.extractAllTo(imgDir, true); + +// Get the collection +const movies = client.collections.get("Movie") + +// Set a counter and initialize Weaviate Object +let itemsToInsert: Object[] = [] +let counter = 0; + +// Iterate through data +for (const key of Object.keys(data['title'])) { + + counter++; + if (counter % 20 == 0) + console.log(`Import: ${counter}`) + // END Iterate through data // END BatchImportData + // BatchImportData + + let genreIds: [] + + // Format genre_ids and release_date + const parsedArray = JSON.parse(data['genre_ids'][key]); + genreIds = parsedArray.map((item: string) => parseInt(item, 10)); + let releaseDate = new Date(data['release_date'][key]) + + const imgPath = join(imgDir, `${data['id'][key]}_poster.jpg`) + // Convert poster to base64 + const posterBase64 = await toBase64FromMedia(imgPath) + + // Build the object payload + let movieObject = { + title: data['title'][key], + overview: data['overview'][key], + vote_average: data['vote_average'][key], + genre_ids: genreIds, + release_date: releaseDate, + tmdb_id: data['id'][key], + poster: posterBase64 + } + // Insert + let objectToInsert = { + properties: movieObject, + uuid: generateUuid5(data['title'][key]) + } + + // Add object to batching array + itemsToInsert.push(objectToInsert) + + if (itemsToInsert.length == 20) { + try { + const response = await movies.data.insertMany(itemsToInsert); + // END Insert + // Handle Errors // Insert + if (response.hasErrors) { + throw new Error("Error in batch import!"); + } + // END Insert // END Handle Errors + // Insert + console.log(`Successfully imported batch of ${itemsToInsert.length} items`); + itemsToInsert = []; + } catch (error) { + console.error('Error importing batch:', error); + } + } + // END BatchImportData // END Insert + // BatchImportData // Iterate through data + // ... other operations +} + + +client.close() +// END BatchImportData diff --git a/developers/academy/js/starter_multimodal_data/_snippets/103_searches.mts b/developers/academy/js/starter_multimodal_data/_snippets/103_searches.mts new file mode 100644 index 0000000000..6578521635 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/_snippets/103_searches.mts @@ -0,0 +1,154 @@ +import 'dotenv/config' +// START-ANY +import weaviate, { WeaviateClient, WeaviateReturn } from "weaviate-client"; +let client: WeaviateClient; +let response: WeaviateReturn +// END-ANY + +client = await weaviate.connectToWeaviateCloud(process.env.WCD_URL as string,{ + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string, // Replace with your inference API key + 'X-Cohere-Api-Key': process.env.COHERE_API_KEY as string, // Replace with your inference API key + + } + } +) + +// START-ANY + +// Instantiate your client (not shown). e.g.: +// const requestHeaders = {'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string,} +// client = weaviate.connectToWeaviateCloud(..., headers: requestHeaders) or +// client = weaviate.connectToLocal(..., headers: requestHeaders) + +async function urlToBase64(imageUrl: string) { + const response = await fetch(imageUrl); + const arrayBuffer = await response.arrayBuffer(); + const content = Buffer.from(arrayBuffer); + return content.toString('base64'); +} +// END-ANY + +// MetadataMultimodalSearch // SinglePromptGeneration // MetadataSemanticSearch // MetadataBM25Search // MetadataHybridSearch // FilteredSemanticSearch + +// Get the collection +const movies = client.collections.get("Movie") + +// Perform query +const srcImgPath = "https://github.com/weaviate-tutorials/edu-datasets/blob/main/img/International_Space_Station_after_undocking_of_STS-132.jpg?raw=true" +const queryB64 = await urlToBase64(srcImgPath) +// END MetadataMultimodalSearch // END SinglePromptGeneration // END MetadataSemanticSearch // END MetadataBM25Search // END MetadataHybridSearch // END FilteredSemanticSearch + +// MetadataMultimodalSearch + +response = await movies.query.nearImage(queryB64, { + limit: 5, + returnMetadata: ['distance'], + returnProperties: ["title", "tmdb_id", "release_date", "poster"] + }, +) + +// Inspect the response +for (let item of response.objects) { + // Print the title and release year (note the release date is a datetime object) + console.log(`${item.properties.title} - ${item.properties.release_date}`) + // Print the distance of the object from the query + console.log(`Distance to query: ${item.metadata?.distance}`) +} + +client.close() +// END MetadataMultimodalSearch + +console.log("\n\n") + + +// MetadataSemanticSearch +response = await movies.query.nearText("red", { + limit: 5, + returnMetadata: ['distance'], + returnProperties: ["title", "tmdb_id", "release_date"] + }, +) + +// Inspect the response +for (let item of response.objects) { + // Print the title and release year (note the release date is a datetime object) + console.log(`${item.properties.title} - ${item.properties.release_date}`) + // Print the distance of the object from the query + console.log(`Distance to query: ${item.metadata?.distance}`) +} + +client.close() +// END MetadataSemanticSearch + +// MetadataBM25Search + +response = await movies.query.bm25("history", { + limit: 5, + returnMetadata: ['score'], +}, +) + +// Inspect the response +for (let item of response.objects) { + // Print the title and release year (note the release date is a datetime object) + console.log(`${item.properties.title} - ${item.properties.release_date}`) + // Print the distance of the object from the query + console.log(`BM25 score: ${item.metadata?.score}`) +} + +client.close() +// END MetadataBM25Search + + +console.log("\n\n") + +// client.connect() + +// MetadataHybridSearch + +response = await movies.query.hybrid("history", { + limit: 5, + returnMetadata: ['score'], + returnProperties: ["title", "tmdb_id", "release_date"] +}, +) + +// Inspect the response +for (let item of response.objects) { + // Print the title and release year (note the release date is a datetime object) + console.log(`${item.properties.title} - ${item.properties.release_date}`) + // Print the hybrid score of the object from the query + console.log(`Hybrid score: ${item.metadata?.score}`) +} + +client.close() +// END MetadataHybridSearch + + +console.log("\n\n") + +// client.connect() + +// FilteredSemanticSearch + +const filterTime = new Date(2010, 1, 1) + +response = await movies.query.nearText("dystopian future", { + limit: 5, + returnMetadata: ['distance'], + filters: movies.filter.byProperty("release_date").greaterThan(filterTime) + } +) + +// Inspect the response +for (let item of response.objects) { + // Print the title and release year (note the release date is a datetime object) + console.log(`${item.properties.title} - ${item.properties.release_date}`) + // Print the distance of the object from the query + console.log(`Distance to query: ${item.metadata?.distance}`) +} + +client.close() +// END FilteredSemanticSearch diff --git a/developers/academy/js/starter_multimodal_data/_snippets/104_rag.mts b/developers/academy/js/starter_multimodal_data/_snippets/104_rag.mts new file mode 100644 index 0000000000..0b353ec6cb --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/_snippets/104_rag.mts @@ -0,0 +1,88 @@ +import 'dotenv/config' +// START-ANY +import weaviate, { GenerativeReturn, WeaviateClient } from "weaviate-client"; +let client: WeaviateClient; +let response: GenerativeReturn +// END-ANY + +client = await weaviate.connectToWeaviateCloud( + process.env.WCD_URL as string, + { + authCredentials: new weaviate.ApiKey(process.env.WCD_API_KEY as string), + headers: { + 'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string, // Replace with your inference API key + } + } +) + +// START-ANY + +// Instantiate your client (not shown). e.g.: +// const requestHeaders = {'X-VoyageAI-Api-Key': process.env.VOYAGEAI_API_KEY as string,} +// client = weaviate.connectToWeaviateCloud(..., headers: requestHeaders) or +// client = weaviate.connectToLocal(..., headers: requestHeaders) + +async function urlToBase64(imageUrl: string) { + const response = await fetch(imageUrl); + const arrayBuffer = await response.arrayBuffer(); + const content = Buffer.from(arrayBuffer); + return content.toString('base64'); +} + +// END-ANY + +// SinglePromptGeneration // GroupedTaskGeneration +// Get the collection +const movies = client.collections.get("Movie") + +// Perform query +const srcImgPath = "https://github.com/weaviate-tutorials/edu-datasets/blob/main/img/International_Space_Station_after_undocking_of_STS-132.jpg?raw=true" +const queryB64 = await urlToBase64(srcImgPath) +// END SinglePromptGeneration // END GroupedTaskGeneration + +// SinglePromptGeneration + +response = await movies.generate.nearMedia(queryB64, "image",{ + // highlight-start + singlePrompt: "Translate this into French: {title}" + // highlight-end + }, { + limit: 5 +}) + +// Inspect the response +for (let item of response.objects) { + console.log(item.properties.title) + console.log(item.generated) +} + +client.close() +// END SinglePromptGeneration + + +console.log("\n\n") + + +// GroupedTaskGeneration + +response = await movies.generate.nearMedia(queryB64, "image",{ + // highlight-start + groupedTask: "What do these movies have in common?", + groupedProperties: ["title", "overview"] // Optional parameter; for reducing prompt length + // highlight-end + },{ + limit: 5 + } +) + +// Inspect the response +for (let item of response.objects) { + console.log('Title: ', item.properties.title) // Print the title +} + +// highlight-start +console.log(response.generated) // Print the generated text (the commonalities between them) +// highlight-end + +client.close() +// END GroupedTaskGeneration diff --git a/developers/academy/js/starter_multimodal_data/index.md b/developers/academy/js/starter_multimodal_data/index.md new file mode 100644 index 0000000000..77910e5500 --- /dev/null +++ b/developers/academy/js/starter_multimodal_data/index.md @@ -0,0 +1,24 @@ +--- +title: "101M Work with: Multimodal data" +description: Learn to handle multimodal data in Weaviate for diverse data integrations. +sidebar_position: 102 +--- + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; +import CourseUnits from '/src/components/Academy/courseUnits.jsx'; +import { courseData } from '/src/components/Academy/courseData.js' + +## Course overview + +In this project-based course, you will learn how to work with multimodal data using Weaviate and a movie dataset. + +You will get hands-on experience on how to store and index text and image data to be searchable together by meaning, using Weaviate's vectorization capabilities. You will learn how to search through that data using multimodal search methods, as well as filters. You will also learn how to use Weaviate's retrieval augmented generation (RAG) capabilities to generate outputs based on the retrieved objects. + +## Learning objectives + + + +## Units + + + diff --git a/developers/academy/js/starter_text_data/101_setup_weaviate/10_client.mdx b/developers/academy/js/starter_text_data/101_setup_weaviate/10_client.mdx index 6100fbdec5..6dae251540 100644 --- a/developers/academy/js/starter_text_data/101_setup_weaviate/10_client.mdx +++ b/developers/academy/js/starter_text_data/101_setup_weaviate/10_client.mdx @@ -1,5 +1,6 @@ --- title: Weaviate JavaScript/Typescript client +description: "Configure the Weaviate JavaScript client for efficient data access and management." --- ## Installation diff --git a/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx b/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx index d7519274f3..4ffe0e09e4 100644 --- a/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx +++ b/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/10_create_wcs.mdx @@ -1,5 +1,6 @@ --- title: "Option 1: A cloud WCD instance" +description: "Create a Weaviate instance on WCS for scalable, cloud-based data projects." --- import Tabs from '@theme/Tabs'; diff --git a/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx b/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx index f50debcd5e..9ff2ee84d6 100644 --- a/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx +++ b/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx @@ -1,5 +1,6 @@ --- title: "Option 2: A local Docker instance" +description: "Set up Weaviate with Docker for a quick and customizable local deployment." --- import Tabs from '@theme/Tabs'; @@ -37,12 +38,10 @@ services: - 50051:50051 restart: on-failure:0 environment: - OPENAI_APIKEY: $OPENAI_APIKEY QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' - ENABLE_MODULES: 'text2vec-cohere,text2vec-huggingface,text2vec-openai,generative-openai,generative-cohere' + ENABLE_API_BASED_MODULES: 'true' BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' CLUSTER_HOSTNAME: 'node1' ... diff --git a/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/index.mdx b/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/index.mdx index 03f6dce85d..53c348780e 100644 --- a/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/index.mdx +++ b/developers/academy/js/starter_text_data/101_setup_weaviate/20_create_instance/index.mdx @@ -1,5 +1,6 @@ --- title: Create a Weaviate instance +description: "Create a new Weaviate instance tailored for text data applications." --- For this unit, you can choose to create a Weaviate Cloud (WCD) instance or a local Docker instance. diff --git a/developers/academy/js/starter_text_data/101_setup_weaviate/index.mdx b/developers/academy/js/starter_text_data/101_setup_weaviate/index.mdx index b8a67e42a5..95c249881b 100644 --- a/developers/academy/js/starter_text_data/101_setup_weaviate/index.mdx +++ b/developers/academy/js/starter_text_data/101_setup_weaviate/index.mdx @@ -1,10 +1,9 @@ --- title: Set up Weaviate +description: "Learn to set up Weaviate for text data projects, including environment setup and configuration." --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Overview - :::warning TODO diff --git a/developers/academy/py/zero_to_mvp/index.md b/developers/academy/py/zero_to_mvp/index.md index 04b9c732d9..8d7839a5dd 100644 --- a/developers/academy/py/zero_to_mvp/index.md +++ b/developers/academy/py/zero_to_mvp/index.md @@ -1,5 +1,6 @@ --- title: (v3) Zero to MVP +description: Build a Weaviate MVP from scratch, covering setup, data queries, and schema. --- import LearningGoals from '/src/components/Academy/learningGoals.jsx'; diff --git a/developers/academy/py/zero_to_mvp/setup.mdx b/developers/academy/py/zero_to_mvp/setup.mdx index 8936e07cfa..635fe18dff 100644 --- a/developers/academy/py/zero_to_mvp/setup.mdx +++ b/developers/academy/py/zero_to_mvp/setup.mdx @@ -1,5 +1,6 @@ --- title: P3_101A Weaviate Academy Preparation +description: Set up Weaviate from scratch and start building your first project. sidebar_position: 101.5 --- diff --git a/developers/academy/theory/101_hello_weaviate/10_intro_weaviate.mdx b/developers/academy/theory/101_hello_weaviate/10_intro_weaviate.mdx index 65035ae2d4..f1f745efde 100644 --- a/developers/academy/theory/101_hello_weaviate/10_intro_weaviate.mdx +++ b/developers/academy/theory/101_hello_weaviate/10_intro_weaviate.mdx @@ -1,5 +1,6 @@ --- title: Introduction to Weaviate +description: Introduction to Weaviate Theory --- ## What is Weaviate? diff --git a/developers/academy/theory/101_hello_weaviate/15_overview_vectors.mdx b/developers/academy/theory/101_hello_weaviate/15_overview_vectors.mdx index b23b404860..a481262728 100644 --- a/developers/academy/theory/101_hello_weaviate/15_overview_vectors.mdx +++ b/developers/academy/theory/101_hello_weaviate/15_overview_vectors.mdx @@ -1,5 +1,6 @@ --- title: Vectors - An overview +description: Vector Concepts in Weaviate Theory --- ## What is a vector? @@ -9,7 +10,7 @@ import ReactPlayer from 'react-player/lazy'
-We've covered that Weaviate is a vector database, and that a vector search is similarity-based. But, what is a vector? +We've covered that Weaviate is a [vector database](/blog/what-is-a-vector-database), and that a vector search is similarity-based. But, what is a vector? A vector in this context is just a series of numbers like `[1, 0]` or `[0.513, 0.155, 0.983, ..., 0.001, 0.932]`. Vectors like these are used to capture meaning. diff --git a/developers/academy/theory/101_hello_weaviate/20_examples_1.mdx b/developers/academy/theory/101_hello_weaviate/20_examples_1.mdx index f14cfe0b5f..92a26378e3 100644 --- a/developers/academy/theory/101_hello_weaviate/20_examples_1.mdx +++ b/developers/academy/theory/101_hello_weaviate/20_examples_1.mdx @@ -1,5 +1,6 @@ --- title: Examples 1 - Queries +description: Hello Weaviate Theory - Examples Part 1 --- ## Vectors in action diff --git a/developers/academy/theory/101_hello_weaviate/25_examples_2.mdx b/developers/academy/theory/101_hello_weaviate/25_examples_2.mdx index c232c1b656..50c39d899f 100644 --- a/developers/academy/theory/101_hello_weaviate/25_examples_2.mdx +++ b/developers/academy/theory/101_hello_weaviate/25_examples_2.mdx @@ -1,5 +1,6 @@ --- title: Examples 2 - More than search +description: Hello Weaviate Theory - Examples Part 2 sidebar_position: 25 --- diff --git a/developers/academy/theory/101_hello_weaviate/index.mdx b/developers/academy/theory/101_hello_weaviate/index.mdx index def1827785..8015e0a6fe 100644 --- a/developers/academy/theory/101_hello_weaviate/index.mdx +++ b/developers/academy/theory/101_hello_weaviate/index.mdx @@ -1,5 +1,6 @@ --- title: 101 Hello, Weaviate +description: A basic introduction to Weaviate and its data management capabilities. sidebar_position: 101 # Like a subject number (e.g. CS101) --- diff --git a/developers/academy/theory/150_search_types/_index.md b/developers/academy/theory/150_search_types/_index.md new file mode 100644 index 0000000000..59fc513592 --- /dev/null +++ b/developers/academy/theory/150_search_types/_index.md @@ -0,0 +1,27 @@ +--- +title: 150 Search Types +description: An introduction to different search types in Weaviate +sidebar_position: 150 # Like a subject number (e.g. CS101) +--- + +## Unit overview + +### Prerequisites + +- None + +## Learning objectives + +import LearningGoalsExp from '/src/components/Academy/learningGoalsExp.mdx'; + + + +import LearningGoals from '/src/components/Academy/learningGoals.jsx'; + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/academy/theory/150_search_types/_notes.md b/developers/academy/theory/150_search_types/_notes.md new file mode 100644 index 0000000000..2528b659ac --- /dev/null +++ b/developers/academy/theory/150_search_types/_notes.md @@ -0,0 +1,52 @@ +### Vector embeddings + +Vector embeddings are numerical representations of objects in a high-dimensional space. These vectors are generated by a model trained to represent the objects in a way that captures their semantic meaning. + +A vector embedding may look like: + +```json +[0, 1, 0, 0, 1] +``` + +or like: + +```json +[0.158, 0.011, 0.840, 0.577, 0.897, ..., 0.144] +``` + +A vector embedding may be typically between 300 and 2048 dimensions, although the exact number varies depending on the model. The longer the vector, the more information it can capture about the object. On the other hand, they require more resources to store, index and search. + +Vector embeddings that are produced by the same model are said to be "compatible", or that they are "in the same vector space". + +:::tip Analog: Vector embeddings as language +An intuitive way to think of vector embeddings is as a language. Just as two people must speak the same language to communicate, two vectors must be in the same vector space to be compared. If two vectors are not in the same vector space, their values are meaningless when compared, even if they are the same length. +::: + +## Vector distance + +Vector distance indicates how close, or far apart, two vectors are in high-dimensional space. This is a measure of the object's "semantic" similarity to the query, based on their vector embeddings. + +In a simple example, consider colors "SkyBlue", "LightSteelBlue", and "DarkOrange". These colors can be represented as vectors in a 3D space, with the RGB values as the vector components. + +| Color | Vector (R,G,B) | +|----------------|-----------------| +| SkyBlue | (135, 206, 235) | +| LightSteelBlue | (176, 196, 222) | +| DarkOrange | (255, 140, 0) | + +The vectors for "SkyBlue" and "LightSteelBlue" are much closer to each other than either is to "DarkOrange", reflecting their similarity as light blue colors versus an orange color. + +If you search a vector database containing vectors for "SkyBlue" and "DarkOrange" with a query vector for "LightSteelBlue", the search would return "SkyBlue" as the closest match. + +Vector search for far more complex objects, such as text, images, or audio, is based on the same principle. The vectors are generated by a model trained to represent the objects in a high-dimensional space, where the distance between vectors reflects the similarity between the objects. + +### Distance and search quality + +All compatible vectors are similar to some degree search will have some "top" search results, even if the query is not similar to any objects in the dataset. + +If you search a vector database containing vectors for colors "Red", "Crimson" and "LightCoral" with a query vector for "SkyBlue", the search will still return a result (e.g. "Red"), even if it is not semantically similar to the query. The search is simply returning the closest match, even if it is not a good match in the absolute sense. + +To ensure that the search results are meaningful, consider the following strategies: + +- **Use a threshold**: Set a minimum similarity score for the results. This will exclude results that are not similar enough to the query. +- **Apply filters**: Use [filters](../filtering.md) to exclude results based on other criteria, such as metadata or properties. diff --git a/developers/academy/theory/index.md b/developers/academy/theory/index.md index 168d94d62f..2ba11fa238 100644 --- a/developers/academy/theory/index.md +++ b/developers/academy/theory/index.md @@ -1,5 +1,6 @@ --- title: Hello, Weaviate +description: Explore Weaviate theory, from data structure basics to advanced concepts. --- import LearningGoals from '/src/components/Academy/learningGoals.jsx'; diff --git a/developers/contributor-guide/getting-started/commit-guidelines.md b/developers/contributor-guide/getting-started/commit-guidelines.md index a07d2ba6b9..2ea9bd2b11 100644 --- a/developers/contributor-guide/getting-started/commit-guidelines.md +++ b/developers/contributor-guide/getting-started/commit-guidelines.md @@ -1,5 +1,6 @@ --- title: Commit Guidelines +description: Commit Guidelines for Contributing to Weaviate sidebar_position: 7 image: og/contributor-guide/getting-started.jpg # tags: ['contributor-guide'] diff --git a/developers/contributor-guide/getting-started/git-and-github.md b/developers/contributor-guide/getting-started/git-and-github.md index b1dc8e940a..0bdd9ec34b 100644 --- a/developers/contributor-guide/getting-started/git-and-github.md +++ b/developers/contributor-guide/getting-started/git-and-github.md @@ -1,5 +1,6 @@ --- title: Git and GitHub guide +description: Git and GitHub Guide for Weaviate sidebar_position: 6 image: og/contributor-guide/getting-started.jpg # tags: ['contributor-guide'] diff --git a/developers/contributor-guide/getting-started/improving-docs.md b/developers/contributor-guide/getting-started/improving-docs.md index 2d3a42a9dc..c06d2b1ff1 100644 --- a/developers/contributor-guide/getting-started/improving-docs.md +++ b/developers/contributor-guide/getting-started/improving-docs.md @@ -1,5 +1,6 @@ --- title: Improving Documentation +description: Improving Documentation for Weaviate sidebar_position: 4 image: og/contributor-guide/getting-started.jpg # tags: ['contributor-guide'] diff --git a/developers/contributor-guide/getting-started/index.md b/developers/contributor-guide/getting-started/index.md index f979192cac..9f3e93f364 100644 --- a/developers/contributor-guide/getting-started/index.md +++ b/developers/contributor-guide/getting-started/index.md @@ -1,5 +1,6 @@ --- title: Getting Started +description: Getting Started with Contributing to Weaviate sidebar_position: 0 image: og/contributor-guide/getting-started.jpg # tags: ['contributor-guide'] diff --git a/developers/contributor-guide/weaviate-core/parsing-cross-refs.md b/developers/contributor-guide/weaviate-core/parsing-cross-refs.md index a06bc6c5a2..57c18de754 100644 --- a/developers/contributor-guide/weaviate-core/parsing-cross-refs.md +++ b/developers/contributor-guide/weaviate-core/parsing-cross-refs.md @@ -1,12 +1,11 @@ --- title: Parsing Objects & Resolving References +description: Guide to parsing cross-references in Weaviate core for data linking. sidebar_position: 5 image: og/contributor-guide/weaviate-core.jpg # tags: ['contributor-guide'] --- -## Overview - Objects are parsed twice: * First, closest to disk, immediately after reading-in the byte blob, all @@ -75,4 +74,4 @@ import ContributorGuideMoreResources from '/_includes/more-resources-contributor import DocsFeedback from '/_includes/docs-feedback.mdx'; - \ No newline at end of file + diff --git a/developers/integrations/data-platforms/airbyte/index.md b/developers/integrations/data-platforms/airbyte/index.md new file mode 100644 index 0000000000..6821c514d0 --- /dev/null +++ b/developers/integrations/data-platforms/airbyte/index.md @@ -0,0 +1,22 @@ +--- +title: Airbyte +sidebar_position: 1 +--- +[Airbyte](https://airbyte.com/) is an open-source data integration engine that helps you consolidate your data in your data warehouses, lakes and databases. You can use Airbyte to ingest data into Weaviate. + + +## Airbyte and Weaviate + +Weaviate is a supported [destination connector](https://airbyte.com/connectors/weaviate) in Airbyte. You can set up a source connector to extract data and import it into Weaviate using Airbyte. + +## Our Resources +The resources are broken into two categories: +[**Hands on Learning**](#hands-on-learning): Build your technical understanding with end-to-end tutorials. + +### Hands on Learning + +| Topic | Description | Resource | +| --- | --- | --- | +| Unleash to Weaviate | Load data from Unleash into Weaviate | [Tutorial](https://airbyte.com/how-to-sync/unleash-to-weaviate) | +| Airtable to Weaviate | Sync data from Airtable into Weaviate | [Tutorial](https://airbyte.com/how-to-sync/airtable-to-weaviate) | +| Monday to Weaviate | Load your data in Monday into Weaviate within minutes. | [Tutorial](https://airbyte.com/how-to-sync/monday-to-weaviate) | diff --git a/developers/integrations/data-platforms/astronomer/index.md b/developers/integrations/data-platforms/astronomer/index.md new file mode 100644 index 0000000000..1b5521cb73 --- /dev/null +++ b/developers/integrations/data-platforms/astronomer/index.md @@ -0,0 +1,23 @@ +--- +title: Astronomer +sidebar_position: 1 +--- +[Astronomer’s Astro](https://www.astronomer.io/) is a fully managed platform built on top of Apache Airflow. It simplifies the management of Airflow at scale and data ingestion into Weaviate. + + +## Astronomer and Weaviate +The [Weaviate Airflow provider](https://www.astronomer.io/docs/learn/airflow-weaviate) offers modules to easily integrate Weaviate with Airflow. + +Create and run a DAG to ingest data into Weaviate. + +## Our Resources +The resources are broken into two categories: + +[**Hands on Learning**](#hands-on-learning): Build your technical understanding with end-to-end tutorials. + +### Hands on Learning + +| Topic | Description | Resource | +| --- | --- | --- | +| Orchestrate Weaviate operations with Apache Airflow | Use Airflow to ingest movie descriptions into Weaviate and query the collection. | [Tutorial](https://www.astronomer.io/docs/learn/airflow-weaviate) | + \ No newline at end of file diff --git a/developers/integrations/data-platforms/ibm/index.md b/developers/integrations/data-platforms/ibm/index.md new file mode 100644 index 0000000000..71f0b19b51 --- /dev/null +++ b/developers/integrations/data-platforms/ibm/index.md @@ -0,0 +1,20 @@ +--- +title: IBM +sidebar_position: 5 +image: og/integrations/home.jpg +--- + +[IBM](https://www.ibm.com/us-en) offers a variety of solutions for building generative AI applications and other use cases. + +## IBM and Weaviate +[Docling](https://github.com/DS4SD/docling) is an open-source project built by the IBM Deep Search team. It enables developers to parse and export documents and ingest it into a Weaviate collection. + +## Our Resources +[**Hands on Learning**](#hands-on-learning): Build your technical understanding with end-to-end tutorials. + + +### Hands on Learning + +| Topic | Description | Resource | +| --- | --- | --- | +| Performing RAG over PDFs with Weaviate and Docling | This notebook shows you how to perform RAG over PDF documents parsed by Docling | [Notebook](https://github.com/weaviate/recipes/blob/main/integrations/data-platforms/ibm/docling/rag_over_pdfs_docling_weaviate.ipynb) | \ No newline at end of file diff --git a/developers/integrations/data-platforms/index.md b/developers/integrations/data-platforms/index.md index b48d6b6b57..1ebd955d04 100644 --- a/developers/integrations/data-platforms/index.md +++ b/developers/integrations/data-platforms/index.md @@ -7,9 +7,12 @@ image: og/integrations/home.jpg Data Platforms offer robust solutions for managing, processing, and analyzing large volumes of data. These platforms provide tools and services that facilitate seamless data ingestion directly into Weaviate. Learn about how Weaviate integrates with these solutions: +* [Airbyte](/developers/integrations/data-platforms/airbyte/) * [Aryn](/developers/integrations/data-platforms/aryn/) +* [Astronomer](/developers/integrations/data-platforms/astronomer/) * [Confluent Cloud](/developers/integrations/data-platforms/confluent-cloud) * [Context Data](/developers/integrations/data-platforms/context-data/) * [Databricks](/developers/integrations/data-platforms/databricks/) * [Firecrawl](/developers/integrations/data-platforms/firecrawl/) +* [IBM](/developers/integrations/data-platforms/ibm/) * [Unstructured](/developers/integrations/data-platforms/unstructured) diff --git a/developers/integrations/index.md b/developers/integrations/index.md index a8ad331e37..296498981c 100644 --- a/developers/integrations/index.md +++ b/developers/integrations/index.md @@ -32,7 +32,7 @@ The ecosystem is divided into these categories: |------------------|-----------| | Cloud Hyperscalers | [AWS](/developers/integrations/cloud-hyperscalers/aws), [Google](/developers/integrations/cloud-hyperscalers/google)| | Compute Infrastructure | [Modal](/developers/integrations/compute-infrastructure/modal), [Replicate](/developers/integrations/compute-infrastructure/replicate) | -| Data Platforms |[Aryn](/developers/integrations/data-platforms/aryn/), [Confluent Cloud](/developers/integrations/data-platforms/confluent-cloud), [Context Data](/developers/integrations/data-platforms/context-data/), [Databricks](/developers/integrations/data-platforms/databricks/), [Firecrawl](/developers/integrations/data-platforms/firecrawl), [Unstructured](/developers/integrations/data-platforms/unstructured) | +| Data Platforms |[Airbyte](/developers/integrations/data-platforms/airbyte), [Aryn](/developers/integrations/data-platforms/aryn/), [Confluent Cloud](/developers/integrations/data-platforms/confluent-cloud), [Astronomer](/developers/integrations/data-platforms/astronomer), [Context Data](/developers/integrations/data-platforms/context-data/), [Databricks](/developers/integrations/data-platforms/databricks/), [Firecrawl](/developers/integrations/data-platforms/firecrawl), [IBM](/developers/integrations/data-platforms/ibm/), [Unstructured](/developers/integrations/data-platforms/unstructured) | | LLM Frameworks | [Composio](/developers/integrations/llm-frameworks/composio/), [DSPy](/developers/integrations/llm-frameworks/dspy/), [Haystack](/developers/integrations/llm-frameworks/haystack/), [LangChain](/developers/integrations/llm-frameworks/langchain/), [LlamaIndex](/developers/integrations/llm-frameworks/llamaindex/), [Semantic Kernel](/developers/integrations/llm-frameworks/semantic-kernel/) | | Operations | [Arize](/developers/integrations/operations/arize/), [Langtrace](/developers/integrations/operations/langtrace/), [LangWatch](/developers/integrations/operations/langwatch/), [Nomic](/developers/integrations/operations/nomic/), [Ragas](/developers/integrations/operations/ragas/), [Weights & Biases](/developers/integrations/operations/wandb/) | diff --git a/developers/wcs/cluster-status.mdx b/developers/wcs/cluster-status.mdx index 69cf675fa1..7bfb17b782 100644 --- a/developers/wcs/cluster-status.mdx +++ b/developers/wcs/cluster-status.mdx @@ -34,6 +34,19 @@ import APIOutputs from '/_includes/rest/node-endpoint-info.mdx'; +## Enabled modules + +Each Weaviate instance has a set of enabled modules. This list will vary depending on the instance, due to the Weaviate version and WCD policies. + +To see the list of enabled modules on a WCD instance, go to the WCD console, click on `Clusters`, select the cluster you want to check, and scroll to the `modules active` section. + +import ClusterStatusModules from '/developers/wcs/img/cluster-status.modules.png'; + +
+ See the list of available modules + Available modules on your WCD instance +
+ ## Support import SupportAndTrouble from '/_includes/wcs/support-and-troubleshoot.mdx'; diff --git a/developers/wcs/embeddings/_category_.json b/developers/wcs/embeddings/_category_.json new file mode 100644 index 0000000000..b990d12e1b --- /dev/null +++ b/developers/wcs/embeddings/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Weaviate Embeddings", + "position": 80 +} diff --git a/developers/wcs/embeddings/index.md b/developers/wcs/embeddings/index.md new file mode 100644 index 0000000000..c87e5334c9 --- /dev/null +++ b/developers/wcs/embeddings/index.md @@ -0,0 +1,293 @@ +--- +title: Weaviate Embeddings +sidebar_position: 200 +image: og/wcs/user_guides.jpg +--- + +Weaviate Embeddings provides secure, scalable embedding generation as a fully managed service. + +Weaviate Embeddings integrates with Weaviate Cloud instances to generate, store, and search embeddings without managing infrastructure. + +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'primaryColor': '#4a5568', + 'primaryTextColor': '#2d3748', + 'primaryBorderColor': '#718096', + 'lineColor': '#718096', + 'secondaryColor': '#f7fafc', + 'tertiaryColor': '#edf2f7', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'fontSize': '14px', + 'lineHeight': '1.4', + 'nodeBorder': '1px', + 'mainBkg': '#ffffff', + 'clusterBkg': '#f8fafc' + } +}}%% + +flowchart LR + %% Style definitions + classDef systemBox fill:#f8fafc,stroke:#3182ce,stroke-width:1.5px,color:#2d3748,font-weight:bold + classDef weaviateBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef cloudBox fill:white,stroke:#48bb78,stroke-width:2px,color:#553c9a,font-weight:bold + classDef providerBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef component fill:white,stroke:#a0aec0,stroke-width:1px,color:#2d3748 + classDef edgeLabel fill:white,stroke:#e2e8f0,stroke-width:1px,color:#4a5568 + + %% Weaviate Cloud container + subgraph cloud["☁️ Weaviate Cloud"] + %% Weaviate Embeddings section + subgraph provider["Weaviate\nEmbeddings"] + inference["🤖 Inference\nAPI"] + end + + %% Weaviate section + subgraph weaviate["Weaviate Cloud instance"] + vectorizer["🔌 Weaviate Embeddings\nIntegration"] + core["💾 Data &\nvector store"] + end + end + + %% User System + subgraph user["🖥️ User System"] + data["📄 Data"] + end + + %% Connections with curved edges + data --->|"1. Insert\nobjects"| core + core --->|"2. Request\nvector"| vectorizer + vectorizer --->|"3. Request\nvector"| inference + inference --->|"4. Vector"| vectorizer + vectorizer --->|"5. Vector"| core + + %% Apply styles + class user systemBox + class weaviate weaviateBox + class cloud cloudBox + class provider providerBox + class data,core,vectorizer,inference component + + %% Linkstyle for curved edges + linkStyle default stroke:#718096,stroke-width:3px,fill:none,background-color:white +``` + +With Weaviate Embeddings, you can generate embeddings for your data and queries directly from a Weaviate Cloud database instance. + +This means you can perform semantic, vector and hybrid searches without the need to externally generate vector embeddings, or manage additional model providers. + +Weaviate Embeddings is fully integrated with Weaviate Cloud, so you can manage your data and embeddings in one place. + +:::info Weaviate Embeddings is in technical preview +Weaviate Embeddings is in technical preview. This means that the service is still in development and may have limited functionality. +
+ +During the technical preview, you can use Weaviate Embeddings for free. However, the service may be subject to change. +
+ +To try out Weaviate Embeddings, please [contact us](https://events.weaviate.io/embeddings-preview) to request access. +::: + +### Key Features + +Weaviate Embeddings offers a fully managed service for embedding generation that is integrated with Weaviate Cloud instances. + +- **Single authentication**: Your Weaviate Cloud credentials are used for authorization and access to Weaviate Embeddings. +- **Unified billing**: Your billing and usage can be managed in one place through Weaviate Cloud. +- **Model selection**: Choose from our hand-picked selection of embedding models to generate embeddings that suit your use case. + +### Availability + +Weaviate Embeddings is a part of Weaviate Cloud, and available for Weaviate Cloud instances. It is currently not available for open-source Weaviate users. + +## Service Details + +### Models + +The following models are available for use with Weaviate Embeddings: + +- `arctic-embed-m-v1.5` (default) + - A 109M parameter, 768-dimensional model for enterprise retrieval tasks in English. + - Trained with Matryoshka Representation Learning to allow vector truncation with minimal loss. + - Quantization-friendly: Using scalar quantization and 256 dimensions provides 99% of unquantized, full-precision performance. + - Read more at the [Snowflake blog](https://www.snowflake.com/engineering-blog/arctic-embed-m-v1-5-enterprise-retrieval/), and the Hugging Face [model card](https://huggingface.co/Snowflake/snowflake-arctic-embed-m-v1.5) + - Allowable `dimensions`: 768 (default), 256 + +Additional models will be added in the future. + +:::info Input truncation +Currently, input exceeding the model's context windows is truncated from the right (i.e. the end of the input). +::: + +### Parameters + +- `model` (optional): The name of the model to use for embedding generation. +- `dimensions` (optional): The number of dimensions to use for the generated embeddings. Only available for models that support Matryoshka Representation Learning. +- `base_url` (optional): The base URL for the Weaviate Embeddings service. (Not required in most cases.) + +### Rate Limits + +Weaviate Embeddings does not impose rate limits on requests. + +### Pricing and Billing + +During the technical preview, Weaviate Embeddings is free to use. + +Pricing and billing details will be provided in the future. + +### Data Privacy + +Weaviate Embeddings is a stateless service that does not store any data. + +The data provided to Weaviate Embeddings is used solely for the purpose of generating embeddings. + +We do not store or use your data for any other purpose, including training or model improvement. + +#### Service and Data Location + +Weaviate Embeddings makes use of infrastructure located in the United States. Note that by using Weaviate Embeddings, you are agreeing to have your data transferred to the United States for processing. + +We may expand the service to other regions in the future. + +### Administration + +Weaviate Embeddings can be enabled from the Weaviate Cloud console, at the organization level. + +![How to enable Weaviate Embeddings on the console](../img/enable_weaviate_embeddings.png) + +Once enabled, all clusters within the organization can access Weaviate Embeddings. + +Authentication is managed through your existing Weaviate Cloud API key. + +## Get Started + +### Prerequisites + +To use Weaviate Embeddings, you need a Weaviate Cloud account, and a Weaviate Cloud Serverless instance. If you do not have an account, you can sign up for free at the [Weaviate Cloud console](https://console.weaviate.cloud/). + +To use Weaviate Embeddings, you need: + +- A Weaviate Cloud instance running at least Weaviate `1.27.6` +- A Weaviate client library that supports Weaviate Embeddings: + - Python client version `4.9.5` or higher + - JavaScript/TypeScript client version `3.2.5` or higher + - Go/Java clients are not yet officially supported; you must pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation as shown below. + +### Usage + +To use Weaviate Embeddings, log into the Weaviate Cloud console, and enable the Weaviate Embeddings service for your organization. + +![How to enable Weaviate Embeddings on the console](../img/enable_weaviate_embeddings.png) + +Once the service is enabled, you can use Weaviate Embeddings to generate embeddings for your data and queries. + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyConnect from '!!raw-loader!/developers/weaviate/model-providers/_includes/provider.connect.weaviate.py'; +import TSConnect from '!!raw-loader!/developers/weaviate/model-providers/_includes/provider.connect.weaviate.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect-weaviate-embeddings/main.go'; +import JavaConnect from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ConnectWeaviateEmbeddings.java'; +import PyCode from '!!raw-loader!/developers/weaviate/model-providers/_includes/provider.vectorizer.py'; +import TSCode from '!!raw-loader!/developers/weaviate/model-providers/_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageWeaviateTextEmbeddings.java'; + +### Connect to Weaviate + +Your Weaviate Cloud credentials will be used to authorize your Weaviate Cloud instance's access for Weaviate Embeddings. + + + + + + + + + + + + + + + + + + + + + +## Configure the vectorizer + +[Configure a Weaviate index](/developers/weaviate/manage-data/collections#specify-a-vectorizer) as follows to use a Weaviate Embeddings model: + + + + + + + + + + + + + + + + + + + + +Once your collection is configured, you can start using Weaviate Embeddings to generate embeddings for your data and queries. + +Refer to the [Model Provider Integrations page](/developers/weaviate/model-providers/weaviate/embeddings) for further examples, on: +- [How to use custom parameters](/developers/weaviate/model-providers/weaviate/embeddings#vectorizer-parameters) +- [Import data](/developers/weaviate/model-providers/weaviate/embeddings#data-import) +- [Perform searches](/developers/weaviate/model-providers/weaviate/embeddings#searches) + +## Additional Resources + +- [Model provider integrations: Weaviate Embeddings](/developers/weaviate/model-providers/weaviate/embeddings) diff --git a/developers/wcs/img/cluster-status.modules.png b/developers/wcs/img/cluster-status.modules.png new file mode 100644 index 0000000000..fd07c7fcb5 Binary files /dev/null and b/developers/wcs/img/cluster-status.modules.png differ diff --git a/developers/wcs/img/enable_weaviate_embeddings.png b/developers/wcs/img/enable_weaviate_embeddings.png new file mode 100644 index 0000000000..74796a3f08 Binary files /dev/null and b/developers/wcs/img/enable_weaviate_embeddings.png differ diff --git a/developers/wcs/index.mdx b/developers/wcs/index.mdx index b28a5a8464..150433b5ee 100644 --- a/developers/wcs/index.mdx +++ b/developers/wcs/index.mdx @@ -1,5 +1,6 @@ --- title: Weaviate Cloud +description: Weaviate Cloud Services Overview sidebar_position: 0 image: og/wcs/overview.jpg --- diff --git a/developers/wcs/sandbox.mdx b/developers/wcs/sandbox.mdx index 6f7f0df687..ef5a025b82 100644 --- a/developers/wcs/sandbox.mdx +++ b/developers/wcs/sandbox.mdx @@ -81,7 +81,7 @@ To export your collection definitions, follow these steps: text={PyCodeV3} startMarker="# START ReadAllCollections" endMarker="# END ReadAllCollections" - language="py" + language="pyv3" />
@@ -90,7 +90,7 @@ To export your collection definitions, follow these steps: text={TSCode} startMarker="// START ReadAllCollections" endMarker="// END ReadAllCollections" - language="ts" + language="tsv2" /> @@ -157,7 +157,7 @@ Refer to the exported schema to recreate the property definitions.

text={PyCodeV3} startMarker="# START CreateCollectionWithProperties" endMarker="# END CreateCollectionWithProperties" - language="py" + language="pyv3" /> @@ -166,7 +166,7 @@ Refer to the exported schema to recreate the property definitions.

text={TSCode} startMarker="// START CreateCollectionWithProperties" endMarker="// END CreateCollectionWithProperties" - language="ts" + language="tsv2" /> @@ -189,4 +189,4 @@ Sandboxes can be extended three times. Each extension is for an additional 14 da import SupportAndTrouble from '/_includes/wcs/support-and-troubleshoot.mdx'; - \ No newline at end of file + diff --git a/developers/weaviate/api/graphql/additional-operators.md b/developers/weaviate/api/graphql/additional-operators.md index 700295fd45..7c6c8aa352 100644 --- a/developers/weaviate/api/graphql/additional-operators.md +++ b/developers/weaviate/api/graphql/additional-operators.md @@ -179,7 +179,7 @@ Sample client code: text={AutocutPyCodeV3} startMarker="# START Autocut Python" endMarker="# END Autocut Python" - language="py" + language="pyv3" /> @@ -188,7 +188,7 @@ Sample client code: text={AutocutTSCode} startMarker="// START Autocut" endMarker="// END Autocut" - language="ts" + language="tsv2" /> @@ -341,7 +341,7 @@ The sort function takes either an object, or an array of objects, that describe text={PyCodeV3} startMarker="# START Sorting Python" endMarker="# END Sorting Python" - language="py" + language="pyv3" /> @@ -350,7 +350,7 @@ The sort function takes either an object, or an array of objects, that describe text={TSCode} startMarker="// START Sorting" endMarker="// END Sorting" - language="ts" + language="tsv2" /> @@ -442,7 +442,7 @@ To sort by more than one property, pass an array of { `path`, `order` } objects text={PyCodeV3} startMarker="# START MultiplePropSorting Python" endMarker="# END MultiplePropSorting Python" - language="py" + language="pyv3" /> @@ -451,7 +451,7 @@ To sort by more than one property, pass an array of { `path`, `order` } objects text={TSCode} startMarker="// START MultiplePropSorting" endMarker="// END MultiplePropSorting" - language="ts" + language="tsv2" /> @@ -518,7 +518,7 @@ To sort with metadata, add an underscore to the property name. text={PyCodeV3} startMarker="# START AdditionalPropSorting Python" endMarker="# END AdditionalPropSorting Python" - language="py" + language="pyv3" /> @@ -527,7 +527,7 @@ To sort with metadata, add an underscore to the property name. text={TSCode} startMarker="// START AdditionalPropSorting" endMarker="// END AdditionalPropSorting" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/api/graphql/additional-properties.md b/developers/weaviate/api/graphql/additional-properties.md index b969fb7ee0..9e079e91dc 100644 --- a/developers/weaviate/api/graphql/additional-properties.md +++ b/developers/weaviate/api/graphql/additional-properties.md @@ -1,5 +1,6 @@ --- title: Additional properties (metadata) +description: Use additional properties in Weaviate's GraphQL API for enriched query results. sidebar_position: 45 image: og/docs/api.jpg # tags: ['graphql', 'additional properties', 'additional', 'metadata'] @@ -10,8 +11,6 @@ import TryEduDemo from '/_includes/try-on-edu-demo.mdx'; -## Overview - Various 'additional properties', also called 'metadata', can be retrieved in queries. ### Available additional properties diff --git a/developers/weaviate/api/graphql/aggregate.md b/developers/weaviate/api/graphql/aggregate.md index ae007cd3ed..f0050179a2 100644 --- a/developers/weaviate/api/graphql/aggregate.md +++ b/developers/weaviate/api/graphql/aggregate.md @@ -146,7 +146,7 @@ As such, this `Aggregate` query will retrieve the total object count in a class. ### groupBy argument -You can use a groupBy argument to get meta information about groups of data objects. +You can use a groupBy argument to get meta information about groups of data objects, from those matching a query. The groups can be based on a property of the data objects. import GroupbyLimitations from '/_includes/groupby-limitations.mdx'; diff --git a/developers/weaviate/api/graphql/explore.md b/developers/weaviate/api/graphql/explore.md index 37477e2b73..592e039e7c 100644 --- a/developers/weaviate/api/graphql/explore.md +++ b/developers/weaviate/api/graphql/explore.md @@ -14,8 +14,6 @@ As a result, `Explore` is not available on [Weaviate Cloud (WCD)](https://consol ::: -## Overview - Use `Explore` to perform vector searches across multiple collections. Note that `Explore` is currently not available in the gRPC API. ### Requirements diff --git a/developers/weaviate/api/graphql/filters.md b/developers/weaviate/api/graphql/filters.md index 58039406fa..768767f4f6 100644 --- a/developers/weaviate/api/graphql/filters.md +++ b/developers/weaviate/api/graphql/filters.md @@ -1,5 +1,6 @@ --- title: Conditional filters +description: Apply filters in Weaviate's GraphQL API to refine search and data queries. sidebar_position: 35 image: og/docs/api.jpg # tags: ['graphql', 'filters'] @@ -10,8 +11,6 @@ import TryEduDemo from '/_includes/try-on-edu-demo.mdx'; -## Overview - Conditional filters may be added to queries such as [`Object-level`](./get.md) and [`Aggregate`](./aggregate.md) queries, as well as [batch deletion](../../manage-data/delete.mdx#delete-multiple-objects). The operator used for filtering is also called a `where` filter. A filter may consist of one or more conditions, which are combined using the `And` or `Or` operators. Each condition consists of a property path, an operator, and a value. diff --git a/developers/weaviate/api/graphql/get.md b/developers/weaviate/api/graphql/get.md index f3f8b1d057..412fcd8981 100644 --- a/developers/weaviate/api/graphql/get.md +++ b/developers/weaviate/api/graphql/get.md @@ -1,5 +1,6 @@ --- title: Object-level queries (Get) +description: Fetch data from Weaviate with GraphQL's get queries for efficient retrieval. sidebar_position: 10 image: og/docs/api.jpg # tags: ['graphql', 'get{}'] @@ -11,8 +12,6 @@ import TryEduDemo from '/_includes/try-on-edu-demo.mdx'; -## Overview - This page covers object-level query functions. They are collectively referred to as `Get` queries within. diff --git a/developers/weaviate/api/graphql/search-operators.md b/developers/weaviate/api/graphql/search-operators.md index 3f6e754b40..ada5384d6e 100644 --- a/developers/weaviate/api/graphql/search-operators.md +++ b/developers/weaviate/api/graphql/search-operators.md @@ -1,5 +1,6 @@ --- title: Search operators +description: Leverage search operators in Weaviate's GraphQL API for targeted data retrieval. sidebar_position: 20 image: og/docs/api.jpg # tags: ['graphql', 'search operators'] @@ -10,9 +11,6 @@ import TryEduDemo from '/_includes/try-on-edu-demo.mdx'; - -## Overview - This page covers the search operators that can be used in queries, such as vector search operators (`nearText`, `nearVector`, `nearObject`, etc), keyword search operator (`bm25`), hybrid search operator (`hybrid`). Only one search operator can be added to queries on the collection level. diff --git a/developers/weaviate/api/grpc.md b/developers/weaviate/api/grpc.md index 1ce5d2c3d6..e9d3d58c54 100644 --- a/developers/weaviate/api/grpc.md +++ b/developers/weaviate/api/grpc.md @@ -1,12 +1,11 @@ --- title: gRPC +description: Integrate gRPC API with Weaviate for efficient data access. sidebar_position: 5 image: og/docs/api.jpg # tags: ['schema'] --- -## Overview - Starting with Weaviate `v1.19.0`, a gRPC interface has been progressively added to Weaviate. gRPC is a high-performance, open-source universal RPC framework that is contract-based and can be used in any environment. It is based on HTTP/2 and Protocol Buffers, and is therefore very fast and efficient. As of Weaviate `v1.23.7`, the gRPC interface is considered stable. The latest (`v4`) Weaviate Python client library supports gRPC, and the other client libraries will follow. diff --git a/developers/weaviate/api/index.md b/developers/weaviate/api/index.md index d61715dae6..7e7b82c53d 100644 --- a/developers/weaviate/api/index.md +++ b/developers/weaviate/api/index.md @@ -1,5 +1,6 @@ --- title: Reference - API +description: Weaviate API Documentation sidebar_position: 0 image: og/docs/api.jpg # tags: ['schema'] @@ -15,8 +16,6 @@ image: og/docs/api.jpg - [Concepts: Interface](../concepts/interface.md) ::: -## Overview - This section includes references for the RESTful and GraphQL APIs. RESTful API end-points can be used to add data or obtain information about the Weaviate instance, and the GraphQL interface to retrieve data. ### References - Search diff --git a/developers/weaviate/benchmarks/ann.md b/developers/weaviate/benchmarks/ann.md index f21865f310..5f3705ff90 100644 --- a/developers/weaviate/benchmarks/ann.md +++ b/developers/weaviate/benchmarks/ann.md @@ -8,15 +8,15 @@ image: og/docs/benchmarks.jpg import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import ThemedImage from '@theme/ThemedImage'; + +import BenchmarkGrid from '@site/src/components/Documentation/BenchmarkGrid'; + # ANN Benchmark This vector database benchmark is designed to measure and illustrate Weaviate's Approximate Nearest Neighbor (ANN) performance for a range of real-life use cases. -:::note -This is not a comparative benchmark that runs Weaviate against competing vector database solutions.

-To discuss trade-offs with other solutions, [contact sales](https://weaviate.io/pricing#contact-sales). -::: - To make the most of this vector database benchmark, you can look at it from different perspectives: - **The overall performance** – Review the [benchmark results](#benchmark-results) to draw conclusions about what to expect from Weaviate in a production setting. @@ -48,11 +48,11 @@ Add a note about how many runs there were. Or, if there's only one run because o For each set of parameters, we've run 10,000 requests, and we measured the following metrics: -- The **Recall@1**, **Recall@10**, **Recall@100** - by comparing Weaviate's results to the ground truths specified in each dataset. +- The **Recall@10** and **Recall@100** - by comparing Weaviate's results to the ground truths specified in each dataset. - **Multi-threaded Queries per Second (QPS)** - The overall throughput you can achieve with each configuration. - **Individual Request Latency (mean)** - The mean latency over all 10,000 requests. -- **P99 Latency** - 99% of all requests (9,900 out of 10,000) have a latency that is lower than or equal to this number – this shows how fast +- **P99 Latency** - 99% of all requests (9,900 out of 10,000) have a latency that is lower than or equal to this number - **Import time** - Since varying build parameters has an effect on import time, the import time is also included. By request, we mean: @@ -84,107 +84,148 @@ This section contains datasets modeled after the [ANN Benchmarks](https://github | **Dataset** | **Number of Objects** | **Vector Dimensions** | **[Distance metric](https://weaviate.io/blog/distance-metrics-in-vector-search)** | **Use case** | | --- | --- | --- | --- | --- | -| [SIFT1M](http://corpus-texmex.irisa.fr/) | 1 M | 128 | Euclidean | This dataset reflects a common use case with a small number of objects. | -| [Glove-25](https://nlp.stanford.edu/projects/glove/) | 1.28 M | 25 | Cosine | Because of the smaller vectors, Weaviate can achieve the highest throughput on this dataset. | -| [Deep Image 96](https://sites.skoltech.ru/compvision/noimi/) | 10 M | 96 | Cosine | This dataset gives a good indication of expected speed and throughput when datasets grow. It is about 10 times larger than SIFT1M, but the throughput is only slightly lower. | -| [GIST 960](http://corpus-texmex.irisa.fr/) | 1 M | 960 | Euclidean | This dataset highlights the cost of high-dimensional vector comparisons. It has the lowest throughput of the sample datasets. Use this one if you run high-dimensional loads. | +| [SIFT1M](http://corpus-texmex.irisa.fr/) | 1 M | 128 | l2-squared | SIFT is a common ANN test dataset generated from image data | +| [DBPedia OpenAI](https://huggingface.co/datasets/mteb/dbpedia) | 1 M | 1536 | cosine | DBPedia dataset from MTEB embedded with OpenAI's ada002 model | +| [MSMARCO Snowflake](https://huggingface.co/datasets/Snowflake/mteb-retrieval-snowflake-arctic-embed-m-v1.5) | 8.8 M | 768 | l2-squared | MSMARCO dataset embedded with Snowflake's Arctic Embed M v1.5 model | +| [Sphere DPR](https://weaviate.io/blog/sphere-dataset-in-weaviate) | 10 M | 768 | dot | Meta's Sphere dataset (10M sample) | #### Benchmark Datasets These are the results for each dataset: - - -#### QPS vs Recall for SIFT1M - -![SIFT1M Benchmark results](./img/benchmark_sift_128.png) - -import AnnSift128 from '/_includes/ann-sift-128.mdx'; - - - -import AnnReadResultsTable from '/_includes/ann-read-results-table.mdx'; + + +#### QPS vs Recall for DBPedia OpenAI + + + + + + + + + + + -#### Recommended configuration for SIFT1M -import RecommendedConfig from '/_includes/ann-recommended-config.mdx'; - +#### Recommended configuration for DBPedia OpenAI ada002 | `efConstruction` | `maxConnections` | `ef` | **Recall@10** | **QPS (Limit 10)** | **Mean Latency (Limit 10**) | **p99 Latency (Limit 10)** | | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 128 | 32 | 64 | 98.83% | 8905 | 3.31ms | 4.49ms | - +| 256 | 16 | 96 | 97.24% | 5639 | 2.80ms | 4.43ms | - - -#### QPS vs Recall for Glove-25 + -![Glove25 Benchmark results](./img/benchmark_glove_25.png) +#### QPS vs Recall for SIFT1M -import AnnGlove25 from '/_includes/ann-glove-25.mdx'; + + + + + + + + + + - +import AnnReadResultsTable from '/_includes/ann-read-results-table.mdx'; -#### Recommended configuration for Glove-25 +#### Recommended configuration for SIFT1M +import RecommendedConfig from '/_includes/ann-recommended-config.mdx'; + | `efConstruction` | `maxConnections` | `ef` | **Recall@10** | **QPS (Limit 10)** | **Mean Latency (Limit 10**) | **p99 Latency (Limit 10)** | | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 64 | 16 | 64 | 95.56% | 15003 | 1.93ms | 2.94ms | +| 256 | 32 | 64 | 98.35% | 10940 | 1.44ms | 3.13ms | - - -#### QPS vs Recall for Deep Image 96 - -![Deep Image 96 Benchmark results](./img/benchmark_deepimage_96.png) - -import AnnDeep96 from '/_includes/ann-deep-96.mdx'; - - + + + +#### QPS vs Recall for MSMARCO Snowflake + + + + + + + + + + + -#### Recommended configuration for Deep Image 96 +#### Recommended configuration for MSMARCO Snowflake | `efConstruction` | `maxConnections` | `ef` | **Recall@10** | **QPS (Limit 10)** | **Mean Latency (Limit 10**) | **p99 Latency (Limit 10)** | | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 128 | 32 | 64 | 96.43% | 6112 | 4.7ms | 15.87ms | +| 384 | 32 | 48 | 97.36% | 7363 | 2.15ms | 3.69ms | - - -#### QPS vs Recall for GIST 960 - -![GIST 960 Benchmark results](./img/benchmark_gist_960.png) - -import AnnGist960 from '/_includes/ann-gist-960.mdx'; - - + + +#### QPS vs Recall for Sphere DPR + + + + + + + + + + + -#### Recommended configuration for GIST 960 +#### Recommended configuration for Sphere DPR | `efConstruction` | `maxConnections` | `ef` | **Recall@10** | **QPS (Limit 10)** | **Mean Latency (Limit 10**) | **p99 Latency (Limit 10)** | | ----- | ----- | ----- | ----- | ----- | ----- | ----- | -| 512 | 32 | 128 | 94.14% | 1935 | 15.05ms | 19.86ms | +| 384 | 32 | 96 | 96.06% | 3523 | 4.49ms | 7.73ms | - - - ## Benchmark Setup ### Scripts @@ -195,12 +236,11 @@ This benchmark is [open source](https://github.com/weaviate/weaviate-benchmarkin ![Setup with Weaviate and benchmark machine](/img/docs/weaviate_benchmark_setup.png) -This benchmark test uses two GCP instances within the same VPC: +This benchmark test uses one GCP instances to run both Weaviate and the Benchmark scripts: -* **Benchmark** – a `c2-standard-30` instance with 30 vCPU cores and 120 GB memory – to host Weaviate. -* **Script** – a smaller instance with 8 vCPU – to run benchmarking scripts. +* a `n4-highmem-16` instance with 16 vCPU cores and 128 GB memory. -:::info Here's why we chose the `c2-standard-30`: +:::info Here's why we chose the `n4-highmem-16`: * It is large enough to show that Weaviate is a highly concurrent [vector search engine](https://weaviate.io/blog/what-is-a-vector-database). * It scales well while running thousands of searches across multiple threads. @@ -222,10 +262,10 @@ We modeled our dataset selection after queries are used to test speed, throughput, and recall. The provided ground truths are used to calculate the recall. -We use Weaviate's Python client to import data. +We use Weaviate's Golang client to import data. We use Go to measure the concurrent (multi-threaded) queries. - Each language has its own performance characteristics. - You may get different results if you use a different language to send your queries. +Each language has its own performance characteristics. +You may get different results if you use a different language to send your queries. For maximum throughput, we recommend using the [Go](/developers/weaviate/client-libraries/go.md) or [Java](/developers/weaviate/client-libraries/java.md) client libraries. diff --git a/developers/weaviate/benchmarks/img/benchmark_deepimage_96.png b/developers/weaviate/benchmarks/img/benchmark_deepimage_96.png deleted file mode 100644 index 8cc772caea..0000000000 Binary files a/developers/weaviate/benchmarks/img/benchmark_deepimage_96.png and /dev/null differ diff --git a/developers/weaviate/benchmarks/img/benchmark_gist_960.png b/developers/weaviate/benchmarks/img/benchmark_gist_960.png deleted file mode 100644 index 2236d6f416..0000000000 Binary files a/developers/weaviate/benchmarks/img/benchmark_gist_960.png and /dev/null differ diff --git a/developers/weaviate/benchmarks/img/benchmark_glove_25.png b/developers/weaviate/benchmarks/img/benchmark_glove_25.png deleted file mode 100644 index 285561f3a7..0000000000 Binary files a/developers/weaviate/benchmarks/img/benchmark_glove_25.png and /dev/null differ diff --git a/developers/weaviate/benchmarks/img/benchmark_sift_128.png b/developers/weaviate/benchmarks/img/benchmark_sift_128.png deleted file mode 100644 index 2c88c52b6c..0000000000 Binary files a/developers/weaviate/benchmarks/img/benchmark_sift_128.png and /dev/null differ diff --git a/developers/weaviate/client-libraries/go.md b/developers/weaviate/client-libraries/go.md index f7f67609b3..906ab0b586 100644 --- a/developers/weaviate/client-libraries/go.md +++ b/developers/weaviate/client-libraries/go.md @@ -411,73 +411,16 @@ client.Data().Validator().WithProperties(properties) ## Releases -For links to the Go Client releases, expand this section. +Go to the [GitHub releases page](https://github.com/weaviate/weaviate-go-client/releases) to see the history of the Go client library releases.
- Go Client - -| Client Version | Release Date | -| :- | :- | -| [4.15.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.15.1) | 2024-08-07 | -| [4.15.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.15.0) | 2024-07-25 | -| [4.14.3](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.3) | 2024-07-25 | -| [4.14.2](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.2) | 2024-07-17 | -| [4.14.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.1) | 2024-07-11 | -| [4.14.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.0) | 2024-05-20 | -| [4.13.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.13.1) | 2024-03-07 | -| [4.13.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.13.0) | 2024-03-05 | -| [4.12.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.12.0) | 2023-12-08 | -| [4.11.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.11.0) | 2023-11-13 | -| [4.10.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.10.0) | 2023-08-22 | -| [4.9.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.9.0) | 2023-07-06 | -| [4.8.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.8.1) | 2023-05-26 | -| [4.8.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.8.0) | 2023-05-05 | -| [4.7.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.7.1) | 2023-04-14 | -| [4.7.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.7.0) | 2023-04-03 | -| [4.6.4](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.4) | 2023-03-25 | -| [4.6.3](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.3) | 2023-03-14 | -| [4.6.2](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.2) | 2023-03-07 | -| [4.6.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.1) | 2023-02-01 | -| [4.6.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.0) | 2023-02-01 | -| [4.5.2](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.5.2) | 2023-01-19 | -| [4.5.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.5.1) | 2023-01-17 | -| [4.5.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.5.0) | 2022-12-20 | -| [4.4.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.4.0) | 2022-10-31 | -| [4.3.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.3.1) | 2022-09-27 | -| [4.3.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.3.0) | 2022-09-07 | -| [4.2.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.2.1) | 2022-07-12 | -| [4.2.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.2.0) | 2022-07-07 | -| [4.1.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.1.0) | 2022-05-25 | -| [4.0.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v4.0.0) | 2022-05-03 | -| [3.0.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v3.0.0) | 2022-04-05 | -| [2.6.2](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.6.2) | 2022-10-31 | -| [2.6.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.6.1) | 2022-05-04 | -| [2.6.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.6.0) | 2022-03-11 | -| [2.5.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.5.0) | 2022-02-01 | -| [2.4.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.4.1) | 2021-12-15 | -| [2.4.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.4.0) | 2021-11-30 | -| [2.3.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.3.0) | 2021-08-31 | -| [2.2.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.2.0) | 2021-06-07 | -| [2.1.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.1.0) | 2021-04-23 | -| [2.0.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.0.1) | 2021-03-25 | -| [2.0.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v2.0.0) | 2021-03-23 | -| [1.1.2](https://github.com/weaviate/weaviate-go-client/releases/tag/v1.1.2) | 2021-10-31 | -| [1.1.1](https://github.com/weaviate/weaviate-go-client/releases/tag/v1.1.1) | 2021-05-04 | -| [1.1.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v1.1.0) | 2020-11-09 | -| [1.0.0](https://github.com/weaviate/weaviate-go-client/releases/tag/v1.0.0) | 2020-11-06 | + Click here for a table of Weaviate and corresponding client versions -
- -import MatrixIntro from '/_includes/clients/matrix-intro.md'; - - +import ReleaseHistory from '/_includes/release-history.md'; -## Change logs - -Check the -[change logs on GitHub](https://github.com/weaviate/weaviate-go-client/releases) -for updates on the latest `Go client` changes. + + ## Questions and feedback diff --git a/developers/weaviate/client-libraries/index.md b/developers/weaviate/client-libraries/index.md index 4ba1ddc9e4..e2d2551a6c 100644 --- a/developers/weaviate/client-libraries/index.md +++ b/developers/weaviate/client-libraries/index.md @@ -1,13 +1,11 @@ --- title: Reference - Client Libraries +description: Explore Weaviate client libraries to integrate Weaviate into your tech stack. sidebar_position: 0 image: og/docs/client-libraries.jpg # tags: ['client libraries', 'cli'] --- - -## Overview - You can interact with Weaviate by using the GraphQL or RESTful API directly, or with one of the available client libraries. Currently, Weaviate supports: diff --git a/developers/weaviate/client-libraries/java.md b/developers/weaviate/client-libraries/java.md index dfea34dc4b..2896fb3796 100644 --- a/developers/weaviate/client-libraries/java.md +++ b/developers/weaviate/client-libraries/java.md @@ -423,80 +423,16 @@ client.classifications().scheduler().withTrainingSetWhereFilter(where)... ## Releases -For links to the Go Client releases, expand this section. +Go to the [GitHub releases page](https://github.com/weaviate/java-client/releases) to see the history of the Java client library releases.
- Go Client - -| Client Version | Release Date | -| :- | :- | -| [4.8.3](https://github.com/weaviate/java-client/releases/tag/4.8.3) | 2024-09-21 | -| [4.8.2](https://github.com/weaviate/java-client/releases/tag/4.8.2) | 2024-07-24 | -| [4.8.1](https://github.com/weaviate/java-client/releases/tag/4.8.1) | 2024-07-24 | -| [4.8.0](https://github.com/weaviate/java-client/releases/tag/4.8.0) | 2024-07-23 | -| [4.7.0](https://github.com/weaviate/java-client/releases/tag/4.7.0) | 2024-05-20 | -| [4.6.0](https://github.com/weaviate/java-client/releases/tag/4.6.0) | 2024-03-05 | -| [4.5.1](https://github.com/weaviate/java-client/releases/tag/4.5.1) | 2024-01-08 | -| [4.5.0](https://github.com/weaviate/java-client/releases/tag/4.5.0) | 2023-12-07 | -| [4.4.2](https://github.com/weaviate/java-client/releases/tag/4.4.2) | 2023-11-20 | -| [4.4.1](https://github.com/weaviate/java-client/releases/tag/4.4.1) | 2023-11-15 | -| [4.4.0](https://github.com/weaviate/java-client/releases/tag/4.4.0) | 2023-11-14 | -| [4.3.0](https://github.com/weaviate/java-client/releases/tag/4.3.0) | 2023-08-22 | -| [4.2.1](https://github.com/weaviate/java-client/releases/tag/4.2.1) | 2023-07-26 | -| [4.2.0](https://github.com/weaviate/java-client/releases/tag/4.2.0) | 2023-07-06 | -| [4.1.2](https://github.com/weaviate/java-client/releases/tag/4.1.2) | 2023-05-26 | -| [4.1.1](https://github.com/weaviate/java-client/releases/tag/4.1.1) | 2023-05-21 | -| [4.1.0](https://github.com/weaviate/java-client/releases/tag/4.1.0) | 2023-05-05 | -| [4.0.2](https://github.com/weaviate/java-client/releases/tag/4.0.2) | 2023-03-28 | -| [4.0.1](https://github.com/weaviate/java-client/releases/tag/4.0.1) | 2023-03-16 | -| [4.0.0](https://github.com/weaviate/java-client/releases/tag/4.0.0) | 2023-03-14 | -| [3.6.5](https://github.com/weaviate/java-client/releases/tag/3.6.5) | 2023-03-13 | -| [3.6.4](https://github.com/weaviate/java-client/releases/tag/3.6.4) | 2023-03-07 | -| [3.6.3](https://github.com/weaviate/java-client/releases/tag/3.6.3) | 2023-03-01 | -| [3.6.2](https://github.com/weaviate/java-client/releases/tag/3.6.2) | 2023-02-23 | -| [3.6.1](https://github.com/weaviate/java-client/releases/tag/3.6.1) | 2023-02-22 | -| [3.6.0](https://github.com/weaviate/java-client/releases/tag/3.6.0) | 2023-02-09 | -| [3.5.0](https://github.com/weaviate/java-client/releases/tag/3.5.0) | 2022-12-20 | -| [3.4.2](https://github.com/weaviate/java-client/releases/tag/3.4.2) | 2022-11-21 | -| [3.4.1](https://github.com/weaviate/java-client/releases/tag/3.4.1) | 2022-11-18 | -| [3.4.0](https://github.com/weaviate/java-client/releases/tag/3.4.0) | 2022-10-31 | -| [3.3.2](https://github.com/weaviate/java-client/releases/tag/3.3.2) | 2022-10-29 | -| [3.3.1](https://github.com/weaviate/java-client/releases/tag/3.3.1) | 2022-09-29 | -| [3.3.0](https://github.com/weaviate/java-client/releases/tag/3.3.0) | 2022-09-07 | -| [3.2.1](https://github.com/weaviate/java-client/releases/tag/3.2.1) | 2022-07-12 | -| [3.2.0](https://github.com/weaviate/java-client/releases/tag/3.2.0) | 2022-07-07 | -| [3.1.1](https://github.com/weaviate/java-client/releases/tag/3.1.1) | 2022-06-02 | -| [3.1.0](https://github.com/weaviate/java-client/releases/tag/3.1.0) | 2022-05-25 | -| [3.0.0](https://github.com/weaviate/java-client/releases/tag/3.0.0) | 2022-05-04 | -| [2.4.0](https://github.com/weaviate/java-client/releases/tag/2.4.0) | 2022-04-05 | -| [2.3.0](https://github.com/weaviate/java-client/releases/tag/2.3.0) | 2022-03-11 | -| [2.2.2](https://github.com/weaviate/java-client/releases/tag/2.2.2) | 2022-02-08 | -| [2.2.1](https://github.com/weaviate/java-client/releases/tag/2.2.1) | 2022-02-07 | -| [2.2.0](https://github.com/weaviate/java-client/releases/tag/2.2.0) | 2022-02-01 | -| [2.1.1](https://github.com/weaviate/java-client/releases/tag/2.1.1) | 2021-12-15 | -| [2.1.0](https://github.com/weaviate/java-client/releases/tag/2.1.0) | 2021-11-30 | -| [2.0.0](https://github.com/weaviate/java-client/releases/tag/2.0.0) | 2021-11-04 | -| [1.2.1](https://github.com/weaviate/java-client/releases/tag/1.2.1) | 2021-09-28 | -| [1.2.0](https://github.com/weaviate/java-client/releases/tag/1.2.0) | 2021-09-10 | -| [1.1.2](https://github.com/weaviate/java-client/releases/tag/1.1.2) | 2021-08-31 | -| [1.1.1](https://github.com/weaviate/java-client/releases/tag/1.1.1) | 2021-08-10 | -| [1.1.0](https://github.com/weaviate/java-client/releases/tag/1.1.0) | 2021-06-07 | -| [1.0.2](https://github.com/weaviate/java-client/releases/tag/1.0.2) | 2021-04-26 | -| [1.0.1](https://github.com/weaviate/java-client/releases/tag/1.0.1) | 2021-04-23 | -| [1.0.0](https://github.com/weaviate/java-client/releases/tag/1.0.0) | 2021-04-22 | + Click here for a table of Weaviate and corresponding client versions -
- -import MatrixIntro from '/_includes/clients/matrix-intro.md'; - - +import ReleaseHistory from '/_includes/release-history.md'; -## Change logs - -Check the -[change logs on GitHub](https://github.com/weaviate/weaviate-java-client/releases) -for updates on the latest `Java client` changes. + + ## Questions and feedback diff --git a/developers/weaviate/client-libraries/python/index.md b/developers/weaviate/client-libraries/python/index.md index 7ee3cfc2cc..fb73865bea 100644 --- a/developers/weaviate/client-libraries/python/index.md +++ b/developers/weaviate/client-libraries/python/index.md @@ -1,5 +1,6 @@ --- title: Python +description: Utilize the Python client library to access Weaviate and streamline data processes. sidebar_position: 10 image: og/docs/client-libraries.jpg # tags: ['python', 'client library', 'experimental'] @@ -11,10 +12,12 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PythonCode from '!!raw-loader!/_includes/code/client-libraries/python_v4.py'; import BatchVectorCode from '!!raw-loader!/_includes/code/howto/manage-data.import.py'; -## Overview - This page broadly covers the Weaviate Python client (`v4` release). For usage information not specific to the Python client, such as code examples, see the relevant pages in the [Weaviate documentation](../../index.md). Some frequently used sections are [listed here](#code-examples--resources) for convenience. +:::info Inline documentation +For the inline documentation (also known as docstrings) of the Python client, see the [Read the Docs](https://weaviate-python-client.readthedocs.io/en/latest/) page. +::: + ### Asynchronous usage The Python client library provides a synchronous API by default through the `WeaviateClient` class, which is covered on this page. An asynchronous API is also available through the `WeaviateAsyncClient` class (from `weaviate-client` `v4.7.0` and up). See the [async client API page](./async.md) for further details. @@ -28,7 +31,8 @@ If you are migrating from the `v3` client to the `v4`, see this [dedicated guide The Python client library is developed and tested using Python 3.8+. It is available on [PyPI.org](https://pypi.org/project/weaviate-client/), and can be installed with: ```bash -pip install -U weaviate-client # For beta versions: `pip install --pre -U "weaviate-client==4.*"` +# For beta versions: `pip install --pre -U "weaviate-client==4.*"` +pip install -U weaviate-client ``` ### Requirements @@ -463,8 +467,9 @@ The `data` submodule contains all object-level CUD operations, including: - `insert` for creating objects. - This function takes the object properties as a dictionary. -- `insert_many` for batch creating multiple objects. +- `insert_many` for adding multiple objects with one request. - This function takes the object properties as a dictionary or as a `DataObject` instance. + - Note: For larger numbers of objects, consider using [batch imports](#batch-imports). - `update` for updating objects (for `PATCH` operations). - `replace` for replacing objects (for `PUT` operations). - `delete_by_id` for deleting objects by ID. @@ -473,11 +478,6 @@ The `data` submodule contains all object-level CUD operations, including: See some examples below. Note that each function will return varying types of objects. -:::caution `insert_many` sends one request -As of `4.4b1`, `insert_many` sends one request for the entire function call. A future release may -send multiple requests as batches. -::: - @@ -521,6 +521,10 @@ send multiple requests as batches. +:::info `insert_many` sends one request +`insert_many` sends one request for the entire function call. For requests with a large number of objects, [consider using `batch` imports](#batch-imports). +::: + #### `insert_many` with DataObjects The `insert_many` function takes a list of `DataObject` instances or a list of dictionaries. This is useful if you want to specify additional information to the properties, such as cross-references, object uuid, or a custom vector. @@ -1202,121 +1206,16 @@ The Weaviate API reference pages for [search](../../api/graphql/index.md) and [R ## Releases -For links to the Python Client releases, expand this section. +Go to the [GitHub releases page](https://github.com/weaviate/weaviate-python-client/releases) to see the history of the Python client library releases.
- Python Client - -| Client Version | Release Date | -| :- | :- | -| [4.8.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.8.1) | 2024-09-16 | -| [4.8.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.8.0) | 2024-09-10 | -| [4.7.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.7.1) | 2024-07-25 | -| [4.7.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.7.0) | 2024-07-24 | -| [4.6.7](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.7) | 2024-07-19 | -| [4.6.6](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.6) | 2024-07-02 | -| [4.6.5](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.5) | 2024-06-19 | -| [4.6.4](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.4) | 2024-06-19 | -| [4.6.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.3) | 2024-05-21 | -| [4.6.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.2) | 2024-05-21 | -| [4.6.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.1) | 2024-05-17 | -| [4.6.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.0) | 2024-05-10 | -| [4.5.7](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.7) | 2024-05-03 | -| [4.5.6](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.6) | 2024-04-23 | -| [4.5.5](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.5) | 2024-04-03 | -| [4.5.4](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.4) | 2024-03-15 | -| [4.5.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.3) | 2024-03-14 | -| [4.5.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.2) | 2024-03-11 | -| [4.5.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.1) | 2024-03-04 | -| [4.5.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.0) | 2024-02-27 | -| [4.4.4](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.4) | 2024-02-09 | -| [4.4.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.3) | 2024-02-09 | -| [4.4.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.2) | 2024-02-09 | -| [4.4.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.1) | 2024-02-05 | -| [4.4.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.0) | 2024-01-31 | -| [3.26.7](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.6) | 2024-08-15 | -| [3.26.6](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.6) | 2024-07-24 | -| [3.26.5](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.5) | 2024-07-02 | -| [3.26.4](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.4) | 2024-07-02 | -| [3.26.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.3) | 2024-06-30 | -| [3.26.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.2) | 2024-01-22 | -| [3.26.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.1) | 2024-01-15 | -| [3.26.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.0) | 2023-12-20 | -| [3.25.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.3) | 2023-11-07 | -| [3.25.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.2) | 2023-10-31 | -| [3.25.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.1) | 2023-10-27 | -| [3.25.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.0) | 2023-10-27 | -| [3.24.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.24.2) | 2023-10-04 | -| [3.24.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.24.1) | 2023-09-11 | -| [3.24.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.24.0) | 2023-09-11 | -| [3.23.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.23.2) | 2023-08-29 | -| [3.23.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.23.1) | 2023-08-25 | -| [3.23.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.23.0) | 2023-08-22 | -| [3.22.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.22.1) | 2023-07-10 | -| [3.22.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.22.0) | 2023-07-06 | -| [3.21.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.21.0) | 2023-06-18 | -| [3.20.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.20.1) | 2023-06-14 | -| [3.20.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.20.0) | 2023-06-12 | -| [3.19.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.2) | 2023-05-25 | -| [3.19.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.1) | 2023-05-18 | -| [3.19.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.0) | 2023-05-18 | -| [3.18.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.0) | 2023-05-09 | -| [3.17.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.17.1) | 2023-05-08 | -| [3.17.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.17.0) | 2023-05-04 | -| [3.16.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.16.2) | 2023-04-26 | -| [3.16.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.16.1) | 2023-04-24 | -| [3.16.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.16.0) | 2023-04-24 | -| [3.15.6](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.6) | 2023-04-15 | -| [3.15.5](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.5) | 2023-04-09 | -| [3.15.4](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.4) | 2023-04-08 | -| [3.15.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.3) | 2023-03-23 | -| [3.15.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.2) | 2023-03-15 | -| [3.15.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.1) | 2023-03-13 | -| [3.15.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.0) | 2023-03-12 | -| [3.14.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.14.0) | 2023-03-07 | -| [3.13.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.13.0) | 2023-03-02 | -| [3.12.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.12.0) | 2023-02-24 | -| [3.11.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.11.0) | 2023-01-20 | -| [3.10.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.10.0) | 2022-12-21 | -| [3.9.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.9.0) | 2022-11-09 | -| [3.8.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.8.0) | 2022-09-07 | -| [3.7.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.7.0) | 2022-07-29 | -| [3.6.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.6.0) | 2022-07-06 | -| [3.5.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.5.1) | 2022-05-18 | -| [3.5.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.5.0) | 2022-05-08 | -| [3.4.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.4.2) | 2022-04-12 | -| [3.4.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.4.1) | 2022-04-06 | -| [3.4.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.4.0) | 2022-04-04 | -| [3.2.5](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.5) | 2021-10-26 | -| [3.2.4](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.4) | 2021-10-26 | -| [3.2.3](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.3) | 2021-10-13 | -| [3.2.2](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.2) | 2021-09-27 | -| [3.2.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.1) | 2021-09-02 | -| [3.2.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.0) | 2021-09-02 | -| [3.1.1](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.1.1) | 2021-08-24 | -| [3.1.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.1.0) | 2021-08-17 | -| [3.0.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v3.0.0) | 2021-08-17 | -| [2.5.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v2.5.0) | 2021-06-03 | -| [2.4.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v2.4.0) | 2021-04-23 | -| [2.3.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v2.3.0) | 2021-03-26 | -| [2.2.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v2.2.0) | 2021-02-17 | -| [2.1.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v2.1.0) | 2021-02-08 | -| [2.0.0](https://github.com/weaviate/weaviate-python-client/releases/tag/v2.0.0) | 2021-01-11 | + Click here for a table of Weaviate and corresponding client versions -
- -import MatrixIntro from '/_includes/clients/matrix-intro.md'; - - +import ReleaseHistory from '/_includes/release-history.md'; -## Change logs - -For more detailed information on client updates, check the change logs. The logs -are hosted here: - -- [GitHub](https://github.com/weaviate/weaviate-python-client/releases) -- [Read the Docs](https://weaviate-python-client.readthedocs.io/en/stable/changelog.html) + + ## Questions and feedback diff --git a/developers/weaviate/client-libraries/python/python_v3.md b/developers/weaviate/client-libraries/python/python_v3.md index 4e4ada53f0..8e50610395 100644 --- a/developers/weaviate/client-libraries/python/python_v3.md +++ b/developers/weaviate/client-libraries/python/python_v3.md @@ -5,11 +5,11 @@ image: og/docs/client-libraries.jpg # tags: ['python', 'client library'] --- -:::info `v3` client is deprecated +:::caution `v3` client is deprecated This document relates to the legacy `v3` client and API.
-Starting in December 2024, the `v4` [client installations](https://pypi.org/project/weaviate-client/) will no longer include the `v3` API (i.e. the `weaviate.Client` class). This will help us to provide the best developer experience for you, support for the latest features, and clearly separate the two. +From `v4.10.0`, the [Weaviate Python client installations](https://pypi.org/project/weaviate-client/) no longer include the `v3` API (i.e. the `weaviate.Client` class). This separation helps us to provide the best developer experience for you and provide support for the latest Weaviate features.
The `v3` client will continue to get critical security updates and bugfixes for the foreseeable future, but it will not support any new features. @@ -899,20 +899,18 @@ The batching algorithm in our client is not thread-safe. Keep this in mind to he If you are performing batching in a multi-threaded scenario, ensure that only one of the threads is performing the batching workflow at any given time. No two threads can use the same `client.batch` object at one time. -## Client releases +## Releases -import MatrixIntro from '/_includes/clients/matrix-intro.md'; +Go to the [GitHub releases page](https://github.com/weaviate/weaviate-python-client/releases) to see the history of the Python client library releases. - - -## Change logs +
+ Click here for a table of Weaviate and corresponding client versions -For more detailed information on client updates, check the change logs. The logs -are hosted here: +import ReleaseHistory from '/_includes/release-history.md'; -- [GitHub](https://github.com/weaviate/weaviate-python-client/releases) -- [Read the Docs](https://weaviate-python-client.readthedocs.io/en/stable/changelog.html) + +
## Questions and feedback diff --git a/developers/weaviate/client-libraries/python/v3_v4_migration.md b/developers/weaviate/client-libraries/python/v3_v4_migration.md index ecd1ad7231..263a97da01 100644 --- a/developers/weaviate/client-libraries/python/v3_v4_migration.md +++ b/developers/weaviate/client-libraries/python/v3_v4_migration.md @@ -32,8 +32,9 @@ To go from `v3` to `v4`, you must pip install -U weaviate-client ``` -2. Upgrade Weaviate to a compatible version - - Weaviate `1.23.7` is required for `v4.4.1`. Generally, we recommend you use the latest versions of Weaviate and the client. +2. Upgrade Weaviate to a compatible version. Each minor Python client version is closely tied to a minor Weaviate version. + - For example, Weaviate `v1.27.x` were developed together with `v4.9.x` of the Python client. + - Generally, we recommend you use the latest versions of Weaviate and the client. You can find the version compatibility matrix in the [release notes](../../release-notes/index.md#weaviate-core-and-client-releases) 3. Make sure a port for gRPC is open to Weaviate. - The default port is 50051. @@ -193,7 +194,7 @@ import ManageDataCodeV3 from '!!raw-loader!/_includes/code/howto/manage-data.rea text={ManageDataCodeV3} startMarker="# ReadObject START" endMarker="# ReadObject END" - language="py" + language="pyv3" /> @@ -246,7 +247,7 @@ import SearchSimilarityCodeV3 from '!!raw-loader!/_includes/code/howto/search.si text={SearchSimilarityCodeV3} startMarker="# GetNearTextPython" endMarker="# END GetNearTextPython" - language="python" + language="pyv3" /> diff --git a/developers/weaviate/client-libraries/typescript/index.mdx b/developers/weaviate/client-libraries/typescript/index.mdx index e677de0016..6cca085559 100644 --- a/developers/weaviate/client-libraries/typescript/index.mdx +++ b/developers/weaviate/client-libraries/typescript/index.mdx @@ -31,48 +31,16 @@ The v3 TypeScript client replaces the [v2 JavaScript](https://www.npmjs.com/pack ## Releases -For links to the TypeScript Client releases, expand this section. +Go to the [GitHub releases page](https://github.com/weaviate/typescript-client/releases) to see the history of the TypeScript client library releases.
- TypeScript Client - -| Client Version | Release Date | -| :- | :- | -| [3.1.0](https://github.com/weaviate/typescript-client/releases/tag/v3.1.0) | 2024-07-24 | -| [3.0.9](https://github.com/weaviate/typescript-client/releases/tag/v3.0.9) | 2024-07-04 | -| [3.0.8](https://github.com/weaviate/typescript-client/releases/tag/v3.0.8) | 2024-06-24 | -| [3.0.7](https://github.com/weaviate/typescript-client/releases/tag/v3.0.7) | 2024-06-21 | -| [3.0.6](https://github.com/weaviate/typescript-client/releases/tag/v3.0.6) | 2024-06-19 | -| [3.0.5](https://github.com/weaviate/typescript-client/releases/tag/v3.0.5) | 2024-06-13 | -| [3.0.4](https://github.com/weaviate/typescript-client/releases/tag/v3.0.4) | 2024-06-13 | -| [3.0.3](https://github.com/weaviate/typescript-client/releases/tag/v3.0.3) | 2024-06-04 | -| [3.0.2](https://github.com/weaviate/typescript-client/releases/tag/v3.0.2) | 2024-06-03 | -| [3.0.1](https://github.com/weaviate/typescript-client/releases/tag/v3.0.1) | 2024-06-03 | -| [3.0.0](https://github.com/weaviate/typescript-client/releases/tag/v3.0.0) | 2024-06-03 | -| [2.2.0](https://github.com/weaviate/typescript-client/releases/tag/v2.2.0) | 2024-05-20 | -| [2.1.1](https://github.com/weaviate/typescript-client/releases/tag/v2.1.1) | 2024-03-26 | -| [2.1.0](https://github.com/weaviate/typescript-client/releases/tag/v2.1.0) | 2024-02-28 | -| [2.0.0](https://github.com/weaviate/typescript-client/releases/tag/v2.0.0) | 2023-11-22 | -| [1.6.0](https://github.com/weaviate/typescript-client/releases/tag/v1.6.0) | 2023-10-31 | -| [1.5.0](https://github.com/weaviate/typescript-client/releases/tag/v1.5.0) | 2023-08-22 | -| [1.4.0](https://github.com/weaviate/typescript-client/releases/tag/v1.4.0) | 2023-07-06 | -| [1.3.3](https://github.com/weaviate/typescript-client/releases/tag/v1.3.3) | 2023-06-14 | -| [1.3.2](https://github.com/weaviate/typescript-client/releases/tag/v1.3.2) | 2023-05-26 | -| [1.3.1](https://github.com/weaviate/typescript-client/releases/tag/v1.3.1) | 2023-05-16 | -| [1.3.0](https://github.com/weaviate/typescript-client/releases/tag/v1.3.0) | 2023-05-08 | -| [1.2.0](https://github.com/weaviate/typescript-client/releases/tag/v1.2.0) | 2023-05-05 | -| [1.1.0](https://github.com/weaviate/typescript-client/releases/tag/v1.1.0) | 2023-04-21 | -| [1.0.0](https://github.com/weaviate/typescript-client/releases/tag/v1.0.0) | 2023-05-04 | + Click here for a table of Weaviate and corresponding client versions -
- -import MatrixIntro from '/_includes/clients/matrix-intro.md'; +import ReleaseHistory from '/_includes/release-history.md'; - + -## Client change logs - -See the client [change logs on GitHub](https://github.com/weaviate/typescript-client/releases). + ## Questions and feedback diff --git a/developers/weaviate/client-libraries/typescript/typescript-v2.mdx b/developers/weaviate/client-libraries/typescript/typescript-v2.mdx index d222af7b48..dee9efa6c9 100644 --- a/developers/weaviate/client-libraries/typescript/typescript-v2.mdx +++ b/developers/weaviate/client-libraries/typescript/typescript-v2.mdx @@ -1,5 +1,6 @@ --- title: JS/TS client v2 +description: TypeScript Client Library v2 sidebar_position: 20 image: og/docs/client-libraries.jpg # tags: ['TypeScript', 'client library'] @@ -419,9 +420,14 @@ The output looks like this. ## Client releases -import MatrixIntro from '/_includes/clients/matrix-intro.md'; +
+ Click here for a table of Weaviate and corresponding client versions + +import ReleaseHistory from '/_includes/release-history.md'; - + + +
## Client change logs diff --git a/developers/weaviate/client-libraries/typescript/typescript-v3.mdx b/developers/weaviate/client-libraries/typescript/typescript-v3.mdx index dd4a9436d2..672744ee92 100644 --- a/developers/weaviate/client-libraries/typescript/typescript-v3.mdx +++ b/developers/weaviate/client-libraries/typescript/typescript-v3.mdx @@ -1,5 +1,6 @@ --- title: JS/TS client v3 +description: TypeScript Client Library v3 sidebar_position: 10 image: og/docs/client-libraries.jpg # tags: ['typescript', 'javascript', 'client library', 'experimental'] @@ -312,48 +313,16 @@ There are demo applications written in TypeScript and JavaScript here: ## Client releases -For links to the TypeScript Client releases, expand this section. +Go to the [GitHub releases page](https://github.com/weaviate/typescript-client/releases) to see the history of the TypeScript client library releases.
- TypeScript Client - -| Client Version | Release Date | -| :- | :- | - | [3.1.4](https://github.com/weaviate/typescript-client/releases/tag/v3.1.4) | 2024-08-06 | - | [3.1.3](https://github.com/weaviate/typescript-client/releases/tag/v3.1.3) | 2024-07-26 | - | [3.1.2](https://github.com/weaviate/typescript-client/releases/tag/v3.1.2) | 2024-07-26 | - | [3.1.1](https://github.com/weaviate/typescript-client/releases/tag/v3.1.1) | 2024-07-26 | - | [3.1.0](https://github.com/weaviate/typescript-client/releases/tag/v3.1.0) | 2024-07-24 | - | [3.0.9](https://github.com/weaviate/typescript-client/releases/tag/v3.0.9) | 2024-07-10 | - | [3.0.8](https://github.com/weaviate/typescript-client/releases/tag/v3.0.8) | 2024-06-24 | - | [3.0.7](https://github.com/weaviate/typescript-client/releases/tag/v3.0.7) | 2024-06-21 | - | [3.0.6](https://github.com/weaviate/typescript-client/releases/tag/v3.0.6) | 2024-06-19 | - | [3.0.5](https://github.com/weaviate/typescript-client/releases/tag/v3.0.5) | 2024-06-13 | - | [3.0.4](https://github.com/weaviate/typescript-client/releases/tag/v3.0.4) | 2024-06-13 | - | [3.0.3](https://github.com/weaviate/typescript-client/releases/tag/v3.0.3) | 2024-06-04 | - | [3.0.2](https://github.com/weaviate/typescript-client/releases/tag/v3.0.2) | 2024-06-03 | - | [3.0.1](https://github.com/weaviate/typescript-client/releases/tag/v3.0.1) | 2024-06-03 | - | [3.0.0](https://github.com/weaviate/typescript-client/releases/tag/v3.0.0) | 2024-06-03 | - | [2.2.0](https://github.com/weaviate/typescript-client/releases/tag/v2.2.0) | 2024-05-20 | - | [2.1.1](https://github.com/weaviate/typescript-client/releases/tag/v2.1.1) | 2024-03-26 | - | [2.1.0](https://github.com/weaviate/typescript-client/releases/tag/v2.1.0) | 2024-02-28 | - | [2.0.0](https://github.com/weaviate/typescript-client/releases/tag/v2.0.0) | 2023-11-22 | - | [1.6.0](https://github.com/weaviate/typescript-client/releases/tag/v1.6.0) | 2023-10-31 | - | [1.5.0](https://github.com/weaviate/typescript-client/releases/tag/v1.5.0) | 2023-08-22 | - | [1.4.0](https://github.com/weaviate/typescript-client/releases/tag/v1.4.0) | 2023-07-06 | - | [1.3.3](https://github.com/weaviate/typescript-client/releases/tag/v1.3.3) | 2023-06-14 | - | [1.3.2](https://github.com/weaviate/typescript-client/releases/tag/v1.3.2) | 2023-05-26 | - | [1.3.1](https://github.com/weaviate/typescript-client/releases/tag/v1.3.1) | 2023-05-16 | - | [1.3.0](https://github.com/weaviate/typescript-client/releases/tag/v1.3.0) | 2023-05-08 | - | [1.2.0](https://github.com/weaviate/typescript-client/releases/tag/v1.2.0) | 2023-05-05 | - | [1.1.0](https://github.com/weaviate/typescript-client/releases/tag/v1.1.0) | 2023-04-21 | - | [1.0.0](https://github.com/weaviate/typescript-client/releases/tag/v1.0.0) | 2023-05-04 | -
+ Click here for a table of Weaviate and corresponding client versions +import ReleaseHistory from '/_includes/release-history.md'; -import MatrixIntro from '/_includes/clients/matrix-intro.md'; + - + ## Change logs diff --git a/developers/weaviate/concepts/index.md b/developers/weaviate/concepts/index.md index 27bed2cf38..5be8160b74 100644 --- a/developers/weaviate/concepts/index.md +++ b/developers/weaviate/concepts/index.md @@ -1,5 +1,6 @@ --- title: Concepts +description: Concepts in Weaviate sidebar_position: 0 image: og/docs/concepts.jpg # tags: ['getting started'] diff --git a/developers/weaviate/concepts/indexing.md b/developers/weaviate/concepts/indexing.md index 0d40b229ed..dc288c9367 100644 --- a/developers/weaviate/concepts/indexing.md +++ b/developers/weaviate/concepts/indexing.md @@ -7,7 +7,7 @@ image: og/docs/concepts.jpg Weaviate supports several types of indexes. -1. **Vector indexes** - a vector index (e.g. HNSW or flat) is used to serve all vector-search queries. +1. **[Vector indexes](./vector-index.md)** - a vector index (e.g. HNSW or flat) is used to serve all vector-search queries. 1. **Inverted indexes** - inverted indexes enable BM25 queries, or speed up filtering. You can configure indexes in Weaviate per collection. diff --git a/developers/weaviate/concepts/modules.md b/developers/weaviate/concepts/modules.md index 1864e64f02..79d7125f7c 100644 --- a/developers/weaviate/concepts/modules.md +++ b/developers/weaviate/concepts/modules.md @@ -1,5 +1,6 @@ --- title: Modules +description: Modules in Weaviate sidebar_position: 15 image: og/docs/concepts.jpg # tags: ['modules'] diff --git a/developers/weaviate/concepts/replication-architecture/consistency.md b/developers/weaviate/concepts/replication-architecture/consistency.md index 4b7b8cb298..8ac241ad84 100644 --- a/developers/weaviate/concepts/replication-architecture/consistency.md +++ b/developers/weaviate/concepts/replication-architecture/consistency.md @@ -151,9 +151,61 @@ For speed, data operations on a tenant occur independently of any tenant activit ## Repairs -When Weaviate detects inconsistent data across replicas, it attempts to repair the out of sync data. +In distributed systems like Weaviate, object replicas can become inconsistent due to any number of reasons - network issues, node failures, or timing conflicts. When Weaviate detects inconsistent data across replicas, it attempts to repair the out of sync data. -Starting in v1.26, Weaviate adds [async replication](#async-replication) to proactively detect inconsistencies. In earlier versions, Weaviate uses a [repair-on-read](#repair-on-read) strategy to repair inconsistencies at read time. +Weaviate uses [async replication](#async-replication), [deletion resolution](#deletion-resolution-strategies) and [repair-on-read](#repair-on-read) strategies to maintain consistency across replicas. + +### Async replication + +:::info Added in `v1.26` +::: + +Async replication runs in the background. It uses a Merkle tree algorithm to monitor and compare the state of nodes within a cluster. If the algorithm identifies an inconsistency, it resyncs the data on the inconsistent node. + +Repair-on-read works well with one or two isolated repairs. Async replication is effective in situations where there are many inconsistencies. For example, if an offline node misses a series of updates, async replication quickly restores consistency when the node returns to service. + +Async replication supplements the repair-on-read mechanism. If a node becomes inconsistent between sync checks, the repair-on-read mechanism catches the problem at read time. + +To activate async replication, set `asyncEnabled` to true in the [`replicationConfig` section of your collection definition](../../manage-data/collections.mdx#replication-settings). + +### Deletion resolution strategies + +:::info Added in `v1.28` +::: + +When an object is present on some replicas but not others, this can be because a creation has not yet been propagated to all replicas, or because a deletion has not yet been propagated to all replicas. It is important to distinguish between these two cases. + +Deletion resolution works alongside async replication and repair-on-read to ensure consistent handling of deleted objects across the cluster. For each collection, you can set one of the following deletion resolution strategies: + +- `NoAutomatedResolution` +- `DeleteOnConflict` +- `TimeBasedResolution` + +#### `NoAutomatedResolution` + +This is the default setting, and the only setting available in Weaviate versions prior to `v1.28`. In this mode, Weaviate does not treat deletion conflicts as a special case. If an object is present on some replicas but not others, Weaviate may potentially restore the object on the replicas where it is missing. + +#### `DeleteOnConflict` + +A deletion conflict in `deleteOnConflict` is always resolved by deleting the object on all replicas. + +To do so, Weaviate updates an object as a deleted object on a replica upon receiving a deletion request, rather than removing all traces of the object. + +#### `TimeBasedResolution` + +A deletion conflict in `timeBasedResolution` is resolved based on the timestamp of the deletion request, in comparison to any subsequent updates to the object such as a creation or an update. + +If the deletion request has a timestamp that is later than the timestamp of any subsequent updates, the object is deleted on all replicas. If the deletion request has a timestamp that is earlier than the timestamp of any subsequent updates, the later updates are applied to all replicas. + +For example: +- If an object is deleted at timestamp 100 and then recreated at timestamp 90, the recreation wins +- If an object is deleted at timestamp 100 and then recreated at timestamp 110, the deletion wins + +#### Choosing a strategy + +- Use `NoAutomatedResolution` when you want maximum control and handle conflicts manually +- Use `DeleteOnConflict` when you want to ensure deletions are always honored +- Use `TimeBasedResolution` when you want the most recent operation to take precedence ### Repair-on-read @@ -178,19 +230,6 @@ The read repair process also depends on the read and write consistency levels us Repairs only happen on read, so they do not create a lot of background overhead. While nodes are in an inconsistent state, read operations with consistency level of `ONE` may return stale data. -### Async replication - -:::info Added in `v1.26` -::: - -Async replication runs in the background. It uses a Merkle tree algorithm to monitor and compare the state of nodes within a cluster. If the algorithm identifies an inconsistency, it resyncs the data on the inconsistent node. - -Repair-on-read works well with one or two isolated repairs. Async replication is effective in situations where there are many inconsistencies. For example, if an offline node misses a series of updates, async replication quickly restores consistency when the node returns to service. - -Async replication supplements the repair-on-read mechanism. If a node becomes inconsistent between sync checks, the repair-on-read mechanism catches the problem at read time. - -To activate async replication, set `asyncEnabled` to true in the [`replicationConfig` section of your collection definition](../../manage-data/collections.mdx#replication-settings). - ## Related pages - [API References | GraphQL | Get | Consistency Levels](../../api/graphql/get.md#consistency-levels) - [API References | REST | Objects](/developers/weaviate/api/rest#tag/objects) diff --git a/developers/weaviate/concepts/search/hybrid-search.md b/developers/weaviate/concepts/search/hybrid-search.md new file mode 100644 index 0000000000..8c3f1ebbb2 --- /dev/null +++ b/developers/weaviate/concepts/search/hybrid-search.md @@ -0,0 +1,191 @@ +--- +title: Hybrid search +sidebar_position: 60 +image: og/docs/concepts.jpg +# tags: ['concepts', 'search', 'hybrid search', 'vector search', 'keyword search', 'bm25'] +--- + +Hybrid search combines [vector search](./vector-search.md) and [keyword search (BM25)](./keyword-search.md) to leverage the strengths of both approaches. This takes into account results' semantic similarity (vector search) and exact keyword relevance (BM25), providing more comprehensive search results. + +A hybrid search runs both search types in parallel and combines their scores to produce a final ranking of results. This makes it versatile and robust, suitable for a wide range of search use cases. + +## How Hybrid Search Works + +In Weaviate, a hybrid search performs the following steps: + +1. Executes both searches in parallel: + - Vector search to find semantically similar content + - BM25 search to find keyword matches +1. Combines the normalized scores using a [fusion method](#fusion-method) +1. Returns results ranked by the combined scores + +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'primaryColor': '#4a5568', + 'primaryTextColor': '#2d3748', + 'primaryBorderColor': '#718096', + 'lineColor': '#718096', + 'secondaryColor': '#f7fafc', + 'tertiaryColor': '#edf2f7', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'fontSize': '14px', + 'lineHeight': '1.4', + 'nodeBorder': '1px', + 'mainBkg': '#ffffff', + 'clusterBkg': '#f8fafc' + } +}}%% + +flowchart LR + %% Style definitions + classDef systemBox fill:#f8fafc,stroke:#3182ce,stroke-width:1.5px,color:#2d3748,font-weight:bold + classDef processBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef component fill:white,stroke:#a0aec0,stroke-width:1px,color:#2d3748 + + %% Main flow + query["🔍 Query"] --> split["Query Processing"] + + %% Parallel processes + split --> vector["Vector Search"] + split --> bm25["BM25 Search"] + + %% Results combination + vector --> fusion["Score Fusion"] + bm25 --> fusion + fusion --> results["📑 Ranked Results"] + + %% Parameters box + subgraph params["Search Parameters"] + alpha["Alpha: Balance between\nvector and keyword scores"] + fusion_type["Fusion Strategy:\nrankedFusion or relativeScoreFusion"] + end + + params --> fusion + + %% Apply styles + class query,split,vector,bm25,fusion,results component + class params processBox + class alpha,fusion_type component + + %% Linkstyle for curved edges + linkStyle default stroke:#718096,stroke-width:3px,fill:none,background-color:white +``` + +### Fusion Strategies + +Weaviate supports two strategies (`relativeScoreFusion` and `rankedFusion`) for combining vector and keyword search scores: + +With `relativeScoreFusion` (default from `v1.24`), each object is scored by *normalizing* the metrics output by the vector search and keyword search respectively. The highest value becomes 1, the lowest value becomes 0, and others end up in between according to this scale. The total score is thus calculated by a scaled sum of normalized vector distance and normalized BM25 score. + +With `rankedFusion` (default for `v1.23` and lower), each object is scored according to its position in the results for the given search, starting from the highest score for the top-ranked object and decreasing down the order. The total score is calculated by adding these rank-based scores from the vector and keyword searches. + +Generally, `relativeScoreFusion` might be a a good choice, which is why it is the default. + +The main reason is that `relativeScoreFusion` retains more information from the original searches than `rankedFusion`, which only retains the rankings. More generally we believe that the nuances captured in the vector and keyword search metrics are more likely to be reflected in rankings produced by `relativeScoreFusion`. + +We include a concrete example of the two fusion strategies below. + +### Fusion Example + +Let's say that a search returns **five objects** with **document id** (from 0 to 4), and **scores** from **keyword** and **vector search**, **ordered by score**: + + + + + + + + + + + + + + +
Search Type(id): score(id): score(id): score(id): score(id): score
Keyword(1): 5(0): 2.6(2): 2.3(4): 0.2(3): 0.09
Vector(2): 0.6(4): 0.598(0): 0.596(1): 0.594(3): 0.009
+ +#### Ranked Fusion + +The score depends on the rank of each result and is computed according to `1/(RANK + 60)`, resulting in: + + + + + + + + + + + + + + +
Search Type(id): score(id): score(id): score(id): score(id): score
Keyword(1): 0.0154(0): 0.0160(2): 0.0161(4): 0.0167(3): 0.0166
Vector(2): 0.016502(4): 0.016502(0): 0.016503(1): 0.016503(3): 0.016666
+ +As you can see, the results for each rank are identical, regardless of the input score. + +#### Relative Score Fusion + +In relative score fusion, the largest score is set to 1 and the lowest to 0, and all entries in-between are scaled according to their **relative distance** to the **maximum** and **minimum values**. + + + + + + + + + + + + + + +
Search Type(id): score(id): score(id): score(id): score(id): score
Keyword(1): 1.0(0): 0.511(2): 0.450(4): 0.022(3): 0.0
Vector(2): 1.0(4): 0.996(0): 0.993(1): 0.986(3): 0.0
+ +The scores therefore reflect the relative distribution of the original scores. For example, the vector search scores of the first 4 documents were almost identical, which is still the case for the normalized scores. + +#### Comparison + +For the vector search, the scores for the top 4 objects (**IDs 2, 4, 0, 1**) were almost identical, and all of them were good results. While for the keyword search, one object (**ID 1**) was much better than the rest. + +This is captured in the final result of `relativeScoreFusion`, which identified the object **ID 1** the top result. This is justified because this document was the best result in the keyword search with a big gap to the next-best score and in the top group of vector search. + +In contrast, for `rankedFusion`, the object **ID 2** is the top result, closely followed by objects **ID 1** and **ID 0**. + +### Alpha Parameter + +The alpha value determines the weight of the vector search results in the final hybrid search results. The alpha value can range from 0 to 1: + +- `alpha = 0.5` (default): Equal weight to both searches +- `alpha > 0.5`: More weight to vector search +- `alpha < 0.5`: More weight to keyword search + +## Search Thresholds + +Hybrid search supports a maximum vector distance threshold through the `max vector distance` parameter. + +This threshold applies only to the vector search component of the hybrid search, allowing you to filter out results that are too dissimilar in vector space, regardless of their keyword search scores. + +For example, consider a maximum vector distance of `0.3`. This means objects with a vector distance higher than `0.3` will be excluded from the hybrid search results, even if they have high keyword search scores. + +This can be useful when you want to ensure semantic similarity meets a minimum standard while still taking advantage of keyword matching. + +There is no equivalent threshold parameter for the keyword (BM25) component of hybrid search or the final combined scores. + +This is because BM25 scores are not normalized or bounded like vector distances, making a universal threshold less meaningful. + +## Further resources + +- [How-to: Search](../../search/index.md) +- [How-to: Hybrid search](../../search/hybrid.md) +- [Blog: A deep dive into Weaviate's fusion algorithms](/blog/hybrid-search-fusion-algorithms) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/concepts/search/index.md b/developers/weaviate/concepts/search/index.md index 3483b4950f..3cdd52dcf2 100644 --- a/developers/weaviate/concepts/search/index.md +++ b/developers/weaviate/concepts/search/index.md @@ -13,14 +13,67 @@ The following sections provide a conceptual overview of search in Weaviate, incl ## Search process -The following table illustrates the search process in Weaviate. Around the core search process, there are several steps that can be taken to improve and manipulate the search results. +The following table and figure illustrate the search process in Weaviate. Around the core search process, there are several steps that can be taken to improve and manipulate the search results. | Step | Description | Optional | |------|-------------|----------| | 1. [Retrieval](#retrieval-filter) | [Filter](#retrieval-filter): Narrow result sets based on criteria
[Search](#retrieval-search): Find the most relevant entries, using one of [keyword](#keyword-search), [vector](#vector-search) or [hybrid](#hybrid-search) search types
| Required | -| 2. [Reranking](#rerank) | Reorder results using a different (e.g. more complex) model | Optional | +| 2. [Rerank](#rerank) | Reorder results using a different (e.g. more complex) model | Optional | | 3. [Retrieval augmented generation](#retrieval-augmented-generation-rag) | Send retrieved data and a prompt to a generative AI model. Also called retrieval augmented generation, or RAG. | Optional | +
+ +```mermaid +flowchart LR + %% Node definitions + Query[/"🔍 Query"/] + Filter["Filter"] + Key["Keyword Search\n(BM25F)"] + Vec["Vector Search\n(Embeddings)"] + Hyb["Hybrid Search\n(Combined)"] + Rerank["Rerank\n(Optional)"] + RAG["RAG\n(Optional)"] + Results[/"📊 Results"/] + + %% Main flow grouping + subgraph retrieval ["Retrieval"] + direction LR + Filter + search + end + + subgraph search ["Search"] + direction LR + Key + Vec + Hyb + end + + %% Connections + Query --> retrieval + Filter --> search + retrieval --> Results + retrieval --> Rerank + Rerank --> RAG + RAG --> Results + + %% Node styles + style Query fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Filter fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Key fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Vec fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Hyb fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Rerank fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style RAG fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Results fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Subgraph styles + style retrieval fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 + style search fill:#ffffff,stroke:#7AD6EB,stroke-width:2px,color:#130C49 +``` + +
+ Here is a brief overview of each step: ### Retrieval: Filter @@ -139,9 +192,13 @@ For example: +:::info Read more +See the [keyword search](./keyword-search.md) page for more details on how keyword search works in Weaviate. +::: + #### Vector Search -Similarity-based search using [vector embeddings](#vector-embeddings). This method compares vector representations of the query against those of the stored objects to find the closest matches, based on a predefined [distance metric](../../config-refs/distances.md). +Similarity-based search using vector embeddings. This method compares vector representations of the query against those of the stored objects to find the closest matches, based on a predefined [distance metric](../../config-refs/distances.md). In Weaviate, you can perform vector searches in multiple ways. You can search for similar objects based on [a text input](../../search/similarity.md#search-with-text), [a vector input](../../search/similarity.md#search-with-a-vector), or [an exist object](../../search/similarity.md#search-with-an-existing-object). You can even search for similar objects with other modalities such as [with images](../../search/image.md). @@ -187,9 +244,13 @@ For example: +:::info Read more +See the [vector search](./vector-search.md) page for more details on how vector search works in Weaviate. +::: + #### Hybrid Search -Combines vector and keyword search to leverage the strengths of both approaches. Both searches are carried out and the results are combined using the selected [hybrid fusion method](#hybrid-fusion-method) and the given [alpha](#alpha-hybrid-search) value. +Combines vector and keyword search to leverage the strengths of both approaches. Both searches are carried out and the results are combined using the selected parameters, such as the hybrid fusion method and the alpha value.
Hybrid Search: Example @@ -234,6 +295,10 @@ For example:
+:::info Read more +See the [hybrid search](./hybrid-search.md) page for more details on how hybrid search works in Weaviate. +::: + ### Retrieval: Unordered Queries can be formulated without any ranking mechanisms. @@ -274,7 +339,7 @@ Retrieval augmented generation (RAG), also called generative search, combines se Weaviate integrates with many popular [generative model providers](../../model-providers/index.md) such as [AWS](../../model-providers/aws/generative.md), [Cohere](../../model-providers/cohere/generative.md), [Google](../../model-providers/google/generative.md), [OpenAI](../../model-providers/openai/generative.md) and [Ollama](../../model-providers/ollama/generative.md). -As a result, Weaviate makes RAG easy to [set up](../../manage-data/collections.mdx#specify-a-generative-module), and easy to [execute as an integrated, single query](../../search/generative.md#grouped-task-search). +As a result, Weaviate makes RAG easy to [set up](../../manage-data/collections.mdx#specify-a-generative-model-integration), and easy to [execute as an integrated, single query](../../search/generative.md#grouped-task-search).
RAG: Example @@ -307,31 +372,22 @@ The search results consist of `{"description": "black bear"}` and `{"description ```
-## Glossary - -#### Vector embeddings - -A vector embedding captures semantic meaning of an object in a vector space. It consists of a set of numbers that represent the object's features. Vector embeddings are generated by a vectorizer model, which is a machine learning model that is trained for this purpose. - -#### BM25F algorithm - -The BM25 algorithm ranks matching documents according to their relevance to a given search query. At a high level, the BM25 algorithm uses the count of query terms in the document (term frequency) against the overall frequency of the term in the dataset (inverse document frequency) to calculate a relevance score. - -The BM25F variant extends the BM25 algorithm to support multiple fields in the search index. - -#### Hybrid fusion method - -Weaviate uses a hybrid fusion method to combine the results of vector and keyword searches. The method determines how the results of the two searches are combined to produce the final search results. +## Search scores and metrics -There are two algorithms available: `relativeScoreFusion` (default from `1.24`) and `rankedFusion` (default until `1.24`). +Weaviate uses a variety of metrics to rank search results of a given query. The following metrics are used in Weaviate: -With `rankedFusion`, each object is scored according to its position in the results for the given search, starting from the highest score for the top-ranked object and decreasing down the order. The total score is calculated by adding these rank-based scores from the vector and keyword searches. +- Vector distance: A vector distance measure between the query and the object. +- BM25F score: A keyword search score calculated using the BM25F algorithm. +- Hybrid score: A combined score from vector and keyword searches. -With `relativeScoreFusion`, each object is scored by *normalizing* the metrics output by the vector search and keyword search respectively. The highest value becomes 1, the lowest value becomes 0, and others end up in between according to this scale. The total score is thus calculated by a scaled sum of normalized vector similarity and normalized BM25 score. +## Further resources -#### Alpha (hybrid search) +For more details, see the respective pages for: +- [Concepts: Vector search](./vector-search.md) +- [Concepts: Keyword search](./keyword-search.md) +- [Concepts: Hybrid search](./hybrid-search.md). -The alpha value determines the weight of the vector search results in the final hybrid search results. The alpha value ranges from 0 to 1, where 0 means only keyword search results are considered, and 1 means only vector search results are considered. +For code snippets on how to use these search types, see the [How-to: search](../search/index.md) page. ## Questions and feedback diff --git a/developers/weaviate/concepts/search/keyword-search.md b/developers/weaviate/concepts/search/keyword-search.md new file mode 100644 index 0000000000..a8f64e6822 --- /dev/null +++ b/developers/weaviate/concepts/search/keyword-search.md @@ -0,0 +1,182 @@ +--- +title: Keyword Search (BM25) +sidebar_position: 40 +image: og/docs/concepts.jpg +# tags: ['concepts', 'search', 'keyword search', 'bm25', 'keyword'] +--- + +Keyword search is an exact matching-based search using "tokens", or strings of characters. + +It uses the BM25 algorithm, which ranks matching documents according to their relevance to a given search query. At a high level, the BM25 algorithm uses the count of query terms in the document (term frequency) against the overall frequency of the term in the dataset (inverse document frequency) to calculate a relevance score. + +More specifically, Weaviate uses the BM25F algorithm, which extends BM25 to support using multiple fields in the search index. + +A keyword search determines the best matches based on the matches of exact tokens contained in the query against those of the stored objects. As a result, a keyword search is a good choice when exact matches (e.g. exact domain-specific language, precise categories or tags) are important. For example: + +- Searching for documents containing specific technical terms +- Identifying articles by precise keywords or tags + +This differs from vector search, which finds semantically similar content even when the exact words don't match. You might use keyword search when precision is more important than finding related concepts. + +## Keyword search in Weaviate + +In Weaviate, a keyword search will return the objects best matching the query, as measured by [BM25F](https://en.wikipedia.org/wiki/Okapi_BM25) "score". + +:::info BM25F vs BM25 +The "F" in BM25F stands for "field", indicating that it is a field-specific version of BM25. This allows for different weights for different fields, or properties, of the objects. +
+ +In Weaviate, they are used interchangeably, as the BM25F algorithm is used to calculate the scores for keyword searches. Here we will refer to it generally as BM25. +::: + +A BM25 score is calculated based on the frequency of the query tokens in the object properties, as well as the length of the object properties and the query. + +When an input string such as `"A red Nike shoe"` is provided as the query, Weaviate will: + +1. [Tokenize](#tokenization) the input (e.g. to `["a", "red", "nike", "shoe"]`) +2. Remove any [stopwords](#stopwords) (e.g. remove `a`, to produce `["red", "nike", "shoe"]`) +3. Determine the BM25 scores against [selected properties](#selected-properties) of the database objects, based on the [BM25 parameters](#bm25-parameters) and any [property boosting](#property-boosting). +4. Return the objects with the highest BM25 scores as the search results + +### Tokenization + +Tokenization for keyword searches refers to how each source text is split up into individual "tokens" to be compared and matched. + +The default tokenization method is `word`. + +Other tokenization methods such as `whitespace`, `lowercase`, and `field` are available, as well as specialized ones such as `GSE` or `kagome_kr` for other languages ([more details](../../config-refs/schema/index.md#tokenization)). + +Set the tokenization option [in the inverted index configuration](../../search/bm25.md#set-tokenization) for a collection. + +:::info Tokenization in different contexts + +The term "tokenization" is used in other contexts such as vectorization, or language generation. Note that each of these typically use different tokenizers to meet different requirements. This results in different sets of tokens, even from the same input text. + +::: + +### Stopwords + +Stopwords are words that are filtered out before processing text. + +Weaviate uses configurable stopwords in calculating the BM25 score. Any tokens that are contained in the stopword list will be ignored from the BM25 score calculation. + +See the [reference page](../../config-refs/schema/index.md#stopwords-stopword-lists) for more details. + +### BM25 Parameters + +BM25 is a scoring function used to rank documents based on the query terms appearing in them. It has two main parameters that control its behavior: + +- `k1` (default: 1.2): Controls term frequency saturation. Higher values mean that multiple occurrences of a term continue to increase the score more +- `b` (default: 0.75): Controls document length normalization. Values closer to 1 mean more normalization for document length + +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'primaryColor': '#4a5568', + 'primaryTextColor': '#2d3748', + 'primaryBorderColor': '#718096', + 'lineColor': '#718096', + 'secondaryColor': '#f7fafc', + 'tertiaryColor': '#edf2f7', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'fontSize': '14px', + 'lineHeight': '1.4', + 'nodeBorder': '1px', + 'mainBkg': '#ffffff', + 'clusterBkg': '#f8fafc' + } +}}%% + +flowchart LR + %% Style definitions + classDef systemBox fill:#f8fafc,stroke:#3182ce,stroke-width:1.5px,color:#2d3748,font-weight:bold + classDef processBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef component fill:white,stroke:#a0aec0,stroke-width:1px,color:#2d3748 + classDef paramBox fill:white,stroke:#3182ce,stroke-width:1px,color:#2d3748 + + %% Main flow + query["🔍 Query Text"] --> tokenize["⚡ Tokenization"] + tokenize --> stopwords["🚫 Stopword\nRemoval"] + stopwords --> scoring["📊 BM25\nScoring"] + + %% Parameters section + subgraph params["Parameter Configuration"] + direction TB + k1["k1: Term Frequency\nSaturation Control"] + b["b: Document Length\nNormalization"] + end + + params --> scoring + scoring --> results["📑 Ranked\nResults"] + + %% Apply styles + class query,tokenize,stopwords,scoring,results component + class params processBox + class k1,b paramBox + + %% Linkstyle for curved edges + linkStyle default stroke:#718096,stroke-width:3px,fill:none,background-color:white +``` + +Set custom `k1` and `b` values [for a collection](../../manage-data/collections.mdx#set-inverted-index-parameters). + + + +### Selected properties + +A BM25 query can optionally specify which object properties are to be included in the score calculations. + +By default, all `text` properties are included in a BM25 calculation. There are two ways to vary this: + +- In the collection configuration, [set `indexSearchable` for a property to `false`](../../manage-data/collections.mdx#property-level-settings). This property will then be ignored in all BM25 searches. +- [Specify which properties to search at query time](../../search/bm25.md#search-on-selected-properties-only). This will only apply for that particular query. + +### Property Boosting + +Property boosting allows a query apply different weights to different properties when calculating the final BM25 score. + +This is useful when certain properties are more important for search than others. + +For example, when searching an e-commerce catalog, you could boost the title property and its categories over the product description. + + + +[Set the property weights](../../search/bm25.md#use-weights-to-boost-properties) at query time. + +## Combining with Vector Search + +Keyword search can be combined with vector search in Weaviate to perform a hybrid search. This allows you to leverage both: +- Exact matching capabilities of keyword search +- Semantic understanding of vector search + +See [Hybrid Search](./hybrid-search.md) for more information. + +## Notes and Best Practices + +Here are some key considerations when using keyword search: + +1. **Tokenization Choice** + - Choose based on your data and search requirements. For example, use `word` tokenization for natural language text, but consider `field` for URLs or email addresses that need exact matching as a whole. + - For multilingual content, consider specialized tokenizers like `GSE` for Chinese/Japanese or `kagome_kr` for Korean + - Consider special characters and case sensitivity needs + - Test your tokenization choice with subsets of your data and queries to ensure it handles special characters and case sensitivity as expected. You could perform these experiments with vectorization disabled to save resources/costs, as the two processes are independent. + +2. **Performance Optimization** + - Index only the properties you need for search + - Consider combining keyword search with vector search (i.e. perform a [hybrid search](./hybrid-search.md)) as a starting point, especially where you cannot anticipate users' behavior + +3. **Query Optimization** + - Consider boosting properties that are more important for search (e.g. title, category) over others (e.g. description) + - Only modify `k1` and `b` values if you have a good reason to do so, as the defaults are generally well-suited for most use cases + +### Further resources + +- [How-to: Search](../../search/index.md) +- [How-to: Keyword search](../../search/bm25.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/concepts/search/vector-search.md b/developers/weaviate/concepts/search/vector-search.md new file mode 100644 index 0000000000..20142e8035 --- /dev/null +++ b/developers/weaviate/concepts/search/vector-search.md @@ -0,0 +1,290 @@ +--- +title: Vector Search +sidebar_position: 20 +image: og/docs/concepts.jpg +# tags: ['concepts', 'search', 'vector search', 'vector'] +--- + +Vector search is a similarity-based search using vector embeddings, or vectors. Vector search also referred to as "semantic search" due to its ability to find semantically similar objects. + +A vector embedding captures semantic meaning of an object in a vector space. It consists of a set of numbers that represent the object's features. Vector embeddings are generated by a vectorizer model, which is a machine learning model that is trained for this purpose. + +A vector search compares [vectors of the stored objects](#object-vectors) against the [query vector(s)](#query-vectors) to find the closest matches, before returning the top `n` results. + +:::tip An introduction to vector search +New to vector search? Check out our blog, ["Vector Search Explained"](/blog/vector-search-explained) for an introduction to vector search concepts and use cases. +::: + +## Object vectors + +For vector search, each object must have representative vector embeddings. + +The model used to generate vectors is called a vectorizer model, or an embedding model. + +A user can populate Weaviate with objects and their vectors in one of two ways: + +- Use Weaviate's [vectorizer model provider integrations](#model-provider-integration) to generate vectors +- [Provide vectors directly](#bring-your-own-vector) to Weaviate + +### Model provider integration + +Weaviate provides [first-party integrations with popular vectorizer model providers](../../model-providers/index.md) such as [Cohere](../../model-providers/cohere/index.md), [Ollama](../../model-providers/ollama/index.md), [OpenAI](../../model-providers/openai/index.md), and more. + +In this workflow, the user can [configure a vectorizer for a collection](../../manage-data/collections.mdx#specify-a-vectorizer) and Weaviate will automatically generate vectors as needed, such as when inserting objects or performing searches. + +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'primaryColor': '#4a5568', + 'primaryTextColor': '#2d3748', + 'primaryBorderColor': '#718096', + 'lineColor': '#718096', + 'secondaryColor': '#f7fafc', + 'tertiaryColor': '#edf2f7', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'fontSize': '14px', + 'lineHeight': '1.4', + 'nodeBorder': '1px', + 'mainBkg': '#ffffff', + 'clusterBkg': '#f8fafc' + } +}}%% + +flowchart LR + %% Style definitions + classDef systemBox fill:#f8fafc,stroke:#3182ce,stroke-width:1.5px,color:#2d3748,font-weight:bold + classDef weaviateBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef cloudBox fill:white,stroke:#48bb78,stroke-width:2px,color:#553c9a,font-weight:bold + classDef providerBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef component fill:white,stroke:#a0aec0,stroke-width:1px,color:#2d3748 + classDef edgeLabel fill:white,stroke:#e2e8f0,stroke-width:1px,color:#4a5568 + + %% Provider section + subgraph provider["Model provider"] + inference["🤖 Inference API /\nLocal model"] + end + + %% Weaviate section + subgraph weaviate["Weaviate"] + vectorizer["🔌 Model provider\nintegration"] + core["💾 Data &\nvector store"] + end + + %% User System + subgraph user["🖥️ User System"] + data["📄 Data"] + end + + %% Connections with curved edges + data --->|"1. Insert objects\n(no vector)"| core + core --->|"2. Request\nvector"| vectorizer + vectorizer --->|"3. Request\nvector"| inference + inference --->|"4. Vector"| vectorizer + vectorizer --->|"5. Vector"| core + + %% Apply styles + class user systemBox + class weaviate weaviateBox + class cloud cloudBox + class provider providerBox + class data,core,vectorizer,inference component + + %% Linkstyle for curved edges + linkStyle default stroke:#718096,stroke-width:3px,fill:none,background-color:white +``` + +This integration abstracts the vector generation process from the user, allowing the user to focus on building applications and performing searches without worrying about the vector generation process. + +:::info Vectorizer configuration is immutable + +Once it is set, the vectorizer cannot be changed for a collection. This ensures that the vectors are generated consistently and stay compatible. If you need to change the vectorizer, you must create a new collection with the desired vectorizer, and [migrate the data to the new collection](../../manage-data/migrate.mdx). + +::: + +#### Manual vectors when vectorizer is configured + +Even when a vectorizer model is configured for a collection, a user can still provide vectors directly when inserting objects or performing a query. In this case, Weaviate will use the provided vector instead of generating a new one. + +This is useful when the user already has vectors generated by the same model, such as when importing objects from another system. Re-using the same vectors will save time and resources, as Weaviate will not need to generate new vectors. + +### Bring your own vector + +A user can directly upload vectors to Weaviate when inserting objects. This is useful when the user already has vectors generated by a model, or if the user wants to use a specific vectorizer model that does not have an integration with Weaviate. + +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'primaryColor': '#4a5568', + 'primaryTextColor': '#2d3748', + 'primaryBorderColor': '#718096', + 'lineColor': '#718096', + 'secondaryColor': '#f7fafc', + 'tertiaryColor': '#edf2f7', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'fontSize': '14px', + 'lineHeight': '1.4', + 'nodeBorder': '1px', + 'mainBkg': '#ffffff', + 'clusterBkg': '#f8fafc' + } +}}%% + +flowchart LR + %% Style definitions + classDef systemBox fill:#f8fafc,stroke:#3182ce,stroke-width:1.5px,color:#2d3748,font-weight:bold + classDef weaviateBox fill:#f8fafc,stroke:gray,stroke-width:0.5px,color:#2d3748,font-weight:bold + classDef component fill:white,stroke:#a0aec0,stroke-width:1px,color:#2d3748 + classDef edgeLabel fill:white,stroke:#e2e8f0,stroke-width:1px,color:#4a5568 + + %% Weaviate section + subgraph weaviate["Weaviate"] + core["💾 Data &\nvector store"] + end + + %% User System + subgraph user["🖥️ User System"] + data["📄 Data"] + end + + %% Connections with curved edges + data --->|"1. Insert objects\n(with vectors)"| core + + %% Apply styles + class user systemBox + class weaviate weaviateBox + class cloud cloudBox + class provider providerBox + class data,core,vectorizer,inference component + + %% Linkstyle for curved edges + linkStyle default stroke:#718096,stroke-width:3px,fill:none,background-color:white +``` + +In this workflow, the user has the flexibility to use any vectorizer model and process independently of Weaviate. + +If using your own model, we recommend explicitly setting the vectorizer as `none` in the vectorizer configuration, such that you do not accidentally generate incompatible vectors with Weaviate. + +### Multiple object vectors + +:::info Added in `v1.24` +::: + +A collections can be configured to allow each object to be represented my multiple vectors. + +Each such vector works as its distinct vector space that is independent of each other, referred to as a "named vector". + +A named vector can be configured with a [vectorizer model integration](#model-provider-integration), and may be provided using the ["bring your own vector"](#bring-your-own-vector) integration. + +## Query vectors + +In Weaviate, you can specify the query vector using: + +- A query vector (called `nearVector`), +- A query object (called `nearObject`), +- A query text (called `nearText`), or +- A query media (called `nearImage` or `nearVideo`). + +In each of these cases, the search will return the most similar objects to the query, based on the vector embeddings of the query and the stored objects. However, they differ in how the query vector is specified to Weaviate. + +### `nearVector` + +In a `nearVector` query, the user provides a vector directly to Weaviate. This vector is compared to the vectors of the stored objects to find the most similar objects. + +### `nearObject` + +In a `nearObject` query, the user provides an object ID to Weaviate. Weaviate retrieves the vector of the object and compares it to the vectors of the stored objects to find the most similar objects. + +### `nearText` (and `nearImage`, `nearVideo`) + +In a `nearText` query, the user provides an input text to Weaviate. Weaviate uses the specified vectorizer model to generate a vector for the text, and compares it to the vectors of the stored objects to find the most similar objects. + +As a result, a `nearText` query is only available for collections where a vectorizer model is configured. + +A `nearImage` or `nearVideo` query works similarly to a `nearText` query, but with an image or video input instead of text. + +## Multi-target vector search + +:::info Added in `v1.26` +::: + +In a multi-target vector search, Weaviate performs multiple, concurrent, single-target vector searches. + +These searches will produce multiple sets of results, each with a vector distance score. + +Weaviat combines these result sets, using a ["join strategy"](#available-join-strategies) to produce final scores for each result. + +If an object is within the search limit or the distance threshold of any of the target vectors, it will be included in the search results. + +If an object does not contain vectors for any selected target vector, Weaviate ignores that object and does not include it in the search results. + +### Available join strategies. + +- **minimum** (*default*) Use the minimum of all vector distances. +- **sum** Use the sum of the vector distances. +- **average** Use the average of the vector distances. +- **manual weights** Use the sum of weighted distances, where the weight is provided for each target vector. +- **relative score** Use the sum of weighted normalized distances, where the weight is provided for each target vector. + +## Vector index and search + +Weaviate uses vector indexes to facilitate efficient vector searches. Like other types of indexes, a vector index organizes vector embeddings in a way that allows for fast retrieval while optimizing for other needs such as search quality (e.g. recall), search throughput, and resource use (e.g. memory). + +In Weaviate, multiple types of vector indexes are available such as `hnsw`, `flat` and `dynamic` indexes. + +Each [collection](../data.md#collections) or [tenant](../data.md#multi-tenancy) in Weaviate will have its own vector index. Additionally, each collection or tenant can have [multiple vector indexes](../data.md#multiple-vectors-named-vectors), each with different configurations. + +:::info +Read more about: +- [Collections](../data.md#collections) +- [Multi-tenancy](../data.md#multi-tenancy) +- [Vector indexes](../vector-index.md) +- [Multiple named vectors](../data.md#multiple-vectors-named-vectors) +::: + +### Distance metrics + +There are many ways to measure vector distances, such as cosine distance, dot product, and Euclidean distance. Weaviate supports a variety of these distance metrics, as listed on the [distance metrics](../../config-refs/distances.md) page. Each vectorizer model is trained with a specific distance metric, so it is important to use the same distance metric for search as was used for training the model. + +Weaviate uses cosine distance as the default distance metric for vector searches, as this is the typical distance metric for vectorizer models. + +:::tip Distance vs Similarity +In a "distance", the lower the value, the closer the vectors are to each other. In a "similarity", or "certainty" score, the higher the value, the closer the vectors are to each other. Some metrics, such as cosine distance, can also be expressed as a similarity score. Others, such as Euclidean distance, are only expressable as a distance. +::: + +## Notes and best practices + +All compatible vectors are similar to some degree search. + +This has two effects: + +1. There will always be some "top" search results regardless of relevance. +1. The entire dataset is always returned. + +If you search a vector database containing vectors for colors "Red", "Crimson" and "LightCoral" with a query vector for "SkyBlue", the search will still return a result (e.g. "Red"), even if it is not semantically similar to the query. The search is simply returning the closest match, even if it is not a good match in the absolute sense. + +As a result, Weaviate provides multiple ways to limit the search results: + +- **Limit**: Specify the maximum number of results to return. + - If not provided, defaults to system-defined [`QUERY_DEFAULTS_LIMIT`](../../config-refs/env-vars.md#general) of 10. +- **AutoCut**: Limit results based on discontinuities in result metrics such as vector distance or search score. +- **Threshold**: Specify a minimum similarity score (e.g. maximum cosine distance) for the results. +- **Apply filters**: Use [filters](../filtering.md) to exclude results based on other criteria, such as metadata or properties. + +Use a combination of these methods to ensure that the search results are meaningful and relevant to the user. + +Generally, start with a `limit` to a maximum number of results to provide to the user, and adjust the `threshold` such that irrelevant results are unlikely to be returned. + +This will cause the search to return up to the specified (`limit`) number of results, but only if they are above the specified (`threshold`) similarity score. + +### Further resources + +- [How-to: Search](../../search/index.md) +- [How-to: Vector similarity search](../../search/similarity.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/concepts/vector-index.md b/developers/weaviate/concepts/vector-index.md index 31b8aa4a2a..0ccdceb0e8 100644 --- a/developers/weaviate/concepts/vector-index.md +++ b/developers/weaviate/concepts/vector-index.md @@ -5,7 +5,7 @@ image: og/docs/concepts.jpg # tags: ['vector index plugins'] --- -Vector indexing is a key component of vector databases. It can help to [significantly **increase the speed** of the search process of similarity search](https://weaviate.io/blog/why-is-vector-search-so-fast) with only a minimal tradeoff in search accuracy ([HNSW index](#hierarchical-navigable-small-world-hnsw-index)), or efficiently store many subsets of data in a small memory footprint ([flat index](#flat-index)). The [dynamic index](#dynamic-index) can even start off as a flat index and then dynamically switch to the HNSW index as it scales past a threshold. +What is vector indexing? It's a key component of vector databases that helps to [significantly **increase the speed** of the search process of similarity search](https://weaviate.io/blog/vector-search-explained) with only a minimal tradeoff in search accuracy ([HNSW index](#hierarchical-navigable-small-world-hnsw-index)), or efficiently store many subsets of data in a small memory footprint ([flat index](#flat-index)). The [dynamic index](#dynamic-index) can even start off as a flat index and then dynamically switch to the HNSW index as it scales past a threshold. Weaviate's vector-first storage system takes care of all storage operations with a vector index. Storing data in a vector-first manner not only allows for semantic or context-based search, but also makes it possible to store *very* large amounts of data without decreasing performance (assuming scaled well horizontally or having sufficient shards for the indexes). @@ -20,9 +20,13 @@ Available starting in `v1.25`. This is an experimental feature. Use with caution This page explains what vector indexes are, and what purpose they serve in the Weaviate vector database. +:::info What is a vector index? +In vector databases, a vector index is a data structure that organizes vector embeddings to enable efficient similarity search. Indexing vector databases properly is crucial for performance, and different index types serve different purposes - from the simple flat index to more sophisticated approaches like HNSW. +::: + ## Why do you need vector indexing? -[Vector embeddings](https://weaviate.io/blog/vector-embeddings-explained) are a great way to represent meaning. Vectors embeddings are arrays of elements that can capture meaning from different data types, such as texts, images, videos, and other content. The number of elements are called dimensions. High dimension vectors capture more information, but they are harder to work with. +[Vector embeddings](https://weaviate.io/blog/vector-embeddings-explained) are a great way to represent meaning. Understanding how to index a vector is crucial for working with vector databases effectively. Vectors embeddings are arrays of elements that can capture meaning from different data types, such as texts, images, videos, and other content. The number of elements are called dimensions. High dimension vectors capture more information, but they are harder to work with. Vector databases make it easier to work with high dimensional vectors. Consider search; Vector databases efficiently measure semantic similarity between data objects. When you run a [similarity search](https://weaviate.io/developers/weaviate/search/similarity), a vector database like Weaviate uses a vectorized version of the query to find objects in the database that have vectors similar to the query vector. @@ -41,9 +45,11 @@ Another way to think of this is how products are placed in a supermarket. You'd ![Supermarket map visualization as analogy for vector indexing](./img/supermarket.svg "Supermarket map visualization") :::tip -You might be also interested in our blog post [Why is vector search to fast?](https://weaviate.io/blog/why-is-vector-search-so-fast). +You might be also interested in our blog post [Vector search explained](https://weaviate.io/blog/vector-search-explained). ::: +Let's explore how to index a vector using different approaches supported by Weaviate. The first method is the HNSW index. + ## Hierarchical Navigable Small World (HNSW) index **Hierarchical Navigable Small World (HNSW)** is an algorithm that works on multi-layered graphs. It is also an index type, and refers to vector indexes that are created using the HNSW algorithm. HNSW indexes enable very fast queries, but rebuilding the index when you add new vectors can be resource intensive. @@ -143,14 +149,28 @@ Cleanup is an async process runs that rebuilds the HNSW graph after deletes and Available starting in `v1.22`. This is an experimental feature. Use with caution. ::: -Starting in Weaviate `1.22`, you can use asynchronous indexing by opting in. +This feature relates to the vector index, specifically only to the HNSW index. -Asynchronous indexing decouples object creation from vector index updates. Objects are created faster, and the vector index updates in the background. Asynchronous indexing is especially useful for importing large amounts of data. +Asynchronous indexing can be enabled by opting in as follows: +- Open-source users can do this by setting the `ASYNC_INDEXING` environment variable to `true`. +- Weaviate Cloud users can do this by toggling the `Enable async indexing` switch in the Weaviate Cloud Console. -While the vector index is updating, Weaviate can search a maximum of 100,000 un-indexed objects by brute force, that is, without using the vector index. This means that the search performance is slower until the vector index has been fully updated. Also, any additional new objects beyond the first 100,000 in the queue are not include in the search. +With synchronous indexing, the vector index is updated in lockstep with the object store. Updating an HNSW index can be an expensive operation, especially as the size of the index grows. As a result, the indexing operation can be the bottleneck in the system, slowing down the time for user requests to be completed. -:::tip -You might be also interested in our blog post [Vamana vs. HNSW - Exploring ANN algorithms Part 1](https://weaviate.io/blog/ann-algorithms-vamana-vs-hnsw). +When asynchronous indexing is enabled, all vector indexing operations go through a queue. This applies to not only batch imports, but also to single object imports, deletions, and updates. + +This means that the object store can be updated quickly to finish performing user requests while the vector index updates in the background. Asynchronous indexing is especially useful for importing large amounts of data. + +This means that there will be a short delay between object creation and the object being available for vector search using the HNSW index. The number of objects in the queue can be monitored per node [as shown here](../config-refs/nodes.md). + +:::info Changes in `v1.28` +In Weaviate `v1.22` to `v1.27`, the async indexing feature only affected batch import operations, using an in-memory queue. +
+ +Starting in `v1.28`, the async indexing feature has been expanded to include single object imports, deletions, and updates. Additionally, the in-memory queue has been replaced with a persistent, on-disk queue. This change allows for more robust handling of indexing operations, and improves performance though reduction of lock contention and memory usage. +
+ +The use of an on-disk queue may result in a slight increase in disk usage, however this is expected to be a small percentage of the total disk usage. ::: ## Flat index @@ -158,7 +178,7 @@ You might be also interested in our blog post [Vamana vs. HNSW - Exploring ANN a :::info Added in `v1.23` ::: -The **flat index** is a simple, lightweight index that is fast to build and has a very small memory footprint. This index type is a good choice for use cases where each end user (i.e. tenant) has their own, isolated, dataset, such as in a SaaS product for example, or a database of isolated record sets. +The **flat index** is one of the fundamental ways to implement vector indexing in databases. As the name suggests, it's a simple, lightweight index that is fast to build and has a very small memory footprint. This index type is a good choice for use cases where each end user (i.e. tenant) has their own, isolated, dataset, such as in a SaaS product for example, or a database of isolated record sets. As the name suggests, the flat index is a single layer of disk-backed data objects and thus a very small memory footprint. The flat index is a good choice for small collections, such as for multi-tenancy use cases. diff --git a/developers/weaviate/concepts/vector-quantization.md b/developers/weaviate/concepts/vector-quantization.md index de013a8550..5a06caae69 100644 --- a/developers/weaviate/concepts/vector-quantization.md +++ b/developers/weaviate/concepts/vector-quantization.md @@ -14,8 +14,13 @@ Weaviate currently offers two vector quantization techniques: - [Scalar quantization (SQ)](#scalar-quantization) ## What is quantization? + In general, quantization techniques reduce the memory footprint by representing numbers with lower precision numbers, like rounding a number to the nearest integer. In neural networks, quantization reduces the values of the weights or activations of the model stored as a 32-bit floating-point number (4 bytes) to a lower precision number, such as an 8-bit integer (1 byte). +### What is vector quantization? + +Vector quantization is a technique that reduces the memory footprint of vector embeddings. Vector embeddings have been typically represented as 32-bit floating-point numbers. Vector quantization techniques reduce the size of the vector embeddings by representing them as smaller numbers, such as 8-bit integers or binary numbers. Some quantization techniques also reduce the number of dimensions in the vector embeddings. + ## Product quantization [Product quantization](https://ieeexplore.ieee.org/document/5432202) is a multi-step quantization technique that is available for use with `hnsw` indexes in Weaivate. diff --git a/developers/weaviate/config-refs/datatypes.md b/developers/weaviate/config-refs/datatypes.md index de05d59bb5..6358e9243f 100644 --- a/developers/weaviate/config-refs/datatypes.md +++ b/developers/weaviate/config-refs/datatypes.md @@ -1,5 +1,6 @@ --- title: Data types +description: Data Types in Weaviate Schema sidebar_position: 20 image: og/docs/configuration.jpg # tags: ['Data types'] diff --git a/developers/weaviate/config-refs/distances.md b/developers/weaviate/config-refs/distances.md index a924162958..476f2672de 100644 --- a/developers/weaviate/config-refs/distances.md +++ b/developers/weaviate/config-refs/distances.md @@ -27,8 +27,8 @@ In all cases, larger distance values indicate lower similarity. Conversely, smal | `cosine` | Cosine (angular) distance.
[See note 1 below] | `1 - cosine_sim(a,b)` | `0 <= d <= 2` | `0`: identical vectors

`2`: Opposing vectors. | | `dot` | A dot product-based indication of distance.

More precisely, the negative dot product.
[See note 2 below] | `-dot(a,b)` | `-∞ < d < ∞` | `-3`: more similar than `-2`

`2`: more similar than `5` | | `l2-squared` | The squared euclidean distance between two vectors. | `sum((a_i - b_i)^2)` | `0 <= d < ∞` | `0`: identical vectors | -| `hamming` | Number of differences between vectors at each dimensions. | sum(|a_i != b_i|) | `0 <= d < ∞` | `0`: identical vectors | -| `manhattan` | The distance between two vector dimensions measured along axes at right angles. | sum(|a_i - b_i|) | `0 <= d < dims` | `0`: identical vectors | +| `hamming` | Number of differences between vectors at each dimensions. | sum(|a_i != b_i|) | `0 <= d < dims` | `0`: identical vectors | +| `manhattan` | The distance between two vector dimensions measured along axes at right angles. | sum(|a_i - b_i|) | `0 <= d < ∞` | `0`: identical vectors | diff --git a/developers/weaviate/config-refs/env-vars.md b/developers/weaviate/config-refs/env-vars.md index 8678c1bc13..d9f3918fe1 100644 --- a/developers/weaviate/config-refs/env-vars.md +++ b/developers/weaviate/config-refs/env-vars.md @@ -17,7 +17,7 @@ All other values are interpreted as `false`. | Variable | Description | Type | Example Value | | --- | --- | --- | --- | -| `ASYNC_INDEXING` | (Experimental as of `v1.22`.)

If set, Weaviate creates vector indexes asynchronously to the object creation process. This can be useful for importing large amounts of data. (default: `false`) | `boolean` | `false` | +| `ASYNC_INDEXING` | (Experimental, added in `v1.22`.)

If set, Weaviate creates vector indexes asynchronously to the object creation process. This can be useful for importing large amounts of data. (default: `false`) | `boolean` | `false` | | `AUTOSCHEMA_ENABLED` | Whether to infer the schema where necessary with the autoschema (default: `true`) | `boolean` | `true` | | `RAFT_ENABLE_ONE_NODE_RECOVERY` | Enable running the single node recovery routine on restart. This is useful if the default hostname has changed and a single node cluster believes there are supposed to be two nodes. | `boolean` | `false` | @@ -29,12 +29,14 @@ default hostname has changed and a single node cluster believes there are suppos | `ENABLE_API_BASED_MODULES` | Enable all API-based modules. (Experimental as of `v1.26.0`) | `boolean` | `true` | | `ENABLE_MODULES` | Specify Weaviate modules to enable | `string - comma separated names` | `text2vec-openai,generative-openai` | | `ENABLE_TOKENIZER_GSE` | Enable the [`GSE` tokenizer](../config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use | `boolean` | `true` | +| `ENABLE_TOKENIZER_KAGOME_JA` | Enable the [`Kagome` tokenizer for Japanese](../config-refs/schema/index.md#kagome_ja-tokenization-method) for use (Experimental as of `v1.28.0`) | `boolean` | `true` | | `ENABLE_TOKENIZER_KAGOME_KR` | Enable the [`Kagome` tokenizer for Korean](../config-refs/schema/index.md#kagome_kr-tokenization-method) for use (Experimental as of `v1.25.7`) | `boolean` | `true` | | `GODEBUG` | Controls debugging variables within the runtime. [See official Go docs](https://pkg.go.dev/runtime). | `string - comma-separated list of name=val pairs` | `gctrace=1` | | `GOMAXPROCS` | Set the maximum number of threads that can be executing simultaneously. If this value is set, it be respected by `LIMIT_RESOURCES`. | `string - number` | `NUMBER_OF_CPU_CORES` | | `GOMEMLIMIT` | Set the memory limit for the Go runtime. A suggested value is between 90-80% of your total memory for Weaviate. The Go runtime tries to make sure that long-lived and temporary memory allocations do not exceed this value by making the garbage collector more aggressive as the memory usage approaches the limit. [Learn more about GOMEMLIMIT](/blog/gomemlimit-a-game-changer-for-high-memory-applications). | `string - memory limit in SI units` | `4096MiB` | | `GO_PROFILING_DISABLE` | If `true`, disables Go profiling. Default: `false`. | `boolean` | `false` | | `GO_PROFILING_PORT` | Sets the port for the Go profiler. Default: `6060` | `integer` | `6060` | +| `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. (Added in `v1.27.1`) Default: 10MB | `string - number` | `2000000000` | | `LIMIT_RESOURCES` | If `true`, Weaviate will automatically attempt to auto-detect and limit the amount of resources (memory & threads) it uses to (0.8 * total memory) and (number of cores-1). It will override any `GOMEMLIMIT` values, however it will respect `GOMAXPROCS` values. | `boolean` | `false` | | `LOG_FORMAT` | Set the Weaviate logging format

Default: Outputs log data to json. e.g.: `{"action":"startup","level":"debug","msg":"finished initializing modules","time":"2023-04-12T05:07:43Z"}`
`text`: Outputs log data to a string. e.g. `time="2023-04-12T04:54:23Z" level=debug msg="finished initializing modules" action=startup` | `string` | | | `LOG_LEVEL` | Sets the Weaviate logging level. Default: `info`

`panic`: Panic entries only. (new in `v1.24`)
`fatal`: Fatal entries only. (new in `v1.24`)
`error`: Error entries only. (new in `v1.24`)
`warning`: Warning entries only. (new in `v1.24`)
`info`: General operational entries.
`debug`: Very verbose logging.
`trace`: Even finer-grained informational events than `debug`. | `string` | | @@ -58,6 +60,8 @@ default hostname has changed and a single node cluster believes there are suppos | `TOMBSTONE_DELETION_MAX_PER_CYCLE` | Maximum number of tombstones to delete per cleanup cycle. Set this to limit cleanup cycles, as they are resource-intensive. As an example, set a maximum of 10000000 (10M) for a cluster with 300 million-object shards. Default: none | `string - int` (New in `v1.24.15` / `v1.25.2`) | `10000000` | | `TOMBSTONE_DELETION_MIN_PER_CYCLE` | Minimum number of tombstones to delete per cleanup cycle. Set this to prevent triggering unnecessary cleanup cycles below a threshold. As an example, set a minimum of 1000000 (1M) for a cluster with 300 million-object shards. Default: 0 (New in `v1.24.15`, `v1.25.2`) | `string - int` | `100000` | | `USE_GSE` | Enable the [`GSE` tokenizer](../config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use.
(The same as `ENABLE_TOKENIZER_GSE`. We recommend using `ENABLE_TOKENIZER_GSE` for consistency in naming with other optional tokenizers.) | `boolean` | `true` | +| `USE_INVERTED_SEARCHABLE` | (Experimental) Store searchable properties using a more efficient in-disk format, designed for the BlockMax WAND algorithm. Set as `true` together with `USE_BLOCKMAX_WAND` to enable BlockMax WAND at query time. Added in `v1.28`. (Default: `false`)

  • This format is experimental and may be subject to breaking changes in future versions. Expect to need to re-index your data again if you enable this feature.
  • Migrations are not supported with this feature enabled. Start with a fresh index.
| `boolean` | `true` | +| `USE_BLOCKMAX_WAND` | (Experimental) Use BlockMax WAND algorithm for BM25 and hybrid searches. Recommend enabling together with `USE_INVERTED_SEARCHABLE` to get the full performance benefits. Added in `v1.28`. (Default: `false`)

  • BlockMax WAND scores on single and multiple property search may be different due to different IDF and property length normalization
| `boolean` | `true` | ## Module-specific @@ -75,6 +79,13 @@ default hostname has changed and a single node cluster believes there are suppos | `TRANSFORMERS_INFERENCE_API` | The endpoint where to reach the transformers module if enabled | `string` | `http://t2v-transformers:8080` | | `USE_GOOGLE_AUTH` | Automatically look for Google Cloud credentials, and generate Vertex AI access tokens for Weaviate to use as needed ([read more](../model-providers/google/index.md)). (default: `false`) | `boolean` | `true` | | `USE_SENTENCE_TRANSFORMERS_VECTORIZER` | (EXPERIMENTAL) Use the `sentence-transformer` vectorizer instead of the default vectorizer (from the `transformers` library). Applies to custom images only. | `boolean` | `true` | +| `CLIP_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `multi2vec-clip` module to start up before starting (default: `true`). | `boolean` | `true` | +| `NER_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `ner-transformers` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | +| `QNA_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `qna-transformers` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | +| `RERANKER_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `reranker-transformers` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | +| `SUM_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `sum-transformers` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | +| `GPT4ALL_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `text2vec-gpt4all` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | +| `TRANSFORMERS_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `text2vec-transformers` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | ## Authentication and authorization diff --git a/developers/weaviate/config-refs/schema/_category_.json b/developers/weaviate/config-refs/schema/_category_.json index 4a2475dad6..7d3e4d209c 100644 --- a/developers/weaviate/config-refs/schema/_category_.json +++ b/developers/weaviate/config-refs/schema/_category_.json @@ -1,4 +1,4 @@ { - "label": "Collection schema", + "label": "Collection definition", "position": 2 -} \ No newline at end of file +} diff --git a/developers/weaviate/config-refs/schema/index.md b/developers/weaviate/config-refs/schema/index.md index 4c90259e37..95dcb39754 100644 --- a/developers/weaviate/config-refs/schema/index.md +++ b/developers/weaviate/config-refs/schema/index.md @@ -1,5 +1,6 @@ --- title: Collection definition +description: Schema Configuration in Weaviate sidebar_position: 10 image: og/docs/configuration.jpg # tags: ['Data types'] @@ -545,6 +546,25 @@ The `gse` tokenizer is not loaded by default to save resources. To use it, set t - `"素早い茶色の狐が怠けた犬を飛び越えた"`: `["素早", "素早い", "早い", "茶色", "の", "狐", "が", "怠け", "けた", "犬", "を", "飛び", "飛び越え", "越え", "た", "素早い茶色の狐が怠けた犬を飛び越えた"]` - `"すばやいちゃいろのきつねがなまけたいぬをとびこえた"`: `["すばや", "すばやい", "やい", "いち", "ちゃ", "ちゃい", "ちゃいろ", "いろ", "のき", "きつ", "きつね", "つね", "ねが", "がな", "なま", "なまけ", "まけ", "けた", "けたい", "たい", "いぬ", "を", "とび", "とびこえ", "こえ", "た", "すばやいちゃいろのきつねがなまけたいぬをとびこえた"]` +### `kagome_ja` tokenization method + +:::caution Experimental feature +Available starting in `v1.28.0`. This is an experimental feature. Use with caution. +::: + +For Japanese text, `kagome_ja` tokenization method is also available. This uses the [`Kagome` tokenizer](https://github.com/ikawaha/kagome?tab=readme-ov-file) with a Japanese [MeCab IPA](https://github.com/ikawaha/kagome-dict/) dictionary to split the property text. + +The `kagome_ja` tokenizer is not loaded by default to save resources. To use it, set the environment variable `ENABLE_TOKENIZER_KAGOME_JA` to `true` on the Weaviate instance. + +`kagome_ja` tokenization examples: + +- `"春の夜の夢はうつつよりもかなしき 夏の夜の夢はうつつに似たり 秋の夜の夢はうつつを超え 冬の夜の夢は心に響く 山のあなたに小さな村が見える 川の音が静かに耳に届く 風が木々を通り抜ける音 星空の下、すべてが平和である"`: + - [`"春", "の", "夜", "の", "夢", "は", "うつつ", "より", "も", "かなしき", "\n\t", "夏", "の", "夜", "の", "夢", "は", "うつつ", "に", "似", "たり", "\n\t", "秋", "の", "夜", "の", "夢", "は", "うつつ", "を", "超え", "\n\t", "冬", "の", "夜", "の", "夢", "は", "心", "に", "響く", "\n\n\t", "山", "の", "あなた", "に", "小さな", "村", "が", "見える", "\n\t", "川", "の", "音", "が", "静か", "に", "耳", "に", "届く", "\n\t", "風", "が", "木々", "を", "通り抜ける", "音", "\n\t", "星空", "の", "下", "、", "すべて", "が", "平和", "で", "ある"`] +- `"素早い茶色の狐が怠けた犬を飛び越えた"`: + - `["素早い", "茶色", "の", "狐", "が", "怠け", "た", "犬", "を", "飛び越え", "た"]` +- `"すばやいちゃいろのきつねがなまけたいぬをとびこえた"`: + - `["すばやい", "ちゃ", "いろ", "の", "きつね", "が", "なまけ", "た", "いぬ", "を", "とびこえ", "た"]` + ### `kagome_kr` tokenization method :::caution Experimental feature @@ -557,9 +577,12 @@ The `kagome_kr` tokenizer is not loaded by default to save resources. To use it, `kagome_kr` tokenization examples: -- `"아버지가방에들어가신다"`: `["아버지", "가", "방", "에", "들어가", "신다"]` -- `"아버지가 방에 들어가신다"`: `["아버지", "가", "방", "에", "들어가", "신다"]` -- `"결정하겠다"`: `["결정", "하", "겠", "다"]` +- `"아버지가방에들어가신다"`: + - `["아버지", "가", "방", "에", "들어가", "신다"]` +- `"아버지가 방에 들어가신다"`: + - `["아버지", "가", "방", "에", "들어가", "신다"]` +- `"결정하겠다"`: + - `["결정", "하", "겠", "다"]` ### Inverted index types diff --git a/developers/weaviate/config-refs/schema/multi-vector.md b/developers/weaviate/config-refs/schema/multi-vector.md index dbed8095f5..2fc0d4e0e1 100644 --- a/developers/weaviate/config-refs/schema/multi-vector.md +++ b/developers/weaviate/config-refs/schema/multi-vector.md @@ -39,6 +39,23 @@ Named vector collections support hybrid search, but only for one vector at a tim [Keyword search](/developers/weaviate/search/bm25) syntax does not change if a collection has named vectors. +### Query multiple named vectors + +:::info Added in `v1.26` +::: + +Where multiple named vectors are defined in a collection, you can query them in a single search. This is useful for comparing the similarity of an object to multiple named vectors. + +This is called a "multi-target vector search". + +In a multi-target vector search, you can specify: + +- The target vectors to search +- The query(ies) to compare to the target vectors +- The weights to apply to each distance (raw, or normalized) for each target vector + +Read more in [How-to: Multi-target vector search](../../search/multi-vector.md). + ## Related pages - [How-to: manage data](/developers/weaviate/manage-data/collections#define-multiple-named-vectors): Configure collections diff --git a/developers/weaviate/config-refs/schema/vector-index.md b/developers/weaviate/config-refs/schema/vector-index.md index 3d4ef591ef..43192ff504 100644 --- a/developers/weaviate/config-refs/schema/vector-index.md +++ b/developers/weaviate/config-refs/schema/vector-index.md @@ -5,7 +5,7 @@ image: og/docs/configuration.jpg # tags: ['configuration', 'vector index'] --- -Vector indexes facilitate efficient, vector-first data storage and retrieval. +[Vector indexes](../../concepts/vector-index.md) facilitate efficient, vector-first data storage and retrieval. ## HNSW indexes @@ -237,8 +237,7 @@ services: QUERY_MAXIMUM_RESULTS: 10000 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'text2vec-openai' - ENABLE_MODULES: 'text2vec-cohere,text2vec-huggingface,text2vec-openai,text2vec-google,generative-cohere,generative-openai,generative-google' + ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' AUTOSCHEMA_ENABLED: 'false' ASYNC_INDEXING: 'true' diff --git a/developers/weaviate/configuration/authentication.md b/developers/weaviate/configuration/authentication.md index 49bf937ebe..f123ab4353 100644 --- a/developers/weaviate/configuration/authentication.md +++ b/developers/weaviate/configuration/authentication.md @@ -5,34 +5,84 @@ image: og/docs/configuration.jpg # tags: ['authentication'] --- -Weaviate offers an optional authentication scheme using API keys and OpenID Connect (OIDC), which can enable various [authorizations](authorization.md) levels. +:::info Authentication and authorization +Authentication and authorization are closely related concepts, and sometimes abbreviated as `AuthN` and `AuthZ`. Authentication (`AuthN`) is the process of verifying the identity of a user, while authorization (`AuthZ`) is the process of determining what permissions the user has. +::: + +Weaviate controls access through user authentication via API keys or OpenID Connect (OIDC), with an option for anonymous access. Users can then be assigned different [authorization](./authorization.md) levels, as shown in the diagram below. + +```mermaid +flowchart LR + %% Define main nodes + Request["Client\nRequest"] + AuthCheck{"AuthN\nEnabled?"} + AccessCheck{"Check\nAuthZ"} + Access["✅ Access\nGranted"] + Denied["❌ Access\nDenied"] + + %% Define authentication method nodes + subgraph auth ["AuthN"] + direction LR + API["API Key"] + OIDC["OIDC"] + AuthResult{"Success?"} + end + + %% Define connections + Request --> AuthCheck + AuthCheck -->|"No"| AccessCheck + AuthCheck -->|"Yes"| auth + API --> AuthResult + OIDC --> AuthResult + AuthResult -->|"Yes"| AccessCheck + AuthResult -->|"No"| Denied + + AccessCheck -->|"Pass"| Access + AccessCheck -->|"Fail"| Denied + + %% Style nodes + style Request fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style AuthCheck fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style AccessCheck fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Access fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Denied fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style API fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style OIDC fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style AuthResult fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraph + style auth fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + +For example, a user logging in with the API key `jane-secret` may be granted administrator permissions, while another user logging in with the API key `ian-secret` may be granted read-only permissions. -When authentication is disabled, all anonymous requests will be granted access. +In summary, Weaviate allows the following authentication methods: -In this documentation, we cover all scenarios for your convenience: -- [Configuring Weaviate and the client for API key use](#api-key) -- [Configuring Weaviate and the client for OIDC](#oidc---a-systems-perspective) -- [Configuring Weaviate for anonymous access](#anonymous-access) +- API key +- OpenID Connect (OIDC) +- Anonymous access (no authentication, strongly discouraged except for development or evaluation) Note that API key and OIDC authentication can be both enabled at the same time. -:::tip We recommend starting with the API key -For most use cases, the API key option offers a balance between security and ease of use. Give it a try first, unless you have specific requirements that necessitate a different approach. -::: +The way to configure authentication differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. -:::info Using Kubernetes? -See [this page](../installation/kubernetes.md#authentication-and-authorization) for how to set up `values.yaml` for authentication & authorization. +:::info What about Weaviate Cloud (WCD)? +For Weaviate Cloud (WCD) instances, authentication is pre-configured with OIDC and API key access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with API keys](/developers/wcs/platform/manage-api-keys). ::: -## WCD authentication +## API Key Authentication -[Weaviate Cloud (WCD)](https://console.weaviate.cloud/) instances are pre-configured for API key [authentication](/developers/wcs/connect.mdx). +API key authentication is a simple and effective way to authenticate users. Each user is assigned a unique API key, which is used to authenticate the user. -## API key +Note that you can either: +- Set one user for all API keys, or +- Define one user per API key (the number of users must match the number of API keys) -To configure Weaviate for API key-based authentication, add the following environment variables to your configuration file. +Make sure all listed users are also configured in the authorization settings. -An example `docker-compose.yml` file looks like this: +### API keys: Docker + +API key authentication can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: ```yaml services: @@ -40,82 +90,73 @@ services: ... environment: ... + # Disable anonymous access. + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + # Enables API key authentication. AUTHENTICATION_APIKEY_ENABLED: 'true' - # List one or more keys, separated by commas. Each key corresponds to a specific user identity below. - AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'jane-secret-key,ian-secret-key' + # List one or more keys in plaintext separated by commas. Each key corresponds to a specific user identity below. + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'viewer-key,admin-key' # List one or more user identities, separated by commas. Each identity corresponds to a specific key above. - AUTHENTICATION_APIKEY_USERS: 'jane@doe.com,ian-smith' + AUTHENTICATION_APIKEY_USERS: 'viewer-user,admin-user' ``` -The example associates API keys and users. +This configuration: +- Disables anonymous access +- Enables API key authentication +- Defines plaintext API keys in `AUTHENTICATION_APIKEY_ALLOWED_KEYS` +- Associates users with the API keys in `AUTHENTICATION_APIKEY_USERS` -| API key | User| -| :- | :- | -| `jane-secret-key` | `jane@doe.com` | -| `ian-secret-key` | `ian-smith` | +These users can now be assigned permissions based on the authorization settings. -:::info `n` APIKEY_ALLOWED_KEYS vs `n` APIKEY_USERS -There are two options for configuring the number of keys and users: -- Option 1: There is exactly one user specified and any number of keys (all keys will end up using the same user). -- Option 2: The lengths match, then key `n` will map to user `n`. -::: +### API keys: Kubernetes -These users' permissions will be determined by the [authorization](./authorization.md) settings. Below is one such example configuration. +For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authentication` section. Here's an example configuration: ```yaml -services: - weaviate: - ... - environment: - ... - AUTHORIZATION_ADMINLIST_ENABLED: 'true' - AUTHORIZATION_ADMINLIST_USERS: 'jane@doe.com,john@doe.com' - AUTHORIZATION_ADMINLIST_READONLY_USERS: 'ian-smith,roberta@doe.com' +authentication: + anonymous_access: + # Disable anonymous access. + enabled: false + + apikey: + # Enables API key authentication. + enabled: true + + # List one or more keys in plaintext separated by commas. Each key corresponds to a specific user identity below. + allowed_keys: + - admin-key + - viewer-key + + # List one or more user identities, separated by commas. Each identity corresponds to a specific key above. + users: + - admin-user + - viewer-user ``` -The example associates permissions with users. - -| User| User type | Permission | -| :- | :- | :- | -| `jane-secret-key` | Admin | Read, write | -| `john@doe.com` | Admin | Read, write | -| `ian-smith` | Read Only | Read | -| `roberta@doe.com` | Read Only | Read | +This configuration: +- Disables anonymous access +- Enables API key authentication +- Defines plaintext API keys in `allowed_keys` +- Associates users with the API keys in `users` -In the example, `jane-secret-key` is an `admin` key, and `ian-secret-key` is a `read-only` key. - -:::note What about the other identities? -You might notice that the authorization list includes `john@doe.com` and `roberta@doe.com`. Weaviate supports a combination of API key and OIDC-based authentication. Thus, the additional users might be OIDC users. +:::warning Environment Variables Take Precedence +If you configure API keys using environment variables, those settings will take precedence over the values in `values.yaml`. To use the Helm values configuration, ensure you have not set the corresponding environment variables. ::: -### API key: Client-side usage - -import APIKeyUsage from '/_includes/clients/api-token-usage.mdx'; - - - -The cURL command looks like this: +For enhanced security in production environments, you can store API keys in Kubernetes secrets and reference them using environment variables instead of storing them as plaintext in the Helm values. -```bash -curl https://${WEAVIATE_INSTANCE_URL}/v1/meta -H "Authorization: Bearer ${WEAVIATE_API_KEY}" | jq -``` +## OIDC Authentication -import ClientLibraryUsage from '/_includes/clients/client-library-usage.mdx'; +OIDC authentication requires the resource (Weaviate) to validate tokens issued by an identity provider. The identity provider authenticates the user and issues tokens, which are then validated by Weaviate. - +In an example setup, a Weaviate instance acts as the resource, Weaviate Cloud (WCD) acts as the identity provider, and the Weaviate client acts on behalf of the user. -## OIDC - -OIDC authentication involves three parties. - -1. A **user** who wants to access a resource. -1. An **identity provider (a.k.a token issuer)** (e.g. Okta, Microsoft, or WCD) that authenticates the user and issues tokens. -1. A **resource** (in this case, Weaviate) who validates the tokens to rely on the identity provider's authentication. +Any "OpenID Connect" compatible token issuer that implements OpenID Connect Discovery is compatible with Weaviate. -For example, a setup may involve a Weaviate instance as a resource, Weaviate Cloud (WCD) as an identity provider, and the Weaviate client acting on behalf of the user. This document attempts to provide some perspective from each one to help you use Weaviate with authentication. +This document discusses how to configure Weaviate as the resource.
@@ -133,38 +174,11 @@ correct, all contents of the token are trusted, which authenticates the user bas
-## OIDC: Server-side +### OIDC: Docker -Any "OpenID Connect" compatible token issuer that implements OpenID Connect Discovery is compatible with Weaviate. - -### Configure Weaviate as the resource - -Configuring the OIDC token issuer is outside the scope of this document, but here are a few options as a starting point: +To configure Weaviate for OIDC-based authentication, add the following environment variables to your configuration file. -- For simple use-cases such as for a single user, you can use Weaviate Cloud (WCD) as the OIDC token issuer. To do so: - - Make sure you have a WCD account (you can [sign up here](https://console.weaviate.cloud/)). - - In the Docker Compose file (e.g. `docker-compose.yml`), specify: - - `https://auth.wcs.api.weaviate.io/auth/realms/SeMI` as the issuer (in `AUTHENTICATION_OIDC_ISSUER`), - - `wcs` as the client id (in `AUTHENTICATION_OIDC_CLIENT_ID`), and - - enable the adminlist (`AUTHORIZATION_ADMINLIST_ENABLED: 'true'`) and add your WCD account email as the user (in `AUTHORIZATION_ADMINLIST_USERS`) . - - `email` as the username claim (in `AUTHENTICATION_OIDC_USERNAME_CLAIM`). - -- If you need a more customizable setup you can use commercial OIDC providers like [Okta](https://www.okta.com/). -- As another alternative, you can run your own OIDC token issuer server, which may be the most complex but also configurable solution. Popular open-source solutions include Java-based [Keycloak](https://www.keycloak.org/) and Golang-based [dex](https://github.com/dexidp/dex). - -:::info -By default, Weaviate validates that the token includes a specified client id in the audience claim. If your token issuer does not support this feature, you can turn it off as outlined in the configuration section below. -::: - -### Set configuration options - -To use OpenID Connect (OIDC), the **respective environment variables** must be correctly configured in the configuration yaml for Weaviate. - -:::info -As of November 2022, we were aware of some differences in Microsoft Azure's OIDC implementation compared to others. If you are using Azure and experiencing difficulties, [this external blog post](https://xsreality.medium.com/making-azure-ad-oidc-compliant-5734b70c43ff) may be useful. -::: - -The OIDC-related Docker Compose environment variables are shown below. For configuration details, see the inline-yaml comments: +An example `docker-compose.yml` file looks like this: ```yaml services: @@ -209,17 +223,120 @@ services: AUTHENTICATION_OIDC_SCOPES: '' ``` -#### Get the Weaviate OpenID endpoint +:::info OIDC and Azure +As of November 2022, we were aware of some differences in Microsoft Azure's OIDC implementation compared to others. If you are using Azure and experiencing difficulties, [this external blog post](https://xsreality.medium.com/making-azure-ad-oidc-compliant-5734b70c43ff) may be useful. +::: -If you have OIDC authentication enabled, you can obtain Weaviate's OIDC configuration from the following endpoint: +### OIDC: Kubernetes -```bash -curl ${WEAVIATE_INSTANCE_URL}/v1/.well-known/openid-configuration +For Kubernetes deployments using Helm, OIDC authentication can be configured in the `values.yaml` file under the `authentication` section. Here's an example configuration: + +```yaml +authentication: + anonymous_access: + # Disable anonymous access. + enabled: false + oidc: + # enabled (optional - defaults to false) turns OIDC auth on. All other fields in + # this section will only be validated if enabled is set to true. + enabled: true + + # issuer (required) tells weaviate how to discover the token issuer. This + # endpoint must implement the OpenID Connect Discovery spec, so that weaviate + # can retrieve the issuer's public key. + # + # The example URL below uses the path structure commonly found with keycloak + # where an example realm 'my-weaviate-usecase' was created. The exact + # path structure depends on the token issuer. See the token issuer's documentation + # about which endpoint implements OIDC Discovery. + issuer: 'http://my-token-issuer/auth/realms/my-weaviate-usecase' + + # client_id (required unless skip_client_id_check is set to true) tells + # Weaviate to check for a particular OAuth 2.0 client_id in the audience claim. + # This is to prevent that a token which was signed by the correct issuer + # but never intended to be used with Weaviate can be used for authentication. + # + # For more information on what clients are in OAuth 2.0, see + # https://tools.ietf.org/html/rfc6749#section-1.1 + client_id: 'my-weaviate-client' + + # username_claim (required) tells Weaviate which claim in the token to use for extracting + # the username. The username will be passed to the authorization plugin. + username_claim: 'email' + + # skip_client_id_check (optional, defaults to false) skips the client_id + # validation in the audience claim as outlined in the section above. + # Not recommended to set this option as it reduces security, only set this + # if your token issuer is unable to provide a correct audience claim + skip_client_id_check: 'false' + + # scope (optional) these will be used by clients as default scopes for authentication + scopes: '' + + # groups_claim: '' ``` -Edit ${WEAVIATE_INSTANCE_URL} to provide your instance URL. +### Note: Configuring the OIDC token issuer -## OIDC: Client-side +Configuring the OIDC token issuer is outside the scope of this document, but here are a few options as a starting point: + +- For simple use-cases such as for a single user, you can use Weaviate Cloud (WCD) as the OIDC token issuer. To do so: + - Make sure you have a WCD account (you can [sign up here](https://console.weaviate.cloud/)). + - In the Docker Compose file (e.g. `docker-compose.yml`), specify: + - `https://auth.wcs.api.weaviate.io/auth/realms/SeMI` as the issuer (in `AUTHENTICATION_OIDC_ISSUER`), + - `wcs` as the client id (in `AUTHENTICATION_OIDC_CLIENT_ID`), and + - enable the adminlist (`AUTHORIZATION_ADMINLIST_ENABLED: 'true'`) and add your WCD account email as the user (in `AUTHORIZATION_ADMINLIST_USERS`) . + - `email` as the username claim (in `AUTHENTICATION_OIDC_USERNAME_CLAIM`). + +- If you need a more customizable setup you can use commercial OIDC providers like [Okta](https://www.okta.com/). +- As another alternative, you can run your own OIDC token issuer server, which may be the most complex but also configurable solution. Popular open-source solutions include Java-based [Keycloak](https://www.keycloak.org/) and Golang-based [dex](https://github.com/dexidp/dex). + +:::info +By default, Weaviate validates that the token includes a specified client id in the audience claim. If your token issuer does not support this feature, you can turn it off as outlined in the configuration section below. +::: + +## Anonymous Access + +Weaviate can be configured to accept anonymous requests. This is strongly discouraged except for development or evaluation purposes. + +Users that send requests without explicit authentication are authenticated as `user: anonymous`. + +You can use the authorization plugin to specify which permissions to apply to this `anonymous` user. If anonymous access is disabled altogether, any request without an allowed authentication scheme returns `401 Unauthorized`. + +### Anonymous access: Docker + +To enable anonymous access in Docker Compose, add the following environment variable to your configuration file: + +```yaml +services: + weaviate: + ... + environment: + ... + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' +``` + +### Anonymous access: Kubernetes + +To enable anonymous access in Kubernetes, add the following configuration to your `values.yaml` file: + +```yaml +authentication: + anonymous_access: + enabled: true +``` + +## Client-side Usage + +### API key + +import APIKeyUsage from '/_includes/clients/api-token-usage.mdx'; + + + +We recommend using a client library to authenticate against Weaviate. See [How-to: Connect](../connections/index.mdx) pages for more information. + +### OIDC The OIDC standard allows for many different methods *(flows)* of obtaining tokens. The appropriate method can vary depending on your situation, including configurations at the token issuer, and your requirements. @@ -239,9 +356,6 @@ import OIDCExamples from '/_includes/code/connections/oidc-connect.mdx'; - - - ### Get and pass tokens manually
@@ -357,31 +471,10 @@ For example, the cURL command looks like this: curl https://localhost:8080/v1/objects -H "Authorization: Bearer ${WEAVIATE_API_KEY}" | jq ``` - - -## Anonymous access -By default, Weaviate is configured to accept requests without any authentication headers or parameters. Users that send requests without explicit authentication are authenticated as `user: anonymous`. - -You can use the authorization plugin to specify which -permissions to apply to anonymous users. If anonymous access is disabled altogether, -any request without an allowed authentication scheme returns `401 Unauthorized`. - -### Configuration -Anonymous access can be enabled or disabled in the configuration yaml using the environment variable shown below: - -```yaml -services: - weaviate: - ... - environment: - ... - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' -``` - -### How to use - -Send REST requests to Weaviate without any additional authentication headers or parameters. +## Further resources +- [Configuration: Authorization and RBAC](./authorization.md) +- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars.md#authentication-and-authorization) ## Questions and feedback diff --git a/developers/weaviate/configuration/authorization.md b/developers/weaviate/configuration/authorization.md index 056b803379..962eaa6616 100644 --- a/developers/weaviate/configuration/authorization.md +++ b/developers/weaviate/configuration/authorization.md @@ -1,35 +1,129 @@ --- -title: Authorization +title: Authorization & RBAC sidebar_position: 35 image: og/docs/configuration.jpg # tags: ['authorization'] --- -The authorization plugin allows Weaviate to provide differentiated access to users based on their [authentication](./authentication.md) status. Along with allowing or disallowing anonymous access, Weaviate can differentiate between a user who is in the admin list, or on the read-only list. +:::info Authentication and authorization +Authentication and authorization are closely related concepts, and sometimes abbreviated as `AuthN` and `AuthZ`. Authentication (`AuthN`) is the process of verifying the identity of a user, while authorization (`AuthZ`) is the process of determining what permissions the user has. +::: -## Admin list +Weaviate provides differentiated access through [authorization](./authorization.md) levels, based on the user's [authentication](./authentication.md) status. A user can be granted admin permission, read-only permission, or no permission at all. From `v1.28.0`, Weaviate also supports Role-Based Access Control (RBAC) for more fine-grained control over user permissions. + +The following diagram illustrates the flow of a user request through the authentication and authorization process: + +```mermaid +flowchart TB + User(["Authenticated User"]) --> AuthScheme{"Authorization\nScheme?"} + + subgraph rbac ["RBAC Authorization"] + direction TB + AdminRole["Admin Role"] + ViewerRole["Viewer Role"] + CustomRole["Custom Roles"] + + Perms1["Full Access\nAll Operations"] + Perms2["Read-only\nAccess"] + Perms3["Custom\nPermissions"] + + AdminRole --> Perms1 + ViewerRole --> Perms2 + CustomRole --> Perms3 + end -The admin list relies on the configured `Authentication Schema` to correctly identify -the user. On each request, a check against a pre-configured admin list is done. -If the user is contained in this list, they get all permissions. If they aren't, -they get none. It is not currently possible to assign only some rights to a specific user. + subgraph adminlist ["Admin List Authorization"] + direction TB + AdminUser["Admin Users"] + ReadOnly["Read-only Users"] + AnonUser["Anonymous Users\n(Optional)"] -## Read-only list + AllPerms["Full Access\nAll Operations"] + ReadPerms["Read-only\nAccess"] + + AdminUser --> AllPerms + ReadOnly --> ReadPerms + AnonUser -.->|"If enabled"| AllPerms + AnonUser -.->|"If enabled"| ReadPerms + end + + subgraph undiffer ["Undifferentiated Access"] + AllAccess["Full Access\nAll Operations"] + end + + AuthScheme -->|"RBAC"| rbac + AuthScheme -->|"Admin List"| adminlist + AuthScheme -->|"Undifferentiated"| undiffer + + %% Style nodes + style User fill:#f9f9f9,stroke:#666 + style AuthScheme fill:#f5f5f5,stroke:#666 + style AnonUser fill:#f9f9f9,stroke:#666,stroke-dasharray: 5 5 + + %% Style subgraphs + style rbac fill:#e6f3ff,stroke:#4a90e2 + style adminlist fill:#e6ffe6,stroke:#2ea44f + style undiffer fill:#fff0e6,stroke:#ff9933 +``` -Other than a list of admins, it is also possible to specify a list of read-only users. -Those users have permissions on all `get` and `list` operations, but no other -permissions. +## Available authorization schemes -If a subject is present on both the admin and read-only list, Weaviate will -throw an error on startup due to the invalid configuration. +The following authorization schemes are available in Weaviate: -## Usage +- [Role-Based Access Control (RBAC)](#role-based-access-control-rbac) +- [Admin list](#admin-list) +- [Undifferentiated access](#undifferentiated-access) -:::info Using Kubernetes? -See [this page](../installation/kubernetes.md#authentication-and-authorization) for how to set up `values.yaml` for authentication & authorization. +In the Admin list authorization scheme, [anonymous users](#anonymous-users) can be granted permissions. + +The way to configure authorization differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. + +:::info What about Weaviate Cloud (WCD)? +For Weaviate Cloud (WCD) instances, authorization is pre-configured with Admin list access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with admin or read-only API keys](/developers/wcs/platform/manage-api-keys). +
+ +RBAC access will be available in WCD in a future release. +::: + +## Role-Based Access Control (RBAC) + +:::caution RBAC technical preview +Role-based access control (RBAC) is added `v1.28` as a **technical preview**. This means that the feature is still under development and may change in future releases, including potential breaking changes. **We do not recommend using this feature in production environments at this time.** +
+ +We appreciate [your feedback](https://forum.weaviate.io/) on this feature. ::: -Configure the admin plugin in the configuration yaml like so: +Role-based access control (RBAC) is a method of restricting access to resources based on the roles of users. In Weaviate, RBAC allows you to define [roles](./roles.md) and assign permissions to those roles. Users can then be assigned to roles, and inherit the permissions associated with those roles. + +Weaviate comes with a set of predefined roles. These roles are: + +- `admin`: The admin role has full access to all resources in Weaviate. +- `viewer`: The viewer role has read-only access to all resources in Weaviate. + +They are assigned to users based on the Weaviate configuration file. Once a user is assigned a predefined role, their permissions are set accordingly. These roles cannot be modified, and these users cannot have additional roles assigned to them. + +For more information on roles and permissions, see [this page](./roles.md). + +:::tip At least one admin user required +When using RBAC, you must specify at least one user with the build-in admin role. This user will have full permissions to perform all actions in Weaviate. Otherwise, Weaviate will not start. +::: + +### Discussions: RBAC and performance + +RBAC is a powerful feature that allows you to define fine-grained access control policies. However, it can also have an impact on performance as each operation must be checked against the user's permissions. + +The exact performance impact will depend on your set up and use case. In our internal testing, the most significant performance impact was seen for object creation operations. + +We did not observe additional performance penalities for using custom roles over the built-in roles. + +Here are some tips to optimize performance when using RBAC: +- Monitor object creation performance +- Use a high availability (i.e. 3+ nodes) setup to distribute the load + +### RBAC: Docker + +RBAC authorization can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: ```yaml services: @@ -37,24 +131,233 @@ services: ... environment: ... + # Example authentication configuration using API keys + # OIDC access can also be used with RBAC + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + AUTHENTICATION_APIKEY_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'viewer-key,admin-key,other-key' + AUTHENTICATION_APIKEY_USERS: 'viewer-user,admin-user,other-user' + + # Authorization configuration + # Enable RBAC + AUTHORIZATION_ENABLE_RBAC: 'true' + + # Provide pre-configured roles to users + # This assumes that the relevant user has been authenticated and identified + # + # You MUST define at least one admin user + AUTHORIZATION_ADMIN_USERS: 'admin-user' + AUTHORIZATION_VIEWER_USERS: 'viewer-user' +``` + +This configuration: +- Enables RBAC +- Configures `admin-user` as a user with built-in admin permissions +- Configures `viewer-user` as a user with built-in viewer permissions +- Configures `other-user` as a user with no built-in permissions + +The `other-user` can now be assigned custom roles and permissions using the [RBAC Roles API](./roles.md). + +### RBAC: Kubernetes + +For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authorization` section. Here's an example configuration: + +```yaml +# Example authentication configuration using API keys +authentication: + anonymous_access: + enabled: false + apikey: + enabled: true + allowed_keys: + - admin-key + - viewer-key + - other-key + users: + - admin-user + - viewer-user + - other-user + +# Authorization configuration +authorization: + rbac: + # Enable RBAC + enabled: true + # Provide pre-configured roles to users + # This assumes that the relevant user has been authenticated and identified + # + # You MUST define at least one admin user + admins: + - admin-user + viewers: + - viewer-user +``` + +This configuration: +- Enables RBAC +- Configures `admin-user` as a user with built-in admin permissions +- Configures `viewer-user` as a user with built-in viewer permissions +- Configures `other-user` as a user with no built-in permissions + +The `other-user` can now be assigned custom roles and permissions using the [RBAC Roles API](./roles.md). + +## Admin list + +The "Admin list" authorization scheme allows you to specify a list of admin users with full permissions to perform all actions in Weaviate, and a list of read-only users with permissions to perform only read operations. + +These permissions cannot be customized or extended. For more fine-grained control over user permissions, use [RBAC](#role-based-access-control-rbac) instead. + +Admin list authorization scheme cannot be used in combination with RBAC. + +### Admin list: Docker + +Admin list authorization can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: + +```yaml +services: + weaviate: + ... + environment: + ... + # Example authentication configuration using API keys + # OIDC access can also be used with RBAC + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + AUTHENTICATION_APIKEY_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'viewer-key,admin-key,other-key' + AUTHENTICATION_APIKEY_USERS: 'viewer-user,admin-user,other-user' + + # Authorization configuration + # Enable admin list AUTHORIZATION_ADMINLIST_ENABLED: 'true' - AUTHORIZATION_ADMINLIST_USERS: 'jane@doe.com,john@doe.com' - AUTHORIZATION_ADMINLIST_READONLY_USERS: 'ian-smith,roberta@doe.com' + + # Provide pre-configured roles to users + # This assumes that the relevant user has been authenticated and identified + # + # You MUST define at least one admin user + AUTHORIZATION_ADMINLIST_USERS: 'admin-user' + AUTHORIZATION_ADMINLIST_READONLY_USERS: 'viewer-user' ``` -The above would enable the plugin and make users `jane@doe.com` and -`john@doe.com` admins. Additionally, users `ian-smith` and `roberta@doe.com` will have read-only permissions. +This configuration: +- Enables Admin list authorization +- Configures `admin-user` as a user with built-in admin permissions +- Configures `viewer-user` as a user with built-in viewer permissions -:::note User identifier -As shown in the above example, any string can be used to identify the user. This depends on what you configured in the authentication settings. For example, OIDC users may be identified by their email address by setting `AUTHENTICATION_OIDC_USERNAME_CLAIM` as `email`, whereas API key-authenticated users may be identified as a plain string such as `ian-smith`. -::: +Note that in this configuration, `other-user` has no permissions. + +### Admin list: Kubernetes + +For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authorization` section. Here's an example configuration: + +```yaml +# Example authentication configuration using API keys +authentication: + anonymous_access: + enabled: false + apikey: + enabled: true + allowed_keys: + - admin-key + - viewer-key + - other-key + users: + - admin-user + - viewer-user + - other-user + +# Authorization configuration +authorization: + admin_list: + # Enable admin list + enabled: true + + # Provide pre-configured roles to users + # This assumes that the relevant user has been authenticated and identified + # + # You MUST define at least one admin user + users: + - admin-user + read_only_users: + - viewer-user +``` + +### Anonymous users + +Anonymous users are identified as `anonymous` in Weaviate. In the Admin list authorization scheme, you can apply permissions to anonymous users. The RBAC authorization scheme is not compatible with anonymous users. + +To confer permissions to anonymous users in the Admin list scheme, you can use the `anonymous` keyword in the configuration as shown below. + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + + + +```yaml +services: + weaviate: + ... + environment: + ... + # Enable anonymous access + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + + # Configure admin user API key + AUTHORIZATION_ADMINLIST_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'admin-key' + AUTHENTICATION_APIKEY_USERS: 'admin-user' + + # Enable admin list and provide admin access to "admin-user" only + AUTHORIZATION_ADMINLIST_USERS: 'admin-user' + # Provide read-only access to anonymous users + AUTHORIZATION_ADMINLIST_READONLY_USERS: 'anonymous' +``` + + + + + +```yaml +# Example authentication configuration using API keys +authentication: + # Enable anonymous access + anonymous_access: + enabled: true + + # Enable admin list and configure admin user API key + apikey: + enabled: true + allowed_keys: + - admin-key + users: + - admin-user + +authorization: + # Enable admin list and provide admin access to "admin-user" only + admin_list: + # Enable admin list + enabled: true + users: + - admin-user + # Provide read-only access to anonymous users + read_only_users: + - anonymous +``` + + + + + +## Undifferentiated access -## RBAC +Weaviate can be configured to provide undifferentiated access, by disabling authentication for example and enabling anonymous access. This configuration is strongly discouraged except for development or evaluation purposes. -More fine-grained Role-Based Access Control (RBAC) coming soon. As of now the -only possible distinction is between Admins (CRUD), Read-Only Users and -entirely unauthorized users. +## Further resources +- [Configuration: Authentication](./authentication.md) +- [Configuration: RBAC Roles](./roles.md) +- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars.md#authentication-and-authorization) ## Questions and feedback diff --git a/developers/weaviate/configuration/backups.md b/developers/weaviate/configuration/backups.md index dfc0aee570..369830a877 100644 --- a/developers/weaviate/configuration/backups.md +++ b/developers/weaviate/configuration/backups.md @@ -20,42 +20,154 @@ import CurlCode from '!!raw-loader!/_includes/code/howto/configure.backups.sh'; Weaviate's Backup feature is designed to work natively with cloud technology. Most notably, it allows: -* Seamless integration with widely-used cloud blob storage, such as AWS S3, GCS, or Azure +* Seamless integration with widely-used cloud blob storage, such as AWS S3, GCS, or Azure Storage * Backup and Restore between different storage providers -* Single-command backup and restore from the REST API +* Single-command backup and restore * Choice of backing up an entire instance, or selected collections only -* Zero downtime & minimal impact for your users when backups are running -* Easy Migration to new environments +* Easy migration to new environments -:::note -_Single node backup is available starting in Weaviate `v1.15`. Multi-node backups is available starting in `v1.16`_. -::: +:::caution Important backup considerations -:::caution Backups do not include inactive or offloaded tenants -Backups of [multi-tenant collections](../concepts/data.md#multi-tenancy) will only include `active` tenants, and not `inactive` or `offloaded` tenants. [Activate tenants](../manage-data/multi-tenancy.md#activate-tenant) before creating a backup to ensure all data is included. +- **Version Requirements**: If you are running Weaviate `v1.23.12` or older, you must [update](../more-resources/migration/index.md) to `v1.23.13` or higher before restoring a backup to prevent data corruption. +- **[Multi-tenancy](../concepts/data.md#multi-tenancy) limitations**: Backups will only include `active` tenants. `Inactive` or `offloaded` tenants in multi-tenant collections will not be included. Be sure to [activate](../manage-data/multi-tenancy.md#activate-tenant) any required tenants before creating a backup. ::: +## Backup Quickstart + +Get started with Weaviate backups in minutes using the local filesystem, which is a great option for development and testing. + +### 1. Configure Weaviate + +Add these environment variables to your Weaviate configuration (e.g. Docker or Kubernetes configuration file): + +```yaml +# Enable the filesystem backup module +ENABLE_MODULES=backup-filesystem + +# Set backup location (e.g. within a Docker container or on a Kubernetes pod) +BACKUP_FILESYSTEM_PATH=/var/lib/weaviate/backups +``` + +### 2. Start a backup + +Restart Weaviate to apply the new configuration. Then, you are ready to start a backup: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +That's all there is to getting started with backups in Weaviate. The backup will be stored in the specified location on the local filesystem. + +You can also: +- [Restore the backup](#restore-backup) to a Weaviate instance +- [Check the status](#asynchronous-status-checking) of the backup (if you did not wait for completion) +- [Cancel the backup](#cancel-backup) if needed + +Note that local backups are not suitable for production environments. For production, use a cloud provider like S3, GCS, or Azure Storage. + +The following sections provide more details on how to configure and use backups in Weaviate. + ## Configuration -In order to perform backups, a backup provider module must be activated. Multiple backup providers can be active at the same time. Currently `backup-s3`, `backup-gcs`, `backup-azure`, and `backup-filesystem` modules are available for S3, GCS, Azure or filesystem backups respectively. +Weaviate supports four backup storage options: + +| Provider | Module Name | Best For | Multi-Node Support | +|----------|------------|-----------|-------------------| +| AWS S3 | `backup-s3` | Production deployments, AWS environments | Yes | +| Google Cloud Storage | `backup-gcs` | Production deployments, GCP environments | Yes | +| Azure Storage | `backup-azure` | Production deployments, Azure environments | Yes | +| Local Filesystem | `backup-filesystem` | Development, testing, single-node setups | No | -As it is built on Weaviate's [module system](/developers/weaviate/configuration/modules.md), additional providers can be added in the future. +To use any provider: +1. Enable the module + - Add the module name to the `ENABLE_MODULES` environment variable + - On Weaviate Cloud instances, a relevant default module is enabled +2. Configure the required modules + - Option 1: Set the necessary environment variables + - Option 2 (Kubernetes): Configure the [Helm chart values](#kubernetes-configuration) -All service-discovery and authentication-related configuration is set using -environment variables. +Note multiple providers can be enabled simultaneously ### S3 (AWS or S3-compatible) -Use the `backup-s3` module to enable backing up to and restoring from any S3-compatible blob storage. This includes AWS S3, and MinIO. +- Works with AWS S3 and S3-compatible services (e.g., MinIO) +- Supports multi-node deployments +- Recommended for production use -To enable the module, add its name to the `ENABLE_MODULES` environment variable. Modules are comma-separated. To enable the module along with the `text2vec-transformers` module for example, set: +To configure `backup-s3`, you need to enable the module and provide the necessary configuration. + +#### Enable module + +Add `backup-s3` to the `ENABLE_MODULES` environment variable. For example, to enable the S3 module along with the `text2vec-cohere` module, set: ``` -ENABLE_MODULES=backup-s3,text2vec-transformers +ENABLE_MODULES=backup-s3,text2vec-cohere ``` #### S3 Configuration (vendor-agnostic) -In addition to enabling the module, you need to configure it using environment variables. This configuration applies to any S3-compatible backend. + +This configuration applies to any S3-compatible backend. | Environment variable | Required | Description | | --- | --- | --- | @@ -66,7 +178,7 @@ In addition to enabling the module, you need to configure it using environment v #### S3 Configuration (AWS-specific) -You must provide Weaviate with AWS authentication details. You can choose between access-key or ARN-based authentication: +For AWS, provide Weaviate with authentication details. You can choose between access-key or ARN-based authentication: #### Option 1: With IAM and ARN roles @@ -83,16 +195,20 @@ The backup module will first try to authenticate itself using AWS IAM. If the au ### GCS (Google Cloud Storage) -Use the `backup-gcs` module to enable backing up to and restoring from any Google Cloud Storage bucket. +- Works with Google Cloud Storage +- Supports multi-node deployments +- Recommended for production use + +To configure `backup-gcs`, you need to enable the module and provide the necessary configuration. + +#### Enable module -To enable the module, add its name to the `ENABLE_MODULES` environment variable. Modules are comma-separated. To enable the module along with the `text2vec-transformers` module for example, set: +Add `backup-gcs` to the `ENABLE_MODULES` environment variable. For example, to enable the S3 module along with the `text2vec-cohere` module, set: ``` -ENABLE_MODULES=backup-gcs,text2vec-transformers +ENABLE_MODULES=backup-gcs,text2vec-cohere ``` -In addition to enabling the module, you need to configure it using environment variables. There are bucket-related variables, as well as credential-related variables. - #### GCS bucket-related variables | Environment variable | Required | Description | @@ -116,12 +232,18 @@ This makes it easy to use the same module in different setups. For example, you ### Azure Storage -Use the `backup-azure` module to enable backing up to and restoring from any Microsoft Azure Storage container. +- Works with Microsoft Azure Storage +- Supports multi-node deployments +- Recommended for production use + +To configure `backup-azure`, you need to enable the module and provide the necessary configuration. + +#### Enable module -To enable the module, add its name to the `ENABLE_MODULES` environment variable. Modules are comma-separated. To enable the module along with the `text2vec-transformers` module for example, set: +Add `backup-azure` to the `ENABLE_MODULES` environment variable. For example, to enable the Azure module along with the `text2vec-cohere` module, set: ``` -ENABLE_MODULES=backup-azure,text2vec-transformers +ENABLE_MODULES=backup-azure,text2vec-cohere ``` In addition to enabling the module, you need to configure it using environment variables. There are container-related variables, as well as credential-related variables. @@ -157,20 +279,22 @@ At least one of `AZURE_STORAGE_CONNECTION_STRING` or `AZURE_STORAGE_ACCOUNT` mus ### Filesystem -:::caution `backup-filesystem` - limitations -`backup-filesystem` is only compatible with single-node backups. Use `backup-gcs` or `backup-s3` if support for multi-node backups is needed. +- Works with Google Cloud Storage +- Supports single-node deployments only +- Not recommended for production use -The filesystem provider is not intended for production use, as its availability is directly tied to the node on which it operates. -::: +To configure `backup-filesystem`, you need to enable the module and provide the necessary configuration. -Instead of backing up to a remote backend, you can also back up to the local filesystem. This may be helpful during development, for example to be able to quickly exchange setups, or to save a state from accidental future changes. +#### Enable module -To allow backups to the local filesystem, add `backup-filesystem` to the `ENABLE_MODULES` environment variable. Modules are comma-separated. To enable the module along with the `text2vec-transformers` module for example, set: +Add `backup-filesystem` to the `ENABLE_MODULES` environment variable. For example, to enable the S3 module along with the `text2vec-cohere` module, set: ``` -ENABLE_MODULES=backup-filesystem,text2vec-transformers +ENABLE_MODULES=backup-filesystem,text2vec-cohere ``` +#### Backup Configuration + In addition to enabling the module, you need to configure it using environment variables: | Environment variable | Required | Description | @@ -179,53 +303,28 @@ In addition to enabling the module, you need to configure it using environment v ### Other Backup Backends -Weaviate uses its [module system](/developers/weaviate/configuration/modules.md) to decouple the backup orchestration from the remote backup storage backends. It is easy to add new providers and use them with the existing backup API. If you are missing your desired backup module, you can open a feature request or contribute it yourself. For either option, join our Slack community to have a quick chat with us on how to get started. - +If you are missing your desired backup module, you can open a feature request on the [Weaviate GitHub repository](https://github.com/weaviate/weaviate/issues). We are also open to community contributions for new backup modules. ## API -### Create Backup - -Once the modules are enabled and the configuration is provided, you can start a backup on any running instance with a single HTTP request. - -#### Method and URL - -```js -POST /v1/backups/{backend} -``` +For REST API documentation, see the [Backups section](https://weaviate.io/developers/weaviate/api/rest#tag/backups). -#### Parameters - -##### URL Parameters - -| Name | Type | Required | Description | -| ---- | ---- | ---- | ---- | -| `backend` | string | yes | The name of the backup provider module without the `backup-` prefix, for example `s3`, `gcs`, `azure`, or `filesystem`. | +### Create Backup -##### Request Body +Once the modules are enabled and the configuration is provided, you can start a backup on any running instance with a single request. -The request takes a JSON object with the following properties: +You can choose to include or exclude specific collections in the backup. If you do not specify any collections, all collections are included by default. -| Name | Type | Required | Description | -| ---- | ---- | ---- | ---- | -| `id` | string (lowercase letters, numbers, underscore, minus) | yes | The id of the backup. This string must be provided on all future requests, such as status checking or restoration. | -| `include` | list of strings | no | An optional list of collection names to be included in the backup. If not set, all collections are included. | -| `exclude` | list of strings | no | An optional list of collection names to be excluded from the backup. If not set, no collections are excluded. | -| `config` | object | no | An optional object to configure the backup. If not set, it will assign defaults from config table.| +The `include` and `exclude` options are mutually exclusive. You can set none or exactly one of those. -:::note -You cannot set `include` and `exclude` at the same time. Set none or exactly one of those. -::: +##### Available `config` object properties -##### Config object properties | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `cpuPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | | `chunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB.| -| `compressionLevel`| string | no | `DefaultCompression` | An optional compression level used by compression algorithm from options. `DefaultCompression`, `BestSpeed`, `BestCompression`| -:::note -Weaviate uses [gzip compression](https://pkg.go.dev/compress/gzip#pkg-constants) by default. -::: +| `compressionLevel`| string | no | `DefaultCompression` | An optional compression level used by compression algorithm from options. (`DefaultCompression`, `BestSpeed`, `BestCompression`) Weaviate uses [gzip compression](https://pkg.go.dev/compress/gzip#pkg-constants) by default. | + @@ -259,7 +358,7 @@ Weaviate uses [gzip compression](https://pkg.go.dev/compress/gzip#pkg-constants) text={TSCodeLegacy} startMarker="// START CreateBackup" endMarker="// END CreateBackup" - language="ts" + language="tsv2" /> @@ -330,7 +429,7 @@ The response contains a `"status"` field. If the status is `SUCCESS`, the backup text={PyCodeV3} startMarker="# START StatusCreateBackup" endMarker="# END StatusCreateBackup" - language="py" + language="pyv3" /> @@ -348,7 +447,7 @@ The response contains a `"status"` field. If the status is `SUCCESS`, the backup text={TSCodeLegacy} startMarker="// START StatusCreateBackup" endMarker="// END StatusCreateBackup" - language="ts" + language="tsv2" /> @@ -394,50 +493,32 @@ An ongoing backup can be cancelled at any time. The backup process will be stopp /> - - ```ts - // Coming soon - ``` - + This operation is particularly useful if you have started a backup by accident, or if you would like to stop a backup that is taking too long. ### Restore Backup -You can restore any backup to any machine as long as the name and number of nodes between source and target are identical. The backup does not need to be created on the same instance. Once a backup backend is configured, you can restore a backup with a single HTTP request. -Note that a restore fails if any of the collections already exist on this instance. - -#### Method and URL - -```js -POST /v1/backups/{backend}/{backup_id}/restore -``` +You can restore any backup to any machine as long as the name and number of nodes between source and target are identical. The backup does not need to be created on the same instance. Once a backup backend is configured, you can restore a backup with a single request. -#### Parameters - -##### URL Parameters +As with backup creation, the `include` and `exclude` options are mutually exclusive. You can set none or exactly one of those. In a restore operation, `include` and `exclude` are relative to the collections contained in the backup. The restore process is not aware of collections that existed on the source machine if they were not part of the backup. -| Name | Type | Required | Description | -| ---- | ---- | ---- | ---- | -| `backend` | string | yes | The name of the backup provider module without the `backup-` prefix, for example `s3`, `gcs`, or `filesystem`. | -| `backup_id` | string | yes | The user-provided backup identifier that was used when sending the request to create the backup. | - -##### Request Body -The request takes a json object with the following properties: - -| Name | Type | Required | Description | -| ---- | ---- | ---- | ---- | -| `include` | list of strings | no | An optional list of collection names to be included in the backup. If not set, all collections are included. | -| `exclude` | list of strings | no | An optional list of collection names to be excluded from the backup. If not set, no collections are excluded. | -| `config` | object | no | An optional object to configure the restore. If not set, it will assign defaults from config table.| +Note that a restore fails if any of the collections already exist on this instance. -*Note 1: You cannot set `include` and `exclude` at the same time. Set none or exactly one of those.* +:::caution Restoring backups from `v1.23.12` and older +If you are running Weaviate `v1.23.12` or older, first **[update Weaviate](../more-resources/migration/index.md) to version 1.23.13** or higher before restoring a backup. +Versions prior to `v1.23.13` had a bug that could lead to data not being stored correctly from a backup of your data. +::: -*Note 2: `include` and `exclude` are relative to the collections contained in the backup. The restore process does not know which collections existed on the source machine if they were not part of the backup.* +##### Available `config` object properties -##### Config object properties | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `cpuPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | @@ -456,7 +537,7 @@ The request takes a json object with the following properties: text={PyCodeV3} startMarker="# START RestoreBackup" endMarker="# END RestoreBackup" - language="py" + language="pyv3" /> @@ -474,7 +555,7 @@ The request takes a json object with the following properties: text={TSCodeLegacy} startMarker="// START RestoreBackup" endMarker="// END RestoreBackup" - language="ts" + language="tsv2" /> @@ -513,19 +594,6 @@ All client implementations have a "wait for completion" option which will poll t If you set the "wait for completion" option to false, you can also check the status yourself using the Backup Restore Status API. -```js -GET /v1/backups/{backend}/{backup_id}/restore -``` - -#### Parameters - -##### URL Parameters - -| Name | Type | Required | Description | -| ---- | ---- | ---- | ---- | -| `backend` | string | yes | The name of the backup provider module without the `backup-` prefix, for example `s3`, `gcs`, or `filesystem`. | -| `backup_id` | string | yes | The user-provided backup identifier that was used when sending the requests to create and restore the backup. | - The response contains a `"status"` field. If the status is `SUCCESS`, the restore is complete. If the status is `FAILED`, an additional error is provided. @@ -542,7 +610,7 @@ The response contains a `"status"` field. If the status is `SUCCESS`, the restor text={PyCodeV3} startMarker="# START StatusRestoreBackup" endMarker="# END StatusRestoreBackup" - language="py" + language="pyv3" /> @@ -560,7 +628,7 @@ The response contains a `"status"` field. If the status is `SUCCESS`, the restor text={TSCodeLegacy} startMarker="// START StatusRestoreBackup" endMarker="// END StatusRestoreBackup" - language="ts" + language="tsv2" /> @@ -592,6 +660,13 @@ The response contains a `"status"` field. If the status is `SUCCESS`, the restor +## Kubernetes configuration + +When running Weaviate on Kubernetes, you can configure the backup provider using Helm chart values. + +These values are available under the `backups` key in the `values.yaml` file. Refer to the inline documentation in the `values.yaml` file for more information. + + ## Technical Considerations @@ -599,7 +674,7 @@ The response contains a `"status"` field. If the status is `SUCCESS`, the restor The backup process is designed to be minimally invasive to a running setup. Even on very large setups, where terabytes of data need to be copied, Weaviate stays fully usable during backup. It even accepts write requests while a backup process is running. This sections explains how backups work under the hood and why Weaviate can safely accept writes while a backup is copied. -Weaviate uses a custom [LSM Store](../concepts/storage.md#object-and-inverted-index-store) for it's object store and inverted index. LSM stores are a hybrid of immutable disk segments and an in-memory structure called a memtable that accepts all writes (including updates and deletes). Most of the time, files on disk are immutable, there are only three situations where files are changed: +Weaviate uses a custom [LSM Store](../concepts/storage.md#object-and-inverted-index-store) for its object store and inverted index. LSM stores are a hybrid of immutable disk segments and an in-memory structure called a memtable that accepts all writes (including updates and deletes). Most of the time, files on disk are immutable, there are only three situations where files are changed: 1. Anytime a memtable is flushed. This creates a new segment. Existing segments are not changed. 2. Any write into the memtable is also written into a Write-Ahead-Log (WAL). The WAL is only needed for disaster-recovery. Once a segment has been orderly flushed, the WAL can be discarded. @@ -629,6 +704,12 @@ The flexibility around backup providers opens up new use cases. Besides using th For example, consider the following situation: You would like to do a load test on production data. If you would do the load test in production it might affect users. An easy way to get meaningful results without affecting uses it to duplicate your entire environment. Once the new production-like "loadtest" environment is up, create a backup from your production environment and restore it into your "loadtest" environment. This even works if the production environment is running on a completely different cloud provider than the new environment. +## Troubleshooting and notes + +- Single node backup is available starting in Weaviate `v1.15`. Multi-node backups is available starting in `v1.16`. +- In some cases, backups can take a long time, or get "stuck", causing Weaviate to be unresponsive. If this happens, you can [cancel the backup](#cancel-backup) and try again. +- If a backup module is misconfigured, such as having an invalid backup path, it can cause Weaviate to not start. Review the system logs for any errors. + ## Related pages - [References: REST API: Backups](/developers/weaviate/api/rest#tag/backups) diff --git a/developers/weaviate/configuration/compression/bq-compression.md b/developers/weaviate/configuration/compression/bq-compression.md index 21c0d6a01b..ba70bbb98c 100644 --- a/developers/weaviate/configuration/compression/bq-compression.md +++ b/developers/weaviate/configuration/compression/bq-compression.md @@ -53,7 +53,7 @@ This can be done by setting the `vector_index_config` of the collection to enabl text={PyCodeV3} startMarker="# START EnableBQ" endMarker="# END EnableBQ" - language="py" + language="pyv3" /> @@ -71,7 +71,7 @@ This can be done by setting the `vector_index_config` of the collection to enabl text={TSCodeLegacy} startMarker="// START EnableBQ" endMarker="// END EnableBQ" - language="ts" + language="tsv2" /> @@ -124,7 +124,7 @@ For example: text={PyCodeV3} startMarker="# START BQWithOptions" endMarker="# END BQWithOptions" - language="py" + language="pyv3" /> @@ -142,7 +142,7 @@ For example: text={TSCodeLegacy} startMarker="// START BQWithOptions" endMarker="// END BQWithOptions" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/configuration/compression/pq-compression.md b/developers/weaviate/configuration/compression/pq-compression.md index 7f2b37db9c..1541371d8e 100644 --- a/developers/weaviate/configuration/compression/pq-compression.md +++ b/developers/weaviate/configuration/compression/pq-compression.md @@ -71,7 +71,7 @@ To configure PQ in a collection, use the [PQ parameters](./pq-compression.md#pq- text={PyCodeV3} startMarker="# START CollectionWithAutoPQ" endMarker="# END CollectionWithAutoPQ" - language="py" + language="pyv3" /> @@ -89,7 +89,7 @@ To configure PQ in a collection, use the [PQ parameters](./pq-compression.md#pq- text={TSCodeLegacy} startMarker="// START CollectionWithAutoPQ" endMarker="// END CollectionWithAutoPQ" - language="ts" + language="tsv2" /> @@ -144,7 +144,7 @@ Follow these steps to manually enable PQ. text={PyCodeV3} startMarker="# START InitialSchema" endMarker="# END InitialSchema" - language="py" + language="pyv3" /> @@ -162,7 +162,7 @@ Follow these steps to manually enable PQ. text={TSCodeLegacy} startMarker="// START InitClassDef" endMarker="// END InitClassDef" - language="ts" + language="tsv2" /> @@ -218,7 +218,7 @@ To enable PQ, update your collection definition as shown below. For additional c text={PyCodeV3} startMarker="# START UpdateSchema" endMarker="# END UpdateSchema" - language="py" + language="pyv3" /> @@ -236,7 +236,7 @@ To enable PQ, update your collection definition as shown below. For additional c text={TSCodeLegacy} startMarker="// START UpdateSchema" endMarker="// END UpdateSchema" - language="ts" + language="tsv2" /> @@ -323,7 +323,7 @@ To review the current `pq` configuration, you can retrieve it as shown below. text={PyCodeV3} startMarker="# START GetSchema" endMarker="# END GetSchema" - language="py" + language="pyv3" /> @@ -341,7 +341,7 @@ To review the current `pq` configuration, you can retrieve it as shown below. text={TSCodeLegacy} startMarker="// START GetSchema" endMarker="// END GetSchema" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/configuration/compression/sq-compression.md b/developers/weaviate/configuration/compression/sq-compression.md index 5c4d4d3626..ed65251608 100644 --- a/developers/weaviate/configuration/compression/sq-compression.md +++ b/developers/weaviate/configuration/compression/sq-compression.md @@ -44,7 +44,7 @@ To enable SQ, set `vector_index_config`. text={PyCodeV3} startMarker="# START EnableSQ" endMarker="# END EnableSQ" - language="py" + language="pyv3" /> @@ -78,7 +78,7 @@ To tune SQ, set these `vectorIndexConfig` parameters. text={PyCodeV3} startMarker="# START SQWithOptions" endMarker="# END SQWithOptions" - language="py" + language="pyv3" /> diff --git a/developers/weaviate/configuration/modules.md b/developers/weaviate/configuration/modules.md index 014541e85a..d50848fabc 100644 --- a/developers/weaviate/configuration/modules.md +++ b/developers/weaviate/configuration/modules.md @@ -18,7 +18,7 @@ At the instance (i.e. Weaviate cluster) level, you can: This can be done by setting the appropriate [environment variables](../config-refs/env-vars.md) as shown below. :::tip What about WCD? -Weaviate Cloud (WCD) instances come with modules pre-configured. See [this page](../../wcs/index.mdx#configuration) for details. +Weaviate Cloud (WCD) instances come with modules pre-configured. See [this page](../../wcs/cluster-status.mdx#enabled-modules) for details. ::: ### Enable individual modules diff --git a/developers/weaviate/configuration/persistence.md b/developers/weaviate/configuration/persistence.md index a18557e65d..e6df0c04a0 100644 --- a/developers/weaviate/configuration/persistence.md +++ b/developers/weaviate/configuration/persistence.md @@ -64,8 +64,7 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' - ENABLE_MODULES: '' + ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' # <== this can be set to an arbitrary name ... ``` diff --git a/developers/weaviate/configuration/roles.md b/developers/weaviate/configuration/roles.md new file mode 100644 index 0000000000..57ec52e8b2 --- /dev/null +++ b/developers/weaviate/configuration/roles.md @@ -0,0 +1,796 @@ +--- +title: RBAC Roles +sidebar_position: 38 +image: og/docs/configuration.jpg +# tags: ['rbac', 'roles', 'configuration', 'authorization'] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/_includes/code/python/howto.configure.rbac.permissions.py'; + +:::caution RBAC technical preview +Role-based access control (RBAC) is added `v1.28` as a **technical preview**. This means that the feature is still under development and may change in future releases, including potential breaking changes. **We do not recommend using this feature in production environments at this time.** +
+ +We appreciate [your feedback](https://forum.weaviate.io/) on this feature. +::: + +Weaviate provides differentiated access through [authorization](./authorization.md) levels, based on the [authenticated](./authentication.md) user identity. + +If role-based access control (RBAC) is enabled, access can be further restricted based the roles of users. In Weaviate, RBAC allows you to define roles and assign permissions to those roles. Users can then be assigned to roles, and inherit the permissions associated with those roles. + +Roles and permissions can be managed through Weaviate API (e.g. via REST API directly, or through a client library). + +Refer to the client library examples below, or [the REST API documentation](../api/rest.md) for concrete examples on how to manage roles and permissions. + +## Roles + +### Predefined roles + +Weaviate comes with a set of predefined roles. These roles are: + +- `admin`: The admin role has full access to all resources in Weaviate. +- `viewer`: The viewer role has read-only access to all resources in Weaviate. + +`admin` and `viewer` roles can be assigned through the Weaviate configuration file. A predefined role cannot be modified. The user can, however, be assigned additional roles through the Weaviate API. + +All roles can also be assigned through the Weaviate API, including the predefined roles. The predefined roles cannot be modified, but they can be assigned or revoked from users. + +Refer to the [authorization](./authorization.md) page for more information on how to assign predefined roles to users. + +### Custom roles + +Any authenticated user that is not assigned a predefined role has no roles or permissions by default. + +These users' permissions can be modified through Weaviate by those with the appropriate permissions. This allows for the creation of custom roles, which can be assigned to users as needed. + +### Managing roles + +Role management requires appropriate `role` resource permissions through a predefined `admin` role or a role with `manage_roles` permission. + +## Permissions + +Permissions in Weaviate define what actions users can perform on specific resources. Each permission consists of: + +- A resource type (e.g., collections, objects) +- Access levels (read, write, update, delete, manage) +- Optional resource-specific constraints + +### Available permissions + +Permissions can be defined for the following resources: + +1. **Role Management** + - Read roles + - Manage roles + +1. **Collections** (collection definitions only, data object permissions are separate) + - Create, read, update, and delete collection definitions + +1. **Data Objects** + - Read, write, update, and delete objects + +1. **Backup** + - Manage backups + +1. **Cluster Data Access** + - Read cluster metadata + +1. **Node Data Access** + - Read node metadata at a specified verbosity level + +:::caution Role Management Permissions +Be careful when assigning permissions to roles that manage roles. These permissions can be used to escalate privileges by assigning additional roles to users. Only assign these permissions to trusted users. +::: + +### Permission behavior + +When defining permissions, setting a permission to `False` indicates that the permission is *not set*, rather than explicitly denying access. This means that if a user has multiple roles, and one role grants a permission while another sets it to `False`, the user will still have that permission through the role that grants it. + +For example, if a user has two roles: +- Role A sets `read` to `False` for Collection X +- Role B sets `read` to `True` for Collection X + +The user will have read access to Collection X because Role B grants the permission, while Role A's `False` value simply indicates no permission is set rather than blocking access. + +:::info Permissions and `aggregate` queries + +In `v1.28`, aggregate queries require the user to have the `read_config` permission on all collections (i.e. with a `"*"` collection name filter). +
+ +This is due to the implementation of the `aggregate` queries under-the-hood, which uses GraphQL rather than gRPC. This will be improved in future versions of Weaviate. +::: + +#### Wildcards in permissions + +Many permissions require a collection name filter, to specify which collections the permission applies to. + +In thi case, `"*"` acts as a multi-character wildcard. As an example, setting a permission with `"Test_*"` as the collection filter would apply that permission to all collections that start with `Test_`. Or, setting a permission with `"*"` as the collection filter would apply that permission to all available collections. + +## Example permission sets + +### Read and write permissions + +This confers read and write permissions for collections starting with `TargetCollection_`, and read permissions to nodes and cluster metadata. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Viewer permissions + +This confers viewer permissions for collections starting with `TargetCollection_`. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +import RolePyCode from '!!raw-loader!/_includes/code/python/howto.configure.rbac.roles.py'; + +## Role management + +Role management requires appropriate `role` resource permissions through a predefined `admin` role or a role with `manage_roles` permission. + +For more information see the [Authentication](./authentication.md) and [Authorization](./authorization.md) pages. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + + + +### Create new role with permissions + +This example creates a role called "devrel" with permissions to: + +- Read all collections starting with "Test_". +- Delete or create the collection "Test_DevRel" + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Grant additional permissions + +Additional permissions can be granted to a role at any time. The role must already exist. + +This example grants additional permissions to the "devrel" role to: + +- Read data in all collections that start with "Test_". +- Create new data in "Test_DevRel". + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Remove permissions from a role + +Permissions can be removed from a role at any time. Removing all permissions from a role will not delete the role itself. + +This example removes from the "devrel" role permissions to: + +- Read the data from collections that start with "Test_" +- Create and delete collections called "Test_DevRel" + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Assign a role to a user + +A custom user can have any number of roles assigned to them (including none). The role can be a predefined role (e.g. `viewer`) or a custom role. + +This example assigns the custom "devrel" role to "jane-doe". + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Get the current user's roles and permissions + +Retrieve the role and permission information for the currently authenticated user. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Get a user's roles and permissions + +Retrieve the role and permission information for any user. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Check if a role exists + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Inspect a role + +View the permissions assigned to a role. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### List all roles + +View all roles in the system and their permissions. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### List users with a role + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Delete a role + +Deleting a role will remove it from the system, and revoke the associated permissions from all users had this role. + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +### Revoke a role from a user + +You can revoke one or more roles from a specific user. + +This examples revokes "role-1" and "role-2" from the user "jane-doe". + + + + + + + + + +```ts +// TS support coming soon +``` + + + + + +```go +// Go support coming soon +``` + + + + + +```java +// Java support coming soon +``` + + + + + +## Further resources + +- [Configuration: Authentication](./authentication.md) +- [Configuration: Authorization and RBAC](./authorization.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/connections/connect-cloud.mdx b/developers/weaviate/connections/connect-cloud.mdx index f48e6886bd..05f3dc18d5 100644 --- a/developers/weaviate/connections/connect-cloud.mdx +++ b/developers/weaviate/connections/connect-cloud.mdx @@ -45,7 +45,7 @@ To connect, use the Weaviate URL and the Weaviate API key for your WCD instance text={PyCodeV3} startMarker="# START APIKeyWCD" endMarker="# END APIKeyWCD" - language="py" + language="pyv3" /> @@ -61,7 +61,7 @@ To connect, use the Weaviate URL and the Weaviate API key for your WCD instance text={TsCodeV2} startMarker="// START APIKeyWCD" endMarker="// END APIKeyWCD" - language="js" + language="tsv2" /> @@ -108,7 +108,7 @@ If you use API-based models for vectorization or RAG, you must provide an API ke text={PyCodeV3} startMarker="# START ThirdPartyAPIKeys" endMarker="# END ThirdPartyAPIKeys" - language="py" + language="pyv3" /> @@ -124,7 +124,7 @@ If you use API-based models for vectorization or RAG, you must provide an API ke text={TsCodeV2} startMarker="// START ThirdPartyAPIKeys" endMarker="// END ThirdPartyAPIKeys" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/connections/connect-embedded.mdx b/developers/weaviate/connections/connect-embedded.mdx index f96d6c2c50..44c0db39f5 100644 --- a/developers/weaviate/connections/connect-embedded.mdx +++ b/developers/weaviate/connections/connect-embedded.mdx @@ -35,7 +35,7 @@ For more details on using Embedded Weaviate, see [Embedded Weaviate](/developers text={PyCodeV3} startMarker="# START Embedded" endMarker="# END Embedded" - language="py" + language="pyv3" /> @@ -43,7 +43,7 @@ For more details on using Embedded Weaviate, see [Embedded Weaviate](/developers text={TsCodeV2} startMarker="// START Embedded" endMarker="// END Embedded" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/connections/connect-local.mdx b/developers/weaviate/connections/connect-local.mdx index 961aa3e91b..f42a8ad80e 100644 --- a/developers/weaviate/connections/connect-local.mdx +++ b/developers/weaviate/connections/connect-local.mdx @@ -47,7 +47,7 @@ To connect to a local instance without authentication, follow these examples. text={PyCodeV3} startMarker="# START LocalNoAuth" endMarker="# END LocalNoAuth" - language="py" + language="pyv3" /> @@ -63,7 +63,7 @@ To connect to a local instance without authentication, follow these examples. text={TsCodeV2} startMarker="// START LocalNoAuth" endMarker="// END LocalNoAuth" - language="js" + language="tsv2" /> @@ -110,7 +110,7 @@ To change the default URL or port number, follow these examples. text={PyCodeV3} startMarker="# START CustomURL" endMarker="# END CustomURL" - language="py" + language="pyv3" /> @@ -126,7 +126,7 @@ To change the default URL or port number, follow these examples. text={TsCodeV2} startMarker="// START CustomURL" endMarker="// END CustomURL" - language="js" + language="tsv2" /> @@ -174,7 +174,7 @@ To authenticate with a Weaviate API key, follow these examples. text={PyCodeV3} startMarker="# START LocalAuth" endMarker="# END LocalAuth" - language="py" + language="pyv3" /> @@ -190,7 +190,7 @@ To authenticate with a Weaviate API key, follow these examples. text={TsCodeV2} startMarker="// START LocalAuth" endMarker="// END LocalAuth" - language="js" + language="tsv2" /> @@ -245,7 +245,7 @@ Integrations that use external APIs often need API keys. To add third party API text={PyCodeV3} startMarker="# START LocalThirdPartyAPIKeys" endMarker="# END LocalThirdPartyAPIKeys" - language="py" + language="pyv3" /> @@ -261,7 +261,7 @@ Integrations that use external APIs often need API keys. To add third party API text={TsCodeV2} startMarker="// START LocalThirdPartyAPIKeys" endMarker="// END LocalThirdPartyAPIKeys" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/installation/aws-marketplace.md b/developers/weaviate/installation/aws-marketplace.md index 0f6775858f..1726f0324f 100644 --- a/developers/weaviate/installation/aws-marketplace.md +++ b/developers/weaviate/installation/aws-marketplace.md @@ -1,5 +1,6 @@ --- title: AWS Marketplace +description: Install Weaviate through the AWS Marketplace for quick cloud deployment. sidebar_position: 10 image: og/docs/installation.jpg # tags: ['installation', 'AWS Marketplace'] @@ -7,8 +8,6 @@ image: og/docs/installation.jpg import ReactPlayer from 'react-player/lazy' -## Overview - You can use [AWS Marketplace](https://aws.amazon.com/marketplace) to directly launch a Weaviate cluster. diff --git a/developers/weaviate/installation/docker-compose.md b/developers/weaviate/installation/docker-compose.md index 6d36584306..69af6d73a6 100644 --- a/developers/weaviate/installation/docker-compose.md +++ b/developers/weaviate/installation/docker-compose.md @@ -65,7 +65,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' volumes: @@ -150,7 +149,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' CLUSTER_HOSTNAME: 'node1' ``` @@ -266,8 +264,7 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,text2vec-huggingface' - DEFAULT_VECTORIZER_MODULE: 'none' + ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' CLUSTER_GOSSIP_BIND_PORT: '7100' CLUSTER_DATA_BIND_PORT: '7101' @@ -296,8 +293,7 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,text2vec-huggingface' - DEFAULT_VECTORIZER_MODULE: 'none' + ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node2' CLUSTER_GOSSIP_BIND_PORT: '7102' CLUSTER_DATA_BIND_PORT: '7103' @@ -327,8 +323,7 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,text2vec-huggingface' - DEFAULT_VECTORIZER_MODULE: 'none' + ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node3' CLUSTER_GOSSIP_BIND_PORT: '7104' CLUSTER_DATA_BIND_PORT: '7105' diff --git a/developers/weaviate/installation/gc-marketplace.md b/developers/weaviate/installation/gc-marketplace.md index 4c5584d9a2..6330734aa2 100644 --- a/developers/weaviate/installation/gc-marketplace.md +++ b/developers/weaviate/installation/gc-marketplace.md @@ -1,13 +1,11 @@ --- title: Google Cloud Marketplace +description: Set up Weaviate using Google Cloud Marketplace for simplified deployment. sidebar_position: 15 image: og/docs/installation.jpg tags: ['installation', 'Google Cloud Marketplace'] --- - -## Overview - You can use [Google Cloud Marketplace](https://console.cloud.google.com/marketplace) to directly launch a Weaviate cluster. :::info Prerequisites diff --git a/developers/weaviate/installation/index.md b/developers/weaviate/installation/index.md index 6f2ef90528..a532255a6f 100644 --- a/developers/weaviate/installation/index.md +++ b/developers/weaviate/installation/index.md @@ -7,6 +7,8 @@ image: og/docs/installation.jpg Weaviate is available as a hosted service, [Weaviate Cloud (WCD)](https://console.weaviate.cloud/), or as a self managed instance. If you manage your own instance, you can host it locally or with a cloud provider. Self-managed instances use the same Weaviate core database as WCD. +If you are upgrading from a previous version of Weaviate, see the [Migration Guide](../more-resources/migration/index.md) for any changes that may affect your installation. + ## Installation methods To install and configure Weaviate, see the following: @@ -35,7 +37,7 @@ import RunUnreleasedImages from '/_includes/configuration/run-unreleased.mdx' When you try upcoming features, please provide [feedback](https://github.com/weaviate/weaviate/issues/new/choose). Your comments are appreciated and help us to make Weaviate more useful for you. ## Related pages -- [Connect to Weaviate](../connections) +- [Connect to Weaviate](../connections/index.mdx) - [Weaviate Quickstart](../quickstart/index.md) - [Weaviate Cloud Quickstart](../../wcs/quickstart.mdx) - [References: Configuration](../configuration/index.md) diff --git a/developers/weaviate/installation/weaviate-cloud-services.md b/developers/weaviate/installation/weaviate-cloud-services.md index 1011cb6742..da20b7ea0a 100644 --- a/developers/weaviate/installation/weaviate-cloud-services.md +++ b/developers/weaviate/installation/weaviate-cloud-services.md @@ -1,5 +1,6 @@ --- title: Weaviate Cloud +description: Installing Weaviate Cloud Services sidebar_position: 1 image: og/docs/installation.jpg # tags: ['installation', 'Weaviate Cloud'] diff --git a/developers/weaviate/introduction.md b/developers/weaviate/introduction.md index 5935218f42..1354b5a112 100644 --- a/developers/weaviate/introduction.md +++ b/developers/weaviate/introduction.md @@ -76,7 +76,7 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.class text={PyCodeV3} startMarker="# START ReadAllCollections" endMarker="# END ReadAllCollections" - language="py" + language="pyv3" /> @@ -94,7 +94,7 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.class text={TSCodeLegacy} startMarker="// START ReadAllCollections" endMarker="// END ReadAllCollections" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/manage-data/collections.mdx b/developers/weaviate/manage-data/collections.mdx index 8f0c9ae78f..631fc52466 100644 --- a/developers/weaviate/manage-data/collections.mdx +++ b/developers/weaviate/manage-data/collections.mdx @@ -44,7 +44,7 @@ import InitialCaps from '/_includes/schemas/initial-capitalization.md' text={PyCodeV3} startMarker="# START BasicCreateCollection" endMarker="# END BasicCreateCollection" - language="py" + language="pyv3" /> @@ -62,7 +62,7 @@ import InitialCaps from '/_includes/schemas/initial-capitalization.md' text={TSCodeLegacy} startMarker="// START BasicCreateCollection" endMarker="// END BasicCreateCollection" - language="ts" + language="tsv2" /> @@ -119,7 +119,7 @@ For details, see: text={PyCodeV3} startMarker="# START CreateCollectionWithProperties" endMarker="# END CreateCollectionWithProperties" - language="py" + language="pyv3" /> @@ -137,7 +137,7 @@ For details, see: text={TSCodeLegacy} startMarker="// START CreateCollectionWithProperties" endMarker="// END CreateCollectionWithProperties" - language="ts" + language="tsv2" /> @@ -187,7 +187,7 @@ Collection level settings override default values and general configuration para text={PyCodeV3} startMarker="# START Vectorizer" endMarker="# END Vectorizer" - language="py" + language="pyv3" /> @@ -205,7 +205,7 @@ Collection level settings override default values and general configuration para text={TSCodeLegacy} startMarker="// START Vectorizer" endMarker="// END Vectorizer" - language="ts" + language="tsv2" /> @@ -243,7 +243,7 @@ You can define multiple named vectors per collection. This allows each object to text={PyCodeV3} startMarker="# START BasicNamedVectors" endMarker="# END BasicNamedVectors" - language="py" + language="pyv3" /> @@ -261,7 +261,7 @@ You can define multiple named vectors per collection. This allows each object to text={TSCodeLegacy} startMarker="// START BasicNamedVectors" endMarker="// END BasicNamedVectors" - language="ts" + language="tsv2" /> @@ -295,7 +295,7 @@ To configure how a vectorizer works (i.e. what model to use) with a specific col text={PyCodeV3} startMarker="# START ModuleSettings" endMarker="# END ModuleSettings" - language="py" + language="pyv3" /> @@ -313,7 +313,7 @@ To configure how a vectorizer works (i.e. what model to use) with a specific col text={TSCodeLegacy} startMarker="// START ModuleSettings" endMarker="// END ModuleSettings" - language="ts" + language="tsv2" /> @@ -347,7 +347,7 @@ The vector index type can be set for each collection at creation time, between ` text={PyCodeV3} startMarker="# START SetVectorIndexType" endMarker="# END SetVectorIndexType" - language="py" + language="pyv3" /> @@ -365,7 +365,7 @@ The vector index type can be set for each collection at creation time, between ` text={TSCodeLegacy} startMarker="// START SetVectorIndexType" endMarker="// END SetVectorIndexType" - language="ts" + language="tsv2" /> @@ -409,7 +409,7 @@ Was added in `v1.27` text={PyCodeV3} startMarker="# START SetVectorIndexParams" endMarker="# END SetVectorIndexParams" - language="py" + language="pyv3" /> @@ -427,7 +427,7 @@ Was added in `v1.27` text={TSCodeLegacy} startMarker="// START SetVectorIndexParams" endMarker="// END SetVectorIndexParams" - language="ts" + language="tsv2" /> @@ -471,7 +471,7 @@ Configure individual properties in a collection. Each property can have it's own text={PyCodeV3} startMarker="# START PropModuleSettings" endMarker="# END PropModuleSettings" - language="py" + language="pyv3" /> @@ -489,7 +489,7 @@ Configure individual properties in a collection. Each property can have it's own text={TSCodeLegacy} startMarker="// START PropModuleSettings" endMarker="// END PropModuleSettings" - language="ts" + language="tsv2" /> @@ -522,7 +522,7 @@ If you choose to bring your own vectors, you should specify the `distance metric text={PyCodeV3} startMarker="# START DistanceMetric" endMarker="# END DistanceMetric" - language="py" + language="pyv3" /> @@ -540,7 +540,7 @@ If you choose to bring your own vectors, you should specify the `distance metric text={TSCodeLegacy} startMarker="// START DistanceMetric" endMarker="// END DistanceMetric" - language="ts" + language="tsv2" /> @@ -585,7 +585,7 @@ Various [inverted index parameters](../config-refs/schema/index.md#invertedindex text={PyCodeV3} startMarker="# START SetInvertedIndexParams" endMarker="# END SetInvertedIndexParams" - language="py" + language="pyv3" /> @@ -603,14 +603,18 @@ Various [inverted index parameters](../config-refs/schema/index.md#invertedindex text={TSCodeLegacy} startMarker="// START SetInvertedIndexParams" endMarker="// END SetInvertedIndexParams" - language="ts" + language="tsv2" /> -## Specify a reranker +## Specify a reranker model integration + +Configure a [`reranker`](../concepts/search/index.md#rerank) model integration for [reranking retrieved results](../search/rerank.md). -Configure a [`reranker`](../concepts/search/index.md#rerank) for [reranking retrieved results](../search/rerank.md). +:::info Related pages +- [Available reranker model integrations](../model-providers/index.md) +::: @@ -627,7 +631,7 @@ Configure a [`reranker`](../concepts/search/index.md#rerank) for [reranking retr text={PyCodeV3} startMarker="# START SetReranker" endMarker="# END SetReranker" - language="py" + language="pyv3" /> @@ -645,21 +649,63 @@ Configure a [`reranker`](../concepts/search/index.md#rerank) for [reranking retr text={TSCodeLegacy} startMarker="// START SetReranker" endMarker="// END SetReranker" - language="ts" + language="tsv2" /> -## Specify a generative module +## Update the reranker model integration -Specify a `generative` module for a collection (for RAG). +:::info Available from `v1.25.23`, `v1.26.8` and `v1.27.1` +The `reranker` and `generative` configurations are mutable from `v1.25.23`, `v1.26.8` and `v1.27.1`. +::: -
- Additional information +Update the [`reranker`](../concepts/search/index.md#rerank) model integration for [reranking retrieved results](../search/rerank.md). -- [Available generative model integrations](../model-providers/index.md) + + + + -
+ + + + + + +```js +// Coming soon +``` + + + + + + + + +## Specify a generative model integration + +Specify a `generative` model integration for a collection (for RAG). + +:::info Related pages +- [Available generative model integrations](../model-providers/index.md) +::: @@ -676,7 +722,7 @@ Specify a `generative` module for a collection (for RAG). text={PyCodeV3} startMarker="# START SetGenerative" endMarker="# END SetGenerative" - language="py" + language="pyv3" /> @@ -694,7 +740,7 @@ Specify a `generative` module for a collection (for RAG). text={TSCodeLegacy} startMarker="// START SetGenerative" endMarker="// END SetGenerative" - language="ts" + language="tsv2" /> @@ -718,7 +764,7 @@ Specify a generative `model name`. text={PyCodeV3} startMarker="# START SetGenModel" endMarker="# END SetGenModel" - language="py" + language="pyv3" /> @@ -736,7 +782,52 @@ Specify a generative `model name`. text={TSCodeLegacy} startMarker="// START SetGenModel" endMarker="// END SetGenModel" - language="ts" + language="tsv2" + /> + + + +## Update the generative model integration + +:::info Available from `v1.25.23`, `v1.26.8` and `v1.27.1` +The `reranker` and `generative` configurations are mutable from `v1.25.23`, `v1.26.8` and `v1.27.1`. +::: + +Update a [`reranker`](../concepts/search/index.md#rerank) model integration for [reranking retrieved results](../search/rerank.md). + + + + + + + + + + + + +```js +// Coming soon +``` + + + + + @@ -747,11 +838,74 @@ import RaftRFChangeWarning from '/_includes/1-25-replication-factor.mdx'; -Configure replication per collection. +Configure replication settings, such as [async replication](../concepts/replication-architecture/consistency.md#async-replication) and [deletion resolution strategy](../concepts/replication-architecture/consistency.md#deletion-resolution-strategies). + + + + + + + + + + + + + + + + + + -import ReplicationConfigWithAsyncRepair from '/_includes/code/configuration/replication-consistency.mdx'; +```bash +curl \ +-X POST \ +-H "Content-Type: application/json" \ +-d '{ + "class": "Article", + "properties": [ + { + "dataType": [ + "string" + ], + "description": "Title of the article", + "name": "title" + } + ], + "replicationConfig": { + "factor": 3, + "asyncEnabled": true + } +}' \ +http://localhost:8080/v1/schema +``` - + +
@@ -785,7 +939,7 @@ Configure sharding per collection. text={PyCodeV3} startMarker="# START ShardingSettings" endMarker="# END ShardingSettings" - language="py" + language="pyv3" /> @@ -803,7 +957,7 @@ Configure sharding per collection. text={TSCodeLegacy} startMarker="// START ShardingSettings" endMarker="// END ShardingSettings" - language="ts" + language="tsv2" /> @@ -841,7 +995,7 @@ Create a collection with multi-tenancy enabled. text={PyCodeV3} startMarker="# START Multi-tenancy" endMarker="# END Multi-tenancy" - language="py" + language="pyv3" /> @@ -859,7 +1013,7 @@ Create a collection with multi-tenancy enabled. text={TSCodeLegacy} startMarker="// START Multi-tenancy" endMarker="// END Multi-tenancy" - language="ts" + language="tsv2" /> @@ -882,7 +1036,7 @@ Retrieve a collection definition from the schema. text={PyCodeV3} startMarker="# START ReadOneCollection" endMarker="# END ReadOneCollection" - language="py" + language="pyv3" /> @@ -900,7 +1054,7 @@ Retrieve a collection definition from the schema. text={TSCodeLegacy} startMarker="// START ReadOneCollection" endMarker="// END ReadOneCollection" - language="ts" + language="tsv2" /> @@ -1107,7 +1261,7 @@ Fetch the database schema to retrieve all of the collection definitions. text={PyCodeV3} startMarker="# START ReadAllCollections" endMarker="# END ReadAllCollections" - language="py" + language="pyv3" /> @@ -1125,7 +1279,7 @@ Fetch the database schema to retrieve all of the collection definitions. text={TSCodeLegacy} startMarker="// START ReadAllCollections" endMarker="// END ReadAllCollections" - language="ts" + language="tsv2" /> @@ -1169,7 +1323,7 @@ You can update a collection definition to change the [mutable collection setting text={PyCodeV3} startMarker="# START UpdateCollection" endMarker="# END UpdateCollection" - language="py" + language="pyv3" /> @@ -1183,11 +1337,12 @@ You can update a collection definition to change the [mutable collection setting - -```ts -// This feature is under development -``` - + @@ -1226,7 +1381,7 @@ Some parameters cannot be modified after you create your collection. text={PyCodeV3} startMarker="# START ModifyParam" endMarker="# END ModifyParam" - language="py" + language="pyv3" /> diff --git a/developers/weaviate/manage-data/create.mdx b/developers/weaviate/manage-data/create.mdx index 418c04300e..2092e2f601 100644 --- a/developers/weaviate/manage-data/create.mdx +++ b/developers/weaviate/manage-data/create.mdx @@ -18,6 +18,10 @@ import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.creat The examples on this page demonstrate how to create individual objects in Weaviate. +:::tip Use batch import for multiple objects +For creating multiple objects at once, see [How-to: Batch Import](./import.mdx). +::: + ## Create an object This example creates an object in the `JeopardyQuestion` collection. @@ -37,7 +41,7 @@ This example creates an object in the `JeopardyQuestion` collection. text={PyCodeV3} startMarker="# CreateObject START" endMarker="# CreateObject END" - language="py" + language="pyv3" /> @@ -55,7 +59,7 @@ This example creates an object in the `JeopardyQuestion` collection. text={TSCodeLegacy} startMarker="// CreateObject START" endMarker="// CreateObject END" - language="ts" + language="tsv2" /> @@ -112,7 +116,7 @@ When you create an object, you can provide a vector. (For specifying multiple, n text={PyCodeV3} startMarker="# CreateObjectWithVector START" endMarker="# CreateObjectWithVector END" - language="py" + language="pyv3" /> @@ -130,7 +134,7 @@ When you create an object, you can provide a vector. (For specifying multiple, n text={TSCodeLegacy} startMarker="// CreateObjectWithVector START" endMarker="// CreateObjectWithVector END" - language="ts" + language="tsv2" /> @@ -175,7 +179,7 @@ When you create an object, you can specify named vectors (if [configured in your text={PyCodeV3} startMarker="# CreateObjectNamedVectors START" endMarker="# CreateObjectNamedVectors END" - language="py" + language="pyv3" /> @@ -193,7 +197,7 @@ When you create an object, you can specify named vectors (if [configured in your text={TSCodeLegacy} startMarker="// CreateObjectNamedVectors START" endMarker="// CreateObjectNamedVectors END" - language="ts" + language="tsv2" /> @@ -221,7 +225,7 @@ If no ID is provided, Weaviate will generate a random [UUID](https://en.wikipedi text={PyCodeV3} startMarker="# CreateObjectWithId START" endMarker="# CreateObjectWithId END" - language="py" + language="pyv3" /> @@ -239,7 +243,7 @@ If no ID is provided, Weaviate will generate a random [UUID](https://en.wikipedi text={TSCodeLegacy} startMarker="// CreateObjectWithId START" endMarker="// CreateObjectWithId END" - language="ts" + language="tsv2" /> @@ -285,7 +289,7 @@ Object IDs are not randomly generated. The same value always generates the same text={PyCodeV3} startMarker="# CreateObjectWithDeterministicId START" endMarker="# CreateObjectWithDeterministicId END" - language="py" + language="pyv3" /> @@ -303,7 +307,7 @@ Object IDs are not randomly generated. The same value always generates the same text={TSCodeLegacy} startMarker="// CreateObjectWithDeterministicId START" endMarker="// CreateObjectWithDeterministicId END" - language="ts" + language="tsv2" /> @@ -360,7 +364,7 @@ You can create an object with cross-references to other objects. text={XrefPyCodeV3} startMarker="# START ObjectWithCrossRef" endMarker="# END ObjectWithCrossRef" - language="py" + language="pyv3" /> @@ -378,7 +382,7 @@ You can create an object with cross-references to other objects. text={XrefTSCodeLegacy} startMarker="// START ObjectWithCrossRef" endMarker="// END ObjectWithCrossRef" - language="ts" + language="tsv2" /> @@ -418,7 +422,7 @@ Before you create an object, you can [validate](/developers/weaviate/api/rest#ta text={PyCodeV3} startMarker="# ValidateObject START" endMarker="# ValidateObject END" - language="py" + language="pyv3" /> @@ -436,7 +440,7 @@ Before you create an object, you can [validate](/developers/weaviate/api/rest#ta text={TSCodeLegacy} startMarker="// ValidateObject START" endMarker="// ValidateObject END" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/manage-data/cross-references.mdx b/developers/weaviate/manage-data/cross-references.mdx index 591cd45066..11937b7e80 100644 --- a/developers/weaviate/manage-data/cross-references.mdx +++ b/developers/weaviate/manage-data/cross-references.mdx @@ -51,7 +51,7 @@ Include the reference property in the collection definition before adding cross- text={PyCodeV3} startMarker="# START CrossRefDefinition" endMarker="# END CrossRefDefinition" - language="py" + language="pyv3" /> @@ -82,7 +82,7 @@ It is also possible to add a cross-reference property to an existing collection text={PyCodeV3} startMarker="# START Collections TwoWay Category2" endMarker="# END Collections TwoWay Category2" - language="python" + language="pyv3" /> @@ -99,7 +99,7 @@ It is also possible to add a cross-reference property to an existing collection text={TSCodeLegacy} startMarker="// START Collections TwoWay Category2" endMarker="// END Collections TwoWay Category2" - language="ts" + language="tsv2" /> @@ -124,7 +124,7 @@ Specify a cross-reference when creating an object. text={PyCodeV3} startMarker="# START ObjectWithCrossRef" endMarker="# END ObjectWithCrossRef" - language="py" + language="pyv3" /> @@ -142,7 +142,7 @@ Specify a cross-reference when creating an object. text={TSCodeLegacy} startMarker="// START ObjectWithCrossRef" endMarker="// END ObjectWithCrossRef" - language="ts" + language="tsv2" /> @@ -167,7 +167,7 @@ Specify the required id and properties for the source and the target. text={PyCodeV3} startMarker="# START OneWay" endMarker="# END OneWay" - language="py" + language="pyv3" /> @@ -185,7 +185,7 @@ Specify the required id and properties for the source and the target. text={TSCodeLegacy} startMarker="// START OneWay" endMarker="// END OneWay" - language="ts" + language="tsv2" /> @@ -229,7 +229,7 @@ Create the `JeopardyCategory` collection: text={PyCodeV3} startMarker="# START Collections TwoWay Category1" endMarker="# END Collections TwoWay Category1" - language="python" + language="pyv3" /> @@ -246,7 +246,7 @@ Create the `JeopardyCategory` collection: text={TSCodeLegacy} startMarker="// START Collections TwoWay Category1" endMarker="// END Collections TwoWay Category1" - language="ts" + language="tsv2" /> @@ -267,7 +267,7 @@ Create the `JeopardyQuestion` collection including the reference property to `Je text={PyCodeV3} startMarker="# START Collections TwoWay Question" endMarker="# END Collections TwoWay Question" - language="python" + language="pyv3" /> @@ -284,7 +284,7 @@ Create the `JeopardyQuestion` collection including the reference property to `Je text={TSCodeLegacy} startMarker="// START Collections TwoWay Question" endMarker="// END Collections TwoWay Question" - language="ts" + language="tsv2" /> @@ -305,7 +305,7 @@ Modify `JeopardyCategory` to add the reference to `JeopardyQuestion`: text={PyCodeV3} startMarker="# START Collections TwoWay Category2" endMarker="# END Collections TwoWay Category2" - language="python" + language="pyv3" /> @@ -322,7 +322,7 @@ Modify `JeopardyCategory` to add the reference to `JeopardyQuestion`: text={TSCodeLegacy} startMarker="// START Collections TwoWay Category2" endMarker="// END Collections TwoWay Category2" - language="ts" + language="tsv2" /> @@ -344,7 +344,7 @@ And add the cross-references: text={PyCodeV3} startMarker="# TwoWay Python" endMarker="# END TwoWay Python" - language="py" + language="pyv3" /> @@ -362,7 +362,7 @@ And add the cross-references: text={TSCodeLegacy} startMarker="// TwoWay TS" endMarker="// END TwoWay TS" - language="ts" + language="tsv2" /> @@ -405,7 +405,7 @@ Weaviate allows creation of multiple cross-references from one source object. text={PyCodeV3} startMarker="# Multiple Python" endMarker="# END Multiple Python" - language="py" + language="pyv3" /> @@ -423,7 +423,7 @@ Weaviate allows creation of multiple cross-references from one source object. text={TSCodeLegacy} startMarker="// Multiple TS" endMarker="// END Multiple TS" - language="ts" + language="tsv2" /> @@ -465,7 +465,7 @@ Cross-references can be read as part of the object. text={PyCodeV3} startMarker="# ReadCrossRef" endMarker="# END ReadCrossRef" - language="py" + language="pyv3" /> @@ -498,7 +498,7 @@ Deleting a cross-reference with the same parameters used to define the cross-ref text={PyCodeV3} startMarker="# Delete Python" endMarker="# END Delete Python" - language="py" + language="pyv3" /> @@ -516,7 +516,7 @@ Deleting a cross-reference with the same parameters used to define the cross-ref text={TSCodeLegacy} startMarker="// Delete TS" endMarker="// END Delete TS" - language="ts" + language="tsv2" /> @@ -569,7 +569,7 @@ The targets of a cross-reference can be updated. text={PyCodeV3} startMarker="# Update Python" endMarker="# END Update Python" - language="py" + language="pyv3" /> @@ -587,7 +587,7 @@ The targets of a cross-reference can be updated. text={TSCodeLegacy} startMarker="// Update TS" endMarker="// END Update TS" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/manage-data/delete.mdx b/developers/weaviate/manage-data/delete.mdx index 018657b6cb..adeae79c34 100644 --- a/developers/weaviate/manage-data/delete.mdx +++ b/developers/weaviate/manage-data/delete.mdx @@ -53,7 +53,7 @@ To delete by id, specify the collection name and the object id. text={PyCodeV3} startMarker="# START DeleteObject" endMarker="# END DeleteObject" - language="py" + language="pyv3" /> @@ -71,7 +71,7 @@ To delete by id, specify the collection name and the object id. text={TSCodeLegacy} startMarker="// START DeleteObject" endMarker="// END DeleteObject" - language="ts" + language="tsv2" /> @@ -116,7 +116,7 @@ You can handle errors as follows: text={TSCode} startMarker="// START DeleteError" endMarker="// END DeleteError" - language="ts" + language="tsv2" /> --> @@ -141,7 +141,7 @@ To delete objects that match a set of criteria, specify the collection and a [`w text={PyCodeV3} startMarker="# START DeleteBatch" endMarker="# END DeleteBatch" - language="py" + language="pyv3" /> @@ -159,7 +159,7 @@ To delete objects that match a set of criteria, specify the collection and a [`w text={TSCodeLegacy} startMarker="// START DeleteBatch" endMarker="// END DeleteBatch" - language="ts" + language="tsv2" /> @@ -211,7 +211,7 @@ Use `ContainsAny` / `ContainsAll` filters to delete of objects by a set of crite text={PyCodeV3} startMarker="# START DeleteContains" endMarker="# END DeleteContains" - language="py" + language="pyv3" /> @@ -315,7 +315,7 @@ The default `QUERY_MAXIMUM_RESULTS` value is 10,000. This may be configurable, e text={PyCodeV3} startMarker="# START DeleteByIDBatch" endMarker="# END DeleteByIDBatch" - language="py" + language="pyv3" /> @@ -405,7 +405,7 @@ Objects must belong to a collection in Weaviate. Accordingly, @@ -423,7 +423,7 @@ Objects must belong to a collection in Weaviate. Accordingly, diff --git a/developers/weaviate/manage-data/import.mdx b/developers/weaviate/manage-data/import.mdx index 0cf2d39962..e8d4ee5c17 100644 --- a/developers/weaviate/manage-data/import.mdx +++ b/developers/weaviate/manage-data/import.mdx @@ -49,7 +49,7 @@ The following example adds objects to the `MyCollection` collection. text={PyCodeV3} startMarker="# START BasicBatchImportExample" endMarker="# END BasicBatchImportExample" - language="py" + language="pyv3" /> @@ -67,7 +67,7 @@ The following example adds objects to the `MyCollection` collection. text={TSCodeLegacy} startMarker="// START BasicBatchImportExample" endMarker="// END BasicBatchImportExample" - language="ts" + language="tsv2" /> @@ -187,7 +187,7 @@ Weaviate generates an UUID for each object. Object IDs must be unique. If you se text={PyCodeV3} startMarker="# START BatchImportWithIDExample" endMarker="# END BatchImportWithIDExample" - language="py" + language="pyv3" /> @@ -205,7 +205,7 @@ Weaviate generates an UUID for each object. Object IDs must be unique. If you se text={TSCodeLegacy} startMarker="// START BatchImportWithIDExample" endMarker="// END BatchImportWithIDExample" - language="ts" + language="tsv2" /> @@ -247,7 +247,7 @@ Use the `vector` property to specify a vector for each object. text={PyCodeV3} startMarker="# START BatchImportWithVectorExample" endMarker="# END BatchImportWithVectorExample" - language="py" + language="pyv3" /> @@ -265,7 +265,7 @@ Use the `vector` property to specify a vector for each object. text={TSCodeLegacy} startMarker="// START BatchImportWithVectorExample" endMarker="// END BatchImportWithVectorExample" - language="ts" + language="tsv2" /> @@ -310,7 +310,7 @@ When you create an object, you can specify named vectors (if [configured in your text={PyCodeV3} startMarker="# START BatchImportWithNamedVectors" endMarker="# END BatchImportWithNamedVectors" - language="py" + language="pyv3" /> @@ -328,7 +328,7 @@ When you create an object, you can specify named vectors (if [configured in your text={TSCodeLegacy} startMarker="// START BatchImportWithNamedVectors" endMarker="// END BatchImportWithNamedVectors" - language="ts" + language="tsv2" /> @@ -352,7 +352,7 @@ You can batch create links from an object to another other object through cross- text={PyCodeV3} startMarker="# BatchImportWithRefExample" endMarker="# END BatchImportWithRefExample" - language="py" + language="pyv3" /> @@ -360,7 +360,7 @@ You can batch create links from an object to another other object through cross- text={TSCodeLegacy} startMarker="// BatchImportWithRefExample" endMarker="// END BatchImportWithRefExample" - language="ts" + language="tsv2" /> @@ -423,7 +423,7 @@ To try the example code, download the sample data and create the sample input fi text={PyCodeV3} startMarker="# START JSON streaming" endMarker="# END JSON streaming" - language="py" + language="pyv3" /> @@ -456,7 +456,7 @@ To try the example code, download the sample data and create the sample input fi text={PyCodeV3} startMarker="# START CSV streaming" endMarker="# END CSV streaming" - language="py" + language="pyv3" /> diff --git a/developers/weaviate/manage-data/migrate.mdx b/developers/weaviate/manage-data/migrate.mdx index b778168cbe..6944faa1e1 100644 --- a/developers/weaviate/manage-data/migrate.mdx +++ b/developers/weaviate/manage-data/migrate.mdx @@ -1,5 +1,6 @@ --- title: Migrate data +description: Learn how to migrate data within Weaviate for easy data handling. sidebar_position: 80 image: og/docs/howto.jpg # tags: ['how-to', 'cursor'] @@ -12,9 +13,6 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/howto/manage-data.migrate.data.v4.py'; import PyCodeV3 from '!!raw-loader!/_includes/code/howto/manage-data.migrate.data.v3.py'; - -## Overview - Follow these examples to migrate data manually when using a backup is not possible. They cover all permutations between: - a single-tenancy collection (Collection), and @@ -60,7 +58,7 @@ Create a collection (e.g. `WineReview`) at the target instance, matching the col text={PyCodeV3} startMarker="# START CreateCollectionCollectionToCollection" endMarker="# END CreateCollectionCollectionToCollection" - language="py" + language="pyv3" /> @@ -89,7 +87,7 @@ Migrate: text={PyCodeV3} startMarker="# START CollectionToCollection" endMarker="# END CollectionToCollection" - language="py" + language="pyv3" /> @@ -114,7 +112,7 @@ Create a collection (e.g. `WineReview`) at the target instance, matching the col text={PyCodeV3} startMarker="# START CreateCollectionCollectionToTenant" endMarker="# END CreateCollectionCollectionToTenant" - language="py" + language="pyv3" /> @@ -137,7 +135,7 @@ Add tenants at the target instance before adding data objects. text={PyCodeV3} startMarker="# START CreateTenants" endMarker="# END CreateTenants" - language="py" + language="pyv3" /> @@ -166,7 +164,7 @@ Migrate: text={PyCodeV3} startMarker="# START CollectionToTenant" endMarker="# END CollectionToTenant" - language="py" + language="pyv3" /> @@ -191,7 +189,7 @@ Create a collection (e.g. `WineReview`) at the target instance, matching the col text={PyCodeV3} startMarker="# START CreateCollectionTenantToCollection" endMarker="# END CreateCollectionTenantToCollection" - language="py" + language="pyv3" /> @@ -220,7 +218,7 @@ Migrate: text={PyCodeV3} startMarker="# START TenantToCollection" endMarker="# END TenantToCollection" - language="py" + language="pyv3" /> @@ -245,7 +243,7 @@ Create a collection (e.g. `WineReview`) at the target instance, matching the col text={PyCodeV3} startMarker="# START CreateCollectionTenantToTenant" endMarker="# END CreateCollectionTenantToTenant" - language="py" + language="pyv3" /> @@ -268,7 +266,7 @@ Add tenants at the target instance before adding data objects. text={PyCodeV3} startMarker="# START CreateTenants" endMarker="# END CreateTenants" - language="py" + language="pyv3" /> @@ -297,7 +295,7 @@ Migrate: text={PyCodeV3} startMarker="# START TenantToTenant" endMarker="# END TenantToTenant" - language="py" + language="pyv3" /> diff --git a/developers/weaviate/manage-data/multi-tenancy.md b/developers/weaviate/manage-data/multi-tenancy.md index 7046a3e20f..f25118c590 100644 --- a/developers/weaviate/manage-data/multi-tenancy.md +++ b/developers/weaviate/manage-data/multi-tenancy.md @@ -51,7 +51,7 @@ Multi-tenancy is disabled by default. To enable multi-tenancy, set `multiTenancy text={PyCodeV3} startMarker="# START EnableMultiTenancy" endMarker="# END EnableMultiTenancy" - language="py" + language="pyv3" /> @@ -67,7 +67,7 @@ Multi-tenancy is disabled by default. To enable multi-tenancy, set `multiTenancy text={TSCodeLegacy} startMarker="// START EnableMultiTenancy" endMarker="// END EnableMultiTenancy" - language="ts" + language="tsv2" /> @@ -197,7 +197,7 @@ Tenant status is available from Weaviate `1.21` onwards. text={PyCodeV3} startMarker="# START AddTenantsToClass" endMarker="# END AddTenantsToClass" - language="py" + language="pyv3" /> @@ -215,7 +215,7 @@ Tenant status is available from Weaviate `1.21` onwards. text={TSCodeLegacy} startMarker="// START AddTenantsToClass" endMarker="// END AddTenantsToClass" - language="ts" + language="tsv2" /> @@ -259,7 +259,7 @@ This example lists the tenants in the `MultiTenancyCollection` collection: text={PyCodeV3} startMarker="# START ListTenants" endMarker="# END ListTenants" - language="py" + language="pyv3" /> @@ -277,7 +277,7 @@ This example lists the tenants in the `MultiTenancyCollection` collection: text={TSCodeLegacy} startMarker="// START ListTenants" endMarker="// END ListTenants" - language="ts" + language="tsv2" /> @@ -378,7 +378,7 @@ Deleting a tenant deletes all associated objects. text={PyCodeV3} startMarker="# START RemoveTenants" endMarker="# END RemoveTenants" - language="py" + language="pyv3" /> @@ -396,7 +396,7 @@ Deleting a tenant deletes all associated objects. text={TSCodeLegacy} startMarker="// START RemoveTenants" endMarker="// END RemoveTenants" - language="ts" + language="tsv2" /> @@ -468,7 +468,7 @@ Multi-tenancy collections require tenant name (e.g. `tenantA`) with each CRUD op text={PyCodeV3} startMarker="# START CreateMtObject" endMarker="# END CreateMtObject" - language="py" + language="pyv3" /> @@ -486,7 +486,7 @@ Multi-tenancy collections require tenant name (e.g. `tenantA`) with each CRUD op text={TSCodeLegacy} startMarker="// START CreateMtObject" endMarker="// END CreateMtObject" - language="ts" + language="tsv2" /> @@ -528,7 +528,7 @@ Multi-tenancy collections require the tenant name (e.g. `tenantA`) with each `Ge text={PyCodeV3} startMarker="# START Search" endMarker="# END Search" - language="py" + language="pyv3" /> @@ -546,7 +546,7 @@ Multi-tenancy collections require the tenant name (e.g. `tenantA`) with each `Ge text={TSCodeLegacy} startMarker="// START Search" endMarker="// END Search" - language="ts" + language="tsv2" /> @@ -592,7 +592,7 @@ Multi-tenancy collections require the tenant name (e.g. `tenantA`) when creating text={PyCodeV3} startMarker="# START AddCrossRef" endMarker="# END AddCrossRef" - language="py" + language="pyv3" /> @@ -610,7 +610,7 @@ Multi-tenancy collections require the tenant name (e.g. `tenantA`) when creating text={TSCodeLegacy} startMarker="// START AddCrossRef" endMarker="// END AddCrossRef" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/manage-data/read-all-objects.mdx b/developers/weaviate/manage-data/read-all-objects.mdx index d042e2e202..4658e777dd 100644 --- a/developers/weaviate/manage-data/read-all-objects.mdx +++ b/developers/weaviate/manage-data/read-all-objects.mdx @@ -44,7 +44,7 @@ The following code iterates through all objects, providing the properties and id text={PyCodeV3} startMarker="# START ReadAllProps" endMarker="# END ReadAllProps" - language="py" + language="pyv3" /> @@ -62,7 +62,7 @@ The following code iterates through all objects, providing the properties and id text={TSCodeLegacy} startMarker="// START ReadAllProps" endMarker="// END ReadAllProps" - language="ts" + language="tsv2" /> @@ -105,7 +105,7 @@ Read through all data including the vectors. (Also applicable where [named vecto text={PyCodeV3} startMarker="# START ReadAllVectors" endMarker="# END ReadAllVectors" - language="py" + language="pyv3" /> @@ -123,7 +123,7 @@ Read through all data including the vectors. (Also applicable where [named vecto text={TSCodeLegacy} startMarker="// START ReadAllVectors" endMarker="// END ReadAllVectors" - language="ts" + language="tsv2" /> @@ -152,7 +152,7 @@ For classes where [multi-tenancy](../concepts/data.md#multi-tenancy) is enabled, text={PyCodeV3} startMarker="# START ReadAllTenants" endMarker="# END ReadAllTenants" - language="py" + language="pyv3" /> @@ -170,7 +170,7 @@ For classes where [multi-tenancy](../concepts/data.md#multi-tenancy) is enabled, text={TSCodeLegacy} startMarker="// START ReadAllTenants" endMarker="// END ReadAllTenants" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/manage-data/read.mdx b/developers/weaviate/manage-data/read.mdx index af4b79755f..6afeece205 100644 --- a/developers/weaviate/manage-data/read.mdx +++ b/developers/weaviate/manage-data/read.mdx @@ -44,7 +44,7 @@ Use an ID to retrieve an object. If the id doesn't exist, Weaviate returns a 404 text={PyCodeV3} startMarker="# ReadObject START" endMarker="# ReadObject END" - language="py" + language="pyv3" /> @@ -62,7 +62,7 @@ Use an ID to retrieve an object. If the id doesn't exist, Weaviate returns a 404 text={TSCodeLegacy} startMarker="// ReadObject START" endMarker="// ReadObject END" - language="ts" + language="tsv2" /> @@ -105,7 +105,7 @@ Object vectors can be retrieved by specifying its return. text={PyCodeV3} startMarker="# ReadObjectWithVector START" endMarker="# ReadObjectWithVector END" - language="py" + language="pyv3" /> @@ -123,7 +123,7 @@ Object vectors can be retrieved by specifying its return. text={TSCodeLegacy} startMarker="// ReadObjectWithVector START" endMarker="// ReadObjectWithVector END" - language="ts" + language="tsv2" /> @@ -165,7 +165,7 @@ Where [named vectors](../config-refs/schema/multi-vector.md) are used, you can r text={PyCodeV3} startMarker="# ReadObjectNamedVectors START" endMarker="# ReadObjectNamedVectors END" - language="py" + language="pyv3" /> @@ -183,7 +183,7 @@ Where [named vectors](../config-refs/schema/multi-vector.md) are used, you can r text={TSCodeLegacy} startMarker="// ReadObjectNamedVectors START" endMarker="// ReadObjectNamedVectors END" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/manage-data/tenant-states.mdx b/developers/weaviate/manage-data/tenant-states.mdx index 99d6688459..bf69339750 100644 --- a/developers/weaviate/manage-data/tenant-states.mdx +++ b/developers/weaviate/manage-data/tenant-states.mdx @@ -1,5 +1,6 @@ --- title: Manage tenant states & temperature +description: Manage tenant states in Weaviate to support multitenancy and secure data separation. sidebar_position: 61 image: og/docs/configuration.jpg --- @@ -10,8 +11,6 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/_includes/code/howto/manage-data.multi-tenancy.py'; import TSCode from '!!raw-loader!/_includes/code/howto/manage-data.multi-tenancy.ts'; -## Overview - ![Storage Tiers](./img/storage-tiers.jpg) Storage resources are grouped into tiers. Each tier has different performance characteristics and costs: diff --git a/developers/weaviate/manage-data/update.mdx b/developers/weaviate/manage-data/update.mdx index 8c94b83fef..fa0ad59748 100644 --- a/developers/weaviate/manage-data/update.mdx +++ b/developers/weaviate/manage-data/update.mdx @@ -36,7 +36,7 @@ Weaviate allows partial or complete object updates. ## Update object properties -To update a collection property, provide the collection name, the object id, and the properties to update. +This operation replaces the entire value of the specified properties only, leaving the unspecified properties. Provide the collection name, the object id, and the properties to update. If you update the value of a *previously vectorized* property, Weaviate re-vectorizes the object automatically. This also reindexes the updated object. @@ -56,7 +56,7 @@ However, if you add a *new* property to your collection definition, Weaviate onl text={PyCodeV3} startMarker="# UpdateProps START" endMarker="# UpdateProps END" - language="py" + language="pyv3" /> @@ -72,7 +72,7 @@ However, if you add a *new* property to your collection definition, Weaviate onl text={TSCodeLegacy} startMarker="// UpdateProps START" endMarker="// UpdateProps END" - language="ts" + language="tsv2" /> @@ -111,7 +111,7 @@ The object vector can also be updated similarly to properties. For [named vector text={PyCodeV3} startMarker="# UpdateVector START" endMarker="# UpdateVector END" - language="py" + language="pyv3" /> @@ -162,7 +162,7 @@ The entire object can be replaced by providing the collection name, id and the n text={PyCodeV3} startMarker="# Replace START" endMarker="# Replace END" - language="py" + language="pyv3" /> @@ -180,7 +180,7 @@ The entire object can be replaced by providing the collection name, id and the n text={TSCodeLegacy} startMarker="// Replace START" endMarker="// Replace END" - language="ts" + language="tsv2" /> @@ -224,7 +224,7 @@ At object level, you can replace the object with a copy that has those propertie text={PyCodeV3} startMarker="# DelProps START" endMarker="# DelProps END" - language="py" + language="pyv3" /> @@ -242,7 +242,7 @@ At object level, you can replace the object with a copy that has those propertie text={TSCodeLegacy} startMarker="// DelProps START" endMarker="// DelProps END" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/model-providers/_includes/google-api-key-note.md b/developers/weaviate/model-providers/_includes/google-api-key-note.md index 3d410d215b..47e45d8efd 100644 --- a/developers/weaviate/model-providers/_includes/google-api-key-note.md +++ b/developers/weaviate/model-providers/_includes/google-api-key-note.md @@ -1,9 +1,9 @@
API key headers -Starting from `v1.25.1` and `v1.24.14`, there are separate headers `X-Google-Vertex-Api-Key` and `X-Google-Studio-Api-Key` for Vertex AI users and AI Studio respectively. +From `v1.27.7`, `v1.26.12` and `v1.25.27`, `X-Goog-Vertex-Api-Key` and `X-Goog-Studio-Api-Key` headers are supported for Vertex AI users and AI Studio respectively. We recommend these headers for highest compatibility.
-Prior to Weaviate `v1.25.1` or `v1.24.14`, there was one header for both Vertex AI users and AI Studio, specified with either `X-Google-Api-Key` or `X-PaLM-Api-Key`. We recommend using the new headers for clarity and future compatibility. +Consider `X-Google-Vertex-Api-Key`, `X-Google-Studio-Api-Key`, `X-Google-Api-Key` and `X-PaLM-Api-Key` deprecated.
diff --git a/developers/weaviate/model-providers/_includes/integration_jinaai_reranker.png b/developers/weaviate/model-providers/_includes/integration_jinaai_reranker.png new file mode 100644 index 0000000000..f870101c77 Binary files /dev/null and b/developers/weaviate/model-providers/_includes/integration_jinaai_reranker.png differ diff --git a/developers/weaviate/model-providers/_includes/integration_wes_embedding.png b/developers/weaviate/model-providers/_includes/integration_wes_embedding.png new file mode 100644 index 0000000000..3aacecfcdd Binary files /dev/null and b/developers/weaviate/model-providers/_includes/integration_wes_embedding.png differ diff --git a/developers/weaviate/model-providers/_includes/integration_wes_embedding_search.png b/developers/weaviate/model-providers/_includes/integration_wes_embedding_search.png new file mode 100644 index 0000000000..f2682c999b Binary files /dev/null and b/developers/weaviate/model-providers/_includes/integration_wes_embedding_search.png differ diff --git a/developers/weaviate/model-providers/_includes/provider.connect.py b/developers/weaviate/model-providers/_includes/provider.connect.py index 5525acf4c3..d04123c34b 100644 --- a/developers/weaviate/model-providers/_includes/provider.connect.py +++ b/developers/weaviate/model-providers/_includes/provider.connect.py @@ -103,9 +103,9 @@ "X-Friendli-Baseurl": "https://inference.friendli.ai/dedicated", # END FriendliDedicatedInstantiation # START GoogleInstantiation # START GoogleVertexInstantiation - "X-Google-Vertex-Api-Key": vertex_key, + "X-Goog-Vertex-Api-Key": vertex_key, # START GoogleInstantiation # END GoogleVertexInstantiation - "X-Google-Studio-Api-Key": studio_key, + "X-Goog-Studio-Api-Key": studio_key, # END GoogleInstantiation # START HuggingFaceInstantiation "X-HuggingFace-Api-Key": huggingface_key, diff --git a/developers/weaviate/model-providers/_includes/provider.connect.weaviate.py b/developers/weaviate/model-providers/_includes/provider.connect.weaviate.py new file mode 100644 index 0000000000..0d0ac8b145 --- /dev/null +++ b/developers/weaviate/model-providers/_includes/provider.connect.weaviate.py @@ -0,0 +1,24 @@ +# START WeaviateInstantiation +import weaviate +from weaviate.classes.init import Auth +import os + +# END WeaviateInstantiation + +weaviate_url = os.getenv("WEAVIATE_URL") +weaviate_key = os.getenv("WEAVIATE_API_KEY") + +# START WeaviateInstantiation +client = weaviate.connect_to_weaviate_cloud( + cluster_url=weaviate_url, # `weaviate_url`: your Weaviate URL + auth_credentials=Auth.api_key(weaviate_key), # `weaviate_key`: your Weaviate API key +) +# END WeaviateInstantiation + + +# START WeaviateInstantiation + +# Work with Weaviate + +client.close() +# END WeaviateInstantiation diff --git a/developers/weaviate/model-providers/_includes/provider.connect.weaviate.ts b/developers/weaviate/model-providers/_includes/provider.connect.weaviate.ts new file mode 100644 index 0000000000..75d9c65b4b --- /dev/null +++ b/developers/weaviate/model-providers/_includes/provider.connect.weaviate.ts @@ -0,0 +1,18 @@ +// START WeaviateInstantiation +import weaviate from 'weaviate-client' + +// END WeaviateInstantiation + +// START WeaviateInstantiation +const client = await weaviate.connectToWeaviateCloud( + 'WEAVIATE_INSTANCE_URL', // Replace with your instance URL + { + authCredentials: new weaviate.ApiKey('WEAVIATE_INSTANCE_APIKEY'), + } +) + +// Work with Weaviate + +client.close() +// END WeaviateInstantiation + diff --git a/developers/weaviate/model-providers/_includes/provider.generative.ts b/developers/weaviate/model-providers/_includes/provider.generative.ts index 5e07816bb9..062086f393 100644 --- a/developers/weaviate/model-providers/_includes/provider.generative.ts +++ b/developers/weaviate/model-providers/_includes/provider.generative.ts @@ -296,7 +296,7 @@ await client.collections.delete('DemoCollection'); await client.collections.create({ name: 'DemoCollection', // highlight-start - generative: weaviate.configure.generative.palm({ + generative: weaviate.configure.generative.google({ projectId: '', // Required for Vertex AI modelId: 'gemini-1.0-pro' }), @@ -309,7 +309,15 @@ await client.collections.create({ await client.collections.delete('DemoCollection'); // START BasicGenerativeGoogleStudio -// Coming soon +await client.collections.create({ + name: 'DemoCollection', + // highlight-start + generative: weaviate.configure.generative.google({ + modelId: 'gemini-pro' + }), + // highlight-end + // Additional parameters not shown +}); // END BasicGenerativeGoogleStudio // Clean up @@ -319,7 +327,7 @@ await client.collections.delete('DemoCollection'); await client.collections.create({ name: 'DemoCollection', // highlight-start - generative: weaviate.configure.generative.palm({ + generative: weaviate.configure.generative.google({ projectId: '', // Required for Vertex AI // model_id='', // api_endpoint='', diff --git a/developers/weaviate/model-providers/_includes/provider.reranker.py b/developers/weaviate/model-providers/_includes/provider.reranker.py index e9b5d01862..ddc224bf6a 100644 --- a/developers/weaviate/model-providers/_includes/provider.reranker.py +++ b/developers/weaviate/model-providers/_includes/provider.reranker.py @@ -60,6 +60,38 @@ # Clean up client.collections.delete("DemoCollection") +# START RerankerJinaAIBasic +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + reranker_config=Configure.Reranker.jinaai() + # highlight-end + # Additional parameters not shown +) +# END RerankerJinaAIBasic + +# Clean up +client.collections.delete("DemoCollection") + +# START RerankerJinaAICustomModel +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + reranker_config=Configure.Reranker.jinaai( + model="jina-reranker-v2-base-multilingual" + ) + # highlight-end + # Additional parameters not shown +) +# END RerankerJinaAICustomModel + +# Clean up +client.collections.delete("DemoCollection") + # START RerankerVoyageAI client.collections.create( "DemoCollection", diff --git a/developers/weaviate/model-providers/_includes/provider.reranker.ts b/developers/weaviate/model-providers/_includes/provider.reranker.ts index 36824f9811..98c1230868 100644 --- a/developers/weaviate/model-providers/_includes/provider.reranker.ts +++ b/developers/weaviate/model-providers/_includes/provider.reranker.ts @@ -41,8 +41,35 @@ await client.collections.create({ }); // END RerankerCohereCustomModel +// START RerankerJinaAIBasic +await client.collections.create({ + name: 'DemoCollection', + // highlight-start + reranker: weaviate.configure.reranker.jinaai(), + // highlight-end +}); +// END RerankerJinaAIBasic + +// START RerankerJinaAICustomModel +await client.collections.create({ + name: 'DemoCollection', + // highlight-start + reranker: weaviate.configure.reranker.jinaai({ + model: 'jina-reranker-v2-base-multilingual', + }), + // highlight-end +}); +// END RerankerJinaAICustomModel + // START RerankerVoyageAI -// Code example coming soon +await client.collections.create({ + name: 'DemoCollection', + // highlight-start + reranker: weaviate.configure.reranker.voyageAI({ + model: 'rerank-lite-1', + }), + // highlight-end +}); // END RerankerVoyageAI // START RerankerQueryExample diff --git a/developers/weaviate/model-providers/_includes/provider.vectorizer.py b/developers/weaviate/model-providers/_includes/provider.vectorizer.py index b4a12a68f6..8e3d1142ec 100644 --- a/developers/weaviate/model-providers/_includes/provider.vectorizer.py +++ b/developers/weaviate/model-providers/_includes/provider.vectorizer.py @@ -148,6 +148,101 @@ # clean up client.collections.delete("DemoCollection") +# START BasicMMVectorizerCohere +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_cohere( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + ) + ], + # highlight-end + # Additional parameters not shown +) +# END BasicMMVectorizerCohere + +# clean up +client.collections.delete("DemoCollection") + +# START MMVectorizerCohereCustomModel +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.text2vec_cohere( + name="title_vector", + model="embed-multilingual-v3.0", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + ) + ], + # highlight-end + # Additional parameters not shown +) +# END MMVectorizerCohereCustomModel + +# clean up +client.collections.delete("DemoCollection") + +# START FullMMVectorizerCohere +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.text2vec_cohere( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + # Further options + # model="embed-multilingual-v3.0", + # truncate="END", # "NONE", "START" or "END" + # base_url="" + ) + ], + # highlight-end + # Additional parameters not shown +) +# END FullMMVectorizerCohere + +# clean up +client.collections.delete("DemoCollection") + # START BasicVectorizerGoogleVertex from weaviate.classes.config import Configure @@ -366,8 +461,7 @@ Configure.NamedVectors.text2vec_jinaai( name="title_vector", source_properties=["title"], - model="jina-embeddings-v3-small-en", - dimensions=512, # e.g. 1024, 256, 64 + model="jina-embeddings-v3", ) ], # highlight-end @@ -388,7 +482,8 @@ name="title_vector", source_properties=["title"], # Further options - # model="jina-embeddings-v2-base-en" + # model="jina-embeddings-v3", + # dimensions=512, # e.g. 1024, 256, 64 (only applicable for some models) ) ], # highlight-end @@ -399,6 +494,99 @@ # clean up client.collections.delete("DemoCollection") +# START BasicMMVectorizerJinaAI +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_jinaai( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + ) + ], + # highlight-end + # Additional parameters not shown +) +# END BasicMMVectorizerJinaAI + +# clean up +client.collections.delete("DemoCollection") + +# START MMVectorizerJinaCustomModel +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_jinaai( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + model="jina-clip-v2", + ) + ], + # highlight-end +) +# END MMVectorizerJinaCustomModel + +# clean up +client.collections.delete("DemoCollection") + +# START FullMMVectorizerJinaAI +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_jinaai( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + # Further options + # model="jina-clip-v2", + # dimensions=512, # Only applicable for some models (e.g. `jina-clip-v2`) + ) + ], + # highlight-end + # Additional parameters not shown +) +# END FullMMVectorizerJinaAI + +# clean up +client.collections.delete("DemoCollection") + # START BasicVectorizerMistral from weaviate.classes.config import Configure @@ -574,7 +762,7 @@ # If using older model family e.g. `ada` model="ada", model_version="002", - type="text" + type_="text" ) ], # highlight-end @@ -711,7 +899,7 @@ Configure.NamedVectors.text2vec_voyageai( name="title_vector", source_properties=["title"], - model="voyage-code-2" + model="voyage-3-lite" ) ], # highlight-end @@ -746,6 +934,167 @@ # clean up client.collections.delete("DemoCollection") +# START BasicMMVectorizerVoyageAI +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_voyageai( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + ) + ], + # highlight-end + # Additional parameters not shown +) +# END BasicMMVectorizerVoyageAI + +# clean up +client.collections.delete("DemoCollection") + +# START MMVectorizerVoyageAICustomModel +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_voyageai( + name="title_vector", + model="voyage-multimodal-3", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + ) + ], + # highlight-end + # Additional parameters not shown +) +# END MMVectorizerVoyageAICustomModel + +# clean up +client.collections.delete("DemoCollection") + +# START FullMMVectorizerVoyageAI +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="poster", data_type=DataType.BLOB), + ], + vectorizer_config=[ + Configure.NamedVectors.multi2vec_voyageai( + name="title_vector", + # Define the fields to be used for the vectorization - using image_fields, text_fields + image_fields=[ + Multi2VecField(name="poster", weight=0.9) + ], + text_fields=[ + Multi2VecField(name="title", weight=0.1) + ], + # Further options + # model="voyage-multimodal-3", + # truncation="true", # or "false", + # output_encoding="base64", # or "null" + # base_url="" + ) + ], + # highlight-end + # Additional parameters not shown +) +# END FullMMVectorizerVoyageAI + +# clean up +client.collections.delete("DemoCollection") + +# START BasicVectorizerWeaviate +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + vectorizer_config=[ + Configure.NamedVectors.text2vec_weaviate( + name="title_vector", + source_properties=["title"] + ) + ], + # highlight-end + # Additional parameters not shown +) +# END BasicVectorizerWeaviate + +# clean up +client.collections.delete("DemoCollection") + +# START VectorizerWeaviateCustomModel +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + vectorizer_config=[ + Configure.NamedVectors.text2vec_weaviate( + name="title_vector", + source_properties=["title"], + model="arctic-embed-m-v1.5" + ) + ], + # highlight-end + # Additional parameters not shown +) +# END VectorizerWeaviateCustomModel + +# clean up +client.collections.delete("DemoCollection") + +# START FullVectorizerWeaviate +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + # highlight-start + vectorizer_config=[ + Configure.NamedVectors.text2vec_weaviate( + name="title_vector", + source_properties=["title"], + # Further options + # model="arctic-embed-m-v1.5", + # dimensions=256 + # base_url="", + ) + ], + # highlight-end + # Additional parameters not shown +) +# END FullVectorizerWeaviate + +# clean up +client.collections.delete("DemoCollection") + # START BasicVectorizerTransformers from weaviate.classes.config import Configure @@ -1060,7 +1409,6 @@ def url_to_base64(url): poster_b64 = url_to_base64(src_obj["poster_path"]) weaviate_obj = { "title": src_obj["title"], - "description": src_obj["description"], "poster": poster_b64 # Add the image in base64 encoding } diff --git a/developers/weaviate/model-providers/_includes/provider.vectorizer.ts b/developers/weaviate/model-providers/_includes/provider.vectorizer.ts index 87a4ac4233..f77385c42a 100644 --- a/developers/weaviate/model-providers/_includes/provider.vectorizer.ts +++ b/developers/weaviate/model-providers/_includes/provider.vectorizer.ts @@ -173,6 +173,116 @@ await client.collections.create({ // Clean up await client.collections.delete('DemoCollection'); +// START BasicMMVectorizerCohere +await client.collections.create({ + name: "DemoCollection", + // highlight-start + properties: [ + { + name: 'title', + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: 'poster', + dataType: weaviate.configure.dataType.BLOB, + }, + ], + vectorizers: [ + weaviate.configure.vectorizer.multi2VecCohere({ + name: "title_vector", + // Define the fields to be used for the vectorization - using imageFields, textFields + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }] + })], + // highlight-end + // Additional parameters not shown +}) +// END BasicMMVectorizerCohere + +// Clean up +await client.collections.delete('DemoCollection'); + +// START MMVectorizerCohereCustomModel +await client.collections.create({ + name: "DemoCollection", + // highlight-start + properties: [ + { + name: 'title', + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: 'poster', + dataType: weaviate.configure.dataType.BLOB, + }, + ], + vectorizers: [ + weaviate.configure.vectorizer.multi2VecCohere({ + name: "title_vector", + model: "embed-multilingual-v3.0", + // Define the fields to be used for the vectorization - using imageFields, textFields + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }] + })], + // highlight-end + // Additional parameters not shown +}) +// END MMVectorizerCohereCustomModel + +// Clean up +await client.collections.delete('DemoCollection'); + +// START FullMMVectorizerCohere +await client.collections.create({ + name: "DemoCollection", + // highlight-start + properties: [ + { + name: 'title', + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: 'poster', + dataType: weaviate.configure.dataType.BLOB, + }, + ], + vectorizers: [ + weaviate.configure.vectorizer.multi2VecCohere({ + name: "title_vector", + // Define the fields to be used for the vectorization - using imageFields, textFields + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }], + // Further options + // model: "embed-multilingual-v3.0", + // truncate: "END", // "NONE", "START" or "END" + // baseURL: "" + })], + // highlight-end + // Additional parameters not shown +}) +// END FullMMVectorizerCohere + +// Clean up +await client.collections.delete('DemoCollection'); + // START BasicVectorizerDatabricks const databricksVectorizerEndpoint = process.env.DATABRICKS_VECTORIZER_ENDPOINT || ''; // If saved as an environment variable @@ -211,7 +321,7 @@ await client.collections.create({ ], // highlight-start vectorizers: [ - weaviate.configure.vectorizer.text2VecPalm({ + weaviate.configure.vectorizer.text2VecGoogle({ name: 'title_vector', sourceProperties: ['title'], projectId: '', @@ -238,7 +348,7 @@ await client.collections.create({ ], // highlight-start vectorizers: [ - weaviate.configure.vectorizer.text2VecPalm({ + weaviate.configure.vectorizer.text2VecGoogle({ name: 'title_vector', sourceProperties: ['title'], // (Optional) To manually set the model ID @@ -264,7 +374,7 @@ await client.collections.create({ ], // highlight-start vectorizers: [ - weaviate.configure.vectorizer.text2VecPalm({ + weaviate.configure.vectorizer.text2VecGoogle({ name: 'title_vector', sourceProperties: ['title'], projectId: '', // Required for Vertex AI @@ -294,7 +404,7 @@ await client.collections.create({ ], // highlight-start vectorizers: [ - weaviate.configure.vectorizer.multi2VecPalm({ + weaviate.configure.vectorizer.multi2VecGoogle({ name: 'title_vector', location: '', projectId: '', @@ -339,7 +449,7 @@ await client.collections.create({ ], // highlight-start vectorizers: [ - weaviate.configure.vectorizer.multi2VecPalm({ + weaviate.configure.vectorizer.multi2VecGoogle({ name: 'title_vector', projectId: '', modelId: '', @@ -464,7 +574,7 @@ await client.collections.create({ weaviate.configure.vectorizer.text2VecJina({ name: 'title_vector', sourceProperties: ['title'], - model: 'jina-embeddings-v2-small-en' + model: 'jina-embeddings-v3' }), ], // highlight-end @@ -486,11 +596,11 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectorizer.text2VecJina({ - name: 'title_vector', - sourceProperties: ['title'], - // model: 'jina-embeddings-v3-small-en' - // dimensions: 512, // e.g. 1024, 256, 64 // Support for this parameter is coming soon - }, + name: 'title_vector', + sourceProperties: ['title'], + // model: 'jina-embeddings-v3-small-en' + // dimensions: 512, // e.g. 1024, 256, 64 Support for this parameter is coming soon (Only applicable for some models) + }, ), ], // highlight-end @@ -501,36 +611,240 @@ await client.collections.create({ // Clean up await client.collections.delete('DemoCollection'); +// START BasicMMVectorizerJinaAI +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + { + name: 'poster', + dataType: 'blob' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.multi2VecJinaAI({ + name: 'title_vector', + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }] + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); +// END BasicMMVectorizerJinaAI + +// Clean up +await client.collections.delete('DemoCollection'); + +// START MMVectorizerJinaCustomModel +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + { + name: 'poster', + dataType: 'blob' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.multi2VecJinaAI({ + name: 'title_vector', + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }], + model: "jina-clip-v2" + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); +// END MMVectorizerJinaCustomModel + +// Clean up +await client.collections.delete('DemoCollection'); + +// START FullMMVectorizerJinaAI +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + { + name: 'poster', + dataType: 'blob' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.multi2VecJinaAI({ + name: 'title_vector', + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }], + // Further options + // model:"jina-clip-v2", + + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); +// END FullMMVectorizerJinaAI + +// Clean up +await client.collections.delete('DemoCollection'); + // START BasicVectorizerMistral -// TS support & code example coming soon +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecMistral({ + name: 'title_vector', + sourceProperties: ['title'], + }), + ], + // highlight-end + // Additional parameters not shown +}); // END BasicVectorizerMistral // Clean up await client.collections.delete('DemoCollection'); // START FullVectorizerMistral -// TS support & code example coming soon -// END FullVectorizerMistral +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecMistral({ + name: 'title_vector', + sourceProperties: ['title'], + model: 'mistral-embed' + }, + ), + ], + // highlight-end + // Additional parameters not shown +});// END FullVectorizerMistral // Clean up await client.collections.delete('DemoCollection'); // START BasicVectorizerOctoAI -// Code example coming soon -// END BasicVectorizerOctoAI +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecOctoAI({ + name: 'title_vector', + sourceProperties: ['title'], + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); // END BasicVectorizerOctoAI // Clean up await client.collections.delete('DemoCollection'); // START VectorizerOctoAICustomModel -// Code example coming soon +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecOctoAI({ + name: 'title_vector', + sourceProperties: ['title'], + model: "thenlper/gte-large", + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); // END VectorizerOctoAICustomModel // Clean up await client.collections.delete('DemoCollection'); // START FullVectorizerOctoAI -// Code example coming soon +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecOctoAI({ + name: 'title_vector', + sourceProperties: ['title'], + // model: "thenlper/gte-large", + // vectorizeCollectionName: true, + // baseURL: "https://text.octoai.run", + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); // END FullVectorizerOctoAI // Clean up @@ -550,7 +864,7 @@ await client.collections.create({ weaviate.configure.vectorizer.text2VecOpenAI({ name: 'title_vector', sourceProperties: ['title'], - }, + }, ), ], // highlight-end @@ -577,7 +891,7 @@ await client.collections.create({ sourceProperties: ['title'], model: 'text-embedding-3-large', dimensions: 1024 - }, + }, ), ], // highlight-end @@ -605,7 +919,7 @@ await client.collections.create({ model: 'ada', modelVersion: '002', type: 'text' - }, + }, ), ], // highlight-end @@ -689,11 +1003,11 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectorizer.text2VecAzureOpenAI({ - name: 'title_vector', - sourceProperties: ['title'], - resourceName: '', - deploymentId: '', - }, + name: 'title_vector', + sourceProperties: ['title'], + resourceName: '', + deploymentId: '', + }, ), ], // highlight-end @@ -716,13 +1030,13 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectorizer.text2VecAzureOpenAI({ - name: 'title_vector', - sourceProperties: ['title'], - resourceName: '', - deploymentId: '', - // // Further options - // baseURL: '' - }, + name: 'title_vector', + sourceProperties: ['title'], + resourceName: '', + deploymentId: '', + // // Further options + // baseURL: '' + }, ), ], // highlight-end @@ -745,9 +1059,9 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectorizer.text2VecVoyageAI({ - name: 'title_vector', - sourceProperties: ['title'], - }, + name: 'title_vector', + sourceProperties: ['title'], + }, ), ], // highlight-end @@ -772,7 +1086,7 @@ await client.collections.create({ weaviate.configure.vectorizer.text2VecVoyageAI({ name: 'title_vector', sourceProperties: ['title'], - model: 'voyage-code-2', + model: 'voyage-3-lite', }), ], // highlight-end @@ -795,19 +1109,209 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectorizer.text2VecVoyageAI({ + name: 'title_vector', + sourceProperties: ['title'], + // // Further options + // model: 'voyage-large-2', + // base_url: '', + // truncate: true + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); +// END FullVectorizerVoyageAI + +// Clean up +await client.collections.delete('DemoCollection'); + +// START BasicMMVectorizerVoyageAI +await client.collections.create({ + name: "DemoCollection", + // highlight-start + properties: [ + { + name: 'title', + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: 'poster', + dataType: weaviate.configure.dataType.BLOB, + }, + ], + vectorizers: [ + weaviate.configure.vectorizer.multi2VecVoyageAI({ + name: "title_vector", + // Define the fields to be used for the vectorization - using imageFields, textFields + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }] + })], + // highlight-end + // Additional parameters not shown +})// END BasicMMVectorizerVoyageAI + + +// Clean up +await client.collections.delete('DemoCollection'); + +// START MMVectorizerVoyageAICustomModel +await client.collections.create({ + name: "DemoCollection", + // highlight-start + properties: [ + { + name: 'title', + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: 'poster', + dataType: weaviate.configure.dataType.BLOB, + }, + ], + vectorizers: [ + weaviate.configure.vectorizer.multi2VecVoyageAI({ + name: "title_vector", + // Define the fields to be used for the vectorization - using imageFields, textFields + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }], + model: "voyage-multimodal-3", + })], + // highlight-end + // Additional parameters not shown +})// END MMVectorizerVoyageAICustomModel + + +// Clean up +await client.collections.delete('DemoCollection'); + +// START FullMMVectorizerVoyageAI +await client.collections.create({ + name: "DemoCollection", + // highlight-start + properties: [ + { + name: 'title', + dataType: weaviate.configure.dataType.TEXT, + }, + { + name: 'poster', + dataType: weaviate.configure.dataType.BLOB, + }, + ], + vectorizers: [ + weaviate.configure.vectorizer.multi2VecVoyageAI({ + name: "title_vector", + // Define the fields to be used for the vectorization - using imageFields, textFields + imageFields: [{ + name: "poster", + weight: 0.9 + }], + textFields: [{ + name: "title", + weight: 0.1 + }], + // Further options + // model: "voyage-multimodal-3", + // truncation: "true", // or "false" + // outputEncoding: "base64" // or "null" + // baseURL: "" + })], + // highlight-end + // Additional parameters not shown +})// END FullMMVectorizerVoyageAI + + +// Clean up +await client.collections.delete('DemoCollection'); + +// START BasicVectorizerWeaviate +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecWeaviate({ + name: 'title_vector', + sourceProperties: ['title'], + }, + ), + ], + // highlight-end + // Additional parameters not shown +}); +// END BasicVectorizerWeaviate + +// Clean up +await client.collections.delete('DemoCollection'); + +// START VectorizerWeaviateCustomModel +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecWeaviate({ + name: 'title_vector', + sourceProperties: ['title'], + model: 'arctic-embed-m-v1.5', + }), + ], + // highlight-end + // Additional parameters not shown +}); +// END VectorizerWeaviateCustomModel + +// Clean up +await client.collections.delete('DemoCollection'); + +// START FullVectorizerWeaviate +await client.collections.create({ + name: 'DemoCollection', + properties: [ + { + name: 'title', + dataType: 'text' as const, + }, + ], + // highlight-start + vectorizers: [ + weaviate.configure.vectorizer.text2VecWeaviate({ name: 'title_vector', sourceProperties: ['title'], // // Further options - // model: 'voyage-large-2', - // base_url: '', - // truncate: true + // model: 'arctic-embed-m-v1.5', + // dimensions: 256, + // baseUrl: '', }, ), ], // highlight-end // Additional parameters not shown }); -// END FullVectorizerVoyageAI +// END FullVectorizerWeaviate // Clean up await client.collections.delete('DemoCollection'); @@ -826,7 +1330,7 @@ await client.collections.create({ weaviate.configure.vectorizer.text2VecTransformers({ name: 'title_vector', sourceProperties: ['title'], - }, + }, ), ], // highlight-end @@ -850,12 +1354,12 @@ await client.collections.create({ weaviate.configure.vectorizer.text2VecTransformers({ name: 'title_vector', sourceProperties: ['title'], - // // Further options + // // Further options // poolingStrategy: 'masked_mean', // inferenceUrl: '', // For when using multiple inference containers // passageInferenceUrl: ``, // For when using DPR models // queryInferenceUrl: ``, // For when using DPR models - }, + }, ), ], // highlight-end @@ -878,7 +1382,7 @@ await client.collections.create({ // highlight-end // END BasicVectorizerOllama properties: [ - {name: 'title', dataType: 'text'} + { name: 'title', dataType: 'text' } ], // START BasicVectorizerOllama // Additional parameters not shown @@ -901,7 +1405,7 @@ await client.collections.create({ // highlight-end // END BasicVectorizerGPT4All properties: [ - {name: 'title', dataType: 'text'} + { name: 'title', dataType: 'text' } ], // START BasicVectorizerGPT4All // Additional parameters not shown @@ -924,7 +1428,7 @@ await client.collections.create({ // highlight-end // END FullVectorizerGPT4All properties: [ - {name: 'title', dataType: 'text'} + { name: 'title', dataType: 'text' } ], // START FullVectorizerGPT4All // Additional parameters not shown @@ -1102,11 +1606,11 @@ await client.collections.delete('DemoCollection'); await client.collections.delete('DemoCollection'); let srcObjects = [ - {title: "The Shawshank Redemption", description: ""}, - {title: "The Godfather", description: ""}, - {title: "The Dark Knight", description: ""}, - {title: "Jingle All the Way", description: ""}, - {title: "A Christmas Carol", description: ""}, + { title: "The Shawshank Redemption", description: "" }, + { title: "The Godfather", description: "" }, + { title: "The Dark Knight", description: "" }, + { title: "Jingle All the Way", description: "" }, + { title: "A Christmas Carol", description: "" }, ]; // START BatchImportExample // START NearTextExample // START HybridExample // START MMBatchImportExample @@ -1131,11 +1635,11 @@ console.log(response); // END BatchImportExample let mmSrcObjects = [ - {title: "The Shawshank Redemption", description: "", poster: ""}, - {title: "The Godfather", description: "", poster: ""}, - {title: "The Dark Knight", description: "", poster: ""}, - {title: "Jingle All the Way", description: "", poster: ""}, - {title: "A Christmas Carol", description: "", poster: ""}, + { title: "The Shawshank Redemption", description: "", poster: "" }, + { title: "The Godfather", description: "", poster: "" }, + { title: "The Dark Knight", description: "", poster: "" }, + { title: "Jingle All the Way", description: "", poster: "" }, + { title: "A Christmas Carol", description: "", poster: "" }, ]; // START MMBatchImportExample diff --git a/developers/weaviate/model-providers/anthropic/generative.md b/developers/weaviate/model-providers/anthropic/generative.md index a5cacab282..d3b0a9de0b 100644 --- a/developers/weaviate/model-providers/anthropic/generative.md +++ b/developers/weaviate/model-providers/anthropic/generative.md @@ -78,7 +78,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an Anthropic generative model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an Anthropic generative model: diff --git a/developers/weaviate/model-providers/anthropic/index.md b/developers/weaviate/model-providers/anthropic/index.md index c4d8de68dd..d61aa39ebc 100644 --- a/developers/weaviate/model-providers/anthropic/index.md +++ b/developers/weaviate/model-providers/anthropic/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_anthropic.jpg -Anthropic offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Anthropic's APIs, allowing users to leverage Anthropic's models directly within the Weaviate database. +Anthropic offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Anthropic's APIs, allowing users to leverage Anthropic's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -19,7 +19,7 @@ These integrations empower developers to build sophisticated AI-driven applicati Anthropic's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Anthropic's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Anthropic's generative AI models to generate personalized and context-aware responses. [Anthropic generative AI integration page](./generative.md) @@ -37,12 +37,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/anyscale/generative.md b/developers/weaviate/model-providers/anyscale/generative.md index c4a841a96d..44be94504f 100644 --- a/developers/weaviate/model-providers/anyscale/generative.md +++ b/developers/weaviate/model-providers/anyscale/generative.md @@ -78,7 +78,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an Anyscale generative model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an Anyscale generative model: diff --git a/developers/weaviate/model-providers/anyscale/index.md b/developers/weaviate/model-providers/anyscale/index.md index 5001048c90..823c05a190 100644 --- a/developers/weaviate/model-providers/anyscale/index.md +++ b/developers/weaviate/model-providers/anyscale/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_anyscale.jpg -Anyscale offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Anyscale's Endpoints APIs, allowing users to leverage Anyscale's models directly within the Weaviate database. +Anyscale offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Anyscale's Endpoints APIs, allowing users to leverage Anyscale's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -19,7 +19,7 @@ These integrations empower developers to build sophisticated AI-driven applicati Anyscale's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Anyscale's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Anyscale's generative AI models to generate personalized and context-aware responses. [Anyscale generative AI integration page](./generative.md) @@ -37,12 +37,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/aws/embeddings.md b/developers/weaviate/model-providers/aws/embeddings.md index cfc8f3c56e..db4bb86622 100644 --- a/developers/weaviate/model-providers/aws/embeddings.md +++ b/developers/weaviate/model-providers/aws/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: "Weaviate's integration with AWS's SageMaker and Bedrock APIs allows you to access their models' capabilities directly from Weaviate." sidebar_position: 20 image: og/docs/integrations/provider_integrations_aws.jpg # tags: ['model providers', 'aws', 'embeddings'] @@ -13,8 +14,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with AWS's [SageMaker](https://aws.amazon.com/sagemaker/) and [Bedrock](https://aws.amazon.com/bedrock/) APIs allows you to access their models' capabilities directly from Weaviate. @@ -74,6 +77,15 @@ Provide the API credentials to Weaviate using one of the following methods: /> + + + + ### AWS model access @@ -117,6 +129,15 @@ For Bedrock, you must provide the model name in the vectorizer configuration. /> + + + + ### SageMaker @@ -142,6 +163,15 @@ For SageMaker, you must provide the endpoint address in the vectorizer configura /> + + + + import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; @@ -181,6 +211,15 @@ The AWS region setting is required for all AWS integrations. /> + + + + ## Data import @@ -207,6 +246,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -245,6 +293,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -277,6 +334,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References diff --git a/developers/weaviate/model-providers/aws/generative.md b/developers/weaviate/model-providers/aws/generative.md index 48f0fc08ec..e71b8f2277 100644 --- a/developers/weaviate/model-providers/aws/generative.md +++ b/developers/weaviate/model-providers/aws/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: AWS Generative Model Provider sidebar_position: 50 image: og/docs/integrations/provider_integrations_aws.jpg # tags: ['model providers', 'aws', 'generative', 'rag'] @@ -90,7 +91,11 @@ To use a model via [SageMaker](https://aws.amazon.com/sagemaker/), you must have ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an AWS generative model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an AWS generative model: ### Bedrock diff --git a/developers/weaviate/model-providers/aws/index.md b/developers/weaviate/model-providers/aws/index.md index 1ad4c7c594..e14470823c 100644 --- a/developers/weaviate/model-providers/aws/index.md +++ b/developers/weaviate/model-providers/aws/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_aws.jpg -AWS offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with AWS's APIs, allowing users to leverage AWS's models directly within the Weaviate database. +AWS offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with AWS's APIs, allowing users to leverage AWS's models directly from the Weaviate database. Weaviate integrates with both AWS [Sagemaker](https://aws.amazon.com/sagemaker/) and [Bedrock](https://aws.amazon.com/bedrock/). @@ -35,7 +35,7 @@ AWS's embedding models transform text data into high-dimensional vector represen AWS's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with AWS's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with AWS's generative AI models to generate personalized and context-aware responses. [AWS generative AI integration page](./generative.md) @@ -54,12 +54,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/cohere/embeddings-multimodal.md b/developers/weaviate/model-providers/cohere/embeddings-multimodal.md new file mode 100644 index 0000000000..b598dfbf3b --- /dev/null +++ b/developers/weaviate/model-providers/cohere/embeddings-multimodal.md @@ -0,0 +1,328 @@ +--- +title: Multimodal Embeddings +description: "Weaviate's integration with Cohere's APIs allows you to access their models' capabilities directly from Weaviate." +sidebar_position: 25 +image: og/docs/integrations/provider_integrations_cohere.jpg +# tags: ['model providers', 'cohere', 'embeddings'] +--- + +# Cohere Multimodal Embeddings with Weaviate + +:::info Added in `1.25.25`, `1.26.9` and `v1.27.2` +::: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; +import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; +import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; + +Weaviate's integration with Cohere's APIs allows you to access their models' capabilities directly from Weaviate. + +[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Cohere embedding model, and Weaviate will generate embeddings for various operations using the specified model and your Cohere API key. This feature is called the *vectorizer*. + +At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts text queries into embeddings. [Multimodal search operations](#vector-near-media-search) are also supported. + +![Embedding integration illustration](../_includes/integration_cohere_embedding.png) + +## Requirements + +### Weaviate configuration + +Your Weaviate instance must be configured with the Cohere vectorizer integration (`multi2vec-cohere`) module. + +
+ For Weaviate Cloud (WCD) users + +This integration is enabled by default on Weaviate Cloud (WCD) serverless instances. + +
+ +
+ For self-hosted users + +- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. + +
+ +### API credentials + +You must provide a valid Cohere API key to Weaviate for this integration. Go to [Cohere](https://cohere.com/) to sign up and obtain an API key. + +Provide the API key to Weaviate using one of the following methods: + +- Set the `COHERE_APIKEY` environment variable that is available to Weaviate. +- Provide the API key at runtime, as shown in the examples below. + + + + + + + + + + + + + +## Configure the vectorizer + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Cohere embedding model: + + + + + + + + + + + + +### Select a model + +You can specify one of the [available models](#available-models) for the vectorizer to use, as shown in the following configuration example. + + + + + + + + + + + + +You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. + +import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; + +
+ Vectorization behavior + + + +
+ +### Vectorizer parameters + +The following examples show how to configure Cohere-specific options. + + + + + + + + + + + + +For further details on model parameters, see the [Cohere API documentation](https://docs.cohere.com/reference/embed). + +## Data import + +After configuring the vectorizer, [import data](../../manage-data/import.mdx) into Weaviate. Weaviate generates embeddings for text objects using the specified model. + + + + + + + + + + + + + +:::tip Re-use existing vectors +If you already have a compatible model vector available, you can provide it directly to Weaviate. This can be useful if you have already generated embeddings using the same model and want to use them in Weaviate, such as when migrating data from another system. +::: + +## Searches + +Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified Cohere model. + +![Embedding integration at search illustration](../_includes/integration_cohere_embedding_search.png) + +### Vector (near text) search + +When you perform a [vector search](../../search/similarity.md#search-with-text), Weaviate converts the text query into an embedding using the specified model and returns the most similar objects from the database. + +The query below returns the `n` most similar objects from the database, set by `limit`. + + + + + + + + + + + + + +### Hybrid search + +:::info What is a hybrid search? +A hybrid search performs a vector search and a keyword (BM25) search, before [combining the results](../../search/hybrid.md#change-the-ranking-method) to return the best matching objects from the database. +::: + +When you perform a [hybrid search](../../search/hybrid.md), Weaviate converts the text query into an embedding using the specified model and returns the best scoring objects from the database. + +The query below returns the `n` best scoring objects from the database, set by `limit`. + + + + + + + + + + + + + +### Vector (near media) search + +When you perform a media search such as a [near image search](../../search/similarity.md#search-with-image), Weaviate converts the query into an embedding using the specified model and returns the most similar objects from the database. + +To perform a near media search such as near image search, convert the media query into a base64 string and pass it to the search query. + +The query below returns the `n` most similar objects to the input image from the database, set by `limit`. + + + + + + + + + + + + + +## References + +### Available models + +- `embed-multilingual-v3.0` (Default) +- `embed-multilingual-light-v3.0` +- `embed-english-v3.0` +- `embed-english-light-v3.0` + +## Further resources + +### Other integrations + +- [Cohere text embedding models + Weaviate](./embeddings.md). +- [Cohere generative models + Weaviate](./generative.md). +- [Cohere reranker models + Weaviate](./reranker.md). + +### Code examples + +Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples: + +- The [how-to: manage data](../../manage-data/index.md) guides show how to perform data operations (i.e. create, update, delete). +- The [how-to: search](../../search/index.md) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation. + +### External resources + +- Cohere [Embed API documentation](https://docs.cohere.com/reference/embed) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/model-providers/cohere/embeddings.md b/developers/weaviate/model-providers/cohere/embeddings.md index c59f770d41..6ca553cc97 100644 --- a/developers/weaviate/model-providers/cohere/embeddings.md +++ b/developers/weaviate/model-providers/cohere/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: "Weaviate's integration with Cohere's APIs allows you to access their models' capabilities directly from Weaviate." sidebar_position: 20 image: og/docs/integrations/provider_integrations_cohere.jpg # tags: ['model providers', 'cohere', 'embeddings'] @@ -13,8 +14,13 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; +import JavaConnect from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/Connect.java'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageCohereTextEmbeddings.java'; +import JavaImportQueries from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ImportAndQueries.java'; Weaviate's integration with Cohere's APIs allows you to access their models' capabilities directly from Weaviate. @@ -56,21 +62,47 @@ Provide the API key to Weaviate using one of the following methods: - + - + + + + + + + + + @@ -99,6 +131,24 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + + + + + ### Select a model @@ -124,6 +174,24 @@ You can specify one of the [available models](#available-models) for the vectori /> + + + + + + + + You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. @@ -160,6 +228,24 @@ The following examples show how to configure Cohere-specific options. /> + + + + + + + + For further details on model parameters, see the [Cohere API documentation](https://docs.cohere.com/reference/embed). @@ -188,6 +274,24 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + + + + + :::tip Re-use existing vectors @@ -226,6 +330,24 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + + + + + ### Hybrid search @@ -258,6 +380,23 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + + + + ## References @@ -287,8 +426,9 @@ The following models are available, but deprecated: ### Other integrations -- [Cohere generative models + Weaviate](./generative.md). -- [Cohere reranker models + Weaviate](./reranker.md). +- [Cohere multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [Cohere generative models + Weaviate](./generative.md) +- [Cohere reranker models + Weaviate](./reranker.md) ### Code examples diff --git a/developers/weaviate/model-providers/cohere/generative.md b/developers/weaviate/model-providers/cohere/generative.md index 7b969e614c..6464868823 100644 --- a/developers/weaviate/model-providers/cohere/generative.md +++ b/developers/weaviate/model-providers/cohere/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: Cohere Generative Model Provider sidebar_position: 50 image: og/docs/integrations/provider_integrations_cohere.jpg # tags: ['model providers', 'cohere', 'generative', 'rag'] @@ -78,7 +79,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use a Cohere generative AI model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use a Cohere generative AI model: @@ -241,7 +246,8 @@ In other words, when you have `n` search results, the generative model generates ### Other integrations -- [Cohere embedding models + Weaviate](./embeddings.md). +- [Cohere text embedding models + Weaviate](./embeddings.md). +- [Cohere multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) - [Cohere reranker models + Weaviate](./reranker.md). ### Code examples diff --git a/developers/weaviate/model-providers/cohere/index.md b/developers/weaviate/model-providers/cohere/index.md index 5b6c7a44a1..1bd30c8f80 100644 --- a/developers/weaviate/model-providers/cohere/index.md +++ b/developers/weaviate/model-providers/cohere/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_cohere.jpg -Cohere offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Cohere's APIs, allowing users to leverage Cohere's models directly within the Weaviate database. +Cohere offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Cohere's APIs, allowing users to leverage Cohere's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -29,7 +29,7 @@ Cohere's embedding models transform text data into high-dimensional vector repre Cohere's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Cohere's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Cohere's generative AI models to generate personalized and context-aware responses. [Cohere generative AI integration page](./generative.md) @@ -59,12 +59,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Generative AI](./generative.md) - [Reranker](./reranker.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/cohere/reranker.md b/developers/weaviate/model-providers/cohere/reranker.md index dc5cbad6c0..1f7eede2d4 100644 --- a/developers/weaviate/model-providers/cohere/reranker.md +++ b/developers/weaviate/model-providers/cohere/reranker.md @@ -1,5 +1,6 @@ --- title: Reranker +description: Cohere Reranker Model Provider sidebar_position: 70 image: og/docs/integrations/provider_integrations_cohere.jpg # tags: ['model providers', 'cohere', 'reranking'] @@ -78,6 +79,10 @@ Provide the API key to Weaviate using one of the following methods: ## Configure the reranker +import MutableRerankerConfig from '/_includes/mutable-reranker-config.md'; + + + Configure a Weaviate collection to use a Cohere reranker model as follows: @@ -181,7 +186,8 @@ For further details on model parameters, see the [Cohere API documentation](http ### Other integrations -- [Cohere embedding models + Weaviate](./embeddings.md). +- [Cohere text embedding models + Weaviate](./embeddings.md). +- [Cohere multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) - [Cohere generative models + Weaviate](./generative.md). ### Code examples diff --git a/developers/weaviate/model-providers/databricks/embeddings.md b/developers/weaviate/model-providers/databricks/embeddings.md index d42ff5c9ab..f0845c4f50 100644 --- a/developers/weaviate/model-providers/databricks/embeddings.md +++ b/developers/weaviate/model-providers/databricks/embeddings.md @@ -15,8 +15,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with Databricks' APIs allows you to access models hosted on their platform directly from Weaviate. @@ -76,6 +78,15 @@ Provide the Dataricks token to Weaviate using one of the following methods: /> + + + + ## Configure the vectorizer @@ -101,6 +112,15 @@ Provide the Dataricks token to Weaviate using one of the following methods: /> + + + + This will configure Weaviate to use the vectorizer served through the endpoint you specify. @@ -135,6 +155,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in language="ts" /> + + + + :::tip Re-use existing vectors @@ -173,6 +202,14 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + ### Hybrid search @@ -204,6 +241,15 @@ The query below returns the `n` best scoring objects from the database, set by ` language="ts" /> + + + + ## References diff --git a/developers/weaviate/model-providers/databricks/generative.md b/developers/weaviate/model-providers/databricks/generative.md index e800ae391a..8d9b366916 100644 --- a/developers/weaviate/model-providers/databricks/generative.md +++ b/developers/weaviate/model-providers/databricks/generative.md @@ -79,7 +79,11 @@ Provide the Dataricks token to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate collection](../../manage-data/collections.mdx#specify-a-generative-module) to use a Databricks generative AI endpoint as follows: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate collection](../../manage-data/collections.mdx#specify-a-generative-model-integration) to use a Databricks generative AI endpoint as follows: diff --git a/developers/weaviate/model-providers/databricks/index.md b/developers/weaviate/model-providers/databricks/index.md index d5c0dfe3d7..ed1cfbf100 100644 --- a/developers/weaviate/model-providers/databricks/index.md +++ b/developers/weaviate/model-providers/databricks/index.md @@ -10,7 +10,7 @@ image: og/docs/integrations/provider_integrations_databricks.jpg :::info Added in `v1.26.3` ::: -Databricks offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Databricks' Foundation Model APIs, allowing users to leverage Databricks' models directly within the Weaviate database. +Databricks offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Databricks' Foundation Model APIs, allowing users to leverage Databricks' models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -32,7 +32,7 @@ Databricks' embedding models transform text data into high-dimensional vector re Databrick' generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate' efficient storage and fast retrieval capabilities with Databrick' generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate' efficient storage and fast retrieval capabilities with Databrick' generative AI models to generate personalized and context-aware responses. [Databricks generative AI integration page](./generative.md) @@ -51,12 +51,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/friendliai/generative.md b/developers/weaviate/model-providers/friendliai/generative.md index af05698eb8..3f9587ddd1 100644 --- a/developers/weaviate/model-providers/friendliai/generative.md +++ b/developers/weaviate/model-providers/friendliai/generative.md @@ -81,7 +81,11 @@ Provide the Friendli token to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use a FriendliAI generative AI model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use a FriendliAI generative AI model: diff --git a/developers/weaviate/model-providers/friendliai/index.md b/developers/weaviate/model-providers/friendliai/index.md index aab9692c75..d9b0defbff 100644 --- a/developers/weaviate/model-providers/friendliai/index.md +++ b/developers/weaviate/model-providers/friendliai/index.md @@ -22,7 +22,7 @@ FriendliAI integration empowers developers to build sophisticated AI-driven appl FriendliAI's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform Retrieval Augmented Generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with FriendliAI's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform Retrieval Augmented Generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with FriendliAI's generative AI models to generate personalized and context-aware responses. Visit [FriendliAI generative AI integration page](./generative.md) for more information on our integrations with FriendliAI. diff --git a/developers/weaviate/model-providers/google/embeddings-multimodal.md b/developers/weaviate/model-providers/google/embeddings-multimodal.md index cbdf885105..a74a911481 100644 --- a/developers/weaviate/model-providers/google/embeddings-multimodal.md +++ b/developers/weaviate/model-providers/google/embeddings-multimodal.md @@ -5,7 +5,7 @@ image: og/docs/integrations/provider_integrations_google.jpg # tags: ['model providers', 'google', 'embeddings'] --- -# Google AI Multimodal Embeddings with Weaviate +# Google Multimodal Embeddings with Weaviate import Tabs from '@theme/Tabs'; @@ -22,9 +22,9 @@ Weaviate's integration with [Google Vertex AI](https://cloud.google.com/vertex-a Multimodal embeddings are currently not available to Google AI Studio users. ::: -[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Google AI embedding model, and Weaviate will generate embeddings for various operations using the specified model and your Google AI API key. This feature is called the *vectorizer*. +[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Google embedding model, and Weaviate will generate embeddings for various operations using the specified model and your Google API key. This feature is called the *vectorizer*. -At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. +At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. [Multimodal search operations](#vector-near-media-search) are also supported. ![Embedding integration illustration](../_includes/integration_google_embedding.png) @@ -32,7 +32,7 @@ At [import time](#data-import), Weaviate generates multimodal object embeddings ### Weaviate configuration -Your Weaviate instance must be configured with the Google AI vectorizer integration (`multi2vec-google`) module. +Your Weaviate instance must be configured with the Google multimodal vectorizer integration (`multi2vec-google`) module. :::info Module name change `multi2vec-google` was called `multi2vec-palm` in Weaviate versions prior to `v1.27`. @@ -115,7 +115,7 @@ import ApiKeyNote from '../_includes/google-api-key-note.md'; ## Configure the vectorizer -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Google AI embedding model: +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Google embedding model: @@ -153,7 +153,7 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; ### Vectorizer parameters -The following examples show how to configure Google AI-specific options. +The following examples show how to configure Google-specific options. - `location` (Required): e.g. `"us-central1"` - `projectId` (Only required if using Vertex AI): e.g. `cloud-large-language-models` @@ -214,7 +214,7 @@ If you already have a compatible model vector available, you can provide it dire ## Searches -Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified Google AI model. +Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified Google model. ![Embedding integration at search illustration](../_includes/integration_google_embedding_search.png) @@ -318,7 +318,8 @@ The query below returns the `n` most similar objects to the input image from the ### Other integrations -- [Google AI generative models + Weaviate](./generative.md). +- [Google text embedding models + Weaviate](./embeddings.md) +- [Google AI generative models + Weaviate](./generative.md) ### Code examples diff --git a/developers/weaviate/model-providers/google/embeddings.md b/developers/weaviate/model-providers/google/embeddings.md index 67993027ff..b238fe8f8f 100644 --- a/developers/weaviate/model-providers/google/embeddings.md +++ b/developers/weaviate/model-providers/google/embeddings.md @@ -1,11 +1,12 @@ --- title: Text Embeddings +description: "Weaviate's integration with Google AI Studio and Google Vertex AI APIs allows you to access their models' capabilities directly from Weaviate." sidebar_position: 20 image: og/docs/integrations/provider_integrations_google.jpg # tags: ['model providers', 'google', 'embeddings'] --- -# Google AI Text Embeddings with Weaviate +# Google Text Embeddings with Weaviate import Tabs from '@theme/Tabs'; @@ -13,12 +14,14 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with [Google AI Studio](https://ai.google.dev/?utm_source=weaviate&utm_medium=referral&utm_campaign=partnerships&utm_content=) and [Google Vertex AI](https://cloud.google.com/vertex-ai) APIs allows you to access their models' capabilities directly from Weaviate. -[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Google AI embedding model, and Weaviate will generate embeddings for various operations using the specified model and your Google AI API key. This feature is called the *vectorizer*. +[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Google embedding model, and Weaviate will generate embeddings for various operations using the specified model and your Google API key. This feature is called the *vectorizer*. At [import time](#data-import), Weaviate generates text object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts text queries into embeddings. @@ -32,7 +35,7 @@ At the time of writing (November 2023), AI Studio is not available in all region ### Weaviate configuration -Your Weaviate instance must be configured with the Google AI vectorizer integration (`text2vec-google`) module. +Your Weaviate instance must be configured with the Google vectorizer integration (`text2vec-google`) module. :::info Module name change `text2vec-google` was called `text2vec-palm` in Weaviate versions prior to `v1.27`. @@ -113,11 +116,20 @@ import ApiKeyNote from '../_includes/google-api-key-note.md'; /> + + + + ## Configure the vectorizer -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Google AI embedding model: +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Google embedding model: Note that the required parameters differ between Vertex AI and AI Studio. @@ -146,6 +158,15 @@ Vertex AI users must provide the Google Cloud project ID in the vectorizer confi /> + + + + ### AI Studio @@ -169,6 +190,15 @@ Vertex AI users must provide the Google Cloud project ID in the vectorizer confi /> + + + + import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; @@ -182,7 +212,7 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; ### Vectorizer parameters -The following examples show how to configure Google AI-specific options. +The following examples show how to configure Google-specific options. - `projectId` (Only required if using Vertex AI): e.g. `cloud-large-language-models` - `apiEndpoint` (Optional): e.g. `us-central1-aiplatform.googleapis.com` @@ -208,6 +238,15 @@ The following examples show how to configure Google AI-specific options. /> + + + + ## Data import @@ -234,6 +273,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -242,7 +290,7 @@ If you already have a compatible model vector available, you can provide it dire ## Searches -Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified Google AI model. +Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified Google model. ![Embedding integration at search illustration](../_includes/integration_google_embedding_search.png) @@ -272,6 +320,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -304,6 +361,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References @@ -328,7 +394,7 @@ AI Studio: ### Other integrations -- [Google AI generative models + Weaviate](./generative.md). +- [Google generative models + Weaviate](./generative.md). ### Code examples diff --git a/developers/weaviate/model-providers/google/generative.md b/developers/weaviate/model-providers/google/generative.md index a3742bb702..ee4c4a78c5 100644 --- a/developers/weaviate/model-providers/google/generative.md +++ b/developers/weaviate/model-providers/google/generative.md @@ -1,11 +1,12 @@ --- title: Generative AI +description: Google Generative Model Provider sidebar_position: 50 image: og/docs/integrations/provider_integrations_google.jpg # tags: ['model providers', 'google', 'generative', 'rag'] --- -# Google AI Generative AI with Weaviate +# Google Generative AI with Weaviate import Tabs from '@theme/Tabs'; @@ -18,9 +19,9 @@ import TSCode from '!!raw-loader!../_includes/provider.generative.ts'; Weaviate's integration with [Google AI Studio](https://ai.google.dev/?utm_source=weaviate&utm_medium=referral&utm_campaign=partnerships&utm_content=) and [Google Vertex AI](https://cloud.google.com/vertex-ai) APIs allows you to access their models' capabilities directly from Weaviate. -[Configure a Weaviate collection](#configure-collection) to use a Google AI generative AI model, and Weaviate will perform retrieval augmented generation (RAG) using the specified model and your Google AI API key. +[Configure a Weaviate collection](#configure-collection) to use a Google generative AI model, and Weaviate will perform retrieval augmented generation (RAG) using the specified model and your Google API key. -More specifically, Weaviate will perform a search, retrieve the most relevant objects, and then pass them to the Google AI generative model to generate outputs. +More specifically, Weaviate will perform a search, retrieve the most relevant objects, and then pass them to the Google generative model to generate outputs. ![RAG integration illustration](../_includes/integration_google_rag.png) @@ -32,7 +33,7 @@ At the time of writing (November 2023), AI Studio is not available in all region ### Weaviate configuration -Your Weaviate instance must be configured with the Google AI generative AI integration (`generative-google`) module. +Your Weaviate instance must be configured with the Google generative AI integration (`generative-google`) module. :::info Module name change `generative-google` was called `generative-palm` in Weaviate versions prior to `v1.27`. @@ -119,7 +120,11 @@ import ApiKeyNote from '../_includes/google-api-key-note.md'; ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use a Google AI generative AI model as follows: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use a Google generative AI model as follows: Note that the required parameters differ between Vertex AI and AI Studio. @@ -290,7 +295,8 @@ AI Studio: ### Other integrations -- [Google AI embedding models + Weaviate](./embeddings.md). +- [Google text embedding models + Weaviate](./embeddings.md). +- [Google multimodal embedding models + Weaviate](./embeddings-multimodal.md). ### Code examples diff --git a/developers/weaviate/model-providers/google/index.md b/developers/weaviate/model-providers/google/index.md index 3188b9de01..93252cea9a 100644 --- a/developers/weaviate/model-providers/google/index.md +++ b/developers/weaviate/model-providers/google/index.md @@ -1,5 +1,5 @@ --- -title: Google AI + Weaviate +title: Google + Weaviate sidebar_position: 10 image: og/docs/integrations/provider_integrations_google.jpg # tags: ['model providers', 'google'] @@ -7,41 +7,41 @@ image: og/docs/integrations/provider_integrations_google.jpg -Google AI offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with [Google AI Studio](https://ai.google.dev/?utm_source=weaviate&utm_medium=referral&utm_campaign=partnerships&utm_content=) and [Google Vertex AI](https://cloud.google.com/vertex-ai) APIs, allowing users to leverage Google AI's models directly within the Weaviate database. +Google offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with [Google AI Studio](https://ai.google.dev/?utm_source=weaviate&utm_medium=referral&utm_campaign=partnerships&utm_content=) and [Google Vertex AI](https://cloud.google.com/vertex-ai) APIs, allowing users to leverage Google's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. -## Integrations with Google AI +## Integrations with Google ### Embedding models for semantic search ![Embedding integration illustration](../_includes/integration_google_embedding.png) -Google AI's embedding models transform text data into high-dimensional vector representations, capturing semantic meaning and context. +Google's embedding models transform text data into high-dimensional vector representations, capturing semantic meaning and context. -[Weaviate integrates with Google AI's embedding models](./embeddings.md) to enable seamless vectorization of data. This integration allows users to perform semantic and hybrid search operations without the need for additional preprocessing or data transformation steps. +[Weaviate integrates with Google's embedding models](./embeddings.md) to enable seamless vectorization of data. This integration allows users to perform semantic and hybrid search operations without the need for additional preprocessing or data transformation steps. -[Google AI embedding integration page](./embeddings.md) +[Google embedding integration page](./embeddings.md) ### Generative AI models for RAG ![Single prompt RAG integration generates individual outputs per search result](../_includes/integration_google_rag_single.png) -Google AI's generative AI models can generate human-like text based on given prompts and contexts. +Google's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Google AI's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Google's generative AI models to generate personalized and context-aware responses. -[Google AI generative AI integration page](./generative.md) +[Google generative AI integration page](./generative.md) ## Summary -These integrations enable developers to leverage Google AI's powerful models directly within Weaviate. +These integrations enable developers to leverage Google's powerful models directly within Weaviate. In turn, they simplify the process of building AI-driven applications to speed up your development process, so that you can focus on creating innovative solutions. ## Credentials -You must provide a valid Google AI API credentials to Weaviate for these integrations. +You must provide a valid Googles API credentials to Weaviate for these integrations. ### Vertex AI @@ -61,12 +61,6 @@ Go to the relevant integration page to learn how to configure Weaviate with the - [Multimodal Embeddings](./embeddings-multimodal.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/gpt4all/index.md b/developers/weaviate/model-providers/gpt4all/index.md index c58846dec5..5fbc0cae2d 100644 --- a/developers/weaviate/model-providers/gpt4all/index.md +++ b/developers/weaviate/model-providers/gpt4all/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_gpt4all.jpg -The GPT4All library allows you to easily run a wide range of models on your own device. Weaviate seamlessly integrates with the GPT4All library, allowing users to leverage compatible models directly within the Weaviate database. +The GPT4All library allows you to easily run a wide range of models on your own device. Weaviate seamlessly integrates with the GPT4All library, allowing users to leverage compatible models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -39,12 +39,6 @@ Go to the relevant integration page to learn how to configure Weaviate with the - [Text Embeddings](./embeddings.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/huggingface/embeddings.md b/developers/weaviate/model-providers/huggingface/embeddings.md index de2cb7014a..a339686051 100644 --- a/developers/weaviate/model-providers/huggingface/embeddings.md +++ b/developers/weaviate/model-providers/huggingface/embeddings.md @@ -13,8 +13,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with Hugging Face's APIs allows you to access their models' capabilities directly from Weaviate. @@ -74,6 +76,14 @@ Provide the API key to Weaviate using one of the following methods: /> + + + ## Configure the vectorizer @@ -99,6 +109,14 @@ Provide the API key to Weaviate using one of the following methods: /> + + + You must specify one of the [available models](#available-models) for the vectorizer to use. @@ -116,6 +134,36 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; The following examples show how to configure Hugging Face-specific options. + + + + + + + + + + + + + + + #### Model selection parameters Only select one of the following parameters to specify the model: @@ -130,6 +178,12 @@ The `passageModel` and `queryModel` parameters are used together to specify a [D The `endpointURL` parameter is used to specify a [custom Hugging Face Inference Endpoint](https://huggingface.co/inference-endpoints). This parameter overrides the `model`, `passageModel`, and `queryModel` parameters. ::: +#### Additional parameters + +- `options.waitForModel`: If the model is not ready, wait for it rather than returning a `503` error. +- `options.useGPU`: Use a GPU for inference if your [account plan](https://huggingface.co/inference-api#pricing) supports it. +- `options.useCache`: Use a cached result if available. (For non-deterministic models to prevent the caching mechanism from being used.) + ## Data import After configuring the vectorizer, [import data](../../manage-data/import.mdx) into Weaviate. Weaviate generates embeddings for text objects using the specified model. @@ -154,6 +208,14 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + :::tip Re-use existing vectors @@ -192,6 +254,14 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + ### Hybrid search @@ -224,37 +294,18 @@ The query below returns the `n` best scoring objects from the database, set by ` /> - - -## References - -#### Other Parameters - -- `options.waitForModel`: If the model is not ready, wait for it rather than returning a `503` error. -- `options.useGPU`: Use a GPU for inference if your [account plan](https://huggingface.co/inference-api#pricing) supports it. -- `options.useCache`: Use a cached result if available. (For non-deterministic models to prevent the caching mechanism from being used.) - - - - - - - + - +## References + ### Available models You can use any Hugging Face embedding model with `text2vec-huggingface`, including public and private Hugging Face models. [Sentence similarity models](https://huggingface.co/models?pipeline_tag=sentence-similarity&sort=downloads) generally work best. diff --git a/developers/weaviate/model-providers/huggingface/index.md b/developers/weaviate/model-providers/huggingface/index.md index a9c220027f..8c420debbd 100644 --- a/developers/weaviate/model-providers/huggingface/index.md +++ b/developers/weaviate/model-providers/huggingface/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_huggingface.jpg -Hugging Face offers a wide range of models for natural language processing. Weaviate seamlessly integrates with Hugging Face's Inference API, allowing users to leverage Hugging Face Hub's models directly within the Weaviate database. +Hugging Face offers a wide range of models for natural language processing. Weaviate seamlessly integrates with Hugging Face's Inference API, allowing users to leverage Hugging Face Hub's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -37,12 +37,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/imagebind/embeddings-multimodal.md b/developers/weaviate/model-providers/imagebind/embeddings-multimodal.md index 1d32725c87..85bad7badb 100644 --- a/developers/weaviate/model-providers/imagebind/embeddings-multimodal.md +++ b/developers/weaviate/model-providers/imagebind/embeddings-multimodal.md @@ -20,7 +20,7 @@ Weaviate's integration with the Meta ImageBind library allows you to access its [Configure a Weaviate vector index](#configure-the-vectorizer) to use the ImageBind integration, and [configure the Weaviate instance](#weaviate-configuration) with a model image, and Weaviate will generate embeddings for various operations using the specified model in the ImageBind inference container. This feature is called the *vectorizer*. -At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. +At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. [Multimodal search operations](#vector-near-media-search) are also supported. ![Embedding integration illustration](../_includes/integration_imagebind_embedding.png) @@ -28,7 +28,7 @@ At [import time](#data-import), Weaviate generates multimodal object embeddings ### Weaviate configuration -Your Weaviate instance must be configured with the ImageBind vectorizer integration (`multi2vec-bind`) module. +Your Weaviate instance must be configured with the ImageBind multimodal vectorizer integration (`multi2vec-bind`) module.
For Weaviate Cloud (WCD) users diff --git a/developers/weaviate/model-providers/imagebind/index.md b/developers/weaviate/model-providers/imagebind/index.md index e62c2dd29b..b028005a8f 100644 --- a/developers/weaviate/model-providers/imagebind/index.md +++ b/developers/weaviate/model-providers/imagebind/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_imagebind.jpg -Meta's ImageBind library can be used with a wide range of models for natural language processing. Weaviate seamlessly integrates with the ImageBind library, allowing users to leverage compatible models directly within the Weaviate database. +Meta's ImageBind library can be used with a wide range of models for natural language processing. Weaviate seamlessly integrates with the ImageBind library, allowing users to leverage compatible models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -39,12 +39,6 @@ Go to the relevant integration page to learn how to configure Weaviate with the - [Multimodal Embeddings](./embeddings-multimodal.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/index.md b/developers/weaviate/model-providers/index.md index fff1243768..8d2f0d0b09 100644 --- a/developers/weaviate/model-providers/index.md +++ b/developers/weaviate/model-providers/index.md @@ -20,17 +20,18 @@ This enables an enhanced developed experience, such as the ability to: | [Anthropic](./anthropic/index.md) | - | [Text](./anthropic/generative.md) | - | | [Anyscale](./anyscale/index.md) | - | [Text](./anyscale/generative.md) | - | | [AWS](./aws/index.md) | [Text](./aws/embeddings.md) | [Text](./aws/generative.md) | -| [Cohere](./cohere/index.md) | [Text](./cohere/embeddings.md) | [Text](./cohere/generative.md) | [Reranker](./cohere/reranker.md) | +| [Cohere](./cohere/index.md) | [Text](./cohere/embeddings.md), [Multimodal](./cohere/embeddings-multimodal.md) | [Text](./cohere/generative.md) | [Reranker](./cohere/reranker.md) | | [Databricks](./databricks/index.md) | [Text](./databricks/embeddings.md) | [Text](./databricks/generative.md) | - | | [FriendliAI](./friendliai/index.md) | - | [Text](./friendliai/generative.md) | - | | [Google](./google/index.md) | [Text](./google/embeddings.md), [Multimodal](./google/embeddings-multimodal.md) | [Text](./google/generative.md) | - | | [Hugging Face](./huggingface/index.md) | [Text](./huggingface/embeddings.md) | - | - | -| [Jina AI](./jinaai/index.md) | [Text](./jinaai/embeddings.md) | - | - | +| [Jina AI](./jinaai/index.md) | [Text](./jinaai/embeddings.md), [Multimodal](./jinaai/embeddings-multimodal.md) | - | [Reranker](./jinaai/reranker.md) | | [Mistral](./mistral/index.md) | [Text](./mistral/embeddings.md) | [Text](./mistral/generative.md) | - | -| [OctoAI](./octoai/index.md) | [Text](./octoai/embeddings.md) | [Text](./octoai/generative.md) | - | +| [OctoAI (Deprecated)](./octoai/index.md) | [Text](./octoai/embeddings.md) | [Text](./octoai/generative.md) | - | | [OpenAI](./openai/index.md) | [Text](./openai/embeddings.md) | [Text](./openai/generative.md) | - | | [Azure OpenAI](./openai-azure/index.md) | [Text](./openai-azure/embeddings.md) | [Text](./openai-azure/generative.md) | - | -| [Voyage AI](./voyageai/index.md) | [Text](./voyageai/embeddings.md) | - | [Reranker](./voyageai/reranker.md) | +| [Voyage AI](./voyageai/index.md) | [Text](./voyageai/embeddings.md), [Multimodal](./voyageai/embeddings-multimodal.md) | - | [Reranker](./voyageai/reranker.md) | +| [Weaviate](./weaviate/index.md) | [Text](./weaviate/embeddings.md) | - | - | #### Enable all API-based modules @@ -59,6 +60,56 @@ When a model provider integration for embeddings is enabled, Weaviate automatica This is done by providing the source data to the integration provider, which then returns the embeddings to Weaviate. The embeddings are then stored in the Weaviate database. +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'primaryColor': '#4a5568', + 'primaryTextColor': '#2d3748', + 'primaryBorderColor': '#718096', + 'lineColor': '#718096', + 'secondaryColor': '#f7fafc', + 'tertiaryColor': '#edf2f7' + } +}}%% + +flowchart LR + %% Style definitions + classDef systemBox fill:#f7fafc,stroke:#3182ce,stroke-width:2px,color:#2d3748,padding:10px + classDef weaviateBox fill:#f7fafc,stroke:#2d3748,stroke-width:2px,color:#2d3748,padding:10px + classDef providerBox fill:#f7fafc,stroke:#48bb78,stroke-width:2px,color:#2d3748,padding:10px + classDef component fill:white,stroke:#718096,stroke-width:1.5px,color:#2d3748,rx:6 + + %% Model Provider section (leftmost) + subgraph provider["Model Provider"] + inference["🤖 Inference API /\nLocal Model"] + end + + %% Weaviate section (middle) + subgraph weaviate["Weaviate"] + vectorizer["🔌 Model Provider\nIntegration"] + core["⚡️ Data & vector store"] + end + + %% User System (bottom) + subgraph user["User System"] + data["📄 Data"] + end + + %% Connections + data -->|"1. Insert objects"| core + core -->|"2. Request vector"| vectorizer + vectorizer -->|"3. Request vector"| inference + inference -->|"4. Vector"| vectorizer + vectorizer -->|"5. Vector"| core + + %% Apply styles + class user systemBox + class weaviate weaviateBox + class provider providerBox + class data,core,vectorizer,inference component +``` + Weaviate generates embeddings for objects as follows: - Selects properties with `text` or `text[]` data types unless they are configured to be skipped @@ -72,12 +123,6 @@ If you prefer the text to be lowercased, you can do so by setting the `LOWERCASE The text is always lowercased for the `text2vec-contextionary` integration. ::: -## Further resources - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/jinaai/embeddings-multimodal.md b/developers/weaviate/model-providers/jinaai/embeddings-multimodal.md new file mode 100644 index 0000000000..0261179354 --- /dev/null +++ b/developers/weaviate/model-providers/jinaai/embeddings-multimodal.md @@ -0,0 +1,331 @@ +--- +title: Multimodal Embeddings +sidebar_position: 25 +image: og/docs/integrations/provider_integrations_jinaai.jpg +# tags: ['model providers', 'jinaai', 'embeddings'] +--- + +# Jina AI Multimodal Embeddings with Weaviate + +:::info Added in `1.25.26`, `1.26.11` and `v1.27.5` +::: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; +import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; +import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; + +Weaviate's integration with Jina AI's APIs allows you to access their models' capabilities directly from Weaviate. + +[Configure a Weaviate vector index](#configure-the-vectorizer) to use an Jina AI embedding model, and Weaviate will generate embeddings for various operations using the specified model and your Jina AI API key. This feature is called the *vectorizer*. + +At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. [Multimodal search operations](#vector-near-media-search) are also supported. + +![Embedding integration illustration](../_includes/integration_jinaai_embedding.png) + +## Requirements + +### Weaviate configuration + +Your Weaviate instance must be configured with the Jina AI multimodal vectorizer integration (`multi2vec-jinaai`) module. + +
+ For Weaviate Cloud (WCD) users + +This integration is enabled by default on Weaviate Cloud (WCD) serverless instances. + +
+ +
+ For self-hosted users + +- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. + +
+ +### API credentials + +You must provide a valid Jina AI API key to Weaviate for this integration. Go to [Jina AI](https://jina.ai/embeddings/) to sign up and obtain an API key. + +Provide the API key to Weaviate using one of the following methods: + +- Set the `JINAAI_APIKEY` environment variable that is available to Weaviate. +- Provide the API key at runtime, as shown in the examples below. + + + + + + + + + + + + + +## Configure the vectorizer + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Jina AI embedding model: + + + + + + + + + + + + +### Select a model + +You can specify one of the [available models](#available-models) for the vectorizer to use, as shown in the following configuration example. + + + + + + + + + + + + +You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. + +import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; + +
+ Vectorization behavior + + + +
+ +### Vectorizer parameters + +The following examples show how to configure Jina AI-specific options. + + + + + + + + + + + + +### Vectorizer parameters + +- `model`: The model name. +- `dimensions`: The number of dimensions for the model. + - Note that [not all models](#available-models) support this parameter. + +## Data import + +After configuring the vectorizer, [import data](../../manage-data/import.mdx) into Weaviate. Weaviate generates embeddings for text objects using the specified model. + + + + + + + + + + + + + +:::tip Re-use existing vectors +If you already have a compatible model vector available, you can provide it directly to Weaviate. This can be useful if you have already generated embeddings using the same model and want to use them in Weaviate, such as when migrating data from another system. +::: + +## Searches + +Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified Jina AI model. + +![Embedding integration at search illustration](../_includes/integration_jinaai_embedding_search.png) + +### Vector (near text) search + +When you perform a [vector search](../../search/similarity.md#search-with-text), Weaviate converts the text query into an embedding using the specified model and returns the most similar objects from the database. + +The query below returns the `n` most similar objects from the database, set by `limit`. + + + + + + + + + + + + + +### Hybrid search + +:::info What is a hybrid search? +A hybrid search performs a vector search and a keyword (BM25) search, before [combining the results](../../search/hybrid.md#change-the-ranking-method) to return the best matching objects from the database. +::: + +When you perform a [hybrid search](../../search/hybrid.md), Weaviate converts the text query into an embedding using the specified model and returns the best scoring objects from the database. + +The query below returns the `n` best scoring objects from the database, set by `limit`. + + + + + + + + + + + + + +### Vector (near media) search + +When you perform a media search such as a [near image search](../../search/similarity.md#search-with-image), Weaviate converts the query into an embedding using the specified model and returns the most similar objects from the database. + +To perform a near media search such as near image search, convert the media query into a base64 string and pass it to the search query. + +The query below returns the `n` most similar objects to the input image from the database, set by `limit`. + + + + + + + + + + + + + +## References + +### Available models + +- `jina-clip-v2` + - This model is a multilingual, multimodal model using [Matryoshka Representation Learning](https://arxiv.org/abs/2205.13147). + - It will accept a `dimensions` parameter, which can be any integer between (and including) 64 and 1024. The default value is 1024. +- `jina-clip-v1` + - This model will always return a 768-dimensional embedding. + +## Further resources + +### Other integrations + +- [Jina AI text embedding models + Weaviate](./embeddings.md). +- [Jina AI reranker models + Weaviate](./reranker.md). + +### Code examples + +Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples: + +- The [how-to: manage data](../../manage-data/index.md) guides show how to perform data operations (i.e. create, update, delete). +- The [how-to: search](../../search/index.md) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation. + +### External resources + +- Jina AI [Embeddings API documentation](https://jina.ai/embeddings/) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/model-providers/jinaai/embeddings.md b/developers/weaviate/model-providers/jinaai/embeddings.md index c12cbe7f70..dc7ffb6484 100644 --- a/developers/weaviate/model-providers/jinaai/embeddings.md +++ b/developers/weaviate/model-providers/jinaai/embeddings.md @@ -13,8 +13,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with Jina AI's APIs allows you to access their models' capabilities directly from Weaviate. @@ -74,6 +76,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ## Configure the vectorizer @@ -99,6 +110,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ### Select a model @@ -124,6 +144,15 @@ You can specify one of the [available models](#available-models) for the vectori /> + + + + You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. @@ -141,7 +170,7 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; The following examples show how to configure Jina AI-specific options. -Note that `dimensions` is only used for the `jina-embeddings-v3` model. +Note that `dimensions` is not applicable for the `jina-embeddings-v2` models. @@ -162,6 +191,15 @@ Note that `dimensions` is only used for the `jina-embeddings-v3` model. /> + + + + ## Data import @@ -188,6 +226,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -226,6 +273,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -258,6 +314,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References @@ -270,8 +335,15 @@ The query below returns the `n` best scoring objects from the database, set by ` - `jina-embeddings-v2-base-en` (Default) - `jina-embeddings-v2-small-en` +Note that `dimensions` is not applicable for the `jina-embeddings-v2` models. + ## Further resources +### Other integrations + +- [Jina AI multimodal embedding models + Weaviate](./embeddings-multimodal.md) +- [Jina AI reranker models + Weaviate](./reranker.md) + ### Code examples Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples: diff --git a/developers/weaviate/model-providers/jinaai/index.md b/developers/weaviate/model-providers/jinaai/index.md index 35f2b27f6b..89f9a53fa9 100644 --- a/developers/weaviate/model-providers/jinaai/index.md +++ b/developers/weaviate/model-providers/jinaai/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_jinaai.jpg -Jina AI offers a wide range of models for natural language processing. Weaviate seamlessly integrates with Jina AI's APIs, allowing users to leverage Jina AI's models directly within the Weaviate database. +Jina AI offers a wide range of models for natural language processing. Weaviate seamlessly integrates with Jina AI's APIs, allowing users to leverage Jina AI's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -37,12 +37,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/jinaai/reranker.md b/developers/weaviate/model-providers/jinaai/reranker.md new file mode 100644 index 0000000000..e007219cac --- /dev/null +++ b/developers/weaviate/model-providers/jinaai/reranker.md @@ -0,0 +1,201 @@ +--- +title: Reranker +sidebar_position: 70 +image: og/docs/integrations/provider_integrations_jinaai.jpg +# tags: ['model providers', 'jinaai', 'reranking'] +--- + +# Jina AI Reranker Models with Weaviate + +:::info Added in `v1.26.1` +::: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; +import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import PyCode from '!!raw-loader!../_includes/provider.reranker.py'; +import TSCode from '!!raw-loader!../_includes/provider.reranker.ts'; + +Weaviate's integration with Jina AI's APIs allows you to access their models' capabilities directly from Weaviate. + +[Configure a Weaviate collection](#configure-the-reranker) to use a Jina AI reranker model, and Weaviate will use the specified model and your Jina AI API key to rerank search results. + +This two-step process involves Weaviate first performing a search and then reranking the results using the specified model. + +![Reranker integration illustration](../_includes/integration_jinaai_reranker.png) + +## Requirements + +### Weaviate configuration + +Your Weaviate instance must be configured with the JinaAI reranker integration (`reranker-jinaai`) module. + +
+ For Weaviate Cloud (WCD) users + +This integration is enabled by default on Weaviate Cloud (WCD) serverless instances. + +
+ +
+ For self-hosted users + +- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. + +
+ +### API credentials + +You must provide a valid JinaAI API key to Weaviate for this integration. Go to [Jina AI](https://jina.ai/embeddings/) to sign up and obtain an API key. + +Provide the API key to Weaviate using one of the following methods: + +- Set the `JINAAI_APIKEY` environment variable that is available to Weaviate. +- Provide the API key at runtime, as shown in the examples below. + + + + + + + + + + + + + +## Configure the reranker + +import MutableRerankerConfig from '/_includes/mutable-reranker-config.md'; + + + +Configure a Weaviate collection to use a Jina AI reranker model as follows: + + + + + + + + + + + + +### Select a model + +You can specify one of the [available models](#available-models) for Weaviate to use, as shown in the following configuration example: + + + + + + + + + + + + +The [default model](#available-models) is used if no model is specified. + +## Reranking query + +Once the reranker is configured, Weaviate performs [reranking operations](../../search/rerank.md) using the specified Jina AI model. + +More specifically, Weaviate performs an initial search, then reranks the results using the specified model. + +Any search in Weaviate can be combined with a reranker to perform reranking operations. + +![Reranker integration illustration](../_includes/integration_jinaai_reranker.png) + + + + + + + + + + + + + +## References + +### Available models + +- `jina-reranker-v2-base-multilingual` (default) +- `jina-reranker-v1-base-en` +- `jina-reranker-v1-turbo-en` +- `jina-reranker-v1-tiny-en` +- `jina-colbert-v1-en` + +## Further resources + +### Other integrations + +- [Jina AI text embedding models + Weaviate](./embeddings.md) +- [Jina AI multimodal embedding models + Weaviate](./embeddings-multimodal.md) + +### Code examples + +Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples: + +- The [how-to: manage data](../../manage-data/index.md) guides show how to perform data operations (i.e. create, update, delete). +- The [how-to: search](../../search/index.md) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation. + +### References + +- Jina AI [Reranker documentation](https://jina.ai/reranker/) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/model-providers/kubeai/embeddings.md b/developers/weaviate/model-providers/kubeai/embeddings.md index d355bef69d..1f1a812db4 100644 --- a/developers/weaviate/model-providers/kubeai/embeddings.md +++ b/developers/weaviate/model-providers/kubeai/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: Implement KubeAI embeddings in Weaviate to enrich data with contextual vectors. sidebar_position: 20 image: og/docs/integrations/provider_integrations_kubeai.jpg # tags: ['model providers', 'openai', 'embeddings'] diff --git a/developers/weaviate/model-providers/kubeai/generative.md b/developers/weaviate/model-providers/kubeai/generative.md index 84e5b95d73..f6688f46ca 100644 --- a/developers/weaviate/model-providers/kubeai/generative.md +++ b/developers/weaviate/model-providers/kubeai/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: Set up generative models with KubeAI in Weaviate for creative data outputs. sidebar_position: 50 image: og/docs/integrations/provider_integrations_kubeai.jpg # tags: ['model providers', 'openai', 'generative', 'rag'] diff --git a/developers/weaviate/model-providers/kubeai/index.md b/developers/weaviate/model-providers/kubeai/index.md index 1e1f44f1ab..c95c84a582 100644 --- a/developers/weaviate/model-providers/kubeai/index.md +++ b/developers/weaviate/model-providers/kubeai/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_kubeai.jpg -[KubeAI](https://github.com/substratusai/kubeai) provides offers a wide range of models for natural language processing and generation through OpenAI-style API endpoints. Weaviate seamlessly integrates with KubeAI's APIs, allowing users to leverage any KubeAI models directly within the Weaviate database. +[KubeAI](https://github.com/substratusai/kubeai) provides offers a wide range of models for natural language processing and generation through OpenAI-style API endpoints. Weaviate seamlessly integrates with KubeAI's APIs, allowing users to leverage any KubeAI models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -29,7 +29,7 @@ KubeAI's embedding models transform text data into high-dimensional vector repre KubeAI's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with KubeAI's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with KubeAI's generative AI models to generate personalized and context-aware responses. [KubeAI generative AI integration page](./generative.md) @@ -48,12 +48,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/mistral/embeddings.md b/developers/weaviate/model-providers/mistral/embeddings.md index 2cbef69b72..a7e6974271 100644 --- a/developers/weaviate/model-providers/mistral/embeddings.md +++ b/developers/weaviate/model-providers/mistral/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: Use Mistral embeddings with Weaviate for high-quality vector search results. sidebar_position: 20 image: og/docs/integrations/provider_integrations_mistral.jpg # tags: ['model providers', 'mistral', 'embeddings'] @@ -12,8 +13,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with Mistral's APIs allows you to access their models' capabilities directly from Weaviate. @@ -73,6 +76,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ## Configure the vectorizer @@ -98,6 +110,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ### Select a model @@ -123,6 +144,15 @@ You can specify one of the [available models](#available-models) for the vectori /> + + + + The [default model](#available-models) is used if no model is specified. @@ -160,6 +190,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -198,6 +237,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -230,6 +278,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References diff --git a/developers/weaviate/model-providers/mistral/generative.md b/developers/weaviate/model-providers/mistral/generative.md index ba55b33dbb..c28e604063 100644 --- a/developers/weaviate/model-providers/mistral/generative.md +++ b/developers/weaviate/model-providers/mistral/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: "Weaviate's integration with Mistral's APIs allows you to access their models' capabilities directly from Weaviate." sidebar_position: 50 image: og/docs/integrations/provider_integrations_mistral.jpg # tags: ['model providers', 'mistral', 'generative', 'rag'] @@ -78,7 +79,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use a Mistral generative model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use a Mistral generative model: diff --git a/developers/weaviate/model-providers/mistral/index.md b/developers/weaviate/model-providers/mistral/index.md index 219277d676..4b99b2ac73 100644 --- a/developers/weaviate/model-providers/mistral/index.md +++ b/developers/weaviate/model-providers/mistral/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_mistral.jpg -Mistral offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Mistral's APIs, allowing users to leverage Mistral's models directly within the Weaviate database. +Mistral offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with Mistral's APIs, allowing users to leverage Mistral's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -29,7 +29,7 @@ Mistral's embedding models transform text data into high-dimensional vector repr Mistral's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Mistral's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Mistral's generative AI models to generate personalized and context-aware responses. [Mistral generative AI integration page](./generative.md) @@ -48,12 +48,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/octoai/_category_.json b/developers/weaviate/model-providers/octoai/_category_.json index d812db4d45..42d4b1b3a7 100644 --- a/developers/weaviate/model-providers/octoai/_category_.json +++ b/developers/weaviate/model-providers/octoai/_category_.json @@ -1,4 +1,4 @@ { - "label": "OctoAI", + "label": "OctoAI (Deprecated)", "position": 247 } diff --git a/developers/weaviate/model-providers/octoai/_includes/octoai_deprecation.md b/developers/weaviate/model-providers/octoai/_includes/octoai_deprecation.md new file mode 100644 index 0000000000..8a2f235a7f --- /dev/null +++ b/developers/weaviate/model-providers/octoai/_includes/octoai_deprecation.md @@ -0,0 +1,70 @@ +:::warning Deprecated integrations + +### OctoAI integrations are deprecated + + + +OctoAI announced that they are winding down the commercial availability of its services by **31 October 2024**. Accordingly, the Weaviate OctoAI integrations are deprecated. Do not use these integrations for new projects. +
+ +If you have a collection that is using an OctoAI integration, consider your options depending on whether you are using OctoAI's embedding models ([your options](#for-collections-with-octoai-embedding-integrations)) or generative models ([your options](#for-collections-with-octoai-generative-ai-integrations)). + +#### For collections with OctoAI embedding integrations + +OctoAI provided `thenlper/gte-large` as the embedding model. This model is also available through the [Hugging Face API](../../huggingface/embeddings.md). + +
+ +After the shutdown date, this model will no longer be available through OctoAI. If you are using this integration, you have the following options: +
+ +**Option 1: Use the existing collection, and provide your own vectors** +
+ +You can continue to use the existing collection, provided that you rely on some other method to generate the required embeddings yourself for any new data, and for queries. If you are unfamiliar with the "bring your own vectors" approach, [refer to this starter guide](../../../starter-guides/custom-vectors.mdx). +
+ +**Option 2: Migrate to a new collection with another model provider** + +Alternatively, you can migrate your data to a new collection ([read how](#how-to-migrate)). At this point, you can re-use the existing embeddings or choose a new model. +
+ +- **Re-using the existing embeddings** will save on time and inference costs. +- **Choosing a new model** will allow you to explore new models and potentially improve the performance of your application. + +If you would like to re-use the existing embeddings, you must select a model provider (e.g. [Hugging Face API](../../huggingface/embeddings.md)) that offers the same embedding model. +
+ +You can also select a new model with any embedding model provider. This will require you to re-generate the embeddings for your data, as the existing embeddings will not be compatible with the new model. +
+ +#### For collections with OctoAI generative AI integrations + +If you are only using the generative AI integration, you do not need to migrate your data to a new collection. +
+ +Follow [this how-to](/developers/weaviate/manage-data/collections#update-the-generative-model-integration) to re-configure your collection with a new generative AI model provider. Note this requires Weaviate `v1.25.23`, `v1.26.8`, `v1.27.1`, or later. +
+ +You can select any model provider that offers generative AI models. +
+ +If you would like to continue to use the same model that you used with OctoAI, providers such as [Anyscale](../../anyscale/generative.md), [FriendliAI](../../friendliai/generative.md), [Mistral](../../mistral/generative.md) or local models with [Ollama](../../ollama/generative.md) each offer some of the suite of models that OctoAI provided. +
+ +#### How to migrate + +An outline of the migration process is as follows: +
+ +- Create a new collection with the desired model provider integration(s). +- Export the data from the existing collection. + - (Optional) To re-use the existing embeddings, export the data with the existing embeddings. +- Import the data into the new collection. + - (Optional) To re-use the existing embeddings, import the data with the existing embeddings. +- Update your application to use the new collection. +
+ +See [How-to manage data: migrate data](../../../manage-data/migrate.mdx) for examples on migrating data objects between collections. + +::: diff --git a/developers/weaviate/model-providers/octoai/embeddings.md b/developers/weaviate/model-providers/octoai/embeddings.md index 62ec0f66a7..24a88833f7 100644 --- a/developers/weaviate/model-providers/octoai/embeddings.md +++ b/developers/weaviate/model-providers/octoai/embeddings.md @@ -1,12 +1,15 @@ --- -title: Text Embeddings +title: Text Embeddings (Deprecated) sidebar_position: 20 image: og/docs/integrations/provider_integrations_octoai.jpg # tags: ['model providers', 'octoai', 'embeddings'] --- -# OctoAI Embeddings with Weaviate +import OctoAIDeprecationNote from './_includes/octoai_deprecation.md'; + + +# OctoAI Embeddings with Weaviate :::info Added in `v1.25.0` ::: diff --git a/developers/weaviate/model-providers/octoai/generative.md b/developers/weaviate/model-providers/octoai/generative.md index aa6a0398b4..8da577a935 100644 --- a/developers/weaviate/model-providers/octoai/generative.md +++ b/developers/weaviate/model-providers/octoai/generative.md @@ -1,10 +1,14 @@ --- -title: Generative AI +title: Generative AI (Deprecated) sidebar_position: 50 image: og/docs/integrations/provider_integrations_octoai.jpg # tags: ['model providers', 'octoai', 'generative', 'rag'] --- +import OctoAIDeprecationNote from './_includes/octoai_deprecation.md'; + + + # OctoAI Generative AI with Weaviate @@ -81,7 +85,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an OctoAI generative AI model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an OctoAI generative AI model: diff --git a/developers/weaviate/model-providers/octoai/index.md b/developers/weaviate/model-providers/octoai/index.md index d73eea526b..e58e7574e2 100644 --- a/developers/weaviate/model-providers/octoai/index.md +++ b/developers/weaviate/model-providers/octoai/index.md @@ -1,5 +1,5 @@ --- -title: OctoAI + Weaviate +title: OctoAI + Weaviate (Deprecated) sidebar_position: 10 image: og/docs/integrations/provider_integrations_octoai.jpg # tags: ['model providers', 'octoai'] @@ -7,10 +7,14 @@ image: og/docs/integrations/provider_integrations_octoai.jpg +import OctoAIDeprecationNote from './_includes/octoai_deprecation.md'; + + + :::info Added in `v1.25.0` ::: -OctoAI offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with OctoAI's APIs, allowing users to leverage OctoAI's models directly within the Weaviate database. +OctoAI offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with OctoAI's APIs, allowing users to leverage OctoAI's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -32,7 +36,7 @@ OctoAI's embedding models transform text data into high-dimensional vector repre OctoAI's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with OctoAI's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with OctoAI's generative AI models to generate personalized and context-aware responses. [OctoAI generative AI integration page](./generative.md) @@ -51,12 +55,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/ollama/embeddings.md b/developers/weaviate/model-providers/ollama/embeddings.md index eb26b41b5d..816afe0aac 100644 --- a/developers/weaviate/model-providers/ollama/embeddings.md +++ b/developers/weaviate/model-providers/ollama/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: Ollama Embedding Provider sidebar_position: 20 image: og/docs/integrations/provider_integrations_ollama.jpg # tags: ['model providers', 'ollama', 'embeddings'] diff --git a/developers/weaviate/model-providers/ollama/generative.md b/developers/weaviate/model-providers/ollama/generative.md index 902ae9deaa..4eae5cf366 100644 --- a/developers/weaviate/model-providers/ollama/generative.md +++ b/developers/weaviate/model-providers/ollama/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: Ollama Generative Model Provider sidebar_position: 50 image: og/docs/integrations/provider_integrations_ollama.jpg # tags: ['model providers', 'ollama', 'generative', 'rag'] @@ -79,7 +80,11 @@ As this integration connects to a local Ollama container, no additional credenti ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an Ollama generative model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an Ollama generative model: diff --git a/developers/weaviate/model-providers/ollama/index.md b/developers/weaviate/model-providers/ollama/index.md index 9865ba0461..2aa4019ec0 100644 --- a/developers/weaviate/model-providers/ollama/index.md +++ b/developers/weaviate/model-providers/ollama/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_ollama.jpg -The Ollama library allows you to easily run a wide range of models on your own device. Weaviate seamlessly integrates with the Ollama library, allowing users to leverage compatible models directly within the Weaviate database. +The Ollama library allows you to easily run a wide range of models on your own device. Weaviate seamlessly integrates with the Ollama library, allowing users to leverage compatible models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -31,7 +31,7 @@ Ollama's embedding models transform text data into high-dimensional vector repre Ollama's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Ollama's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Ollama's generative AI models to generate personalized and context-aware responses. [Ollama generative AI integration page](./generative.md) @@ -50,12 +50,6 @@ Go to the relevant integration page to learn how to configure Weaviate with the - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/openai-azure/embeddings.md b/developers/weaviate/model-providers/openai-azure/embeddings.md index e8ed75e295..5c96019aeb 100644 --- a/developers/weaviate/model-providers/openai-azure/embeddings.md +++ b/developers/weaviate/model-providers/openai-azure/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: "Weaviate's integration with Azure OpenAI's APIs allows you to access their models' capabilities directly from Weaviate." sidebar_position: 20 image: og/docs/integrations/provider_integrations_openai_azure.jpg # tags: ['model providers', 'azure', 'openai', 'embeddings'] @@ -13,8 +14,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with Azure OpenAI's APIs allows you to access their models' capabilities directly from Weaviate. @@ -74,6 +77,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ## Configure the vectorizer @@ -101,6 +113,15 @@ To select the model, specify the Azure resource name. /> + + + + import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; @@ -139,6 +160,15 @@ The following examples show how to configure Azure OpenAI-specific options. />
+ + + +
For further details on these parameters, see consult the [Azure OpenAI API documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/). @@ -167,6 +197,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -205,6 +244,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -237,6 +285,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References diff --git a/developers/weaviate/model-providers/openai-azure/generative.md b/developers/weaviate/model-providers/openai-azure/generative.md index 271961fb96..148b561777 100644 --- a/developers/weaviate/model-providers/openai-azure/generative.md +++ b/developers/weaviate/model-providers/openai-azure/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: OpenAI-Azure Generative Model Provider sidebar_position: 50 image: og/docs/integrations/provider_integrations_openai_azure.jpg # tags: ['model providers', 'azure', 'openai', 'generative', 'rag'] @@ -78,7 +79,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an OpenAI Azure generative model. +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an OpenAI Azure generative model. To select the model, specify the Azure resource name. diff --git a/developers/weaviate/model-providers/openai-azure/index.md b/developers/weaviate/model-providers/openai-azure/index.md index 8e4d3c97f3..d238251c54 100644 --- a/developers/weaviate/model-providers/openai-azure/index.md +++ b/developers/weaviate/model-providers/openai-azure/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_openai_azure.jpg -Microsoft Azure offers a wide range of OpenAI models for natural language processing and generation. Weaviate seamlessly integrates with Microsoft Azure's APIs, allowing users to leverage OpenAI's models directly within the Weaviate database. +Microsoft Azure offers a wide range of OpenAI models for natural language processing and generation. Weaviate seamlessly integrates with Microsoft Azure's APIs, allowing users to leverage OpenAI's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -29,7 +29,7 @@ Azure OpenAI's embedding models transform text data into high-dimensional vector Azure OpenAI's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Azure OpenAI's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with Azure OpenAI's generative AI models to generate personalized and context-aware responses. [Azure OpenAI generative AI integration page](./generative.md) @@ -48,12 +48,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/openai/embeddings.md b/developers/weaviate/model-providers/openai/embeddings.md index 468eb626d5..5012adfb53 100644 --- a/developers/weaviate/model-providers/openai/embeddings.md +++ b/developers/weaviate/model-providers/openai/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: OpenAI Embedding Model Provider sidebar_position: 20 image: og/docs/integrations/provider_integrations_openai.jpg # tags: ['model providers', 'openai', 'embeddings'] @@ -16,8 +17,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; Weaviate's integration with OpenAI's APIs allows you to access their models' capabilities directly from Weaviate. @@ -79,6 +82,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ## Configure the vectorizer @@ -104,6 +116,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ### Select a model @@ -133,6 +154,15 @@ For `v3` models such as `text-embedding-3-large`, provide the model name and opt /> + + + + #### For older model families (e.g. `ada`) @@ -158,6 +188,15 @@ For older models such as `text-embedding-ada-002`, provide the model name (`ada` /> + + + + You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. @@ -208,6 +247,15 @@ The following examples show how to configure OpenAI-specific options. /> + + + + For further details on model parameters, see the [OpenAI API documentation](https://platform.openai.com/docs/api-reference/embeddings). @@ -236,6 +284,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -274,6 +331,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -306,6 +372,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References diff --git a/developers/weaviate/model-providers/openai/generative.md b/developers/weaviate/model-providers/openai/generative.md index ffc589f1c8..7383f7e87b 100644 --- a/developers/weaviate/model-providers/openai/generative.md +++ b/developers/weaviate/model-providers/openai/generative.md @@ -1,5 +1,6 @@ --- title: Generative AI +description: OpenAI Generative Model Provider sidebar_position: 50 image: og/docs/integrations/provider_integrations_openai.jpg # tags: ['model providers', 'openai', 'generative', 'rag'] @@ -83,7 +84,11 @@ Provide the API key to Weaviate using one of the following methods: ## Configure collection -[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-module) as follows to use an OpenAI generative AI model: +import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; + + + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-generative-model-integration) as follows to use an OpenAI generative AI model: @@ -236,6 +241,8 @@ In other words, when you have `n` search results, the generative model generates * [gpt-4](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo) * [gpt-4-1106-preview](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo) * [gpt-4-32k](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo) +* [gpt-4o](https://platform.openai.com/docs/models#gpt-4o) +* [gpt-4o-mini](https://platform.openai.com/docs/models#gpt-4o-mini) (Added in v1.26.7)
Older models diff --git a/developers/weaviate/model-providers/openai/index.md b/developers/weaviate/model-providers/openai/index.md index 4c5376b014..c392ec5ab5 100644 --- a/developers/weaviate/model-providers/openai/index.md +++ b/developers/weaviate/model-providers/openai/index.md @@ -1,5 +1,6 @@ --- title: OpenAI + Weaviate +description: "OpenAI offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with OpenAI's APIs, allowing users to leverage OpenAI's models directly from the Weaviate database." sidebar_position: 10 image: og/docs/integrations/provider_integrations_openai.jpg # tags: ['model providers', 'openai'] @@ -11,7 +12,7 @@ image: og/docs/integrations/provider_integrations_openai.jpg For Azure OpenAI integration docs, see [this page instead](../openai-azure/index.md). ::: -OpenAI offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with OpenAI's APIs, allowing users to leverage OpenAI's models directly within the Weaviate database. +OpenAI offers a wide range of models for natural language processing and generation. Weaviate seamlessly integrates with OpenAI's APIs, allowing users to leverage OpenAI's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -33,7 +34,7 @@ OpenAI's embedding models transform text data into high-dimensional vector repre OpenAI's generative AI models can generate human-like text based on given prompts and contexts. -[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly within the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with OpenAI's generative AI models to generate personalized and context-aware responses. +[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate database. This combines Weaviate's efficient storage and fast retrieval capabilities with OpenAI's generative AI models to generate personalized and context-aware responses. [OpenAI generative AI integration page](./generative.md) @@ -52,12 +53,6 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/transformers/embeddings-custom-image.md b/developers/weaviate/model-providers/transformers/embeddings-custom-image.md index 6e0b5aa541..beab99fab5 100644 --- a/developers/weaviate/model-providers/transformers/embeddings-custom-image.md +++ b/developers/weaviate/model-providers/transformers/embeddings-custom-image.md @@ -1,5 +1,6 @@ --- title: Text Embeddings (custom) +description: Transformers Custom Image Embeddings sidebar_position: 25 image: og/docs/integrations/provider_integrations_transformers.jpg # tags: ['model providers', 'huggingface', 'embeddings', 'transformers'] diff --git a/developers/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md b/developers/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md index 6bee817bdd..ec4dfab29e 100644 --- a/developers/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md +++ b/developers/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md @@ -1,5 +1,6 @@ --- title: Multimodal Embeddings (custom) +description: Transformers Custom Image Multimodal Embeddings sidebar_position: 35 image: og/docs/integrations/provider_integrations_transformers.jpg # tags: ['model providers', 'huggingface', 'embeddings', 'clip'] diff --git a/developers/weaviate/model-providers/transformers/embeddings-multimodal.md b/developers/weaviate/model-providers/transformers/embeddings-multimodal.md index 557ce03bb9..2800b378f9 100644 --- a/developers/weaviate/model-providers/transformers/embeddings-multimodal.md +++ b/developers/weaviate/model-providers/transformers/embeddings-multimodal.md @@ -1,5 +1,6 @@ --- title: Multimodal (CLIP) Embeddings +description: Transformers Multimodal Embeddings sidebar_position: 30 image: og/docs/integrations/provider_integrations_transformers.jpg # tags: ['model providers', 'transformers', 'embeddings'] @@ -20,7 +21,7 @@ Weaviate's integration with the Hugging Face Transformers library allows you to [Configure a Weaviate vector index](#configure-the-vectorizer) to use the CLIP integration, and [configure the Weaviate instance](#weaviate-configuration) with a model image, and Weaviate will generate embeddings for various operations using the specified model in the CLIP inference container. This feature is called the *vectorizer*. -At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. +At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts queries of one or more modalities into embeddings. [Multimodal search operations](#vector-near-media-search) are also supported. ![Embedding integration illustration](../_includes/integration_transformers_embedding.png) @@ -28,7 +29,7 @@ At [import time](#data-import), Weaviate generates multimodal object embeddings ### Weaviate configuration -Your Weaviate instance must be configured with the CLIP vectorizer integration (`multi2vec-clip`) module. +Your Weaviate instance must be configured with the CLIP multimodal vectorizer integration (`multi2vec-clip`) module.
For Weaviate Cloud (WCD) users diff --git a/developers/weaviate/model-providers/transformers/embeddings.md b/developers/weaviate/model-providers/transformers/embeddings.md index 4060176742..1823513c62 100644 --- a/developers/weaviate/model-providers/transformers/embeddings.md +++ b/developers/weaviate/model-providers/transformers/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: "Weaviate's integration with the Hugging Face Transformers library allows you to access their models' capabilities directly from Weaviate." sidebar_position: 20 image: og/docs/integrations/provider_integrations_transformers.jpg # tags: ['model providers', 'huggingface', 'embeddings', 'transformers'] diff --git a/developers/weaviate/model-providers/transformers/index.md b/developers/weaviate/model-providers/transformers/index.md index 6ae4bd2c67..bfdcd22020 100644 --- a/developers/weaviate/model-providers/transformers/index.md +++ b/developers/weaviate/model-providers/transformers/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_transformers.jpg -Hugging Face's Transformers library can be used with a wide range of models for natural language processing. Weaviate seamlessly integrates with the Transformers library, allowing users to leverage compatible models directly within the Weaviate database. +Hugging Face's Transformers library can be used with a wide range of models for natural language processing. Weaviate seamlessly integrates with the Transformers library, allowing users to leverage compatible models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -42,12 +42,6 @@ Go to the relevant integration page to learn how to configure Weaviate with the - [Multimodal Embeddings](./embeddings-multimodal.md) - [Multimodal Embeddings (custom image)](./embeddings-multimodal-custom-image.md) -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/developers/weaviate/model-providers/transformers/reranker.md b/developers/weaviate/model-providers/transformers/reranker.md index fbedb1bb6f..dc57ce4609 100644 --- a/developers/weaviate/model-providers/transformers/reranker.md +++ b/developers/weaviate/model-providers/transformers/reranker.md @@ -1,5 +1,6 @@ --- title: Reranker +description: Enhance search results with the transformers reranker module in Weaviate. sidebar_position: 80 image: og/docs/integrations/provider_integrations_transformers.jpg # tags: ['model providers', 'transformers', 'reranking'] @@ -132,6 +133,10 @@ As this integration runs a local container with the transformers model, no addit ## Configure the reranker +import MutableRerankerConfig from '/_includes/mutable-reranker-config.md'; + + + Configure a Weaviate collection to use a Transformer reranker model as follows: diff --git a/developers/weaviate/model-providers/voyageai/embeddings-multimodal.md b/developers/weaviate/model-providers/voyageai/embeddings-multimodal.md new file mode 100644 index 0000000000..e5f0a58d15 --- /dev/null +++ b/developers/weaviate/model-providers/voyageai/embeddings-multimodal.md @@ -0,0 +1,326 @@ +--- +title: Multimodal Embeddings +description: "Weaviate's integration with VoyageAI's APIs allows you to access their models' capabilities directly from Weaviate." +sidebar_position: 25 +image: og/docs/integrations/provider_integrations_voyageai.jpg +# tags: ['model providers', 'voyageai', 'embeddings'] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; +import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; +import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; + +# VoyageAI Multimodal Embeddings with Weaviate + +:::info Added in `v1.25.28`, `v1.26.12`, `1.27.8` +::: + +Weaviate's integration with VoyageAI's APIs allows you to access their models' capabilities directly from Weaviate. + +[Configure a Weaviate vector index](#configure-the-vectorizer) to use a VoyageAI embedding model, and Weaviate will generate embeddings for various operations using the specified model and your VoyageAI API key. This feature is called the *vectorizer*. + +Note this integration does not support Voyage AI's "interleaving" input mode. For this type of usage, import your own vectors with objects as [shown in this guide](../../starter-guides/custom-vectors.mdx). + +At [import time](#data-import), Weaviate generates multimodal object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts text queries into embeddings. [Multimodal search operations](#vector-near-media-search) are also supported. + +![Embedding integration illustration](../_includes/integration_voyageai_embedding.png) + +## Requirements + +### Weaviate configuration + +Your Weaviate instance must be configured with the VoyageAI vectorizer integration (`multi2vec-voyageai`) module. + +
+ For Weaviate Cloud (WCD) users + +This integration is enabled by default on Weaviate Cloud (WCD) serverless instances. + +
+ +
+ For self-hosted users + +- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. + +
+ +### API credentials + +You must provide a valid VoyageAI API key to Weaviate for this integration. Go to [VoyageAI](https://voyageai.com/) to sign up and obtain an API key. + +Provide the API key to Weaviate using one of the following methods: + +- Set the `VOYAGEAI_APIKEY` environment variable that is available to Weaviate. +- Provide the API key at runtime, as shown in the examples below. + + + + + + + + + + + + + +## Configure the vectorizer + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a VoyageAI embedding model: + + + + + + + + + + + + +### Select a model + +You can specify one of the [available models](#available-models) for the vectorizer to use, as shown in the following configuration example. + + + + + + + + + + + + +You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. + +import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; + +
+ Vectorization behavior + + + +
+ +### Vectorizer parameters + +The following examples show how to configure VoyageAI-specific options. + + + + + + + + + + + + +For further details on model parameters, see the [VoyageAI API documentation](https://docs.voyageai.com/reference/multimodal-embeddings-api). + +## Data import + +After configuring the vectorizer, [import data](../../manage-data/import.mdx) into Weaviate. Weaviate generates embeddings for text objects using the specified model. + + + + + + + + + + + + + +:::tip Re-use existing vectors +If you already have a compatible model vector available, you can provide it directly to Weaviate. This can be useful if you have already generated embeddings using the same model and want to use them in Weaviate, such as when migrating data from another system. +::: + +## Searches + +Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified VoyageAI model. + +![Embedding integration at search illustration](../_includes/integration_voyageai_embedding_search.png) + +### Vector (near text) search + +When you perform a [vector search](../../search/similarity.md#search-with-text), Weaviate converts the text query into an embedding using the specified model and returns the most similar objects from the database. + +The query below returns the `n` most similar objects from the database, set by `limit`. + + + + + + + + + + + + + +### Hybrid search + +:::info What is a hybrid search? +A hybrid search performs a vector search and a keyword (BM25) search, before [combining the results](../../search/hybrid.md#change-the-ranking-method) to return the best matching objects from the database. +::: + +When you perform a [hybrid search](../../search/hybrid.md), Weaviate converts the text query into an embedding using the specified model and returns the best scoring objects from the database. + +The query below returns the `n` best scoring objects from the database, set by `limit`. + + + + + + + + + + + + + +### Vector (near media) search + +When you perform a media search such as a [near image search](../../search/similarity.md#search-with-image), Weaviate converts the query into an embedding using the specified model and returns the most similar objects from the database. + +To perform a near media search such as near image search, convert the media query into a base64 string and pass it to the search query. + +The query below returns the `n` most similar objects to the input image from the database, set by `limit`. + + + + + + + + + + + + + +## References + +### Available models + +- `voyage-multimodal-3` (Default) + +## Further resources + +### Other integrations + +- [VoyageAI text embedding models + Weaviate](./embeddings.md). +- [VoyageAI reranker models + Weaviate](./reranker.md). + +### Code examples + +Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples: + +- The [how-to: manage data](../../manage-data/index.md) guides show how to perform data operations (i.e. create, update, delete). +- The [how-to: search](../../search/index.md) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation. + +### External resources + +- VoyageAI [Multimodal Embed API documentation](https://docs.voyageai.com/reference/multimodal-embeddings-api) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/model-providers/voyageai/embeddings.md b/developers/weaviate/model-providers/voyageai/embeddings.md index 02fe0b215b..e5640e6e6f 100644 --- a/developers/weaviate/model-providers/voyageai/embeddings.md +++ b/developers/weaviate/model-providers/voyageai/embeddings.md @@ -1,5 +1,6 @@ --- title: Text Embeddings +description: "Weaviate's integration with Voyage AI's APIs allows you to access their models' capabilities directly from Weaviate." sidebar_position: 20 image: og/docs/integrations/provider_integrations_voyageai.jpg # tags: ['model providers', 'voyageai', 'embeddings'] @@ -11,8 +12,10 @@ import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyConnect from '!!raw-loader!../_includes/provider.connect.py'; import TSConnect from '!!raw-loader!../_includes/provider.connect.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect/main.go'; import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; # Voyage AI Embeddings with Weaviate @@ -74,6 +77,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + +
## Configure the vectorizer @@ -99,6 +111,15 @@ Provide the API key to Weaviate using one of the following methods: /> + + + + ### Select a model @@ -124,6 +145,15 @@ You can specify one of the [available models](#available-models) for the vectori /> + + + + You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. @@ -160,6 +190,15 @@ The following examples show how to configure Voyage AI-specific options. /> + + + + For further details on model parameters, see the [Voyage AI Embedding API documentation](https://docs.voyageai.com/docs/embeddings). @@ -188,6 +227,15 @@ After configuring the vectorizer, [import data](../../manage-data/import.mdx) in /> + + + + :::tip Re-use existing vectors @@ -226,6 +274,15 @@ The query below returns the `n` most similar objects from the database, set by ` /> + + + + ### Hybrid search @@ -258,6 +315,15 @@ The query below returns the `n` best scoring objects from the database, set by ` /> + + + + ## References @@ -266,7 +332,7 @@ The query below returns the `n` best scoring objects from the database, set by ` - voyage-3 (default) - voyage-3-lite -- voyage-large-2 (default up to `v1.24.24`, `v1.25.17`, `v1.26.4`) +- voyage-large-2 (default for <= `v1.24.24`, `v1.25.17`, `v1.26.4`) - voyage-code-2 - voyage-2 - voyage-law-2 @@ -296,6 +362,7 @@ The query below returns the `n` best scoring objects from the database, set by ` ### Other integrations +- [Voyage AI multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) - [Voyage AI reranker models + Weaviate](./embeddings.md). ### Code examples diff --git a/developers/weaviate/model-providers/voyageai/index.md b/developers/weaviate/model-providers/voyageai/index.md index b7852ce2ea..aff6476ffc 100644 --- a/developers/weaviate/model-providers/voyageai/index.md +++ b/developers/weaviate/model-providers/voyageai/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_voyageai.jpg -Voyage AI offers a wide range of models for natural language processing. Weaviate seamlessly integrates with Voyage AI's APIs, allowing users to leverage Voyage AI's models directly within the Weaviate database. +Voyage AI offers a wide range of models for natural language processing. Weaviate seamlessly integrates with Voyage AI's APIs, allowing users to leverage Voyage AI's models directly from the Weaviate database. These integrations empower developers to build sophisticated AI-driven applications with ease. @@ -19,9 +19,10 @@ These integrations empower developers to build sophisticated AI-driven applicati Voyage AI's embedding models transform text data into high-dimensional vector representations, capturing semantic meaning and context. -[Weaviate integrates with Voyage AI's embedding models](./embeddings.md) to enable seamless vectorization of data. This integration allows users to perform semantic and hybrid search operations without the need for additional preprocessing or data transformation steps. +[Weaviate integrates with Voyage AI's embedding models](./embeddings.md) and [multimodal embedding models](./embeddings-multimodal.md) to enable seamless vectorization of data. This integration allows users to perform semantic and hybrid search operations without the need for additional preprocessing or data transformation steps. -[Voyage AI embedding integration page](./embeddings.md) +- [Voyage AI embedding integration page](./embeddings.md) +- [Voyage AI multimodal embedding integration page](./embeddings-multimodal.md) ### Reranker models @@ -46,12 +47,8 @@ You must provide a valid Voyage AI API key to Weaviate for these integrations. G Then, go to the relevant integration page to learn how to configure Weaviate with the Voyage AI models and start using them in your applications. - [Text Embeddings](./embeddings.md) - -## Other third party integrations - -import IntegrationLinkBack from '/_includes/integrations/link-back.mdx'; - - +- [Multimodal Embeddings](./embeddings-multimodal.md) +- [Rerankers](./reranker.md) ## Questions and feedback diff --git a/developers/weaviate/model-providers/voyageai/reranker.md b/developers/weaviate/model-providers/voyageai/reranker.md index 228e1c0982..a19308770a 100644 --- a/developers/weaviate/model-providers/voyageai/reranker.md +++ b/developers/weaviate/model-providers/voyageai/reranker.md @@ -1,5 +1,6 @@ --- title: Reranker +description: VoyageAI Reranker Model Provider sidebar_position: 70 image: og/docs/integrations/provider_integrations_voyageai.jpg # tags: ['model providers', 'voyageai', 'reranking'] @@ -78,6 +79,10 @@ Provide the API key to Weaviate using one of the following methods: ## Configure the reranker +import MutableRerankerConfig from '/_includes/mutable-reranker-config.md'; + + + Configure a Weaviate collection to use a Voyage AI reranker model as follows: @@ -165,6 +170,7 @@ Any search in Weaviate can be combined with a reranker to perform reranking oper ### Other integrations - [Voyage AI embedding models + Weaviate](./embeddings.md). +- [Voyage AI multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) ### Code examples diff --git a/developers/weaviate/model-providers/weaviate/_category_.json b/developers/weaviate/model-providers/weaviate/_category_.json new file mode 100644 index 0000000000..5bb52a5b11 --- /dev/null +++ b/developers/weaviate/model-providers/weaviate/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Weaviate", + "position": 280 +} diff --git a/developers/weaviate/model-providers/weaviate/embeddings.md b/developers/weaviate/model-providers/weaviate/embeddings.md new file mode 100644 index 0000000000..739dd7cbd0 --- /dev/null +++ b/developers/weaviate/model-providers/weaviate/embeddings.md @@ -0,0 +1,424 @@ +--- +title: Text Embeddings +description: "Weaviate Embeddings' models can be accessed directly from a Weaviate Cloud instance." +sidebar_position: 20 +image: og/docs/integrations/provider_integrations_wes.jpg +# tags: ['model providers', 'weaviate', 'wes', 'weaviate embeddings'] +--- + +:::info Access to Weaviate Embeddings during technical preview +Weaviate Embeddings is currently in free technical preview. + +To try out Weaviate Embeddings at this time, please [contact us](https://events.weaviate.io/embeddings-preview) to request access. +::: + +# Weaviate Embeddings + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyConnect from '!!raw-loader!../_includes/provider.connect.weaviate.py'; +import TSConnect from '!!raw-loader!../_includes/provider.connect.weaviate.ts'; +import GoConnect from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/1-connect-weaviate-embeddings/main.go'; +import JavaConnect from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ConnectWeaviateEmbeddings.java'; +import PyCode from '!!raw-loader!../_includes/provider.vectorizer.py'; +import TSCode from '!!raw-loader!../_includes/provider.vectorizer.ts'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/UsageWeaviateTextEmbeddings.java'; +import JavaImportQueries from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/model_providers/ImportAndQueries.java'; + +Weaviate Embeddings' models can be accessed directly from a Weaviate Cloud instance. + +[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Weaviate Embeddings model, and Weaviate will generate embeddings for various operations using the specified model and your Weaviate API key. This feature is called the *vectorizer*. + +At [import time](#data-import), Weaviate generates text object embeddings and saves them into the index. For [vector](#vector-near-text-search) and [hybrid](#hybrid-search) search operations, Weaviate converts text queries into embeddings. + +![Embedding integration illustration](../_includes/integration_wes_embedding.png) + +## Requirements + +To use Weaviate Embeddings, you need: + +- A Weaviate Cloud instance running at least Weaviate `1.27.6` +- To have [enabled "Weaviate Embeddings"](/developers/wcs/embeddings/index.md#administration) in your Weaviate Cloud organisation +- A Weaviate client library that supports Weaviate Embeddings: + - Python client version `4.9.5` or higher + - JavaScript/TypeScript client version `3.2.5` or higher + - Go/Java clients are not yet officially supported; you must pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation as shown below. + +### Weaviate configuration + +The Weaviate Embeddings vectorizer is only available for use by Weaviate Cloud instances. At this time, Weaviate Embeddings is not available for self-hosted users. + +### API credentials + +Weaviate Embeddings is integrated with Weaviate Cloud. Your Weaviate Cloud credentials will be used to authorize your Weaviate Cloud instance's access for Weaviate Embeddings. + + + + + + + + + + + + + + + + + + + + + +## Configure the vectorizer + +[Configure a Weaviate index](../../manage-data/collections.mdx#specify-a-vectorizer) as follows to use a Weaviate Embeddings model: + + + + + + + + + + + + + + + + + + + + +### Select a model + +You can specify one of the [available models](#available-models) for the vectorizer to use, as shown in the following configuration example. + + + + + + + + + + + + + + + + + + + + +You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. + +import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; + +
+ Vectorization behavior + + + +
+ +### Vectorizer parameters + +The following examples show how to configure Weaviate Embeddings-specific options. + + + + + + + + + + + + + + + + + + + + +- `model`: The name of the model to use for embedding generation. +- `dimensions`: The number of dimensions to use for the generated embeddings. Only available for models that support Matryoshka Representation Learning. +- `base_url`: The base URL for the Weaviate Embeddings service. (Not required in most cases.) + +## Data import + +After configuring the vectorizer, [import data](../../manage-data/import.mdx) into Weaviate. Weaviate generates embeddings for text objects using the specified model. + + + + + + + + + + + + + + + + + + + + + +:::tip Re-use existing vectors +If you already have a compatible model vector available, you can provide it directly to Weaviate. This can be useful if you have already generated embeddings using the same model and want to use them in Weaviate, such as when migrating data from another system. +::: + +## Searches + +Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified WED model. + +![Embedding integration at search illustration](../_includes/integration_wes_embedding_search.png) + +### Vector (near text) search + +When you perform a [vector search](../../search/similarity.md#search-with-text), Weaviate converts the text query into an embedding using the specified model and returns the most similar objects from the database. + +The query below returns the `n` most similar objects from the database, set by `limit`. + + + + + + + + + + + + + + + + + + + + + +### Hybrid search + +:::info What is a hybrid search? +A hybrid search performs a vector search and a keyword (BM25) search, before [combining the results](../../search/hybrid.md#change-the-ranking-method) to return the best matching objects from the database. +::: + +When you perform a [hybrid search](../../search/hybrid.md), Weaviate converts the text query into an embedding using the specified model and returns the best scoring objects from the database. + +The query below returns the `n` best scoring objects from the database, set by `limit`. + + + + + + + + + + + + + + + + + + + + +## References + +### Available models + +- `arctic-embed-m-v1.5` (default) + - A 109M parameter, 768-dimensional model for enterprise retrieval tasks in English. + - Trained with Matryoshka Representation Learning to allow vector truncation with minimal loss. + - Quantization-friendly: Using scalar quantization and 256 dimensions provides 99% of unquantized, full-precision performance. + - Read more at the [Snowflake blog](https://www.snowflake.com/engineering-blog/arctic-embed-m-v1-5-enterprise-retrieval/), and the Hugging Face [model card](https://huggingface.co/Snowflake/snowflake-arctic-embed-m-v1.5) + - Allowable `dimensions`: 768 (default), 256 + +Additional models will be added in the future. + +:::info Input truncation +Currently, input exceeding the model's context windows is truncated from the right (i.e. the end of the input). +::: + +## Further resources + +### Code examples + +Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples: + +- The [how-to: manage data](../../manage-data/index.md) guides show how to perform data operations (i.e. create, update, delete). +- The [how-to: search](../../search/index.md) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation. + +### Further resources + +- Weaviate Embeddings [Documentation](/developers/wcs/embeddings) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/model-providers/weaviate/index.md b/developers/weaviate/model-providers/weaviate/index.md new file mode 100644 index 0000000000..5fd705d078 --- /dev/null +++ b/developers/weaviate/model-providers/weaviate/index.md @@ -0,0 +1,50 @@ +--- +title: Weaviate Embeddings +sidebar_position: 10 +image: og/docs/integrations/provider_integrations_wes.jpg +# tags: ['model providers', 'weaviate', 'weaviate embeddings'] +--- + +:::info Access to Weaviate Embeddings during technical preview +Weaviate Embeddings is currently in free technical preview for Weaviate Cloud Serverless users. + +To try out Weaviate Embeddings at this time, please [contact us](https://events.weaviate.io/embeddings-preview) to request access. +::: + + + +[Weaviate Embeddings](/developers/wcs/embeddings) offers vectorizer models to Weaviate Cloud users, allowing users to leverage Weaviate Embeddings' models directly from a Weaviate Cloud database instance. + +These integrations empower developers to build sophisticated AI-driven applications with ease. + +## Integrations with Weaviate Embeddings + +### Embedding models for semantic search + +![Embedding integration illustration](../_includes/integration_wes_embedding.png) + +Weaviate Embeddings' embedding models transform text data into high-dimensional vector representations, capturing semantic meaning and context. + +[Weaviate Cloud integrates with Weaviate Embeddings' embedding models](./embeddings.md) to enable seamless vectorization of data. This integration allows users to perform semantic and hybrid search operations without the need for additional preprocessing or data transformation steps. + +[Weaviate Embeddings integration page](./embeddings.md) + +## Summary + +These integrations enable developers to leverage Weaviate Embeddings' powerful models directly within Weaviate. + +In turn, they simplify the process of building AI-driven applications to speed up your development process, so that you can focus on creating innovative solutions. + +## Get started + +You must provide a valid Weaviate Cloud API key to Weaviate for these integrations. Go to [Weaviate Cloud](https://console.weaviate.cloud/) to sign up and obtain an API key. + +Then, go to the relevant integration page to learn how to configure Weaviate with the Weaviate Embeddings models and start using them in your applications. + +- [Text Embeddings](./embeddings.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/modules/custom-modules.md b/developers/weaviate/modules/custom-modules.md index 5507359307..cd878291b1 100644 --- a/developers/weaviate/modules/custom-modules.md +++ b/developers/weaviate/modules/custom-modules.md @@ -1,5 +1,6 @@ --- title: Custom modules +description: Explore custom modules in Weaviate for personalized data management features. sidebar_position: 90 image: og/docs/modules/custom-modules.jpg # tags: ['modules', 'other modules', 'custom modules'] diff --git a/developers/weaviate/modules/img2vec-neural.md b/developers/weaviate/modules/img2vec-neural.md index b7034517f1..82980f429e 100644 --- a/developers/weaviate/modules/img2vec-neural.md +++ b/developers/weaviate/modules/img2vec-neural.md @@ -9,9 +9,6 @@ image: og/docs/modules/img2vec-neural.jpg For new projects, we recommend using the [Transformers multi-modal integration](../model-providers/transformers/embeddings-multimodal.md) module instead of `img2vec-neural`. This uses CLIP models, which uses a more modern model architecture than `resnet` models used in `img2vec-neural`. CLIP models are also multi-modal, meaning they can handle both images and text and therefore applicable to a wider range of use cases. ::: - -## Overview - The `img2vec-neural` module enables Weaviate to obtain vectors locally images using a [`resnet50`](https://arxiv.org/abs/1512.03385) model. `img2vec-neural` encapsulates the model in a Docker container, which allows independent scaling on GPU-enabled hardware while keeping Weaviate on CPU-only hardware, as Weaviate is CPU-optimized. @@ -68,7 +65,6 @@ services: PERSISTENCE_DATA_PATH: "./data" # highlight-start ENABLE_MODULES: 'img2vec-neural' - DEFAULT_VECTORIZER_MODULE: 'img2vec-neural' IMAGE_INFERENCE_API: "http://i2v-neural:8080" # highlight-end CLUSTER_HOSTNAME: 'node1' diff --git a/developers/weaviate/modules/ner-transformers.md b/developers/weaviate/modules/ner-transformers.md index 38140f15b0..a215172ce7 100644 --- a/developers/weaviate/modules/ner-transformers.md +++ b/developers/weaviate/modules/ner-transformers.md @@ -1,5 +1,6 @@ --- title: Named Entity Recognition +description: Integrate NER Transformers in Weaviate to identify and categorize entities in text. sidebar_position: 60 image: og/docs/modules/ner-transformers.jpg # tags: ['ner-transformers', 'transformers', 'token classification'] @@ -47,7 +48,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'text2vec-contextionary' ENABLE_MODULES: 'text2vec-contextionary,ner-transformers' CLUSTER_HOSTNAME: 'node1' contextionary: diff --git a/developers/weaviate/modules/qna-openai.md b/developers/weaviate/modules/qna-openai.md index 900999b03b..8a2890accf 100644 --- a/developers/weaviate/modules/qna-openai.md +++ b/developers/weaviate/modules/qna-openai.md @@ -103,7 +103,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'text2vec-openai' ENABLE_MODULES: 'text2vec-openai,qna-openai' OPENAI_APIKEY: sk-foobar # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. OPENAI_ORGANIZATION: your-orgname # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. diff --git a/developers/weaviate/modules/qna-transformers.md b/developers/weaviate/modules/qna-transformers.md index 4647015f9d..ece4101ce1 100644 --- a/developers/weaviate/modules/qna-transformers.md +++ b/developers/weaviate/modules/qna-transformers.md @@ -1,5 +1,6 @@ --- title: Question Answering - transformers +description: Add QnA Transformers to Weaviate for accurate question answering and insights. sidebar_position: 40 image: og/docs/modules/qna-transformers.jpg # tags: ['qna', 'qna-transformers', 'transformers'] @@ -50,7 +51,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'text2vec-transformers' ENABLE_MODULES: 'text2vec-transformers,qna-transformers' CLUSTER_HOSTNAME: 'node1' t2v-transformers: diff --git a/developers/weaviate/modules/ref2vec-centroid.md b/developers/weaviate/modules/ref2vec-centroid.md index 995ba810a0..1e0252ead2 100644 --- a/developers/weaviate/modules/ref2vec-centroid.md +++ b/developers/weaviate/modules/ref2vec-centroid.md @@ -1,5 +1,6 @@ --- title: Ref2Vec Centroid Vectorizer +description: Enhance vector search with Ref2Vec Centroid for stronger data representations. sidebar_position: 25 image: og/docs/modules/ref2vec-centroid.jpg # tags: ['ref2vec', 'ref2vec-centroid', 'centroid'] diff --git a/developers/weaviate/modules/spellcheck.md b/developers/weaviate/modules/spellcheck.md index a8ed46931c..3d6420925f 100644 --- a/developers/weaviate/modules/spellcheck.md +++ b/developers/weaviate/modules/spellcheck.md @@ -1,5 +1,6 @@ --- title: Spell Check +description: Integrate spellcheck in Weaviate to improve text data quality and search accuracy. sidebar_position: 70 image: og/docs/modules/text-spellcheck.jpg # tags: ['modules', 'other modules', 'spellcheck'] @@ -45,7 +46,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'text2vec-contextionary' ENABLE_MODULES: 'text2vec-contextionary,text-spellcheck' CLUSTER_HOSTNAME: 'node1' contextionary: diff --git a/developers/weaviate/modules/sum-transformers.md b/developers/weaviate/modules/sum-transformers.md index 67d3a35b47..62bdbf407a 100644 --- a/developers/weaviate/modules/sum-transformers.md +++ b/developers/weaviate/modules/sum-transformers.md @@ -1,5 +1,6 @@ --- title: Summarization +description: Summarize data efficiently using the SUM Transformers module in Weaviate. sidebar_position: 80 image: og/docs/modules/sum-transformers.jpg # tags: ['transformers'] @@ -66,7 +67,6 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'text2vec-contextionary' ENABLE_MODULES: 'text2vec-contextionary,sum-transformers' CLUSTER_HOSTNAME: 'node1' contextionary: diff --git a/developers/weaviate/modules/text2vec-contextionary.md b/developers/weaviate/modules/text2vec-contextionary.md index 98668f80b0..d767de79eb 100644 --- a/developers/weaviate/modules/text2vec-contextionary.md +++ b/developers/weaviate/modules/text2vec-contextionary.md @@ -1,14 +1,11 @@ --- title: "Contextionary Vectorizer" +description: Use Text2Vec Contextionary in Weaviate for improved context-based text vectorization. sidebar_position: 10 image: og/docs/modules/text2vec-contextionary.jpg # tags: ['text2vec', 'text2vec-contextionary', 'contextionary'] --- - - -## Overview - The `text2vec-contextionary` module enables Weaviate to obtain vectors locally using a lightweight model. Key notes: @@ -79,7 +76,6 @@ services: PERSISTENCE_DATA_PATH: '/var/lib/weaviate' # highlight-start ENABLE_MODULES: 'text2vec-contextionary' - DEFAULT_VECTORIZER_MODULE: 'text2vec-contextionary' # highlight-end CLUSTER_HOSTNAME: 'node1' # highlight-start diff --git a/developers/weaviate/more-resources/faq.md b/developers/weaviate/more-resources/faq.md index 75074259aa..b2b6185de8 100644 --- a/developers/weaviate/more-resources/faq.md +++ b/developers/weaviate/more-resources/faq.md @@ -526,7 +526,6 @@ Read more on SIGQUIT [here](https://en.wikipedia.org/wiki/Signal_(IPC)#SIGQUIT) > AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' > PERSISTENCE_DATA_PATH: './data' > ENABLE_MODULES: 'text2vec-contextionary' -> DEFAULT_VECTORIZER_MODULE: 'text2vec-contextionary' > AUTOSCHEMA_ENABLED: 'false' > contextionary: > environment: diff --git a/developers/weaviate/more-resources/migration/archive.md b/developers/weaviate/more-resources/migration/archive.md new file mode 100644 index 0000000000..89152b24e0 --- /dev/null +++ b/developers/weaviate/more-resources/migration/archive.md @@ -0,0 +1,906 @@ +--- +title: Archive +sidebar_position: 90 +image: og/docs/more-resources.jpg +# tags: ['migration'] +--- + +# Migration Guide: Archive + +This page contains the migration guides for older versions of Weaviate. For the most recent migration guides, please refer to the parent [migration guide](./index.md) page. + +## Migration for version 1.19.0 + +This version introduces `indexFilterable` and `indexSearchable` variables for the new text indexes, whose values will be set based on the value of `indexInverted`. + +Since filterable & searchable are separate indexes, filterable does not exist in Weaviate instances upgraded from pre-`v1.19` to `v1.19`. The missing `filterable` index can be created though on startup for all `text/text[]` properties if env variable `INDEX_MISSING_TEXT_FILTERABLE_AT_STARTUP` is set. + +## Changelog for version v1.9.0 + +* no breaking changes + +* *New Features* + * ### First Multi-modal module: CLIP Module (#1756, #1766) + This release [introduces the `multi2vec-clip` integration](/developers/weaviate/model-providers/transformers/embeddings-multimodal.md), a module that allows for multi-modal vectorization within a single vector space. A class can have `image` or `text` fields or both. Similarly, the module provides both a `nearText` and a `nearImage` search and allows for various search combinations, such as text-search on image-only content and various other combinations. + + #### How to use + + The following is a valid payload for a class that vectorizes both images and text fields: + ```json + { + "class": "ClipExample", + "moduleConfig": { + "multi2vec-clip": { + "imageFields": [ + "image" + ], + "textFields": [ + "name" + ], + "weights": { + "textFields": [0.7], + "imageFields": [0.3] + } + } + }, + "vectorIndexType": "hnsw", + "vectorizer": "multi2vec-clip", + "properties": [ + { + "dataType": [ + "text" + ], + "name": "name" + }, + { + "dataType": [ + "blob" + ], + "name": "image" + } + ] + } + ``` + + Note that: + - `imageFields` and `textFields` in `moduleConfig.multi2vec-clip` do not both need to be set. However at least one of both must be set. + - `weights` in `moduleConfig.multi2vec-clip` is optional. If only a single property the property takes all the weight. If multiple properties exist and no weights are specified, the properties are equal-weighted. + + You can then import data objects for the class as usual. Fill the `text` or `string` fields with text and/or fill the `blob` fields with a base64-encoded image. + + #### Limitations + * As of `v1.9.0` the module requires explicit creation of a class. If you rely on auto-schema to create the class for you, it will be missing the required configuration about which fields should be vectorized. This will be addressed in a future release. + +* *Fixes* + * fix an error where deleting a class with `geoCoordinates` could lead to a panic due to missing cleanup (#1730) + * fix an issue where an error in a module would not be forwarded to the user (#1754) + * fix an issue where a class could not be deleted on some file system (e.g. AWS EFS) (#1757) + + +## Migration to version v1.8.0 + +### Migration Notice + +Version `v1.8.0` introduces multi-shard indexes and horizontal scaling. As a +result the dataset needs to be migrated. This migration is performed automatically - +without user interaction - when first starting up with Weaviate version +`v1.8.0`. However, it cannot be reversed. We, therefore, recommend carefully +reading the following migration notes and making a case-by-case decision about the +best upgrade path for your needs. + +#### Why is a data migration necessary? + +Prior to `v1.8.0` Weaviate did not support multi-shard indexes. The feature was +already planned, therefore data was already contained in a single shard with a +fixed name. A migration is necessary to move the data from a single fixed shard +into a multi-shard setup. The amount of shards is not changed. When you run +`v1.8.0` on a dataset the following steps happen automatically: + +* Weaviate discovers the missing sharding configuration for your classes and fills it with the default values +* When shards start-up and they do not exist on disk, but a shard with a fixed + name from `v1.7.x` exists, Weaviate automatically recognizes that a migration + is necessary and moves the data on disk +* When Weaviate is up and running the data has been migrated. + +**Important Notice:** As part of the migration Weaviate will assign the shard +to the (only) node available in the cluster. You need to make sure that this +node has a stable hostname. If you run on Kubernetes, hostnames are stable +(e.g. `weaviate-0` for the first node). However with `Docker Compose` hostnames +default to the id of the container. If you remove your containers (e.g. +`docker compose down`) and start them up again, the hostname will have changed. +This will lead to errors where Weaviate mentions that it cannot find the node +that the shard belongs to. The node sending the error message is the node that +owns the shard itself, but it cannot recognize it, since its own name has +changed. + +To remedy this, you can set a stable hostname **before starting up with +v1.8.0** by setting the env var `CLUSTER_HOSTNAME=node1`. The actual name does +not matter, as long as it's stable. + +If you forgot to set a stable hostname and are now running into the error +mentioned above, you can still explicitly set the hostname that was used before +which you can derive from the error message. + +Example: + +If you see the error message `"shard Knuw6a360eCY: resolve node name +\"5b6030dbf9ea\" to host"`, you can make Weaviate usable again, by setting +`5b6030dbf9ea` as the host name: `CLUSTER_HOSTNAME=5b6030dbf9ea`. + +#### Should you upgrade or reimport? + +In addition to new features, `v1.8.0` also contains a large collection of +bugfixes. Some of the bugs affect how Weaviate writes the HNSW index to disk. +A pre-1.18.0 index on disk may not be as good a freshly built `v1.8.0` index. +If you can import using a script, we generally recommend starting with a fresh +`v1.8.0` instance and reimporting instead of migrating. + +#### Is downgrading possible after upgrading? + +Note that the data migration which happens at the first startup of v1.8.0 is +not automatically reversible. If you plan on downgrading to `v1.7.x` again +after upgrading, you must explicitly create a backup of the state prior to +upgrading. + +### Changelog + + +## Changelog for version v1.7.2 +* No breaking changes +* New features + * ### Array Datatypes (#1691) + Added `boolean[]` and `date[]`. + * ### Make property names less strict (#1562) + Property names in a data schema allows: `/[_A-Za-z][_0-9A-Za-z]*/`. i.e. it will allow for using underscores, will allow numbers and will fix the issue about trailing upper-case characters. But it won't allow for many other special characters, such as dash (-) or language-specific characters like Umlauts, etc, due to GraphQL restrictions. +* Bug fixes + * ### Aggregation on array data type (#1686) + + +## Changelog for version v1.7.0 +* No breaking changes +* New features + * ### Array Datatypes (#1611) + Starting with this release, primitive object properties are no longer limited to individual properties, but can also include lists of primitives. Array types can be stored, filtered and aggregated in the same way as other primitives. + + Auto-schema will automatically recognize lists of `string`/`text` and `number`/`int`. You can also explicitly specify lists in the schema by using the following data types `string[]`, `text[]`, `int[]`, `number[]`. A type that is assigned to be an array, must always stay an array, even if it only contains a single element. + + * ### New Module: `text-spellcheck` - Check and autocorrect misspelled search terms (#1606) + Use the new spellchecker module to verify user-provided search queries (in existing `nearText` or `ask` functions) are spelled correctly and even suggest alternative, correct spellings. Spell-checking happens at query time. + + There are two ways to use this module: + 1. It provides a new additional property which can be used to check (but not alter) the provided queries: + The following query: + ```graphql + { + Get { + Post(nearText: { + concepts: "missspelled text" + }) { + content + _additional { + spellCheck { + changes { + corrected + original + } + didYouMean + location + originalText + } + } + } + } + } + ``` + + will produce results similar to the following: + + ``` + "_additional": { + "spellCheck": [ + { + "changes": [ + { + "corrected": "misspelled", + "original": "missspelled" + } + ], + "didYouMean": "misspelled text", + "location": "nearText.concepts[0]", + "originalText": "missspelled text" + } + ] + }, + "content": "..." + }, + ``` + 2. It extends existing `text2vec-*` modules with an `autoCorrect` flag, which can be used to automatically correct the query if misspelled. + + * ### New Module `ner-transformers` - Extract entities from Weaviate using transformers (#1632) + Use transformer-based models to extract entities from your existing Weaviate objects on the fly. Entity extraction happens at query time. Note that for maximum performance, transformer-based models should run with GPUs. CPUs can be used, but the throughput will be lower. + + To make use of the module's capabilities, simply extend your query with the following new `_additional` property: + + ```graphql + { + Get { + Post { + content + _additional { + tokens( + properties: ["content"], # is required + limit: 10, # optional, int + certainty: 0.8 # optional, float + ) { + certainty + endPosition + entity + property + startPosition + word + } + } + } + } + } + + ``` + It will return results similar to the following: + + ``` + "_additional": { + "tokens": [ + { + "property": "content", + "entity": "PER", + "certainty": 0.9894614815711975, + "word": "Sarah", + "startPosition": 11, + "endPosition": 16 + }, + { + "property": "content", + "entity": "LOC", + "certainty": 0.7529033422470093, + "word": "London", + "startPosition": 31, + "endPosition": 37 + } + ] + } + ``` +* Bug fixes + * Aggregation can get stuck when aggregating `number` datatypes (#1660) + +## Changelog for version 1.6.0 +* No breaking changes +* No new features + * **Zero Shot Classification (#1603)** This release adds a new classification type `zeroshot` that works with any `vectorizer` or custom vectors. It picks the label objects that have the lowest distance to the source objects. The link is made using cross-references, similar to existing classifications in Weaviate. To start a `zeroshot` classification use `"type": "zeroshot"` in your `POST /v1/classficiations` request and specify the properties you want classified normally using `"classifyProperties": [...]`. As zero shot involves no training data, you cannot set `trainingSetWhere` filters, but can filter both source (`"sourceWhere"`) and label objects (`"targetWhere"`) directly. +* Bug fixes + + +## Changelog for version 1.5.2 + +* No breaking changes +* No new features +* Bug fixes: +* ### Fix possible data races (`short write`) (#1643) + This release fixes various possible data races that could in the worst case lead to an unrecoverable error `"short write"`. The possibility for those races was introduced in `v.1.5.0` and we highly recommend anyone running on the `v1.5.x` timeline to upgrade to `v1.5.2` immediately. + +## Changelog for version 1.5.1 + +* No breaking changes +* No new features +* Bug fixes: +* ### Crashloop after unexpected crash in HNSW commit log (#1635) + If Weaviate was killed (e.g. OOMKill) while writing the commit log, it could not be parsed after the next restart anymore, thus ending up in a crashloop. This fix removes this. Note that no data will be lost on such a crash: The partially written commit log has not yet been acknowledged to the user, so no write guarantees have been given yet. It is therefore safe to discard. + +* ### Chained Like operator not working (#1638) + Prior to this fix, when chaining `Like` operators in `where` filters where each `valueString` or `valueText` contained a wildcard (`*`), typically only the first operator's results where reflected. This fix makes sure that the chaining (`And` or `Or`) is reflected correctly. This bug did not affect other operators (e.g. `Equal`, `GreaterThan`, etc) and only affected those `Like` queries where a wildcard was used. + +* ### Fix potential data race in Auto Schema features (#1636) + This fix improves incorrect synchronization on the auto schema feature which in extreme cases could lead to a data race. + +## Migration to version 1.5.0 + +### Migration Notice +*This release does not contain any API-level breaking changes, however, it changes the entire storage mechanism inside Weaviate. As a result, an in-place update is not possible. When upgrading from previous versions, a new setup needs to be created and all data reimported. Prior backups are not compatible with this version.* + +### Changelog +* No breaking changes +* New Features: + * *LSM-Tree based Storage*. Previous releases of Weaviate used a B+Tree based storage mechanism. This was not fast enough to keep up with the high write speed requirements of a large-scale import. This release completely rewrites the storage layer of Weaviate to use a custom LSM-tree approach. This leads to considerably faster import times, often more than 100% faster than the previous version. + * *Auto-Schema Feature*. Import data objects without creating a schema prior to import. The classes will be created automatically, they can still be adjusted manually. Weaviate will guess the property type based on the first time it sees a property. The defaults can be configured using the environment variables outlined in #1539. The feature is on by default, but entirely non-breaking. You can still create an explicit schema at will. +* Fixes: + * *Improve Aggregation Queries*. Reduces the amount of allocations required for some aggregation queries, speeding them up and reduces the amount of timeouts encountered during aggregations. + + +Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.5.0) for all the changes. + + +## Changelog for version 1.4.0 + +* No breaking changes +* New Features: + * Image Module [`img2vec-neural`](/developers/weaviate/modules/img2vec-neural.md) + * Add Hardware acceleration for `amd64` CPUs (Intel, AMD) + * Support `arm64` technology for entire Weaviate stack + * Set `ef` at search time + * Introduce new dataType `blob` + * Skip vector-indexing a class +* Fixes: + * Various Performance Fixes around the HNSW Vector Index + * Make property order consistent when vectorizing + * Fix issues around `PATCH` API when using custom vectors + * Detect schema settings that will most likely lead to duplicate vectors and print warning + * Fix missing schema validation on transformers module + +Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.4.0) for all the changes. + + +## Changelog for version 1.3.0 + +* No breaking changes +* New feature: [Question Answering (Q&A) Module](/developers/weaviate/modules/qna-transformers.md) +* New feature: New Meta Information for all transformer-based modules + +Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.3.0) for all the changes. + +## Changelog for version 1.2.0 + +* No breaking changes +* New feature: Introduction of the [Transformer Module](/developers/weaviate/modules/qna-transformers.md) + +Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.2.0) for all the changes. + +## Changelog for version 1.1.0 + +* No breaking changes +* New feature: GraphQL `nearObject` search to get most similar object. +* Architectural update: Cross-reference batch import speed improvements. + +Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.1.0) for all the changes. + +## Migration to version 1.0.0 + +Weaviate version 1.0.0 was released on 12 January 2021, and consists of the major update of modularization. From version 1.0.0, Weaviate is modular, meaning that the underlying structure relies on a *pluggable* vector index, *pluggable* vectorization modules with possibility to extend with *custom* modules. + +Weaviate release 1.0.0 from 0.23.2 comes with a significant amount of breaking changes in the data schema, API and clients. Here is an overview of all (breaking) changes. + +For client library specific changes, take a look at the change logs of the specific client ([Go](/developers/weaviate/client-libraries/go.md#change-logs), [Python](/developers/weaviate/client-libraries/python/index.md#change-logs) and [TypeScript/JavaScript](/developers/weaviate/client-libraries/typescript/index.mdx#changelog). + +Moreover, a new version of the Console is released. Visit the Console documentation for more information. + +### Summary +This contains most overall changes, but not all details. Those are documented in ["Changes"](#changes). + +#### All RESTful API changes +* from `/v1/schema/things/{ClassName}` to `/v1/schema/{ClassName}` +* from `/v1/schema/actions/{ClassName} `to `/v1/schema/{ClassName}`from `/v1/schema/actions/{ClassName} `to `/v1/schema/{ClassName}` +* from `/v1/things` to `/v1/objects` +* from `/v1/actions` to `/v1/objects` +* from `/v1/batching/things` to `/v1/batch/objects` +* from `/v1/batching/actions` to `/v1/batch/objects` +* from `/v1/batching/references` to `/v1/batch/references` +* Additional data object properties are grouped in `?include=...` and the leading underscore of these properties is removed +* The `/v1/modules/` endpoint is introduced. +* the `/v1/meta/` endpoint now contains module specific information in `"modules"` + +#### All GraphQL API changes +* Removal of Things and Actions layer in query hierarchy +* Reference properties of data objects are lowercase (previously uppercased) +* Underscore properties, uuid and certainty are now grouped in the object `_additional` +* `explore()` filter is renamed to `near` filter +* `nearVector(vector:[])` filter is introduced in `Get{}` query +* `Explore (concepts: ["foo"]){}` query is changed to `Explore (near: ... ) {}`. + +#### All data schema changes +* Removal of Things and Actions +* Per class and per property configuration is changed to support modules and vector index type settings. + +#### All data object changes +* From `schema` to `properties` in the data object. + +#### Contextionary +* Contextionary is renamed to the module `text2vec-contextionary` +* `/v1/c11y/concepts` to `/v1/modules/text2vec-contextionary/concepts` +* `/v1/c11y/extensions` to `/v1/modules/text2vec-contextionary/extensions` +* `/v1/c11y/corpus` is removed + +#### Other +* Removal of `/things` and `/actions` in short and long beacons +* Classification body is changed to support modularization +* `DEFAULT_VECTORIZER_MODULE` is a new environment variable + +### Changes + +#### Removal of Things and Actions +`Things` and `Actions` are removed from the Data Schema. This comes with the following changes in the schema definition and API endpoints: +1. **Data schema:** The `semantic kind` (`Things` and `Actions`) is removed from the Schema Endpoint. This means the URLs will change: + * from `/v1/schema/things/{ClassName}` to `/v1/schema/{ClassName}` + * from `/v1/schema/actions/{ClassName} `to `/v1/schema/{ClassName}` +1. **Data RESTful API endpoint:** The `semantic kind` (`Things` and `Actions`) is removed from the data Endpoint. Instead it will be namespaced as `/objects`. This means the URLs will change: + * from `/v1/things` to `/v1/objects` + * from `/v1/actions` to `/v1/objects` + * from `/v1/batching/things`to `/v1/batch/objects` (see also the [change in batching](#renaming-batching-to-batch)) + * from `/v1/batching/actions`to `/v1/batch/objects` (see also the [change in batching](#renaming-batching-to-batch)) +1. **GraphQL:** The `Semantic Kind` "level" in the query hierarchy will be removed without replacement (In `Get` and `Aggregate` queries), i.e. + ```graphql + { + Get { + Things { + ClassName { + propName + } + } + } + } + ``` + + will become + + ```graphql + { + Get { + ClassName { + propName + } + } + } + ``` +1. **Data Beacons:** The `Semantic Kind` will be removed from beacons: + * **Short-form Beacon:** + + * `weaviate://localhost/things/4fbacd6e-1153-47b1-8cb5-f787a7f01718` + + to + + * `weaviate://localhost/4fbacd6e-1153-47b1-8cb5-f787a7f01718` + + * **Long-form Beacon:** + + * `weaviate://localhost/things/ClassName/4fbacd6e-1153-47b1-8cb5-f787a7f01718/propName` + + to + + * `weaviate://localhost/ClassName/4fbacd6e-1153-47b1-8cb5-f787a7f01718/propName` + +#### Renaming /batching/ to /batch/ + +* `/v1/batching/things` to `/v1/batch/objects` +* `/v1/batching/actions` to `/v1/batch/objects` +* `/v1/batching/references` to `/v1/batch/references` + + +#### From "schema" to "properties" in data object + +The name "schema" on the data object is not intuitive and is replaced by "properties". The change looks like: + +```json +{ + "class": "Article", + "schema": { + "author": "Jane Doe" + } +} +``` + +to + +```json +{ + "class": "Article", + "properties": { + "author": "Jane Doe" + } +} +``` + +#### Consistent casing in GraphQL properties + +Previously, reference properties in the schema definitions are always lowercase, yet in graphQL they needed to be uppercased. E.g.: `Article { OfAuthor { … on Author { name } } } }`, even though the property is defined as ofAuthor. New is that the casing in GraphQL reflects exactly the casing in the schema definition, thus the above example would become: `Article { ofAuthor { … on Author { name } } } }` + +#### Additional data properties in GraphQL and RESTful API +Since modularization, a module can contribute to the additional properties of a data object (thus are not fixed), which should be retrievable by the GraphQL and/or RESTful API. +1. **REST**: `additional` properties (formerly named `"underscore"` properties) can be included in RESTful query calls like `?include=...`, e.g. `?include=classification`. The underscores will thus be removed from the names (e.g. `?include=_classification` is deprecated). In the Open API specifications, all additional properties will be grouped in the object `additional`. For example: + ```json + { + "class": "Article", + "schema": { ... }, + "_classification": { … } + } + ``` + + to + + ```json + { + "class": "Article", + "properties": { ... }, + "additional": { + "classification": { ... } + } + } + ``` +2. **GraphQL**: `"underscore"` properties are renamed to `additional` properties in GraphQL queries. + 1. All former `"underscore"` properties of a data object (e.g. `_certainty`) are now grouped in the `_additional {}` object (e.g. `_additional { certainty } `). + 2. The `uuid` property is now also placed in the `_additional {}` object and renamed to `id` (e.g. `_additional { id } `). + This example covers both changes: + + From + + ```graphql + { + Get { + Things { + Article { + title + uuid + certainty + _classification + } + } + } + } + ``` + + to + + ```graphql + { + Get { + Article { + title + _additional { # leading _ prevents clashes + certainty + id # replaces uuid + classification + } + } + } + } + ``` + +#### Modules RESTful endpoint +With the modularization of Weaviate, the `v1/modules/` endpoint is introduced. + +#### GraphQL semantic search + +With the modularization, it becomes possible to vectorize non-text objects. Search is no longer restricted to use the Contextionary's vectorization of text and data objects, but could also be applied to non-text objects or raw vectors. The formerly 'explore' filter in Get queries and 'Explore' queries in GraphQL were tied to text, but the following changes are made to this filter with the new version of Weaviate: + +1. The filter `Get ( explore: {} ) {}` is renamed to `Get ( near: {} ) {}`. + 1. New: `Get ( nearVector: { vector: [.., .., ..] } ) {}` is module independent and will thus always be available. + 2. `Get ( explore { concepts: ["foo"] } ) {}` will become `Get ( nearText: { concepts: ["foo"] } ) {}` and is only available if the `text2vec-contextionary` module is attached. + + From + + ```graphql + { + Get { + Things { + Article (explore: { concepts: ["foo"] } ) { + title + } + } + } + } + ``` + + to + + ```graphql + { + Get { + Article (near: ... ) { + title + } + } + } + ``` + +2. Similarly to the explore sorter that is used in the `Get {}` API, the `Explore {}` API also assumes text. The following change is applied: + + From + + ```graphql + { + Explore (concepts: ["foo"]) { + beacon + } + } + ``` + + to + + ```graphql + { + Explore (near: ... ) { + beacon + } + } + ``` + +#### Data schema configuration +1. **Per-class configuration** + + With modularization, it is possible to configure per class the vectorizer module, module-specific configuration for the overall class, vector index type, and vector index type specific configuration: + * The `vectorizer` indicates which module (if any) are responsible for vectorization. + * The `moduleConfig` allows configuration per module (by name). + * See [here](#text2vec-contextionary) for Contextionary specific property configuration. + * The `vectorIndexType` allows the choosing the vector index (defaults to [HNSW](/developers/weaviate/concepts/vector-index.md#hnsw)) + * The `vectorIndexConfig` is an arbitrary object passed to the index for config (defaults can be found [here](/developers/weaviate/config-refs/schema/vector-index.md#how-to-configure-hnsw) ) + + All changes are in this example: + + ```json + { + "class": "Article", + "vectorizeClassName": true, + "description": "string", + "properties": [ … ] + } + ``` + + will become + + ```json + { + "class": "Article", + "vectorIndexType": "hnsw", # defaults to hnsw + "vectorIndexConfig": { + "efConstruction": 100 + }, + "moduleConfig": { + "text2vec-contextionary": { + "vectorizeClassName": true + }, + "encryptor5000000": { "enabled": true } # example + }, + "description": "string", + "vectorizer": "text2vec-contextionary", # default is configurable + "properties": [ … ] + } + ``` + +2. **Per-property configuration** + + With modularization, it is possible to configure per property module-specific configuration per property if available and it can be specified if a property should be included in the inverted index. + * The `moduleConfig` allows configuration per module (by name). + * See [here](#text2vec-contextionary) for Contextionary specific property configuration. + * `index` will become `indexInverted`: a boolean that indicates whether a property should be indexed in the inverted index. + + All changes are in this example: + + ```json + { + "dataType": [ "text" ], + "description": "string", + "cardinality": "string", + "vectorizePropertyName": true, + "name": "string", + "keywords": [ … ], + "index": true + } + ``` + + will become + + ```json + { + "dataType": [ "text" ], + "description": "string", + "moduleConfig": { + "text2vec-contextionary": { + "skip": true, + "vectorizePropertyName": true, + } + }, + "name": "string", + "indexInverted": true + } + ``` + +#### RESTful /meta endpoint + +The `/v1/meta` object now contains module specific information at in the newly introduced namespaced `modules.` property: + +From + +```json +{ + "hostname": "string", + "version": "string", + "contextionaryWordCount": 0, + "contextionaryVersion": "string" +} +``` + +to + +```json +{ + "hostname": "string", + "version": "string", + "modules": { + "text2vec-contextionary": { + "wordCount": 0, + "version": "string" + } + } +} +``` + +#### Modular classification + +Some classification types are tied to modules (e.g. the former "contextual" classification is tied to the `text2vec-contextionary` module. We make a distinction between fields which are always present and those which are type dependent. Additionally the API is improved by grouping `settings` and `filters` in separate properties. kNN classification is the only type of classification that is present with Weaviate Core without dependency on modules. The former "contextual" classification is tied to the `text2vec-contextionary` module, see [here](#text2vec-contextionary). An example of how the change looks like in the classification API POST body: + +From + +```json +{ + "class": "City", + "classifyProperties": ["inCountry"], + "basedOnProperties": ["description"], + "type": "knn", + "k": 3, + "sourceWhere": { … }, + "trainingSetWhere": { … }, + "targetWhere": { … }, +} + +``` + +To + +```json +{ + "class": "City", + "classifyProperties": ["inCountry"], + "basedOnProperties": ["description"], + "type": "knn", + "settings": { + "k": 3 + }, + "filters": { + "sourceWhere": { … }, + "trainingSetWhere": { … }, + "targetWhere": { … }, + } +} +``` + +And the API GET body: + +From + +```json +{ + "id": "ee722219-b8ec-4db1-8f8d-5150bb1a9e0c", + "class": "City", + "classifyProperties": ["inCountry"], + "basedOnProperties": ["description"], + "status": "running", + "meta": { … }, + "type": "knn", + "k": 3, + "sourceWhere": { … }, + "trainingSetWhere": { … }, + "targetWhere": { … }, +} +``` + +To + +```json +{ + "id": "ee722219-b8ec-4db1-8f8d-5150bb1a9e0c", + "class": "City", + "classifyProperties": ["inCountry"], + "basedOnProperties": ["description"], + "status": "running", + "meta": { … }, + "type": "knn", + "settings": { + "k": 3 + }, + "filters": { + "sourceWhere": { … }, + "trainingSetWhere": { … }, + "targetWhere": { … }, + } +} +``` + +#### text2vec-contextionary +The Contextionary becomes the first vectorization module of Weaviate, renamed to `text2vec-contextionary` in formal use. This brings the following changes: +1. **RESTful** endpoint `/v1/c11y` changes to `v1/modules/text2vec-contextionary`: + * `/v1/c11y/concepts` to `/v1/modules/text2vec-contextionary/concepts` + * `/v1/c11y/extensions` to `/v1/modules/text2vec-contextionary/extensions` + * `/v1/c11y/corpus` is removed +2. **Data schema:** `text2vec-contextionary`-specific module configuration options in the schema definition + 1. **Per-class**. `"vectorizeClassName"` indicates whether the class name should be taken into the vector calculation of data objects. + + ```json + { + "class": "Article", + "moduleConfig": { + "text2vec-contextionary": { + "vectorizeClassName": true + } + }, + "description": "string", + "vectorizer": "text2vec-contextionary", + "properties": [ … ] + } + ``` + + 2. **Per-property.** `skip` tells whether to skip the entire property (including value) from the vector position of the data object. `vectorizePropertyName` indicates whether the property name should be taken into the vector calculation of data objects. + + ```json + { + "dataType": [ "text" ], + "description": "string", + "moduleConfig": { + "text2vec-contextionary": { + "skip": true, + "vectorizePropertyName": true, + } + }, + "name": "string", + "indexInverted": true + } + ``` +3. **Contextual classification**. Contextual classification is dependent on the module `text2vec-contextionary`. It can be activated in `/v1/classifications/` the following with the classification name `text2vec-contextionary-contextual`: + +From + +```json +{ + "class": "City", + "classifyProperties": ["inCountry"], + "basedOnProperties": ["description"], + "type": "contextual", + "informationGainCutoffPercentile": 30, + "informationGainMaximumBoost": 3, + "tfidfCutoffPercentile": 80, + "minimumUsableWords": 3, + "sourceWhere": { … }, + "trainingSetWhere": { … }, + "targetWhere": { … }, +} +``` + +To + +```json +{ + "class": "City", + "classifyProperties": ["inCountry"], + "basedOnProperties": ["description"], + "type": "text2vec-contextionary-contextual", + "settings": { + "informationGainCutoffPercentile": 30, + "informationGainMaximumBoost": 3, + "tfidfCutoffPercentile": 80, + "minimumUsableWords": 3 + }, + "filters": { + "sourceWhere": { … }, + "trainingSetWhere": { … }, + "targetWhere": { … } + } +} +``` + +#### Default vectorizer module +The default vectorizer module can be specified in a new environment variable so that this doesn't have to be specified on every data class in the schema. The environment variable is `DEFAULT_VECTORIZER_MODULE`, which can be set to for example `DEFAULT_VECTORIZER_MODULE="text2vec-contextionary"`. + + +### Official release notes +Official release notes can be found on [GitHub](https://github.com/weaviate/weaviate/releases/tag/0.23.0). + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/more-resources/migration/index.md b/developers/weaviate/more-resources/migration/index.md index 6ad50decab..28ff4e1dc3 100644 --- a/developers/weaviate/more-resources/migration/index.md +++ b/developers/weaviate/more-resources/migration/index.md @@ -5,898 +5,59 @@ image: og/docs/more-resources.jpg # tags: ['migration'] --- +## Upgrades -## Migration for version 1.19.0 +Weaviate is under active development, with new features and improvements being added regularly, including bugfixes. To take advantage of these updates, we recommend upgrading your Weaviate instance regularly. -This version introduces `indexFilterable` and `indexSearchable` variables for the new text indexes, whose values will be set based on the value of `indexInverted`. +### General upgrade instructions -Since filterable & searchable are separate indexes, filterable does not exist in Weaviate instances upgraded from pre-`v1.19` to `v1.19`. The missing `filterable` index can be created though on startup for all `text/text[]` properties if env variable `INDEX_MISSING_TEXT_FILTERABLE_AT_STARTUP` is set. +When upgrading Weaviate, we recommend that you: -## Changelog for version v1.9.0 +1. Create a complete [backup](../../configuration/backups.md) of your current Weaviate instance before beginning any upgrade process. +1. Plan to upgrade one minor version at a time, always using the latest patch version of each minor release. -* no breaking changes +This approach of upgrading one minor version at a time helps to minimize the risk of issues during the upgrade process, by mirroring our testing and release process. Upgrading to the latest patch version of each minor release ensures that you have the latest bugfixes and improvements. -* *New Features* - * ### First Multi-modal module: CLIP Module (#1756, #1766) - This release [introduces the `multi2vec-clip` integration](/developers/weaviate/model-providers/transformers/embeddings-multimodal.md), a module that allows for multi-modal vectorization within a single vector space. A class can have `image` or `text` fields or both. Similarly, the module provides both a `nearText` and a `nearImage` search and allows for various search combinations, such as text-search on image-only content and various other combinations. +### Version-specific migration guides - #### How to use +- When upgrading to version `1.25.x` from `1.24.x` (or lower), you must perform a [Raft migration](#raft-migration-v1250). +- When upgrading to version `1.26.x` or higher (from the preceding version), ensure that the cluster metadata is synchronized. + - To do so, poll the `/cluster/statistics` endpoint, and check that the correct number of nodes are reporting statistics, and the `synchronized` flag is showing `true`, before proceeding with the upgrade. + - For an example implementation, see the [`wait_for_raft_sync` function here](https://github.com/weaviate/weaviate-local-k8s/blob/main/utilities/helpers.sh). - The following is a valid payload for a class that vectorizes both images and text fields: - ```json - { - "class": "ClipExample", - "moduleConfig": { - "multi2vec-clip": { - "imageFields": [ - "image" - ], - "textFields": [ - "name" - ], - "weights": { - "textFields": [0.7], - "imageFields": [0.3] - } - } - }, - "vectorIndexType": "hnsw", - "vectorizer": "multi2vec-clip", - "properties": [ - { - "dataType": [ - "text" - ], - "name": "name" - }, - { - "dataType": [ - "blob" - ], - "name": "image" - } - ] - } - ``` +:::tip Scenario: upgrading from `v1.25.10` to `v1.27` - Note that: - - `imageFields` and `textFields` in `moduleConfig.multi2vec-clip` do not both need to be set. However at least one of both must be set. - - `weights` in `moduleConfig.multi2vec-clip` is optional. If only a single property the property takes all the weight. If multiple properties exist and no weights are specified, the properties are equal-weighted. +Between `v1.25` and `v1.27`, there are two minor versions, `v1.26` and `v1.27`. So: +
- You can then import data objects for the class as usual. Fill the `text` or `string` fields with text and/or fill the `blob` fields with a base64-encoded image. +1. Create a backup of your current Weaviate instance. +1. Go to the [Weaviate releases page](https://github.com/weaviate/weaviate/tags): + 1. Find the latest `v1.26` patch version (e.g.: `1.26.11`). + 1. Find the latest `v1.27` patch version (e.g.: `1.27.5`). +1. Upgrade to the latest patch version of `v1.26`. +1. Upgrade to the latest patch version of `v1.27`. - #### Limitations - * As of `v1.9.0` the module requires explicit creation of a class. If you rely on auto-schema to create the class for you, it will be missing the required configuration about which fields should be vectorized. This will be addressed in a future release. +::: -* *Fixes* - * fix an error where deleting a class with `geoCoordinates` could lead to a panic due to missing cleanup (#1730) - * fix an issue where an error in a module would not be forwarded to the user (#1754) - * fix an issue where a class could not be deleted on some file system (e.g. AWS EFS) (#1757) +### Raft Migration (v1.25.0+) +Weaviate `v1.25.0` introduced Raft [as the consensus algorithm for cluster metadata](../../concepts/replication-architecture/cluster-architecture.md#metadata-replication-raft). This requires a one-time migration of the cluster metadata. -## Migration to version v1.8.0 +In [Docker-based self-hosted instances](../../installation/docker-compose.md), the migration is automatic. -### Migration Notice +In [Kubernetes-based self-hosted instances](../../installation/kubernetes.md), you must perform a manual migration step. For more information, see the [Weaviate `v1.25.0` migration guide](./weaviate-1-25.md). -Version `v1.8.0` introduces multi-shard indexes and horizontal scaling. As a -result the dataset needs to be migrated. This migration is performed automatically - -without user interaction - when first starting up with Weaviate version -`v1.8.0`. However, it cannot be reversed. We, therefore, recommend carefully -reading the following migration notes and making a case-by-case decision about the -best upgrade path for your needs. +This was a significant change to the Weaviate architecture. Accordingly, we suggest performing another backup after upgrading to `v1.25.latest`, before proceeding with further upgrades to ensure that you have a recent backup. -#### Why is a data migration necessary? +### Backup Restoration Fix (v1.23.13+) -Prior to `v1.8.0` Weaviate did not support multi-shard indexes. The feature was -already planned, therefore data was already contained in a single shard with a -fixed name. A migration is necessary to move the data from a single fixed shard -into a multi-shard setup. The amount of shards is not changed. When you run -`v1.8.0` on a dataset the following steps happen automatically: - -* Weaviate discovers the missing sharding configuration for your classes and fills it with the default values -* When shards start-up and they do not exist on disk, but a shard with a fixed - name from `v1.7.x` exists, Weaviate automatically recognizes that a migration - is necessary and moves the data on disk -* When Weaviate is up and running the data has been migrated. - -**Important Notice:** As part of the migration Weaviate will assign the shard -to the (only) node available in the cluster. You need to make sure that this -node has a stable hostname. If you run on Kubernetes, hostnames are stable -(e.g. `weaviate-0` for the first node). However with `Docker Compose` hostnames -default to the id of the container. If you remove your containers (e.g. -`docker compose down`) and start them up again, the hostname will have changed. -This will lead to errors where Weaviate mentions that it cannot find the node -that the shard belongs to. The node sending the error message is the node that -owns the shard itself, but it cannot recognize it, since its own name has -changed. - -To remedy this, you can set a stable hostname **before starting up with -v1.8.0** by setting the env var `CLUSTER_HOSTNAME=node1`. The actual name does -not matter, as long as it's stable. - -If you forgot to set a stable hostname and are now running into the error -mentioned above, you can still explicitly set the hostname that was used before -which you can derive from the error message. - -Example: - -If you see the error message `"shard Knuw6a360eCY: resolve node name -\"5b6030dbf9ea\" to host"`, you can make Weaviate usable again, by setting -`5b6030dbf9ea` as the host name: `CLUSTER_HOSTNAME=5b6030dbf9ea`. - -#### Should you upgrade or reimport? - -In addition to new features, `v1.8.0` also contains a large collection of -bugfixes. Some of the bugs affect how Weaviate writes the HNSW index to disk. -A pre-1.18.0 index on disk may not be as good a freshly built `v1.8.0` index. -If you can import using a script, we generally recommend starting with a fresh -`v1.8.0` instance and reimporting instead of migrating. - -#### Is downgrading possible after upgrading? - -Note that the data migration which happens at the first startup of v1.8.0 is -not automatically reversible. If you plan on downgrading to `v1.7.x` again -after upgrading, you must explicitly create a backup of the state prior to -upgrading. - -### Changelog - - -## Changelog for version v1.7.2 -* No breaking changes -* New features - * ### Array Datatypes (#1691) - Added `boolean[]` and `date[]`. - * ### Make property names less strict (#1562) - Property names in a data schema allows: `/[_A-Za-z][_0-9A-Za-z]*/`. i.e. it will allow for using underscores, will allow numbers and will fix the issue about trailing upper-case characters. But it won't allow for many other special characters, such as dash (-) or language-specific characters like Umlauts, etc, due to GraphQL restrictions. -* Bug fixes - * ### Aggregation on array data type (#1686) - - -## Changelog for version v1.7.0 -* No breaking changes -* New features - * ### Array Datatypes (#1611) - Starting with this release, primitive object properties are no longer limited to individual properties, but can also include lists of primitives. Array types can be stored, filtered and aggregated in the same way as other primitives. - - Auto-schema will automatically recognize lists of `string`/`text` and `number`/`int`. You can also explicitly specify lists in the schema by using the following data types `string[]`, `text[]`, `int[]`, `number[]`. A type that is assigned to be an array, must always stay an array, even if it only contains a single element. - - * ### New Module: `text-spellcheck` - Check and autocorrect misspelled search terms (#1606) - Use the new spellchecker module to verify user-provided search queries (in existing `nearText` or `ask` functions) are spelled correctly and even suggest alternative, correct spellings. Spell-checking happens at query time. - - There are two ways to use this module: - 1. It provides a new additional property which can be used to check (but not alter) the provided queries: - The following query: - ```graphql - { - Get { - Post(nearText: { - concepts: "missspelled text" - }) { - content - _additional { - spellCheck { - changes { - corrected - original - } - didYouMean - location - originalText - } - } - } - } - } - ``` - - will produce results similar to the following: - - ``` - "_additional": { - "spellCheck": [ - { - "changes": [ - { - "corrected": "misspelled", - "original": "missspelled" - } - ], - "didYouMean": "misspelled text", - "location": "nearText.concepts[0]", - "originalText": "missspelled text" - } - ] - }, - "content": "..." - }, - ``` - 2. It extends existing `text2vec-*` modules with an `autoCorrect` flag, which can be used to automatically correct the query if misspelled. - - * ### New Module `ner-transformers` - Extract entities from Weaviate using transformers (#1632) - Use transformer-based models to extract entities from your existing Weaviate objects on the fly. Entity extraction happens at query time. Note that for maximum performance, transformer-based models should run with GPUs. CPUs can be used, but the throughput will be lower. - - To make use of the module's capabilities, simply extend your query with the following new `_additional` property: - - ```graphql - { - Get { - Post { - content - _additional { - tokens( - properties: ["content"], # is required - limit: 10, # optional, int - certainty: 0.8 # optional, float - ) { - certainty - endPosition - entity - property - startPosition - word - } - } - } - } - } - - ``` - It will return results similar to the following: - - ``` - "_additional": { - "tokens": [ - { - "property": "content", - "entity": "PER", - "certainty": 0.9894614815711975, - "word": "Sarah", - "startPosition": 11, - "endPosition": 16 - }, - { - "property": "content", - "entity": "LOC", - "certainty": 0.7529033422470093, - "word": "London", - "startPosition": 31, - "endPosition": 37 - } - ] - } - ``` -* Bug fixes - * Aggregation can get stuck when aggregating `number` datatypes (#1660) - -## Changelog for version 1.6.0 -* No breaking changes -* No new features - * **Zero Shot Classification (#1603)** This release adds a new classification type `zeroshot` that works with any `vectorizer` or custom vectors. It picks the label objects that have the lowest distance to the source objects. The link is made using cross-references, similar to existing classifications in Weaviate. To start a `zeroshot` classification use `"type": "zeroshot"` in your `POST /v1/classficiations` request and specify the properties you want classified normally using `"classifyProperties": [...]`. As zero shot involves no training data, you cannot set `trainingSetWhere` filters, but can filter both source (`"sourceWhere"`) and label objects (`"targetWhere"`) directly. -* Bug fixes - - -## Changelog for version 1.5.2 - -* No breaking changes -* No new features -* Bug fixes: -* ### Fix possible data races (`short write`) (#1643) - This release fixes various possible data races that could in the worst case lead to an unrecoverable error `"short write"`. The possibility for those races was introduced in `v.1.5.0` and we highly recommend anyone running on the `v1.5.x` timeline to upgrade to `v1.5.2` immediately. - -## Changelog for version 1.5.1 - -* No breaking changes -* No new features -* Bug fixes: -* ### Crashloop after unexpected crash in HNSW commit log (#1635) - If Weaviate was killed (e.g. OOMKill) while writing the commit log, it could not be parsed after the next restart anymore, thus ending up in a crashloop. This fix removes this. Note that no data will be lost on such a crash: The partially written commit log has not yet been acknowledged to the user, so no write guarantees have been given yet. It is therefore safe to discard. - -* ### Chained Like operator not working (#1638) - Prior to this fix, when chaining `Like` operators in `where` filters where each `valueString` or `valueText` contained a wildcard (`*`), typically only the first operator's results where reflected. This fix makes sure that the chaining (`And` or `Or`) is reflected correctly. This bug did not affect other operators (e.g. `Equal`, `GreaterThan`, etc) and only affected those `Like` queries where a wildcard was used. - -* ### Fix potential data race in Auto Schema features (#1636) - This fix improves incorrect synchronization on the auto schema feature which in extreme cases could lead to a data race. - -## Migration to version 1.5.0 - -### Migration Notice -*This release does not contain any API-level breaking changes, however, it changes the entire storage mechanism inside Weaviate. As a result, an in-place update is not possible. When upgrading from previous versions, a new setup needs to be created and all data reimported. Prior backups are not compatible with this version.* - -### Changelog -* No breaking changes -* New Features: - * *LSM-Tree based Storage*. Previous releases of Weaviate used a B+Tree based storage mechanism. This was not fast enough to keep up with the high write speed requirements of a large-scale import. This release completely rewrites the storage layer of Weaviate to use a custom LSM-tree approach. This leads to considerably faster import times, often more than 100% faster than the previous version. - * *Auto-Schema Feature*. Import data objects without creating a schema prior to import. The classes will be created automatically, they can still be adjusted manually. Weaviate will guess the property type based on the first time it sees a property. The defaults can be configured using the environment variables outlined in #1539. The feature is on by default, but entirely non-breaking. You can still create an explicit schema at will. -* Fixes: - * *Improve Aggregation Queries*. Reduces the amount of allocations required for some aggregation queries, speeding them up and reduces the amount of timeouts encountered during aggregations. - - -Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.5.0) for all the changes. - - -## Changelog for version 1.4.0 - -* No breaking changes -* New Features: - * Image Module [`img2vec-neural`](/developers/weaviate/modules/img2vec-neural.md) - * Add Hardware acceleration for `amd64` CPUs (Intel, AMD) - * Support `arm64` technology for entire Weaviate stack - * Set `ef` at search time - * Introduce new dataType `blob` - * Skip vector-indexing a class -* Fixes: - * Various Performance Fixes around the HNSW Vector Index - * Make property order consistent when vectorizing - * Fix issues around `PATCH` API when using custom vectors - * Detect schema settings that will most likely lead to duplicate vectors and print warning - * Fix missing schema validation on transformers module - -Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.4.0) for all the changes. - - -## Changelog for version 1.3.0 - -* No breaking changes -* New feature: [Question Answering (Q&A) Module](/developers/weaviate/modules/qna-transformers.md) -* New feature: New Meta Information for all transformer-based modules - -Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.3.0) for all the changes. - -## Changelog for version 1.2.0 - -* No breaking changes -* New feature: Introduction of the [Transformer Module](/developers/weaviate/modules/qna-transformers.md) - -Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.2.0) for all the changes. - -## Changelog for version 1.1.0 - -* No breaking changes -* New feature: GraphQL `nearObject` search to get most similar object. -* Architectural update: Cross-reference batch import speed improvements. - -Check [this github page](https://github.com/weaviate/weaviate/releases/tag/v1.1.0) for all the changes. - -## Migration to version 1.0.0 - -Weaviate version 1.0.0 was released on 12 January 2021, and consists of the major update of modularization. From version 1.0.0, Weaviate is modular, meaning that the underlying structure relies on a *pluggable* vector index, *pluggable* vectorization modules with possibility to extend with *custom* modules. - -Weaviate release 1.0.0 from 0.23.2 comes with a significant amount of breaking changes in the data schema, API and clients. Here is an overview of all (breaking) changes. - -For client library specific changes, take a look at the change logs of the specific client ([Go](/developers/weaviate/client-libraries/go.md#change-logs), [Python](/developers/weaviate/client-libraries/python/index.md#change-logs) and [TypeScript/JavaScript](/developers/weaviate/client-libraries/typescript/index.mdx#changelog). - -Moreover, a new version of the Console is released. Visit the Console documentation for more information. - -### Summary -This contains most overall changes, but not all details. Those are documented in ["Changes"](#changes). - -#### All RESTful API changes -* from `/v1/schema/things/{ClassName}` to `/v1/schema/{ClassName}` -* from `/v1/schema/actions/{ClassName} `to `/v1/schema/{ClassName}`from `/v1/schema/actions/{ClassName} `to `/v1/schema/{ClassName}` -* from `/v1/things` to `/v1/objects` -* from `/v1/actions` to `/v1/objects` -* from `/v1/batching/things` to `/v1/batch/objects` -* from `/v1/batching/actions` to `/v1/batch/objects` -* from `/v1/batching/references` to `/v1/batch/references` -* Additional data object properties are grouped in `?include=...` and the leading underscore of these properties is removed -* The `/v1/modules/` endpoint is introduced. -* the `/v1/meta/` endpoint now contains module specific information in `"modules"` - -#### All GraphQL API changes -* Removal of Things and Actions layer in query hierarchy -* Reference properties of data objects are lowercase (previously uppercased) -* Underscore properties, uuid and certainty are now grouped in the object `_additional` -* `explore()` filter is renamed to `near` filter -* `nearVector(vector:[])` filter is introduced in `Get{}` query -* `Explore (concepts: ["foo"]){}` query is changed to `Explore (near: ... ) {}`. - -#### All data schema changes -* Removal of Things and Actions -* Per class and per property configuration is changed to support modules and vector index type settings. - -#### All data object changes -* From `schema` to `properties` in the data object. - -#### Contextionary -* Contextionary is renamed to the module `text2vec-contextionary` -* `/v1/c11y/concepts` to `/v1/modules/text2vec-contextionary/concepts` -* `/v1/c11y/extensions` to `/v1/modules/text2vec-contextionary/extensions` -* `/v1/c11y/corpus` is removed - -#### Other -* Removal of `/things` and `/actions` in short and long beacons -* Classification body is changed to support modularization -* `DEFAULT_VECTORIZER_MODULE` is a new environment variable - -### Changes - -#### Removal of Things and Actions -`Things` and `Actions` are removed from the Data Schema. This comes with the following changes in the schema definition and API endpoints: -1. **Data schema:** The `semantic kind` (`Things` and `Actions`) is removed from the Schema Endpoint. This means the URLs will change: - * from `/v1/schema/things/{ClassName}` to `/v1/schema/{ClassName}` - * from `/v1/schema/actions/{ClassName} `to `/v1/schema/{ClassName}` -1. **Data RESTful API endpoint:** The `semantic kind` (`Things` and `Actions`) is removed from the data Endpoint. Instead it will be namespaced as `/objects`. This means the URLs will change: - * from `/v1/things` to `/v1/objects` - * from `/v1/actions` to `/v1/objects` - * from `/v1/batching/things`to `/v1/batch/objects` (see also the [change in batching](#renaming-batching-to-batch)) - * from `/v1/batching/actions`to `/v1/batch/objects` (see also the [change in batching](#renaming-batching-to-batch)) -1. **GraphQL:** The `Semantic Kind` "level" in the query hierarchy will be removed without replacement (In `Get` and `Aggregate` queries), i.e. - ```graphql - { - Get { - Things { - ClassName { - propName - } - } - } - } - ``` - - will become - - ```graphql - { - Get { - ClassName { - propName - } - } - } - ``` -1. **Data Beacons:** The `Semantic Kind` will be removed from beacons: - * **Short-form Beacon:** - - * `weaviate://localhost/things/4fbacd6e-1153-47b1-8cb5-f787a7f01718` - - to - - * `weaviate://localhost/4fbacd6e-1153-47b1-8cb5-f787a7f01718` - - * **Long-form Beacon:** - - * `weaviate://localhost/things/ClassName/4fbacd6e-1153-47b1-8cb5-f787a7f01718/propName` - - to - - * `weaviate://localhost/ClassName/4fbacd6e-1153-47b1-8cb5-f787a7f01718/propName` - -#### Renaming /batching/ to /batch/ - -* `/v1/batching/things` to `/v1/batch/objects` -* `/v1/batching/actions` to `/v1/batch/objects` -* `/v1/batching/references` to `/v1/batch/references` - - -#### From "schema" to "properties" in data object - -The name "schema" on the data object is not intuitive and is replaced by "properties". The change looks like: - -```json -{ - "class": "Article", - "schema": { - "author": "Jane Doe" - } -} -``` - -to - -```json -{ - "class": "Article", - "properties": { - "author": "Jane Doe" - } -} -``` - -#### Consistent casing in GraphQL properties - -Previously, reference properties in the schema definitions are always lowercase, yet in graphQL they needed to be uppercased. E.g.: `Article { OfAuthor { … on Author { name } } } }`, even though the property is defined as ofAuthor. New is that the casing in GraphQL reflects exactly the casing in the schema definition, thus the above example would become: `Article { ofAuthor { … on Author { name } } } }` - -#### Additional data properties in GraphQL and RESTful API -Since modularization, a module can contribute to the additional properties of a data object (thus are not fixed), which should be retrievable by the GraphQL and/or RESTful API. -1. **REST**: `additional` properties (formerly named `"underscore"` properties) can be included in RESTful query calls like `?include=...`, e.g. `?include=classification`. The underscores will thus be removed from the names (e.g. `?include=_classification` is deprecated). In the Open API specifications, all additional properties will be grouped in the object `additional`. For example: - ```json - { - "class": "Article", - "schema": { ... }, - "_classification": { … } - } - ``` - - to - - ```json - { - "class": "Article", - "properties": { ... }, - "additional": { - "classification": { ... } - } - } - ``` -2. **GraphQL**: `"underscore"` properties are renamed to `additional` properties in GraphQL queries. - 1. All former `"underscore"` properties of a data object (e.g. `_certainty`) are now grouped in the `_additional {}` object (e.g. `_additional { certainty } `). - 2. The `uuid` property is now also placed in the `_additional {}` object and renamed to `id` (e.g. `_additional { id } `). - This example covers both changes: - - From - - ```graphql - { - Get { - Things { - Article { - title - uuid - certainty - _classification - } - } - } - } - ``` - - to - - ```graphql - { - Get { - Article { - title - _additional { # leading _ prevents clashes - certainty - id # replaces uuid - classification - } - } - } - } - ``` - -#### Modules RESTful endpoint -With the modularization of Weaviate, the `v1/modules/` endpoint is introduced. - -#### GraphQL semantic search - -With the modularization, it becomes possible to vectorize non-text objects. Search is no longer restricted to use the Contextionary's vectorization of text and data objects, but could also be applied to non-text objects or raw vectors. The formerly 'explore' filter in Get queries and 'Explore' queries in GraphQL were tied to text, but the following changes are made to this filter with the new version of Weaviate: - -1. The filter `Get ( explore: {} ) {}` is renamed to `Get ( near: {} ) {}`. - 1. New: `Get ( nearVector: { vector: [.., .., ..] } ) {}` is module independent and will thus always be available. - 2. `Get ( explore { concepts: ["foo"] } ) {}` will become `Get ( nearText: { concepts: ["foo"] } ) {}` and is only available if the `text2vec-contextionary` module is attached. - - From - - ```graphql - { - Get { - Things { - Article (explore: { concepts: ["foo"] } ) { - title - } - } - } - } - ``` - - to - - ```graphql - { - Get { - Article (near: ... ) { - title - } - } - } - ``` - -2. Similarly to the explore sorter that is used in the `Get {}` API, the `Explore {}` API also assumes text. The following change is applied: - - From - - ```graphql - { - Explore (concepts: ["foo"]) { - beacon - } - } - ``` - - to - - ```graphql - { - Explore (near: ... ) { - beacon - } - } - ``` - -#### Data schema configuration -1. **Per-class configuration** - - With modularization, it is possible to configure per class the vectorizer module, module-specific configuration for the overall class, vector index type, and vector index type specific configuration: - * The `vectorizer` indicates which module (if any) are responsible for vectorization. - * The `moduleConfig` allows configuration per module (by name). - * See [here](#text2vec-contextionary) for Contextionary specific property configuration. - * The `vectorIndexType` allows the choosing the vector index (defaults to [HNSW](/developers/weaviate/concepts/vector-index.md#hnsw)) - * The `vectorIndexConfig` is an arbitrary object passed to the index for config (defaults can be found [here](/developers/weaviate/config-refs/schema/vector-index.md#how-to-configure-hnsw) ) - - All changes are in this example: - - ```json - { - "class": "Article", - "vectorizeClassName": true, - "description": "string", - "properties": [ … ] - } - ``` - - will become - - ```json - { - "class": "Article", - "vectorIndexType": "hnsw", # defaults to hnsw - "vectorIndexConfig": { - "efConstruction": 100 - }, - "moduleConfig": { - "text2vec-contextionary": { - "vectorizeClassName": true - }, - "encryptor5000000": { "enabled": true } # example - }, - "description": "string", - "vectorizer": "text2vec-contextionary", # default is configurable - "properties": [ … ] - } - ``` - -2. **Per-property configuration** - - With modularization, it is possible to configure per property module-specific configuration per property if available and it can be specified if a property should be included in the inverted index. - * The `moduleConfig` allows configuration per module (by name). - * See [here](#text2vec-contextionary) for Contextionary specific property configuration. - * `index` will become `indexInverted`: a boolean that indicates whether a property should be indexed in the inverted index. - - All changes are in this example: - - ```json - { - "dataType": [ "text" ], - "description": "string", - "cardinality": "string", - "vectorizePropertyName": true, - "name": "string", - "keywords": [ … ], - "index": true - } - ``` - - will become - - ```json - { - "dataType": [ "text" ], - "description": "string", - "moduleConfig": { - "text2vec-contextionary": { - "skip": true, - "vectorizePropertyName": true, - } - }, - "name": "string", - "indexInverted": true - } - ``` - -#### RESTful /meta endpoint - -The `/v1/meta` object now contains module specific information at in the newly introduced namespaced `modules.` property: - -From - -```json -{ - "hostname": "string", - "version": "string", - "contextionaryWordCount": 0, - "contextionaryVersion": "string" -} -``` - -to - -```json -{ - "hostname": "string", - "version": "string", - "modules": { - "text2vec-contextionary": { - "wordCount": 0, - "version": "string" - } - } -} -``` - -#### Modular classification - -Some classification types are tied to modules (e.g. the former "contextual" classification is tied to the `text2vec-contextionary` module. We make a distinction between fields which are always present and those which are type dependent. Additionally the API is improved by grouping `settings` and `filters` in separate properties. kNN classification is the only type of classification that is present with Weaviate Core without dependency on modules. The former "contextual" classification is tied to the `text2vec-contextionary` module, see [here](#text2vec-contextionary). An example of how the change looks like in the classification API POST body: - -From - -```json -{ - "class": "City", - "classifyProperties": ["inCountry"], - "basedOnProperties": ["description"], - "type": "knn", - "k": 3, - "sourceWhere": { … }, - "trainingSetWhere": { … }, - "targetWhere": { … }, -} - -``` - -To - -```json -{ - "class": "City", - "classifyProperties": ["inCountry"], - "basedOnProperties": ["description"], - "type": "knn", - "settings": { - "k": 3 - }, - "filters": { - "sourceWhere": { … }, - "trainingSetWhere": { … }, - "targetWhere": { … }, - } -} -``` - -And the API GET body: - -From - -```json -{ - "id": "ee722219-b8ec-4db1-8f8d-5150bb1a9e0c", - "class": "City", - "classifyProperties": ["inCountry"], - "basedOnProperties": ["description"], - "status": "running", - "meta": { … }, - "type": "knn", - "k": 3, - "sourceWhere": { … }, - "trainingSetWhere": { … }, - "targetWhere": { … }, -} -``` - -To - -```json -{ - "id": "ee722219-b8ec-4db1-8f8d-5150bb1a9e0c", - "class": "City", - "classifyProperties": ["inCountry"], - "basedOnProperties": ["description"], - "status": "running", - "meta": { … }, - "type": "knn", - "settings": { - "k": 3 - }, - "filters": { - "sourceWhere": { … }, - "trainingSetWhere": { … }, - "targetWhere": { … }, - } -} -``` - -#### text2vec-contextionary -The Contextionary becomes the first vectorization module of Weaviate, renamed to `text2vec-contextionary` in formal use. This brings the following changes: -1. **RESTful** endpoint `/v1/c11y` changes to `v1/modules/text2vec-contextionary`: - * `/v1/c11y/concepts` to `/v1/modules/text2vec-contextionary/concepts` - * `/v1/c11y/extensions` to `/v1/modules/text2vec-contextionary/extensions` - * `/v1/c11y/corpus` is removed -2. **Data schema:** `text2vec-contextionary`-specific module configuration options in the schema definition - 1. **Per-class**. `"vectorizeClassName"` indicates whether the class name should be taken into the vector calculation of data objects. - - ```json - { - "class": "Article", - "moduleConfig": { - "text2vec-contextionary": { - "vectorizeClassName": true - } - }, - "description": "string", - "vectorizer": "text2vec-contextionary", - "properties": [ … ] - } - ``` - - 2. **Per-property.** `skip` tells whether to skip the entire property (including value) from the vector position of the data object. `vectorizePropertyName` indicates whether the property name should be taken into the vector calculation of data objects. - - ```json - { - "dataType": [ "text" ], - "description": "string", - "moduleConfig": { - "text2vec-contextionary": { - "skip": true, - "vectorizePropertyName": true, - } - }, - "name": "string", - "indexInverted": true - } - ``` -3. **Contextual classification**. Contextual classification is dependent on the module `text2vec-contextionary`. It can be activated in `/v1/classifications/` the following with the classification name `text2vec-contextionary-contextual`: - -From - -```json -{ - "class": "City", - "classifyProperties": ["inCountry"], - "basedOnProperties": ["description"], - "type": "contextual", - "informationGainCutoffPercentile": 30, - "informationGainMaximumBoost": 3, - "tfidfCutoffPercentile": 80, - "minimumUsableWords": 3, - "sourceWhere": { … }, - "trainingSetWhere": { … }, - "targetWhere": { … }, -} -``` - -To - -```json -{ - "class": "City", - "classifyProperties": ["inCountry"], - "basedOnProperties": ["description"], - "type": "text2vec-contextionary-contextual", - "settings": { - "informationGainCutoffPercentile": 30, - "informationGainMaximumBoost": 3, - "tfidfCutoffPercentile": 80, - "minimumUsableWords": 3 - }, - "filters": { - "sourceWhere": { … }, - "trainingSetWhere": { … }, - "targetWhere": { … } - } -} -``` - -#### Default vectorizer module -The default vectorizer module can be specified in a new environment variable so that this doesn't have to be specified on every data class in the schema. The environment variable is `DEFAULT_VECTORIZER_MODULE`, which can be set to for example `DEFAULT_VECTORIZER_MODULE="text2vec-contextionary"`. - - -### Official release notes -Official release notes can be found on [GitHub](https://github.com/weaviate/weaviate/releases/tag/0.23.0). +Before `v1.23.13`, there was a bug with the backup restoration process, which could lead to data not being stored correctly. +If you are upgrading from a version before `v1.23.13`, we recommend that you: +1. Create a backup of your current Weaviate instance. +2. Upgrade to at least `v1.23.13` (preferably to `v1.23.16`) or higher, using the [general upgrade instructions above](#general-upgrade-instructions). +3. Restore your backup to the upgraded instance. ## Questions and feedback diff --git a/developers/weaviate/more-resources/migration/weaviate-1-25.md b/developers/weaviate/more-resources/migration/weaviate-1-25.md index f263740cd4..b110c686eb 100644 --- a/developers/weaviate/more-resources/migration/weaviate-1-25.md +++ b/developers/weaviate/more-resources/migration/weaviate-1-25.md @@ -17,24 +17,28 @@ This migration guide assumes that you have: ## Migration overview -Weaviate `1.25` introduces [Raft](https://raft.github.io/) as the consensus algorithm for its database schema, in order to improve its fault tolerance. This change requires a migration of the entire schema. +Weaviate `1.25` introduces [Raft](https://raft.github.io/) as the consensus algorithm for its cluster metadata, in order to improve its fault tolerance. This change requires a migration of the entire metadata. + +:::tip cluster metadata and schema +The cluster metadata was previously referred to as the `schema`. We now use the term `metadata`, and use `schema` to refer to the data model of the Weaviate instance, such as classes, properties, etc. +::: As a result, to migrate from a pre-`1.25` version of Weaviate to `1.25` on kubernetes, you must follow these steps: - Delete the deployed [`StatefulSet`](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/) - Update the helm chart to version `17.0.0` or higher - Re-deploy Weaviate -- Wait for schema migration to complete +- Wait for cluster metadata migration to complete For more details, refer to the [upgrade instructions](#upgrade-instructions) below. -To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the schema. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. +To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the metadata. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. For more details, refer to the [downgrade instructions](#downgrade-instructions) below. :::caution Cluster downtime -This upgrade requires a schema migration. The cluster requires some downtime for the migration. The length of the downtime depends on the size of the database. +This upgrade requires a cluster metadata migration. The cluster requires some downtime for the migration. The length of the downtime depends on the size of the database.
We suggest performing this upgrade at a least disruptive time, or even provisioning a secondary cluster while the main cluster is being restarted. @@ -156,11 +160,11 @@ If the number of objects under `statistics` matches the number of replicas you h ## Downgrade instructions -If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the schema. +If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the cluster metadata. -### 1. Downgrade schema +### 1. Downgrade cluster metadata -Perform the following request to downgrade the schema. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) +Perform the following request to downgrade the cluster metadata. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) ```bash curl -X POST -s -o /dev/null -w "%{http_code}" localhost:8080/v1/cluster/schema-v1 @@ -170,7 +174,7 @@ This should return a `200` status code. ### 2. Delete StatefulSet -After downgrading the schema, delete the existing StatefulSet. This will delete all the pods in the namespace. +After downgrading the cluster metadata, delete the existing StatefulSet. This will delete all the pods in the namespace. ```bash kubectl delete sts weaviate -n weaviate diff --git a/developers/weaviate/quickstart/img/create_cluster.png b/developers/weaviate/quickstart/img/create_cluster.png index f8a5ef1e42..53941b9939 100644 Binary files a/developers/weaviate/quickstart/img/create_cluster.png and b/developers/weaviate/quickstart/img/create_cluster.png differ diff --git a/developers/weaviate/quickstart/img/create_sandbox.png b/developers/weaviate/quickstart/img/create_sandbox.png index f069ab0a96..ae33257fa6 100644 Binary files a/developers/weaviate/quickstart/img/create_sandbox.png and b/developers/weaviate/quickstart/img/create_sandbox.png differ diff --git a/developers/weaviate/quickstart/img/enable_embeddings.png b/developers/weaviate/quickstart/img/enable_embeddings.png new file mode 100644 index 0000000000..74796a3f08 Binary files /dev/null and b/developers/weaviate/quickstart/img/enable_embeddings.png differ diff --git a/developers/weaviate/quickstart/index.md b/developers/weaviate/quickstart/index.md index c619ff342b..b0b15d61db 100644 --- a/developers/weaviate/quickstart/index.md +++ b/developers/weaviate/quickstart/index.md @@ -1,11 +1,12 @@ --- -title: Quickstart +title: Quickstart (with cloud resources) sidebar_position: 0 image: og/docs/quickstart-tutorial.jpg # tags: ['getting started'] hide_table_of_contents: true --- +# Quickstart: with cloud resources import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -15,32 +16,71 @@ import TabItem from '@theme/TabItem'; :::info What you will learn -In this quickstart guide, you will: +This quickstart shows you how to combine Weaviate Cloud and Cohere to: -1. Set up Weaviate. (10 minutes) -1. Populate the database. (10 minutes) +1. Set up a Weaviate instance. (10 minutes) +1. Add and vectorize your data. (10 minutes) 1. Perform a semantic search and retrieval augmented generation (RAG). (10 minutes) +```mermaid +flowchart LR + %% Define nodes with white backgrounds and darker borders + A1["Create Weaviate\nSandbox"] --> A2["Install client\nlibrary"] + A2 --> A3["Connect to\nWeaviate"] + A3 --> B1["Define collection\n(with an inference API)"] + B1 --> B2["Batch import\nobjects"] + B2 --> C1["Semantic search\n(nearText)"] + C1 --> C2["RAG\n(Generate)"] + + %% Group nodes in subgraphs with brand colors + subgraph sg1 ["1. Setup"] + A1 + A2 + A3 + end + + subgraph sg2 ["2. Populate"] + B1 + B2 + end + + subgraph sg3 ["3. Query"] + C1 + C2 + end + + %% Style nodes with white background and darker borders + style A1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style A2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style A3 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style B1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style B2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style C1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style C2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraphs with brand colors + style sg1 fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 + style sg2 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 + style sg3 fill:#ffffff,stroke:#7AD6EB,stroke-width:2px,color:#130C49 +``` + +Notes: + +- The code examples here are self-contained. You can copy and paste them into your own environment to try them out. + +- If you prefer to use locally hosted resources, see [Quickstart: locally hosted](./local.md). ::: ### Prerequisites -This tutorial uses a Sandbox instance on [Weaviate Cloud](https://console.weaviate.cloud), and an [OpenAI](https://platform.openai.com/) API key. +You will need accounts with [Weaviate Cloud](https://console.weaviate.cloud) and [Cohere](https://dashboard.cohere.com/). We will use free tiers (Weaviate Sandbox and Cohere trial API key) of both services. -The Weaviate Sandbox is free, but the OpenAI usage may incur a small cost (e.g. < 10c US). If you have another, preferred [model provider](../model-providers/index.md), you can use that instead. - -:::note For Python users -We have ([a Jupyter notebook](https://github.com/weaviate-tutorials/quickstart/blob/main/quickstart_end_to_end.ipynb)) available, or you can try it on [Google Colab](https://colab.research.google.com/github/weaviate-tutorials/quickstart/blob/main/quickstart_end_to_end.ipynb). -::: +If you have another, preferred [model provider](../model-providers/index.md), you can use that instead of Cohere.
-:::tip Try it yourself -The code examples here are self-contained. You can copy and paste them into your own environment to try them out. -::: - ## Step 1: Set up Weaviate ### 1.1 Create a Weaviate database @@ -196,8 +236,8 @@ A collection is a set of objects that share the same data structure, like a tabl ::: The following example creates a *collection* called `Question` with: - - OpenAI [embedding model integration](../model-providers/openai/embeddings.md) to create vectors during ingestion & queries. - - OpenAI [generative AI integrations](../model-providers/openai/generative.md) for retrieval augmented generation (RAG). + - Cohere [embedding model integration](../model-providers/cohere/embeddings.md) to create vectors during ingestion & queries. + - Cohere [generative AI integrations](../model-providers/cohere/generative.md) for retrieval augmented generation (RAG). import CreateCollection from '/_includes/code/quickstart/quickstart.create_collection.mdx' @@ -205,34 +245,36 @@ import CreateCollection from '/_includes/code/quickstart/quickstart.create_colle Run this code to create the collection to which you can add data. +:::info What models are being used? +You can optionally specify the model in the collection definition. As we did not specify models in the collection definition above, these integrations will use the Weaviate-defined default models. +
+ +See the [model providers integration](../model-providers/index.md) section for more information. +::: +
Do you prefer a different setup? Weaviate is very flexible. If you prefer a different model provider integration, or prefer to import your own vectors, see one of the following guides: -
-
-
-
-
-

Prefer a different model provider?

-
-
- See this section for information on how to user another provider, such as AWS, Cohere, Google, and many more. -
+
+
+
+

Prefer a different model provider?

+
+
+ See this section for information on how to user another provider, such as AWS, Cohere, Google, and many more.
-
-
-
-
-

Want to specify object vectors?

-
-
- If you prefer to add vectors yourself along with the object data, see Starter Guide: Bring Your Own Vectors. -
+
+
+
+

Want to specify object vectors?

+
+
+ If you prefer to add vectors yourself along with the object data, see Starter Guide: Bring Your Own Vectors.
@@ -258,8 +300,8 @@ import ImportObjects from '/_includes/code/quickstart/quickstart.import_objects. Run this code to add the demo data. -:::info OpenAI API key in the header -Note that this code includes an additional header for the OpenAI API key. Weaviate uses this key to generate vector embeddings for the data objects as they are being added. +:::info Cohere API key in the header +Note that this code includes an additional header for the Cohere API key. Weaviate uses this key to generate vector embeddings for the data objects as they are being added. :::
@@ -304,8 +346,39 @@ If you inspect the full response, you will see that the word `biology` does not Even so, Weaviate was able to return biology-related entries. This is made possible by *vector embeddings* that capture meaning. Under the hood, semantic search is powered by vectors, or vector embeddings. +Here is a diagram showing the workflow in Weaviate. + +```mermaid +flowchart LR + Query["🔍 Search:\n'biology'"] + + subgraph sg1 ["Vector Search"] + direction LR + VS1["Convert query\nto vector"] --> VS2["Find similar\nvectors"] + VS2 --> VS3["Return top\nmatches"] + end + + subgraph sg2 ["Results"] + R1["Most similar\ndocuments"] + end + + Query --> VS1 + VS3 --> R1 + + %% Style nodes with white background and darker borders + style Query fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS3 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style R1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraphs with brand colors + style sg1 fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 + style sg2 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + :::info Where did the vectors come from? -Weaviate used the OpenAI API key to generate a vector embedding for each object during import. During the query, Weaviate similarly converted the query (`biology`) into a vector. +Weaviate used the Cohere API key to generate a vector embedding for each object during import. During the query, Weaviate similarly converted the query (`biology`) into a vector. As we mentioned above, this is optional. See [Starter Guide: Bring Your Own Vectors](/developers/weaviate/starter-guides/custom-vectors.mdx) if you would prefer to provide your own vectors. ::: @@ -320,7 +393,59 @@ Weaviate is capable of many types of searches. See, for example, our how-to guid Retrieval augmented generation (RAG), also called generative search, combines the power of generative AI models such as large language models (LLMs) with the up-to-date truthfulness of a database. -RAG work by prompting a large language model (LLM) with a combination of a *user query* and *data retrieved from a database*. +RAG works by prompting a large language model (LLM) with a combination of a *user query* and *data retrieved from a database*. + +This diagram shows the RAG workflow in Weaviate. + +```mermaid +flowchart LR + subgraph sg0 ["Weaviate Query"] + direction TB + Search["🔍 Search: \n'biology'"] + Prompt["✍️ Prompt: \n'Write a\ntweet...'"] + end + + subgraph sg1 ["Vector Search"] + direction LR + VS1["Convert query\nto vector"] --> VS2["Find similar\nvectors"] + VS2 --> VS3["Return top\nmatches"] + end + + subgraph sg2 ["Generation"] + direction LR + G1["Send\n(results + prompt)\nto LLM"] + G1 --> G2["Generate\nresponse"] + end + + subgraph sg3 ["Results"] + direction TB + R1["Most similar\ndocuments"] + R2["Generated\ncontent"] + end + + Search --> VS1 + VS3 --> R1 + Prompt --> G1 + VS3 --> G1 + G2 --> R2 + + %% Style nodes with white background and darker borders + style Search fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Prompt fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS3 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style G1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style G2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style R1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style R2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraphs with brand colors + style sg0 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 + style sg1 fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 + style sg2 fill:#ffffff,stroke:#7AD6EB,stroke-width:2px,color:#130C49 + style sg3 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` The following example combines the same search (for `biology`) with a prompt to generate a tweet. @@ -369,7 +494,7 @@ Try these additional resources to learn more about Weaviate:
@@ -381,7 +506,7 @@ Try these additional resources to learn more about Weaviate:
@@ -393,7 +518,7 @@ Try these additional resources to learn more about Weaviate:
@@ -426,7 +551,7 @@ We provide answers to some common questions, or potential issues below.
See answer -In this example, we use the `OpenAI` inference API. But you can use others. +In this example, we use the `Cohere` inference API. But you can use others. If you do want to change the embeddings, or the generative AI integrations, you can. You will need to: - Ensure that the Weaviate module is available in the Weaviate instance you are using, @@ -473,7 +598,7 @@ You should see: { "class": "Question", ... // truncated additional information here - "vectorizer": "text2vec-openai" + "vectorizer": "text2vec-cohere" } ] } diff --git a/developers/weaviate/quickstart/local.md b/developers/weaviate/quickstart/local.md new file mode 100644 index 0000000000..1a2846c594 --- /dev/null +++ b/developers/weaviate/quickstart/local.md @@ -0,0 +1,578 @@ +--- +title: Locally hosted +sidebar_position: 0 +image: og/docs/quickstart-tutorial.jpg +# tags: ['getting started'] +hide_table_of_contents: true +--- + +# Quickstart: locally hosted + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Expected time: 30 minutes Prerequisites: None +

+ +:::info What you will learn + +This quickstart shows you how to combine open-source Weaviate and Ollama to: + +1. Set up a Weaviate instance. (10 minutes) +1. Add and vectorize your data. (10 minutes) +1. Perform a semantic search and retrieval augmented generation (RAG). (10 minutes) + +```mermaid +flowchart LR + %% Define nodes with white backgrounds and darker borders + A1["Run Weaviate\nwith Docker"] --> A2["Install client\nlibrary"] + A2 --> A3["Connect to\nWeaviate"] + A3 --> B1["Define collection\n(with Ollama)"] + B1 --> B2["Batch import\nobjects"] + B2 --> C1["Semantic search\n(nearText)"] + C1 --> C2["RAG\n(Generate)"] + + %% Group nodes in subgraphs with brand colors + subgraph sg1 ["1. Setup"] + A1 + A2 + A3 + end + + subgraph sg2 ["2. Populate"] + B1 + B2 + end + + subgraph sg3 ["3. Query"] + C1 + C2 + end + + %% Style nodes with white background and darker borders + style A1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style A2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style A3 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style B1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style B2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style C1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style C2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraphs with brand colors + style sg1 fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 + style sg2 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 + style sg3 fill:#ffffff,stroke:#7AD6EB,stroke-width:2px,color:#130C49 +``` + +Notes: + +- The code examples here are self-contained. You can copy and paste them into your own environment to try them out. + +- If you prefer to use cloud-based resources, see [Quickstart: with cloud resources](./local.md). +::: + + + +### Prerequisites + +Before we get started, install [Docker](https://docs.docker.com/get-started/get-docker/) and [Ollama](https://ollama.com/download) on your machine. + +Then, download the `nomic-embed-text` and `llama3.2` models by running the following command: + +```bash +ollama pull nomic-embed-text +ollama pull llama3.2 +``` + +We will be running Weaviate and language models locally. We recommend that you use a modern computer with at least 8GB or RAM, preferably 16GB or more. + +
+ +## Step 1: Set up Weaviate + +### 1.1 Create a Weaviate database + +Save the following code to a file named `docker-compose.yml` in your project directory. + +```yaml +--- +services: + weaviate: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 50051:50051 + volumes: + - weaviate_data:/var/lib/weaviate + restart: on-failure:0 + environment: + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama' + CLUSTER_HOSTNAME: 'node1' +volumes: + weaviate_data: +... +``` + +Run the following command to start a Weaviate instance using Docker: + +```bash +docker-compose up -d +``` + +### 1.2 Install a client library + +We recommend using a [client library](../client-libraries/index.md) to work with Weaviate. Follow the instructions below to install one of the official client libraries, available in [Python](../client-libraries/python/index.md), [JavaScript/TypeScript](../client-libraries/typescript/index.mdx), [Go](../client-libraries/go.md), and [Java](../client-libraries/java.md). + +import CodeClientInstall from '/_includes/code/quickstart/clients.install.mdx'; + + + +### 1.3: Connect to Weaviate + +Now you can connect to your Weaviate instance. + +The example below shows how to connect to Weaviate and perform a basic operation, like checking the cluster status. + +import ConnectIsReady from '/_includes/code/quickstart/local.quickstart.is_ready.mdx' + + + +If you did not see any errors, you are ready to proceed. We will replace the simple cluster status check with more meaningful operations in the next steps. + +
+ +## Step 2: Populate the database + +Now, we can populate our database by first defining a collection then adding data. + +### 2.1 Define a collection + +:::info What is a collection? +A collection is a set of objects that share the same data structure, like a table in relational databases or a collection in NoSQL databases. A collection also includes additional configurations that define how the data objects are stored and indexed. +::: + +The following example creates a *collection* called `Question` with: + - Ollama [embedding model integration](../model-providers/ollama/embeddings.md) to create vectors during ingestion & queries, using the `nomic-embed-text` model, and + - Ollama [generative AI integrations](../model-providers/ollama/generative.md) for retrieval augmented generation (RAG), using the `llama3.2` model. + +import CreateCollection from '/_includes/code/quickstart/local.quickstart.create_collection.mdx' + + + +Run this code to create the collection to which you can add data. + +
+ Do you prefer a different setup? + +Weaviate is very flexible. If you prefer a different model provider integration, or prefer to import your own vectors, see one of the following guides: + +
+
+
+
+

Prefer a different model provider?

+
+
+ See this section for information on how to user another provider, such as AWS, Cohere, Google, and many more. +
+
+
+
+
+
+

Want to specify object vectors?

+
+
+ If you prefer to add vectors yourself along with the object data, see Starter Guide: Bring Your Own Vectors. +
+
+
+
+ +
+ +### 2.2 Add objects + +We can now add data to our collection. + +The following example: +- Loads objects, and +- Adds objects to the target collection (`Question`) using a batch process. + +:::tip Batch imports +([Batch imports](../manage-data/import.mdx)) are the most efficient way to add large amounts of data, as it sends multiple objects in a single request. See the [How-to: Batch import](../manage-data/import.mdx) guide for more information. +::: + +import ImportObjects from '/_includes/code/quickstart/local.quickstart.import_objects.mdx' + + + +Run this code to add the demo data. + +
+ +## Step 3: Queries + +Weaviate provides a wide range of query tools to help you find the right data. We will try a few searches here. + +### 3.1 Semantic search + +Semantic search finds results based on meaning. This is called `nearText` in Weaviate. + +The following example searches for 2 objects whose meaning is most similar to that of `biology`. + +import QueryNearText from '/_includes/code/quickstart/local.quickstart.query.neartext.mdx' + + + +Run this code to perform the query. Our query found entries for `DNA` and `species`. + +
+ Example full response in JSON format + +```json +{ + { + "answer": "DNA", + "question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance", + "category": "SCIENCE" + }, + { + "answer": "species", + "question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification", + "category": "SCIENCE" + } +} +``` + +
+ +If you inspect the full response, you will see that the word `biology` does not appear anywhere. + +Even so, Weaviate was able to return biology-related entries. This is made possible by *vector embeddings* that capture meaning. Under the hood, semantic search is powered by vectors, or vector embeddings. + +Here is a diagram showing the workflow in Weaviate. + +```mermaid +flowchart LR + Query["🔍 Search:\n'biology'"] + + subgraph sg1 ["Vector Search"] + direction LR + VS1["Convert query\nto vector"] --> VS2["Find similar\nvectors"] + VS2 --> VS3["Return top\nmatches"] + end + + subgraph sg2 ["Results"] + R1["Most similar\ndocuments"] + end + + Query --> VS1 + VS3 --> R1 + + %% Style nodes with white background and darker borders + style Query fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS3 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style R1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraphs with brand colors + style sg1 fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 + style sg2 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + +:::info Where did the vectors come from? +Weaviate used the locally hosted Ollama model to generate a vector embedding for each object during import. During the query, Weaviate similarly converted the query (`biology`) into a vector. + +As we mentioned above, this is optional. See [Starter Guide: Bring Your Own Vectors](/developers/weaviate/starter-guides/custom-vectors.mdx) if you would prefer to provide your own vectors. +::: + +:::tip More search types available + +Weaviate is capable of many types of searches. See, for example, our how-to guides on [similarity searches](../search/similarity.md), [keyword searches](../search/bm25.md), [hybrid searches](../search/hybrid.md), and [filtered searches](../search/filters.md). + +::: + +### 3.2 Retrieval augmented generation + +Retrieval augmented generation (RAG), also called generative search, combines the power of generative AI models such as large language models (LLMs) with the up-to-date truthfulness of a database. + +RAG works by prompting a large language model (LLM) with a combination of a *user query* and *data retrieved from a database*. + +This diagram shows the RAG workflow in Weaviate. + +```mermaid +flowchart LR + subgraph sg0 ["Weaviate Query"] + direction TB + Search["🔍 Search: \n'biology'"] + Prompt["✍️ Prompt: \n'Write a\ntweet...'"] + end + + subgraph sg1 ["Vector Search"] + direction LR + VS1["Convert query\nto vector"] --> VS2["Find similar\nvectors"] + VS2 --> VS3["Return top\nmatches"] + end + + subgraph sg2 ["Generation"] + direction LR + G1["Send\n(results + prompt)\nto LLM"] + G1 --> G2["Generate\nresponse"] + end + + subgraph sg3 ["Results"] + direction TB + R1["Most similar\ndocuments"] + R2["Generated\ncontent"] + end + + Search --> VS1 + VS3 --> R1 + Prompt --> G1 + VS3 --> G1 + G2 --> R2 + + %% Style nodes with white background and darker borders + style Search fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Prompt fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style VS3 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style G1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style G2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style R1 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style R2 fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraphs with brand colors + style sg0 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 + style sg1 fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 + style sg2 fill:#ffffff,stroke:#7AD6EB,stroke-width:2px,color:#130C49 + style sg3 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + +The following example combines the same search (for `biology`) with a prompt to generate a tweet. + +import QueryRAG from '/_includes/code/quickstart/local.quickstart.query.rag.mdx' + + + +Run this code to perform the query. Here is one possible response (your response will likely be different). + +```text +🧬 In 1953 Watson & Crick built a model of the molecular structure of DNA, the gene-carrying substance! 🧬🔬 + +🦢 2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new species! 🦢🌿 #ScienceFacts #DNA #SpeciesClassification +``` + +The response should be new, yet familiar. This because you have seen the entries above for `DNA` and `species` in the [semantic search](#semantic-search) section. + +The power of RAG comes from the ability to transform your own data. Weaviate helps you in this journey by making it easy to perform a combined search & generation in just a few lines of code. + +
+ +## Recap + +In this quickstart guide, you: + +- Created a Serverless Weaviate sandbox instance on Weaviate Cloud. +- Defined a collection and added data. +- Performed queries, including: + - Semantic search, and + - Retrieval augmented generation. + +Where to go next is up to you. We include some suggested steps and resources below. + +
+ +## Next + +Try these additional resources to learn more about Weaviate: + +
+
+
+
+
+

More on search

+
+
+

+ See how to perform searches, such as keyword, similarity, hybrid, image, filtered and reranked searches. +

+
+
+
+
+
+
+

Manage data

+
+ +
+
+
+
+
+

RAG

+
+ +
+
+
+
+
+

Workshops and office hours

+
+
+

+ We hold in-person and online workshops, office hours and events for different experience levels. Join us! +

+
+
+
+
+
+ +
+ +## FAQs & Troubleshooting + +We provide answers to some common questions, or potential issues below. + +### Questions + +#### Can I use different integrations? + +
+ See answer + +In this example, we use the `OpenAI` inference API. But you can use others. + +If you do want to change the embeddings, or the generative AI integrations, you can. You will need to: +- Ensure that the Weaviate module is available in the Weaviate instance you are using, +- Modify your collection definition to use your preferred integration, and +- Make sure to use the right API key(s) (if necessary) for your integration. + +See the [model providers integration](../model-providers/index.md) section for more information. + +
+ +### Troubleshooting + +#### If you see Error: Name 'Question' already used as a name for an Object class + +
+ See answer + +You may see this error if you try to create a collection that already exists in your instance of Weaviate. In this case, you can follow these instructions to delete the collection. + +import CautionSchemaDeleteClass from '/_includes/schema-delete-class.mdx' + + + +
+ +#### How to confirm collection creation + +
+ See answer + +If you are not sure whether the collection has been created, check the [`schema`](/developers/weaviate/api/rest#tag/schema) endpoint. + +Replace WEAVIATE_INSTANCE_URL with your instance's REST Endpoint URL.: + +``` +https://WEAVIATE_INSTANCE_URL/v1/schema +``` + +You should see: + +```json +{ + "classes": [ + { + "class": "Question", + ... // truncated additional information here + "vectorizer": "text2vec-openai" + } + ] +} +``` + +Where the schema should indicate that the `Question` collection has been added. + +:::note REST & GraphQL in Weaviate +Weaviate uses a combination of RESTful and GraphQL APIs. In Weaviate, RESTful API endpoints can be used to add data or obtain information about the Weaviate instance, and the GraphQL interface to retrieve data. +::: + +
+ +#### How to confirm data import + +
+ See answer + +To confirm successful data import, check the [`objects`](/developers/weaviate/api/rest#tag/objects) endpoint to verify that all objects are imported. + +Replace WEAVIATE_INSTANCE_URL with your instance REST Endpoint URL: + +``` +https://WEAVIATE_INSTANCE_URL/v1/objects +``` + +You should see: + +```json +{ + "deprecations": null, + "objects": [ + ... // Details of each object + ], + "totalResults": 10 // You should see 10 results here +} +``` + +Where you should be able to confirm that you have imported all `10` objects. + +
+ +#### If the `nearText` search is not working + +
+ See answer + +To perform text-based (`nearText`) similarity searches, you need to have a vectorizer enabled, and configured in your collection. + +Make sure the vectorizer is configured [like this](#define-a-data-collection). + +If the search still doesn't work, [contact us](#questions-and-feedback)! + +
+ + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/developers/weaviate/release-notes/index.md b/developers/weaviate/release-notes/index.md index 1b4d44b69f..6221cc0950 100644 --- a/developers/weaviate/release-notes/index.md +++ b/developers/weaviate/release-notes/index.md @@ -5,1008 +5,27 @@ image: og/docs/more-resources.jpg # tags: ['release notes'] --- - -This page lists [developer release notes](https://github.com/weaviate/weaviate/releases) for the Weaviate database and the client libraries. +This page lists [developer release notes](https://github.com/weaviate/weaviate/releases) for the Weaviate core and client libraries. - To see the GitHub release notes for a particular version, click on the version number. - For expanded blog posts on recent minor releases, follow the links in the table of contents at the left of this page. +- For more information on upgrading Weaviate, see the [Migration Guide](../more-resources/migration/index.md). -### Current core and client releases - -This table lists the latest Weaviate core release versions and available client libraries. - -| Weaviate Version | Release Date | Python | TypeScript
JavaScript | Go | Java | -| :- | :- | :-: | :-: | :-: | :-: | -| [1.26.6][c1.26.6] | 2024-10-08 | [4.8.1][p4.8.1] | [3.1.4][ts3.1.4] | [4.15.1][g4.15.1] | [4.8.3][j4.8.3] | -| [1.26.5][c1.26.5] | 2024-09-27 | '' | '' | '' | '' | -| [1.26.4][c1.26.4] | 2024-09-06 | [4.7.1][p4.7.1] | '' | '' | [4.8.2][j4.8.2] | -| [1.26.3][c1.26.3] | 2024-08-29 | '' | '' | '' | '' | -| [1.26.2][c1.26.2] | 2024-08-29 | '' | '' | '' | '' | -| [1.26.1][c1.26.1] | 2024-07-23 | [4.6.6][p4.6.6] | [3.0.8][ts3.0.8] | [4.14.2][g4.14.2] | [4.8.0][j4.8.0] | -| [1.26.0][c1.26.0] | 2024-07-22 | '' | '' | '' | [4.7.0][j4.7.0] | - -### Previous core and client releases - -For links to the matrix of previous core and client releases, expand this section. - -
- Releases +### Weaviate core and client releases -| Weaviate Version | Release Date | Python | TypeScript
JavaScript | Go | Java | -| :- | :- | :-: | :-: | :-: | :-: | -| [1.25.0][c1.25.0] | 2024-05-10 | [4.6.0][p4.6.0] | [2.1.1][ts2.1.1] | [4.13.1][g4.13.1] | [4.6.0][j4.6.0] | -| [1.24.0][c1.24.0] | 2024-02-27 | [4.5.1][p4.5.1] | [2.0.0][ts2.0.0] | '' | '' | -| [1.23.0][c1.23.0] | 2023-12-18 | [3.26.0][p3.26.0] | '' | '' | [4.4.2][j4.4.2] | -| [1.22.0][c1.22.0] | 2023-10-27 | [3.25.0][p3.25.0] | [1.5.0][ts1.5.0] | [4.10.0][g4.10.0] | [4.3.0][j4.3.0] | -| [1.21.0][c1.21.0] | 2023-08-17 | [3.22.1][p3.22.1] | [1.4.0][ts1.4.0] | [4.9.0][g4.9.0] | [4.2.1][j4.2.1] | -| [1.20.0][c1.20.0] | 2023-07-06 | [3.22.0][p3.22.0] | '' | '' | [4.2.0][j4.2.0] | -| [1.19.0][c1.19.0] | 2023-05-04 | [3.17.0][p3.17.0] | [1.1.0][ts1.1.0][1](#typescriptChange)| [4.7.1][g4.7.1] | [4.0.1][j4.0.1] | -| [1.18.0][c1.18.0] | 2023-03-07 | [3.13.0][p3.13.0] | [2.14.5][js2.14.5] | [4.6.2][g4.6.2] | [3.6.4][j3.6.4] | -| [1.17.0][c1.17.0] | 2022-12-20 | [3.9.0][p3.9.0] | [2.14.0][js2.14.0] | [4.5.0][g4.5.0] | [3.5.0][j3.5.0] | -| [1.16.0][c1.16.0] | 2022-10-31 | [3.8.0][p3.8.0] | [2.13.0][js2.13.0] | [4.4.0][g4.4.0] | [3.4.0][j3.4.0] | -| [1.15.0][c1.15.0] | 2022-09-07 | '' | [2.12.0][js2.12.0] | [4.3.0][g4.3.0] | [3.3.0][j3.3.0] | -| [1.14.0][c1.14.0] | 2022-07-07 | [3.6.0][p3.6.0] | [2.11.0][js2.11.0] | [4.2.0][g4.2.0] | [3.2.0][j3.2.0] | -| [1.13.0][c1.13.0] | 2022-05-03 | [3.4.2][p3.4.2] | [2.9.0][js2.9.0] | [4.0.0][g4.0.0] | [2.4.0][j2.4.0] | -| [1.12.0][c1.12.0] | 2022-04-05 | [3.4.0][p3.4.0] | [2.8.0][js2.8.0] | [3.0.0][g3.0.0] | '' | -| [1.11.0][c1.11.0] | 2022-03-14 | [3.2.5][p3.2.5] | [2.7.0][js2.7.0] | [2.6.0][g2.6.0] | [2.3.0][j2.3.0] | -| [1.10.0][c1.10.0] | 2022-01-27 | '' | [2.5.0][js2.5.0] | [2.4.1][g2.4.1] | [2.1.1][j2.1.1] | -| [1.9.0][c1.9.0] | 2021-12-10 | '' | '' | [2.4.0][g2.4.0] | [2.1.0][j2.1.0] | -| [1.8.0][c1.8.0] | 2021-11-30 | '' | '' | '' | '' | -| [1.7.0][c1.7.0] | 2021-09-01 | [3.1.1][p3.1.1] | [2.4.0][js2.4.0] | [2.3.0][g2.3.0] | [1.1.0][j1.1.0] | -| [1.6.0][c1.6.0] | 2021-08-11 | [2.4.0][p2.4.0] | [2.3.0][js2.3.0] | [2.2.0][g2.2.0] | '' | -| [1.5.0][c1.5.0] | 2021-07-13 | '' | '' | '' | '' | -| [1.4.0][c1.4.0] | 2021-06-09 | '' | '' | '' | '' | -| [1.3.0][c1.3.0] | 2021-04-23 | '' | [2.1.0][js2.1.0] | [2.1.0][g2.1.0] | [1.0.0][j1.0.0] | -| [1.2.0][c1.2.0] | 2021-03-15 | [2.2.0][p2.2.0] | [2.0.0][js2.0.0] | [1.1.0][g1.1.0] | - | -| [1.1.0][c1.1.0] | 2021-02-10 | [2.1.0][p2.1.0] | '' | '' | - | -| [1.0.0][c1.0.0] | 2021-01-14 | [2.0.0][p2.0.0] | '' | '' | - | +import ReleaseHistory from '/_includes/release-history.md'; -Note: The TypeScript client replaced the JavaScript client on 2023-03-17. - -
+ ## Weaviate Core -For links to the Weaviate Core releases, expand this section. - -
- Releases - - | Weaviate Version | Release Date | - | :- | :- | - | [1.26.6][c1.26.6] | 2024-10-08 | - | [1.26.5][c1.26.5] | 2024-09-27 | - | [1.26.4][c1.26.4] | 2024-09-06 | - | [1.26.3][c1.26.3] | 2024-08-29 | - | [1.26.2][c1.26.2] | 2024-08-29 | - | [1.26.1][c1.26.1] | 2024-07-23 | - | [1.26.0][c1.26.0] | 2024-07-22 | - | [1.25.20][c1.25.20] | 2024-10-08 | - | [1.25.19][c1.25.19] | 2024-10-02 | - | [1.25.18][c1.25.18] | 2024-09-26 | - | [1.25.17][c1.25.17] | 2024-09-13 | - | [1.25.16][c1.25.16] | 2024-09-12 | - | [1.25.15][c1.25.15] | 2024-09-10 | - | [1.25.14][c1.25.14] | 2024-09-05 | - | [1.25.13][c1.25.13] | 2024-08-19 | - | [1.25.12][c1.25.12] | 2024-08-19 | - | [1.25.11][c1.25.11] | 2024-08-05 | - | [1.25.10][c1.25.10] | 2024-07-31 | - | [1.25.9][c1.25.9] | 2024-07-26 | - | [1.25.8][c1.25.8] | 2024-07-18 | - | [1.25.7][c1.25.7] | 2024-07-04 | - | [1.25.6][c1.25.6] | 2024-06-28 | - | [1.25.5][c1.25.5] | 2024-06-24 | - | [1.25.4][c1.25.4] | 2024-06-13 | - | [1.25.3][c1.25.3] | 2024-06-11 | - | [1.25.2][c1.25.2] | 2024-05-31 | - | [1.25.1][c1.25.1] | 2024-05-17 | - | [1.25.0][c1.25.0] | 2024-05-10 | - | [1.24.25][c1.24.25] | 2024-09-26 | - | [1.24.24][c1.24.24] | 2024-09-06 | - | [1.24.23][c1.24.23] | 2024-08-20 | - | [1.24.22][c1.24.22] | 2024-08-08 | - | [1.24.21][c1.24.21] | 2024-07-18 | - | [1.24.20][c1.24.20] | 2024-07-09 | - | [1.24.19][c1.24.19] | 2024-06-13 | - | [1.24.18][c1.24.18] | 2024-06-12 | - | [1.24.17][c1.24.17] | 2024-06-06 | - | [1.24.16][c1.24.16] | 2024-06-06 | - | [1.24.15][c1.24.15] | 2024-05-29 | - | [1.24.14][c1.24.14] | 2024-05-17 | - | [1.24.13][c1.24.13] | 2024-05-15 | - | [1.24.12][c1.24.12] | 2024-05-09 | - | [1.24.11][c1.24.11] | 2024-05-07 | - | [1.24.10][c1.24.10] | 2024-04-19 | - | [1.24.9][c1.24.9] | 2024-04-17 | - | [1.24.8][c1.24.8] | 2024-04-08 | - | [1.24.7][c1.24.7] | 2024-04-05 | - | [1.24.6][c1.24.6] | 2024-03-26 | - | [1.24.5][c1.24.5] | 2024-03-21 | - | [1.24.4][c1.24.4] | 2024-03-15 | - | [1.24.3][c1.24.3] | 2024-03-14 | - | [1.24.2][c1.24.2] | 2024-03-13 | - | [1.24.1][c1.24.1] | 2024-03-01 | - | [1.24.0][c1.24.0] | 2024-02-27 | - | [1.23.16][c1.23.16] | 2024-05-29 | - | [1.23.15][c1.23.15] | 2024-05-17 | - | [1.23.14][c1.23.14] | 2024-03-26 | - | [1.23.13][c1.23.13] | 2024-03-14 | - | [1.23.12][c1.23.12] | 2024-03-11 | - | [1.23.11][c1.23.11] | 2024-03-04 | - | [1.23.10][c1.23.10] | 2024-02-20 | - | [1.23.9][c1.23.9] | 2024-02-13 | - | [1.23.8][c1.23.8] | 2024-02-08 | - | [1.23.7][c1.23.7] | 2024-01-30 | - | [1.23.6][c1.23.6] | 2024-01-26 | - | [1.23.5][c1.23.5] | 2024-01-25 | - | [1.23.4][c1.23.4] | 2024-01-22 | - | [1.23.3][c1.23.3] | 2024-01-15 | - | [1.23.2][c1.23.2] | 2024-01-08 | - | [1.23.1][c1.23.1] | 2024-01-05 | - | [1.23.0][c1.23.0] | 2023-12-18 | - | [1.22.13][c1.22.13] | 2024-03-11 | - | [1.22.12][c1.22.12] | 2024-03-04 | - | [1.22.11][c1.22.11] | 2024-01-23 | - | [1.22.10][c1.22.10] | 2024-01-22 | - | [1.22.9][c1.22.9] | 2024-01-05 | - | [1.22.8][c1.22.8] | 2023-12-18 | - | [1.22.7][c1.22.7] | 2023-12-13 | - | [1.22.6][c1.22.6] | 2023-12-06 | - | [1.22.5][c1.22.5] | 2023-11-24 | - | [1.22.4][c1.22.4] | 2023-11-15 | - | [1.22.3][c1.22.3] | 2023-11-07 | - | [1.22.2][c1.22.2] | 2023-11-01 | - | [1.22.1][c1.22.1] | 2023-10-30 | - | [1.22.0][c1.22.0] | 2023-10-27 | - | [1.21.9][c1.21.9] | 2023-11-01 | - | [1.21.8][c1.21.8] | 2023-10-25 | - | [1.21.7][c1.21.7] | 2023-10-19 | - | [1.21.6][c1.21.6] | 2023-10-13 | - | [1.21.5][c1.21.5] | 2023-09-30 | - | [1.21.4][c1.21.4] | 2023-09-25 | - | [1.21.3][c1.21.3] | 2023-09-13 | - | [1.21.2][c1.21.2] | 2023-08-30 | - | [1.21.1][c1.21.1] | 2023-08-22 | - | [1.21.0][c1.21.0] | 2023-08-17 | - | [1.20.6][c1.20.6] | 2023-08-22 | - | [1.20.5][c1.20.5] | 2023-08-05 | - | [1.20.4][c1.20.4] | 2023-08-01 | - | [1.20.3][c1.20.3] | 2023-07-26 | - | [1.20.2][c1.20.2] | 2023-07-19 | - | [1.20.1][c1.20.1] | 2023-07-13 | - | [1.20.0][c1.20.0] | 2023-07-06 | - | [1.19.13][c1.19.13] | 2023-08-22 | - | [1.19.12][c1.19.12] | 2023-07-06 | - | [1.19.11][c1.19.11] | 2023-06-29 | - | [1.19.10][c1.19.10] | 2023-06-28 | - | [1.19.9][c1.19.9] | 2023-06-22 | - | [1.19.8][c1.19.8] | 2023-06-14 | - | [1.19.7][c1.19.7] | 2023-06-12 | - | [1.19.6][c1.19.6] | 2023-05-24 | - | [1.19.5][c1.19.5] | 2023-05-18 | - | [1.19.4][c1.19.4] | 2023-05-17 | - | [1.19.3][c1.19.3] | 2023-05-12 | - | [1.19.2][c1.19.2] | 2023-05-11 | - | [1.19.1][c1.19.1] | 2023-05-10 | - | [1.19.0][c1.19.0] | 2023-05-04 | - | [1.18.6][c1.18.6] | 2023-08-22 | - | [1.18.5][c1.18.5] | 2023-05-17 | - | [1.18.4][c1.18.4] | 2023-04-24 | - | [1.18.3][c1.18.3] | 2023-04-04 | - | [1.18.2][c1.18.2] | 2023-03-24 | - | [1.18.1][c1.18.1] | 2023-03-16 | - | [1.18.0][c1.18.0] | 2023-03-07 | - | [1.17.6][c1.17.6] | 2023-03-07 | - | [1.17.5][c1.17.5] | 2023-02-28 | - | [1.17.4][c1.17.4] | 2023-02-19 | - | [1.17.3][c1.17.3] | 2023-02-07 | - | [1.17.2][c1.17.2] | 2023-01-26 | - | [1.17.1][c1.17.1] | 2023-01-17 | - | [1.17.0][c1.17.0] | 2022-12-20 | - | [1.16.9][c1.16.9] | 2022-12-18 | - | [1.16.8][c1.16.8] | 2022-12-16 | - | [1.16.7][c1.16.7] | 2022-12-15 | - | [1.16.6][c1.16.6] | 2022-12-06 | - | [1.16.5][c1.16.5] | 2022-11-21 | - | [1.16.4][c1.16.4] | 2022-11-18 | - | [1.16.3][c1.16.3] | 2022-11-15 | - | [1.16.2][c1.16.2] | 2022-11-15 | - | [1.16.1][c1.16.1] | 2022-11-10 | - | [1.16.0][c1.16.0] | 2022-10-31 | - | [1.15.5][c1.15.5] | 2022-10-18 | - | [1.15.4][c1.15.4] | 2022-10-11 | - | [1.15.3][c1.15.3] | 2022-09-28 | - | [1.15.2][c1.15.2] | 2022-09-26 | - | [1.15.1][c1.15.1] | 2022-09-21 | - | [1.15.0][c1.15.0] | 2022-09-07 | - | [1.14.1][c1.14.1] | 2022-07-08 | - | [1.14.0][c1.14.0] | 2022-07-07 | - | [1.13.2][c1.13.2] | 2022-05-20 | - | [1.13.1][c1.13.1] | 2022-05-03 | - | [1.13.0][c1.13.0] | 2022-05-03 | - | [1.12.2][c1.12.2] | 2022-04-13 | - | [1.12.1][c1.12.1] | 2022-04-07 | - | [1.12.0][c1.12.0] | 2022-04-05 | - | [1.11.0][c1.11.0] | 2022-03-14 | - | [1.10.1][c1.10.1] | 2022-02-01 | - | [1.10.0][c1.10.0] | 2022-01-27 | - | [1.9.1][c1.9.1] | 2022-01-19 | - | [1.9.0][c1.9.0] | 2021-12-10 | - | [1.8.0][c1.8.0] | 2021-11-30 | - | [1.7.2][c1.7.2] | 2021-09-28 | - | [1.7.1][c1.7.1] | 2021-09-17 | - | [1.7.0][c1.7.0] | 2021-09-01 | - | [1.6.0][c1.6.0] | 2021-08-11 | - | [1.5.2][c1.5.2] | 2021-08-10 | - | [1.5.1][c1.5.1] | 2021-07-29 | - | [1.5.0][c1.5.0] | 2021-07-13 | - | [1.4.1][c1.4.1] | 2021-06-15 | - | [1.4.0][c1.4.0] | 2021-06-09 | - | [1.3.0][c1.3.0] | 2021-04-23 | - | [1.2.1][c1.2.1] | 2021-03-25 | - | [1.2.0][c1.2.0] | 2021-03-15 | - | [1.1.0][c1.1.0] | 2021-02-10 | - | [1.0.4][c1.0.0] | 2021-02-01 | - | [1.0.3][c1.0.0] | 2021-01-15 | - | [1.0.2][c1.0.0] | 2021-01-14 | - | [1.0.1][c1.0.0] | 2021-01-14 | - | [1.0.0][c1.0.0] | 2021-01-14 | - -
- -## Python Client - -For links to the Python Client releases, expand this section. - -
- Releases - - | Client Version | Release Date | - | :- | :- | - | [4.8.1][p4.8.1] | 2024-09-16 | - | [4.8.0][p4.8.0] | 2024-09-10 | - | [4.7.1][p4.7.1] | 2024-07-25 | - | [4.7.0][p4.7.0] | 2024-07-23 | - | [4.6.7][p4.6.7] | 2024-07-19 | - | [4.6.6][p4.6.6] | 2024-07-02 | - | [4.6.5][p4.6.5] | 2024-06-19 | - | [4.6.4][p4.6.4] | 2024-06-19 | - | [4.6.3][p4.6.3] | 2024-05-21 | - | [4.6.2][p4.6.2] | 2024-05-17 | - | [4.6.1][p4.6.1] | 2024-05-17 | - | [4.6.0][p4.6.0] | 2024-05-10 | - | [4.5.7][p4.5.7] | 2024-05-03 | - | [4.5.6][p4.5.6] | 2024-04-23 | - | [4.5.5][p4.5.5] | 2024-04-03 | - | [4.5.4][p4.5.4] | 2024-03-15 | - | [4.5.3][p4.5.3] | 2024-03-14 | - | [4.5.2][p4.5.2] | 2024-03-11 | - | [4.5.1][p4.5.1] | 2024-03-04 | - | [4.5.0][p4.5.0] | 2024-02-27 | - | [4.4.4][p4.4.4] | 2024-02-09 | - | [4.4.4][p4.4.4] | 2024-02-09 | - | [4.4.3][p4.4.3] | 2024-02-09 | - | [4.4.2][p4.4.2] | 2024-02-05 | - | [4.4.1][p4.4.1] | 2024-02-01 | - | [4.4.0][p4.4.0] | 2024-01-31 | - | [3.26.7][p3.26.7] | 2024-08-15 | - | [3.26.6][p3.26.6] | 2024-07-24 | - | [3.26.5][p3.26.5] | 2024-07-02 | - | [3.26.4][p3.26.4] | 2024-07-02 | - | [3.26.3][p3.26.3] | 2024-06-30 | - | [3.26.2][p3.26.2] | 2024-01-22 | - | [3.26.1][p3.26.1] | 2024-01-15 | - | [3.26.0][p3.26.0] | 2023-12-20 | - | [3.25.3][p3.25.3] | 2023-11-07 | - | [3.25.2][p3.25.2] | 2023-10-31 | - | [3.25.1][p3.25.1] | 2023-10-27 | - | [3.25.0][p3.25.0] | 2023-10-27 | - | [3.24.2][p3.24.2] | 2023-10-04 | - | [3.24.1][p3.24.1] | 2023-09-11 | - | [3.23.2][p3.23.2] | 2023-08-29 | - | [3.23.1][p3.23.1] | 2023-08-25 | - | [3.23.0][p3.23.0] | 2023-08-22 | - | [3.22.1][p3.22.1] | 2023-07-10 | - | [3.22.0][p3.22.0] | 2023-07-06 | - | [3.21.0][p3.21.0] | 2023-06-18 | - | [3.20.1][p3.20.1] | 2023-06-14 | - | [3.20.0][p3.20.0] | 2023-06-12 | - | [3.19.2][p3.19.2] | 2023-05-25 | - | [3.19.1][p3.19.1] | 2023-05-18 | - | [3.19.0][p3.19.0] | 2023-05-18 | - | [3.18.0][p3.18.0] | 2023-05-09 | - | [3.17.1][p3.17.1] | 2023-05-08 | - | [3.17.0][p3.17.0] | 2023-05-04 | - | [3.16.2][p3.16.2] | 2023-04-26 | - | [3.16.1][p3.16.1] | 2023-04-24 | - | [3.16.0][p3.16.0] | 2023-04-24 | - | [3.15.6][p3.15.6] | 2023-04-15 | - | [3.15.5][p3.15.5] | 2023-04-09 | - | [3.15.4][p3.15.4] | 2023-04-08 | - | [3.15.3][p3.15.3] | 2023-03-23 | - | [3.15.2][p3.15.2] | 2023-03-15 | - | [3.15.1][p3.15.1] | 2023-03-13 | - | [3.15.0][p3.15.0] | 2023-03-12 | - | [3.14.0][p3.14.0] | 2023-03-07 | - | [3.13.0][p3.13.0] | 2023-03-02 | - | [3.12.0][p3.12.0] | 2023-02-24 | - | [3.11.0][p3.11.0] | 2023-01-20 | - | [3.10.0][p3.10.0] | 2022-12-21 | - | [3.9.0][p3.9.0] | 2022-11-09 | - | [3.8.0][p3.8.0] | 2022-09-07 | - | [3.7.0][p3.7.0] | 2022-07-29 | - | [3.6.0][p3.6.0] | 2022-07-06 | - | [3.5.1][p3.5.1] | 2022-05-18 | - | [3.5.0][p3.5.0] | 2022-05-08 | - | [3.4.2][p3.4.2] | 2022-04-12 | - | [3.4.1][p3.4.1] | 2022-04-06 | - | [3.4.0][p3.4.0] | 2022-04-04 | - | [3.2.5][p3.2.5] | 2021-10-26 | - | [3.2.4][p3.2.4] | 2021-10-26 | - | [3.2.3][p3.2.3] | 2021-10-13 | - | [3.2.2][p3.2.2] | 2021-09-27 | - | [3.2.1][p3.2.1] | 2021-09-02 | - | [3.2.0][p3.2.0] | 2021-09-02 | - | [3.1.1][p3.1.1] | 2021-08-24 | - | [3.1.0][p3.1.0] | 2021-08-17 | - | [3.0.0][p3.0.0] | 2021-08-17 | - | [2.5.0][p2.5.0] | 2021-06-03 | - | [2.4.0][p2.4.0] | 2021-04-23 | - | [2.3.0][p2.3.0] | 2021-03-26 | - | [2.2.0][p2.2.0] | 2021-02-17 | - | [2.1.0][p2.1.0] | 2021-02-08 | - | [2.0.0][p2.0.0] | 2021-01-11 | - -
- -## TypeScript and JavaScript Clients - -The JavaScript client is no longer maintained. The TypeScript client accepts code written in JavaScript and TypeScript. Migrate your JavaScript client code to the TypeScript client. - -### TypeScript Client - -For links to the TypeScript Client releases, expand this section. - -
- Releases - - | Client Version | Release Date | - | :- | :- | - | [3.1.4][ts3.1.4] | 2024-08-06 | - | [3.1.3][ts3.1.3] | 2024-07-26 | - | [3.1.2][ts3.1.2] | 2024-07-26 | - | [3.1.1][ts3.1.1] | 2024-07-26 | - | [3.1.0][ts3.1.0] | 2024-07-24 | - | [3.0.9][ts3.0.9] | 2024-07-10 | - | [3.0.8][ts3.0.8] | 2024-06-24 | - | [3.0.7][ts3.0.7] | 2024-06-21 | - | [3.0.6][ts3.0.6] | 2024-06-19 | - | [3.0.5][ts3.0.5] | 2024-06-13 | - | [3.0.4][ts3.0.4] | 2024-06-13 | - | [3.0.3][ts3.0.3] | 2024-06-04 | - | [3.0.2][ts3.0.2] | 2024-06-03 | - | [3.0.1][ts3.0.1] | 2024-06-03 | - | [3.0.0][ts3.0.0] | 2024-06-03 | - | [2.2.0][ts2.2.0] | 2024-05-20 | - | [2.1.1][ts2.1.1] | 2024-03-26 | - | [2.1.0][ts2.1.0] | 2024-02-28 | - | [2.0.0][ts2.0.0] | 2023-11-22 | - | [1.6.0][ts1.6.0] | 2023-10-31 | - | [1.5.0][ts1.5.0] | 2023-08-22 | - | [1.4.0][ts1.4.0] | 2023-07-06 | - | [1.3.3][ts1.3.3] | 2023-06-14 | - | [1.3.2][ts1.3.2] | 2023-05-26 | - | [1.3.1][ts1.3.1] | 2023-05-16 | - | [1.3.0][ts1.3.0] | 2023-05-08 | - | [1.2.0][ts1.2.0] | 2023-05-05 | - | [1.1.0][ts1.1.0] | 2023-04-21 | - | [1.0.0][ts1.0.0] | 2023-05-04 | - -
- - ### JavaScript Client - -For links to the JavaScript Client releases, expand this section. - -
- Releases - - | Client Version | Release Date | - | :- | :- | - | [2.14.5][js2.14.5] | 2023-03-21 | - | [2.14.4][js2.14.4] | 2023-02-07 | - | [2.14.3][js2.14.3] | 2023-01-27 | - | [2.14.2][js2.14.2] | 2022-12-27 | - | [2.14.1][js2.14.1] | 2022-12-27 | - | [2.14.0][js2.14.0] | 2022-12-20 | - | [2.13.0][js2.13.0] | 2022-10-31 | - | [2.12.1][js2.12.1] | 2023-09-27 | - | [2.12.0][js2.12.0] | 2022-09-07 | - | [2.11.1][js2.11.1] | 2022-07-12 | - | [2.11.0][js2.11.0] | 2022-07-07 | - | [2.10.1][js2.10.1] | 2022-05-31 | - | [2.10.0][js2.10.0] | 2022-05-25 | - | [2.9.0][js2.9.0] | 2022-05-03 | - | [2.8.0][js2.8.0] | 2022-04-05 | - | [2.7.0][js2.7.0] | 2022-03-11 | - | [2.6.0][js2.6.0] | 2021-11-30 | - | [2.5.0][js2.6.0] | 2021-11-30 | - | [2.4.0][js2.4.0] | 2021-08-31 | - | [2.3.0][js2.3.0] | 2021-06-07 | - | [2.2.0][js2.2.0] | 2021-04-23 | - | [2.1.0][js2.1.0] | 2021-04-20 | - | [2.0.0][js2.0.0] | 2021-01-13 | - | [1.1.2][js1.1.2] | 2020-10-03 | - | [1.1.1][js1.1.1] | 2020-10-03 | - | [1.1.0][js1.1.0] | 2020-10-03 | - | [1.0.0][js1.0.0] | 2020-09-15 | - -
- - -## Go Client - -For links to the Go Client releases, expand this section. - -
- Releases - - | Client Version | Release Date | - | :- | :- | - | [4.15.1][g4.15.1] | 2024-08-07 | - | [4.15.0][g4.15.0] | 2024-07-25 | - | [4.14.3][g4.14.3] | 2024-07-25 | - | [4.14.2][g4.14.2] | 2024-07-17 | - | [4.14.1][g4.14.1] | 2024-07-11 | - | [4.14.0][g4.14.0] | 2024-05-20 | - | [4.13.1][g4.13.1] | 2024-03-07 | - | [4.13.0][g4.13.0] | 2024-03-05 | - | [4.12.0][g4.12.0] | 2023-12-08 | - | [4.11.0][g4.11.0] | 2023-11-13 | - | [4.10.0][g4.10.0] | 2023-08-22 | - | [4.9.0][g4.9.0] | 2023-07-06 | - | [4.8.1][g4.8.1] | 2023-05-26 | - | [4.8.0][g4.8.0] | 2023-05-05 | - | [4.7.1][g4.7.1] | 2023-04-14 | - | [4.7.0][g4.7.0] | 2023-04-03 | - | [4.6.4][g4.6.4] | 2023-03-25 | - | [4.6.3][g4.6.3] | 2023-03-14 | - | [4.6.2][g4.6.2] | 2023-03-07 | - | [4.6.1][g4.6.1] | 2023-02-01 | - | [4.6.0][g4.6.0] | 2023-02-01 | - | [4.5.2][g4.5.2] | 2023-01-19 | - | [4.5.1][g4.5.1] | 2023-01-17 | - | [4.5.0][g4.5.0] | 2022-12-20 | - | [4.4.0][g4.4.0] | 2022-10-31 | - | [4.3.1][g4.3.1] | 2022-09-27 | - | [4.3.0][g4.3.0] | 2022-09-07 | - | [4.2.1][g4.2.1] | 2022-07-12 | - | [4.2.0][g4.2.0] | 2022-07-07 | - | [4.1.0][g4.1.0] | 2022-05-25 | - | [4.0.0][g4.0.0] | 2022-05-03 | - | [3.0.0][g3.0.0] | 2022-04-05 | - | [2.6.2][g2.6.2] | 2022-10-31 | - | [2.6.1][g2.6.1] | 2022-05-04 | - | [2.6.0][g2.6.0] | 2022-03-11 | - | [2.5.0][g2.5.0] | 2022-02-01 | - | [2.4.1][g2.4.1] | 2021-12-15 | - | [2.4.0][g2.4.0] | 2021-11-30 | - | [2.3.0][g2.3.0] | 2021-08-31 | - | [2.2.0][g2.2.0] | 2021-06-07 | - | [2.1.0][g2.1.0] | 2021-04-23 | - | [2.0.1][g2.0.1] | 2021-03-25 | - | [2.0.0][g2.0.0] | 2021-03-23 | - | [1.1.2][g1.1.2] | 2021-10-31 | - | [1.1.1][g1.1.1] | 2021-05-04 | - | [1.1.0][g1.1.0] | 2020-11-09 | - | [1.0.0][g1.0.0] | 2020-11-06 | - - -
- -## Java Client - -For links to the Java Client releases, expand this section. - -
- Releases - - | Client Version | Release Date | - | :- | :- | - | [4.8.3][j4.8.3] | 2024-09-21 | - | [4.8.2][j4.8.2] | 2024-07-24 | - | [4.8.1][j4.8.1] | 2024-07-24 | - | [4.8.0][j4.8.0] | 2024-07-23 | - | [4.7.0][j4.7.0] | 2024-05-20 | - | [4.6.0][j4.6.0] | 2024-03-05 | - | [4.5.1][j4.5.1] | 2024-01-08 | - | [4.5.0][j4.5.0] | 2023-12-07 | - | [4.4.2][j4.4.2] | 2023-11-20 | - | [4.4.1][j4.4.1] | 2023-11-15 | - | [4.4.0][j4.4.0] | 2023-11-14 | - | [4.3.0][j4.3.0] | 2023-08-22 | - | [4.2.1][j4.2.1] | 2023-07-26 | - | [4.2.0][j4.2.0] | 2023-07-06 | - | [4.1.2][j4.1.2] | 2023-05-26 | - | [4.1.1][j4.1.1] | 2023-05-21 | - | [4.1.0][j4.1.0] | 2023-05-05 | - | [4.0.2][j4.0.2] | 2023-03-28 | - | [4.0.1][j4.0.1] | 2023-03-16 | - | [4.0.0][j4.0.0] | 2023-03-14 | - | [3.6.5][j3.6.5] | 2023-03-13 | - | [3.6.4][j3.6.4] | 2023-03-07 | - | [3.6.3][j3.6.3] | 2023-03-01 | - | [3.6.2][j3.6.2] | 2023-02-23 | - | [3.6.1][j3.6.1] | 2023-02-22 | - | [3.6.0][j3.6.0] | 2023-02-09 | - | [3.5.0][j3.5.0] | 2022-12-20 | - | [3.4.2][j3.4.2] | 2022-11-21 | - | [3.4.1][j3.4.1] | 2022-11-18 | - | [3.4.0][j3.4.0] | 2022-10-31 | - | [3.3.2][j3.3.2] | 2022-10-29 | - | [3.3.1][j3.3.1] | 2022-09-29 | - | [3.3.0][j3.3.0] | 2022-09-07 | - | [3.2.1][j3.2.1] | 2022-07-12 | - | [3.2.0][j3.2.0] | 2022-07-07 | - | [3.1.1][j3.1.1] | 2022-06-02 | - | [3.1.0][j3.1.0] | 2022-05-25 | - | [3.0.0][j3.1.0] | 2022-05-04 | - | [2.4.0][j2.4.0] | 2022-04-05 | - | [2.3.0][j2.3.0] | 2022-03-11 | - | [2.2.2][j2.2.2] | 2022-02-08 | - | [2.2.1][j2.2.1] | 2022-02-07 | - | [2.2.0][j2.2.0] | 2022-02-01 | - | [2.1.1][j2.1.1] | 2021-12-15 | - | [2.1.0][j2.1.0] | 2021-11-30 | - | [2.0.0][j2.0.0] | 2021-11-04 | - | [1.2.1][j1.2.1] | 2021-09-28 | - | [1.2.0][j1.2.0] | 2021-09-10 | - | [1.1.2][j1.1.2] | 2021-08-31 | - | [1.1.1][j1.1.1] | 2021-08-10 | - | [1.1.0][j1.1.0] | 2021-06-07 | - | [1.0.2][j1.0.2] | 2021-04-26 | - | [1.0.1][j1.0.1] | 2021-04-23 | - | [1.0.0][j1.0.0] | 2021-04-22 | - -
- -[comment]: # ( core links ) - -[c1.26.6]: https://github.com/weaviate/weaviate/releases/tag/v1.26.6 -[c1.26.5]: https://github.com/weaviate/weaviate/releases/tag/v1.26.5 -[c1.26.4]: https://github.com/weaviate/weaviate/releases/tag/v1.26.4 -[c1.26.3]: https://github.com/weaviate/weaviate/releases/tag/v1.26.3 -[c1.26.2]: https://github.com/weaviate/weaviate/releases/tag/v1.26.2 -[c1.26.1]: https://github.com/weaviate/weaviate/releases/tag/v1.26.1 -[c1.26.0]: https://github.com/weaviate/weaviate/releases/tag/v1.26.0 -[c1.25.20]: https://github.com/weaviate/weaviate/releases/tag/v1.25.20 -[c1.25.19]: https://github.com/weaviate/weaviate/releases/tag/v1.25.19 -[c1.25.18]: https://github.com/weaviate/weaviate/releases/tag/v1.25.18 -[c1.25.17]: https://github.com/weaviate/weaviate/releases/tag/v1.25.17 -[c1.25.16]: https://github.com/weaviate/weaviate/releases/tag/v1.25.16 -[c1.25.15]: https://github.com/weaviate/weaviate/releases/tag/v1.25.15 -[c1.25.14]: https://github.com/weaviate/weaviate/releases/tag/v1.25.14 -[c1.25.13]: https://github.com/weaviate/weaviate/releases/tag/v1.25.13 -[c1.25.12]: https://github.com/weaviate/weaviate/releases/tag/v1.25.12 -[c1.25.11]: https://github.com/weaviate/weaviate/releases/tag/v1.25.11 -[c1.25.10]: https://github.com/weaviate/weaviate/releases/tag/v1.25.10 -[c1.25.9]: https://github.com/weaviate/weaviate/releases/tag/v1.25.9 -[c1.25.8]: https://github.com/weaviate/weaviate/releases/tag/v1.25.8 -[c1.25.7]: https://github.com/weaviate/weaviate/releases/tag/v1.25.7 -[c1.25.6]: https://github.com/weaviate/weaviate/releases/tag/v1.25.6 -[c1.25.5]: https://github.com/weaviate/weaviate/releases/tag/v1.25.5 -[c1.25.4]: https://github.com/weaviate/weaviate/releases/tag/v1.25.4 -[c1.25.3]: https://github.com/weaviate/weaviate/releases/tag/v1.25.3 -[c1.25.2]: https://github.com/weaviate/weaviate/releases/tag/v1.25.2 -[c1.25.1]: https://github.com/weaviate/weaviate/releases/tag/v1.25.1 -[c1.25.0]: https://github.com/weaviate/weaviate/releases/tag/v1.25.0 -[c1.24.25]: https://github.com/weaviate/weaviate/releases/tag/v1.24.25 -[c1.24.24]: https://github.com/weaviate/weaviate/releases/tag/v1.24.24 -[c1.24.23]: https://github.com/weaviate/weaviate/releases/tag/v1.24.23 -[c1.24.22]: https://github.com/weaviate/weaviate/releases/tag/v1.24.22 -[c1.24.21]: https://github.com/weaviate/weaviate/releases/tag/v1.24.21 -[c1.24.20]: https://github.com/weaviate/weaviate/releases/tag/v1.24.20 -[c1.24.19]: https://github.com/weaviate/weaviate/releases/tag/v1.24.19 -[c1.24.18]: https://github.com/weaviate/weaviate/releases/tag/v1.24.18 -[c1.24.17]: https://github.com/weaviate/weaviate/releases/tag/v1.24.17 -[c1.24.16]: https://github.com/weaviate/weaviate/releases/tag/v1.24.16 -[c1.24.15]: https://github.com/weaviate/weaviate/releases/tag/v1.24.15 -[c1.24.14]: https://github.com/weaviate/weaviate/releases/tag/v1.24.14 -[c1.24.13]: https://github.com/weaviate/weaviate/releases/tag/v1.24.13 -[c1.24.12]: https://github.com/weaviate/weaviate/releases/tag/v1.24.12 -[c1.24.11]: https://github.com/weaviate/weaviate/releases/tag/v1.24.11 -[c1.24.10]: https://github.com/weaviate/weaviate/releases/tag/v1.24.10 -[c1.24.9]: https://github.com/weaviate/weaviate/releases/tag/v1.24.9 -[c1.24.8]: https://github.com/weaviate/weaviate/releases/tag/v1.24.8 -[c1.24.7]: https://github.com/weaviate/weaviate/releases/tag/v1.24.7 -[c1.24.6]: https://github.com/weaviate/weaviate/releases/tag/v1.24.6 -[c1.24.5]: https://github.com/weaviate/weaviate/releases/tag/v1.24.5 -[c1.24.4]: https://github.com/weaviate/weaviate/releases/tag/v1.24.4 -[c1.24.3]: https://github.com/weaviate/weaviate/releases/tag/v1.24.3 -[c1.24.2]: https://github.com/weaviate/weaviate/releases/tag/v1.24.2 -[c1.24.1]: https://github.com/weaviate/weaviate/releases/tag/v1.24.1 -[c1.24.0]: https://github.com/weaviate/weaviate/releases/tag/v1.24.0 -[c1.23.16]: https://github.com/weaviate/weaviate/releases/tag/v1.23.16 -[c1.23.15]: https://github.com/weaviate/weaviate/releases/tag/v1.23.15 -[c1.23.14]: https://github.com/weaviate/weaviate/releases/tag/v1.23.14 -[c1.23.13]: https://github.com/weaviate/weaviate/releases/tag/v1.23.13 -[c1.23.12]: https://github.com/weaviate/weaviate/releases/tag/v1.23.12 -[c1.23.11]: https://github.com/weaviate/weaviate/releases/tag/v1.23.11 -[c1.23.10]: https://github.com/weaviate/weaviate/releases/tag/v1.23.10 -[c1.23.9]: https://github.com/weaviate/weaviate/releases/tag/v1.23.9 -[c1.23.8]: https://github.com/weaviate/weaviate/releases/tag/v1.23.8 -[c1.23.7]: https://github.com/weaviate/weaviate/releases/tag/v1.23.7 -[c1.23.6]: https://github.com/weaviate/weaviate/releases/tag/v1.23.6 -[c1.23.5]: https://github.com/weaviate/weaviate/releases/tag/v1.23.5 -[c1.23.4]: https://github.com/weaviate/weaviate/releases/tag/v1.23.4 -[c1.23.3]: https://github.com/weaviate/weaviate/releases/tag/v1.23.3 -[c1.23.2]: https://github.com/weaviate/weaviate/releases/tag/v1.23.2 -[c1.23.1]: https://github.com/weaviate/weaviate/releases/tag/v1.23.1 -[c1.23.0]: https://github.com/weaviate/weaviate/releases/tag/v1.23.0 -[c1.22.13]: https://github.com/weaviate/weaviate/releases/tag/v1.22.13 -[c1.22.12]: https://github.com/weaviate/weaviate/releases/tag/v1.22.12 -[c1.22.11]: https://github.com/weaviate/weaviate/releases/tag/v1.22.11 -[c1.22.10]: https://github.com/weaviate/weaviate/releases/tag/v1.22.10 -[c1.22.9]: https://github.com/weaviate/weaviate/releases/tag/v1.22.9 -[c1.22.8]: https://github.com/weaviate/weaviate/releases/tag/v1.22.8 -[c1.22.7]: https://github.com/weaviate/weaviate/releases/tag/v1.22.7 -[c1.22.6]: https://github.com/weaviate/weaviate/releases/tag/v1.22.6 -[c1.22.5]: https://github.com/weaviate/weaviate/releases/tag/v1.22.5 -[c1.22.4]: https://github.com/weaviate/weaviate/releases/tag/v1.22.4 -[c1.22.3]: https://github.com/weaviate/weaviate/releases/tag/v1.22.3 -[c1.22.2]: https://github.com/weaviate/weaviate/releases/tag/v1.22.2 -[c1.22.1]: https://github.com/weaviate/weaviate/releases/tag/v1.22.1 -[c1.22.0]: https://github.com/weaviate/weaviate/releases/tag/v1.22.0 -[c1.21.9]: https://github.com/weaviate/weaviate/releases/tag/v1.21.9 -[c1.21.8]: https://github.com/weaviate/weaviate/releases/tag/v1.21.8 -[c1.21.7]: https://github.com/weaviate/weaviate/releases/tag/v1.21.7 -[c1.21.6]: https://github.com/weaviate/weaviate/releases/tag/v1.21.6 -[c1.21.5]: https://github.com/weaviate/weaviate/releases/tag/v1.21.5 -[c1.21.4]: https://github.com/weaviate/weaviate/releases/tag/v1.21.4 -[c1.21.3]: https://github.com/weaviate/weaviate/releases/tag/v1.21.3 -[c1.21.2]: https://github.com/weaviate/weaviate/releases/tag/v1.21.2 -[c1.21.1]: https://github.com/weaviate/weaviate/releases/tag/v1.21.1 -[c1.21.0]: https://github.com/weaviate/weaviate/releases/tag/v1.21.0 -[c1.20.6]: https://github.com/weaviate/weaviate/releases/tag/v1.20.6 -[c1.20.5]: https://github.com/weaviate/weaviate/releases/tag/v1.20.5 -[c1.20.4]: https://github.com/weaviate/weaviate/releases/tag/v1.20.4 -[c1.20.3]: https://github.com/weaviate/weaviate/releases/tag/v1.20.3 -[c1.20.2]: https://github.com/weaviate/weaviate/releases/tag/v1.20.2 -[c1.20.1]: https://github.com/weaviate/weaviate/releases/tag/v1.20.1 -[c1.20.0]: https://github.com/weaviate/weaviate/releases/tag/v1.20.0 -[c1.19.13]: https://github.com/weaviate/weaviate/releases/tag/v1.19.13 -[c1.19.12]: https://github.com/weaviate/weaviate/releases/tag/v1.19.12 -[c1.19.11]: https://github.com/weaviate/weaviate/releases/tag/v1.19.11 -[c1.19.10]: https://github.com/weaviate/weaviate/releases/tag/v1.19.10 -[c1.19.9]: https://github.com/weaviate/weaviate/releases/tag/v1.19.9 -[c1.19.8]: https://github.com/weaviate/weaviate/releases/tag/v1.19.8 -[c1.19.7]: https://github.com/weaviate/weaviate/releases/tag/v1.19.7 -[c1.19.6]: https://github.com/weaviate/weaviate/releases/tag/v1.19.6 -[c1.19.5]: https://github.com/weaviate/weaviate/releases/tag/v1.19.5 -[c1.19.4]: https://github.com/weaviate/weaviate/releases/tag/v1.19.4 -[c1.19.3]: https://github.com/weaviate/weaviate/releases/tag/v1.19.3 -[c1.19.2]: https://github.com/weaviate/weaviate/releases/tag/v1.19.2 -[c1.19.1]: https://github.com/weaviate/weaviate/releases/tag/v1.19.1 -[c1.19.0]: https://github.com/weaviate/weaviate/releases/tag/v1.19.0 -[c1.18.6]: https://github.com/weaviate/weaviate/releases/tag/v1.18.6 -[c1.18.5]: https://github.com/weaviate/weaviate/releases/tag/v1.18.5 -[c1.18.4]: https://github.com/weaviate/weaviate/releases/tag/v1.18.4 -[c1.18.3]: https://github.com/weaviate/weaviate/releases/tag/v1.18.3 -[c1.18.2]: https://github.com/weaviate/weaviate/releases/tag/v1.18.2 -[c1.18.1]: https://github.com/weaviate/weaviate/releases/tag/v1.18.1 -[c1.18.0]: https://github.com/weaviate/weaviate/releases/tag/v1.18.0 -[c1.17.6]: https://github.com/weaviate/weaviate/releases/tag/v1.17.6 -[c1.17.5]: https://github.com/weaviate/weaviate/releases/tag/v1.17.5 -[c1.17.4]: https://github.com/weaviate/weaviate/releases/tag/v1.17.4 -[c1.17.3]: https://github.com/weaviate/weaviate/releases/tag/v1.17.3 -[c1.17.2]: https://github.com/weaviate/weaviate/releases/tag/v1.17.2 -[c1.17.1]: https://github.com/weaviate/weaviate/releases/tag/v1.17.1 -[c1.17.0]: https://github.com/weaviate/weaviate/releases/tag/v1.17.0 -[c1.16.9]: https://github.com/weaviate/weaviate/releases/tag/v1.16.9 -[c1.16.8]: https://github.com/weaviate/weaviate/releases/tag/v1.16.8 -[c1.16.7]: https://github.com/weaviate/weaviate/releases/tag/v1.16.7 -[c1.16.6]: https://github.com/weaviate/weaviate/releases/tag/v1.16.6 -[c1.16.5]: https://github.com/weaviate/weaviate/releases/tag/v1.16.5 -[c1.16.4]: https://github.com/weaviate/weaviate/releases/tag/v1.16.4 -[c1.16.3]: https://github.com/weaviate/weaviate/releases/tag/v1.16.3 -[c1.16.2]: https://github.com/weaviate/weaviate/releases/tag/v1.16.2 -[c1.16.1]: https://github.com/weaviate/weaviate/releases/tag/v1.16.1 -[c1.16.0]: https://github.com/weaviate/weaviate/releases/tag/v1.16.0 -[c1.15.5]: https://github.com/weaviate/weaviate/releases/tag/v1.15.5 -[c1.15.4]: https://github.com/weaviate/weaviate/releases/tag/v1.15.4 -[c1.15.3]: https://github.com/weaviate/weaviate/releases/tag/v1.15.3 -[c1.15.2]: https://github.com/weaviate/weaviate/releases/tag/v1.15.2 -[c1.15.1]: https://github.com/weaviate/weaviate/releases/tag/v1.15.1 -[c1.15.0]: https://github.com/weaviate/weaviate/releases/tag/v1.15.0 -[c1.14.1]: https://github.com/weaviate/weaviate/releases/tag/v1.14.1 -[c1.14.0]: https://github.com/weaviate/weaviate/releases/tag/v1.14.0 -[c1.13.2]: https://github.com/weaviate/weaviate/releases/tag/v1.13.2 -[c1.13.1]: https://github.com/weaviate/weaviate/releases/tag/v1.13.1 -[c1.13.0]: https://github.com/weaviate/weaviate/releases/tag/v1.13.0 -[c1.12.2]: https://github.com/weaviate/weaviate/releases/tag/v1.12.2 -[c1.12.1]: https://github.com/weaviate/weaviate/releases/tag/v1.12.1 -[c1.12.0]: https://github.com/weaviate/weaviate/releases/tag/v1.12.0 -[c1.11.0]: https://github.com/weaviate/weaviate/releases/tag/v1.11.0 -[c1.10.1]: https://github.com/weaviate/weaviate/releases/tag/v1.10.1 -[c1.10.0]: https://github.com/weaviate/weaviate/releases/tag/v1.10.0 -[c1.9.1]: https://github.com/weaviate/weaviate/releases/tag/v1.9.1 -[c1.9.0]: https://github.com/weaviate/weaviate/releases/tag/v1.9.0 -[c1.8.0]: https://github.com/weaviate/weaviate/releases/tag/v1.8.0 -[c1.7.2]: https://github.com/weaviate/weaviate/releases/tag/v1.7.2 -[c1.7.1]: https://github.com/weaviate/weaviate/releases/tag/v1.7.1 -[c1.7.0]: https://github.com/weaviate/weaviate/releases/tag/v1.7.0 -[c1.6.0]: https://github.com/weaviate/weaviate/releases/tag/v1.6.0 -[c1.5.2]: https://github.com/weaviate/weaviate/releases/tag/v1.5.2 -[c1.5.1]: https://github.com/weaviate/weaviate/releases/tag/v1.5.1 -[c1.5.0]: https://github.com/weaviate/weaviate/releases/tag/v1.5.0 -[c1.4.1]: https://github.com/weaviate/weaviate/releases/tag/v1.4.1 -[c1.4.0]: https://github.com/weaviate/weaviate/releases/tag/v1.4.0 -[c1.3.0]: https://github.com/weaviate/weaviate/releases/tag/v1.3.0 -[c1.2.1]: https://github.com/weaviate/weaviate/releases/tag/v1.2.1 -[c1.2.0]: https://github.com/weaviate/weaviate/releases/tag/v1.2.0 -[c1.1.0]: https://github.com/weaviate/weaviate/releases/tag/v1.1.0 -[c1.0.0]: https://github.com/weaviate/weaviate/releases/tag/v1.0.0 - -[comment]: # ( python client links ) - -[p4.8.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.8.1 -[p4.8.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.8.0 -[p4.7.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.7.1 -[p4.7.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.7.0 -[p4.6.7]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.7 -[p4.6.6]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.6 -[p4.6.5]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.5 -[p4.6.4]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.4 -[p4.6.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.3 -[p4.6.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.2 -[p4.6.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.1 -[p4.6.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.6.0 -[p4.5.7]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.7 -[p4.5.6]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.6 -[p4.5.5]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.5 -[p4.5.4]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.4 -[p4.5.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.3 -[p4.5.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.2 -[p4.5.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.1 -[p4.5.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.5.0 -[p4.4.4]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.4 -[p4.4.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.3 -[p4.4.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.2 -[p4.4.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.1 -[p4.4.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v4.4.0 -[p3.26.7]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.7 -[p3.26.6]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.6 -[p3.26.5]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.5 -[p3.26.4]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.4 -[p3.26.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.3 -[p3.26.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.2 -[p3.26.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.1 -[p3.26.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.26.0 -[p3.25.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.3 -[p3.25.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.2 -[p3.25.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.1 -[p3.25.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.25.0 -[p3.24.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.24.2 -[p3.24.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.24.1 -[p3.24.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.24.0 -[p3.23.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.23.2 -[p3.23.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.23.1 -[p3.23.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.23.0 -[p3.22.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.22.1 -[p3.22.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.22.0 -[p3.21.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.21.0 -[p3.20.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.20.1 -[p3.20.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.20.0 -[p3.19.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.2 -[p3.19.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.1 -[p3.19.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.0 -[p3.18.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.19.0 -[p3.17.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.17.1 -[p3.17.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.17.0 -[p3.16.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.16.2 -[p3.16.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.16.1 -[p3.16.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.16.0 -[p3.15.6]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.6 -[p3.15.5]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.5 -[p3.15.4]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.4 -[p3.15.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.3 -[p3.15.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.2 -[p3.15.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.1 -[p3.15.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.15.0 -[p3.14.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.14.0 -[p3.13.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.13.0 -[p3.12.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.12.0 -[p3.11.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.11.0 -[p3.10.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.10.0 -[p3.9.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.9.0 -[p3.8.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.8.0 -[p3.7.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.7.0 -[p3.6.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.6.0 -[p3.5.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.5.1 -[p3.5.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.5.0 -[p3.4.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.4.2 -[p3.4.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.4.1 -[p3.4.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.4.0 -[p3.2.5]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.5 -[p3.2.4]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.4 -[p3.2.3]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.3 -[p3.2.2]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.2 -[p3.2.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.1 -[p3.2.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.2.0 -[p3.1.1]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.1.1 -[p3.1.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.1.0 -[p3.0.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v3.0.0 -[p2.5.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v2.5.0 -[p2.4.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v2.4.0 -[p2.3.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v2.3.0 -[p2.2.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v2.2.0 -[p2.1.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v2.1.0 -[p2.0.0]: https://github.com/weaviate/weaviate-python-client/releases/tag/v2.0.0 - -[comment]: # ( go client links ) - -[g4.15.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.15.1 -[g4.15.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.15.0 -[g4.14.3]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.3 -[g4.14.2]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.2 -[g4.14.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.1 -[g4.14.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.14.0 -[g4.13.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.13.1 -[g4.13.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.13.0 -[g4.12.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.12.0 -[g4.11.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.11.0 -[g4.10.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.10.0 -[g4.9.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.9.0 -[g4.8.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.8.1 -[g4.8.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.8.0 -[g4.7.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.7.1 -[g4.7.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.7.0 -[g4.6.4]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.4 -[g4.6.3]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.3 -[g4.6.2]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.2 -[g4.6.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.1 -[g4.6.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.6.0 -[g4.5.2]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.5.2 -[g4.5.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.5.1 -[g4.5.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.5.0 -[g4.4.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.4.0 -[g4.3.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.3.1 -[g4.3.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.3.0 -[g4.2.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.2.1 -[g4.2.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.2.0 -[g4.1.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.1.0 -[g4.0.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v4.0.0 -[g3.0.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v3.0.0 -[g2.6.2]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.6.2 -[g2.6.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.6.1 -[g2.6.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.6.0 -[g2.5.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.5.0 -[g2.4.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.4.1 -[g2.4.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.4.0 -[g2.3.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.3.0 -[g2.2.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.2.0 -[g2.1.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.1.0 -[g2.0.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.0.1 -[g2.0.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v2.0.0 -[g1.1.2]: https://github.com/weaviate/weaviate-go-client/releases/tag/v1.1.2 -[g1.1.1]: https://github.com/weaviate/weaviate-go-client/releases/tag/v1.1.1 -[g1.1.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v1.1.0 -[g1.0.0]: https://github.com/weaviate/weaviate-go-client/releases/tag/v1.0.0 - - -[comment]: # ( javascript typescript client links ) +Refer to the [Weaviate release notes on GitHub](https://github.com/weaviate/weaviate/releases) for more information on each release. -[ts3.1.4]: https://github.com/weaviate/typescript-client/releases/tag/v3.1.4 -[ts3.1.3]: https://github.com/weaviate/typescript-client/releases/tag/v3.1.3 -[ts3.1.2]: https://github.com/weaviate/typescript-client/releases/tag/v3.1.2 -[ts3.1.1]: https://github.com/weaviate/typescript-client/releases/tag/v3.1.1 -[ts3.1.0]: https://github.com/weaviate/typescript-client/releases/tag/v3.1.0 -[ts3.0.9]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.9 -[ts3.0.8]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.8 -[ts3.0.7]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.7 -[ts3.0.6]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.6 -[ts3.0.5]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.5 -[ts3.0.4]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.4 -[ts3.0.3]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.3 -[ts3.0.2]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.2 -[ts3.0.1]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.1 -[ts3.0.0]: https://github.com/weaviate/typescript-client/releases/tag/v3.0.0 -[ts2.2.0]: https://github.com/weaviate/typescript-client/releases/tag/v2.2.0 -[ts2.1.1]: https://github.com/weaviate/typescript-client/releases/tag/v2.1.1 -[ts2.1.0]: https://github.com/weaviate/typescript-client/releases/tag/v2.1.0 -[ts2.0.0]: https://github.com/weaviate/typescript-client/releases/tag/v2.0.0 -[ts1.6.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.6.0 -[ts1.5.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.5.0 -[ts1.4.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.4.0 -[ts1.3.3]: https://github.com/weaviate/typescript-client/releases/tag/v1.3.3 -[ts1.3.2]: https://github.com/weaviate/typescript-client/releases/tag/v1.3.2 -[ts1.3.1]: https://github.com/weaviate/typescript-client/releases/tag/v1.3.1 -[ts1.3.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.3.0 -[ts1.2.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.2.0 -[ts1.1.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.1.0 -[ts1.0.0]: https://github.com/weaviate/typescript-client/releases/tag/v1.0.0 -[js2.14.5]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.14.5 -[js2.14.4]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.14.4 -[js2.14.3]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.14.3 -[js2.14.2]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.14.2 -[js2.14.1]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.14.1 -[js2.14.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.14.0 -[js2.13.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.13.0 -[js2.12.1]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.12.1 -[js2.12.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.12.0 -[js2.11.1]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.11.1 -[js2.11.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.11.0 -[js2.10.1]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.10.1 -[js2.10.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.10.0 -[js2.9.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.9.0 -[js2.8.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.8.0 -[js2.7.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.7.0 -[js2.6.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.6.0 -[js2.5.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.5.0 -[js2.4.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.4.0 -[js2.3.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.3.0 -[js2.2.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.2.0 -[js2.1.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.1.0 -[js2.0.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v2.0.0 -[js1.1.2]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v1.1.2 -[js1.1.1]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v1.1.1 -[js1.1.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v.1.1.0 -[js1.0.0]: https://github.com/weaviate/weaviate-javascript-client/releases/tag/v.1.0.0 +## Client library release notes -[comment]: # ( java client links ) +Refer to the GitHub release notes for the corresponding client library for more information. -[j4.8.3]: https://github.com/weaviate/java-client/releases/tag/4.8.3 -[j4.8.2]: https://github.com/weaviate/java-client/releases/tag/4.8.2 -[j4.8.1]: https://github.com/weaviate/java-client/releases/tag/4.8.1 -[j4.8.0]: https://github.com/weaviate/java-client/releases/tag/4.8.0 -[j4.7.0]: https://github.com/weaviate/java-client/releases/tag/4.7.0 -[j4.6.0]: https://github.com/weaviate/java-client/releases/tag/4.6.0 -[j4.5.1]: https://github.com/weaviate/java-client/releases/tag/4.5.1 -[j4.5.0]: https://github.com/weaviate/java-client/releases/tag/4.5.0 -[j4.4.2]: https://github.com/weaviate/java-client/releases/tag/4.4.2 -[j4.4.1]: https://github.com/weaviate/java-client/releases/tag/4.4.1 -[j4.4.0]: https://github.com/weaviate/java-client/releases/tag/4.4.0 -[j4.3.0]: https://github.com/weaviate/java-client/releases/tag/4.3.0 -[j4.2.1]: https://github.com/weaviate/java-client/releases/tag/4.2.1 -[j4.2.0]: https://github.com/weaviate/java-client/releases/tag/4.2.0 -[j4.1.2]: https://github.com/weaviate/java-client/releases/tag/4.1.2 -[j4.1.1]: https://github.com/weaviate/java-client/releases/tag/4.1.1 -[j4.1.0]: https://github.com/weaviate/java-client/releases/tag/4.1.0 -[j4.0.2]: https://github.com/weaviate/java-client/releases/tag/4.0.2 -[j4.0.1]: https://github.com/weaviate/java-client/releases/tag/4.0.1 -[j4.0.0]: https://github.com/weaviate/java-client/releases/tag/4.0.0 -[j3.6.5]: https://github.com/weaviate/java-client/releases/tag/3.6.5 -[j3.6.4]: https://github.com/weaviate/java-client/releases/tag/3.5.4 -[j3.6.3]: https://github.com/weaviate/java-client/releases/tag/3.6.3 -[j3.6.2]: https://github.com/weaviate/java-client/releases/tag/3.6.2 -[j3.6.1]: https://github.com/weaviate/java-client/releases/tag/3.6.1 -[j3.6.0]: https://github.com/weaviate/java-client/releases/tag/3.6.0 -[j3.5.0]: https://github.com/weaviate/java-client/releases/tag/3.5.0 -[j3.4.2]: https://github.com/weaviate/java-client/releases/tag/3.4.2 -[j3.4.1]: https://github.com/weaviate/java-client/releases/tag/3.4.1 -[j3.4.0]: https://github.com/weaviate/java-client/releases/tag/3.4.0 -[j3.3.2]: https://github.com/weaviate/java-client/releases/tag/3.3.2 -[j3.3.1]: https://github.com/weaviate/java-client/releases/tag/3.3.1 -[j3.3.0]: https://github.com/weaviate/java-client/releases/tag/3.3.0 -[j3.2.1]: https://github.com/weaviate/java-client/releases/tag/3.2.1 -[j3.2.0]: https://github.com/weaviate/java-client/releases/tag/3.2.0 -[j3.1.1]: https://github.com/weaviate/java-client/releases/tag/3.1.1 -[j3.1.0]: https://github.com/weaviate/java-client/releases/tag/3.1.0 -[j3.0.0]: https://github.com/weaviate/java-client/releases/tag/3.0.0 -[j2.4.0]: https://github.com/weaviate/java-client/releases/tag/2.4.0 -[j2.3.0]: https://github.com/weaviate/java-client/releases/tag/2.3.0 -[j2.2.2]: https://github.com/weaviate/java-client/releases/tag/2.2.2 -[j2.2.1]: https://github.com/weaviate/java-client/releases/tag/2.2.1 -[j2.2.0]: https://github.com/weaviate/java-client/releases/tag/2.2.0 -[j2.1.1]: https://github.com/weaviate/java-client/releases/tag/2.1.1 -[j2.1.0]: https://github.com/weaviate/java-client/releases/tag/2.1.0 -[j2.0.0]: https://github.com/weaviate/java-client/releases/tag/2.0.0 -[j1.2.1]: https://github.com/weaviate/java-client/releases/tag/1.2.1 -[j1.2.0]: https://github.com/weaviate/java-client/releases/tag/1.2.0 -[j1.1.2]: https://github.com/weaviate/java-client/releases/tag/1.1.2 -[j1.1.1]: https://github.com/weaviate/java-client/releases/tag/1.1.1 -[j1.1.0]: https://github.com/weaviate/java-client/releases/tag/1.1.0 -[j1.0.2]: https://github.com/weaviate/java-client/releases/tag/1.0.2 -[j1.0.1]: https://github.com/weaviate/java-client/releases/tag/1.0.1 -[j1.0.0]: https://github.com/weaviate/java-client/releases/tag/1.0.0 +- [Python](https://github.com/weaviate/weaviate-python-client/releases) +- [TypeScript/JavaScript](https://github.com/weaviate/typescript-client/releases) +- [Go](https://github.com/weaviate/weaviate-go-client/releases) +- [Java](https://github.com/weaviate/java-client/releases) diff --git a/developers/weaviate/release-notes/release_1_22.mdx b/developers/weaviate/release-notes/older-releases/release_1_22.mdx similarity index 90% rename from developers/weaviate/release-notes/release_1_22.mdx rename to developers/weaviate/release-notes/older-releases/release_1_22.mdx index 52914b2243..d3d3bb8f06 100644 --- a/developers/weaviate/release-notes/release_1_22.mdx +++ b/developers/weaviate/release-notes/older-releases/release_1_22.mdx @@ -1,6 +1,6 @@ --- title: Weaviate 1.22.0 -sidebar_position: 15 +sidebar_position: 93 image: og/docs/release-notes.jpg tags: ['release', 'engineering'] --- diff --git a/developers/weaviate/release-notes/release_1_27.mdx b/developers/weaviate/release-notes/release_1_27.mdx new file mode 100644 index 0000000000..17b9b6ea5f --- /dev/null +++ b/developers/weaviate/release-notes/release_1_27.mdx @@ -0,0 +1,10 @@ +--- +title: Weaviate 1.27.0 +sidebar_position: 6 +image: og/docs/release-notes.jpg +tags: ['release', 'engineering'] +--- + +import Core127 from '/blog/2024-10-29-weaviate-1-27-release/_core-1-27-include.mdx' ; + + diff --git a/developers/weaviate/release-notes/release_1_28.mdx b/developers/weaviate/release-notes/release_1_28.mdx new file mode 100644 index 0000000000..309a90b676 --- /dev/null +++ b/developers/weaviate/release-notes/release_1_28.mdx @@ -0,0 +1,10 @@ +--- +title: Weaviate 1.28.0 +sidebar_position: 5 +image: og/docs/release-notes.jpg +tags: ['release', 'engineering'] +--- + +import ReleaseNotes from '/blog/2024-12-12-weaviate-1-28-release/_core-1-28-include.mdx' ; + + diff --git a/developers/weaviate/search/aggregate.md b/developers/weaviate/search/aggregate.md index 6c2f3ff597..fa43478604 100644 --- a/developers/weaviate/search/aggregate.md +++ b/developers/weaviate/search/aggregate.md @@ -56,7 +56,7 @@ Return the number of objects matched by the query. text={PyCodeV3} startMarker="# MetaCount Python" endMarker="# END MetaCount Python" - language="py" + language="pyv3" /> @@ -74,7 +74,7 @@ Return the number of objects matched by the query. text={TSCodeLegacy} startMarker="// MetaCount TS" endMarker="// END MetaCount TS" - language="js" + language="tsv2" /> @@ -129,7 +129,7 @@ This example counts occurrence frequencies in the `question` property: text={PyCodeV3} startMarker="# TextProp Python" endMarker="# END TextProp Python" - language="py" + language="pyv3" /> @@ -147,7 +147,7 @@ This example counts occurrence frequencies in the `question` property: text={TSCodeLegacy} startMarker="// TextProp TS" endMarker="// END TextProp TS" - language="js" + language="tsv2" /> @@ -202,7 +202,7 @@ This example sums the `points` property. text={PyCodeV3} startMarker="# IntProp Python" endMarker="# END IntProp Python" - language="py" + language="pyv3" /> @@ -220,7 +220,7 @@ This example sums the `points` property. text={TSCodeLegacy} startMarker="// IntProp TS" endMarker="// END IntProp TS" - language="js" + language="tsv2" /> @@ -277,7 +277,7 @@ To retrieve aggregate data for each group, use the `groupedBy` properties. text={PyCodeV3} startMarker="# groupBy Python" endMarker="# END groupBy Python" - language="py" + language="pyv3" /> @@ -295,7 +295,7 @@ To retrieve aggregate data for each group, use the `groupedBy` properties. text={TSCodeLegacy} startMarker="// groupBy TS" endMarker="// END groupBy TS" - language="js" + language="tsv2" /> @@ -358,7 +358,7 @@ Use `objectLimit` to specify the maximum number of objects to aggregate. text={PyCodeV3} startMarker="# nearTextWithLimit Python" endMarker="# END nearTextWithLimit Python" - language="py" + language="pyv3" /> @@ -371,6 +371,15 @@ Use `objectLimit` to specify the maximum number of objects to aggregate. /> + + + + - - - -
-## Set a similarity `distance` +### Set a similarity `distance` You can use `Aggregate` with a [similarity search](./similarity.md) operator (one of the `Near` operators). @@ -436,7 +436,7 @@ Use `distance` to specify how similar the objects should be. text={PyCodeV3} startMarker="# nearTextWithDistance Python" endMarker="# END nearTextWithDistance Python" - language="py" + language="pyv3" /> @@ -454,7 +454,7 @@ Use `distance` to specify how similar the objects should be. text={TSCodeLegacy} startMarker="// nearTextWithDistance TS" endMarker="// END nearTextWithDistance TS" - language="js" + language="tsv2" /> @@ -490,6 +490,79 @@ Use `distance` to specify how similar the objects should be. />
+## Aggregate with a `hybrid search` + +You can use `Aggregate` with a [hybrid search](./hybrid.md) operator. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Example response + + The output is like this: + + +
+ ## Filter results For more specific results, use a `filter` to narrow your search. @@ -509,7 +582,7 @@ For more specific results, use a `filter` to narrow your search. text={PyCodeV3} startMarker="# whereFilter Python" endMarker="# END whereFilter Python" - language="py" + language="pyv3" /> @@ -527,7 +600,7 @@ For more specific results, use a `filter` to narrow your search. text={TSCodeLegacy} startMarker="// whereFilter TS" endMarker="// END whereFilter TS" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/search/basics.md b/developers/weaviate/search/basics.md index f38cdd3afa..dc8bc50642 100644 --- a/developers/weaviate/search/basics.md +++ b/developers/weaviate/search/basics.md @@ -40,7 +40,7 @@ You can get objects without specifying any parameters. This returns objects in a text={PyCodeV3} startMarker="# BasicGetPython" endMarker="# END BasicGetPython" - language="py" + language="pyv3" /> @@ -61,7 +61,7 @@ You can get objects without specifying any parameters. This returns objects in a text={TSCodeLegacy} startMarker="// BasicGetJS" endMarker="// END BasicGetJS" - language="js" + language="tsv2" /> @@ -137,7 +137,7 @@ Use `limit` to set a fixed maximum number of objects to return. text={PyCodeV3} startMarker="# GetWithLimitPython" endMarker="# END GetWithLimitPython" - language="py" + language="pyv3" /> @@ -158,7 +158,7 @@ Use `limit` to set a fixed maximum number of objects to return. text={TSCodeLegacy} startMarker="// GetWithLimitJS" endMarker="// END GetWithLimitJS" - language="js" + language="tsv2" /> @@ -226,7 +226,7 @@ To start in the middle of your result set, define an `offset`. Set a `limit` to text={PyCodeV3} startMarker="# GetWithLimitOffsetPython" endMarker="# END GetWithLimitOffsetPython" - language="py" + language="pyv3" /> @@ -247,7 +247,7 @@ To start in the middle of your result set, define an `offset`. Set a `limit` to text={TSCodeLegacy} startMarker="// GetWithLimitOffsetJS" endMarker="// END GetWithLimitOffsetJS" - language="js" + language="tsv2" /> @@ -319,7 +319,7 @@ You can specify which object properties to return. text={PyCodeV3} startMarker="# GetPropertiesPython" endMarker="# END GetPropertiesPython" - language="py" + language="pyv3" /> @@ -340,7 +340,7 @@ You can specify which object properties to return. text={TSCodeLegacy} startMarker="// GetPropertiesJS" endMarker="// END GetPropertiesJS" - language="js" + language="tsv2" /> @@ -408,7 +408,7 @@ You can retrieve the object vector. (Also applicable where [named vectors](../co text={PyCodeV3} startMarker="# GetObjectVectorPython" endMarker="# END GetObjectVectorPython" - language="py" + language="pyv3" /> @@ -429,7 +429,7 @@ You can retrieve the object vector. (Also applicable where [named vectors](../co text={TSCodeLegacy} startMarker="// GetObjectVectorJS" endMarker="// END GetObjectVectorJS" - language="js" + language="tsv2" /> @@ -499,7 +499,7 @@ You can retrieve the object `id` (uuid). text={PyCodeV3} startMarker="# GetObjectIdPython" endMarker="# END GetObjectIdPython" - language="py" + language="pyv3" /> @@ -520,7 +520,7 @@ You can retrieve the object `id` (uuid). text={TSCodeLegacy} startMarker="// GetObjectIdJS" endMarker="// END GetObjectIdJS" - language="js" + language="tsv2" /> @@ -593,7 +593,7 @@ To retrieve properties from cross-referenced objects, specify: text={PyCodeV3} startMarker="# GetWithCrossRefsPython" endMarker="# END GetWithCrossRefsPython" - language="py" + language="pyv3" /> @@ -614,7 +614,7 @@ To retrieve properties from cross-referenced objects, specify: text={TSCodeLegacy} startMarker="// GetWithCrossRefs" endMarker="// END GetWithCrossRefs" - language="js" + language="tsv2" /> @@ -674,7 +674,7 @@ You can specify metadata fields to be returned. text={PyCodeV3} startMarker="# GetWithMetadataPython" endMarker="# END GetWithMetadataPython" - language="py" + language="pyv3" /> @@ -695,7 +695,7 @@ You can specify metadata fields to be returned. text={TSCodeLegacy} startMarker="// GetWithMetadataJS" endMarker="// END GetWithMetadataJS" - language="js" + language="tsv2" /> @@ -752,7 +752,7 @@ If [multi-tenancy](../concepts/data.md#multi-tenancy) is enabled, specify the te text={PyCodeV3} startMarker="# MultiTenancy" endMarker="# END MultiTenancy" - language="py" + language="pyv3" /> @@ -770,7 +770,7 @@ If [multi-tenancy](../concepts/data.md#multi-tenancy) is enabled, specify the te text={TSCodeLegacy} startMarker="// MultiTenancy" endMarker="// END MultiTenancy" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/search/bm25.md b/developers/weaviate/search/bm25.md index 35cb2c4278..ef61957519 100644 --- a/developers/weaviate/search/bm25.md +++ b/developers/weaviate/search/bm25.md @@ -13,7 +13,7 @@ import PyCodeV3 from '!!raw-loader!/_includes/code/howto/search.bm25-v3.py'; import TSCode from '!!raw-loader!/_includes/code/howto/search.bm25.ts'; import TSCodeLegacy from '!!raw-loader!/_includes/code/howto/search.bm25-v2.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/mainpkg/search-bm25_test.go'; - +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/search/KeywordSearchTest.java'; `Keyword` search, also called "BM25 (Best match 25)" or "sparse vector" search, returns objects that have the highest BM25F scores. @@ -36,7 +36,7 @@ To use BM25 keyword search, define a search string. text={PyCodeV3} startMarker="# BM25BasicPython" endMarker="# END BM25BasicPython" - language="python" + language="pyv3" /> @@ -54,7 +54,7 @@ To use BM25 keyword search, define a search string. text={TSCodeLegacy} startMarker="// START Basic" endMarker="// END Basic" - language="js" + language="tsv2" /> @@ -67,6 +67,15 @@ To use BM25 keyword search, define a search string. /> + + + + @@ -128,7 +137,7 @@ You can retrieve the BM25F `score` values for each returned object. text={TSCodeLegacy} startMarker="// START Score" endMarker="// END Score" - language="js" + language="tsv2" /> @@ -141,6 +150,15 @@ You can retrieve the BM25F `score` values for each returned object. /> + + + + @@ -205,7 +223,7 @@ A keyword search can be directed to only search a subset of object properties. I text={TSCodeLegacy} startMarker="// START Properties" endMarker="// END Properties" - language="js" + language="tsv2" /> @@ -218,6 +236,14 @@ A keyword search can be directed to only search a subset of object properties. I /> + + + @@ -282,7 +308,16 @@ You can weight how much each property affects the overall BM25F score. This exam text={TSCodeLegacy} startMarker="// START Boost" endMarker="// END Boost" - language="js" + language="tsv2" + /> + + + + @@ -348,7 +383,7 @@ import TknTsCodeLegacy from '!!raw-loader!/_includes/code/howto/manage-data.coll text={TknPyCodeV3} startMarker="# START PropModuleSettings" endMarker="# END PropModuleSettings" - language="py" + language="pyv3" /> @@ -366,7 +401,16 @@ import TknTsCodeLegacy from '!!raw-loader!/_includes/code/howto/manage-data.coll text={TknTsCodeLegacy} startMarker="// START PropModuleSettings" endMarker="// END PropModuleSettings" - language="ts" + language="tsv2" + /> + + + + @@ -392,7 +436,7 @@ Optionally, use `offset` to paginate the results. text={PyCodeV3} startMarker="# START limit Python" endMarker="# END limit Python" - language="py" + language="pyv3" /> @@ -410,7 +454,7 @@ Optionally, use `offset` to paginate the results. text={TSCodeLegacy} startMarker="// START limit" endMarker="// END limit" - language="ts" + language="tsv2" /> @@ -423,6 +467,15 @@ Optionally, use `offset` to paginate the results. /> + + + + @@ -470,7 +523,7 @@ To limit results to groups of similar distances to the query, use the [`autocut` text={TSCodeLegacy} startMarker="// START autocut" endMarker="// END autocut" - language="ts" + language="tsv2" /> @@ -483,6 +536,14 @@ To limit results to groups of similar distances to the query, use the [`autocut` /> + + + + + + +
@@ -557,7 +627,7 @@ For more specific results, use a [`filter`](../api/graphql/filters.md) to narrow text={PyCodeV3} startMarker="# BM25WithFilterPython" endMarker="# END BM25WithFilterPython" - language="python" + language="pyv3" /> @@ -575,7 +645,7 @@ For more specific results, use a [`filter`](../api/graphql/filters.md) to narrow text={TSCodeLegacy} startMarker="// START Filter" endMarker="// END Filter" - language="js" + language="tsv2" /> @@ -588,6 +658,15 @@ For more specific results, use a [`filter`](../api/graphql/filters.md) to narrow /> + + + + @@ -55,7 +55,7 @@ Add a `filter` to your query, to limit the result set. text={JavaScriptCodeLegacy} startMarker="// searchSingleFilter" endMarker="// END searchSingleFilter" - language="js" + language="tsv2" /> @@ -143,7 +143,7 @@ To filter with two or more conditions, use `And` or `Or` to define the relations text={PyCodeV3} startMarker="# MultipleFiltersAndPython" endMarker="# END MultipleFiltersAndPython" - language="python" + language="pyv3" /> @@ -168,7 +168,7 @@ To filter with two or more conditions, use `And` or `Or` to define the relations text={JavaScriptCodeLegacy} startMarker="// searchMultipleFiltersAnd" endMarker="// END searchMultipleFiltersAnd" - language="js" + language="tsv2" /> @@ -224,7 +224,7 @@ You can group and nest filters. text={PyCodeV3} startMarker="# MultipleFiltersNestedPython" endMarker="# END MultipleFiltersNestedPython" - language="python" + language="pyv3" /> @@ -242,7 +242,7 @@ You can group and nest filters. text={JavaScriptCodeLegacy} startMarker="// searchMultipleFiltersNested" endMarker="// END searchMultipleFiltersNested" - language="js" + language="tsv2" /> @@ -312,7 +312,7 @@ Filters work with search operators like `nearXXX`, `hybrid`, and `bm25`. text={PyCodeV3} startMarker="# SingleFilterNearTextPython" endMarker="# END SingleFilterNearTextPython" - language="python" + language="pyv3" /> @@ -330,7 +330,7 @@ Filters work with search operators like `nearXXX`, `hybrid`, and `bm25`. text={JavaScriptCodeLegacy} startMarker="// searchFilterNearText" endMarker="// END searchFilterNearText" - language="js" + language="tsv2" /> @@ -386,7 +386,7 @@ The `ContainsAny` operator works on text properties and take an array of values text={PyCodeV3} startMarker="# ContainsAnyFilter" endMarker="# END ContainsAnyFilter" - language="python" + language="pyv3" /> @@ -404,7 +404,7 @@ The `ContainsAny` operator works on text properties and take an array of values text={JavaScriptCodeLegacy} startMarker="// ContainsAnyFilter" endMarker="// END ContainsAnyFilter" - language="js" + language="tsv2" /> @@ -460,7 +460,7 @@ The `ContainsAll` operator works on text properties and take an array of values text={PyCodeV3} startMarker="# ContainsAllFilter" endMarker="# END ContainsAllFilter" - language="python" + language="pyv3" /> @@ -478,7 +478,7 @@ The `ContainsAll` operator works on text properties and take an array of values text={JavaScriptCodeLegacy} startMarker="// ContainsAllFilter" endMarker="// END ContainsAllFilter" - language="js" + language="tsv2" /> @@ -538,7 +538,7 @@ If the object property is a `text`, or `text`-like data type such as object ID, text={PyCodeV3} startMarker="# LikeFilterPython" endMarker="# END LikeFilterPython" - language="python" + language="pyv3" /> @@ -556,7 +556,7 @@ If the object property is a `text`, or `text`-like data type such as object ID, text={JavaScriptCodeLegacy} startMarker="// searchLikeFilter" endMarker="// END searchLikeFilter" - language="js" + language="tsv2" /> @@ -624,7 +624,7 @@ To filter on properties from a cross-referenced object, add the collection name text={PyCodeV3} startMarker="# CrossReferencePython" endMarker="# END CrossReferencePython" - language="python" + language="pyv3" /> @@ -642,7 +642,7 @@ To filter on properties from a cross-referenced object, add the collection name text={JavaScriptCodeLegacy} startMarker="// searchSingleFilter" endMarker="// END searchSingleFilter" - language="js" + language="tsv2" /> @@ -699,7 +699,7 @@ import GeoLimitations from '/_includes/geo-limitations.mdx'; text={PyCodeV3} startMarker="# START FilterbyGeolocation" endMarker="# END FilterbyGeolocation" - language="python" + language="pyv3" /> @@ -716,7 +716,7 @@ import GeoLimitations from '/_includes/geo-limitations.mdx'; text={JavaScriptCode} startMarker="// FilterbyGeolocation" endMarker="// END FilterbyGeolocation" - language="js" + language="tsv2" /> @@ -792,7 +792,7 @@ For the full list, see [API references: Filters](../api/graphql/filters.md#speci text={PyCodeV3} startMarker="# START FilterById" endMarker="# END FilterById" - language="python" + language="pyv3" /> @@ -808,7 +808,7 @@ For the full list, see [API references: Filters](../api/graphql/filters.md#speci text={JavaScriptCodeLegacy} startMarker="// filterById" endMarker="// END filterById" - language="js" + language="tsv2" /> @@ -849,7 +849,7 @@ This filter requires the [property timestamp](../config-refs/schema/index.md#ind text={PyCodeV3} startMarker="# START FilterByTimestamp" endMarker="# END FilterByTimestamp" - language="python" + language="pyv3" /> @@ -907,7 +907,7 @@ This filter requires the [property length](../config-refs/schema/index.md#indexp text={PyCodeV3} startMarker="# START FilterByPropertyLength" endMarker="# END FilterByPropertyLength" - language="python" + language="pyv3" /> @@ -924,7 +924,7 @@ This filter requires the [property length](../config-refs/schema/index.md#indexp text={JavaScriptCodeLegacy} startMarker="// FilterByPropertyLength" endMarker="// END FilterByPropertyLength" - language="js" + language="tsv2" /> @@ -965,7 +965,7 @@ This filter requires the [property null state](../config-refs/schema/index.md#in text={PyCodeV3} startMarker="# START FilterByPropertyNullState" endMarker="# END FilterByPropertyNullState" - language="python" + language="pyv3" /> diff --git a/developers/weaviate/search/generative.md b/developers/weaviate/search/generative.md index a0f57949ba..8f78ef7782 100644 --- a/developers/weaviate/search/generative.md +++ b/developers/weaviate/search/generative.md @@ -14,24 +14,18 @@ import TSCode from '!!raw-loader!/_includes/code/howto/search.generative.ts'; import TSCodeLegacy from '!!raw-loader!/_includes/code/howto/search.generative-v2.ts'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/mainpkg/search-generative_test.go'; -"Retrieval Augmented Generation" (RAG), also called generative search, is a multi-stage process. +Retrieval Augmented Generation (RAG) combines information retrieval with generative AI models. -First Weaviate performs a query, then it passes the retrieved results and a prompt to a large language model (LLM), to generate a new output. +In Weaviate, a RAG query consists of two parts: *a search query*, and a *prompt for the model*. Weaviate first performs the search, then passes both the search results and your prompt to a generative AI model before returning the generated response.
- Additional information + How to configure RAG -### Configure RAG +To use RAG, a collection must be configured to use a [generative model integration](../model-providers/index.md). -1. Configure Weaviate to enable a [generative model integration](../model-providers/index.md). - 2. Configure the target collection to use the generator module. For details, see schema configuration on the module reference page. - 3. Query your database to retrieve one or more objects. - 4. Use the query results to generate a new result. - - - [`single prompt`](#single-prompt) - - [`grouped task`](#grouped-task) +See the relevant model provider documentation for more details.
@@ -57,7 +51,7 @@ Any vector-based search on collections with [named vectors](../config-refs/schem text={PyCodeV3} startMarker="# NamedVectorNearTextPython" endMarker="# END NamedVectorNearTextPython" - language="python" + language="pyv3" />
@@ -75,7 +69,7 @@ Any vector-based search on collections with [named vectors](../config-refs/schem text={TSCodeLegacy} startMarker="// NamedVectorNearText" endMarker="// END NamedVectorNearText" - language="ts" + language="tsv2" /> @@ -110,7 +104,7 @@ The properties you use in the prompt do not have to be among the properties you text={PyCodeV3} startMarker="# SingleGenerativePropertiesPython" endMarker="# END SingleGenerativePropertiesPython" - language="py" + language="pyv3" /> @@ -128,7 +122,7 @@ The properties you use in the prompt do not have to be among the properties you text={TSCodeLegacy} startMarker="// SingleGenerativeProperties TS" endMarker="// END SingleGenerativeProperties TS" - language="js" + language="tsv2" /> @@ -184,7 +178,7 @@ Grouped task search returns one response that includes all of the query results. text={PyCodeV3} startMarker="# GroupedGenerativePython" endMarker="# END GroupedGenerativePython" - language="py" + language="pyv3" /> @@ -202,7 +196,7 @@ Grouped task search returns one response that includes all of the query results. text={TSCodeLegacy} startMarker="// GroupedGenerative TS" endMarker="// END GroupedGenerative TS" - language="js" + language="tsv2" /> @@ -261,7 +255,7 @@ Define object `properties` to use in the prompt. This limits the information in text={PyCodeV3} startMarker="# GroupedGenerativeProperties Python" endMarker="# END GroupedGenerativeProperties Python" - language="py" + language="pyv3" /> @@ -279,7 +273,7 @@ Define object `properties` to use in the prompt. This limits the information in text={TSCodeLegacy} startMarker="// GroupedGenerativeProperties" endMarker="// END GroupedGenerativeProperties" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/search/hybrid.md b/developers/weaviate/search/hybrid.md index 691fe9e5be..2f512e677a 100644 --- a/developers/weaviate/search/hybrid.md +++ b/developers/weaviate/search/hybrid.md @@ -37,7 +37,7 @@ Combine the results of a vector search and a keyword search. The search uses a s text={PyCodeV3} startMarker="# HybridBasicPython" endMarker="# END HybridBasicPython" - language="python" + language="pyv3" /> @@ -55,7 +55,7 @@ Combine the results of a vector search and a keyword search. The search uses a s text={TSCodeLegacy} startMarker="// searchHybridBasic" endMarker="// END searchHybridBasic" - language="js" + language="tsv2" /> @@ -113,7 +113,7 @@ A hybrid search on a collection that has [named vectors](../config-refs/schema/m text={PyCodeV3} startMarker="# NamedVectorHybridPython" endMarker="# END NamedVectorHybridPython" - language="python" + language="pyv3" /> @@ -129,7 +129,7 @@ A hybrid search on a collection that has [named vectors](../config-refs/schema/m text={TSCodeLegacy} startMarker="// NamedVectorHybrid" endMarker="// END NamedVectorHybrid" - language="ts" + language="tsv2" /> @@ -175,7 +175,7 @@ To see the object rankings, set the `explain score` field in your query. The sea text={PyCodeV3} startMarker="# HybridWithScorePython" endMarker="# END HybridWithScorePython" - language="python" + language="pyv3" /> @@ -193,7 +193,7 @@ To see the object rankings, set the `explain score` field in your query. The sea text={TSCodeLegacy} startMarker="// searchHybridWithScore" endMarker="// END searchHybridWithScore" - language="js" + language="tsv2" /> @@ -252,7 +252,7 @@ Hybrid search results can favor the keyword component or the vector component. T text={PyCodeV3} startMarker="# HybridWithAlphaPython" endMarker="# END HybridWithAlphaPython" - language="python" + language="pyv3" /> @@ -270,7 +270,7 @@ Hybrid search results can favor the keyword component or the vector component. T text={TSCodeLegacy} startMarker="// searchHybridWithAlpha" endMarker="// END searchHybridWithAlpha" - language="js" + language="tsv2" /> @@ -329,7 +329,7 @@ The output is like this: text={PyCodeV3} startMarker="# HybridWithFusionTypePython" endMarker="# END HybridWithFusionTypePython" - language="python" + language="pyv3" /> @@ -347,7 +347,7 @@ The output is like this: text={TSCodeLegacy} startMarker="// searchHybridWithFusionType" endMarker="// END searchHybridWithFusionType" - language="ts" + language="tsv2" /> @@ -415,7 +415,7 @@ The keyword search portion of hybrid search can be directed to only search a sub text={PyCodeV3} startMarker="# HybridWithPropertiesPython" endMarker="# END HybridWithPropertiesPython" - language="python" + language="pyv3" /> @@ -433,7 +433,7 @@ The keyword search portion of hybrid search can be directed to only search a sub text={TSCodeLegacy} startMarker="// searchHybridWithProperties" endMarker="// END searchHybridWithProperties" - language="js" + language="tsv2" /> @@ -489,7 +489,7 @@ Specify the relative value of an object's `properties` in the keyword search. Hi text={PyCodeV3} startMarker="# HybridWithPropertyWeightingPython" endMarker="# END HybridWithPropertyWeightingPython" - language="python" + language="pyv3" /> @@ -507,7 +507,7 @@ Specify the relative value of an object's `properties` in the keyword search. Hi text={TSCodeLegacy} startMarker="// searchHybridWithPropertyWeighting" endMarker="// END searchHybridWithPropertyWeighting" - language="js" + language="tsv2" /> @@ -563,7 +563,7 @@ The vector component of hybrid search can use a query string or a query vector. text={PyCodeV3} startMarker="# HybridWithVectorPython" endMarker="# END HybridWithVectorPython" - language="python" + language="pyv3" /> @@ -581,7 +581,7 @@ The vector component of hybrid search can use a query string or a query vector. text={TSCodeLegacy} startMarker="// searchHybridWithVector" endMarker="// END searchHybridWithVector" - language="js" + language="tsv2" /> @@ -623,14 +623,14 @@ The output is like this: :::info Added in `v1.25` ::: -You can specify [vector similarity search](/developers/weaviate/search/similarity) parameters similar to [near text](/developers/weaviate/search/similarity.md#search-with-text) or [near vector](/developers/weaviate/search/similarity.md#search-with-a-vector) searches, such as `group by` and `move to` / `move away`. An equvalent `distance` [threshold for vector search](./similarity.md#set-a-similarity-threshold) can be specified with the `max vector distance` parameter. +You can specify [vector similarity search](/developers/weaviate/search/similarity) parameters similar to [near text](/developers/weaviate/search/similarity.md#search-with-text) or [near vector](/developers/weaviate/search/similarity.md#search-with-a-vector) searches, such as `group by` and `move to` / `move away`. An equivalent `distance` [threshold for vector search](./similarity.md#set-a-similarity-threshold) can be specified with the `max vector distance` parameter. @@ -640,7 +640,7 @@ You can specify [vector similarity search](/developers/weaviate/search/similarit text={PyCodeV3} startMarker="# VectorSimilarityGraphQL" endMarker="# END VectorSimilarityGraphQL" - language="python" + language="pyv3" /> @@ -667,6 +667,32 @@ The output is like this:
+## Hybrid search thresholds + +:::info Added in `v1.25` +::: + +The only available search threshold is `max vector distance`, which will set the maximum allowable distance for the vector search component. + + + + + + + + +```ts +// TS support coming soon +``` + + + + ## Group results :::info Added in `v1.25` @@ -718,7 +744,7 @@ Optionally, use `offset` to paginate the results. text={PyCodeV3} startMarker="# START limit Python" endMarker="# END limit Python" - language="py" + language="pyv3" /> @@ -736,7 +762,7 @@ Optionally, use `offset` to paginate the results. text={TSCodeLegacy} startMarker="// START limit" endMarker="// END limit" - language="ts" + language="tsv2" /> @@ -778,7 +804,7 @@ To limit results to groups with similar distances from the query, use the [`auto text={PyCodeV3} startMarker="# START autocut Python" endMarker="# END autocut Python" - language="py" + language="pyv3" /> @@ -796,7 +822,7 @@ To limit results to groups with similar distances from the query, use the [`auto text={TSCodeLegacy} startMarker="// START autocut" endMarker="// END autocut" - language="ts" + language="tsv2" /> @@ -852,7 +878,7 @@ To narrow your search results, use a [`filter`](../api/graphql/filters.md). text={PyCodeV3} startMarker="# HybridWithFilterPython" endMarker="# END HybridWithFilterPython" - language="python" + language="pyv3" /> @@ -870,7 +896,7 @@ To narrow your search results, use a [`filter`](../api/graphql/filters.md). text={TSCodeLegacy} startMarker="// searchHybridWithFilter" endMarker="// END searchHybridWithFilter" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/search/image.md b/developers/weaviate/search/image.md index 3d15bc7d9b..d3644fe9d3 100644 --- a/developers/weaviate/search/image.md +++ b/developers/weaviate/search/image.md @@ -55,14 +55,12 @@ If your query image is stored in a file, you can use the client library to searc text={PyCodeV3} startMarker="# START ImageFileSearch" endMarker="# END ImageFileSearch" - language="py" + language="pyv3" /> - > Not available yet. Vote for the [feature request](https://github.com/weaviate/typescript-client/issues/65). DYI code below. - - > Not available yet. Vote for the [feature request](https://github.com/weaviate/typescript-client/issues/65). DYI code below. + > Not available yet. Vote for the [feature request](https://github.com/weaviate/typescript-client/issues/65). DIY code below. Example response
@@ -155,7 +153,7 @@ You can search by a base64 representation of an image: text={TSCodeLegacy} startMarker="// START search with base64" endMarker="// END search with base64" - language="ts" + language="tsv2" /> @@ -191,6 +189,7 @@ You can search by a base64 representation of an image:
+ ## Create a base64 representation of an online image. You can create a base64 representation of an online image, and use it as input for similarity search [as shown above](#by-the-base64-representation). @@ -233,7 +232,6 @@ You can create a base64 representation of an online image, and use it as input f - ## Combination with other operators A `Near Image` search can be combined with any other operators (like filter, limit, etc.), just as other similarity search operators. diff --git a/developers/weaviate/search/multi-vector.md b/developers/weaviate/search/multi-vector.md index bce3916fc2..5c3caee5de 100644 --- a/developers/weaviate/search/multi-vector.md +++ b/developers/weaviate/search/multi-vector.md @@ -15,7 +15,7 @@ import GoCode from '!!raw-loader!/_includes/code/howto/search.multi-target.go'; :::info Added in `v1.26` ::: -In a multi-target vector search, Weaviate searches multiple target vector spaces concurrently and combines the results. A multi-target vector search produce a single set of search results. +In a multi-target vector search, Weaviate searches multiple target vector spaces concurrently. These results are combined using a ["join strategy"](#available-join-strategies) to produce a single set of search results. There are multiple ways to specify the target vectors and query vectors, such as: @@ -27,24 +27,8 @@ There are multiple ways to specify the target vectors and query vectors, such as -## Combining search results - -A multi-target vector search involves multiple, concurrent, single-target vector searches. These searches will produce multiple sets of results, each with a vector distance score. - -These distances are combined using a ["join strategy"](#available-join-strategies). - -
- How Weaviate combines search results - -- If an object is within the search limit or the distance threshold of any of the target vectors, it will be included in the search results. -- If an object does not contain vectors for any selected target vector, Weaviate ignores that object and does not include it in the search results. - -
- ### Available join strategies. -These are the available join strategies: - - **minimum** (*default*) Use the minimum of all vector distances. - **sum** Use the sum of the vector distances. - **average** Use the average of the vector distances. @@ -121,7 +105,7 @@ You can also specify the query vectors as an array of vectors. The array will be :::info Added in `v1.27` ::: -Additionally to the above, you can specify the same target vector multiple times with different query vectors. In other words, you can use multiple query vectors for the same target vector. +You can also specify the same target vector multiple times with different query vectors. In other words, you can use multiple query vectors for the same target vector. The query vectors in this case are specified as an array of vectors. There are multiple ways to specify the target vectors in this case: @@ -138,12 +122,14 @@ The target vectors can be specified as an array as shown here. language="python" /> - - -```ts -// Coming soon -``` + + @@ -160,12 +146,14 @@ If you want to provide weights for each target vector you can do it as shown her language="python" /> - - -```ts -// Coming soon -``` + + diff --git a/developers/weaviate/search/rerank.md b/developers/weaviate/search/rerank.md index 73e05b1b86..f863e239c5 100644 --- a/developers/weaviate/search/rerank.md +++ b/developers/weaviate/search/rerank.md @@ -57,7 +57,7 @@ Any vector-based search on collections with [named vectors](../config-refs/schem text={SimilarityPyCodeV3} startMarker="# NamedVectorNearTextPython" endMarker="# END NamedVectorNearTextPython" - language="python" + language="pyv3" /> @@ -75,7 +75,7 @@ Any vector-based search on collections with [named vectors](../config-refs/schem text={SimilarityTSCodeLegacy} startMarker="// NamedVectorNearText" endMarker="// END NamedVectorNearText" - language="ts" + language="tsv2" /> @@ -117,7 +117,7 @@ To rerank the results of a vector search, configure the object properties to sor text={PyCodeV3} startMarker="# START nearTextRerank Python" endMarker="# END nearTextRerank Python" - language="py" + language="pyv3" /> @@ -135,7 +135,7 @@ To rerank the results of a vector search, configure the object properties to sor text={TSCodeLegacy} startMarker="// START RerankNearText" endMarker="// END RerankNearText" - language="ts" + language="tsv2" /> @@ -191,7 +191,7 @@ To rerank the results of a keyword search, configure the object properties to so text={PyCodeV3} startMarker="# START bm25Rerank Python" endMarker="# END bm25Rerank Python" - language="py" + language="pyv3" /> @@ -209,7 +209,7 @@ To rerank the results of a keyword search, configure the object properties to so text={TSCodeLegacy} startMarker="// START bm25Rerank" endMarker="// END bm25Rerank" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/search/similarity.md b/developers/weaviate/search/similarity.md index 116c70c320..6d4ebc4665 100644 --- a/developers/weaviate/search/similarity.md +++ b/developers/weaviate/search/similarity.md @@ -36,7 +36,7 @@ Use the [`Near Text`](../api/graphql/search-operators.md#neartext) operator to f text={PyCodeV3} startMarker="# GetNearTextPython" endMarker="# END GetNearTextPython" - language="python" + language="pyv3" /> @@ -54,7 +54,7 @@ Use the [`Near Text`](../api/graphql/search-operators.md#neartext) operator to f text={TSCodeLegacy} startMarker="// GetNearText" endMarker="// END GetNearText" - language="ts" + language="tsv2" /> @@ -126,7 +126,7 @@ This example uses a base64 representation of an image. text={ImgSrchPyCodeV3} startMarker="# START search with base64" endMarker="# END search with base64" - language="py" + language="pyv3" /> @@ -144,7 +144,7 @@ This example uses a base64 representation of an image. text={ImgSrchTSCodeLegacy} startMarker="// START search with base64" endMarker="// END search with base64" - language="ts" + language="tsv2" /> @@ -180,7 +180,7 @@ If you have an object ID, use the [`Near Object`](../api/graphql/search-operator text={PyCodeV3} startMarker="# GetNearObjectPython" endMarker="# END GetNearObjectPython" - language="python" + language="pyv3" /> @@ -198,7 +198,7 @@ If you have an object ID, use the [`Near Object`](../api/graphql/search-operator text={TSCode} startMarker="// GetNearObject" endMarker="// END GetNearObject" - language="ts" + language="tsv2" /> @@ -259,7 +259,7 @@ If you have an input vector, use the [`Near Vector`](../api/graphql/search-opera text={PyCodeV3} startMarker="# GetNearVectorPython" endMarker="# END GetNearVectorPython" - language="python" + language="pyv3" /> @@ -277,7 +277,7 @@ If you have an input vector, use the [`Near Vector`](../api/graphql/search-opera text={TSCodeLegacy} startMarker="// GetNearVector" endMarker="// END GetNearVector" - language="ts" + language="tsv2" /> @@ -340,7 +340,7 @@ To search a collection that has [named vectors](../config-refs/schema/multi-vect text={PyCodeV3} startMarker="# NamedVectorNearTextPython" endMarker="# END NamedVectorNearTextPython" - language="python" + language="pyv3" /> @@ -358,7 +358,7 @@ To search a collection that has [named vectors](../config-refs/schema/multi-vect text={TSCodeLegacy} startMarker="// NamedVectorNearText" endMarker="// END NamedVectorNearText" - language="ts" + language="tsv2" /> @@ -423,7 +423,7 @@ To set a similarity threshold between the search and target vectors, define a ma text={PyCodeV3} startMarker="# GetWithDistancePython" endMarker="# END GetWithDistancePython" - language="python" + language="pyv3" /> @@ -441,7 +441,7 @@ To set a similarity threshold between the search and target vectors, define a ma text={TSCodeLegacy} startMarker="// GetWithDistance" endMarker="// END GetWithDistance" - language="ts" + language="tsv2" /> @@ -503,7 +503,7 @@ Optionally, use `offset` to paginate the results. text={PyCodeV3} startMarker="# GetLimitOffsetPython" endMarker="# END GetLimitOffsetPython" - language="python" + language="pyv3" /> @@ -521,7 +521,7 @@ Optionally, use `offset` to paginate the results. text={TSCodeLegacy} startMarker="// GetLimitOffset" endMarker="// END GetLimitOffset" - language="ts" + language="tsv2" /> @@ -572,7 +572,7 @@ To limit results to groups of similar distances to the query, use the [`autocut` text={PyCodeV3} startMarker="# START Autocut Python" endMarker="# END Autocut Python" - language="py" + language="pyv3" /> @@ -590,7 +590,7 @@ To limit results to groups of similar distances to the query, use the [`autocut` text={TSCodeLegacy} startMarker="// START Autocut" endMarker="// END Autocut" - language="ts" + language="tsv2" /> @@ -655,7 +655,7 @@ Use a property or a cross-reference to group results. To group returned objects, text={PyCodeV3} startMarker="# GetWithGroupbyPython" endMarker="# END GetWithGroupbyPython" - language="python" + language="pyv3" /> @@ -673,7 +673,7 @@ Use a property or a cross-reference to group results. To group returned objects, text={TSCodeLegacy} startMarker="// GetWithGroupBy" endMarker="// END GetWithGroupBy" - language="ts" + language="tsv2" /> @@ -738,7 +738,7 @@ For more specific results, use a [`filter`](../api/graphql/filters.md) to narrow text={PyCodeV3} startMarker="# GetWithWherePython" endMarker="# END GetWithWherePython" - language="python" + language="pyv3" /> @@ -756,7 +756,7 @@ For more specific results, use a [`filter`](../api/graphql/filters.md) to narrow text={TSCodeLegacy} startMarker="// GetWithFilter" endMarker="// END GetWithFilter" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/starter-guides/custom-vectors.mdx b/developers/weaviate/starter-guides/custom-vectors.mdx index 97e285ca82..65b4ae5089 100644 --- a/developers/weaviate/starter-guides/custom-vectors.mdx +++ b/developers/weaviate/starter-guides/custom-vectors.mdx @@ -14,7 +14,7 @@ import ByovAllTsCode from '!!raw-loader!/_includes/code/quickstart.byov.all.ts'; import ByovAllTsCodeLegacy from '!!raw-loader!/_includes/code/quickstart.byov.all.legacy.ts'; import ByovAllShCode from '!!raw-loader!/_includes/code/quickstart.byov.all.sh'; -Weaviate is a vector database. [Vector databases](/blog/vector-library-vs-vector-database) store data objects and vectors that represent those objects. The vector representation is also called an "embedding." +Weaviate is a vector database. [Vector databases](/blog/what-is-a-vector-database) store data objects and vectors that represent those objects. The vector representation is also called an "embedding." When you import data, you can pass pre-existing vectors or generate new ones. "Bring your own vectors" means you supply the vector embeddings when you upload your data. The embeddings you provide can be custom vectors or vectors that are pre-generated using a [model provider](/developers/weaviate/model-providers). @@ -190,7 +190,7 @@ This [`nearVector`](/developers/weaviate/search/similarity#search-with-a-vector) text={ByovAllTsCodeLegacy} startMarker="// Query using nearVector" endMarker="END-OF-FILE" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/starter-guides/generative.md b/developers/weaviate/starter-guides/generative.md index 5d322bb6d8..7734a159bd 100644 --- a/developers/weaviate/starter-guides/generative.md +++ b/developers/weaviate/starter-guides/generative.md @@ -1,5 +1,6 @@ --- title: Retrieval augmented generation (RAG) +description: Get started with generative search in Weaviate for personalized data retrieval. sidebar_position: 50 image: og/docs/tutorials.jpg # tags: ['getting started'] @@ -15,9 +16,6 @@ import TSCodeEduDemoLegacy from '!!raw-loader!/_includes/code/starter-guides/gen import TSCodeLocal from '!!raw-loader!/_includes/code/starter-guides/generative_local.ts'; import TSCodeLocalLegacy from '!!raw-loader!/_includes/code/starter-guides/generative_local-v2.ts'; - -## Overview - :::info Related pages - [Which Weaviate is right for me?](./which-weaviate.md) - [How-to: Retrieval augmented generation](../search/generative.md) @@ -84,7 +82,7 @@ Connect to the instance like so, remembering to replace the API key for the LLM text={PyCodeV3} startMarker="# Instantiation" endMarker="# END Instantiation" - language="py" + language="pyv3" /> @@ -101,7 +99,7 @@ Connect to the instance like so, remembering to replace the API key for the LLM text={TSCodeEduDemoLegacy} startMarker="// Instantiation" endMarker="// END Instantiation" - language="ts" + language="tsv2" /> @@ -127,7 +125,7 @@ Before we can generate text, we need to retrieve relevant data. Let's retrieve t text={PyCodeV3} startMarker="# DataRetrieval" endMarker="# END DataRetrieval" - language="py" + language="pyv3" /> @@ -143,7 +141,7 @@ Before we can generate text, we need to retrieve relevant data. Let's retrieve t text={TSCodeEduDemoLegacy} startMarker="// DataRetrieval" endMarker="// END DataRetrieval" - language="ts" + language="tsv2" /> @@ -197,7 +195,7 @@ Run the following code snippet, and inspect the results: text={PyCodeV3} startMarker="# TransformResultSets" endMarker="# END TransformResultSets" - language="py" + language="pyv3" /> @@ -213,7 +211,7 @@ Run the following code snippet, and inspect the results: text={TSCodeEduDemoLegacy} startMarker="// TransformResultSets" endMarker="// END TransformResultSets" - language="ts" + language="tsv2" /> @@ -266,7 +264,7 @@ Note that in this query, we apply a `single prompt` parameter. This means that t text={PyCodeV3} startMarker="# TransformIndividualObjects" endMarker="# END TransformIndividualObjects" - language="py" + language="pyv3" /> @@ -282,7 +280,7 @@ Note that in this query, we apply a `single prompt` parameter. This means that t text={TSCodeEduDemoLegacy} startMarker="// TransformIndividualObjects" endMarker="// END TransformIndividualObjects" - language="ts" + language="tsv2" /> @@ -322,12 +320,9 @@ For this example, you will need access to a Weaviate instance that you can write ### Configure Weaviate for RAG -:::caution Generative module cannot be changed -Currently, a generative module cannot be changed in the Weaviate collection definition once it has been set. We are looking to change this going forward. -
+import MutableGenerativeConfig from '/_includes/mutable-generative-config.md'; -If you would like us to prioritize this issue, upvote it on [GitHub](https://github.com/weaviate/weaviate/issues/3364). -::: + To use RAG, the appropriate `generative-xxx` module must be: - Enabled in Weaviate, and @@ -356,7 +351,7 @@ You can check which modules are enabled by viewing the `meta` information for yo text={PyCodeV3} startMarker="# ListModules" endMarker="# END ListModules" - language="py" + language="pyv3" /> @@ -372,7 +367,7 @@ You can check which modules are enabled by viewing the `meta` information for yo text={TSCodeEduDemoLegacy} startMarker="// ListModules" endMarker="// END ListModules" - language="ts" + language="tsv2" /> @@ -460,7 +455,7 @@ In the following snippet, we download a chapter of the `Pro Git` book, clean it text={PyCodeV3} startMarker="# ChunkText" endMarker="# END ChunkText" - language="py" + language="pyv3" /> @@ -476,7 +471,7 @@ In the following snippet, we download a chapter of the `Pro Git` book, clean it text={TSCodeLocalLegacy} startMarker="// ChunkText" endMarker="// END ChunkText" - language="ts" + language="tsv2" /> @@ -503,7 +498,7 @@ The below collection definition for the `GitBookChunk` collection specifies `tex text={PyCodeV3} startMarker="# CreateClass" endMarker="# END CreateClass" - language="py" + language="pyv3" /> @@ -519,7 +514,7 @@ The below collection definition for the `GitBookChunk` collection specifies `tex text={TSCodeLocalLegacy} startMarker="// CreateClass" endMarker="// END CreateClass" - language="ts" + language="tsv2" /> @@ -542,7 +537,7 @@ Now, we can import the data into Weaviate. text={PyCodeV3} startMarker="# ImportData" endMarker="# END ImportData" - language="py" + language="pyv3" /> @@ -558,7 +553,7 @@ Now, we can import the data into Weaviate. text={TSCodeLocalLegacy} startMarker="// ImportData" endMarker="// END ImportData" - language="ts" + language="tsv2" /> @@ -579,7 +574,7 @@ Once this is done, you should have imported a collection of chunks from the chap text={PyCodeV3} startMarker="# CountObjects" endMarker="# END CountObjects" - language="py" + language="pyv3" /> @@ -595,7 +590,7 @@ Once this is done, you should have imported a collection of chunks from the chap text={TSCodeLocalLegacy} startMarker="// CountObjects" endMarker="// END CountObjects" - language="ts" + language="tsv2" /> @@ -624,7 +619,7 @@ Single prompts tell Weaviate to generate text based on each retrieved object and text={PyCodeV3} startMarker="# SinglePrompt" endMarker="# END SinglePrompt" - language="py" + language="pyv3" /> @@ -640,7 +635,7 @@ Single prompts tell Weaviate to generate text based on each retrieved object and text={TSCodeLocalLegacy} startMarker="// SinglePrompt" endMarker="// END SinglePrompt" - language="ts" + language="tsv2" /> @@ -679,7 +674,7 @@ In this example, we prompt the language model to write a trivia tweet based on t text={PyCodeV3} startMarker="# GroupedTask" endMarker="# END GroupedTask" - language="py" + language="pyv3" /> @@ -695,7 +690,7 @@ In this example, we prompt the language model to write a trivia tweet based on t text={TSCodeLocalLegacy} startMarker="// GroupedTask" endMarker="// END GroupedTask" - language="ts" + language="tsv2" /> @@ -728,7 +723,7 @@ In this example, we search the chapter for passages that relate to the states of text={PyCodeV3} startMarker="# NearTextGroupedTask" endMarker="# END NearTextGroupedTask" - language="py" + language="pyv3" /> @@ -744,7 +739,7 @@ In this example, we search the chapter for passages that relate to the states of text={TSCodeLocalLegacy} startMarker="// NearTextGroupedTask" endMarker="// END NearTextGroupedTask" - language="ts" + language="tsv2" /> @@ -773,7 +768,7 @@ Now, simply by changing the search query, we can generate similar content about text={PyCodeV3} startMarker="# SecondNearTextGroupedTask" endMarker="# END SecondNearTextGroupedTask" - language="py" + language="pyv3" /> @@ -789,7 +784,7 @@ Now, simply by changing the search query, we can generate similar content about text={TSCodeLocalLegacy} startMarker="// SecondNearTextGroupedTask" endMarker="// END SecondNearTextGroupedTask" - language="ts" + language="tsv2" /> diff --git a/developers/weaviate/starter-guides/managing-resources/compression.mdx b/developers/weaviate/starter-guides/managing-resources/compression.mdx index d494f8fc56..af7833c214 100644 --- a/developers/weaviate/starter-guides/managing-resources/compression.mdx +++ b/developers/weaviate/starter-guides/managing-resources/compression.mdx @@ -5,10 +5,6 @@ image: og/docs/tutorials.jpg # tags: ['basics'] --- -Use compression to lower system requirements and save on infrastructure costs. - -## Overview - Weaviate stores vector representations, also called "vector embeddings" or simply "vectors." Each element of a vector embedding is a dimension. The values are commonly stored as 32 bit floats. A single vector with 1536 dimensions uses about 6 KB of storage. When collections have millions of objects, the total storage size for the vectors can be very large. The vectors are not just stored, they are indexed as well. This index can also grow very large. The resource costs to host the vectors and the index can be expensive. diff --git a/developers/weaviate/starter-guides/managing-resources/img/tenant_state_selection.png b/developers/weaviate/starter-guides/managing-resources/img/tenant_state_selection.png deleted file mode 100644 index e15f48cb57..0000000000 Binary files a/developers/weaviate/starter-guides/managing-resources/img/tenant_state_selection.png and /dev/null differ diff --git a/developers/weaviate/starter-guides/managing-resources/img/vector_compression_selection.png b/developers/weaviate/starter-guides/managing-resources/img/vector_compression_selection.png deleted file mode 100644 index 96fa0f129f..0000000000 Binary files a/developers/weaviate/starter-guides/managing-resources/img/vector_compression_selection.png and /dev/null differ diff --git a/developers/weaviate/starter-guides/managing-resources/img/vector_index_selection.png b/developers/weaviate/starter-guides/managing-resources/img/vector_index_selection.png deleted file mode 100644 index a6e8d4bb74..0000000000 Binary files a/developers/weaviate/starter-guides/managing-resources/img/vector_index_selection.png and /dev/null differ diff --git a/developers/weaviate/starter-guides/managing-resources/index.md b/developers/weaviate/starter-guides/managing-resources/index.md index 86853eecb5..638ea38a93 100644 --- a/developers/weaviate/starter-guides/managing-resources/index.md +++ b/developers/weaviate/starter-guides/managing-resources/index.md @@ -1,12 +1,11 @@ --- title: Managing resources (Hot, Warm, Cold) +description: Learn to manage resources effectively in Weaviate for optimized performance. sidebar_position: 10 image: og/docs/tutorials.jpg # tags: ['basics'] --- -## Overview - Weaviate provides flexible resource management features that help you to balance search speeds; search accuracy and recall; and system resource costs. This guide provides an overview of these topics to help you make allocate resources effectively: @@ -96,7 +95,36 @@ The choice of vector index type can have a significant impact on performance and The choice of index type depends on the number of objects and the desired performance. As a rule of thumb, use the following guidelines for a multi-tenant collection: -![Index type selection rule of thumb flowchart](./img/vector_index_selection.png) +```mermaid +flowchart LR + %% Define nodes and connections + subgraph vectorIndex ["Vector Index Selection"] + direction LR + multiTenant{"Is multi-tenancy\nenabled?"} + objCount{"Does the collection have\nmore than 100k objects?"} + stayUnder{"Is the collection likely to stay\nat under 100k objects?"} + + multiTenant -->|No| objCount + multiTenant -->|Yes| useDynamic["Use Dynamic"] + objCount -->|Yes| useHNSW["Use HNSW"] + objCount -->|No| stayUnder + stayUnder -->|Yes| useFlat["Use Flat"] + stayUnder -->|"No/Unsure"| useDynamic["Use Dynamic"] + end + + %% Style nodes + style multiTenant fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style objCount fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style stayUnder fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Terminal nodes + style useHNSW fill:#ffffff,stroke:#61BD73,color:#130C49 + style useFlat fill:#ffffff,stroke:#61BD73,color:#130C49 + style useDynamic fill:#ffffff,stroke:#61BD73,color:#130C49 + + %% Style subgraph + style vectorIndex fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` If you are unsure which index type to use, the dynamic index type is a good starting point, as it automatically transitions from a flat to an HNSW index based on the number of objects. @@ -119,7 +147,41 @@ Weaviate supports the following vector compression methods: As a starting point, use the following guidelines for selecting a compression method: -![Vector compression selection rule of thumb flowchart](./img/vector_compression_selection.png) +```mermaid +flowchart LR + %% Define nodes and connections + subgraph compression ["Compression Strategy"] + direction LR + startIndexType{"What is your\nvector index type?"} + sample{"Do you have a\nrepresentative sample\nof your final dataset?"} + tunable{"Do you want\ntunable\ncompression?"} + bqcompat{"Is your vectorizer\nmodel compatible\nwith BQ?"} + + startIndexType -->|HNSW| sample + startIndexType -->|Flat| bqcompat + sample -->|Yes| tunable + tunable -->|Yes| usePQ["Use PQ"] + tunable -->|No| useSQ["Use SQ"] + sample -->|No| useBQ["Use BQ"] + bqcompat -->|Yes| useBQ["Use BQ"] + bqcompat -->|No| noCompress["Do not use\ncompression"] + end + + %% Style nodes + style startIndexType fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style sample fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style tunable fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style bqcompat fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Terminal nodes + style usePQ fill:#ffffff,stroke:#61BD73,color:#130C49 + style useSQ fill:#ffffff,stroke:#61BD73,color:#130C49 + style useBQ fill:#ffffff,stroke:#61BD73,color:#130C49 + style noCompress fill:#ffffff,stroke:#61BD73,color:#130C49 + + %% Style subgraph + style compression fill:#ffffff,stroke:#7AD6EB,stroke-width:2px,color:#130C49 +``` If you are unsure which index type to use, scalar quantization is a good starting point, provided that you have a representative sample of your likely final dataset. @@ -140,7 +202,32 @@ Weaviate supports the following tenant states: *Hot* tenants can be deactivated to *warm* storage to reduce memory usage, and any tenant can be offloaded to *cold* storage to reduce memory and disk usage. Conversely, any tenant can be reactivated when needed. -![Tenant state selection rule of thumb flowchart](./img/tenant_state_selection.png) +```mermaid +flowchart LR + %% Define nodes and connections + subgraph tenantData ["Tenant Data Availability"] + direction LR + needNow{"Does the tenant data\nneed to be\navailable now?"} + howQuick{"When it is needed,\nhow quickly does it\nneed to be available?"} + + needNow -->|Yes| active["Active"] + needNow -->|No| howQuick + howQuick -->|Quickly| inactive["Inactive"] + howQuick -->|"Latency is acceptable"| offloaded["Offloaded"] + end + + %% Style nodes + style needNow fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style howQuick fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Terminal nodes + style active fill:#ffffff,stroke:#61BD73,color:#130C49 + style inactive fill:#ffffff,stroke:#61BD73,color:#130C49 + style offloaded fill:#ffffff,stroke:#61BD73,color:#130C49 + + %% Style subgraph + style tenantData fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 +``` Consider a strategy of deactivating tenants that are not frequently accessed, and offloading tenants that are rarely accessed. diff --git a/developers/weaviate/starter-guides/managing-resources/tenant-states.mdx b/developers/weaviate/starter-guides/managing-resources/tenant-states.mdx index 7521b33faa..ac36641ab4 100644 --- a/developers/weaviate/starter-guides/managing-resources/tenant-states.mdx +++ b/developers/weaviate/starter-guides/managing-resources/tenant-states.mdx @@ -41,7 +41,32 @@ If a multi-tenant collection is configured with a dynamic index type, some tenan We suggest following the following guidelines for selecting a tenant state: -![Tenant state selection rule of thumb flowchart](./img/tenant_state_selection.png) +```mermaid +flowchart LR + %% Define nodes and connections + subgraph tenantData ["Tenant Data Availability"] + direction LR + needNow{"Does the tenant data\nneed to be\navailable now?"} + howQuick{"When it is needed,\nhow quickly does it\nneed to be available?"} + + needNow -->|Yes| active["Active"] + needNow -->|No| howQuick + howQuick -->|Quickly| inactive["Inactive"] + howQuick -->|"Latency is acceptable"| offloaded["Offloaded"] + end + + %% Style nodes + style needNow fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style howQuick fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Terminal nodes + style active fill:#ffffff,stroke:#61BD73,color:#130C49 + style inactive fill:#ffffff,stroke:#61BD73,color:#130C49 + style offloaded fill:#ffffff,stroke:#61BD73,color:#130C49 + + %% Style subgraph + style tenantData fill:#ffffff,stroke:#61BD73,stroke-width:2px,color:#130C49 +``` If you are unsure which tenants can be made inactive or offloaded, consider a strategy of deactivating tenants that have not been accessed for a certain period of time. And offloading tenants that have not been accessed for a longer period of time. diff --git a/developers/weaviate/starter-guides/schema.md b/developers/weaviate/starter-guides/schema.md index dcb8c03593..0ccb71a848 100644 --- a/developers/weaviate/starter-guides/schema.md +++ b/developers/weaviate/starter-guides/schema.md @@ -1,13 +1,11 @@ --- title: Schema (collection definitions) +description: Begin with schema setup in Weaviate to structure your data effectively. sidebar_position: 20 image: og/docs/tutorials.jpg # tags: ['basics'] --- - -## Overview - This tutorial will guide you through the process of defining a schema for your data, including commonly used settings and key considerations. :::info Prerequisites diff --git a/developers/weaviate/tutorials/_console.md b/developers/weaviate/tutorials/_console.md index 2e3bc1eb9d..07605f2af7 100644 --- a/developers/weaviate/tutorials/_console.md +++ b/developers/weaviate/tutorials/_console.md @@ -5,9 +5,6 @@ image: og/docs/quickstart-tutorial.jpg # tags: ['Weaviate console'] --- - -## Overview - Here you can learn how to use the Weaviate console. The Weaviate console allows you to connect to Weaviate instances that are running on the [Weaviate Cloud (WCD)](https://console.weaviate.cloud/) (our SaaS solution), on your own cluster, on your local machine, or all the public demo datasets. Note that the console never collects any data from your Weaviate instance; you can safely connect every instance, also over VPN. diff --git a/developers/weaviate/tutorials/_crud.md b/developers/weaviate/tutorials/_crud.md index 9903c2c756..411446506c 100644 --- a/developers/weaviate/tutorials/_crud.md +++ b/developers/weaviate/tutorials/_crud.md @@ -5,9 +5,6 @@ image: og/docs/tutorials.jpg # tags: ['how to', 'CRUD'] --- - -## Overview - In this tutorial, you will learn how to perform various CRUD operations with Weaviate. diff --git a/developers/weaviate/tutorials/cross-references.mdx b/developers/weaviate/tutorials/cross-references.mdx index 6c0ef97849..22019b8a64 100644 --- a/developers/weaviate/tutorials/cross-references.mdx +++ b/developers/weaviate/tutorials/cross-references.mdx @@ -1,5 +1,6 @@ --- title: Manage relationships with cross-references +description: Learn to use cross-references in Weaviate for connected data insights. sidebar_position: 40 image: og/docs/tutorials.jpg # tags: ['tutorial'] @@ -19,8 +20,6 @@ import SearchBasicsTSCode from '!!raw-loader!/_includes/code/howto/search.basics import FilterPythonCode from '!!raw-loader!/_includes/code/howto/search.filters.py'; import FilterJavaScriptCode from '!!raw-loader!/_includes/code/howto/search.filters.ts'; -## Overview - In this tutorial, you will learn how to use cross-references to manage relationships between objects, and to use them to enhance your queries. Many applications require the ability to manage relationships between objects. For example, a blog application might need to store information about the author of each post. Or, a document store may chunk documents into smaller pieces and store them in separate objects, each with a reference to the original document. @@ -111,7 +110,7 @@ An example syntax is shown below: text={XRefCrudTSCode} startMarker="// START OneWay" endMarker="// END OneWay" - language="ts" + language="tsv2" /> @@ -167,7 +166,7 @@ Take a look at the snippet below in which we retrieve objects from the `Jeopardy text={SearchBasicsTSCode} startMarker="// GetWithCrossRefs" endMarker="// END GetWithCrossRefs" - language="js" + language="tsv2" /> @@ -205,7 +204,7 @@ Take a look at the snippet below, This query looks through the `JeopardyQuestion text={FilterJavaScriptCode} startMarker="// searchSingleFilter" endMarker="// END searchSingleFilter" - language="js" + language="tsv2" /> diff --git a/developers/weaviate/tutorials/import.md b/developers/weaviate/tutorials/import.md index c0d6741176..7e50d443a6 100644 --- a/developers/weaviate/tutorials/import.md +++ b/developers/weaviate/tutorials/import.md @@ -1,12 +1,12 @@ --- title: Imports in detail +description: Understand data import techniques in Weaviate for efficient data integration. sidebar_position: 30 image: og/docs/tutorials.jpg # tags: ['import'] --- -import { DownloadButton } from '/src/theme/Buttons'; -## Overview +import { DownloadButton } from '/src/theme/Buttons'; In this section, we will explore data import, including details of the batch import process. We will discuss points such as how vectors are imported, what a batch import is, how to manage errors, and some advice on optimization. diff --git a/developers/weaviate/tutorials/index.md b/developers/weaviate/tutorials/index.md index 94906d6721..2c38e65566 100644 --- a/developers/weaviate/tutorials/index.md +++ b/developers/weaviate/tutorials/index.md @@ -1,13 +1,11 @@ --- title: Tutorials +description: Explore Weaviate tutorials for practical guidance on data management and queries. sidebar_position: 0 image: og/docs/tutorials.jpg # tags: ['how to', 'schema'] --- - -## Overview - Tutorials aim to empower you to use Weaviate based on *your* particular needs. diff --git a/developers/weaviate/tutorials/modules.md b/developers/weaviate/tutorials/modules.md index 78140d5108..6248968258 100644 --- a/developers/weaviate/tutorials/modules.md +++ b/developers/weaviate/tutorials/modules.md @@ -1,13 +1,11 @@ --- title: Modules - an introduction +description: Learn about Weaviate modules and enhance your data solutions with specialized features. sidebar_position: 90 image: og/docs/tutorials.jpg # tags: ['modules'] --- - -## Overview - In this guide, you will get an introduction to the role that modules play in Weaviate. As their name suggest, Weaviate modules are options components to enhance Weaviate's functionality, such as to vectorize data or process results (e.g., question answering). The structure of the module name (`x2vec`) informs you of what the module does. E.g., `text2vec` generates text embeddings, `img2vec` image embeddings, etc. diff --git a/developers/weaviate/tutorials/query.md b/developers/weaviate/tutorials/query.md index c4bc8f4f29..04c065d467 100644 --- a/developers/weaviate/tutorials/query.md +++ b/developers/weaviate/tutorials/query.md @@ -1,13 +1,11 @@ --- title: Queries in detail +description: Learn effective query techniques in Weaviate to retrieve accurate results. sidebar_position: 50 image: og/docs/tutorials.jpg # tags: ['basics'] --- - -## Overview - In this section, we will explore different queries that you can perform with Weaviate. Here, we will expand on the `nearText` queries that you may have seen in the [Quickstart tutorial](../quickstart/index.md) to show you different query types, filters and metrics that can be used. By the end of this section, you will have performed vector and scalar searches separately as well as in combination to retrieve individual objects and aggregations. diff --git a/developers/weaviate/tutorials/spark-connector.md b/developers/weaviate/tutorials/spark-connector.md index 1b9cc771a1..653ec5b6cb 100644 --- a/developers/weaviate/tutorials/spark-connector.md +++ b/developers/weaviate/tutorials/spark-connector.md @@ -1,13 +1,11 @@ --- title: Load data into Weaviate with Spark +description: Discover Spark connector integration with Weaviate for large data processing. sidebar_position: 80 image: og/docs/tutorials.jpg # tags: ['how to', 'spark connector', 'spark'] --- - -## Overview - This tutorial is designed to show you an example of how to use the [Spark Connector](https://github.com/weaviate/spark-connector) to import data into Weaviate from Spark. By the end of this tutorial, you'll be able to see how to you can import your data into [Apache Spark](https://spark.apache.org/) and then use the Spark Connector to write your data to Weaviate. @@ -118,8 +116,7 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' - ENABLE_MODULES: '' + ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' volumes: weaviate_data: diff --git a/developers/weaviate/tutorials/vector-provision-options.mdx b/developers/weaviate/tutorials/vector-provision-options.mdx index a5912fa61b..250b9cf655 100644 --- a/developers/weaviate/tutorials/vector-provision-options.mdx +++ b/developers/weaviate/tutorials/vector-provision-options.mdx @@ -1,5 +1,6 @@ --- title: Imports - Vector provision options +description: Explore vector provisioning options in Weaviate to tailor your data setup. sidebar_position: 45 image: og/docs/tutorials.jpg # tags: ['how-to', 'options for vectors'] @@ -7,8 +8,6 @@ image: og/docs/tutorials.jpg import ReactPlayer from 'react-player/lazy' -## Overview - :::info This video covers options for adding a vector during import. ::: diff --git a/developers/weaviate/tutorials/wikipedia.md b/developers/weaviate/tutorials/wikipedia.md index 25d59e5530..444d88db28 100644 --- a/developers/weaviate/tutorials/wikipedia.md +++ b/developers/weaviate/tutorials/wikipedia.md @@ -1,12 +1,11 @@ --- title: Wikipedia with custom vectors +description: Learn to use Wikipedia with Weaviate for enriched data sources and insights. sidebar_position: 50 image: og/docs/tutorials.jpg # TODO # tags: ['import'] --- -## Overview - This tutorial will show you how to import a large dataset (25k articles from Wikipedia) that already includes vectors (embeddings generated by OpenAI). We will, * download and unzip a CSV file that contains the Wikipedia articles * create a Weaviate instance diff --git a/docusaurus.config.js b/docusaurus.config.js index e5906d16bd..f57e517a09 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -57,7 +57,7 @@ const config = { '@docusaurus/plugin-content-blog', { blogTitle: 'Playbook', - blogDescription: 'Learn How we run Weaviate as a Company', + blogDescription: 'Learn how we run Weaviate as a Company', blogSidebarCount: 0, postsPerPage: 6, blogSidebarTitle: 'Weaviate Playbook', @@ -75,7 +75,7 @@ const config = { '@docusaurus/plugin-content-blog', { blogTitle: 'Paper Reviews', - blogDescription: '', + blogDescription: 'Papers', blogSidebarCount: 0, postsPerPage: 6, blogSidebarTitle: 'Weaviate Paper Reviews', @@ -113,7 +113,7 @@ const config = { route: '/developers/weaviate/api/rest', configuration: { spec: { - // Last updated to 1.26.4 + // Last updated: 2024-11-13 url: 'https://raw.githubusercontent.com/weaviate/weaviate/openapi_docs/openapi-specs/schema.json', }, hideModels: true, @@ -201,7 +201,49 @@ const config = { tagName: 'script', innerHTML: `!function(t){if(window.ko)return;window.ko=[],["identify","track","removeListeners","open","on","off","qualify","ready"].forEach(function(t){ko[t]=function(){var n=[].slice.call(arguments);return n.unshift(t),ko.push(n),ko}});var n=document.createElement("script");n.async=!0,n.setAttribute("src","https://cdn.getkoala.com/v1/pk_0c8211aa3107cd0bfa568f172689e16080c8/sdk.js"),(document.body || document.head).appendChild(n)}();`, }, - + // Retention + { + tagName: 'script', + innerHTML: `(function () { + var reb2b = window.reb2b = window.reb2b || []; + if (reb2b.invoked) return; + reb2b.invoked = true; + reb2b.methods = ["identify", "collect"]; + reb2b.factory = function (method) { + return function () { + var args = Array.prototype.slice.call(arguments); + args.unshift(method); + reb2b.push(args); + return reb2b; + }; + }; + for (var i = 0; i < reb2b.methods.length; i++) { + var key = reb2b.methods[i]; + reb2b[key] = reb2b.factory(key); + } + reb2b.load = function (key) { + var script = document.createElement("script"); + script.type = "text/javascript"; + script.async = true; + script.src = "https://s3-us-west-2.amazonaws.com/b2bjsstore/b/" + key + "/5NRP9HG1YMO1.js.gz"; + var first = document.getElementsByTagName("script")[0]; + first.parentNode.insertBefore(script, first); + }; + reb2b.SNIPPET_VERSION = "1.0.1"; + reb2b.load("5NRP9HG1YMO1"); + })();`, + }, + // Microsoft Clarity Script + { + tagName: 'script', + innerHTML: ` + (function(c,l,a,r,i,t,y){ + c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; + t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; + y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); + })(window, document, "clarity", "script", "orzk1oie18"); + `, + }, ], }; }, @@ -251,6 +293,7 @@ const config = { }, blog: { blogTitle: 'Blog', + blogDescription: 'Blog', showReadingTime: true, authorsMapPath: '../authors.yml', editUrl: @@ -277,13 +320,13 @@ const config = { /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ image: 'og/default.jpg', - /** announcementBar: { - id: 'announcement-bar-sept-2024', - content:`AI [in Prod] Seattle – Sept 19th | Request a ticket to join expert tech talks and hands-on generative AI training!`, + announcementBar: { + id: 'announcement-bar-decemeber-2024', + content:`Ready to level up your AI tech stack? Read GigaOm's Sonar Report for Vector Databases`, backgroundColor: '#1C1468', textColor: '#F5F5F5', isCloseable: true, - }, **/ + }, docs: { sidebar: { hideable: true, @@ -295,7 +338,8 @@ const config = { // hideOnScroll: true, logo: { alt: 'Weaviate', - src: '/img/site/weaviate-nav-logo-light.svg', + src: '/img/site/weaviate-logo-horizontal-light-1.svg', + srcDark: '/img/site/weaviate-logo-horizontal-dark-1.svg', }, items: [ { @@ -305,7 +349,7 @@ const config = { items: [ { type: 'html', - value : '', + value : '', className: 'dropDownContainer2', }, ] @@ -317,7 +361,7 @@ const config = { items: [ { type: 'html', - value : '', + value : '', className: 'dropDownContainer2', }, @@ -359,7 +403,7 @@ const config = { items: [ { type: 'html', - value : '', + value : '', className: 'dropDownContainer2', }, /* { @@ -386,6 +430,11 @@ const config = { sidebarid: 'academySidebar', type: 'doc', }, + { + label: 'Learning Center', + to: '/learn', + + }, { label: 'Blog', to: '/blog', @@ -437,7 +486,7 @@ const config = { items: [ { type: 'html', - value : '', + value : '', className: 'dropDownContainer2', }, ], @@ -468,7 +517,7 @@ const config = { }, { label: 'Contact us', - href: '/#contact-us', + href: '/contact', }, ], */ }, @@ -599,6 +648,10 @@ const config = { { title: 'Learn', items: [ + { + label: 'Learning Center', + to: '/learn', + }, { label: 'Blog', to: '/blog', @@ -666,31 +719,6 @@ const config = { label: 'Slack', to: 'https://weaviate.io/slack', }, - { - label: 'Meetups', - to: '#', - className: 'footer__title subtitle', - }, - { - label: 'Amsterdam', - to: 'https://www.meetup.com/weaviate-amsterdam', - }, - { - label: 'Boston', - to: 'https://www.meetup.com/weaviate-boston', - }, - { - label: 'New York', - to: 'https://www.meetup.com/weaviate-NYC', - }, - { - label: 'San Francisco', - to: 'https://www.meetup.com/weaviate-san-francisco', - }, - { - label: 'Toronto', - to: 'https://www.meetup.com/weaviate-toronto', - }, ], }, @@ -719,7 +747,7 @@ const config = { }, { label: 'Contact Us', - to: '/#contact-us', + to: '/contact', }, { label: 'Partners', @@ -764,19 +792,19 @@ const config = { to: 'https://weaviate.io/slack', }, { - label: 'Twitter', - to: 'https://twiiter.com/weaviate_io', + label: 'X', + to: 'https://x.com/weaviate_io', }, { label: 'Instagram', to: 'https://instagram.com/weaviate.io', }, { - label: 'Youtube', - to: 'https://youtube.com/weaviate_io', + label: 'YouTube', + to: 'https://youtube.com/@Weaviate', }, { - label: 'Linkedin', + label: 'LinkedIn', to: 'https://www.linkedin.com/company/weaviate-io', }, { @@ -835,6 +863,12 @@ const config = { }, }, }), + + markdown: { + mermaid: true, + }, + themes: ['@docusaurus/theme-mermaid'], + }; module.exports = config; diff --git a/package.json b/package.json index ec5d7ee78c..4e0520838a 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,16 @@ "@docusaurus/plugin-google-gtag": "^2.4.1", "@docusaurus/plugin-google-tag-manager": "^2.4.1", "@docusaurus/preset-classic": "^2.3.1", + "@docusaurus/theme-mermaid": "^2.3.1", "@giscus/react": "^2.2.8", "@mdx-js/react": "^1.6.22", "@radix-ui/react-tabs": "^1.0.1", "@react-google-maps/api": "^2.19.3", "@scalar/docusaurus": "^0.4.85", + "@types/adm-zip": "^0.5.7", "@types/gtag.js": "^0.0.18", + "adm-zip": "^0.5.16", + "ag-grid-react": "^32.3.3", "clipboard": "^2.0.11", "clsx": "^1.2.1", "csv-parser": "^3.0.0", @@ -72,7 +76,7 @@ "tailwindcss": "^3.2.7", "ts-node": "^10.9.1", "typescript": "^5.1.6", - "weaviate-client": "^3.1.5", + "weaviate-client": "^3.3.1", "weaviate-ts-client": "^2.2.0", "weaviate-ts-embedded": "^1.2.0" }, diff --git a/requirements.txt b/requirements.txt index 950654135d..551b5d1244 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,68 +4,103 @@ appnope==0.1.4 asttokens==2.4.1 Authlib==1.3.0 black==23.12.1 +boto3==1.34.149 +botocore==1.34.149 certifi==2023.11.17 cffi==1.16.0 charset-normalizer==3.3.2 click==8.1.7 +cohere==5.6.2 comm==0.2.1 cryptography==41.0.7 debugpy==1.8.1 decorator==5.1.1 Deprecated==1.2.14 +dnspython==2.6.1 +email_validator==2.2.0 exceptiongroup==1.2.0 executing==2.0.1 -grpcio==1.60.0 -grpcio-health-checking==1.60.0 -grpcio-tools==1.60.0 +fastapi==0.111.0 +fastapi-cli==0.0.4 +fastavro==1.9.5 +filelock==3.15.4 +fsspec==2024.6.1 +grpcio==1.68.1 +grpcio-health-checking==1.68.1 +grpcio-tools==1.68.1 h11==0.14.0 httpcore==1.0.2 +httptools==0.6.1 httpx==0.27.0 +httpx-sse==0.4.0 +huggingface-hub==0.24.2 idna==3.6 ijson==3.2.3 iniconfig==2.0.0 ipykernel==6.29.2 ipython==8.21.0 jedi==0.19.1 +Jinja2==3.1.4 +jmespath==1.0.1 jupyter_client==8.6.0 jupyter_core==5.7.1 +markdown-it-py==3.0.0 +MarkupSafe==2.1.5 matplotlib-inline==0.1.6 +mdurl==0.1.2 mypy-extensions==1.0.0 nest-asyncio==1.6.0 numpy==1.26.3 +orjson==3.10.6 packaging==23.2 pandas==2.2.0 +parameterized==0.9.0 parso==0.8.3 pathspec==0.12.1 pexpect==4.9.0 platformdirs==4.1.0 pluggy==1.3.0 prompt-toolkit==3.0.43 -protobuf==4.25.2 +protobuf==5.29.1 psutil==5.9.8 ptyprocess==0.7.0 pure-eval==0.2.2 pycparser==2.21 -pydantic==2.6.0b1 -pydantic_core==2.16.1 +pydantic==2.10.3 +pydantic_core==2.27.1 Pygments==2.17.2 pytest==7.4.4 python-dateutil==2.8.2 +python-dotenv==1.0.1 +python-multipart==0.0.9 pytz==2023.3.post1 +PyYAML==6.0.1 pyzmq==25.1.2 requests==2.31.0 +rich==13.7.1 +s3transfer==0.10.2 +shellingham==1.5.4 six==1.16.0 sniffio==1.3.0 stack-data==0.6.3 +starlette==0.37.2 +tokenizers==0.19.1 tomli==2.0.1 tornado==6.4 tqdm==4.66.1 traitlets==5.14.1 -typing_extensions==4.9.0 +typer==0.12.3 +types-requests==2.32.0.20240712 +typing_extensions==4.12.2 tzdata==2023.4 +ujson==5.10.0 urllib3==2.1.0 -validators==0.28.3 +uvicorn==0.30.1 +uvloop==0.19.0 +validators==0.34.0 +watchfiles==0.22.0 wcwidth==0.2.13 -weaviate-client==4.6.5 -weaviate-demo-datasets==0.4.12 +weaviate-client==4.10.0 +weaviate-demo-datasets==0.6.0 +websockets==12.0 wrapt==1.16.0 diff --git a/site.redirects.js b/site.redirects.js index 107c68779f..8e98e79143 100644 --- a/site.redirects.js +++ b/site.redirects.js @@ -34,23 +34,23 @@ const siteRedirects = { from: '/developers/weaviate/current/core-knowledge/console', }, { - to: '/developers/wcs/tools/query-tool', - from: '/developers/wcs/guides/console', + to: '/developers/wcs/tools/query-tool', + from: '/developers/wcs/guides/console', }, { - to: '/developers/wcs/create-instance', - from: '/developers/wcs/guides/create-instance', + to: '/developers/wcs/create-instance', + from: '/developers/wcs/guides/create-instance', }, { - to: '/developers/wcs/connect', - from: '/developers/wcs/guides/authentication', + to: '/developers/wcs/connect', + from: '/developers/wcs/guides/authentication', }, // Client library redirects { to: '/developers/weaviate/client-libraries/typescript', from: '/developers/weaviate/client-libraries/javascript' }, - + // Config-refs redirects { to: '/developers/weaviate/config-refs/datatypes', @@ -60,7 +60,7 @@ const siteRedirects = { to: '/developers/weaviate/config-refs/distances', from: '/developers/weaviate/configuration/distances', }, - + // Configuration redirects { to: '/developers/weaviate/config-refs/datatypes', @@ -89,7 +89,7 @@ const siteRedirects = { '/developers/weaviate/current/schema/schema-configuration', ], }, - + // More-resources redirects { to: '/developers/weaviate/more-resources/example-datasets', @@ -107,7 +107,7 @@ const siteRedirects = { to: '/developers/integrations/llm-frameworks/dspy', from: '/developers/weaviate/more-resources/dspy', }, - + // Quickstart redirects { to: '/developers/weaviate/starter-guides/schema', @@ -129,7 +129,7 @@ const siteRedirects = { to: '/developers/wcs/tools/query-tool', from: '/developers/weaviate/quickstart/console', }, - + // Old Quickstart redirects { to: '/developers/weaviate/starter-guides/schema', @@ -151,23 +151,23 @@ const siteRedirects = { to: '/developers/wcs/tools/query-tool', from: '/developers/weaviate/current/quickstart/console', }, - + // WCD redirects { to: '/developers/wcs/faq', from: '/developers/wcs/troubleshooting', }, { - to: '/developers/wcs/tools/query-tool', - from: '/developers/wcs/platform/ssconsole', + to: '/developers/wcs/tools/query-tool', + from: '/developers/wcs/platform/ssconsole', }, { - to: '/developers/wcs/cluster-status', - from: '/developers/wcs/platform/cluster-status', + to: '/developers/wcs/cluster-status', + from: '/developers/wcs/platform/cluster-status', }, { - to: '/developers/wcs/tools/query-tool', - from: '/developers/wcs/console', + to: '/developers/wcs/tools/query-tool', + from: '/developers/wcs/console', }, // Tutorial redirects { @@ -195,13 +195,13 @@ const siteRedirects = { '/developers/weaviate/current/tutorials/quick-start-with-the-text2vec-contextionary-module', ], }, - + // Howto redirects { to: '/developers/weaviate/manage-data/read-all-objects', from: '/developers/weaviate/manage-data/exhaustive-retrieval', }, - + // Tutorial refresh 2024 { to: '/developers/weaviate/starter-guides/schema', @@ -212,22 +212,22 @@ const siteRedirects = { from: '/developers/weaviate/tutorials/connect', }, { - to: '/developers/weaviate/connections', - from: '/developers/weaviate/starter-guides/connect', + to: '/developers/weaviate/connections', + from: '/developers/weaviate/starter-guides/connect', }, - + // 2024.10 Rename "prefiltering" to "filtering" { to: '/developers/weaviate/concepts/filtering', from: '/developers/weaviate/concepts/prefiltering', }, - + // Remove BPR page { to: '/developers/weaviate/concepts/vector-index', from: '/developers/weaviate/concepts/binary-passage-retrieval', }, - + // Blog redirects { to: '/blog/understand-your-unstructured-data', @@ -291,9 +291,13 @@ const siteRedirects = { to: '/blog/weaviate-1-15-release', from: '/blog/2022/09/Weaviate-release-1-15', }, + { - to: '/blog/why-is-vector-search-so-fast', - from: '/blog/2022/09/Why-is-Vector-Search-so-fast', + to: '/blog/vector-search-explained', + from: [ + '/blog/why-is-vector-search-so-fast', + '/blog/2022/09/Why-is-Vector-Search-so-fast', + ], }, { to: '/blog/distance-metrics-in-vector-search', @@ -372,7 +376,7 @@ const siteRedirects = { to: '/developers/weaviate/model-providers/openai/generative', from: '/blog/chatgpt-for-generative-search', }, - + // GSOC and GSOD redirects // Hidden as not participating in 2023 { @@ -385,7 +389,7 @@ const siteRedirects = { '/resources/gsod-summary', ], }, - + // // Rename google modules // { // to: '/developers/weaviate/modules/reader-generator-modules/generative-google', @@ -404,7 +408,7 @@ const siteRedirects = { to: '/developers/weaviate/model-providers/google/embeddings', from: '/developers/weaviate/modules/retriever-vectorizer-modules/text2vec-google', }, - + // ============================================================================================= // 202409 Remove old module docs & redirect to model provider integration // ============================================================================================= @@ -505,7 +509,7 @@ const siteRedirects = { to: '/developers/weaviate/model-providers/google/generative', from: '/developers/weaviate/modules/reader-generator-modules/generative-palm', }, - + { to: '/developers/weaviate/modules/custom-modules', from: '/developers/weaviate/modules/other-modules/custom-modules', @@ -542,323 +546,212 @@ const siteRedirects = { to: '/developers/weaviate/modules/text2vec-contextionary', from: '/developers/weaviate/modules/retriever-vectorizer-modules/text2vec-contextionary', }, - + // ============================================================================================= // END - 202409 Remove old module docs & redirect to model provider integration // ============================================================================================= - - + + // moved Quickstart installation to Quickstart { to: '/developers/weaviate/quickstart', from: '/developers/weaviate/quickstart/installation', }, - + { to: '/developers/wcs/tools/query-tool', from: '/developers/weaviate/tutorials/console', }, - + // References: API / GraphQL redirects { to: '/developers/weaviate/api/graphql/search-operators', from: '/developers/weaviate/api/graphql/vector-search-parameters', }, - + // old link redirects { to: '/developers/weaviate/installation', from: '/developers/weaviate/current/getting-started/installation', }, - - { - to: '/developers/weaviate/configuration/compression/pq-compression', - from: '/developers/weaviate/configuration/compression', - }, + { to: '/developers/weaviate/configuration/compression/pq-compression', from: '/developers/weaviate/configuration/pq-compression', }, - + { to: '/developers/weaviate/configuration/compression/bq-compression', from: '/developers/weaviate/configuration/bq-compression', }, - + { to: '/developers/weaviate/manage-data/collections', from: '/developers/weaviate/manage-data/classes', }, - + { to: '/developers/weaviate/manage-data/collections', from: '/developers/weaviate/configuration/schema-configuration', }, - + // Legacy REST API redirects { to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/schema', + from: [ + '/developers/weaviate/api/rest/schema', + '/developers/weaviate/api/rest/objects', + '/developers/weaviate/api/rest/batch', + '/developers/weaviate/api/rest/backups', + '/developers/weaviate/api/rest/classification', + '/developers/weaviate/api/rest/meta', + '/developers/weaviate/api/rest/nodes', + '/developers/weaviate/api/rest/well-known', + '/developers/weaviate/api/rest_legacy/schema', + '/developers/weaviate/api/rest_legacy/objects', + '/developers/weaviate/api/rest_legacy/batch', + '/developers/weaviate/api/rest_legacy/backups', + '/developers/weaviate/api/rest_legacy/classification', + '/developers/weaviate/api/rest_legacy/meta', + '/developers/weaviate/api/rest_legacy/nodes', + '/developers/weaviate/api/rest_legacy/well-known', + ] }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/objects', + to: '/developers/weaviate/model-providers', + from: [ + '/developers/weaviate/api/rest/modules', + '/developers/weaviate/api/rest_legacy/modules', + ] }, + + // Products to Pricing redirects + { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/batch', + to: "/pricing", + from: "/products", }, + { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/backups', + to: "/pricing", + from: "/products/byoc", }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/classification', + to: "/pricing", + from: "/products/serverless", }, + // workshops { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/meta', + to: "/community/events", + from: "/learn/workshop" }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/nodes', + to: "/community/events", + from: "/learn/workshops" }, + // Partners Off { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest/well-known', + to: "/pricing", + from: "/partnersOff" }, + // Terms and Policies Changes { - to: '/developers/weaviate/model-providers', - from: '/developers/weaviate/api/rest/modules', + to: "/service", + from: "/service/EULA" }, - - // Legacy REST API redirects { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/schema', + to: "/service", + from: "/service/sla" }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/objects', + to: "/service", + from: "/service/general-terms" }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/batch', + to: "/service", + from: "/service/service-schedule" }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/backups', + to: "/weaviate-support-terms", + from: "/supportterms" }, { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/classification', + to: "/service", + from: "/service/weaviate-general-terms-of-service" }, + // Case Study Changes { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/meta', + to: "/case-studies/neople", + from: "/services/case-study-neople" }, + // Services Changes { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/nodes', + to: "/deployment/enterprise-cloud", + from: "/services/enterprise-dedicated" }, + + // Blog Article Changes { - to: '/developers/weaviate/api/rest/', - from: '/developers/weaviate/api/rest_legacy/well-known', + to: "/blog", + from: "/blog/tips-for-scaling-and-shipping-ai-products" }, + + // Release notes { - to: '/developers/weaviate/model-providers', - from: '/developers/weaviate/api/rest_legacy/modules', + to: "/developers/weaviate/release-notes/older-releases/release_1_20", + from: "/developers/weaviate/release-notes/release_1_20" }, - - - - // Products to Pricing redirects - { - to: "/pricing", - from: "/products", + to: "/developers/weaviate/release-notes/older-releases/release_1_19", + from: "/developers/weaviate/release-notes/release_1_19" }, - { - to: "/pricing", - from: "/products/byoc", + to: "/developers/weaviate/release-notes/older-releases/release_1_18", + from: "/developers/weaviate/release-notes/release_1_18" }, { - to: "/pricing", - from: "/products/serverless", + to: "/developers/weaviate/release-notes/older-releases/release_1_17", + from: "/developers/weaviate/release-notes/release_1_17" }, - // workshops { - to: "/community/events", - from: "/learn/workshop" + to: "/developers/weaviate/release-notes/older-releases/release_1_16", + from: "/developers/weaviate/release-notes/release_1_16" }, + + // Services Changes { - to: "/community/events", - from: "/learn/workshops" + to: "/platform", + from: "/services" }, - // Partners Off { - to: "/pricing", - from: "/partnersOff" + to: "/deployment/serverless", + from: "/services/serverless" }, - // Terms and Policies Changes { - to: "/service", - from: "/service/EULA" + to: "/deployment/enterprise-cloud", + from: "/services/enterprise-cloud" }, { - to: "/service", - from: "/service/sla" + to: "/deployment/byoc", + from: "/services/byoc" }, { - to: "/service", - from: "/service/general-terms" + to: "/deployment/enablement", + from: "/services/education-and-support" }, { - to: "/service", - from: "/service/service-schedule" + to: "/deployment/enablement", + from: "/deployment/education-and-support" }, + // KC Component Changes { - to: "/weaviate-support-terms", - from: "/supportterms" + to: "/learn/knowledgecards", + from: "/learn/knowledgecards/shareoptions" }, { - to: "/service", - from: "/service/weaviate-general-terms-of-service" + to: "/learn/knowledgecards", + from: "/learn/knowledgecards/knowledgeheader" }, - // Case Study Changes - { - to: "/case-studies/neople", - from: "/services/case-study-neople" - }, - { - to: "/case-studies/instabase", - from: "/case-studies" - }, - // Services Changes - { - to: "/deployment/enterprise-cloud", - from: "/services/enterprise-dedicated" - }, - - // Blog Article Changes - { - to: "/blog", - from: "/blog/tips-for-scaling-and-shipping-ai-products" - }, - -// Release notes -{ - to: "/developers/weaviate/release-notes/older-releases/release_1_20", - from: "/developers/weaviate/release-notes/release_1_20" -}, -{ - to: "/developers/weaviate/release-notes/older-releases/release_1_19", - from: "/developers/weaviate/release-notes/release_1_19" -}, -{ - to: "/developers/weaviate/release-notes/older-releases/release_1_18", - from: "/developers/weaviate/release-notes/release_1_18" -}, -{ - to: "/developers/weaviate/release-notes/older-releases/release_1_17", - from: "/developers/weaviate/release-notes/release_1_17" -}, -{ - to: "/developers/weaviate/release-notes/older-releases/release_1_16", - from: "/developers/weaviate/release-notes/release_1_16" -}, - -// Services Changes -{ - to: "/platform", - from: "/services" - }, - { - to: "/deployment/serverless", - from: "/services/serverless" - }, - { - to: "/deployment/enterprise-cloud", - from: "/services/enterprise-cloud" - }, - { - to: "/deployment/byoc", - from: "/services/byoc" - }, - { - to: "/deployment/enablement", - from: "/services/education-and-support" - }, - { - to: "/deployment/enablement", - from: "/deployment/education-and-support" - }, - // KC Component Changes - { - to: "/learn/knowledgecards", - from: "/learn/knowledgecards/shareoptions" - }, - { - to: "/learn/knowledgecards", - from: "/learn/knowledgecards/knowledgeheader" - }, -// Broken Links Redirects -{ - to: '/developers/contributor-guide/', - from: "/developers/contributor-guide/weaviate-modules/developers/weaviate/api/rest", -}, - -{ - to: '/developers/weaviate/release-notes', - from: [ - '/developers/weaviate/release-notes/older-releases/developers/weaviate/config-refs/nodes', - '/developers/weaviate/release-notes/older-releases/developers/weaviate/api/rest', - ], -}, -{ - to: "/developers/weaviate/config-refs/nodes", - from: "/developers/weaviate/release-notes/developers/weaviate/config-refs/nodes", -}, - -{ - to: "/blog/", - from: [ - "/blog/developers/weaviate/api/rest", - "/blog/developers/weaviate/config-refs/nodes", - ], -}, -{ - to: "/developers/weaviate/connections", - from: "/developers/connections", -}, -{ - to: "/developers/weaviate/client-libraries/typescript/typescript-v3", - from: "/developers/weaviate/client-libraries/typescript/developers/weaviate/client-libraries/typescript/typescript-v3", -}, -{ - to: "/developers/weaviate/modules", - from: "/developers/weaviate/modules/developers/weaviate/api/rest", -}, -{ - to: "/developers/weaviate/release-notes", - from: [ - "/developers/weaviate/release-notes/developers/weaviate/config-refs/nodes", - "/developers/weaviate/release-notes/older-releases/developers/weaviate/api/rest", - "/developers/weaviate/release-notes/older-releases/developers/weaviate/config-refs/nodes", - ], -}, -{ - to: "/developers/weaviate/starter-guides", - from: [ - "/developers/weaviate/starter-guides/developers/weaviate/installation/kubernetes", - "/developers/weaviate/starter-guides/developers/weaviate/manage-data/collections", - ], -}, - - - ], createRedirects(existingPath) { if (existingPath.includes('/weaviate/api/graphql')) { @@ -907,7 +800,7 @@ const siteRedirects = { ), ]; } - + if ( existingPath.includes('/weaviate/concepts/replication-architecture') ) { @@ -938,7 +831,7 @@ const siteRedirects = { ), ]; } - + // Any remaining weaviate docs redirects if (existingPath.includes('/developers/weaviate')) { return [ @@ -948,7 +841,7 @@ const siteRedirects = { ), ]; } - + // Contributor Guide redirects if (existingPath.includes('/contributor-guide/weaviate-modules')) { return [ @@ -966,7 +859,7 @@ const siteRedirects = { ), ]; } - + return undefined; // Return a falsy value: no redirect created }, }; diff --git a/src/components/AboutUsUpdate/meet-team.jsx b/src/components/AboutUsUpdate/meet-team.jsx index 3786932e94..5b5f1d1c59 100644 --- a/src/components/AboutUsUpdate/meet-team.jsx +++ b/src/components/AboutUsUpdate/meet-team.jsx @@ -45,12 +45,7 @@ export default function MeetTheTeam() { > #Applied Research - handleTeamFilter('wcd')} - > - #Cloud Services - + #Database + + handleTeamFilter('developer-relations')} + > + #Education & Developer Experience + handleTeamFilter('developer-growth')} > - #Developer Growth + #Growth
handleTeamFilter('developer-relations')} - > - #Developer Relations - - handleTeamFilter('delivery')} + onClick={() => handleTeamFilter('weaviate-labs')} > - #Delivery + #Innovation Labs handleTeamFilter('finance')} > - #Finance + #Legal & Finance #Partnerships + handleTeamFilter('delivery')} + > + #Platform Operations + handleTeamFilter('product')} @@ -142,13 +146,12 @@ export default function MeetTheTeam() { > #Sales + handleTeamFilter('weaviate-labs')} + className={selectedTeam === 'wcd' ? styles.linkActive : ''} + onClick={() => handleTeamFilter('wcd')} > - #Weaviate Labs + #Weaviate Cloud Console

diff --git a/src/components/AboutUsUpdate/styles.module.scss b/src/components/AboutUsUpdate/styles.module.scss index 7f1b489649..75fa35861d 100644 --- a/src/components/AboutUsUpdate/styles.module.scss +++ b/src/components/AboutUsUpdate/styles.module.scss @@ -229,7 +229,7 @@ p { scroll-snap-type: x mandatory; white-space: nowrap; - @media screen and (max-width: 1260px) { + @media screen and (max-width: 1440px) { width: 100%; } @@ -253,7 +253,7 @@ p { width: 65rem; height: 0.0625rem; - @media screen and (max-width: 900px) { + @media screen and (max-width: 1440px) { width: 100%; } } diff --git a/src/components/Academy/courseData.js b/src/components/Academy/courseData.js index 6c3c9f369d..0881fa824c 100644 --- a/src/components/Academy/courseData.js +++ b/src/components/Academy/courseData.js @@ -175,6 +175,28 @@ export const courseData = { ], note: "TS clients" }, + "starter_multimodal_typescript": { + title: "Multimodal data with Weaviate", + courseId: "TS_101M", + body: "Project-based learning where you'll learn how to build with Weaviate and multi-modal data. Weaviate generates the vectors for you.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/starter_multimodal_data", + badgeType: "course", + isCourse: true, + units: [ + "docker_mm_basics_ts", "mm_collections_ts", "mm_searches_ts", "mm_rag_ts" + ], + learningGoals: [ + "How to create a Weaviate instance, add data to it to enable multi-modal searching, and use AI through retrieval augmented generation." + ], + learningOutcomes: [ + "Create an instance of Weaviate with a multimodal vectorizer module", + "Produce, store and index multimodal data", + "Perform multimodal searches", + "Use AI (large language models) to augment and transform retrieved data", + ], + note: "TS clients; project-based" + }, "multi-tenancy": { title: "Multi-tenancy", courseId: "PY_280", @@ -305,6 +327,20 @@ export const courseData = { "chunking" ] }, + "standalone_js": { + title: "Standalone units (JS/TS)", + courseId: "0", + body: "Bite-sized, standalone units that can be reviewed by themselves.", + buttonType: "Notify", + badgeType: "course", + isCourse: false, + units: [ + "which_search", + "client_server", + "picking_models", + "want_stack" + ] + }, "zero_to_mvp": { title: "Zero to MVP: The basics", courseId: "P3_1", diff --git a/src/components/Academy/unitData.js b/src/components/Academy/unitData.js index 300c7d3d7f..831e6f22fa 100644 --- a/src/components/Academy/unitData.js +++ b/src/components/Academy/unitData.js @@ -197,6 +197,21 @@ export const unitData = { "Connect to the Weaviate instance using the Python client." ] }, + "docker_mm_basics_ts": { + title: "Weaviate for multimodal data", + body: "Create a Weaviate instance for multimodal data.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/starter_multimodal_data/setup_weaviate", + badgeType: "practical", + learningGoals: [ + "Set up a Weaviate instance with a multimodal module." + ], + learningOutcomes: [ + "Create a Weaviate instance with a multimodal module using Docker.", + "Install the latest Weaviate TypeScript client.", + "Connect to the Weaviate instance using the Typescript client." + ] + }, "mm_collections": { title: "Populate the database", body: "Create a collection and import multimodal data, and have Weaviate create vectors for you.", @@ -212,6 +227,21 @@ export const unitData = { "Import data using batch imports." ] }, + "mm_collections_ts": { + title: "Populate the database", + body: "Create a collection and import multimodal data, and have Weaviate create vectors for you.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/starter_multimodal_data/mm_collections", + badgeType: "practical", + learningGoals: [ + "Configure and create a collection then import multimodal data using batch imports." + ], + learningOutcomes: [ + "Configure a collection with typical settings and vectorizer set.", + "Create a collection and work with a collection object.", + "Import data using batch imports." + ] + }, "mm_searches": { title: "Perform searches", body: "Learn how to use search functions in Weaviate.", @@ -226,6 +256,20 @@ export const unitData = { "Perform searches through multimodal data in different ways.", ] }, + "mm_searches_ts": { + title: "Perform searches", + body: "Learn how to use search functions in Weaviate.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/starter_multimodal_data/mm_searches", + badgeType: "practical", + learningGoals: [ + "Perform multimodal searches." + ], + learningOutcomes: [ + "Describe how multimodal search works at a high level.", + "Perform searches through multimodal data in different ways.", + ] + }, "mm_rag": { title: "LLMs and Weaviate (RAG)", body: "Use large language models to augment and transform retrieved data.", @@ -241,6 +285,21 @@ export const unitData = { "Perform RAG on the entire set of returned objects.", ] }, + "mm_rag_ts": { + title: "LLMs and Weaviate (RAG)", + body: "Use large language models to augment and transform retrieved data.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/starter_multimodal_data/mm_rag", + badgeType: "practical", + learningGoals: [ + "Use AI (large language models) to augment and transform retrieved data." + ], + learningOutcomes: [ + "Describe what RAG is and how it works at a high level.", + "Perform RAG on individual objects.", + "Perform RAG on the entire set of returned objects.", + ] + }, "nv_collections": { title: "Populate the database", body: "Create a collection with multiple named vectors and import data objects.", @@ -1006,5 +1065,75 @@ export const unitData = { ], owner: "jp", reviewer: "jp" + }, + client_server: { + title: "Building client-server Applications", + body: "Chunking is essential for working with longer texts in vector databases. This unit covers how to use it as well as tips and best practices.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/standalone/client-server", + badgeType: "practical", + learningGoals: [ + "What chunking is", + ], + learningOutcomes: [ + "Describe chunking at a high level", + "Explain the impact of chunking in vector search and retrieval augmented generation", + ], + owner: "daniel", + reviewer: "daniel" + }, + picking_models: { + title: "Using Machine Learning Models", + body: "Understand the fundamental concepts of generative and embedding models, their applications, and their role in building AI-Native applications.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/standalone/gen-ai-models", + badgeType: "mixed", + learningGoals: [ + "Understand the fundamental concepts of generative and embedding models, their applications, and their role in building AI-Native applications.", + ], + learningOutcomes: [ + "The difference between Embedding and Generative models", + "When and how to use those models integrated with Weaviate", + ], + owner: "daniel", + reviewer: "daniel" + }, + want_stack: { + title: "Understanding the WANT stack?", + body: "Chunking is essential for working with longer texts in vector databases. This unit covers how to use it as well as tips and best practices.", + buttonType: "Click here", + buttonURL: "/developers/academy/js/standalone/want-stack", + badgeType: "practical", + learningGoals: [ + "What chunking is", + ], + learningOutcomes: [ + "Describe chunking at a high level", + "Explain the impact of chunking in vector search and retrieval augmented generation", + ], + owner: "daniel", + reviewer: "daniel" + }, + which_search_js: { + title: "Which search is right for me?", + body: "Weaviate offers many search types (vector, keyword and hybrid), and options. Let's discuss some good, baseline search strategies.", + buttonType: "Click here", + badgeType: "mixed", + buttonURL: "/developers/academy/js/standalone/which-search", + learningGoals: [ + "Impact of search type on search quality.", + "Impact of search type on search performance.", + "How the dataset and chunking affect search", + "Key considerations for selecting a search type.", + "Strategies to apply to improve search quality.", + ], + learningOutcomes: [ + "Broadly recite pros and cons of each search type (vector, keyword and hybrid).", + "Suggest a suitable search type given a description of the dataset and aim.", + "Suggest alternative or additional search strategies to improve search quality.", + "Outline broad methods to evaluate search quality." + ], + owner: "daniel", + reviewer: "daniel" } }; diff --git a/src/components/Blog/styles.module.scss b/src/components/Blog/styles.module.scss index 3550fc6aab..8a146dafd1 100644 --- a/src/components/Blog/styles.module.scss +++ b/src/components/Blog/styles.module.scss @@ -12,3 +12,15 @@ top: 100px; } } + +[data-theme='light'] { + .blogHome { + color: #525860; + } +} + +[data-theme='dark'] { + .blogHome { + color: #ffffff; + } +} diff --git a/src/components/CaseStudies/Header/index.jsx b/src/components/CaseStudies/Header/index.jsx new file mode 100644 index 0000000000..2f12e7758b --- /dev/null +++ b/src/components/CaseStudies/Header/index.jsx @@ -0,0 +1,73 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function StudyHeader() { + return ( +
+
+
+
+ Case Study +

+ How Morningstar built a trustworthy, AI-driven financial data + platform +

+
+
+ + Read the story + + + Contact sales + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/Header/styles.module.scss b/src/components/CaseStudies/Header/styles.module.scss new file mode 100644 index 0000000000..ecce2c4f4b --- /dev/null +++ b/src/components/CaseStudies/Header/styles.module.scss @@ -0,0 +1,306 @@ +.box { + display: flex; + justify-content: center; + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + + @media screen and (max-width: 900px) { + flex-direction: column; + gap: 40px; + margin-bottom: 0px; + } + + span { + color: #130c49; + font-family: Inter; + text-transform: uppercase; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 2.1rem */ + } + + h1 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2.25rem; + font-style: normal; + font-weight: bolder; + line-height: 140%; + margin-bottom: 1rem; + width: 70%; + @media screen and (max-width: 900px) { + width: 100%; + } + } + + .headerBox { + width: 50%; + @media screen and (max-width: 900px) { + width: 100%; + } + + p { + color: #ffffff; + width: 80%; + @media screen and (max-width: 1000px) { + width: 100%; + } + } + } +} + +.left { + display: flex; + flex-direction: column; + gap: 50px; +} + +.right { + @media screen and (max-width: 970px) { + display: none; + } + .image { + background: url('/img/site/case-study-header-image-01.png'); + background-size: contain; + background-repeat: no-repeat; + width: 36.6875rem; + height: 26.6875rem; + flex-shrink: 0; + border-radius: 1.25rem; + background-position: right; + transition: all 0.3s ease-in-out; + + @media screen and (max-width: 1200px) { + width: 30.6875rem; + height: 26.6875rem; + } + + @media screen and (max-width: 1100px) { + width: 26.6875rem; + height: 26.6875rem; + } + + @media screen and (max-width: 900px) { + width: 100%; + min-width: 29rem; + height: 26.6875rem; + background-position: unset; + } + } +} + +.buttons { + display: flex; + gap: 20px; + + @media screen and (max-width: 600px) { + flex-direction: column; + gap: 20px; + } + + .buttonDark { + color: #f7f9fd; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + background: #130c49; + } + + .buttonLight { + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 10.625rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f7f9fd; + } +} + +.headerSecurity { + background: #130c49; + background-image: url('/img/site/case-study-bg-image-01.png'); + background-size: cover; +} + +.topText { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 120%; + text-transform: uppercase; + margin: 10px 0px; +} +.bottomBar { + background: #130c49; + width: 100%; + height: 5rem; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; +} + +.logoWrapper { + display: flex; + flex-direction: row; + justify-content: space-evenly; + align-items: center; + gap: 40px; + animation: scroll 100s linear infinite; + width: calc(200% + 40px); + + @media (min-width: 1800px) { + animation: none; + } +} + +.logo { + background-image: url('/img/site/lightlogos/stackoverflow.svg'); + background-size: cover; + background-position: center; + width: 4.05294rem; + height: 1.2745rem; + flex-shrink: 0; +} + +.logo1 { + background-image: url('/img/site/lightlogos/instabase.svg'); + width: 7.00806rem; + height: 0.73581rem; +} + +.logo2 { + background-image: url('/img/site/lightlogos/redhat.svg'); + width: 5.41038rem; + height: 1.25881rem; +} + +.logo3 { + background-image: url('/img/site/lightlogos/mutiny.svg'); + width: 2.70644rem; + height: 1.30169rem; +} + +.logo4 { + background-image: url('/img/site/lightlogos/shippo.svg'); + width: 4.04431rem; + height: 1.02769rem; +} + +.logo5 { + background-image: url('/img/site/lightlogos/redbull.svg'); + width: 6.5175rem; + height: 1.03213rem; +} + +.logo6 { + background-image: url('/img/site/lightlogos/writesonic.svg'); + width: 5.296rem; + height: 1.33944rem; +} + +.logo7 { + background-image: url('/img/site/lightlogos/netapp.svg'); + width: 5.27531rem; + height: 0.927rem; +} + +.logo8 { + background-image: url('/img/site/lightlogos/amd.svg'); + width: 4.27531rem; + height: 0.927rem; +} + +.logo9 { + background-image: url('/img/site/lightlogos/cisco.svg'); + width: 3.27531rem; + height: 1.927rem; +} + +.logo10 { + background-image: url('/img/site/lightlogos/morningstar.svg'); + width: 4.27531rem; + height: 0.927rem; +} + +.logo11 { + background-image: url('/img/site/lightlogos/stack.svg'); + width: 4.27531rem; + height: 0.927rem; +} + +.logo12 { + background-image: url('/img/site/lightlogos/factset.svg'); + width: 5.27531rem; + height: 0.927rem; +} + +.logo13 { + background-image: url('/img/site/lightlogos/rakuten.svg'); +} + +.logo14 { + background-image: url('/img/site/lightlogos/bunq.svg'); + width: 4.27531rem; +} + +@keyframes scroll { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-50%); + } +} + +@media (max-width: 1600px) { + .bottomBar { + justify-content: unset; + } + + .logoWrapper:hover { + animation-play-state: paused; + } + + .bottomBar::before, + .bottomBar::after { + content: ''; + width: 100px; + height: 100%; + position: absolute; + top: 0; + z-index: 1; + background: linear-gradient(to right, #130c49, transparent); + } + + .bottomBar::after { + right: 0; + transform: rotate(180deg); + } +} diff --git a/src/components/CaseStudies/Integrations/index.jsx b/src/components/CaseStudies/Integrations/index.jsx new file mode 100644 index 0000000000..f0c3b6d216 --- /dev/null +++ b/src/components/CaseStudies/Integrations/index.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { ButtonContainer } from '/src/theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Integrations() { + return ( +
+
+
+

+ Our team and community are here to support you at every stage of + your AI journey. +

+
+ + Get in Touch + + + Check our Services + +
+
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/Integrations/styles.module.scss b/src/components/CaseStudies/Integrations/styles.module.scss new file mode 100644 index 0000000000..cc3ce98a01 --- /dev/null +++ b/src/components/CaseStudies/Integrations/styles.module.scss @@ -0,0 +1,556 @@ +[data-theme='light'] { + .box { + .left { + .inside { + .logoAI { + background-image: url('/img/site/openai-logo.png'); + } + .logoH { + background-image: url('/img/site/higgingface-logo.png'); + } + .logoJ { + background-image: url('/img/site/jina-logo.png'); + } + .logoD { + background-image: url('/img/site/deepset-logo.png'); + } + .logoCo { + background-image: url('/img/site/cohere-logo.png'); + } + .logoW { + background-image: url('/img/site/wp-solar-logo.png'); + } + .logoG { + background-image: url('/img/site/googleAI.png'); + } + .logoL { + background-image: url('/img/site/langchain-logo.png'); + } + .logoLa { + background-image: url('/img/site/lama-logo.png'); + } + } + } + } +} + +.integrationsSection { + background: #f5f5f5; +} + +.integrationsLogos { + display: flex; + flex-direction: row; + flex: 1; + justify-content: space-around; + overflow: hidden; + + @media screen and (max-width: 500px) { + padding: 9px; + height: 140px; + overflow: hidden; + } + + .logoBg { + border-radius: 0.9375rem; + border: 1px solid #130c49; + width: 14.375rem; + display: flex; + height: 5.9375rem; + flex-shrink: 0; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + align-items: center; + scroll-snap-align: center; + margin: 0 10px; + } + + .inside { + display: flex; + padding-bottom: 4rem; + + animation: scrollSide 40s linear infinite; + + @keyframes scrollSide { + 0% { + transform: translateX(50%); + } + 100% { + transform: translateX(-50%); + } + } + + .integrationsLogos:hover { + animation-play-state: paused; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 2rem; + background-image: url('/img/site/deepset-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoGoogle { + width: 100%; + height: 2rem; + background-image: url('/img/site/google-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoHaystack { + width: 100%; + height: 2rem; + background-image: url('/img/site/haystack-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoStreamlit { + width: 100%; + height: 2rem; + background-image: url('/img/site/streamlit-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } +} + +.integrationsLogos:hover { + .inside { + animation-play-state: paused; + } +} +.mobileIntegrations { + display: none !important; + + @media screen and (max-width: 500px) { + display: flex !important; + } +} + +.box { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-top: 4rem; + + @media screen and (max-width: 580px) { + flex-direction: column-reverse; + } + .left { + display: flex; + flex-direction: column; + flex: 1; + gap: 30px; + justify-content: center; + + .inside { + display: flex; + + @media screen and (max-width: 500px) { + flex-direction: row; + gap: 20px; + display: flex; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 2rem; + background-image: url('/img/site/deepset-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } + } + .right { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 60%; + + @media screen and (max-width: 768px) { + width: 100%; + } + } +} + +.boxes { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: wrap; + margin-bottom: 20px; +} + +.card { + display: flex; + flex-direction: column; + justify-content: space-around; + + width: 14.3125rem; + height: 19.75rem; + + background-color: #141f39; + margin: 1rem; + padding: 2rem; + + border-radius: 0.4375rem; + border-radius: 0.4375rem; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + + @media screen and (max-width: 600px) { + height: auto; + width: 100%; + } +} + +.longCard { + width: 92%; + display: flex; + flex-direction: column; + align-items: center; + height: 400px; + gap: 20px; + z-index: 1; + flex-wrap: nowrap; + background: #ffffff !important; + justify-content: center; + background-image: url('/img/site/home-page-bg-pattern.svg') !important; + background-size: cover !important; + + .cTextColor { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.5rem; + font-style: normal; + font-weight: 500; + line-height: 150%; /* 2.25rem */ + } + @media screen and (max-width: 1000px) { + height: auto; + min-height: 205px; + width: 100%; + } + + @media screen and (max-width: 500px) { + display: flex; + flex-direction: column; + } + + .contentDiv { + height: 100%; + width: 50%; + margin: 50px; + text-align: center; + + br { + display: none; + } + + @media screen and (max-width: 500px) { + width: 100%; + br { + display: inherit; + } + } + } +} + +.safetyTypeBottom { + width: 100%; + height: 186px; + background: #130c49; + margin-top: -200px; +} + +.longHead { + grid-template-columns: 1fr; +} + +.buttons { + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + a { + height: 45px; + width: 200px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: #61bd73; + transition: all 1s ease-out; + color: #130c49; + } + + .buttonGradient:hover { + border-radius: 0.3125rem; + outline: 1px solid #ffffff; + background: rgb(15, 0, 50); + color: #fff; + } + + .buttonOutline { + outline: 1px solid #130c49; + color: #130c49; + transition: all 1s ease-out; + background-color: #f5f5f5; + } + + .buttonOutline:hover { + outline: 1px solid #ffffff; + color: #fff; + transition: all 1s ease-out; + background-color: #130c49; + } +} + +.teamContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + + h3 { + color: #130c49; + text-align: center; + font-size: 1.625rem; + font-weight: 500; + line-height: 157.33%; /* 2.55663rem */ + width: 50%; + + @media screen and (max-width: 840px) { + width: 100%; + } + } +} + +.parentGrid { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + grid-column-gap: 10px; + grid-row-gap: 10px; + width: 868px; + height: 353px; + + @media screen and (max-width: 840px) { + width: 100%; + } + + @media screen and (max-width: 500px) { + display: none; + } +} + +.imageGrid1 { + grid-area: 1 / 1 / 3 / 2; + background-image: url('/img/site/team-grid-01.png'); + background-size: cover; + + @media screen and (max-width: 840px) { + background-position-x: center; + } +} +.imageGrid2 { + grid-area: 1 / 2 / 2 / 3; + background-image: url('/img/site/team-grid-02.png'); + background-size: cover; + @media screen and (max-width: 840px) { + background-position-x: center; + } +} +.imageGrid3 { + grid-area: 2 / 2 / 3 / 3; + background-image: url('/img/site/team-grid-03.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid4 { + grid-area: 1 / 3 / 2 / 4; + background-image: url('/img/site/team-grid-04.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid5 { + grid-area: 1 / 4 / 2 / 5; + background-image: url('/img/site/team-grid-06.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid6 { + grid-area: 2 / 3 / 3 / 5; + background-image: url('/img/site/team-grid-05.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} + +.mobileImage { + display: none; + background-image: url('/img/site/services-team-photo.png'); + background-size: cover; + width: 100%; + height: 630px; + + @media screen and (max-width: 500px) { + display: block; + } +} diff --git a/src/components/CaseStudies/Main/index.jsx b/src/components/CaseStudies/Main/index.jsx new file mode 100644 index 0000000000..d26548d8f9 --- /dev/null +++ b/src/components/CaseStudies/Main/index.jsx @@ -0,0 +1,147 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function Main() { + return ( +
+
+
+

+ Innovative companies of all sizes power AI experiences with Weaviate +

+
+ +
+
+
+
+

Turning Unstructured Data into Insights

+

How Instabase delivers enterprise-ready AI with Weaviate

+
+
+ +
+
+
+
+
+

Transforming Customer Service with Generative AI

+
+
+ +
+
+
+
+
+

Building an AI-Powered Shopping Copilot

+
+
+ +
+
+
+
+
+

Building Foundations for AI-First App Development

+
+
+ +
+
+
+
+
+ CASE STUDY +

+ How a Leading Financial Data Company

Commercialized + AI in Under a Year +

+
+
+ +
+
+
+ +
+
+

Ask Astro: An open source LLM Application

+
+ + +
+
+

Transforming Risk Management with Generative AI

+
+ + +
+
+

Solving Operational Challenges with Weaviate

+
+ + +
+
+
+
+

+ “Through our Corpus API connected to Weaviate, users can build + very powerful, low latency search engines in minutes with + little to no code.” +

+

Aisis Julian

+ Senior Software Engineer, Morningstar +
+
+
+
+
+
+

Start building with Weaviate for free

+
+
+
+ + Get Started + + + Talk to Sales + +
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/Main/styles.module.scss b/src/components/CaseStudies/Main/styles.module.scss new file mode 100644 index 0000000000..c171970a35 --- /dev/null +++ b/src/components/CaseStudies/Main/styles.module.scss @@ -0,0 +1,659 @@ +:root { + --darkColor: #130c49; + --subColor: #8396b1; + --lightColor: ##f7f9fd; + --headerFont: 'Plus Jakarta Sans'; + --paraFont: 'Inter'; +} + +.container { + padding: 3rem; + + @media screen and (max-width: 1400px) { + padding: 2rem 3rem; + } +} + +.box { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + margin-bottom: 40px; + + h2 { + color: #130c49; + text-align: center; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 2.8rem */ + width: 50%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } +} +.bentoGrid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 20px; +} + +.bento01, +.bento02, +.bento03, +.bento04, +.bento05, +.bento06 { + flex-shrink: 1; +} + +.bento01 { + width: 37.1875rem; + height: 24.875rem; + border-radius: 1.25rem; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0) 0%, + rgba(47, 47, 169, 0.8) 100% + ), + url('/img/site/instabase-bg-image.png'); + background-size: cover; + background-position: center; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + transition: all 0.3s ease-in-out; + + .bentoText { + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/instabase-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 12.3125rem; + height: 1.3125rem; + flex-shrink: 0; + margin: 30px 0px; + } + + h3 { + color: #f7f9fd; + font-family: 'Plus Jakarta Sans'; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + width: 85%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + + p { + color: #f7f9fd; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 150%; /* 1.3125rem */ + + @media screen and (max-width: 1200px) { + width: 80%; + } + } + } +} + +.bento02 { + width: 26.5625rem; + height: 24.875rem; + border-radius: 1.25rem; + background: #f7f9fd; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0) 0%, + rgba(47, 47, 169, 0.1) 100% + ), + url('/img/site/neople-background-image.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-y: bottom; + background-position-x: right; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + transition: all 0.3s ease-in-out; + + .bentoText { + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/neople-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 9.02219rem; + height: 2.875rem; + flex-shrink: 0; + margin: 30px 0px; + } + + h3 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.75rem; + font-style: normal; + font-weight: 700; + line-height: 130%; /* 2.275rem */ + width: 85%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + } +} + +.bento03 { + width: 26.5625rem; + height: 33.9375rem; + border-radius: 1.25rem; + + background: linear-gradient( + 180deg, + rgba(247, 249, 253, 0) 0%, + rgba(46, 40, 139, 0.8) 100% + ), + url('/img/site/moonsift-background-image.png'); + background-size: contain; + background-position-y: bottom; + background-repeat: no-repeat; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + + @media screen and (max-width: 900px) { + background-size: cover; + background-position-y: top; + } + + @media screen and (max-width: 700px) { + background-size: contain; + background-position-y: bottom; + background-repeat: no-repeat; + } + + .bentoText { + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/moonsift-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 9.02219rem; + height: 2.875rem; + flex-shrink: 0; + margin: 30px 0px; + } + + h3 { + color: #f7f9fd; + font-family: 'Plus Jakarta Sans'; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + } + } +} + +.bentoSmall { + width: 20.875rem; + height: 19.9375rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: #f7f9fd; + background-size: cover; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + + .bentoText { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 20px; + flex-grow: 1; + } + + .bentoLogo { + width: 14.125rem; + height: 2.75rem; + background: url('/img/site/astronomer-logo-cs.svg'); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + } + + .logo02 { + background: url('/img/site/preverity-logo-cs.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position-y: -220%; + } + + .logo03 { + background: url('/img/site/humach-logo-cs.svg'); + background-repeat: no-repeat; + } + + h3 { + color: var(--darkColor); + font-family: var(--headerFont); + font-size: 1.75rem; + font-style: normal; + font-weight: 700; + line-height: 140%; + margin: 0; + } + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + padding: 20px; + .bentoText { + gap: 10px; + } + } +} + +.bento04 { + width: 37.1875rem; + height: 33.75rem; + border-radius: 1.25rem; + background: #85e3bc; + background-size: cover; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + + .bentoText { + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoImage { + background: url('/img/site/unbody-header-image.png'); + background-size: contain; + background-repeat: no-repeat; + width: 100%; + height: 18.25rem; + flex-shrink: 0; + margin: 0px 0px 20px 0px; + + @media screen and (max-width: 900px) { + height: 13.25rem; + } + + @media screen and (max-width: 500px) { + height: 9.25rem; + } + } + + h3 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; + } + } +} + +.bento05 { + width: 64.875rem; + height: 22.6875rem; + border-radius: 1.25rem; + background: #130c49; + background-size: cover; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + + .bentoText { + margin: 0; + display: flex; + gap: 30px; + + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + flex-direction: column; + } + .bentoImage { + background: url('/img/site/morningstar-header-image.png'); + background-size: cover; + background-position-x: center; + width: 11.9375rem; + height: 15.6875rem; + border-radius: 1.25rem; + flex-shrink: 0; + margin: 0px 0px 20px 0px; + + @media screen and (max-width: 500px) { + width: 100%; + } + } + + h3 { + color: #f7f9fd; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 600; + line-height: 150%; /* 3rem */ + + @media screen and (max-width: 900px) { + font-size: 1.5rem; + } + } + + p { + color: #61bd73; + font-family: Inter; + font-size: 1.5rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; /* 2.35994rem */ + } + + span { + color: #61bd73; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.96663rem */ + } + } +} + +.finance { + background: url('/img/site/header-bg.svg') #130c49; + background-size: cover; + background-position-x: center; + background-position-y: center; + background-repeat: no-repeat; + + @media screen and (max-width: 900px) { + br { + display: none; + } + } +} + +.bento06 { + width: 65.625rem; + height: 18.875rem; + border-radius: 1.25rem; + background: url('/img/site/gradient-bg-cs.png'); + background-size: cover; + background-position-x: center; + + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + + .bentoText { + margin: 0; + display: flex; + gap: 30px; + + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + flex-direction: column; + } + + h3 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.5rem */ + width: 70%; + + @media screen and (max-width: 900px) { + width: 100%; + font-size: 1.5rem; + } + } + } +} + +@media (max-width: 1300px) { + .bento01, + .bento04 { + width: 33rem; + } + .bento02, + .bento03 { + width: 22rem; + } + .bento05, + .bento06 { + width: 56rem; + } +} + +@media (max-width: 1100px) { + .bento01, + .bento04 { + width: 30rem; + } + .bento02, + .bento03 { + width: 20rem; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 960px) { + .bento01, + .bento04 { + width: 27rem; + } + .bento02, + .bento03 { + width: 23rem; + } + .bento05, + .bento06, + .bentoSmall { + width: 100%; + height: auto; + } +} + +@media (max-width: 940px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02, + .bento03 { + width: 24rem; + height: 33.9375rem; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 880px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02 { + width: 100%; + height: 24.875rem; + } + .bento03 { + width: 100%; + } + .bento05, + .bento06 { + width: 100%; + } +} +@media (max-width: 795px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02 { + width: 100%; + height: 24.875rem; + } + .bento03 { + width: 100%; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 600px) { + .bento01, + .bento02, + .bento03, + .bento04, + .bento05, + .bento06 { + width: 100%; + } + + .bento01 { + height: 25.875rem; + } + + .bento02 { + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0) 0%, + rgba(47, 47, 169, 0.1) 100% + ), + url('/img/site/neople-background-image-alpha.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-y: bottom; + background-position-x: right; + } + + .bento04 { + height: 30.75rem; + } +} + +.buttons { + position: absolute; + bottom: 20px; + display: flex; + right: 20px; + + .arrowButton { + background: url('/img/site/ArrowButton.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 3.6875rem; + height: 3.6875rem; + flex-shrink: 0; + transition: all 0.3s ease-in-out; + } + + .arrowButton:hover { + transform: scale(1.1); + } +} + +.buttonContainer { + display: flex; + gap: 20px; + flex-wrap: wrap; + + .buttonDark { + color: #f7f9fd; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + background: #130c49; + } + + .buttonLight { + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f7f9fd; + } +} diff --git a/src/components/CaseStudies/Study/index.jsx b/src/components/CaseStudies/Study/index.jsx new file mode 100644 index 0000000000..1021b91910 --- /dev/null +++ b/src/components/CaseStudies/Study/index.jsx @@ -0,0 +1,185 @@ +import React from 'react'; +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +export default function Study() { + return ( +
+
+
+
+

The AI Application Platform for Unstructured Data

+

+ Instabase is an enterprise-grade AI Application Platform that + turns unstructured data into insights, instantly. They solve one + of the most acute problems businesses face – slow or inaccurate + decisioning due to unstructured data. Their engineering team was + looking for a database that would allow them to deliver data + insights to their users with a high degree of accuracy and rapid + performance. They chose Weaviate because of the flexibility that a + leading open-source tool gave them while hitting Instabase’s + critical performance metrics better than any other database they + tested. Built-in features like hybrid search and distance metrics, + as well as support from an engaged developer community, made + Weaviate the clear choice for Instabase. +

+

Challenge

+

+ Instabase processes over 500K highly varied documents per day and + needs to scale to the ever-growing demand of their customers. They + needed a database solution that would allow them to index, store, + and retrieve massive volumes of data while delivering results with + an incredibly high level of accuracy to their users. “Accuracy + determines the amount of savings any large institution can get,” + said Shaunak Godbole, Head of Infrastructure Engineering at + Instabase. “If the results aren’t accurate or take too long to + surface, a human needs to get involved, and the cost savings goes + away. So accuracy and speed are critical for us.”  Additionally, + Instabase needed to support customers in highly regulated + environments. European customers needed to ensure their data + didn’t leave certain countries, while financial institutions + didn’t want their data to leave their on-premises servers. They + needed a database solution that could be deployed anywhere while + maintaining a high level of performance. If accuracy, speed, and + flexible deployment criteria were not met, Instabase would not be + able to reduce the need for human intervention in complex data + workflows for their customers. +

+ +

Why Instabase Chose Weaviate

+

+ Instabase wants to empower their customers to focus on making fast + and accurate decisions. They achieve this by classifying, + extracting, and validating information from highly unstructured + data. “The collaboration with Weaviate’s team, the community, and + the results of our performance tests made Weaviate an easy + choice,” notes Godbole. “In terms of performance, nobody needed + convincing – the benchmarks spoke for themselves.” +

+

Weaviate checked all of Instabase’s boxes:

+
    +
  • + Powerful performance: Instabase had their own + benchmarks for the use cases they knew they had to solve really, + really well. These benchmarks focus on retrieval accuracy and + latency, and the queries are complex aggregation and composition + where both dense and sparse searches are required. Each use case + had different benchmarks, and Weaviate was a clear winner with + high retrieval accuracy and low latency for vector search. Once + the benchmarking team was convinced Weaviate was up for the + challenge, teams across the organization worked together to + bring Weaviate into production. +
  • +
  • + High adaptability: By using an AI-native + open-source vector database, Instabase could meet their + customers wherever they operated, whether in the cloud or + on-prem. This allowed for maximum flexibility to fulfill the + strict deployment needs of organizations in highly regulated + regions and industries. +
  • +
  • + Modular architecture: Instead of having to + build out their own capabilities, Instabase developers saved + time by using Weaviate’s out of the box features like hybrid + search and distance metrics, as well as easy integrations with + popular large language models (LLMs). +
  • +
  • + Strong support: Weaviate has cultivated an + engaged, open source community with over 6M downloads and tens + of thousands of organizations using the platform. Over 5K + developers have direct access to the experts and comprehensive + documentation they need to quickly problem solve as they build + their applications. In addition, Weaviate’s core team was very + collaborative with Instabase and was able to provide short, + medium and long-term solutions to existing and anticipated + challenges. +
  • +
+ +

+ + “Accuracy determines the amount of savings any large institution + can get. If the results aren’t accurate or take too long to + surface, a human needs to get involved, and the cost savings are + greatly reduced. So accuracy and speed are critical for us.” + +

+

+ Shaunak Godbole, Head of Infrastructure Engineering at Instabase +

+
+
+
+
+

Rapid performance

+

+ Instabase is able to store 50K+ tenants in the Weaviate cluster + and query data from specific tenants within milliseconds. +

+

Scales to unlimited document size

+

+  Instabase has seen the same impressive results whether customers + engage with single-page handwritten notes, 200 pages of + documentation, or 400 pages of financial filings. +

+

450+ data types supported

+

+ With Weaviate, Instabase was able to support the ingestion and + indexing of 450+ data types for a single customer solution. +

+
+
+
+ +

+ Instabase helps + organizations across large enterprises, mid-market companies, and + the federal government solve mission-critical automation problems + and obtain insights from unstructured data. Their platform, called + AI Hub, enables customers to obtain instant insights in Converse + mode. When in Build mode, they can extract data from any content, + classify, clean it up and embed the newly structured data + downstream into existing systems. These automations enable + customers to quickly and accurately make vital business decisions + for complex processes like mortgage underwriting, driver’s license + verification, or insurance broker submissions. Instabase’s + customers include the world’s largest financial institutions, + insurance companies, transportation, retail, and public sector + organizations. +

+

Why AWS

+

+ In 2017, the engineers at Instabase made the choice to build + entirely on Kubernetes. They have several microservices that run + on top of that and are deeply integrated with the{' '} + + AWS ecosystem + + , making use of products including AWS EC2, ECS, EKS, ELB, S3, + ElastiCache, CDN, and Shield. AWS allows Instabase to build a + highly-available, secure, scalable, and performant platform to + support even their largest customers. +

+

About Weaviate

+

+ Vector databases are becoming core to the AI tech stack because + they can handle a very large amount of unstructured data in an + efficient way. Weaviate is an AI-native vector database available + on the AWS marketplace that can scale to handle billions of + vectors and millions of tenants. Customers and community members + use Weaviate to power large-scale search and generative AI + applications like chatbots and agents. Weaviate’s extensible + architecture offers easy pluggability with the AI ecosystem, + empowering developers of all levels to build and iterate faster. + And flexible deployment options let teams abstract the burden of + hosting and managing their database, while still meeting + enterprise requirements for security and compliance. +

+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/Study/styles.module.scss b/src/components/CaseStudies/Study/styles.module.scss new file mode 100644 index 0000000000..3e8a24712b --- /dev/null +++ b/src/components/CaseStudies/Study/styles.module.scss @@ -0,0 +1,153 @@ +.studyContainer { + padding: 2.5rem; + display: flex; + flex-direction: row; + justify-content: space-around; + padding: 2.5rem; + column-gap: 10px; + max-width: 1500px; + margin: auto; + + @media screen and (max-width: 900px) { + flex-direction: column; + align-items: center; + gap: 30px; + } +} + +.bgColor { + background: #ededed; +} + +.leftContainer { + width: 40%; + min-width: 360px; + + @media screen and (max-width: 900px) { + width: 100%; + } + + h2 { + margin: 20px 0px; + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 2.1rem */ + } + + p { + margin: 20px 0px; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + + .quote { + color: #130c49; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.76994rem */ + } +} + +.rightContainer { + display: flex; + flex-direction: column; + gap: 60px; + + .topSection { + width: 28.625rem; + height: 30rem; + flex-shrink: 0; + border-radius: 0.9375rem; + background: #130c49; + padding: 30px; + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + } + + h2 { + margin: 20px 0px; + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + margin: 20px 0px; + color: #fff; + font-family: Inter; + font-size: 0.9375rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.3125rem */ + } + } + + .bottomSection { + border-radius: 0.9375rem; + background: #f5f5f5; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + width: 28.625rem; + height: 79.4375rem; + flex-shrink: 0; + padding: 30px; + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + } + + .logo { + background-image: url('/img/site/study-instabase-dark.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 13.8125rem; + height: 1.47194rem; + + flex-shrink: 0; + } + + h2 { + margin: 20px 0px; + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 2.35994rem */ + } + + p { + margin: 20px 0px; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + a { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + text-decoration-line: underline; + } + } +} diff --git a/src/components/CaseStudies/V2/Header/index.jsx b/src/components/CaseStudies/V2/Header/index.jsx new file mode 100644 index 0000000000..628c5f3c9b --- /dev/null +++ b/src/components/CaseStudies/V2/Header/index.jsx @@ -0,0 +1,44 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function StudyHeader() { + return ( +
+
+
+
+ MORNINGSTAR CASE STUDY +

+ “Through our Corpus API connected to Weaviate, users can build + very powerful, low latency search engines in minutes with little + to no code.” +

+ + Aisis Julian +

+ Senior Software Engineer, Morningstar +
+
+
+ + Download PDF + + + Contact sales + +
+
+
+
+
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/V2/Header/styles.module.scss b/src/components/CaseStudies/V2/Header/styles.module.scss new file mode 100644 index 0000000000..03c571f560 --- /dev/null +++ b/src/components/CaseStudies/V2/Header/styles.module.scss @@ -0,0 +1,273 @@ +:root { + --darkColor: #130c49; + --headerFont: 'Plus Jakarta Sans'; + --paraFont: 'Inter'; +} + +.box { + display: flex; + justify-content: center; + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + + @media screen and (max-width: 900px) { + flex-direction: column; + gap: 40px; + margin-bottom: 0px; + } + + span { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + } + + .headSpan { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.4rem */ + } + + h1 { + color: var(--darkColor); + font-family: var(--headerFont); + font-size: 1.625rem; + font-style: normal; + font-weight: 700; + line-height: 150%; /* 2.4375rem */ + margin-bottom: 1rem; + width: 70%; + @media screen and (max-width: 900px) { + width: 100%; + } + } + + .headerBox { + width: 50%; + @media screen and (max-width: 900px) { + width: 100%; + } + + p { + color: #ffffff; + width: 80%; + @media screen and (max-width: 1000px) { + width: 100%; + } + } + } +} + +.left { + display: flex; + flex-direction: column; + gap: 30px; +} + +.right { + @media screen and (max-width: 970px) { + display: none; + } + .image { + background: url('/img/site/case-study-header-image-01.png'); + background-size: contain; + background-repeat: no-repeat; + width: 36.6875rem; + height: 26.6875rem; + flex-shrink: 0; + border-radius: 1.25rem; + background-position: right; + transition: all 0.3s ease-in-out; + + @media screen and (max-width: 1200px) { + width: 30.6875rem; + height: 26.6875rem; + } + + @media screen and (max-width: 1100px) { + width: 26.6875rem; + height: 26.6875rem; + } + + @media screen and (max-width: 900px) { + width: 100%; + min-width: 29rem; + height: 26.6875rem; + background-position: unset; + } + } +} + +.buttons { + display: flex; + gap: 20px; + + .buttonDark { + color: #f7f9fd; + text-align: center; + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + background: #130c49; + } + + .buttonLight { + color: #130c49; + text-align: center; + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 10.625rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f7f9fd; + } +} + +.headerSecurity { + background: #130c49; + background-image: url('/img/site/case-study-bg-image-01.png'); + background-size: cover; +} + +.topText { + color: #130c49; + text-align: center; + font-family: var(--headerFont); + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 120%; + text-transform: uppercase; + margin: 10px 0px; +} +.bottomBar { + background: #130c49; + width: 100%; + height: 5rem; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; +} + +.logoWrapper { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-evenly; + align-items: center; + gap: 40px; + animation: slide 20s linear infinite; +} + +.logo { + background-image: url('/img/site/stackoverflow-cs-variant.svg'); + background-size: cover; + background-position: center; + width: 4.05294rem; + height: 1.2745rem; + flex-shrink: 0; +} + +.logo1 { + background-image: url('/img/site/instabase-cs-variant.svg'); + width: 7.00806rem; + height: 0.73581rem; +} + +.logo2 { + background-image: url('/img/site/redhat-cs-variant.svg'); + width: 5.41038rem; + height: 1.25881rem; +} + +.logo3 { + background-image: url('/img/site/mutiny-cs-variant.svg'); + width: 2.70644rem; + height: 1.30169rem; +} + +.logo4 { + background-image: url('/img/site/shippo-cs-variant.svg'); + width: 4.04431rem; + height: 1.02769rem; +} + +.logo5 { + background-image: url('/img/site/redbull-cs-variant.svg'); + width: 6.5175rem; + height: 1.03213rem; +} + +.logo6 { + background-image: url('/img/site/writesonic-cs-variant.svg'); + width: 5.296rem; + height: 1.33944rem; +} + +.logo7 { + background-image: url('/img/site/netapp-cs-variant.svg'); + width: 5.27531rem; + height: 0.927rem; +} + +@media (max-width: 950px) { + .bottomBar { + justify-content: unset; + } + + .logoWrapper { + display: flex; + flex-direction: row; + } + + .bottomBar::before, + .bottomBar::after { + content: ''; + width: 100px; + height: 100%; + position: absolute; + top: 0; + z-index: 1; + background: linear-gradient(to right, #130c49, transparent); + } + + .bottomBar::after { + right: 0; + transform: rotate(180deg); + } + + @keyframes slide { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-100%); + } + } +} diff --git a/src/components/CaseStudies/V2/Integrations/index.jsx b/src/components/CaseStudies/V2/Integrations/index.jsx new file mode 100644 index 0000000000..f0c3b6d216 --- /dev/null +++ b/src/components/CaseStudies/V2/Integrations/index.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { ButtonContainer } from '/src/theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Integrations() { + return ( +
+
+
+

+ Our team and community are here to support you at every stage of + your AI journey. +

+
+ + Get in Touch + + + Check our Services + +
+
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/V2/Integrations/styles.module.scss b/src/components/CaseStudies/V2/Integrations/styles.module.scss new file mode 100644 index 0000000000..cc3ce98a01 --- /dev/null +++ b/src/components/CaseStudies/V2/Integrations/styles.module.scss @@ -0,0 +1,556 @@ +[data-theme='light'] { + .box { + .left { + .inside { + .logoAI { + background-image: url('/img/site/openai-logo.png'); + } + .logoH { + background-image: url('/img/site/higgingface-logo.png'); + } + .logoJ { + background-image: url('/img/site/jina-logo.png'); + } + .logoD { + background-image: url('/img/site/deepset-logo.png'); + } + .logoCo { + background-image: url('/img/site/cohere-logo.png'); + } + .logoW { + background-image: url('/img/site/wp-solar-logo.png'); + } + .logoG { + background-image: url('/img/site/googleAI.png'); + } + .logoL { + background-image: url('/img/site/langchain-logo.png'); + } + .logoLa { + background-image: url('/img/site/lama-logo.png'); + } + } + } + } +} + +.integrationsSection { + background: #f5f5f5; +} + +.integrationsLogos { + display: flex; + flex-direction: row; + flex: 1; + justify-content: space-around; + overflow: hidden; + + @media screen and (max-width: 500px) { + padding: 9px; + height: 140px; + overflow: hidden; + } + + .logoBg { + border-radius: 0.9375rem; + border: 1px solid #130c49; + width: 14.375rem; + display: flex; + height: 5.9375rem; + flex-shrink: 0; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + align-items: center; + scroll-snap-align: center; + margin: 0 10px; + } + + .inside { + display: flex; + padding-bottom: 4rem; + + animation: scrollSide 40s linear infinite; + + @keyframes scrollSide { + 0% { + transform: translateX(50%); + } + 100% { + transform: translateX(-50%); + } + } + + .integrationsLogos:hover { + animation-play-state: paused; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 2rem; + background-image: url('/img/site/deepset-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoGoogle { + width: 100%; + height: 2rem; + background-image: url('/img/site/google-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoHaystack { + width: 100%; + height: 2rem; + background-image: url('/img/site/haystack-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoStreamlit { + width: 100%; + height: 2rem; + background-image: url('/img/site/streamlit-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } +} + +.integrationsLogos:hover { + .inside { + animation-play-state: paused; + } +} +.mobileIntegrations { + display: none !important; + + @media screen and (max-width: 500px) { + display: flex !important; + } +} + +.box { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-top: 4rem; + + @media screen and (max-width: 580px) { + flex-direction: column-reverse; + } + .left { + display: flex; + flex-direction: column; + flex: 1; + gap: 30px; + justify-content: center; + + .inside { + display: flex; + + @media screen and (max-width: 500px) { + flex-direction: row; + gap: 20px; + display: flex; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 2rem; + background-image: url('/img/site/deepset-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } + } + .right { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 60%; + + @media screen and (max-width: 768px) { + width: 100%; + } + } +} + +.boxes { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: wrap; + margin-bottom: 20px; +} + +.card { + display: flex; + flex-direction: column; + justify-content: space-around; + + width: 14.3125rem; + height: 19.75rem; + + background-color: #141f39; + margin: 1rem; + padding: 2rem; + + border-radius: 0.4375rem; + border-radius: 0.4375rem; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + + @media screen and (max-width: 600px) { + height: auto; + width: 100%; + } +} + +.longCard { + width: 92%; + display: flex; + flex-direction: column; + align-items: center; + height: 400px; + gap: 20px; + z-index: 1; + flex-wrap: nowrap; + background: #ffffff !important; + justify-content: center; + background-image: url('/img/site/home-page-bg-pattern.svg') !important; + background-size: cover !important; + + .cTextColor { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.5rem; + font-style: normal; + font-weight: 500; + line-height: 150%; /* 2.25rem */ + } + @media screen and (max-width: 1000px) { + height: auto; + min-height: 205px; + width: 100%; + } + + @media screen and (max-width: 500px) { + display: flex; + flex-direction: column; + } + + .contentDiv { + height: 100%; + width: 50%; + margin: 50px; + text-align: center; + + br { + display: none; + } + + @media screen and (max-width: 500px) { + width: 100%; + br { + display: inherit; + } + } + } +} + +.safetyTypeBottom { + width: 100%; + height: 186px; + background: #130c49; + margin-top: -200px; +} + +.longHead { + grid-template-columns: 1fr; +} + +.buttons { + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + a { + height: 45px; + width: 200px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: #61bd73; + transition: all 1s ease-out; + color: #130c49; + } + + .buttonGradient:hover { + border-radius: 0.3125rem; + outline: 1px solid #ffffff; + background: rgb(15, 0, 50); + color: #fff; + } + + .buttonOutline { + outline: 1px solid #130c49; + color: #130c49; + transition: all 1s ease-out; + background-color: #f5f5f5; + } + + .buttonOutline:hover { + outline: 1px solid #ffffff; + color: #fff; + transition: all 1s ease-out; + background-color: #130c49; + } +} + +.teamContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + + h3 { + color: #130c49; + text-align: center; + font-size: 1.625rem; + font-weight: 500; + line-height: 157.33%; /* 2.55663rem */ + width: 50%; + + @media screen and (max-width: 840px) { + width: 100%; + } + } +} + +.parentGrid { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + grid-column-gap: 10px; + grid-row-gap: 10px; + width: 868px; + height: 353px; + + @media screen and (max-width: 840px) { + width: 100%; + } + + @media screen and (max-width: 500px) { + display: none; + } +} + +.imageGrid1 { + grid-area: 1 / 1 / 3 / 2; + background-image: url('/img/site/team-grid-01.png'); + background-size: cover; + + @media screen and (max-width: 840px) { + background-position-x: center; + } +} +.imageGrid2 { + grid-area: 1 / 2 / 2 / 3; + background-image: url('/img/site/team-grid-02.png'); + background-size: cover; + @media screen and (max-width: 840px) { + background-position-x: center; + } +} +.imageGrid3 { + grid-area: 2 / 2 / 3 / 3; + background-image: url('/img/site/team-grid-03.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid4 { + grid-area: 1 / 3 / 2 / 4; + background-image: url('/img/site/team-grid-04.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid5 { + grid-area: 1 / 4 / 2 / 5; + background-image: url('/img/site/team-grid-06.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid6 { + grid-area: 2 / 3 / 3 / 5; + background-image: url('/img/site/team-grid-05.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} + +.mobileImage { + display: none; + background-image: url('/img/site/services-team-photo.png'); + background-size: cover; + width: 100%; + height: 630px; + + @media screen and (max-width: 500px) { + display: block; + } +} diff --git a/src/components/CaseStudies/V2/Main/index.jsx b/src/components/CaseStudies/V2/Main/index.jsx new file mode 100644 index 0000000000..b6c0eca891 --- /dev/null +++ b/src/components/CaseStudies/V2/Main/index.jsx @@ -0,0 +1,207 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function Main() { + return ( +
+
+
+
+ PROJECT SUMMARY +

Building an Intelligence Engine

+

+ {' '} + Morningstar selected Weaviate's vector database to build a + scalable, accurate Intelligence Engine Platform, delivering + reliable AI-driven financial tools and dynamic document search. +

+
+
+
+
+

Driving Innovation

+
+

+ The Intelligence Engine powers hundreds of in-house applications. +

+
+
+

RAG pipelines

+
+

+ The Intelligence Engine powers hundreds of in-house applications. +

+
+
+
+
+

Financial Research

+
+

+ The Intelligence Engine powers hundreds of in-house applications. +

+
+
+

Self-serve RAG

+
+

+ The Intelligence Engine powers hundreds of in-house applications. +

+
+
+ +
+
+
+ about the company +
+

+ Morningstar, Inc. + is a leading global provider of independent investment insights. + Morningstar offers an extensive line of products and services + for individual investors, financial advisors, asset managers and + owners, retirement plan providers and sponsors, and + institutional investors in the debt and private capital markets. + Morningstar provides data and research insights on a wide range + of investment offerings, including managed investment products, + publicly listed companies, private capital markets, debt + securities, and real-time global market data.  +

+
+
+
+
+ challenge +

+ Over the last 40 years, Morningstar amassed an extensive + collection of proprietary financial data. Morningstar has sought + to further empower investors that rely on its data by developing + an advanced research assistant AI application. According to + Benjamin Barrett, Morningstar’s Head of Technology, Research + Products, building a chatbot on that data “looks like magic, but + when you start peeling back the layers of the onion, you have to + ask, is it actually accurate? Is it pulling the latest, + greatest, most relevant data? Are our answers robust and + complete?” +

+

+ As his engineering team worked with Morningstar’s Quantitative + Research team to build their Intelligence Engine Platform, they + had to ensure an incredibly high level of accuracy in order to + maintain their users’ trust. “We want to have one single source + of truth. Our whole mission is to empower investor success. And + the way to do that is to give them reliable, trustworthy + financial data.” +

+
+
+
+
+
+ why weaviate +

+ In early 2023, Morningstar saw early success in experiments with + LLMs and snippets of their own data. They quickly realized the + potential of using AI to harness decades of longform research + content and real-time data with RAG, and started their search + for the right vector database. +

+
+
+
+

+ Ease-of-use: Weaviate’s open-source database + was quick and easy for Morningstar to spin up locally in a + Docker container and start experimenting. +

+
+
+
+

+ Data privacy and security: Flexible deployment + options and multi-tenant architecture allowed for strict data + privacy and security compliance. +

+
+
+
+

+ Flexibility and scalability: Weaviate supported + a variety of use cases–from search engines to tailored AI + applications–and was able to handle large and diverse data sets. +

+
+
+
+

+ Support: Weaviate offered great support from + local development all the way to production. +

+
+
+
+
+
+ results +

+ With Weaviate, Morningstar was able to build their + Intelligence Engine Platform, a product which solves a + challenge facing today’s financial services firms: how to + easily create and customize AI applications built on a + foundation of trusted financial data and research. The + Intelligence Engine also powers a variety of workflows, APIs, + and chat interfaces across Morningstar’s own product ecosystem + – including Mo, it’s investment research-assistant chatbot – + for both internal and external users. +

+
+
+
+
+
+

We’re here to help!

+

+ Need support getting started with Weaviate? We’ve got your + back. +

+
+
+
+ + {'Get in touch >'} + +
+
+
+
+
+
+

+ We’d love to give you a live demo of what Weaviate can do +

+ +
+ + +
+
+
+
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/V2/Main/styles.module.scss b/src/components/CaseStudies/V2/Main/styles.module.scss new file mode 100644 index 0000000000..8e9fbfdff4 --- /dev/null +++ b/src/components/CaseStudies/V2/Main/styles.module.scss @@ -0,0 +1,829 @@ +:root { + --darkColor: #130c49; + --subColor: #8396b1; + --lightColor: ##f7f9fd; + --headerFont: 'Plus Jakarta Sans'; + --paraFont: 'Inter'; +} + +.mainBody { + background: #edf4f8; +} +.container { + padding: 3rem; + + @media screen and (max-width: 1400px) { + padding: 2rem 3rem; + } +} + +.box { + display: flex; + justify-content: center; + justify-content: flex-start; + margin: auto; + width: 65rem; + height: 26.25rem; + border-radius: 1.25rem; + background: #f7f9fd; + transform: translateY(-100px); + flex-shrink: 0; + padding: 40px; + gap: 30px; + + @media screen and (max-width: 900px) { + flex-direction: column; + gap: 40px; + margin-bottom: 30px; + width: 100%; + height: auto; + transform: translateY(0px); + } + + .firstColumn { + flex: 1 210px; + display: flex; + align-content: space-between; + flex-direction: column; + justify-content: space-around; + } + + .secondColumn { + flex: 1; + display: flex; + align-content: space-between; + flex-direction: column; + justify-content: space-around; + + @media screen and (max-width: 900px) { + gap: 20px; + } + } + + h2 { + color: var(--darkColor); + font-family: var(--headerFont); + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + + p { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + width: 90%; + } + + span { + color: var(--subColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.4rem */ + text-transform: uppercase; + } + + .tagHolder { + display: flex; + align-items: center; + gap: 10px; + } + + h3 { + color: var(--darkColor); + font-family: var(--headerFont); + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: 150%; + margin: 0; + } + .CsIcon { + background: url('/img/site/case-study-main-icon-01.svg'); + background-size: contain; + width: 2.30888rem; + height: 2.3125rem; + } + + .CsText { + color: var(--darkColor); + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.225rem */ + width: 100%; + } +} + +.bentoGrid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 20px; +} + +.bento01, +.bento02, +.bento03, +.bento04, +.bento05, +.bento06 { + flex-shrink: 1; +} + +.bento01 { + width: 25.9375rem; + height: 37.125rem; + flex-shrink: 0; + border-radius: 1.25rem; + border-radius: 1.25rem; + background: var(--darkColor); + background-size: cover; + background-position: center; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + transition: all 0.3s ease-in-out; + + .bentoText { + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/Morningstar.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 12.3125rem; + height: 2.5625rem; + + flex-shrink: 0; + margin: 30px 0px; + } + + span { + color: var(--Color-12, #8396b1); + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.4rem */ + text-transform: uppercase; + } + + a { + color: var(--subColor); + font-family: var(--paraFont); + text-decoration: underline; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + } + + h3 { + color: #f7f9fd; + font-family: var(--headerFont); + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + width: 85%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + + p { + color: var(--subColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + } +} + +.bento02 { + width: 37.8125rem; + height: 37.125rem; + flex-shrink: 0; + border-radius: 1.25rem; + + background: #f7f9fd; + + background-size: contain; + background-repeat: no-repeat; + background-position-y: bottom; + background-position-x: right; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + transition: all 0.3s ease-in-out; + + .bentoText { + margin: 0; + display: flex; + flex-direction: column; + gap: 40px; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/neople-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 9.02219rem; + height: 2.875rem; + flex-shrink: 0; + margin: 30px 0px; + } + + span { + color: var(--Color-12, #8396b1); + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.4rem */ + text-transform: uppercase; + } + + a { + color: var(--subColor); + font-family: var(--paraFont); + text-decoration: underline; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + } + + p { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + } + + h3 { + color: var(--darkColor); + font-family: var(--headerFont); + font-size: 1.75rem; + font-style: normal; + font-weight: 700; + line-height: 130%; /* 2.275rem */ + width: 85%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + } +} + +.bento03 { + width: 65rem; + height: 32.4375rem; + flex-shrink: 0; + border-radius: 1.25rem; + + background: url('/img/site/case-study-main-01.png'); + border-radius: 0.9375rem; + + box-shadow: 0px 3px 5px 0px rgba(79, 150, 172, 0.1); + background-size: cover; + + background-repeat: no-repeat; + transition: all 0.3s ease-in-out; + position: relative; + + display: flex; + flex-direction: column; + justify-content: space-around; + + .bentoText { + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/moonsift-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 9.02219rem; + height: 2.875rem; + flex-shrink: 0; + margin: 30px 0px; + } + + h3 { + color: #f7f9fd; + font-family: var(--headerFont); + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + } + } +} + +.bento04 { + width: 37.8125rem; + height: 44.875rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: #f7f9fd; + background-size: cover; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + gap: 40px; + + .bentoText { + margin: 0; + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoImage { + background: url('/img/site/unbody-header-image.png'); + background-size: contain; + background-repeat: no-repeat; + width: 100%; + height: 18.25rem; + flex-shrink: 0; + margin: 0px 0px 20px 0px; + + @media screen and (max-width: 900px) { + height: 13.25rem; + } + } + + p { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + } + + span { + color: var(--subColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.4rem */ + text-transform: uppercase; + } + } + + .tagHolder { + display: flex; + align-items: flex-start; + gap: 10px; + } + + .CsIcon { + background: url('/img/site/case-study-main-icon-01.svg'); + background-size: cover; + width: 2.30888rem; + height: 2.3125rem; + flex-shrink: 0; + margin-top: 0px; + } + + .CsText { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; + width: 100%; + } +} + +.bento05 { + width: 25.9375rem; + height: 29.625rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: var(--darkColor); + background-size: cover; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .bentoText { + margin: 0; + display: flex; + flex-direction: column; + gap: 30px; + + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + flex-direction: column; + } + + p { + color: var(--subColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + } + + span { + color: var(--subColor); + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.4rem */ + text-transform: uppercase; + } + } +} + +.bentoColumn { + display: flex; + flex-direction: column; + gap: 20px; +} + +.bento06 { + width: 25.9375rem; + height: 14rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: #85e3bc; + background-size: cover; + background-position-x: center; + + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + + .bentoText { + margin-bottom: 20px; + display: flex; + gap: 30px; + + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + flex-direction: column; + } + + h3 { + color: var(--darkColor); + font-family: var(--headerFont); + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 160%; /* 2.4rem */ + width: 70%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + + p { + color: var(--darkColor); + font-family: var(--paraFont); + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.225rem */ + } + } +} + +.bento07 { + width: 65.625rem; + height: 18.875rem; + border-radius: 1.25rem; + background: url('/img/site/case-study-main-02.png'); + background-size: cover; + background-position-x: center; + + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-around; + + .bentoText { + margin: 0; + display: flex; + gap: 30px; + + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + flex-direction: column; + } + + .innerText { + display: flex; + flex-direction: column; + align-items: flex-start; + + .subscribe { + display: flex; + gap: 10px; + margin: 20px 0px; + align-items: center; + + input[type='checkbox'] { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + width: 20px; + height: 20px; + border: 2px solid #333; + border-radius: 50%; + background-color: var(--darkColor); + cursor: pointer; + position: relative; + + &:checked { + background-color: #b9c8de; + } + + &:checked::before { + content: ''; + position: absolute; + top: 4px; + left: 4px; + width: 10px; + height: 10px; + background-color: #fff; + border-radius: 50%; + } + } + } + } + + span, + label { + color: #b9c8de; + font-family: var(--paraFont); + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + + h3 { + color: #61bd73; + font-family: var(--headerFont); + font-size: 2rem; + font-style: normal; + font-weight: 600; + line-height: 140%; /* 2.8rem */ + width: 70%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + } +} + +/* Responsive adjustments */ +@media (max-width: 1300px) { + .bento01, + .bento04 { + width: 33rem; + } + .bento02, + .bento03 { + width: 22rem; + } + .box, + .bento05, + .bento06 { + width: 56rem; + } +} + +/* Responsive adjustments */ +@media (max-width: 1100px) { + .bento01, + .bento04 { + width: 30rem; + } + .bento02, + .bento03 { + width: 20rem; + } + .box, + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 960px) { + .bento01, + .bento04 { + width: 27rem; + } + .bento02, + .bento03 { + width: 23rem; + } + .bento05, + .bento06 { + width: 100%; + height: auto; + } +} + +@media (max-width: 940px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02, + .bento03 { + width: 24rem; + height: 33.9375rem; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 880px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02 { + width: 100%; + height: 24.875rem; + } + .bento03 { + width: 100%; + } + .bento05, + .bento06 { + width: 100%; + } +} +@media (max-width: 795px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02 { + width: 100%; + height: 24.875rem; + } + .bento03 { + width: 100%; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 600px) { + .bento01, + .bento02, + .bento03, + .bento04, + .bento05, + .bento06 { + width: 100%; /* Full width when stacked */ + } +} + +.buttons { + position: absolute; + bottom: 20px; + display: flex; + right: 20px; + + .arrowButton { + background: url('/img/site/ArrowButton.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 3.6875rem; + height: 3.6875rem; + flex-shrink: 0; + transition: all 0.3s ease-in-out; + } + + .arrowButton:hover { + transform: scale(1.1); + } +} + +.buttonContainer { + display: flex; + gap: 20px; + flex-wrap: wrap; + + .buttonSmall { + width: 10.0625rem; + height: 2.5rem; + flex-shrink: 0; + border-radius: 3.125rem; + border: 1px solid #ecf4f8; + background: #ecf4f8; + display: flex; + justify-content: center; + align-items: center; + color: var(--darkColor); + text-align: center; + font-family: var(--paraFont); + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + } + + .buttonDark { + color: #f7f9fd; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + background: var(--darkColor); + } + + .buttonLight { + color: var(--darkColor); + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + border: 1px solid var(--darkColor); + background: #f7f9fd; + } +} + +iframe { + margin: 0; + border-radius: 0px !important; + background-color: transparent; + width: 450px; +} diff --git a/src/components/CaseStudies/V2/Stories/index.jsx b/src/components/CaseStudies/V2/Stories/index.jsx new file mode 100644 index 0000000000..7ce73ddc47 --- /dev/null +++ b/src/components/CaseStudies/V2/Stories/index.jsx @@ -0,0 +1,56 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function Main() { + return ( +
+
+
+

More stories for you

+
+ +
+
+
+
+

Building an AI-Powered Shopping Copilot with Weaviate

+
+
+ +
+
+ +
+
+
+

Transforming Customer Service with Generative AI

+
+
+ +
+
+
+
+
+

Turning Unstructured Data into Insights

+
+
+ +
+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/V2/Stories/styles.module.scss b/src/components/CaseStudies/V2/Stories/styles.module.scss new file mode 100644 index 0000000000..d4d06a1543 --- /dev/null +++ b/src/components/CaseStudies/V2/Stories/styles.module.scss @@ -0,0 +1,385 @@ +.container { + padding: 3rem; + + @media screen and (max-width: 1400px) { + padding: 2rem 3rem; + } +} + +.box { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + margin-bottom: 40px; + + h2 { + color: #130c49; + text-align: center; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 2.8rem */ + width: 55%; + + @media screen and (max-width: 900px) { + width: 100%; + } + } +} + +.bentoGrid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 20px; +} + +.bento01, +.bento02, +.bento03, +.bento04, +.bento05, +.bento06 { + flex-shrink: 1; +} + +.bento01 { + width: 20.875rem; + height: 26.5235rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0) 0%, + rgba(47, 47, 169, 0.8) 100% + ), + url('/img/site/instabase-bg-image.png'); + background-size: cover; + background-position: center; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-between; + transition: all 0.3s ease-in-out; + + .bentoText { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 20px; + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/instabase-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 12rem; /* Fixed width for uniform logo size */ + height: 2.5rem; + flex-shrink: 0; + margin: 30px 0px; + } + + h3 { + color: #f7f9fd; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + } + + p { + color: #f7f9fd; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 150%; /* 1.3125rem */ + } + } +} + +.bento02 { + width: 20.875rem; + height: 26.5235rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: #f7f9fd; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0) 0%, + rgba(47, 47, 169, 0.8) 100% + ), + url('/img/site/neople-background-image.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-y: bottom; + background-position-x: right; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-between; + transition: all 0.3s ease-in-out; + + .bentoText { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 20px; + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/neople-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + margin: 30px 0px; + width: 12rem; /* Fixed width for uniform logo size */ + height: 2.5rem; + flex-shrink: 0; + } + + h3 { + color: #f7f9fd; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + } + } +} + +.bento03 { + width: 20.875rem; + height: 26.5235rem; + flex-shrink: 0; + border-radius: 1.25rem; + + background: linear-gradient( + 180deg, + rgba(247, 249, 253, 0) 0%, + rgba(46, 40, 139, 0.8) 100% + ), + url('/img/site/moonsift-background-image.png'); + background-size: contain; + background-position-y: bottom; + background-repeat: no-repeat; + transition: all 0.3s ease-in-out; + position: relative; + padding: 40px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .bentoText { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 20px; + margin: 0; + @media screen and (max-width: 900px) { + margin: 0px 0px 20px; + } + .bentoLogo { + background: url('/img/site/moonsift-cs.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 12rem; /* Fixed width for uniform logo size */ + height: 2.5rem; + flex-shrink: 0; + margin: 30px 0px; + } + + h3 { + color: #f7f9fd; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + } + } +} + +/* Responsive adjustments */ +@media (max-width: 1300px) { + .bento01, + .bento04 { + width: 33rem; + } + .bento02, + .bento03 { + width: 22rem; + } + .bento05, + .bento06 { + width: 56rem; + } +} + +/* Responsive adjustments */ +@media (max-width: 1100px) { + .bento01, + .bento04 { + width: 30rem; + } + .bento02, + .bento03 { + width: 20rem; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 960px) { + .bento01, + .bento04 { + width: 27rem; + } + .bento02, + .bento03 { + width: 23rem; + } + .bento05, + .bento06 { + width: 100%; + height: auto; + } +} + +@media (max-width: 940px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02, + .bento03 { + width: 24rem; + height: 33.9375rem; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 880px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02 { + width: 100%; + height: 24.875rem; + } + .bento03 { + width: 100%; + } + .bento05, + .bento06 { + width: 100%; + } +} +@media (max-width: 795px) { + .bento01, + .bento04 { + width: 100%; + } + .bento02 { + width: 100%; + height: 24.875rem; + } + .bento03 { + width: 100%; + } + .bento05, + .bento06 { + width: 100%; + } +} + +@media (max-width: 600px) { + .bento01, + .bento02, + .bento03, + .bento04, + .bento05, + .bento06 { + width: 100%; /* Full width when stacked */ + } +} + +.buttons { + position: absolute; + bottom: 20px; + display: flex; + right: 20px; + + .arrowButton { + background: url('/img/site/ArrowButton.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 3.6875rem; + height: 3.6875rem; + flex-shrink: 0; + transition: all 0.3s ease-in-out; + } + + .arrowButton:hover { + transform: scale(1.1); + } +} + +.buttonContainer { + display: flex; + gap: 20px; + flex-wrap: wrap; + + .buttonDark { + color: #f7f9fd; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + background: #130c49; + } + + .buttonLight { + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; /* 1.57331rem */ + display: flex; + width: 11.3125rem; + height: 2.75rem; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f7f9fd; + } +} diff --git a/src/components/CaseStudies/V2/Study/index.jsx b/src/components/CaseStudies/V2/Study/index.jsx new file mode 100644 index 0000000000..1021b91910 --- /dev/null +++ b/src/components/CaseStudies/V2/Study/index.jsx @@ -0,0 +1,185 @@ +import React from 'react'; +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +export default function Study() { + return ( +
+
+
+
+

The AI Application Platform for Unstructured Data

+

+ Instabase is an enterprise-grade AI Application Platform that + turns unstructured data into insights, instantly. They solve one + of the most acute problems businesses face – slow or inaccurate + decisioning due to unstructured data. Their engineering team was + looking for a database that would allow them to deliver data + insights to their users with a high degree of accuracy and rapid + performance. They chose Weaviate because of the flexibility that a + leading open-source tool gave them while hitting Instabase’s + critical performance metrics better than any other database they + tested. Built-in features like hybrid search and distance metrics, + as well as support from an engaged developer community, made + Weaviate the clear choice for Instabase. +

+

Challenge

+

+ Instabase processes over 500K highly varied documents per day and + needs to scale to the ever-growing demand of their customers. They + needed a database solution that would allow them to index, store, + and retrieve massive volumes of data while delivering results with + an incredibly high level of accuracy to their users. “Accuracy + determines the amount of savings any large institution can get,” + said Shaunak Godbole, Head of Infrastructure Engineering at + Instabase. “If the results aren’t accurate or take too long to + surface, a human needs to get involved, and the cost savings goes + away. So accuracy and speed are critical for us.”  Additionally, + Instabase needed to support customers in highly regulated + environments. European customers needed to ensure their data + didn’t leave certain countries, while financial institutions + didn’t want their data to leave their on-premises servers. They + needed a database solution that could be deployed anywhere while + maintaining a high level of performance. If accuracy, speed, and + flexible deployment criteria were not met, Instabase would not be + able to reduce the need for human intervention in complex data + workflows for their customers. +

+ +

Why Instabase Chose Weaviate

+

+ Instabase wants to empower their customers to focus on making fast + and accurate decisions. They achieve this by classifying, + extracting, and validating information from highly unstructured + data. “The collaboration with Weaviate’s team, the community, and + the results of our performance tests made Weaviate an easy + choice,” notes Godbole. “In terms of performance, nobody needed + convincing – the benchmarks spoke for themselves.” +

+

Weaviate checked all of Instabase’s boxes:

+
    +
  • + Powerful performance: Instabase had their own + benchmarks for the use cases they knew they had to solve really, + really well. These benchmarks focus on retrieval accuracy and + latency, and the queries are complex aggregation and composition + where both dense and sparse searches are required. Each use case + had different benchmarks, and Weaviate was a clear winner with + high retrieval accuracy and low latency for vector search. Once + the benchmarking team was convinced Weaviate was up for the + challenge, teams across the organization worked together to + bring Weaviate into production. +
  • +
  • + High adaptability: By using an AI-native + open-source vector database, Instabase could meet their + customers wherever they operated, whether in the cloud or + on-prem. This allowed for maximum flexibility to fulfill the + strict deployment needs of organizations in highly regulated + regions and industries. +
  • +
  • + Modular architecture: Instead of having to + build out their own capabilities, Instabase developers saved + time by using Weaviate’s out of the box features like hybrid + search and distance metrics, as well as easy integrations with + popular large language models (LLMs). +
  • +
  • + Strong support: Weaviate has cultivated an + engaged, open source community with over 6M downloads and tens + of thousands of organizations using the platform. Over 5K + developers have direct access to the experts and comprehensive + documentation they need to quickly problem solve as they build + their applications. In addition, Weaviate’s core team was very + collaborative with Instabase and was able to provide short, + medium and long-term solutions to existing and anticipated + challenges. +
  • +
+ +

+ + “Accuracy determines the amount of savings any large institution + can get. If the results aren’t accurate or take too long to + surface, a human needs to get involved, and the cost savings are + greatly reduced. So accuracy and speed are critical for us.” + +

+

+ Shaunak Godbole, Head of Infrastructure Engineering at Instabase +

+
+
+
+
+

Rapid performance

+

+ Instabase is able to store 50K+ tenants in the Weaviate cluster + and query data from specific tenants within milliseconds. +

+

Scales to unlimited document size

+

+  Instabase has seen the same impressive results whether customers + engage with single-page handwritten notes, 200 pages of + documentation, or 400 pages of financial filings. +

+

450+ data types supported

+

+ With Weaviate, Instabase was able to support the ingestion and + indexing of 450+ data types for a single customer solution. +

+
+
+
+ +

+ Instabase helps + organizations across large enterprises, mid-market companies, and + the federal government solve mission-critical automation problems + and obtain insights from unstructured data. Their platform, called + AI Hub, enables customers to obtain instant insights in Converse + mode. When in Build mode, they can extract data from any content, + classify, clean it up and embed the newly structured data + downstream into existing systems. These automations enable + customers to quickly and accurately make vital business decisions + for complex processes like mortgage underwriting, driver’s license + verification, or insurance broker submissions. Instabase’s + customers include the world’s largest financial institutions, + insurance companies, transportation, retail, and public sector + organizations. +

+

Why AWS

+

+ In 2017, the engineers at Instabase made the choice to build + entirely on Kubernetes. They have several microservices that run + on top of that and are deeply integrated with the{' '} + + AWS ecosystem + + , making use of products including AWS EC2, ECS, EKS, ELB, S3, + ElastiCache, CDN, and Shield. AWS allows Instabase to build a + highly-available, secure, scalable, and performant platform to + support even their largest customers. +

+

About Weaviate

+

+ Vector databases are becoming core to the AI tech stack because + they can handle a very large amount of unstructured data in an + efficient way. Weaviate is an AI-native vector database available + on the AWS marketplace that can scale to handle billions of + vectors and millions of tenants. Customers and community members + use Weaviate to power large-scale search and generative AI + applications like chatbots and agents. Weaviate’s extensible + architecture offers easy pluggability with the AI ecosystem, + empowering developers of all levels to build and iterate faster. + And flexible deployment options let teams abstract the burden of + hosting and managing their database, while still meeting + enterprise requirements for security and compliance. +

+
+
+
+
+ ); +} diff --git a/src/components/CaseStudies/V2/Study/styles.module.scss b/src/components/CaseStudies/V2/Study/styles.module.scss new file mode 100644 index 0000000000..3e8a24712b --- /dev/null +++ b/src/components/CaseStudies/V2/Study/styles.module.scss @@ -0,0 +1,153 @@ +.studyContainer { + padding: 2.5rem; + display: flex; + flex-direction: row; + justify-content: space-around; + padding: 2.5rem; + column-gap: 10px; + max-width: 1500px; + margin: auto; + + @media screen and (max-width: 900px) { + flex-direction: column; + align-items: center; + gap: 30px; + } +} + +.bgColor { + background: #ededed; +} + +.leftContainer { + width: 40%; + min-width: 360px; + + @media screen and (max-width: 900px) { + width: 100%; + } + + h2 { + margin: 20px 0px; + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 2.1rem */ + } + + p { + margin: 20px 0px; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + + .quote { + color: #130c49; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.76994rem */ + } +} + +.rightContainer { + display: flex; + flex-direction: column; + gap: 60px; + + .topSection { + width: 28.625rem; + height: 30rem; + flex-shrink: 0; + border-radius: 0.9375rem; + background: #130c49; + padding: 30px; + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + } + + h2 { + margin: 20px 0px; + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + margin: 20px 0px; + color: #fff; + font-family: Inter; + font-size: 0.9375rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.3125rem */ + } + } + + .bottomSection { + border-radius: 0.9375rem; + background: #f5f5f5; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + width: 28.625rem; + height: 79.4375rem; + flex-shrink: 0; + padding: 30px; + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + } + + .logo { + background-image: url('/img/site/study-instabase-dark.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 13.8125rem; + height: 1.47194rem; + + flex-shrink: 0; + } + + h2 { + margin: 20px 0px; + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 2.35994rem */ + } + + p { + margin: 20px 0px; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + a { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + text-decoration-line: underline; + } + } +} diff --git a/src/components/CommandMenu/cmdk.css b/src/components/CommandMenu/cmdk.css index 19ca3799ed..6f16f1d56a 100644 --- a/src/components/CommandMenu/cmdk.css +++ b/src/components/CommandMenu/cmdk.css @@ -1,67 +1,721 @@ -.command-palette{position:relative;z-index:10}.command-palette *{padding:0;margin:0;box-sizing:border-box;border:0 solid}.command-palette .command-palette-content{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;margin:0;line-height:inherit}.command-palette :after,.command-palette :before{box-sizing:border-box;border:0 solid;--tw-content:""}.command-palette hr{height:0;color:inherit;border-top-width:1px}.command-palette abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.command-palette h1,.command-palette h2,.command-palette h3,.command-palette h4,.command-palette h5,.command-palette h6{font-size:inherit;font-weight:inherit}.command-palette a{color:inherit;text-decoration:inherit}.command-palette b,.command-palette strong{font-weight:bolder}.command-palette code,.command-palette kbd,.command-palette pre,.command-palette samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.command-palette small{font-size:80%}.command-palette sub,.command-palette sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.command-palette sub{bottom:-.25em}.command-palette sup{top:-.5em}.command-palette table{text-indent:0;border-color:inherit;border-collapse:collapse}.command-palette button,.command-palette input,.command-palette optgroup,.command-palette select,.command-palette textarea{font-family:inherit;font-size:100%;line-height:inherit;color:inherit;margin:0;padding:0}.command-palette button,.command-palette select{text-transform:none}.command-palette [type=button],.command-palette [type=reset],.command-palette [type=submit],.command-palette button{-webkit-appearance:button;background-color:initial;background-image:none}.command-palette :-moz-focusring{outline:auto}.command-palette :-moz-ui-invalid{box-shadow:none}.command-palette progress{vertical-align:initial}.command-palette ::-webkit-inner-spin-button,.command-palette ::-webkit-outer-spin-button{height:auto}.command-palette [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.command-palette ::-webkit-search-decoration{-webkit-appearance:none}.command-palette ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.command-palette summary{display:list-item}.command-palette blockquote,.command-palette dd,.command-palette dl,.command-palette figure,.command-palette h1,.command-palette h2,.command-palette h3,.command-palette h4,.command-palette h5,.command-palette h6,.command-palette hr,.command-palette p,.command-palette pre{margin:0}.command-palette fieldset{margin:0;padding:0}.command-palette legend{padding:0}.command-palette menu,.command-palette ol,.command-palette ul{list-style:none;margin:0;padding:0}.command-palette textarea{resize:vertical}.command-palette input::-moz-placeholder,.command-palette textarea::-moz-placeholder{opacity:1;color:#9ca3af}.command-palette input::placeholder,.command-palette textarea::placeholder{opacity:1;color:#9ca3af}.command-palette [role=button],.command-palette button{cursor:pointer}.command-palette :disabled{cursor:default}.command-palette audio,.command-palette canvas,.command-palette embed,.command-palette iframe,.command-palette img,.command-palette object,.command-palette svg,.command-palette video{display:block;vertical-align:middle}.command-palette img,.command-palette video{max-width:100%;height:auto}.command-palette [hidden]{display:none}.command-palette *,.command-palette :after,.command-palette :before{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);--tw-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.command-palette .pointer-events-none{pointer-events:none}.command-palette .fixed{position:fixed}.command-palette .absolute{position:absolute}.command-palette .relative{position:relative}.command-palette .inset-0{top:0;right:0;bottom:0;left:0}.command-palette .right-3{right:.75rem}.command-palette .top-1\/2{top:50%}.command-palette .mt-1{margin-top:.25rem}.command-palette .block{display:block}.command-palette .flex{display:flex}.command-palette .h-\[450px\]{height:450px}.command-palette .h-5{height:1.25rem}.command-palette .max-h-full{max-height:100%}.command-palette .w-full{width:100%}.command-palette .w-5{width:1.25rem}.command-palette .w-4{width:1rem}.command-palette .max-w-xl{max-width:36rem}.command-palette .max-w-md{max-width:28rem}.command-palette .max-w-xs{max-width:20rem}.command-palette .flex-1{flex:1 1 0%}.command-palette .-translate-y-1\/2{--tw-translate-y:-50%}.command-palette .-translate-y-1\/2,.command-palette .scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.command-palette .scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.command-palette .scale-100{--tw-scale-x:1;--tw-scale-y:1}.command-palette .scale-100,.command-palette .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.command-palette .cursor-default{cursor:default}.command-palette .cursor-pointer{cursor:pointer}.command-palette .flex-col{flex-direction:column}.command-palette .items-start{align-items:flex-start}.command-palette .items-center{align-items:center}.command-palette .justify-center{justify-content:center}.command-palette .justify-between{justify-content:space-between}.command-palette .space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.command-palette .space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.command-palette .space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.command-palette .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.command-palette .space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.command-palette .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.command-palette .divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.command-palette .overflow-hidden{overflow:hidden}.command-palette .overflow-y-auto{overflow-y:auto}.command-palette .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.command-palette .rounded-lg{border-radius:.5rem}.command-palette .rounded-md{border-radius:.375rem}.command-palette .border-t{border-top-width:1px}.command-palette .border-b{border-bottom-width:1px}.command-palette .border-none{border-style:none}.command-palette .border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.command-palette .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.command-palette .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.command-palette .bg-gray-200\/50{background-color:rgba(229,231,235,.5)}.command-palette .bg-transparent{background-color:initial}.command-palette .bg-opacity-80{--tw-bg-opacity:0.8}.command-palette .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.command-palette .from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-to:rgba(49,46,129,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.command-palette .via-indigo-800{--tw-gradient-to:rgba(55,48,163,0);--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to)}.command-palette .to-indigo-400{--tw-gradient-to:#818cf8}.command-palette .p-4{padding:1rem}.command-palette .p-2{padding:.5rem}.command-palette .px-3\.5{padding-left:.875rem;padding-right:.875rem}.command-palette .px-3{padding-left:.75rem;padding-right:.75rem}.command-palette .py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.command-palette .py-2{padding-top:.5rem;padding-bottom:.5rem}.command-palette .py-4{padding-top:1rem;padding-bottom:1rem}.command-palette .px-0{padding-left:0;padding-right:0}.command-palette .pl-3{padding-left:.75rem}.command-palette .text-left{text-align:left}.command-palette .text-sm{font-size:.875rem;line-height:1.25rem}.command-palette .text-lg{font-size:1.125rem;line-height:1.75rem}.command-palette .font-semibold{font-weight:600}.command-palette .font-medium{font-weight:500}.command-palette .leading-tight{line-height:1.25}.command-palette .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.command-palette .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.command-palette .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.command-palette .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.command-palette .text-white\/80{color:hsla(0,0%,100%,.8)}.command-palette .antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.command-palette .placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity))}.command-palette .placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity))}.command-palette .opacity-0{opacity:0}.command-palette .opacity-100{opacity:1}.command-palette .opacity-50{opacity:.5}.command-palette .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.command-palette .outline{outline-style:solid}.command-palette .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.command-palette .transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.command-palette .duration-300{transition-duration:.3s}.command-palette .duration-200{transition-duration:.2s}.command-palette .ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.command-palette .ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.command-palette .hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.command-palette .hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.command-palette .focus\:border-none:focus{border-style:none}.command-palette .focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.command-palette .focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.command-palette .focus\:ring-0:focus,.command-palette .focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.command-palette .focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.command-palette .focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}@media (prefers-color-scheme:dark){.command-palette .dark\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(31 41 55/var(--tw-divide-opacity))}.command-palette .dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.command-palette .dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.command-palette .dark\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.command-palette .dark\:text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.command-palette .dark\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.command-palette .dark\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}} - +.command-palette { + position: relative; + z-index: 10; +} +.command-palette * { + padding: 0; + margin: 0; + box-sizing: border-box; + border: 0 solid; +} +.command-palette .command-palette-content { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, + Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, + Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + margin: 0; + line-height: inherit; +} +.command-palette :after, +.command-palette :before { + box-sizing: border-box; + border: 0 solid; + --tw-content: ''; +} +.command-palette hr { + height: 0; + color: inherit; + border-top-width: 1px; +} +.command-palette abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +.command-palette h1, +.command-palette h2, +.command-palette h3, +.command-palette h4, +.command-palette h5, +.command-palette h6 { + font-size: inherit; + font-weight: inherit; +} +.command-palette a { + color: inherit; + text-decoration: inherit; +} +.command-palette b, +.command-palette strong { + font-weight: bolder; +} +.command-palette code, +.command-palette kbd, +.command-palette pre, +.command-palette samp { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + Liberation Mono, Courier New, monospace; + font-size: 1em; +} +.command-palette small { + font-size: 80%; +} +.command-palette sub, +.command-palette sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: initial; +} +.command-palette sub { + bottom: -0.25em; +} +.command-palette sup { + top: -0.5em; +} +.command-palette table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; +} +.command-palette button, +.command-palette input, +.command-palette optgroup, +.command-palette select, +.command-palette textarea { + font-family: inherit; + font-size: 100%; + line-height: inherit; + color: inherit; + margin: 0; + padding: 0; +} +.command-palette button, +.command-palette select { + text-transform: none; +} +.command-palette [type='button'], +.command-palette [type='reset'], +.command-palette [type='submit'], +.command-palette button { + -webkit-appearance: button; + background-color: initial; + background-image: none; +} +.command-palette :-moz-focusring { + outline: auto; +} +.command-palette :-moz-ui-invalid { + box-shadow: none; +} +.command-palette progress { + vertical-align: initial; +} +.command-palette ::-webkit-inner-spin-button, +.command-palette ::-webkit-outer-spin-button { + height: auto; +} +.command-palette [type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +.command-palette ::-webkit-search-decoration { + -webkit-appearance: none; +} +.command-palette ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +.command-palette summary { + display: list-item; +} +.command-palette blockquote, +.command-palette dd, +.command-palette dl, +.command-palette figure, +.command-palette h1, +.command-palette h2, +.command-palette h3, +.command-palette h4, +.command-palette h5, +.command-palette h6, +.command-palette hr, +.command-palette p, +.command-palette pre { + margin: 0; +} +.command-palette fieldset { + margin: 0; + padding: 0; +} +.command-palette legend { + padding: 0; +} +.command-palette menu, +.command-palette ol, +.command-palette ul { + list-style: none; + margin: 0; + padding: 0; +} +.command-palette textarea { + resize: vertical; +} +.command-palette input::-moz-placeholder, +.command-palette textarea::-moz-placeholder { + opacity: 1; + color: #9ca3af; +} +.command-palette input::placeholder, +.command-palette textarea::placeholder { + opacity: 1; + color: #9ca3af; +} +.command-palette [role='button'], +.command-palette button { + cursor: pointer; +} +.command-palette :disabled { + cursor: default; +} +.command-palette audio, +.command-palette canvas, +.command-palette embed, +.command-palette iframe, +.command-palette img, +.command-palette object, +.command-palette svg, +.command-palette video { + display: block; + vertical-align: middle; +} +.command-palette img, +.command-palette video { + max-width: 100%; + height: auto; +} +.command-palette [hidden] { + display: none; +} +.command-palette *, +.command-palette :after, +.command-palette :before { + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-transform: translateX(var(--tw-translate-x)) + translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) + skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) + scaleY(var(--tw-scale-y)); + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgba(59, 130, 246, 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: var(--tw-empty, /*!*/ /*!*/); + --tw-brightness: var(--tw-empty, /*!*/ /*!*/); + --tw-contrast: var(--tw-empty, /*!*/ /*!*/); + --tw-grayscale: var(--tw-empty, /*!*/ /*!*/); + --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/); + --tw-invert: var(--tw-empty, /*!*/ /*!*/); + --tw-saturate: var(--tw-empty, /*!*/ /*!*/); + --tw-sepia: var(--tw-empty, /*!*/ /*!*/); + --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/); + --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) + var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) + var(--tw-sepia) var(--tw-drop-shadow); +} +.command-palette .pointer-events-none { + pointer-events: none; +} +.command-palette .fixed { + position: fixed; +} +.command-palette .absolute { + position: absolute; +} +.command-palette .relative { + position: relative; +} +.command-palette .inset-0 { + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.command-palette .right-3 { + right: 0.75rem; +} +.command-palette .top-1\/2 { + top: 50%; +} +.command-palette .mt-1 { + margin-top: 0.25rem; +} +.command-palette .block { + display: block; +} +.command-palette .flex { + display: flex; +} +.command-palette .h-\[450px\] { + height: 450px; +} +.command-palette .h-5 { + height: 1.25rem; +} +.command-palette .max-h-full { + max-height: 100%; +} +.command-palette .w-full { + width: 100%; +} +.command-palette .w-5 { + width: 1.25rem; +} +.command-palette .w-4 { + width: 1rem; +} +.command-palette .max-w-xl { + max-width: 36rem; +} +.command-palette .max-w-md { + max-width: 28rem; +} +.command-palette .max-w-xs { + max-width: 20rem; +} +.command-palette .flex-1 { + flex: 1 1 0%; +} +.command-palette .-translate-y-1\/2 { + --tw-translate-y: -50%; +} +.command-palette .-translate-y-1\/2, +.command-palette .scale-95 { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.command-palette .scale-95 { + --tw-scale-x: 0.95; + --tw-scale-y: 0.95; +} +.command-palette .scale-100 { + --tw-scale-x: 1; + --tw-scale-y: 1; +} +.command-palette .scale-100, +.command-palette .transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.command-palette .cursor-default { + cursor: default; +} +.command-palette .cursor-pointer { + cursor: pointer; +} +.command-palette .flex-col { + flex-direction: column; +} +.command-palette .items-start { + align-items: flex-start; +} +.command-palette .items-center { + align-items: center; +} +.command-palette .justify-center { + justify-content: center; +} +.command-palette .justify-between { + justify-content: space-between; +} +.command-palette .space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * (1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} +.command-palette .space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * (1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} +.command-palette .space-x-2\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.625rem * var(--tw-space-x-reverse)); + margin-left: calc(0.625rem * (1 - var(--tw-space-x-reverse))); +} +.command-palette .space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * (1 - var(--tw-space-x-reverse))); +} +.command-palette .space-x-1\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.375rem * var(--tw-space-x-reverse)); + margin-left: calc(0.375rem * (1 - var(--tw-space-x-reverse))); +} +.command-palette .space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * (1 - var(--tw-space-x-reverse))); +} +.command-palette .divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * (1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} +.command-palette .overflow-hidden { + overflow: hidden; +} +.command-palette .overflow-y-auto { + overflow-y: auto; +} +.command-palette .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.command-palette .rounded-lg { + border-radius: 0.5rem; +} +.command-palette .rounded-md { + border-radius: 0.375rem; +} +.command-palette .border-t { + border-top-width: 1px; +} +.command-palette .border-b { + border-bottom-width: 1px; +} +.command-palette .border-none { + border-style: none; +} +.command-palette .border-indigo-500 { + --tw-border-opacity: 1; + border-color: rgb(99 102 241 / var(--tw-border-opacity)); +} +.command-palette .bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} +.command-palette .bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.command-palette .bg-gray-200\/50 { + background-color: rgba(229, 231, 235, 0.5); +} +.command-palette .bg-transparent { + background-color: initial; +} +.command-palette .bg-opacity-80 { + --tw-bg-opacity: 0.8; +} +.command-palette .bg-gradient-to-br { + background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); +} +.command-palette .from-indigo-900 { + --tw-gradient-from: #312e81; + --tw-gradient-to: rgba(49, 46, 129, 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.command-palette .via-indigo-800 { + --tw-gradient-to: rgba(55, 48, 163, 0); + --tw-gradient-stops: var(--tw-gradient-from), #3730a3, var(--tw-gradient-to); +} +.command-palette .to-indigo-400 { + --tw-gradient-to: #818cf8; +} +.command-palette .p-4 { + padding: 1rem; +} +.command-palette .p-2 { + padding: 0.5rem; +} +.command-palette .px-3\.5 { + padding-left: 0.875rem; + padding-right: 0.875rem; +} +.command-palette .px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} +.command-palette .py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} +.command-palette .py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.command-palette .py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.command-palette .px-0 { + padding-left: 0; + padding-right: 0; +} +.command-palette .pl-3 { + padding-left: 0.75rem; +} +.command-palette .text-left { + text-align: left; +} +.command-palette .text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} +.command-palette .text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} +.command-palette .font-semibold { + font-weight: 600; +} +.command-palette .font-medium { + font-weight: 500; +} +.command-palette .leading-tight { + line-height: 1.25; +} +.command-palette .text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} +.command-palette .text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} +.command-palette .text-gray-300 { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} +.command-palette .text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.command-palette .text-white\/80 { + color: hsla(0, 0%, 100%, 0.8); +} +.command-palette .antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.command-palette .placeholder-gray-500::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(107 114 128 / var(--tw-placeholder-opacity)); +} +.command-palette .placeholder-gray-500::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(107 114 128 / var(--tw-placeholder-opacity)); +} +.command-palette .opacity-0 { + opacity: 0; +} +.command-palette .opacity-100 { + opacity: 1; +} +.command-palette .opacity-50 { + opacity: 0.5; +} +.command-palette .shadow-lg { + --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -4px rgba(0, 0, 0, 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), + 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.command-palette .outline { + outline-style: solid; +} +.command-palette .filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) + var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) + var(--tw-sepia) var(--tw-drop-shadow); +} +.command-palette .transition { + transition-property: color, background-color, border-color, fill, stroke, + opacity, box-shadow, transform, filter, -webkit-text-decoration-color, + -webkit-backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, + backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, + backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.15s; +} +.command-palette .duration-300 { + transition-duration: 0.3s; +} +.command-palette .duration-200 { + transition-duration: 0.2s; +} +.command-palette .ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} +.command-palette .ease-in { + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} +.command-palette .hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} +.command-palette .hover\:text-gray-500:hover { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} +.command-palette .focus\:border-none:focus { + border-style: none; +} +.command-palette .focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} +.command-palette .focus\:ring-1:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 + calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); +} +.command-palette .focus\:ring-0:focus, +.command-palette .focus\:ring-1:focus { + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), + var(--tw-shadow, 0 0 #0000); +} +.command-palette .focus\:ring-0:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) + var(--tw-ring-color); +} +.command-palette .focus\:ring-gray-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); +} +@media (prefers-color-scheme: dark) { + .command-palette .dark\:divide-gray-800 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(31 41 55 / var(--tw-divide-opacity)); + } + .command-palette .dark\:bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); + } + .command-palette .dark\:bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); + } + .command-palette .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); + } + .command-palette .dark\:text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); + } + .command-palette .dark\:hover\:bg-gray-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); + } + .command-palette .dark\:hover\:text-gray-300:hover { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); + } +} .command-palette span { - color: rgb(255 255 255) !important + color: rgb(255 255 255) !important; } .command-palette h4 { - color: rgb(255 255 255) !important + color: rgb(255 255 255) !important; } .command-palette p { - color: rgb(255 255 255) !important + color: rgb(255 255 255) !important; } .command-palette svg { - color: rgb(255 255 255) !important + color: rgb(255 255 255) !important; } .command-palette svg { - fill: rgb(255 255 255) !important; - color: '#fff' + fill: rgb(255 255 255) !important; + color: '#fff'; } -[data-theme=light] .command-palette svg path { - fill: #fff; +[data-theme='light'] .command-palette svg path { + fill: #fff; } .logo { - background-image: url('../../../static/img/site/weaviate-nav-logo-dark.svg'); - width: 200px; - height: 4rem; - background-position: center center; - background-size: contain; - background-repeat: no-repeat; + background-image: url('../../../static/img/site/weaviate-nav-logo-dark.svg'); + width: 200px; + height: 4rem; + background-position: center center; + background-size: contain; + background-repeat: no-repeat; } .command-palette-list-item svg { - color: #fff !important; + color: #fff !important; } - @media (prefers-color-scheme: light) { - .command-palette span { - color: #2d3197 !important - } - - .command-palette h4 { - color: #2d3197 !important - } + .command-palette span { + color: #2d3197 !important; + } - .command-palette input { - color: #2d3197 !important - } + .command-palette h4 { + color: #2d3197 !important; + } - .command-palette p { - color: #2d3197 !important - } + .command-palette input { + color: #2d3197 !important; + } - .logo { - background-image: url('../../../static/img/site/weaviate-nav-logo-light.svg'); - } + .command-palette p { + color: #2d3197 !important; + } - .command-palette svg path { - fill: #2d3197 !important; + .logo { + background-image: url('../../../static/img/site/weaviate-nav-logo-light.svg'); + } + + .command-palette svg path { + fill: #2d3197 !important; + } +} + +@media (max-height: 600px) { + + .flex.w-full.h-\[450px\].items-start.justify-center.p-4 { + transform: translateY(50%); } - } \ No newline at end of file + +} + +@supports (-moz-appearance: none) { + .command-palette .modal-content { + max-height: calc(100vh - 50px); + } +} diff --git a/src/components/CommandMenu/query.js b/src/components/CommandMenu/query.js index dec4cd2872..da6512b0e6 100644 --- a/src/components/CommandMenu/query.js +++ b/src/components/CommandMenu/query.js @@ -10,7 +10,8 @@ export const runQuery = async (searchTerm, limit=10) => { PageChunk( hybrid: { query: \"${parsedSearchTerm}\" - alpha: 0.4 + properties: ["content", "pageTitle"] + alpha: 0.6 } limit: ${limit} ) diff --git a/src/components/Community/Demos/Highlights/index.jsx b/src/components/Community/Demos/Highlights/index.jsx index faca183a0a..02d9e24790 100644 --- a/src/components/Community/Demos/Highlights/index.jsx +++ b/src/components/Community/Demos/Highlights/index.jsx @@ -17,7 +17,7 @@ export default function Highlights() {
- 4900 + 6300
- 153 + 163
- 69 + 79
+ +
+
+
+ + 12 + + + + +

Wealingo

+ A personalized language-learning app + + Start Demo + +
+
+
+

+ A language-learning app built using Weaviate’s vector database + and Confluent Cloud, a fully managed streaming data service + based on Apache Kafka. See how real-time data{' '} + and vector embeddings enable personalized + learning by continuously adapting to user performance. +

+
+ + {' '} + Blogpost + + + + {' '} + GitHub + +
+
+
+
+
+ +
+
); diff --git a/src/components/Community/Demos/Projects/styles.module.scss b/src/components/Community/Demos/Projects/styles.module.scss index 843fb279ab..a9ee111575 100644 --- a/src/components/Community/Demos/Projects/styles.module.scss +++ b/src/components/Community/Demos/Projects/styles.module.scss @@ -25,8 +25,7 @@ flex-flow: wrap; align-items: flex-start; margin-bottom: 50px; - justify-content: space-between; - row-gap: 30px; + gap: 30px; } .heroGraphic { diff --git a/src/components/Contact/Header/index.jsx b/src/components/Contact/Header/index.jsx new file mode 100644 index 0000000000..d557acfdd3 --- /dev/null +++ b/src/components/Contact/Header/index.jsx @@ -0,0 +1,37 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; + +export default function ContactHeader() { + return ( +
+
+
+

Contact

+ +
+

+ We are here to help you with any questions you might have. +

Please contact us via the form below or join our + communities. +

+
+
+ + Join us + + + Subscribe for news + +
+
+
+
+ ); +} diff --git a/src/components/Contact/Header/styles.module.scss b/src/components/Contact/Header/styles.module.scss new file mode 100644 index 0000000000..9b9da2549a --- /dev/null +++ b/src/components/Contact/Header/styles.module.scss @@ -0,0 +1,92 @@ +.buttons { + margin-top: 30px; + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + a { + height: 45px; + width: 220px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.3125rem; + color: #ffffff; + background: #130c49; + width: 10.0625rem; + height: 2.625rem; + flex-shrink: 0; + font-weight: 600; + } + + .buttonOutline { + border-radius: 0.3125rem; + color: #130c49; + background: #fff; + width: 10.0625rem; + height: 2.625rem; + flex-shrink: 0; + font-weight: 600; + } +} + +p { + font-size: 1.2rem; + margin-bottom: 10px; +} +.box { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + margin: 40px 0px; + + h1 { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + margin-bottom: 1rem; + } + + .headerBox { + p { + color: #130c49; + } + } +} +.headerSecurity { + background: #f5f5f5; + background-image: url('/img/site/3d-pricing-banner.png'); + background-size: cover; + + @media screen and (max-width: 500px) { + background-image: url('/img/site/3d-pricing-banner.png'); + background-size: cover; + } +} + +.topText { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 120%; /* 1.5rem */ + text-transform: uppercase; + margin: 10px 0px; +} diff --git a/src/components/Documentation/BenchmarkGrid.js b/src/components/Documentation/BenchmarkGrid.js new file mode 100644 index 0000000000..5d9af17a13 --- /dev/null +++ b/src/components/Documentation/BenchmarkGrid.js @@ -0,0 +1,97 @@ +import React, { useState, useMemo } from 'react'; + +import { AgGridReact } from 'ag-grid-react'; // React Data Grid Component +import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the Data Grid +import "ag-grid-community/styles/ag-theme-quartz.css"; // Optional Theme applied to the Data Grid + +import { benchmarkData } from './benchmarkData'; + +const percenageFormatter = (params) => { + return params.value + "%" +} +const secFormatter = (params) => { + return params.value + "s" +} +const msecFormatter = (params) => { + return params.value + "ms" +} + +export default function BenchmarkGrid({ datasetLabel }) { + const data = benchmarkData[datasetLabel] + + // Row Data: The data to be displayed. + const [rowData, setRowData] = useState(data); + + const [colDefs, setColDefs] = useState([ + { + field: "efConstruction", + headerName: "efConstruction", + width: 155, + wrapHeaderText: true, + }, + { + field: "maxConnections", + headerName: "maxConnections", + width: 150, + wrapHeaderText: true, + }, + { + field: "ef", + headerName: "ef", + width: 75, + }, + { + field: "recall", + headerName: "Recall", + width: 100, + sortingOrder: ["desc", "asc", null], + valueFormatter: percenageFormatter, + }, + { + field: "qps", + headerName: "QPS", + width: 100, + sort: "desc", + sortingOrder: ["desc", "asc", null], + }, + { + field: "meanLatency", + headerName: "Mean Latency", + width: 125, + wrapHeaderText: true, + valueFormatter: msecFormatter, + }, + { + field: "p99Latency", + headerName: "p99 Latency", + width: 125, + wrapHeaderText: true, + valueFormatter: msecFormatter, + }, + { + field: "importTime", + headerName: "Import Time", + width: 125, + wrapHeaderText: true, + valueFormatter: secFormatter, + }, + ]); + + const sortingOrder = useMemo(() => { + return ["asc", "desc", null]; + }, []); + + return ( + // wrapping container with theme & size +
+ +
+ ) +} diff --git a/src/components/Documentation/FilteredTextBlock.js b/src/components/Documentation/FilteredTextBlock.js index 6f98ded825..ac0c92065d 100644 --- a/src/components/Documentation/FilteredTextBlock.js +++ b/src/components/Documentation/FilteredTextBlock.js @@ -1,66 +1,295 @@ import React from 'react'; import CodeBlock from '@theme/CodeBlock'; -const FilteredTextBlock = ({ text, startMarker, endMarker, language, includeStartMarker='false', title=''}) => { - // Filter out lines that are before the start marker, and lines with or after the end marker - includeStartMarker = includeStartMarker == 'true'; - const lines = text.split('\n'); - const universalStartMarker = 'START-ANY'; - const universalEndMarker = 'END-ANY'; - let withinMarkers = false; - let format; - switch (language) { - case "java": - // remove leading indent of 4 spaces - format = input => input.replace(/^ /, ''); - break - case 'goraw': - format = input => input - // replace remaining tabs with 2 spaces - .replace(/\t/g, " ") - break; - case 'gonew': - format = input => input - // replace remaining tabs with 2 spaces - .replace(/\t/g, " ") - .replace(/^ /g, ""); - break; - case "go": - format = input => input - // remove leading indent of 2 or 1 tabs - .replace(input.match(/^\t\t/) ? /^\t\t/ : /^\t/, '') - // replace remaining tabs with 2 spaces - .replace(/\t/, " ") - break; - default: - format = input => input; - } +// GitHub configuration - could be moved to a separate config file +const GITHUB_CONFIG = { + baseUrl: 'https://github.com/weaviate/weaviate-io', + branch: 'main', +}; + +const DOC_SYSTEMS = { + py: { + baseUrl: + 'https://weaviate-python-client.readthedocs.io/en/stable', + constructUrl: (baseUrl, ref) => `${baseUrl}/${ref}`, + icon: '/img/site/logo-py.svg', + }, + pyv3: { + baseUrl: + 'https://weaviate-python-client.readthedocs.io/en/v3.26.2', + constructUrl: (baseUrl, ref) => `${baseUrl}/${ref}`, + icon: '/img/site/logo-py.svg', + }, + ts: { + baseUrl: 'https://weaviate.github.io/typescript-client', + constructUrl: (baseUrl, ref) => `${baseUrl}/${ref}`, + icon: '/img/site/logo-ts.svg', + }, + go: { + baseUrl: + 'https://pkg.go.dev/github.com/weaviate/weaviate-go-client/v4/weaviate', + constructUrl: (baseUrl, ref) => `${baseUrl}#${ref}`, + icon: '/img/site/logo-go.svg', + }, + java: { + baseUrl: + 'https://javadoc.io/doc/io.weaviate/client/latest/', + constructUrl: (baseUrl, ref) => `${baseUrl}#${ref}`, + icon: '/img/site/logo-java.svg', + }, +}; + +DOC_SYSTEMS.python = DOC_SYSTEMS.py; +DOC_SYSTEMS.js = DOC_SYSTEMS.ts; +DOC_SYSTEMS.gonew = DOC_SYSTEMS.go; +DOC_SYSTEMS.goraw = DOC_SYSTEMS.go; +DOC_SYSTEMS.javaraw = DOC_SYSTEMS.java; + +// Custom styles for badges +const badgeStyles = { + badge: { + padding: '0.25rem 0.75rem', // Reduced vertical padding + marginRight: '0.5rem', // Space between badges + marginBottom: '0.5rem', // Space between rows when wrapped + }, + deprecated: { + backgroundColor: 'orange', + color: 'black', + }, +}; + +// Function to format the display label +const formatLabel = (ref) => { + const parts = ref.split('.'); + return '.' + parts[parts.length - 1]; +}; + +const FilteredTextBlock = ({ + text, + startMarker, + endMarker, + language, + includeStartMarker = 'false', + title = '', + path, + docRefs = [], +}) => { + // Filter out lines that are before the start marker, and lines with or after the end marker + includeStartMarker = includeStartMarker == 'true'; + const lines = text.split('\n'); + const universalStartMarker = 'START-ANY'; + const universalEndMarker = 'END-ANY'; + let withinMarkers = false; + let format; + switch (language) { + case 'java': + // remove leading indent of 4 spaces + format = (input) => input.replace(/^ /, ''); + break; + case 'goraw': + format = (input) => + input + // replace remaining tabs with 2 spaces + .replace(/\t/g, ' '); + break; + case 'gonew': + format = (input) => + input + // replace remaining tabs with 2 spaces + .replace(/\t/g, ' ') + .replace(/^ /g, ''); + break; + case 'go': + format = (input) => + input + // remove leading indent of 2 or 1 tabs + .replace(input.match(/^\t\t/) ? /^\t\t/ : /^\t/, '') + // replace remaining tabs with 2 spaces + .replace(/\t/, ' '); + break; + default: + format = (input) => input; + } + + const filteredLines = lines + .filter((line) => { + if ( + line.includes(startMarker) || + line.includes(universalStartMarker) + ) { + withinMarkers = true; + return includeStartMarker; + } + + if (line.includes(endMarker) || line.includes(universalEndMarker)) { + withinMarkers = false; + return false; + } - const filteredLines = lines - .filter((line) => { - if (line.includes(startMarker) || (line.includes(universalStartMarker))) { - withinMarkers = true; - return includeStartMarker; - } + return withinMarkers; + }) + .map(format) + .join('\n'); - if (line.includes(endMarker) || (line.includes(universalEndMarker))) { - withinMarkers = false; - return false; - } + let language2 = language; + switch (language2) { + case 'pyv3': + language2 = 'py'; + break; + case 'gonew': + case 'goraw': + language2 = 'go'; + break; + case 'javaraw': + language2 = 'java'; + break; + } - return withinMarkers; - }) - .map(format) - .join('\n'); + // Generate GitHub URL if path is provided + const githubUrl = path + ? `${GITHUB_CONFIG.baseUrl}/blob/${GITHUB_CONFIG.branch}/${path}` + : null; - let language2 = (language === 'gonew' | language === 'goraw') ? 'go' : language; + // Get doc system for this language + const docSystem = DOC_SYSTEMS[language]; + // Generate doc links with proper URLs and icons + const docLinks = Array.isArray(docRefs) + ? docRefs.map((ref) => ({ + label: formatLabel(ref), + url: docSystem?.constructUrl(docSystem.baseUrl, ref), + icon: docSystem?.icon, + })) + : []; - return ( - - {filteredLines} - - ); + return ( +
+ + {filteredLines} + +
+ {githubUrl && ( + + + +   View full example code + + + )} + {docSystem?.baseUrl && ( + + {docSystem.icon ? ( + {`${language} + ) : ( + + )} + +   API docs + + + )} + {language === 'pyv3' && ( + + + +   Deprecated (v3) + + + )} + {docLinks.map(({ label, url, icon }, index) => ( + + {icon ? ( + + ) : ( + + )} + +   {label} + + + ))} +
+
+ ); }; export default FilteredTextBlock; diff --git a/src/components/Documentation/Home/index.jsx b/src/components/Documentation/Home/index.jsx index 46d5274918..af70b0a8eb 100644 --- a/src/components/Documentation/Home/index.jsx +++ b/src/components/Documentation/Home/index.jsx @@ -168,7 +168,8 @@ const DocHomePage = () => {
- Work with text data + + Work with text data @@ -179,18 +180,19 @@ const DocHomePage = () => { Just{' '} populate Weaviate - - {' '}with your text data and start using powerful{' '} + {' '} + with your text data and start using powerful{' '} - vector, keyword and hybrid search capabilities - . + vector, keyword and hybrid search capabilities + + .

And use our integrations to{' '} build generative ai tools - - {' '}with your data. + {' '} + with your data.

@@ -203,25 +205,24 @@ const DocHomePage = () => { -

- Do you prefer to work with your own vectors? No problem. -

+

Do you prefer to work with your own vectors? No problem.

You can{' '} add your own vectors to Weaviate - - {' '}and still benefit from{' '} + {' '} + and still benefit from{' '} - all of its indexing and search capabilities. - . + all of its indexing and search capabilities. + + .

Our integrations to{' '} build generative ai tools - - {' '}work just as well with your data and vectors. + {' '} + work just as well with your data and vectors.

@@ -234,25 +235,24 @@ const DocHomePage = () => { -

- For many, data comes in multiple forms beyond text. -

+

For many, data comes in multiple forms beyond text.

Weaviate's multimodal modules{' '} can import text, audio and video and more - - {' '}as well as{' '} + {' '} + as well as{' '} perform multimodal searches - . + + .

Use these modules to{' '} build generative ai tools - - {' '}from your entire dataset. + {' '} + from your entire dataset.

@@ -271,7 +271,9 @@ const DocHomePage = () => { objects and vectors.

diff --git a/src/components/Documentation/benchmarkData.js b/src/components/Documentation/benchmarkData.js new file mode 100644 index 0000000000..d0ef868bcb --- /dev/null +++ b/src/components/Documentation/benchmarkData.js @@ -0,0 +1,466 @@ +export const benchmarkData = { + "sift128_10": [ + { "efConstruction": 128, "maxConnections": 16, "ef": 24, "recall": 85.81, "qps": 18347, "meanLatency": 0.86, "p99Latency": 1.49, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 80.32, "qps": 18142, "meanLatency": 0.87, "p99Latency": 1.53, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 86.94, "qps": 17633, "meanLatency": 0.89, "p99Latency": 1.61, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 79.29, "qps": 17393, "meanLatency": 0.91, "p99Latency": 3.95, "importTime": 55 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 80.43, "qps": 17366, "meanLatency": 0.91, "p99Latency": 4.00, "importTime": 129 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 86.46, "qps": 16743, "meanLatency": 0.94, "p99Latency": 1.74, "importTime": 106 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 86.74, "qps": 16437, "meanLatency": 0.96, "p99Latency": 3.80, "importTime": 91 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 84.28, "qps": 16318, "meanLatency": 0.96, "p99Latency": 2.98, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 92.28, "qps": 15791, "meanLatency": 1.00, "p99Latency": 1.73, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 89.68, "qps": 15642, "meanLatency": 1.00, "p99Latency": 4.03, "importTime": 55 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 92.98, "qps": 15515, "meanLatency": 1.02, "p99Latency": 1.77, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 90.53, "qps": 15400, "meanLatency": 1.02, "p99Latency": 3.94, "importTime": 129 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 87.02, "qps": 15393, "meanLatency": 1.02, "p99Latency": 3.94, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 90.45, "qps": 15385, "meanLatency": 1.02, "p99Latency": 4.04, "importTime": 91 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 89.92, "qps": 15289, "meanLatency": 1.03, "p99Latency": 4.06, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 94.51, "qps": 14888, "meanLatency": 1.06, "p99Latency": 1.83, "importTime": 91 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 91.68, "qps": 14415, "meanLatency": 1.09, "p99Latency": 3.94, "importTime": 106 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 93.84, "qps": 14207, "meanLatency": 1.11, "p99Latency": 4.11, "importTime": 55 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 95.95, "qps": 13761, "meanLatency": 1.14, "p99Latency": 2.04, "importTime": 55 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 94.60, "qps": 13738, "meanLatency": 1.15, "p99Latency": 3.59, "importTime": 129 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 95.07, "qps": 13700, "meanLatency": 1.15, "p99Latency": 3.97, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 94.63, "qps": 13632, "meanLatency": 1.16, "p99Latency": 4.05, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 96.54, "qps": 13181, "meanLatency": 1.20, "p99Latency": 2.07, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 96.10, "qps": 12817, "meanLatency": 1.23, "p99Latency": 2.66, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 97.27, "qps": 12566, "meanLatency": 1.26, "p99Latency": 2.33, "importTime": 106 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 96.45, "qps": 12565, "meanLatency": 1.26, "p99Latency": 3.54, "importTime": 91 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 97.52, "qps": 12136, "meanLatency": 1.30, "p99Latency": 2.34, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 97.56, "qps": 11985, "meanLatency": 1.32, "p99Latency": 3.88, "importTime": 162 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 64, "recall": 98.58, "qps": 11254, "meanLatency": 1.40, "p99Latency": 2.47, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 97.88, "qps": 10959, "meanLatency": 1.44, "p99Latency": 3.54, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 98.35, "qps": 10940, "meanLatency": 1.44, "p99Latency": 3.13, "importTime": 106 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 98.20, "qps": 10839, "meanLatency": 1.46, "p99Latency": 4.16, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 98.26, "qps": 10617, "meanLatency": 1.49, "p99Latency": 3.38, "importTime": 129 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 99.00, "qps": 9925, "meanLatency": 1.59, "p99Latency": 2.73, "importTime": 91 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 98.74, "qps": 9708, "meanLatency": 1.62, "p99Latency": 3.55, "importTime": 60 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 98.77, "qps": 9702, "meanLatency": 1.62, "p99Latency": 4.10, "importTime": 55 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 99.04, "qps": 9343, "meanLatency": 1.69, "p99Latency": 3.92, "importTime": 129 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 99.40, "qps": 9007, "meanLatency": 1.76, "p99Latency": 3.74, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 99.26, "qps": 8836, "meanLatency": 1.79, "p99Latency": 3.89, "importTime": 106 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 99.28, "qps": 8470, "meanLatency": 1.86, "p99Latency": 3.94, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 99.60, "qps": 7937, "meanLatency": 1.99, "p99Latency": 4.15, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 99.68, "qps": 7572, "meanLatency": 2.09, "p99Latency": 3.88, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 99.65, "qps": 6996, "meanLatency": 2.26, "p99Latency": 3.70, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 99.76, "qps": 6595, "meanLatency": 2.39, "p99Latency": 4.35, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 99.76, "qps": 6577, "meanLatency": 2.41, "p99Latency": 3.99, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 99.81, "qps": 5958, "meanLatency": 2.65, "p99Latency": 4.22, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 99.87, "qps": 5611, "meanLatency": 2.82, "p99Latency": 4.64, "importTime": 106 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 99.82, "qps": 5241, "meanLatency": 3.02, "p99Latency": 5.31, "importTime": 55 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 99.89, "qps": 5169, "meanLatency": 3.06, "p99Latency": 5.21, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 99.86, "qps": 5120, "meanLatency": 3.08, "p99Latency": 5.35, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 99.87, "qps": 4950, "meanLatency": 3.19, "p99Latency": 6.20, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 99.89, "qps": 4466, "meanLatency": 3.55, "p99Latency": 6.28, "importTime": 60 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 99.87, "qps": 4364, "meanLatency": 3.63, "p99Latency": 6.14, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 99.91, "qps": 4309, "meanLatency": 3.68, "p99Latency": 5.62, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 99.91, "qps": 4135, "meanLatency": 3.83, "p99Latency": 6.26, "importTime": 129 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 99.92, "qps": 4006, "meanLatency": 3.95, "p99Latency": 7.64, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 99.92, "qps": 3886, "meanLatency": 4.06, "p99Latency": 8.09, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 99.91, "qps": 3718, "meanLatency": 4.26, "p99Latency": 6.46, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 99.94, "qps": 3526, "meanLatency": 4.49, "p99Latency": 6.81, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 99.95, "qps": 3289, "meanLatency": 4.81, "p99Latency": 8.04, "importTime": 162 }, + ], + "sift128_100": [ + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 91.80, "qps": 5512, "meanLatency": 2.86, "p99Latency": 8.30, "importTime": 55 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 91.80, "qps": 5454, "meanLatency": 2.88, "p99Latency": 9.03, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 92.50, "qps": 5447, "meanLatency": 2.89, "p99Latency": 8.66, "importTime": 91 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 92.50, "qps": 5430, "meanLatency": 2.90, "p99Latency": 8.09, "importTime": 91 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 91.80, "qps": 5414, "meanLatency": 2.90, "p99Latency": 8.81, "importTime": 55 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 91.80, "qps": 5412, "meanLatency": 2.91, "p99Latency": 8.97, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 92.50, "qps": 5408, "meanLatency": 2.91, "p99Latency": 8.46, "importTime": 91 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 92.50, "qps": 5400, "meanLatency": 2.92, "p99Latency": 9.02, "importTime": 91 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 92.50, "qps": 5335, "meanLatency": 2.94, "p99Latency": 8.67, "importTime": 91 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 92.50, "qps": 5330, "meanLatency": 2.95, "p99Latency": 9.55, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 92.62, "qps": 5307, "meanLatency": 2.96, "p99Latency": 8.19, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 91.80, "qps": 5285, "meanLatency": 2.96, "p99Latency": 8.86, "importTime": 55 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 92.62, "qps": 5235, "meanLatency": 2.99, "p99Latency": 8.31, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 94.67, "qps": 5235, "meanLatency": 2.99, "p99Latency": 8.97, "importTime": 60 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 94.67, "qps": 5229, "meanLatency": 3.00, "p99Latency": 8.13, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 92.62, "qps": 5210, "meanLatency": 3.02, "p99Latency": 9.57, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 94.67, "qps": 5202, "meanLatency": 3.02, "p99Latency": 8.54, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 92.62, "qps": 5190, "meanLatency": 3.02, "p99Latency": 11.44, "importTime": 129 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 92.62, "qps": 5170, "meanLatency": 3.04, "p99Latency": 9.33, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 94.67, "qps": 5159, "meanLatency": 3.05, "p99Latency": 9.48, "importTime": 60 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 94.67, "qps": 5139, "meanLatency": 3.02, "p99Latency": 8.07, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 92.62, "qps": 5105, "meanLatency": 3.07, "p99Latency": 9.23, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 94.39, "qps": 5098, "meanLatency": 3.07, "p99Latency": 8.97, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 96.15, "qps": 5097, "meanLatency": 3.08, "p99Latency": 8.00, "importTime": 106 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 96.15, "qps": 5091, "meanLatency": 3.09, "p99Latency": 8.05, "importTime": 106 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 96.15, "qps": 5084, "meanLatency": 3.09, "p99Latency": 8.55, "importTime": 106 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 96.15, "qps": 5069, "meanLatency": 3.10, "p99Latency": 8.31, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 64, "recall": 96.58, "qps": 5043, "meanLatency": 3.12, "p99Latency": 8.79, "importTime": 162 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 96.58, "qps": 5042, "meanLatency": 3.11, "p99Latency": 8.34, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 96.15, "qps": 5034, "meanLatency": 3.13, "p99Latency": 8.74, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 96.58, "qps": 5029, "meanLatency": 3.13, "p99Latency": 8.43, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 24, "recall": 91.80, "qps": 5023, "meanLatency": 3.12, "p99Latency": 10.50, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 95.00, "qps": 5020, "meanLatency": 3.12, "p99Latency": 8.48, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 96.58, "qps": 4988, "meanLatency": 3.14, "p99Latency": 9.25, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 96.15, "qps": 4987, "meanLatency": 3.15, "p99Latency": 9.43, "importTime": 106 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 96.52, "qps": 4951, "meanLatency": 3.17, "p99Latency": 8.59, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 95.12, "qps": 4933, "meanLatency": 3.19, "p99Latency": 9.75, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 94.67, "qps": 4794, "meanLatency": 3.27, "p99Latency": 9.49, "importTime": 60 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 96.58, "qps": 4765, "meanLatency": 3.30, "p99Latency": 9.05, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 97.64, "qps": 4765, "meanLatency": 3.31, "p99Latency": 9.00, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 96.58, "qps": 4698, "meanLatency": 3.35, "p99Latency": 9.38, "importTime": 162 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 97.97, "qps": 4654, "meanLatency": 3.38, "p99Latency": 8.39, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 98.38, "qps": 4234, "meanLatency": 3.72, "p99Latency": 8.92, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 98.68, "qps": 4102, "meanLatency": 3.83, "p99Latency": 9.81, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 98.75, "qps": 4075, "meanLatency": 3.86, "p99Latency": 9.36, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 99.13, "qps": 3955, "meanLatency": 3.97, "p99Latency": 9.46, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 99.54, "qps": 3778, "meanLatency": 4.17, "p99Latency": 8.81, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 99.64, "qps": 3682, "meanLatency": 4.27, "p99Latency": 8.56, "importTime": 162 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 99.32, "qps": 3678, "meanLatency": 4.29, "p99Latency": 8.55, "importTime": 55 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 99.48, "qps": 3566, "meanLatency": 4.42, "p99Latency": 9.03, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 99.51, "qps": 3445, "meanLatency": 4.59, "p99Latency": 11.01, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 99.65, "qps": 3372, "meanLatency": 4.67, "p99Latency": 8.96, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 99.84, "qps": 3186, "meanLatency": 4.95, "p99Latency": 8.97, "importTime": 106 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 99.64, "qps": 3181, "meanLatency": 4.94, "p99Latency": 9.09, "importTime": 55 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 99.88, "qps": 3141, "meanLatency": 5.03, "p99Latency": 9.21, "importTime": 162 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 99.74, "qps": 3124, "meanLatency": 5.04, "p99Latency": 9.13, "importTime": 91 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 99.76, "qps": 3111, "meanLatency": 5.07, "p99Latency": 9.24, "importTime": 129 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 99.82, "qps": 2960, "meanLatency": 5.34, "p99Latency": 10.36, "importTime": 60 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 99.92, "qps": 2782, "meanLatency": 5.68, "p99Latency": 10.30, "importTime": 106 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 99.94, "qps": 2691, "meanLatency": 5.85, "p99Latency": 10.48, "importTime": 162 }, + ], + "dbpediaOpenai_10": [ + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 84.32, "qps": 12183, "meanLatency": 1.29, "p99Latency": 2.14, "importTime": 286 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 83.28, "qps": 11927, "meanLatency": 1.32, "p99Latency": 2.24, "importTime": 168 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 84.69, "qps": 11843, "meanLatency": 1.32, "p99Latency": 2.26, "importTime": 401 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 89.00, "qps": 10816, "meanLatency": 1.46, "p99Latency": 2.42, "importTime": 286 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 24, "recall": 88.08, "qps": 10540, "meanLatency": 1.50, "p99Latency": 2.56, "importTime": 168 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 89.18, "qps": 10486, "meanLatency": 1.50, "p99Latency": 2.65, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 88.55, "qps": 10426, "meanLatency": 1.51, "p99Latency": 2.67, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 89.72, "qps": 9801, "meanLatency": 1.60, "p99Latency": 2.65, "importTime": 439 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 91.56, "qps": 9563, "meanLatency": 1.65, "p99Latency": 2.83, "importTime": 286 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 92.25, "qps": 9167, "meanLatency": 1.72, "p99Latency": 2.89, "importTime": 216 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 91.74, "qps": 8902, "meanLatency": 1.77, "p99Latency": 4.21, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 90.65, "qps": 8796, "meanLatency": 1.79, "p99Latency": 4.06, "importTime": 168 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 89.92, "qps": 8734, "meanLatency": 1.81, "p99Latency": 5.44, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 93.42, "qps": 8024, "meanLatency": 1.97, "p99Latency": 4.07, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 94.26, "qps": 8011, "meanLatency": 1.97, "p99Latency": 3.34, "importTime": 216 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 94.49, "qps": 7912, "meanLatency": 1.99, "p99Latency": 3.30, "importTime": 401 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 93.64, "qps": 7894, "meanLatency": 1.99, "p99Latency": 3.23, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 94.36, "qps": 7831, "meanLatency": 2.02, "p99Latency": 3.95, "importTime": 286 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 95.18, "qps": 7434, "meanLatency": 2.12, "p99Latency": 3.58, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 93.57, "qps": 7279, "meanLatency": 2.17, "p99Latency": 4.97, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 95.02, "qps": 7061, "meanLatency": 2.23, "p99Latency": 3.63, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 95.75, "qps": 7004, "meanLatency": 2.26, "p99Latency": 3.77, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 95.46, "qps": 6910, "meanLatency": 2.28, "p99Latency": 3.76, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 95.94, "qps": 6907, "meanLatency": 2.28, "p99Latency": 3.81, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 96.24, "qps": 6613, "meanLatency": 2.38, "p99Latency": 4.14, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 97.07, "qps": 6072, "meanLatency": 2.59, "p99Latency": 4.30, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 96.51, "qps": 5672, "meanLatency": 2.77, "p99Latency": 4.51, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 97.24, "qps": 5639, "meanLatency": 2.80, "p99Latency": 4.43, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 97.34, "qps": 5577, "meanLatency": 2.82, "p99Latency": 4.51, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 97.40, "qps": 5457, "meanLatency": 2.89, "p99Latency": 4.73, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 97.14, "qps": 5277, "meanLatency": 2.98, "p99Latency": 5.73, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 97.96, "qps": 5141, "meanLatency": 3.07, "p99Latency": 5.04, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 97.32, "qps": 4794, "meanLatency": 3.30, "p99Latency": 5.16, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 97.97, "qps": 4720, "meanLatency": 3.35, "p99Latency": 5.34, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 64, "recall": 98.14, "qps": 4557, "meanLatency": 3.47, "p99Latency": 6.61, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 98.14, "qps": 4482, "meanLatency": 3.51, "p99Latency": 5.96, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 98.04, "qps": 4464, "meanLatency": 3.51, "p99Latency": 5.70, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 98.69, "qps": 4034, "meanLatency": 3.91, "p99Latency": 6.19, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 98.51, "qps": 3749, "meanLatency": 4.20, "p99Latency": 6.84, "importTime": 216 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 98.90, "qps": 3622, "meanLatency": 4.34, "p99Latency": 6.72, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 99.04, "qps": 3260, "meanLatency": 4.83, "p99Latency": 7.89, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 99.25, "qps": 3011, "meanLatency": 5.22, "p99Latency": 7.94, "importTime": 620 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 98.43, "qps": 2964, "meanLatency": 5.30, "p99Latency": 8.52, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 98.93, "qps": 2957, "meanLatency": 5.33, "p99Latency": 8.00, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 99.07, "qps": 2871, "meanLatency": 5.49, "p99Latency": 8.12, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 99.15, "qps": 2334, "meanLatency": 6.73, "p99Latency": 11.00, "importTime": 216 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 98.85, "qps": 2279, "meanLatency": 6.94, "p99Latency": 10.55, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 99.26, "qps": 2185, "meanLatency": 7.25, "p99Latency": 11.32, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 99.36, "qps": 2157, "meanLatency": 7.32, "p99Latency": 10.80, "importTime": 401 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 99.56, "qps": 2013, "meanLatency": 7.84, "p99Latency": 12.29, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 99.69, "qps": 1856, "meanLatency": 8.53, "p99Latency": 12.78, "importTime": 620 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 99.08, "qps": 1845, "meanLatency": 8.56, "p99Latency": 13.06, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 99.42, "qps": 1783, "meanLatency": 8.87, "p99Latency": 13.09, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 99.52, "qps": 1739, "meanLatency": 9.12, "p99Latency": 13.70, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 99.39, "qps": 1725, "meanLatency": 9.15, "p99Latency": 15.57, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 99.73, "qps": 1517, "meanLatency": 10.42, "p99Latency": 16.34, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 99.53, "qps": 1392, "meanLatency": 11.31, "p99Latency": 18.65, "importTime": 216 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 99.81, "qps": 1363, "meanLatency": 11.61, "p99Latency": 18.18, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 99.81, "qps": 1220, "meanLatency": 12.93, "p99Latency": 20.23, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 99.86, "qps": 969, "meanLatency": 16.10, "p99Latency": 40.21, "importTime": 620 }, + ], + "dbpediaOpenai_100": [ + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 92.40, "qps": 3579, "meanLatency": 4.40, "p99Latency": 7.14, "importTime": 286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 92.40, "qps": 3535, "meanLatency": 4.46, "p99Latency": 7.74, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 92.52, "qps": 3514, "meanLatency": 4.47, "p99Latency": 7.48, "importTime": 401 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 92.40, "qps": 3502, "meanLatency": 4.50, "p99Latency": 8.04, "importTime": 286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 92.40, "qps": 3490, "meanLatency": 4.52, "p99Latency": 8.25, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 92.52, "qps": 3479, "meanLatency": 4.54, "p99Latency": 7.56, "importTime": 401 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 92.52, "qps": 3458, "meanLatency": 4.57, "p99Latency": 9.22, "importTime": 401 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 92.52, "qps": 3454, "meanLatency": 4.57, "p99Latency": 8.05, "importTime": 401 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 92.52, "qps": 3426, "meanLatency": 4.61, "p99Latency": 8.29, "importTime": 401 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 92.40, "qps": 3412, "meanLatency": 4.62, "p99Latency": 9.81, "importTime": 286 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 91.82, "qps": 3391, "meanLatency": 4.65, "p99Latency": 8.40, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 91.82, "qps": 3329, "meanLatency": 4.74, "p99Latency": 9.07, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 91.82, "qps": 3295, "meanLatency": 4.75, "p99Latency": 9.04, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 24, "recall": 91.82, "qps": 3238, "meanLatency": 4.86, "p99Latency": 11.84, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 94.34, "qps": 3168, "meanLatency": 4.97, "p99Latency": 8.41, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 94.48, "qps": 3129, "meanLatency": 5.03, "p99Latency": 8.25, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 91.82, "qps": 3064, "meanLatency": 5.14, "p99Latency": 8.28, "importTime": 168 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 92.52, "qps": 2999, "meanLatency": 5.26, "p99Latency": 15.30, "importTime": 401 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 92.40, "qps": 2983, "meanLatency": 5.31, "p99Latency": 15.16, "importTime": 286 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 95.18, "qps": 2945, "meanLatency": 5.34, "p99Latency": 8.78, "importTime": 216 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 95.18, "qps": 2935, "meanLatency": 5.36, "p99Latency": 8.78, "importTime": 216 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 95.18, "qps": 2908, "meanLatency": 5.41, "p99Latency": 9.56, "importTime": 216 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 91.82, "qps": 2899, "meanLatency": 5.43, "p99Latency": 15.77, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 95.18, "qps": 2894, "meanLatency": 5.43, "p99Latency": 10.61, "importTime": 216 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 95.18, "qps": 2833, "meanLatency": 5.55, "p99Latency": 13.92, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 96.08, "qps": 2809, "meanLatency": 5.62, "p99Latency": 9.19, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 95.18, "qps": 2798, "meanLatency": 5.61, "p99Latency": 12.65, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 96.08, "qps": 2771, "meanLatency": 5.69, "p99Latency": 10.40, "importTime": 439 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 96.08, "qps": 2770, "meanLatency": 5.69, "p99Latency": 9.82, "importTime": 439 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 96.08, "qps": 2764, "meanLatency": 5.71, "p99Latency": 9.67, "importTime": 439 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 96.08, "qps": 2758, "meanLatency": 5.73, "p99Latency": 11.03, "importTime": 439 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 96.08, "qps": 2708, "meanLatency": 5.82, "p99Latency": 11.66, "importTime": 439 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 93.79, "qps": 2651, "meanLatency": 5.33, "p99Latency": 8.10, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 96.51, "qps": 2609, "meanLatency": 6.03, "p99Latency": 10.24, "importTime": 216 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 64, "recall": 96.27, "qps": 2599, "meanLatency": 6.06, "p99Latency": 10.23, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 96.27, "qps": 2593, "meanLatency": 6.09, "p99Latency": 10.03, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 96.27, "qps": 2561, "meanLatency": 6.16, "p99Latency": 10.85, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 96.27, "qps": 2545, "meanLatency": 6.18, "p99Latency": 12.80, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 97.29, "qps": 2479, "meanLatency": 6.35, "p99Latency": 9.94, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 97.50, "qps": 2327, "meanLatency": 6.79, "p99Latency": 10.77, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 97.62, "qps": 2297, "meanLatency": 6.89, "p99Latency": 10.73, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 97.78, "qps": 2236, "meanLatency": 7.07, "p99Latency": 11.42, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 97.13, "qps": 2184, "meanLatency": 7.23, "p99Latency": 12.76, "importTime": 168 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 98.56, "qps": 1856, "meanLatency": 8.51, "p99Latency": 13.92, "importTime": 216 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 98.60, "qps": 1796, "meanLatency": 8.79, "p99Latency": 13.99, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 98.71, "qps": 1785, "meanLatency": 8.84, "p99Latency": 13.76, "importTime": 401 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 98.17, "qps": 1769, "meanLatency": 8.91, "p99Latency": 15.82, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 99.08, "qps": 1670, "meanLatency": 9.45, "p99Latency": 15.47, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 99.22, "qps": 1562, "meanLatency": 10.10, "p99Latency": 16.11, "importTime": 620 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 98.68, "qps": 1508, "meanLatency": 10.48, "p99Latency": 17.79, "importTime": 168 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 99.04, "qps": 1502, "meanLatency": 10.51, "p99Latency": 16.31, "importTime": 286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 99.15, "qps": 1466, "meanLatency": 10.78, "p99Latency": 16.79, "importTime": 401 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 99.51, "qps": 1282, "meanLatency": 12.32, "p99Latency": 19.32, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 96.27, "qps": 1270, "meanLatency": 12.47, "p99Latency": 26.87, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 99.60, "qps": 1216, "meanLatency": 12.96, "p99Latency": 20.16, "importTime": 620 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 96.27, "qps": 1201, "meanLatency": 13.10, "p99Latency": 27.90, "importTime": 620 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 99.68, "qps": 1057, "meanLatency": 14.91, "p99Latency": 23.59, "importTime": 439 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 99.76, "qps": 1010, "meanLatency": 15.66, "p99Latency": 23.91, "importTime": 620 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 99.11, "qps": 960, "meanLatency": 16.35, "p99Latency": 43.94, "importTime": 216 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 99.36, "qps": 475, "meanLatency": 32.99, "p99Latency": 59.23, "importTime": 216 }, + ], + "msmarcoSnowflake_10":[ + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 85.01, "qps": 12634, "meanLatency": 1.25, "p99Latency": 2.39, "importTime": 1286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 87.78, "qps": 12186, "meanLatency": 1.30, "p99Latency": 2.30, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 91.24, "qps": 11332, "meanLatency": 1.40, "p99Latency": 2.44, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 91.90, "qps": 10934, "meanLatency": 1.45, "p99Latency": 2.53, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 91.04, "qps": 10844, "meanLatency": 1.46, "p99Latency": 2.71, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 91.44, "qps": 10708, "meanLatency": 1.48, "p99Latency": 2.60, "importTime": 1286 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 88.90, "qps": 10669, "meanLatency": 1.48, "p99Latency": 4.50, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 92.11, "qps": 10570, "meanLatency": 1.50, "p99Latency": 2.64, "importTime": 1450 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 93.58, "qps": 10216, "meanLatency": 1.55, "p99Latency": 2.71, "importTime": 3350 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 93.80, "qps": 9969, "meanLatency": 1.59, "p99Latency": 2.79, "importTime": 1450 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 93.08, "qps": 9819, "meanLatency": 1.60, "p99Latency": 3.62, "importTime": 2304 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 94.06, "qps": 9421, "meanLatency": 1.68, "p99Latency": 3.67, "importTime": 2907 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 95.50, "qps": 9201, "meanLatency": 1.72, "p99Latency": 2.99, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 91.55, "qps": 9142, "meanLatency": 1.74, "p99Latency": 4.54, "importTime": 3350 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 94.62, "qps": 9028, "meanLatency": 1.76, "p99Latency": 3.84, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 87.20, "qps": 8968, "meanLatency": 1.77, "p99Latency": 4.35, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 93.82, "qps": 8839, "meanLatency": 1.79, "p99Latency": 3.81, "importTime": 1286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 95.65, "qps": 8818, "meanLatency": 1.80, "p99Latency": 3.10, "importTime": 3350 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 95.97, "qps": 8786, "meanLatency": 1.81, "p99Latency": 3.12, "importTime": 4366 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 95.09, "qps": 8541, "meanLatency": 1.86, "p99Latency": 3.21, "importTime": 1286 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 95.59, "qps": 8165, "meanLatency": 1.94, "p99Latency": 3.81, "importTime": 1450 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 96.96, "qps": 7806, "meanLatency": 2.03, "p99Latency": 3.52, "importTime": 2907 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 96.54, "qps": 7497, "meanLatency": 2.12, "p99Latency": 3.70, "importTime": 1450 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 96.70, "qps": 7420, "meanLatency": 2.14, "p99Latency": 4.51, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 96.34, "qps": 7410, "meanLatency": 2.14, "p99Latency": 4.52, "importTime": 2304 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 97.36, "qps": 7363, "meanLatency": 2.15, "p99Latency": 3.69, "importTime": 4366 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 96.43, "qps": 7039, "meanLatency": 2.25, "p99Latency": 3.82, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 97.70, "qps": 6518, "meanLatency": 2.44, "p99Latency": 4.67, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 97.77, "qps": 6339, "meanLatency": 2.51, "p99Latency": 4.13, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 97.46, "qps": 6337, "meanLatency": 2.51, "p99Latency": 4.38, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 97.52, "qps": 6096, "meanLatency": 2.61, "p99Latency": 4.54, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 97.17, "qps": 5821, "meanLatency": 2.73, "p99Latency": 4.99, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 98.45, "qps": 5429, "meanLatency": 2.93, "p99Latency": 4.94, "importTime": 2907 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 98.05, "qps": 5240, "meanLatency": 3.03, "p99Latency": 6.03, "importTime": 2304 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 98.32, "qps": 5219, "meanLatency": 3.04, "p99Latency": 5.72, "importTime": 3350 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 98.71, "qps": 5060, "meanLatency": 3.14, "p99Latency": 5.20, "importTime": 4366 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 98.04, "qps": 5008, "meanLatency": 3.17, "p99Latency": 5.79, "importTime": 1450 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 98.82, "qps": 4522, "meanLatency": 3.51, "p99Latency": 5.98, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 99.04, "qps": 4234, "meanLatency": 3.76, "p99Latency": 6.18, "importTime": 4366 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 98.29, "qps": 3864, "meanLatency": 4.12, "p99Latency": 6.62, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 98.92, "qps": 3429, "meanLatency": 4.63, "p99Latency": 7.47, "importTime": 2304 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 99.13, "qps": 3367, "meanLatency": 4.72, "p99Latency": 7.34, "importTime": 3350 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 98.86, "qps": 3232, "meanLatency": 4.92, "p99Latency": 8.51, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 98.72, "qps": 2843, "meanLatency": 5.60, "p99Latency": 9.20, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 99.35, "qps": 2821, "meanLatency": 5.64, "p99Latency": 9.41, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 99.51, "qps": 2561, "meanLatency": 6.21, "p99Latency": 10.51, "importTime": 4366 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 99.39, "qps": 2501, "meanLatency": 6.36, "p99Latency": 9.68, "importTime": 3350 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 99.16, "qps": 2371, "meanLatency": 6.71, "p99Latency": 11.77, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 98.93, "qps": 2305, "meanLatency": 6.91, "p99Latency": 10.81, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 99.23, "qps": 2149, "meanLatency": 7.41, "p99Latency": 12.54, "importTime": 2304 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 99.53, "qps": 2080, "meanLatency": 7.66, "p99Latency": 12.75, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 99.52, "qps": 1971, "meanLatency": 8.08, "p99Latency": 12.74, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 99.39, "qps": 1963, "meanLatency": 8.11, "p99Latency": 13.65, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 99.32, "qps": 1919, "meanLatency": 8.29, "p99Latency": 14.18, "importTime": 1450 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 99.66, "qps": 1903, "meanLatency": 8.36, "p99Latency": 13.63, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 99.63, "qps": 1639, "meanLatency": 9.72, "p99Latency": 16.49, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 99.74, "qps": 1490, "meanLatency": 10.69, "p99Latency": 17.91, "importTime": 4366 }, + ], + "msmarcoSnowflake_100":[ + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 92.03, "qps": 3900, "meanLatency": 4.06, "p99Latency": 7.52, "importTime": 1286 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 92.03, "qps": 3880, "meanLatency": 4.07, "p99Latency": 7.77, "importTime": 1286 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 92.03, "qps": 3855, "meanLatency": 4.11, "p99Latency": 8.30, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 93.08, "qps": 3809, "meanLatency": 4.16, "p99Latency": 7.93, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 92.03, "qps": 3792, "meanLatency": 4.17, "p99Latency": 9.14, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 93.08, "qps": 3784, "meanLatency": 4.18, "p99Latency": 8.12, "importTime": 2304 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 93.08, "qps": 3781, "meanLatency": 4.19, "p99Latency": 7.83, "importTime": 2304 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 93.08, "qps": 3749, "meanLatency": 4.22, "p99Latency": 8.61, "importTime": 2304 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 93.08, "qps": 3734, "meanLatency": 4.24, "p99Latency": 8.52, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 24, "recall": 92.03, "qps": 3718, "meanLatency": 4.26, "p99Latency": 9.97, "importTime": 1286 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 93.86, "qps": 3607, "meanLatency": 4.40, "p99Latency": 8.11, "importTime": 1286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 93.33, "qps": 3584, "meanLatency": 4.42, "p99Latency": 8.27, "importTime": 3350 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 93.33, "qps": 3568, "meanLatency": 4.44, "p99Latency": 8.71, "importTime": 3350 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 92.03, "qps": 3539, "meanLatency": 4.48, "p99Latency": 11.54, "importTime": 1286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 93.33, "qps": 3524, "meanLatency": 4.49, "p99Latency": 8.73, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 94.83, "qps": 3487, "meanLatency": 4.55, "p99Latency": 8.41, "importTime": 2304 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 93.08, "qps": 3468, "meanLatency": 4.57, "p99Latency": 12.38, "importTime": 2304 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 94.05, "qps": 3435, "meanLatency": 4.62, "p99Latency": 8.69, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 94.05, "qps": 3418, "meanLatency": 4.63, "p99Latency": 8.54, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 94.05, "qps": 3389, "meanLatency": 4.68, "p99Latency": 9.51, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 94.05, "qps": 3383, "meanLatency": 4.68, "p99Latency": 9.03, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 94.05, "qps": 3359, "meanLatency": 4.72, "p99Latency": 10.39, "importTime": 1450 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 95.08, "qps": 3284, "meanLatency": 4.83, "p99Latency": 8.97, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 95.41, "qps": 3193, "meanLatency": 4.97, "p99Latency": 9.12, "importTime": 2907 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 95.41, "qps": 3180, "meanLatency": 4.98, "p99Latency": 8.89, "importTime": 2907 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 95.51, "qps": 3170, "meanLatency": 5.00, "p99Latency": 9.07, "importTime": 1450 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 95.41, "qps": 3164, "meanLatency": 5.01, "p99Latency": 9.29, "importTime": 2907 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 95.41, "qps": 3134, "meanLatency": 5.06, "p99Latency": 9.85, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 64, "recall": 95.80, "qps": 3112, "meanLatency": 5.10, "p99Latency": 9.24, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 95.41, "qps": 3111, "meanLatency": 5.10, "p99Latency": 11.67, "importTime": 2907 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 94.05, "qps": 3106, "meanLatency": 5.10, "p99Latency": 13.71, "importTime": 1450 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 95.80, "qps": 3090, "meanLatency": 5.13, "p99Latency": 9.85, "importTime": 4366 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 95.80, "qps": 3053, "meanLatency": 5.19, "p99Latency": 9.75, "importTime": 4366 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 95.80, "qps": 3049, "meanLatency": 5.19, "p99Latency": 10.38, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 95.41, "qps": 3039, "meanLatency": 5.22, "p99Latency": 10.90, "importTime": 2907 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 96.67, "qps": 2876, "meanLatency": 5.52, "p99Latency": 10.09, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 97.02, "qps": 2795, "meanLatency": 5.68, "p99Latency": 10.09, "importTime": 4366 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 96.94, "qps": 2690, "meanLatency": 5.88, "p99Latency": 10.52, "importTime": 1286 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 93.33, "qps": 2689, "meanLatency": 5.90, "p99Latency": 13.67, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 97.66, "qps": 2533, "meanLatency": 6.26, "p99Latency": 11.13, "importTime": 2304 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 97.87, "qps": 2402, "meanLatency": 6.61, "p99Latency": 11.80, "importTime": 3350 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 97.88, "qps": 2294, "meanLatency": 6.92, "p99Latency": 12.80, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 97.94, "qps": 2184, "meanLatency": 7.27, "p99Latency": 12.20, "importTime": 1286 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 95.80, "qps": 2087, "meanLatency": 7.60, "p99Latency": 18.12, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 98.59, "qps": 2087, "meanLatency": 7.61, "p99Latency": 12.82, "importTime": 2907 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 98.51, "qps": 2049, "meanLatency": 7.75, "p99Latency": 12.99, "importTime": 2304 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 98.82, "qps": 1957, "meanLatency": 8.12, "p99Latency": 14.38, "importTime": 4366 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 98.69, "qps": 1948, "meanLatency": 8.16, "p99Latency": 13.15, "importTime": 3350 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 98.61, "qps": 1836, "meanLatency": 8.65, "p99Latency": 15.15, "importTime": 1450 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 98.42, "qps": 1828, "meanLatency": 8.69, "p99Latency": 14.99, "importTime": 1286 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 98.92, "qps": 1696, "meanLatency": 9.38, "p99Latency": 15.59, "importTime": 2304 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 93.33, "qps": 1657, "meanLatency": 9.55, "p99Latency": 19.53, "importTime": 3350 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 99.13, "qps": 1625, "meanLatency": 9.79, "p99Latency": 16.62, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 99.07, "qps": 1615, "meanLatency": 9.84, "p99Latency": 16.31, "importTime": 3350 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 93.33, "qps": 1615, "meanLatency": 9.83, "p99Latency": 21.11, "importTime": 3350 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 99.30, "qps": 1539, "meanLatency": 10.32, "p99Latency": 16.82, "importTime": 4366 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 98.96, "qps": 1535, "meanLatency": 10.34, "p99Latency": 17.47, "importTime": 1450 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 95.80, "qps": 1385, "meanLatency": 11.46, "p99Latency": 25.17, "importTime": 4366 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 99.38, "qps": 1355, "meanLatency": 11.74, "p99Latency": 19.43, "importTime": 2907 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 99.52, "qps": 1262, "meanLatency": 12.60, "p99Latency": 21.11, "importTime": 4366 }, + ], + "sphereDpr_10": [ + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 75.12, "qps": 10666, "meanLatency": 1.48, "p99Latency": 2.82, "importTime": 3464 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 72.44, "qps": 10468, "meanLatency": 1.50, "p99Latency": 2.88, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 79.48, "qps": 9372, "meanLatency": 1.68, "p99Latency": 3.00, "importTime": 2471 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 80.61, "qps": 9156, "meanLatency": 1.69, "p99Latency": 3.92, "importTime": 4964 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 82.84, "qps": 9095, "meanLatency": 1.73, "p99Latency": 3.09, "importTime": 4956 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 83.74, "qps": 9031, "meanLatency": 1.74, "p99Latency": 3.26, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 87.31, "qps": 7723, "meanLatency": 2.04, "p99Latency": 3.57, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 87.10, "qps": 7465, "meanLatency": 2.07, "p99Latency": 5.77, "importTime": 4956 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 80.98, "qps": 7411, "meanLatency": 2.11, "p99Latency": 6.25, "importTime": 1934 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 87.68, "qps": 6990, "meanLatency": 2.21, "p99Latency": 6.71, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 89.99, "qps": 6443, "meanLatency": 2.42, "p99Latency": 5.86, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 89.88, "qps": 6333, "meanLatency": 2.48, "p99Latency": 4.48, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 89.77, "qps": 6244, "meanLatency": 2.50, "p99Latency": 6.12, "importTime": 2471 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 92.96, "qps": 5285, "meanLatency": 2.97, "p99Latency": 6.80, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 92.37, "qps": 5046, "meanLatency": 3.13, "p99Latency": 5.56, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 89.70, "qps": 4978, "meanLatency": 3.16, "p99Latency": 7.07, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 87.05, "qps": 4902, "meanLatency": 3.20, "p99Latency": 9.12, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 91.55, "qps": 4779, "meanLatency": 3.30, "p99Latency": 6.45, "importTime": 2471 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 91.18, "qps": 4129, "meanLatency": 3.80, "p99Latency": 7.46, "importTime": 1934 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 93.79, "qps": 4056, "meanLatency": 3.90, "p99Latency": 6.19, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 93.48, "qps": 4038, "meanLatency": 3.89, "p99Latency": 7.40, "importTime": 2471 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 96.06, "qps": 3523, "meanLatency": 4.49, "p99Latency": 7.73, "importTime": 7455 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 96.44, "qps": 3068, "meanLatency": 5.14, "p99Latency": 8.35, "importTime": 4956 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 94.06, "qps": 2602, "meanLatency": 6.01, "p99Latency": 20.88, "importTime": 1934 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 95.82, "qps": 2584, "meanLatency": 6.12, "p99Latency": 9.52, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 96.77, "qps": 2027, "meanLatency": 7.82, "p99Latency": 11.12, "importTime": 3464 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 97.25, "qps": 1901, "meanLatency": 8.30, "p99Latency": 11.88, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 95.93, "qps": 1626, "meanLatency": 9.70, "p99Latency": 16.00, "importTime": 1934 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 97.79, "qps": 1514, "meanLatency": 10.46, "p99Latency": 14.63, "importTime": 4964 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 98.89, "qps": 1213, "meanLatency": 13.05, "p99Latency": 20.43, "importTime": 7455 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 98.86, "qps": 1045, "meanLatency": 15.11, "p99Latency": 22.63, "importTime": 4956 }, + ], + "sphereDpr_100": [ + { "efConstruction": 128, "maxConnections": 16, "ef": 32, "recall": 80.00, "qps": 3423, "meanLatency": 4.60, "p99Latency": 7.25, "importTime": 1934 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 24, "recall": 81.56, "qps": 3391, "meanLatency": 4.66, "p99Latency": 6.95, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 96, "recall": 81.56, "qps": 3365, "meanLatency": 4.69, "p99Latency": 7.11, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 64, "recall": 81.56, "qps": 3351, "meanLatency": 4.69, "p99Latency": 7.18, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 16, "recall": 81.56, "qps": 3278, "meanLatency": 4.81, "p99Latency": 7.46, "importTime": 3464 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 48, "recall": 81.94, "qps": 3214, "meanLatency": 4.90, "p99Latency": 7.58, "importTime": 4964 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 32, "recall": 81.94, "qps": 3208, "meanLatency": 4.92, "p99Latency": 7.72, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 96, "recall": 80.00, "qps": 2839, "meanLatency": 5.54, "p99Latency": 9.18, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 16, "recall": 80.00, "qps": 2833, "meanLatency": 5.55, "p99Latency": 14.61, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 16, "recall": 85.08, "qps": 2830, "meanLatency": 5.57, "p99Latency": 8.92, "importTime": 2471 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 16, "recall": 81.94, "qps": 2794, "meanLatency": 5.62, "p99Latency": 14.52, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 48, "recall": 85.08, "qps": 2772, "meanLatency": 5.69, "p99Latency": 9.23, "importTime": 2471 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 32, "recall": 85.08, "qps": 2729, "meanLatency": 5.75, "p99Latency": 9.29, "importTime": 2471 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 48, "recall": 81.56, "qps": 2712, "meanLatency": 5.81, "p99Latency": 16.75, "importTime": 3464 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 96, "recall": 85.08, "qps": 2692, "meanLatency": 5.86, "p99Latency": 9.64, "importTime": 2471 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 96, "recall": 87.41, "qps": 2691, "meanLatency": 5.85, "p99Latency": 8.85, "importTime": 4956 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 64, "recall": 87.99, "qps": 2651, "meanLatency": 5.96, "p99Latency": 8.73, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 48, "recall": 87.99, "qps": 2647, "meanLatency": 5.97, "p99Latency": 8.85, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 96, "recall": 81.94, "qps": 2569, "meanLatency": 6.14, "p99Latency": 9.65, "importTime": 4964 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 32, "recall": 87.41, "qps": 2558, "meanLatency": 6.16, "p99Latency": 9.52, "importTime": 4956 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 48, "recall": 87.41, "qps": 2459, "meanLatency": 6.41, "p99Latency": 14.43, "importTime": 4956 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 64, "recall": 80.00, "qps": 2445, "meanLatency": 6.44, "p99Latency": 19.65, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 24, "recall": 80.00, "qps": 2334, "meanLatency": 6.71, "p99Latency": 19.78, "importTime": 1934 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 64, "recall": 81.94, "qps": 2203, "meanLatency": 7.06, "p99Latency": 19.85, "importTime": 4964 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 128, "recall": 90.01, "qps": 2178, "meanLatency": 7.22, "p99Latency": 10.54, "importTime": 4956 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 24, "recall": 87.41, "qps": 2175, "meanLatency": 7.22, "p99Latency": 11.09, "importTime": 4956 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 32, "recall": 87.99, "qps": 2174, "meanLatency": 7.28, "p99Latency": 11.52, "importTime": 7455 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 128, "recall": 84.71, "qps": 2168, "meanLatency": 7.25, "p99Latency": 20.03, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 32, "recall": 81.56, "qps": 2151, "meanLatency": 7.30, "p99Latency": 15.82, "importTime": 3464 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 64, "recall": 85.08, "qps": 2138, "meanLatency": 7.36, "p99Latency": 23.08, "importTime": 2471 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 128, "recall": 83.07, "qps": 2102, "meanLatency": 7.44, "p99Latency": 21.98, "importTime": 1934 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 128, "recall": 85.10, "qps": 2065, "meanLatency": 7.64, "p99Latency": 11.85, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 128, "recall": 87.78, "qps": 2019, "meanLatency": 7.76, "p99Latency": 15.79, "importTime": 2471 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 24, "recall": 81.94, "qps": 2003, "meanLatency": 7.89, "p99Latency": 19.26, "importTime": 4964 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 128, "recall": 90.58, "qps": 1964, "meanLatency": 8.06, "p99Latency": 12.98, "importTime": 7455 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 64, "recall": 87.41, "qps": 1876, "meanLatency": 8.43, "p99Latency": 25.45, "importTime": 4956 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 96, "recall": 87.99, "qps": 1728, "meanLatency": 9.14, "p99Latency": 25.00, "importTime": 7455 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 24, "recall": 85.08, "qps": 1694, "meanLatency": 9.32, "p99Latency": 25.24, "importTime": 2471 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 48, "recall": 80.00, "qps": 1655, "meanLatency": 9.52, "p99Latency": 18.12, "importTime": 1934 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 16, "recall": 87.41, "qps": 1645, "meanLatency": 9.59, "p99Latency": 24.74, "importTime": 4956 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 384, "recall": 92.55, "qps": 1392, "meanLatency": 11.35, "p99Latency": 20.15, "importTime": 1934 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 256, "recall": 95.58, "qps": 1373, "meanLatency": 11.51, "p99Latency": 16.24, "importTime": 7455 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 256, "recall": 91.31, "qps": 1350, "meanLatency": 11.70, "p99Latency": 32.29, "importTime": 3464 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 24, "recall": 87.99, "qps": 1322, "meanLatency": 11.97, "p99Latency": 30.25, "importTime": 7455 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 512, "recall": 95.36, "qps": 1313, "meanLatency": 11.97, "p99Latency": 16.54, "importTime": 3464 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 384, "recall": 94.29, "qps": 1308, "meanLatency": 12.06, "p99Latency": 21.33, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 256, "recall": 93.33, "qps": 1275, "meanLatency": 12.40, "p99Latency": 30.15, "importTime": 2471 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 256, "recall": 89.76, "qps": 1266, "meanLatency": 12.46, "p99Latency": 38.38, "importTime": 1934 }, + { "efConstruction": 256, "maxConnections": 16, "ef": 384, "recall": 93.94, "qps": 1250, "meanLatency": 12.68, "p99Latency": 19.40, "importTime": 3464 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 256, "recall": 95.08, "qps": 1234, "meanLatency": 12.81, "p99Latency": 30.89, "importTime": 4956 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 256, "recall": 91.71, "qps": 1230, "meanLatency": 12.86, "p99Latency": 33.16, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 384, "recall": 95.44, "qps": 1160, "meanLatency": 13.50, "p99Latency": 28.57, "importTime": 2471 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 384, "recall": 96.86, "qps": 1155, "meanLatency": 13.72, "p99Latency": 19.79, "importTime": 4956 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 16, "recall": 87.99, "qps": 1087, "meanLatency": 14.53, "p99Latency": 29.06, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 16, "ef": 512, "recall": 95.72, "qps": 1073, "meanLatency": 14.77, "p99Latency": 37.29, "importTime": 4964 }, + { "efConstruction": 128, "maxConnections": 16, "ef": 512, "recall": 94.07, "qps": 1065, "meanLatency": 14.79, "p99Latency": 36.23, "importTime": 1934 }, + { "efConstruction": 128, "maxConnections": 32, "ef": 512, "recall": 96.52, "qps": 1012, "meanLatency": 15.60, "p99Latency": 25.02, "importTime": 2471 }, + { "efConstruction": 256, "maxConnections": 32, "ef": 512, "recall": 97.76, "qps": 964, "meanLatency": 16.43, "p99Latency": 23.95, "importTime": 4956 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 384, "recall": 97.26, "qps": 963, "meanLatency": 16.42, "p99Latency": 33.55, "importTime": 7455 }, + { "efConstruction": 384, "maxConnections": 32, "ef": 512, "recall": 98.09, "qps": 914, "meanLatency": 17.30, "p99Latency": 24.79, "importTime": 7455 }, + ] +} \ No newline at end of file diff --git a/src/components/Events/OnDemand/index.jsx b/src/components/Events/OnDemand/index.jsx index 0b5a0a9237..14e1a390e9 100644 --- a/src/components/Events/OnDemand/index.jsx +++ b/src/components/Events/OnDemand/index.jsx @@ -57,6 +57,15 @@ export default function OnDemand() { {'Watch now >'}
+
+

+ Benchmarking AI Databases: How to test and optimize for your use + case +

+ + {'Watch now >'} + +
diff --git a/src/components/Events/OnDemand/styles.module.scss b/src/components/Events/OnDemand/styles.module.scss index e7dd5b70d7..f3aebe0c58 100644 --- a/src/components/Events/OnDemand/styles.module.scss +++ b/src/components/Events/OnDemand/styles.module.scss @@ -193,7 +193,7 @@ color: #1c1468; } - @media screen and (max-width: 500px) { + @media screen and (max-width: 800px) { width: 100%; } } diff --git a/src/components/Home/Redesign/Header/index.jsx b/src/components/Home/Redesign/Header/index.jsx index 2b1ab3a24a..7db18eb093 100644 --- a/src/components/Home/Redesign/Header/index.jsx +++ b/src/components/Home/Redesign/Header/index.jsx @@ -205,9 +205,7 @@ export default function HomepageHeader() {
-
+
diff --git a/src/components/Home/Redesign/Header/styles.module.scss b/src/components/Home/Redesign/Header/styles.module.scss index 5bbd4be55c..da5abf826a 100644 --- a/src/components/Home/Redesign/Header/styles.module.scss +++ b/src/components/Home/Redesign/Header/styles.module.scss @@ -62,13 +62,14 @@ @media screen and (max-width: 950px) { display: flex; flex-grow: 1; - overflow-x: hidden; - column-gap: 20px; + + gap: 20px; flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: center; min-width: 330px; + margin-bottom: 20px; } @keyframes scrollSideCustomers { @@ -152,6 +153,10 @@ @media screen and (max-width: 950px) { height: 26rem; } + + @media screen and (max-width: 500px) { + height: 32rem; + } } .innerBar { @@ -190,6 +195,9 @@ @media screen and (max-width: 950px) { margin-bottom: 33px; } + @media screen and (max-width: 600px) { + margin-bottom: 0; + } } .innerBar > p { @@ -260,15 +268,15 @@ background-position: center; width: 8rem; - height: 6rem; + height: 5rem; } .redbull { background-image: url('/img/site/redbull-hp-logo.svg'); background-position: center; } -.writesonic { - background-image: url('/img/site/writesonic-hp-logo.svg'); +.ms { + background-image: url('/img/site/Morningstar.svg'); background-position: center; } .title { diff --git a/src/components/Home/Redesign/IntegrationsUpdate/styles.module.scss b/src/components/Home/Redesign/IntegrationsUpdate/styles.module.scss index e279e0aef7..68cf0a8280 100644 --- a/src/components/Home/Redesign/IntegrationsUpdate/styles.module.scss +++ b/src/components/Home/Redesign/IntegrationsUpdate/styles.module.scss @@ -86,6 +86,15 @@ align-items: center; scroll-snap-align: center; margin: 0 10px; + + @media screen and (max-width: 500px) { + width: 12.375rem; + } + + @media screen and (max-width: 400px) { + width: 8.375rem; + height: 4.9375rem; + } } .inside { diff --git a/src/components/Home/Redesign/IntegrationsUpdate/stylesv2.module.scss b/src/components/Home/Redesign/IntegrationsUpdate/stylesv2.module.scss new file mode 100644 index 0000000000..1c2f9ef816 --- /dev/null +++ b/src/components/Home/Redesign/IntegrationsUpdate/stylesv2.module.scss @@ -0,0 +1,346 @@ +[data-theme='light'] { + .box { + .left { + .inside { + .logoAI { + background-image: url('/img/site/openai-logo.png'); + } + .logoH { + background-image: url('/img/site/higgingface-logo.png'); + } + .logoJ { + background-image: url('/img/site/jina-logo.png'); + } + .logoD { + background-image: url('/img/site/haystack-logo.png'); + } + .logoCo { + background-image: url('/img/site/cohere-logo.png'); + } + .logoW { + background-image: url('/img/site/wp-solar-logo.png'); + } + .logoG { + background-image: url('/img/site/googleAI.png'); + } + .logoL { + background-image: url('/img/site/langchain-logo.png'); + } + .logoLa { + background-image: url('/img/site/lama-logo.png'); + } + } + } + } +} + +.integrationsSection { + background: url('/img/site/integrations-bg.jpg'); + background-size: cover; + background-blend-mode: overlay, normal; + backdrop-filter: blur(40px); +} + +.topImage { + background: url('/img/site/3d-weaviate-bubble-top.png'); + background-size: contain; + background-repeat: no-repeat; + background-blend-mode: overlay, normal; + -webkit-backdrop-filter: blur(40px); + backdrop-filter: blur(40px); + width: 33.67313rem; + height: 32.67625rem; + position: absolute; + z-index: -1; + text-align: right; + background-position-x: right; + right: 0; + top: 0; + + @media screen and (max-width: 600px) { + opacity: 0.5; + } +} + +.integrationsLogos { + display: flex; + flex-direction: column; + flex: 1; + justify-content: center; + overflow: hidden; + align-items: center; + + @media screen and (max-width: 500px) { + padding: 9px; + + overflow: hidden; + } + + .logoImage { + max-width: 110px; + height: auto; + max-height: 43px; + } + + .logoBg { + width: 14.375rem; + display: flex; + height: 5.9375rem; + flex-shrink: 0; + border-radius: 0.9375rem; + background: rgba(255, 255, 255, 0.8); + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + align-items: center; + scroll-snap-align: center; + margin: 10px; + justify-content: center; + align-content: center; + + @media screen and (max-width: 600px) { + width: 12.375rem; + } + + @media screen and (max-width: 400px) { + width: 8.375rem; + height: 4.9375rem; + } + } + + .inside { + display: flex; + flex-wrap: wrap; + padding-bottom: 4rem; + justify-content: center; + padding: 0rem 2rem 4rem; + //animation: scrollSide 40s linear infinite; + + @keyframes scrollSide { + 0% { + transform: translateX(50%); + } + 100% { + transform: translateX(-50%); + } + } + + .integrationsLogos:hover { + animation-play-state: paused; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 3rem; + background-image: url('/img/site/haystack-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } + + .buttonDark { + width: 12.1875rem; + height: 3.125rem; + flex-shrink: 0; + border-radius: 0.375rem; + background: #130c49; + display: flex; + justify-content: center; + align-items: center; + color: #fff; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + } +} + +.integrationsLogos:hover { + .inside { + animation-play-state: paused; + } +} +.mobileIntegrations { + display: none !important; + + @media screen and (max-width: 500px) { + display: flex !important; + } +} + +.box { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-top: 4rem; + + @media screen and (max-width: 580px) { + flex-direction: column-reverse; + } + .left { + display: flex; + flex-direction: column; + flex: 1; + gap: 30px; + justify-content: center; + + .inside { + display: flex; + + @media screen and (max-width: 500px) { + flex-direction: row; + gap: 20px; + display: flex; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 3rem; + background-image: url('/img/site/haystack-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } + } + .right { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 60%; + + @media screen and (max-width: 768px) { + width: 100%; + } + } +} diff --git a/src/components/Home/Redesign/IntegrationsUpdate/v2.jsx b/src/components/Home/Redesign/IntegrationsUpdate/v2.jsx new file mode 100644 index 0000000000..df48237294 --- /dev/null +++ b/src/components/Home/Redesign/IntegrationsUpdate/v2.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { ButtonContainer } from '../../../../theme/Buttons'; +import styles from './stylesv2.module.scss'; +import Link from '@docusaurus/Link'; +import JoinCommunity from '../JoinCommunityUpdate'; +import partners from '/data/partners.json'; + +export default function HomepageIntegrations() { + const featuredPartners = partners.filter((partner) => partner.featured); + + return ( +
+
+
+
+
+

Integrations

+

+ With Weaviate, you can bring your own vectors or choose one of our + out-of-the-box modules with support for vectorization. You can + also easily connect to a wide variety of well-known language model + frameworks. +

+
+
+
+ +
+
+ {featuredPartners.map((partner) => ( + +
+ {`${partner.name} +
+ + ))} +
+
+ + View all integrations + +
+
+ + +
+ ); +} diff --git a/src/components/Home/Redesign/WhatYouCanDoUpdate/styles.module.scss b/src/components/Home/Redesign/WhatYouCanDoUpdate/styles.module.scss index aabf68f5f3..0a8c34c9c5 100644 --- a/src/components/Home/Redesign/WhatYouCanDoUpdate/styles.module.scss +++ b/src/components/Home/Redesign/WhatYouCanDoUpdate/styles.module.scss @@ -86,6 +86,7 @@ display: flex; flex-direction: column; justify-content: flex-start; + align-items: flex-start; flex: 1; cursor: pointer; background-color: transparent; @@ -312,11 +313,13 @@ font-size: 1.3rem; line-height: 144.9%; /* 2.1735rem */ letter-spacing: -0.015rem; + display: flex; + text-align: left; + justify-content: flex-start; - @media screen and (max-width: 485px) { + @media screen and (max-width: 585px) { font-size: 1.1rem; - text-align: left; - display: flex; + width: 100%; } } diff --git a/src/components/Javascript/BWW/index.jsx b/src/components/Javascript/BWW/index.jsx new file mode 100644 index 0000000000..dd1487beeb --- /dev/null +++ b/src/components/Javascript/BWW/index.jsx @@ -0,0 +1,69 @@ +import React from 'react'; +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +export default function BuildWith() { + return ( +
+
+
+

Build with Weaviate

+

Look at how developers are building with Weaviate.

+
+
+
+
+
+ + {'See the showcase >'} + +
+

+ Using Weaviate to Build the Foundation for AI-First App + Development +

+
+
+
+
+

RicAI

+

+ An Autonomous AI Agent for automating software testing, + generating test cases and performing various tests. +

+ + + {'See the showcase >'} + +
+
+

Internship Finder

+

+ An interactive web application to help you discover internship + opportunities tailored to your resume! +

+ + + {'See the showcase >'} + +
+
+
+
+ + See all Showcases + +
+
+
+ ); +} diff --git a/src/components/Javascript/BWW/styles.module.scss b/src/components/Javascript/BWW/styles.module.scss new file mode 100644 index 0000000000..687024d20e --- /dev/null +++ b/src/components/Javascript/BWW/styles.module.scss @@ -0,0 +1,259 @@ +.Container { + margin-top: 2rem; +} + +.headerContainer { + h2 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 2.4rem */ + margin-bottom: 0.5rem; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + margin-bottom: 2rem; + } +} + +.boxContainer { + display: flex; + gap: 70px; + justify-content: center; + + @media (max-width: 960px) { + flex-direction: column; + gap: 40px; + } +} + +.innerContainer { + display: flex; + flex-wrap: wrap; + gap: 20px; + width: 21.3125rem; + + @media (max-width: 960px) { + gap: 10px; + width: 100%; + } + + @media (max-width: 768px) { + flex-direction: column; + } +} + +.largeBox { + width: 42.5rem; + height: 32.4375rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: #ffffff; + padding: 20px; + transition: all 0.3s ease-in-out; + + .boxTop { + display: flex; + justify-content: space-between; + margin: 0px 0px 30px 0px; + } + + .boxLogo { + width: 9.0625rem; + height: 2.46713rem; + background-size: contain; + background-repeat: no-repeat; + background: url('/img/site/unbody-logo.svg'); + + @media screen and (max-width: 850px) { + width: 6.0625rem; + height: 2.46713rem; + background-size: contain; + background-repeat: no-repeat; + background-position-y: center; + } + } + + .boxButton { + width: 10.9375rem; + height: 2.5rem; + display: flex; + flex-shrink: 0; + border-radius: 3.125rem; + border: 1px solid #e0e6ef; + background: #e0e6ef; + align-items: center; + justify-content: center; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + } + + .boxImage { + width: 36.9375rem; + height: 19.8125rem; + flex-shrink: 0; + background: url('/img/site/unbody-box-js.png'); + background-size: contain; + @media (max-width: 1300px) { + width: auto; + height: 19.8125rem; + } + } + + @media (max-width: 1300px) { + width: 35rem; + height: auto; + } + + @media (max-width: 960px) { + width: 100%; + height: auto; + } +} + +.smallBox { + width: 21.3125rem; + height: 15.6875rem; + flex-shrink: 0; + padding: 20px; + transition: all 0.3s ease-in-out; + display: flex; + flex-direction: column; + justify-content: space-between; + + p { + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 140%; /* 1.225rem */ + } + + .boxButton { + width: 10.9375rem; + height: 2.5rem; + display: flex; + flex-shrink: 0; + border-radius: 3.125rem; + border: 1px solid #e0e6ef; + background: #e0e6ef; + align-items: center; + justify-content: center; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + + @media screen and (max-width: 500px) { + margin: 10px 0px; + } + } + + @media (max-width: 1300px) { + width: 18rem; + height: auto; + } + + @media (max-width: 960px) { + width: 100%; + height: auto; + } +} + +.light { + border-radius: 1.25rem; + background: url('/img/site/RicAI.svg'), #85e3bc; + background-repeat: no-repeat; + background-position-y: -90px; + background-position-x: right; +} + +.dark { + border-radius: 1.25rem; + background: url('/img/site/bww-bg-logo-02.svg'), #130c49; + background-repeat: no-repeat; + background-position-y: -20px; + background-position-x: right; + + h3, + p { + color: #ffffff; + } + + .boxButton { + border-radius: 3.125rem; + border: 1px solid #332e75; + background: #332e75; + color: #fff; + } +} + +/* Media queries for responsive resizing */ +@media (max-width: 1300px) { + .boxContainer { + gap: 40px; + } + + .largeBox { + width: 35rem; + height: auto; + } + + .smallBox { + width: 18rem; + height: auto; + } +} + +@media (max-width: 960px) { + .boxContainer { + flex-direction: column; + gap: 20px; + } + + .largeBox, + .smallBox { + width: 100%; + height: auto; + } +} + +@media (max-width: 768px) { + .innerContainer { + flex-direction: column; + } +} + +.buttonContainer { + display: flex; + justify-content: center; + margin: 50px 0px 30px 0px; + + .button { + width: 12.5rem; + height: 2.5rem; + flex-shrink: 0; + border-radius: 0.3125rem; + background: #130c49; + color: #ffffff; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/components/Javascript/Details/index.jsx b/src/components/Javascript/Details/index.jsx new file mode 100644 index 0000000000..f8c86f7e20 --- /dev/null +++ b/src/components/Javascript/Details/index.jsx @@ -0,0 +1,57 @@ +import React, { useState } from 'react'; + +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import 'react-tabs/style/react-tabs.css'; + +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +import paths from '/data/paths.json'; + +export default function Details() { + const [isCopied, setIsCopied] = useState(false); + const resoursesSite = paths.siteSearch; + const resoursesEcommerce = paths.ecommerce; + const resoursesAutomation = paths.automation; + const resoursesChatbots = paths.chatbots; + + const copyToClipboard = (text) => { + navigator.clipboard.writeText(text); + setIsCopied(true); + setTimeout(() => { + setIsCopied(false); + }, 2000); + }; + + return ( +
+
+
+
+

👨🏽‍💻 Getting Started

+

1. Install the client

+
+ copyToClipboard('npm install weaviate-client')} + > + {'> npm install weaviate-client'} + + +
+

2. Search!!

+
+
+
+
+
+ ); +} diff --git a/src/components/Javascript/Details/styles.module.scss b/src/components/Javascript/Details/styles.module.scss new file mode 100644 index 0000000000..d876783c75 --- /dev/null +++ b/src/components/Javascript/Details/styles.module.scss @@ -0,0 +1,307 @@ +.bgCol { + background: #ecf4f8; + max-height: 13rem; + + @media screen and (max-width: 1080px) { + max-height: 28rem; + } + + @media screen and (max-width: 600px) { + max-height: 28rem; + } + + @media screen and (max-width: 500px) { + max-height: 32rem; + } +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } +} + +.grid { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 110px; + + @media screen and (max-width: 950px) { + margin: none; + gap: 0px; + } + + @media screen and (max-width: 1050px) { + grid-template-columns: 1fr; + margin: 0px 10px; + } +} + +.title { + font-size: 50px; + font-weight: bold; + + margin: 2rem 0rem; + height: 250px; + + @media screen and (max-width: 500px) { + font-size: 53px; + text-align: left; + + height: 200px; + } + + h1 { + color: #130c49; + + font-family: Plus Jakarta Sans; + font-size: 2.625rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3.15rem */ + } +} +.text { + @media screen and (max-width: 800px) { + text-align: left; + width: 347px; + padding: 20px 0; + } +} + +.buttons { + margin-top: 30px; + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: flex-start; + + @media screen and (max-width: 800px) { + justify-content: left; + } + + a { + width: 11.1875rem; + height: 3.125rem; + + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.375rem; + + background: #61bd73; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + width: 13.1875rem; + } + + .buttonOutline { + color: #ffffff; + + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + border-radius: 0.375rem; + border: 1px solid #61bd73; + background: #130c49; + } +} + +.box { + display: flex; + flex-direction: column; + + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + flex: 1; + + h1 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 3rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: normal; + text-transform: uppercase; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 2.1rem */ + } +} + +.serviceBox { + width: 64.9375rem; + height: 20.6875rem; + padding: 20px; + flex-shrink: 0; + border-radius: 0.625rem; + background: #130c49; + margin: 36px auto; + display: flex; + transform: translateY(-200px); + + @media screen and (max-width: 1080px) { + height: auto; + flex-direction: column; + width: 100%; + margin: 20px 0px; + transform: translateY(-140px); + } +} + +.serviceText { + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding: 20px; + flex: 1; + + @media screen and (max-width: 1080px) { + gap: 20px; + } + + h2 { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3rem */ + + @media screen and (max-width: 800px) { + font-size: 2rem; + } + + @media screen and (max-width: 500px) { + font-size: 1.6rem; + } + } + + span { + color: #61bb73; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + color: #fff; + font-family: Inter; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 2.25rem */ + + @media screen and (max-width: 800px) { + font-size: 1.2rem; + } + } + + .buttonGradient, + .buttonGradient:hover { + border-radius: 0.375rem; + background: #61bd73; + color: #130c49; + } + + .codeContainer { + display: flex; + gap: 20px; + + i { + font-size: larger; + } + + code { + width: 80%; + display: flex; + justify-content: space-between; + padding: 10px; + + @media screen and (max-width: 800px) { + width: 100%; + } + } + } + + .copyButton { + background: none; + color: #130c49; + border: none; + } +} + +.serviceIcon { + background-image: url('/img/site/neople-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 10rem; + height: 10rem; +} + +.serviceImage { + background-image: url('/img/site/js-diagram-header.png'); + background-size: contain; + background-repeat: no-repeat; + width: 20.0625rem; + height: 14.4375rem; + border-radius: 0.625rem; + flex: 1; + margin: auto; + + @media screen and (max-width: 1080px) { + flex: auto; + padding: 20px; + } + + @media screen and (max-width: 800px) { + width: 100%; + } +} diff --git a/src/components/Javascript/Header/index.jsx b/src/components/Javascript/Header/index.jsx new file mode 100644 index 0000000000..05e1909158 --- /dev/null +++ b/src/components/Javascript/Header/index.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import styles from './styles.module.scss'; +import * as Tabs from '@radix-ui/react-tabs'; +import { LinkButton } from '/src/theme/Buttons'; +import { ButtonContainer } from '../../../theme/Buttons'; +import Image from 'react'; +import Link from '@docusaurus/Link'; + +export default function Header() { + return ( +
+
+
+

+ Build AI-Native Applications with Javascript +

+

A hub for builders of all levels.

+
+ + Explore the Docs + +
+
+
+
+ ); +} diff --git a/src/components/Javascript/Header/styles.module.scss b/src/components/Javascript/Header/styles.module.scss new file mode 100644 index 0000000000..d89316eb05 --- /dev/null +++ b/src/components/Javascript/Header/styles.module.scss @@ -0,0 +1,171 @@ +.header { + margin: 100px auto; + text-align: center; + display: flex; + flex-direction: column; + gap: 20px; + + h2 { + color: #130c49; + text-align: center; + font-family: 'Plus Jakarta Sans'; + font-size: 2.5rem; + font-style: normal; + font-weight: 600; + line-height: 120%; /* 3rem */ + width: 60%; + margin: auto; + + @media screen and (max-width: 800px) { + width: 100%; + } + + p { + margin: 20px 0px; + } + } +} +.info { + flex: 1; + h3, + p { + margin-left: 15px; + } +} + +.bgContain { + background-color: #130c49; + background-image: url('/img/site/js-gradient-bg.png'); + background-size: cover; +} +.latestModule { + display: flex; + gap: 40px; + margin: 40px auto; + justify-content: center; + align-items: center; + + @media screen and (max-width: 1050px) { + display: flex; + gap: 10px; + justify-content: flex-start; + align-items: center; + overflow-x: scroll; + flex-direction: row; + scroll-snap-type: x mandatory; + padding-bottom: 21px; + scroll-padding: 20%; + padding: 5px 10px 20px; + } +} + +.resourceBox { + border-radius: 0.61975rem; + background: #262262; + width: 20rem; + height: 20.25rem; + flex-shrink: 0; + padding: 30px; + + h3 { + color: #fff; + } + + p { + color: #869ab8; + font-family: Inter; + font-size: 1.0625rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.67163rem */ + } +} + +.resourceIcon { + background-image: url('/img/site/resource-icon-01.png'); + width: 9.36756rem; + height: 9.66975rem; + flex-shrink: 0; +} + +.bottomBox { + align-items: flex-end; + display: flex; + flex-direction: row; + justify-content: space-around; +} + +.smallText { + color: #130c49; + font-size: 0.65rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; + margin: 0 0 3px; +} + +.smallImage { + border-radius: 50%; + width: 13%; +} + +.buttons { + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + @media screen and (max-width: 800px) { + justify-content: center; + } + + a { + width: 11.1875rem; + height: 3.125rem; + + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.375rem; + background: #130c49; + color: #fff; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + width: 13.1875rem; + } + + .buttonGradient:hover { + border-radius: 0.375rem; + background: #130c49; + color: #fff; + } + + .buttonOutline { + color: #130c49; + border-radius: 0.375rem; + background: #fff; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + } + + .buttonOutline:hover { + border-radius: 0.375rem; + background: #fff; + } +} diff --git a/src/components/Javascript/List/index.jsx b/src/components/Javascript/List/index.jsx new file mode 100644 index 0000000000..6f85fb4012 --- /dev/null +++ b/src/components/Javascript/List/index.jsx @@ -0,0 +1,56 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; + +export default function List() { + return ( +
+
+

Whats next?

+
+
+
+
+
+

Weaviate Stacks

+

+ Weave through the noise, quick battle tested stacks to build AI + Apps. +

+ Learn More +
+
+
+
+
+

AI Concepts

+

+ Learn all the jargon, step into your AI era. +

+ Learn More +
+
+
+
+
+

Documentation

+

+ Find references for how to use Weaviate. +

+ Learn More +
+
+
+
+
+

Academy

+

+ Get guided courses on various topics. +

+ Learn More +
+
+
+
+ ); +} diff --git a/src/components/Javascript/List/styles.module.scss b/src/components/Javascript/List/styles.module.scss new file mode 100644 index 0000000000..f5f55816f8 --- /dev/null +++ b/src/components/Javascript/List/styles.module.scss @@ -0,0 +1,395 @@ +.title { + text-align: left; + padding: 1rem 0 2rem 0; +} + +.box { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: wrap; + margin-bottom: 20px; +} + +.card { + display: flex; + flex-direction: column; + justify-content: space-around; + + width: 15.625rem; + height: 17.625rem; + flex-shrink: 0; + + background-color: #141f39; + margin: 1rem; + padding: 2rem; + + border-radius: 0.4375rem; + border-radius: 0.4375rem; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + + @media screen and (max-width: 600px) { + height: auto; + width: 100%; + } +} + +.cardHeader { + display: grid; + grid-template-columns: 1fr 2fr; + + .cardHeaderLeft { + margin: auto; + } + + .cardHeaderRight { + display: flex; + justify-content: flex-start; + align-items: flex-start; + } + + .iconHeader { + height: 5rem; + width: 5rem; + } + + .cardTextColor { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 1.75rem */ + margin: 20px 0px; + } + + @media screen and (max-width: 600px) { + margin-bottom: 1.3rem; + } +} + +.contentDiv { + height: 100%; + display: flex; + flex-direction: column; + gap: 10px; + a { + color: #4aa389; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.57331rem */ + text-decoration-line: underline; + } +} + +.textCardContent { + color: #130c49; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.3125rem */ + height: 200px; + + @media screen and (max-width: 600px) { + height: auto; + } +} + +.cardFooter { + display: flex; + justify-content: space-between; + align-items: center; + + padding: 2rem 0; + + .cardFooterDiv { + display: flex; + align-items: flex-start; + justify-content: center; + + p { + font-size: 16px; + } + + @media screen and (max-width: 600px) { + margin-bottom: 0.7rem; + } + } + + @media screen and (max-width: 600px) { + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + + padding: 1rem 0 0 0; + } +} + +.img { + background-size: contain; + background-repeat: no-repeat; + background-position: center; + + // background-color: red; +} + +.startImg { + background-image: url('../../../../static/img/company/careers/star-dark.png'); + width: 2rem; + height: 2rem; + + margin-right: 0.5rem; +} + +.clockSmallImg { + background-image: url('../../../../static/img/company/careers/clock-small-dark.png'); + width: 2rem; + height: 2rem; + + margin-right: 0.5rem; +} + +.chatImg { + background-image: url('../../../../static/img/company/careers/chat-dark.png'); + width: 5rem; + height: 5rem; + + @media screen and (max-width: 600px) { + width: 4rem; + height: 4rem; + } +} + +.facesImg { + background-image: url('../../../../static/img/company/careers/faces-dark.png'); + width: 5rem; + height: 5rem; +} + +.checkImg { + background-image: url('../../../../static/img/company/careers/check-dark.png'); + width: 5rem; + height: 5rem; +} + +.heartImg { + background-image: url('../../../../static/img/company/careers/heart-dark.png'); + width: 5rem; + height: 5rem; +} +.bigHeartImg { + background-image: url('../../../../static/img/company/careers/magnifying-glass.png'); + width: 10rem; + height: 7rem; +} +[data-theme='light'] { + .title { + p { + color: #1c1468; + width: 80%; + } + + h2 { + color: #130c49; + font-family: Plus Jakarta Sans; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 3.53994rem */ + } + } + + .card { + border-radius: 0.4375rem; + border-radius: 0.4375rem; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + } + + .cardTextColor { + color: #130c49; + + h3 { + color: #130c49; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 1.35rem */ + } + } + + .startImg { + background-image: url('../../../../static/img/company/careers/star-light.png'); + } + + .clockSmallImg { + background-image: url('../../../../static/img/company/careers/clock-small-light.png'); + } + + .chatImg { + background-image: url('../../../../static/img/company/careers/chat-light.png'); + } + + .facesImg { + background-image: url('../../../../static/img/company/careers/faces-light.png'); + } + + .checkImg { + background-image: url('../../../../static/img/company/careers/check-light.png'); + } + + .heartImg { + background-image: url('../../../../static/img/company/careers/heart-light.png'); + } +} + +.longCard { + width: 92%; + display: flex; + flex-direction: column; + align-items: center; + height: 400px; + gap: 20px; + z-index: 1; + flex-wrap: nowrap; + background: #ffffff !important; + justify-content: center; + background-image: url('/img/site/home-page-bg-pattern.svg') !important; + background-size: cover !important; + + .cTextColor { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.5rem; + font-style: normal; + font-weight: 500; + line-height: 150%; /* 2.25rem */ + } + @media screen and (max-width: 1000px) { + height: auto; + min-height: 205px; + width: 100%; + } + + @media screen and (max-width: 500px) { + display: flex; + flex-direction: column; + } + + .contentDiv { + height: 100%; + width: 50%; + margin: 50px; + text-align: center; + + @media screen and (max-width: 500px) { + width: 100%; + } + } +} + +.longHead { + grid-template-columns: 1fr; +} + +.buttons { + margin-top: 30px; + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + a { + height: 45px; + width: 220px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: #61bd73; + transition: all 1s ease-out; + color: #130c49; + } + + .buttonGradient:hover { + border-radius: 0.3125rem; + outline: 1px solid #ffffff; + background: rgb(15, 0, 50); + color: #fff; + } + + .buttonOutline { + outline: 1px solid #ffffff; + color: #fff; + transition: all 1s ease-out; + background-color: #130c49; + } + + .buttonOutline:hover { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: rgb(97 189 115); + color: #130c49; + outline: 1px solid #130c49; + } +} + +.safetyTypeBottom { + width: 100%; + height: 186px; + background: #130c49; + margin-top: -200px; +} + +.cardIcon { + width: 2.8rem; + height: 2.8rem; + margin-right: auto; + margin-bottom: 1rem; + background-image: url('/img/site/js-whatsnext-01.svg'); + background-size: 100% 100%; +} + +.icon01 { + background-image: url('/img/site/js-whatsnext-01.svg'); + width: 1.71431rem; + height: 1.71413rem; + transform: rotate(-90deg); + flex-shrink: 0; +} +.icon02 { + background-image: url('/img/site/js-whatsnext-02.svg'); + width: 1.85713rem; + height: 1.57144rem; + flex-shrink: 0; +} +.icon03 { + background-image: url('/img/site/js-whatsnext-03.svg'); + width: 1.57144rem; + height: 1.28569rem; + transform: rotate(-90deg); + flex-shrink: 0; +} + +.icon04 { + background-image: url('/img/site/js-whatsnext-04.svg'); + width: 1.875rem; + height: 1.5rem; + flex-shrink: 0; +} diff --git a/src/components/Javascript/Recipes/index.jsx b/src/components/Javascript/Recipes/index.jsx new file mode 100644 index 0000000000..ae0de0a27e --- /dev/null +++ b/src/components/Javascript/Recipes/index.jsx @@ -0,0 +1,36 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Recipes() { + return ( +
+
+
+

Try our recipes

+

+ Recipes are topical code snippets covering popular use cases and + integrations. +

+
+ + Get them on GitHub + + + Get them on Stackblitz + +
+
+
+
+
+ ); +} diff --git a/src/components/Javascript/Recipes/styles.module.scss b/src/components/Javascript/Recipes/styles.module.scss new file mode 100644 index 0000000000..495d3b2d0c --- /dev/null +++ b/src/components/Javascript/Recipes/styles.module.scss @@ -0,0 +1,122 @@ +.grid { + display: flex; + flex-direction: row; + align-items: flex-start; + width: 67.9375rem; + height: 22.8125rem; + margin: auto; + padding: 50px; + flex-shrink: 0; + border-radius: 1.25rem; + background: url('/img/site/recipes-js-bg.png'); + background-repeat: no-repeat; + background-size: cover; + justify-content: space-around; + + @media screen and (max-width: 1160px) { + width: 100%; + } + + @media screen and (max-width: 850px) { + flex-direction: column; + height: auto; + gap: 30px; + } +} + +.box { + display: flex; + flex-direction: column; + text-align: left; + margin: auto 0px; + gap: 20px; + + h2 { + color: #ecf4f8; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 2.4rem */ + } + + p { + color: #ecf4f8; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + width: 60%; + + @media screen and (max-width: 850px) { + width: 100%; + } + } +} + +.image { + background-image: url('/img/site/rag-code-block.svg'); + background-repeat: no-repeat; + background-size: contain; + width: 20.0625rem; + height: 18.11981rem; + + @media screen and (max-width: 850px) { + width: 100%; + height: 18.1198rem; + } + + @media screen and (max-width: 500px) { + display: none; + } +} + +.buttons { + display: flex; + gap: 10px; + + @media screen and (max-width: 850px) { + flex-direction: column; + gap: 10px; + } + + .buttonDark { + width: 10.5625rem; + height: 2.5rem; + flex-shrink: 0; + border-radius: 0.3125rem; + background: #332e75; + display: flex; + justify-content: center; + align-items: center; + + color: #fff; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + } + + .buttonLight { + width: 10.5625rem; + height: 2.5rem; + flex-shrink: 0; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f7f9fd; + display: flex; + justify-content: center; + align-items: center; + + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + } +} diff --git a/src/components/Javascript/Resources/index.jsx b/src/components/Javascript/Resources/index.jsx new file mode 100644 index 0000000000..a2ef03a516 --- /dev/null +++ b/src/components/Javascript/Resources/index.jsx @@ -0,0 +1,110 @@ +import React from 'react'; +import { useState } from 'react'; +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import 'react-tabs/style/react-tabs.css'; +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; +import paths from '/data/paths.json'; + +export default function Resources() { + const resourcesSite = paths.siteSearchTemp; + const resourcesEcommerce = paths.ecommerce; + const resourcesAutomation = paths.automation; + const resourcesChatbots = paths.chatbots; + + const [activeTabIndex, setActiveTabIndex] = useState(0); // State to track the selected tab + + const handleTabSelect = (index) => { + setActiveTabIndex(index); // Update the active tab index when a tab is clicked + }; + + const renderResourceBoxes = (resources) => { + return resources.map((resource, index) => ( + +
+
{index + 1}
+

{resource.title}

+
+

{resource.description}

+ + )); + }; + + return ( +
+
+

Learn

+

+ Use case specific, step-by-step resources to help you build AI-Native + Applications in Javascript. +

+ + + + handleTabSelect(0)} + > + Site Search + + {/* coming soon, to be uncommented when other modules are done */} + {/* handleTabSelect(1)} + > + Chatbots + + handleTabSelect(2)} + > + eCommerce + + handleTabSelect(3)} + > + Automation + */} + + + +
+ {renderResourceBoxes(resourcesSite)} +
+
+ + +
+ {renderResourceBoxes(resourcesChatbots)} +
+
+ + +
+ {renderResourceBoxes(resourcesEcommerce)} +
+
+ + +
+ {renderResourceBoxes(resourcesAutomation)} +
+
+
+
+
+ ); +} diff --git a/src/components/Javascript/Resources/styles.module.scss b/src/components/Javascript/Resources/styles.module.scss new file mode 100644 index 0000000000..637b5e00a1 --- /dev/null +++ b/src/components/Javascript/Resources/styles.module.scss @@ -0,0 +1,171 @@ +.resourcesContainer { + margin-top: 40px; + + h2 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 120%; + margin-bottom: 0.5rem; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + margin-bottom: 2rem; + } +} + +.reactTabs { + display: flex; + justify-content: flex-start; + column-gap: 80px; + + @media (max-width: 768px) { + flex-direction: column; + align-items: center; + } +} + +.tabList { + display: flex; + flex-direction: column; + margin-bottom: 2rem; + padding: 0; + + @media (max-width: 768px) { + flex-direction: row; + justify-content: flex-start; + overflow-x: auto; + white-space: nowrap; + padding-bottom: 10px; + margin: 40px 0px; + width: 100%; + + &::-webkit-scrollbar { + height: 8px; + } + + &::-webkit-scrollbar-thumb { + background-color: #ccc; + border-radius: 10px; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + } + + .tabs { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; + display: block; + margin: 30px 0px; + background: none; + cursor: pointer; + + @media (max-width: 768px) { + margin: 0 10px; + display: inline-block; + font-size: 1.2rem; + } + + &--selected { + background-color: none !important; + color: white; + border-bottom: none; + text-decoration: underline !important; + } + + &:focus { + text-decoration: underline; + background: none; + } + } +} + +.selectedTab { + text-decoration: underline; +} + +.boxesGrid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; + + @media (max-width: 980px) { + grid-template-columns: 1fr; + } +} + +.resourceBox { + width: 21.25rem; + height: 11.4375rem; + flex-shrink: 0; + padding: 20px; + border-radius: 1.25rem; + background: #f7f9fd; + box-shadow: 0px 3px 5px 0px rgba(79, 150, 172, 0.1); + transition: transform 0.2s ease, box-shadow 0.2s ease; + + @media screen and (max-width: 768px) { + width: 100%; + } + + &:hover { + transform: translateY(-5px); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); + } + + .resourceTop { + display: flex; + gap: 15px; + } + + .resourceNumber { + display: flex; + width: 3.375rem; + height: 3.375rem; + background: #130c49; + flex-direction: column; + justify-content: center; + flex-shrink: 0; + border-radius: 0.31rem; + color: #61bd73; + text-align: center; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 130%; + } + + h3 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 130%; + margin-bottom: 0.5rem; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + } +} diff --git a/src/components/Javascript/Steps/index.jsx b/src/components/Javascript/Steps/index.jsx new file mode 100644 index 0000000000..13562a67ee --- /dev/null +++ b/src/components/Javascript/Steps/index.jsx @@ -0,0 +1,151 @@ +import React, { useState } from 'react'; + +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import 'react-tabs/style/react-tabs.css'; + +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +import paths from '/data/paths.json'; + +export default function Steps() { + const resoursesSite = paths.siteSearch; + const resoursesEcommerce = paths.ecommerce; + const resoursesAutomation = paths.automation; + const resoursesChatbots = paths.chatbots; + + return ( +
+
+
+

Learn

+

+ {' '} + Use case specific, step-by-step resources to help you build + AI-Native Applications in Javascript. +

+
+ + + Site Search + Chatbots + eCommerce + Automation + + + +
+ {resoursesSite.map((post) => { + return ( +
+
+
+

{post.title}

+
+
+

{post.description}

+

+ + Learn more + +

+
+
+ ); + })} +
+
+ + +
+ {resoursesChatbots.map((post) => { + return ( +
+
+
+

{post.title}

+
+
+

{post.description}

+

+ + Learn more + +

+
+
+ ); + })} +
+
+ + +
+ {resoursesEcommerce.map((post) => { + return ( +
+
+
+

{post.title}

+
+
+

{post.description}

+

+ + Learn more + +

+
+
+ ); + })} +
+
+ + +
+ {resoursesAutomation.map((post) => { + return ( +
+
+
+

{post.title}

+
+
+

{post.description}

+

+ + Learn more + +

+
+
+ ); + })} +
+
+
+
+
+
+
+
+ Get inspired +

build with Weaviate

+

Look at how developers are building with Weaviate.

+
+ + find out + +
+
+
+
+
+
+
+ ); +} diff --git a/src/components/Javascript/Steps/styles.module.scss b/src/components/Javascript/Steps/styles.module.scss new file mode 100644 index 0000000000..7f4a4a672f --- /dev/null +++ b/src/components/Javascript/Steps/styles.module.scss @@ -0,0 +1,1028 @@ +.container { + padding: 3rem; +} + +@media screen and (max-width: 768px) { + .container { + padding: 2rem; + background-image: url('/img/site/bg-light-mobile.svg'); + background-position-y: 0px; + background-size: cover; + background-repeat: no-repeat; + } +} + +/* Portrait and Landscape */ +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (-webkit-min-device-pixel-ratio: 2) { + .container { + background-size: 100%; + background-repeat: no-repeat; + } +} + +.sliderContainer { + padding: 0rem 3rem; + + @media screen and (max-width: 600px) { + padding: 2rem 0rem; + background: #130c49; + } +} + +.bgCol { + background: #ecf4f8; +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } +} + +.grid { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 110px; + + @media screen and (max-width: 950px) { + margin: none; + gap: 0px; + } + + @media screen and (max-width: 1050px) { + grid-template-columns: 1fr; + margin: 0px 10px; + } +} + +.bottomBar { + height: 12rem; + + display: flex; + place-content: center; + text-align: center; + flex-direction: column; + align-items: center; + + h2 { + color: #130c49; + } + + @media screen and (max-width: 950px) { + height: 20rem; + } +} + +.innerBar { + height: 6em; + display: grid; + grid-template-columns: auto auto auto auto auto; + /* gap: 10px; */ + margin: 0 auto; + align-items: center; + justify-content: space-evenly; + padding: 0 var(--ifm-spacing-horizontal); + width: 100%; + max-width: var(--ifm-container-width-xl); + + @media screen and (max-width: 950px) { + height: 180px; + display: flex; + margin: 0 auto; + padding: 0 var(--ifm-spacing-horizontal); + width: 100%; + max-width: var(--ifm-container-width-xl); + justify-items: left; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + white-space: nowrap; + } +} + +.innerBar > p { + text-align: left; + padding: 20px 0; + + width: 200px; + + @media screen and (max-width: 950px) { + text-align: left; + padding: 20px 0; + color: #ffffff; + grid-column: 1 / span 2; + width: auto; + } +} + +.customerLogo { + background-image: url('/img/site/redhat-logo.svg'); + + background-size: contain; + background-repeat: no-repeat; + + width: 8rem; + height: 3rem; + margin: 0px 10px; + + @media screen and (max-width: 950px) { + grid-row: 1; + grid-column: auto; + } +} + +.redhatLogo { + background-image: url('/img/site/red-hat-logo.svg'); + background-position: center; +} + +.stackoverflowLogo { + background-image: url('/img/site/stack-overflow-logo.svg'); + background-position: center; +} + +.instabaseLogo { + background-image: url('/img/site/instabase-logo.svg'); + background-position: center; +} + +.shippoLogo { + background-image: url('/img/site/shippo-logo.svg'); + background-position: center; +} + +.mulinyLogo { + background-image: url('/img/site/muliny-logo.svg'); + background-position: center; +} +.title { + font-size: 50px; + font-weight: bold; + + margin: 2rem 0rem; + height: 250px; + + @media screen and (max-width: 500px) { + font-size: 53px; + text-align: left; + + height: 200px; + } + + h1 { + color: #130c49; + + font-family: Plus Jakarta Sans; + font-size: 2.625rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3.15rem */ + } +} +.text { + @media screen and (max-width: 800px) { + text-align: left; + width: 347px; + padding: 20px 0; + } +} + +.img { + width: 14rem; + height: 10rem; + + margin: auto; + background-size: contain; + background-repeat: no-repeat; + background-image: url('/img/site/W-logo-3d-shadow.png'); + + @media screen and (max-width: 500px) { + display: none; + } +} + +.buttons { + margin-top: 30px; + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: flex-start; + + @media screen and (max-width: 800px) { + justify-content: left; + } + + a { + width: 11.1875rem; + height: 3.125rem; + + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.375rem; + + background: #61bd73; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + width: 13.1875rem; + } + + .buttonOutline { + color: #ffffff; + + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.638rem */ + border-radius: 0.375rem; + border: 1px solid #61bd73; + background: #130c49; + } +} + +.bottomBars { + height: 10rem; + display: flex; + flex-direction: row; + gap: 80px; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + white-space: nowrap; + + .barText { + color: #2fc514; + font-family: Plus Jakarta Sans; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 2.7rem */ + + span { + color: #fff; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + } + + @media screen and (max-width: 800px) { + overflow-x: auto; + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-around; + align-items: center; + } +} + +.awsBanner { + background-image: url('/img/site/AI-in-prod-NY-web.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-x: center; + margin: 16px auto; + width: 100%; + height: 141px; + @media screen and (max-width: 1600px) and (min-width: 800px) { + background-image: url('/img/site/AI-in-prod-NY-web.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-x: center; + margin: 16px auto; + width: 100%; + height: 141px; + } + + @media screen and (max-width: 800px) and (min-width: 500px) { + background-image: url('/img/site/AI-in-prod-NY-web.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-x: center; + width: 100%; + height: calc(94px + 3.1vw); + } + + @media screen and (max-width: 500px) { + background-image: url('/img/site/AI-in-prod-NY-mobile.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-x: center; + width: 100%; + height: 100px; + } +} + +.codeBlock { + background: #131144; + width: 64.875rem; + height: 32.0625rem; + margin: 4rem; + border-radius: 1.25rem; + border: 1px solid #0073b4; + display: flex; + flex-wrap: wrap; + align-content: space-around; + + @media screen and (max-width: 1090px) { + width: 100%; + + height: 37.0625rem; + margin: 0; + border: none; + } + + @media screen and (max-width: 890px) { + width: 100%; + + height: auto; + margin: 0; + border: none; + } +} + +.lineBar { + width: 100%; + height: 0.0625rem; + background: rgb(0, 115, 180); + position: relative; + top: 32px; + + @media screen and (max-width: 500px) { + display: none; + } +} + +.typeButton { + z-index: 100; + position: absolute; + transform: translate(42px, 60px); + text-align: center; + width: 60.875rem; + border-style: hidden; + height: 2.9375rem; + border-radius: 1.46875rem; + background: #26225e; + color: #fff; + font-family: PT Mono; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 120.83%; + cursor: pointer; + + span { + float: left; + margin-left: 40px; + } +} + +.dropdownContent { + z-index: 100; + position: absolute; + transform: translate(42px, 60px); + text-align: center; + width: 60.875rem; + border-style: hidden; + height: 8.9375rem; + border-radius: 1.46875rem; + background: #26225e; + opacity: 0; /* Start with opacity set to 0 (fully transparent) */ + transition: opacity 0.3s ease-in-out; + + a { + cursor: pointer; + color: #fff; + font-family: PT Mono; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + } + transition: all 1s ease-out; + + ul, + li { + list-style-type: none; + padding: 10px 0px; + margin: 0; + width: 60%; + line-height: 40px; + } + span { + float: left; + margin-left: 40px; + } +} + +.dropdownContentOpen { + z-index: 100; + position: absolute; + transform: translate(42px, 60px); + text-align: center; + width: 60.875rem; + border-style: hidden; + height: 8.9375rem; + border-radius: 1.46875rem; + background: #26225e; + opacity: 1; /* Start with opacity set to 0 (fully transparent) */ + transition: opacity 1s ease-out; + + a { + cursor: pointer; + color: #fff; + font-family: PT Mono; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + } + + ul, + li { + list-style-type: none; + padding: 10px 0px; + margin: 0; + width: 60%; + line-height: 40px; + } + span { + float: left; + margin-left: 40px; + } +} +.codeBlockTitle { + background-image: url('/img/site/three-dots.svg'); + + background-size: contain; + background-repeat: no-repeat; + width: 3rem; + height: 3rem; + position: absolute; + transform: translate(-185px, 15px); + @media screen and (max-width: 1090px) { + display: none; + } + + @media screen and (max-width: 1050px) { + transform: translate(-164px, 15px); + } + + @media screen and (min-width: 2500px) { + transform: translate(-164px, 15px); + } +} + +.cbt2 { + transform: translate(-185px, 15px); + @media screen and (max-width: 500px) { + display: none; + } + + @media screen and (max-width: 1050px) { + transform: translate(-164px, 15px); + } + + @media screen and (min-width: 2500px) { + transform: translate(-164px, 15px); + } +} + +.cbt3 { + transform: translate(-185px, 15px); + @media screen and (max-width: 500px) { + display: none; + } + + @media screen and (max-width: 1050px) { + transform: translate(-164px, 15px); + } + + @media screen and (min-width: 2500px) { + transform: translate(-164px, 15px); + } +} + +.bigLine { + margin-right: 0%; +} + +.codeBlockContent { + display: flex; + flex-wrap: wrap; + flex-direction: row; + align-items: center; + padding: 50px 63px; + align-content: flex-end; + gap: 50px; + + @media screen and (max-width: 600px) { + display: flex; + flex-wrap: wrap; + flex-direction: column; + align-items: center; + align-content: space-around; + gap: 50px; + justify-content: center; + padding: unset; + } +} +.codeBlockContentLeft { + flex: 1 1 0%; + text-align: left; + color: white; + + @media screen and (max-width: 600px) { + padding: 20px; + + h2, + p { + margin: 20px 0px; + } + } + + h2 { + color: #3ccbf4; + font-family: Plus Jakarta Sans; + font-size: 1.125rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.76994rem */ + } + + .slide2Title { + color: #f7cf32; + font-family: Plus Jakarta Sans; + font-size: 1.125rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.76994rem */ + text-transform: uppercase; + } + + .slide3Title { + color: #61bd73; + font-family: Plus Jakarta Sans; + font-size: 1.125rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.76994rem */ + text-transform: uppercase; + } + p { + margin: 40px 0px; + } + + .subTitle { + color: #fff; + font-family: Plus Jakarta Sans; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 1.8rem */ + } +} + +.codeBlockContentRight { + flex: 1; + display: flex; + justify-content: center; + flex-direction: row; + flex-wrap: wrap; + + .codeSnip { + display: flex; + border-radius: 0.9375rem; + border: 1px solid #0073b4; + background: #130c49; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.04); + flex-direction: column; + align-items: center; + justify-content: space-around; + + @media screen and (max-width: 500px) { + height: 100%; + } + } + + pre { + width: 100% !important; + height: 426px; + font-size: 14px !important; + border-radius: 0.93325rem !important; + border: 0.747px solid #0073b4 !important; + background: #262262 !important; + overflow-y: scroll !important; + box-shadow: none !important; + + code { + top: 20px; + position: relative; + } + @media screen and (max-width: 500px) { + display: none !important; + } + } +} + +.codeBlockContentRight .codeBlockTitle, +.codeBlockContentRight .lineBar { + transition: opacity 0.5s ease; + opacity: 1; + pointer-events: all; +} + +.codeBlockContentRight:hover .codeBlockTitle, +.codeBlockContentRight:hover .lineBar { + opacity: 0; + pointer-events: none; + overflow-y: scroll; +} + +.codeImage { + height: 27.9375rem; + width: 24rem; + background-size: 100%; + background-repeat: no-repeat; + background-image: url('/img/site/gen-feedback-code-block.png'); + + @media screen and (min-width: 500px) { + display: none !important; + } + + @media screen and (max-width: 500px) { + width: 22rem; + } +} + +.codeImage01 { + background-image: url('/img/site/hybrid-search-code-block.png'); +} + +.codeImage02 { + background-image: url('/img/site/rag-code-block.png'); +} + +.codeImage03 { + background-image: url('/img/site/gen-feedback-code-block.png'); +} + +.codeImage04 { + background-image: url('/img/site/secure-slide-code-block.png'); +} + +.box { + display: flex; + flex-direction: column; + + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + flex: 1; + + h1 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 3rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: normal; + text-transform: uppercase; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 2.1rem */ + } +} + +.exampleBox { + border-radius: 0.93325rem; + border: 0.747px solid #0073b4; + background: #262262; + width: 26.50388rem; + height: 23.9375rem; + flex: 1; +} + +.homeBanner { + display: block; + background-size: 100%; + background-repeat: no-repeat; + background-position-y: bottom; + max-width: 1029px; + height: 150px; + margin: auto; + + background-image: url('/img/site/ai-in-prod-weaviate.png'); + + @media screen and (max-width: 1600px) and (min-width: 800px) { + max-width: 1029px; + flex-basis: 100%; + height: 150px; + margin: auto; + margin-bottom: -35px; + } + + @media screen and (max-width: 1090px) and (min-width: 800px) { + width: 88%; + height: 150px; + margin-bottom: 30px; + } + @media screen and (max-width: 900px) and (min-width: 800px) { + margin-bottom: 15px; + width: 88%; + height: calc(58px + 3.1vw); + } + + @media screen and (max-width: 800px) and (min-width: 700px) { + background-size: cover; + width: 100%; + max-width: 648px; + height: calc(53px + 3.1vw); + margin: auto auto 15px; + } + @media screen and (max-width: 700px) and (min-width: 600px) { + background-size: cover; + width: 100%; + max-width: 480px; + height: calc(38px + 3.1vw); + margin: auto auto 15px; + } + + @media screen and (max-width: 600px) and (min-width: 500px) { + background-size: cover; + width: 100%; + height: calc(52px + 1.1vw); + margin: auto auto 0px; + } + + @media screen and (max-width: 500px) { + background-image: url('/img/site/ai-in-prod-weaviate-m.png'); + background-size: 100%; + background-repeat: no-repeat; + background-position-y: bottom; + width: 100%; + margin-bottom: 0; + height: calc(94px + 3.1vw); + } +} + +.typeContainer { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.typeBox { + width: 23.5625rem; + height: 16.625rem; + padding: 22px 0px; + margin: 10px 10px 20px; + flex-shrink: 0; + + display: flex; + flex-direction: column; + + /* Updated border with increased radius for more rounded corners */ + border: 1px solid #ccc; + border-radius: 1rem; /* Increased from 0.3125rem for more noticeable rounding */ + + /* Background color */ + background-color: #f5f5f5; + + @media screen and (max-width: 800px) { + width: 100%; + } +} + +.typeIcon { + display: flex; + align-content: flex-end; + align-items: flex-start; + gap: 5px; + height: 150px; + flex-direction: column; + padding: 15px; + + .homeIcon { + background-image: url('/img/site/rag-page-icon-01.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 3.861rem; + height: 3.85056rem; + flex-shrink: 0; + } + + .search { + background-image: url('/img/site/rag-page-icon-02.svg'); + } + + .scale { + background-image: url('/img/site/rag-page-icon-03.svg'); + } + + h2 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 600; + line-height: 144.9%; /* 1.81125rem */ + letter-spacing: -0.0125rem; + } +} + +.ragIcon { + background-image: url('/img/site/homepage-rag-icon.svg'); +} +.genIcon { + background-image: url('/img/site/homepage-gen-icon.svg'); +} + +.typeText { + display: flex; + flex-direction: column; + height: 152px; + gap: 10px; + padding: 15px; + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + a { + color: #61bd73; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + } +} + +.serviceBox { + width: 64.9375rem; + height: 20.6875rem; + padding: 20px; + flex-shrink: 0; + border-radius: 0.625rem; + background: #130c49; + margin: 36px auto; + display: flex; + transform: translateY(-200px); + + @media screen and (max-width: 1080px) { + height: auto; + flex-direction: column; + width: 100%; + margin: 20px 0px; + transform: translateY(-140px); + } +} + +.serviceText { + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding: 20px; + flex: 1; + + @media screen and (max-width: 1080px) { + gap: 20px; + } + + h2 { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3rem */ + @media screen and (max-width: 800px) { + font-size: 2rem; + } + } + + span { + color: #61bb73; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + color: #fff; + font-family: Inter; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 2.25rem */ + + @media screen and (max-width: 800px) { + font-size: 1.2rem; + } + } + + .buttonGradient, + .buttonGradient:hover { + border-radius: 0.375rem; + background: #61bd73; + color: #130c49; + } + + .codeContainer { + display: flex; + gap: 20px; + + i { + font-size: larger; + } + + code { + width: 80%; + + @media screen and (max-width: 800px) { + width: 100%; + } + } + } + + .copyButton { + background: none; + color: white; + } +} + +.serviceIcon { + background-image: url('/img/site/neople-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 10rem; + height: 10rem; +} + +.serviceImage { + background-image: url('/img/site/js-diagram-header.png'); + background-size: contain; + background-repeat: no-repeat; + width: 20.0625rem; + height: 14.4375rem; + border-radius: 0.625rem; + flex: 1; + margin: auto; + + @media screen and (max-width: 1080px) { + flex: auto; + padding: 20px; + } +} diff --git a/src/components/Javascript/Tabs/index.jsx b/src/components/Javascript/Tabs/index.jsx new file mode 100644 index 0000000000..f15ca3a7d1 --- /dev/null +++ b/src/components/Javascript/Tabs/index.jsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import 'react-tabs/style/react-tabs.css'; +import { useState } from 'react'; +import styles from './styles.module.scss'; +// import * as Tabs from '@radix-ui/react-tabs'; +import { LinkButton } from '/src/theme/Buttons'; +import { ButtonContainer } from '../../../theme/Buttons'; +import Image from 'react'; +import Link from '@docusaurus/Link'; +import posts from '/data/templates.json'; +import TabCard from './tabCard'; + +const ProjectTabs = () => { + const reactData = posts.react; + const vueData = posts.vue; + const otherData = posts.others; + + const [activeTabIndex, setActiveTabIndex] = useState(0); + + const handleTabSelect = (index) => { + setActiveTabIndex(index); + }; + + return ( +
+
+
+
+

Templates

+

+ Get template applications to speed up your development. Available + for every use case. +

+
+ + + handleTabSelect(0)} + > + React + + handleTabSelect(2)} + > + Vue + + handleTabSelect(3)} + > + Others + + + + +
+ {reactData.map((post) => { + return ; + })} +
+
+ + +
+ {vueData.map((post) => { + return ; + })} +
+
+ + +
+ {otherData.map((post) => { + return ; + })} +
+
+ + +
+
+
+
+ ); +}; + +export default ProjectTabs; diff --git a/src/components/Javascript/Tabs/styles.module.scss b/src/components/Javascript/Tabs/styles.module.scss new file mode 100644 index 0000000000..492db9966c --- /dev/null +++ b/src/components/Javascript/Tabs/styles.module.scss @@ -0,0 +1,450 @@ +$background-color: #1e1b4b; +$text-color: #ffffff; +$muted-text-color: #9ca3af; +$accent-color: #4f46e5; + +.ecommerce-page { + background-color: $background-color; + color: $text-color; + font-family: Arial, sans-serif; + padding: 2rem; +} + +h1 { + font-size: 2.5rem; + font-weight: bold; + margin-bottom: 0.5rem; +} + +.subtitle { + color: $muted-text-color; + font-size: 1rem; + margin-bottom: 2rem; +} + +.resources-grid, +.projects-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 1.5rem; + margin-bottom: 3rem; +} + +.resource-item, +.project-card { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 0.5rem; + padding: 1.5rem; + + h2 { + font-size: 1.25rem; + font-weight: bold; + margin-bottom: 0.5rem; + } + + p { + color: $muted-text-color; + font-size: 0.875rem; + } +} + +.reactTabs { + display: flex; + justify-content: flex-start; + column-gap: 80px; + + @media (max-width: 768px) { + flex-direction: column; + align-items: center; + } +} + +.tabList { + display: flex; + flex-direction: column; + margin-bottom: 2rem; + padding: 0; + + @media (max-width: 768px) { + flex-direction: row; + justify-content: flex-start; + overflow-x: auto; + white-space: nowrap; + padding-bottom: 10px; + margin: 40px 0px; + width: 100%; + + &::-webkit-scrollbar { + height: 8px; + } + + &::-webkit-scrollbar-thumb { + background-color: #ccc; + border-radius: 10px; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + } + + .tabs { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; + display: block; + margin: 30px 0px; + background: none; + cursor: pointer; + + @media (max-width: 768px) { + margin: 0 10px; + display: inline-block; + font-size: 1.2rem; + } + + &--selected { + background-color: none !important; + color: white; + border-bottom: none; + text-decoration: underline !important; + } + + &:focus { + text-decoration: underline; + background: none; + } + } +} + +.selectedTab { + text-decoration: underline; +} + +.project-card { + display: flex; + flex-direction: column; + + .icon { + font-size: 1.5rem; + margin-bottom: 0.5rem; + } + + h2 { + margin-bottom: 0; + } + + .divider { + background-color: rgba(255, 255, 255, 0.2); + height: 1px; + margin: 1rem 0; + width: 100%; + } + + .commit-message { + font-size: 0.875rem; + margin-bottom: 0.5rem; + } + + .commit-info { + color: $muted-text-color; + display: flex; + font-size: 0.75rem; + justify-content: space-between; + } +} + +.featured-projects { + margin-top: 3rem; +} + +.header { + margin-top: 40px; + + h2 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 120%; + margin-bottom: 0.5rem; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + margin-bottom: 2rem; + } +} + +.info { + flex: 1; + h3, + p { + margin-left: 15px; + } +} + +.latestModule { + display: flex; + gap: 20px; + justify-content: flex-start; + align-items: center; + flex-wrap: wrap; + + padding: 23px 0px; + + @media screen and (max-width: 1050px) { + } +} + +.latestLink { + @media screen and (max-width: 500px) { + width: 100%; + } +} + +.latestBox { + border-radius: 0.9375rem; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + width: 20.0625rem; + height: 21rem; + flex-shrink: 0; + transition: all 0.5s ease-in-out; + + @media screen and (max-width: 500px) { + width: 100%; + } + + .insideBox { + border-radius: 0.9375rem 0.9375rem 0rem 0rem; + background: #1b1464; + height: 11rem; + background-image: url('/img/site/insight_image_01.png'); + background-position: center; + } + + .textBox { + padding: 18px 17px 26px; + + h3 { + h2 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 700; + line-height: 120%; + margin-bottom: 0.5rem; + } + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; + margin-bottom: 2rem; + } + } +} + +.bottomBox { + align-items: flex-end; + display: flex; + flex-direction: row; + justify-content: space-around; +} + +.smallText { + color: #130c49; + font-size: 0.65rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; + margin: 0 0 3px; +} + +.tabs { + display: flex; + flex-direction: row; + gap: 100px; + + @media screen and (max-width: 768px) { + flex-direction: column; + } + + .left { + display: flex; + flex: 1; + border-left: 1px solid #130c49; + + .tabsList { + display: flex; + flex: 1; + flex-direction: column; + gap: 10px; + + .tabsTrigger { + appearance: none; + box-shadow: none; + border: none; + display: flex; + flex-direction: column; + justify-content: flex-start; + flex: 1; + cursor: pointer; + background-color: transparent; + gap: 5px; + padding: 0.5rem; + border-left: 3px solid transparent; + + p { + text-align: left; + display: none; + } + } + .tabsTrigger[data-state='active'] { + border-left: 3px solid #130c49; + + p { + text-align: left; + display: inherit; + } + } + } + } + .right { + display: flex; + flex: 1; + + div[data-state='active'] { + display: flex; + // flex-direction: column; + flex: 1; + + .codeContainer { + display: grid; + grid-template-rows: 1fr auto; + grid-row-gap: 4px; + + height: 460px; + width: 100%; + + .codeImage { + background-size: contain; + height: 100%; + width: 100%; + background-repeat: no-repeat; + @media screen and (max-width: 485px) { + height: 270px; + } + } + + .code1 { + background-image: url('/img/site/code-box-1.png'); + } + .code2 { + background-image: url('/img/site/code-box-2.png'); + } + .code3 { + background-image: url('/img/site/code-box-3.png'); + } + } + } + } +} + +.latestModule::-webkit-scrollbar-thumb:horizontal { + background: #000 !important; + border-radius: 10px !important; +} + +.latestModule::-webkit-scrollbar { + background-color: #f5f5f5 !important; + height: 14px !important; +} + +.latestModule::-webkit-scrollbar-thumb { + background: #2b3854 !important; + margin-bottom: 10px !important; + width: 85px !important; +} + +.latestModule::-webkit-scrollbar-thumb:hover { + background: #b30000 !important; +} + +.latestModule::-webkit-scrollbar-track { + border: 1px solid #130c49 !important; + border-radius: 8px !important; +} + +.buttons { + margin-top: 65px; + gap: 20px; + display: flex; + align-items: center; + justify-content: center; + + @media screen and (max-width: 800px) { + justify-content: left; + } + + a { + height: 45px; + width: 220px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: #61bd73; + color: #130c49; + text-align: center; + transition: all 1s ease-out; + } + .buttonGradient:hover { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: rgb(15, 0, 50); + color: #fff; + font-weight: 400; + } + + .buttonOutline { + color: #130c49; + border-radius: 0.3125rem; + outline: 1px solid #130c49; + transition: all 1s ease-out; + } + .buttonOutline:hover { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: rgb(15, 0, 50); + color: #fff; + font-weight: 400; + } +} + +.smallImage { + border-radius: 50%; + width: 13%; +} diff --git a/src/components/Javascript/Tabs/tabCard.jsx b/src/components/Javascript/Tabs/tabCard.jsx new file mode 100644 index 0000000000..e3103f881d --- /dev/null +++ b/src/components/Javascript/Tabs/tabCard.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +export default function BlogItem(props) { + const { details } = props; + return ( + +
+
+
+

{details.name}

+

{details.tagline}

+
+
+ + ); +} diff --git a/src/components/Learn/Documentation/index.jsx b/src/components/Learn/Documentation/index.jsx new file mode 100644 index 0000000000..78059c3812 --- /dev/null +++ b/src/components/Learn/Documentation/index.jsx @@ -0,0 +1,137 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Documentation() { + return ( +
+
+
+

Documentation

+

How-tos, concepts, guides, and technical references.

+
+
+
+ +
+
+
+

Model provider integrations

+
+
+

+ + With AWS, Cohere, Google, Hugging Face, OpenAI & more + +

+
+
+ + +
+
+
+

How-to: Configure

+
+
+

+ + Configure Weaviate to suit your specific needs + +

+
+
+ + +
+
+
+

How-to: Search

+
+
+

+ + Perform the right queries to find the data you want + +

+
+
+ + +
+
+
+

How-to: Manage data

+
+
+

+ Manage collections & data +

+
+
+ + +
+
+
+

Docs: Concepts

+
+
+

+ Key features and ideas explained +

+
+
+ + +
+
+
+

Docs: API References

+
+
+

+ REST, GraphQL and gRPC API details +

+
+
+ + +
+
+
+

Docs: Client libraries

+
+
+

+ + Client-specific information (Python, TS/JS, Go, Java) + +

+
+
+ +
+
+
+
+ ); +} diff --git a/src/components/Learn/Documentation/styles.module.scss b/src/components/Learn/Documentation/styles.module.scss new file mode 100644 index 0000000000..92e83a8935 --- /dev/null +++ b/src/components/Learn/Documentation/styles.module.scss @@ -0,0 +1,312 @@ +.bgCol { + background: #ecf4f8; +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } + + @media screen and (max-width: 750px) { + br { + display: none; + } + } +} + +.box { + display: flex; + flex-direction: column; + + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + flex: 1; + + h1 { + color: #130c49; + font-size: 3rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: normal; + text-transform: uppercase; + } + + p { + color: #130c49; + + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 2.1rem */ + } +} + +.exampleBox { + border-radius: 0.93325rem; + border: 0.747px solid #0073b4; + background: #262262; + width: 26.50388rem; + height: 23.9375rem; + flex: 1; +} + +.boxContainer { + display: flex; + justify-content: space-between; + + @media screen and (max-width: 1100px) { + display: flex; + gap: 14px; + flex-direction: column; + } +} + +.typeContainer { + display: flex; + flex-wrap: wrap; + flex: 1; + gap: 30px; + + @media screen and (max-width: 600px) { + .linkBox { + width: 100%; + } + } +} + +.typeBox { + max-width: 37.25rem; + width: 100%; + height: 7.5rem; + border-radius: 0.625rem; + background: #fff; + padding: 20px; + flex-shrink: 0; + + display: flex; + flex-direction: column; + justify-content: space-between; + + @media screen and (max-width: 1440px) { + max-width: 100%; + gap: 10px; + justify-content: unset; + height: auto; + } + + @media screen and (max-width: 500px) { + justify-content: stretch; + } +} + +.tall { + @media screen and (max-width: 600px) { + height: auto; + } + + @media screen and (max-width: 450px) { + height: auto; + } +} + +.big { + max-width: 37.25rem; + width: 100%; + height: 22.9375rem; + flex: 1; +} + +.typeIcon { + display: flex; + align-items: flex-start; + gap: 10px; + flex-direction: row; + + .homeIcon { + background-image: url('/img/site/learn-intergrate-icon.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 2.3125rem; + height: 2.3125rem; + flex-shrink: 0; + } + + .starter { + background-image: url('/img/site/learn-starter-icon.svg'); + } + + .howtos { + background-image: url('/img/site/learn-howto-icon.svg'); + } + + .references { + background-image: url('/img/site/learn-references-icon.svg'); + } + + h2 { + color: #130c49; + font-size: 1.25rem; + font-weight: 600; + line-height: 175.9%; + } +} + +.ragIcon { + background-image: url('/img/site/homepage-rag-icon.svg'); +} +.genIcon { + background-image: url('/img/site/homepage-gen-icon.svg'); +} + +.typeText { + display: flex; + flex-direction: column; + height: 230px; + gap: 12px; + justify-content: space-evenly; + + @media screen and (max-width: 1440px) { + gap: 6px; + height: auto; + } + + p { + color: #130c49; + + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + a { + color: #61bd73; + + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + } +} + +.integrations { + display: flex; + flex-direction: column; + height: 120px; + flex-wrap: wrap; + + p { + font-weight: 900; + } +} + +.large { + height: 270px; + justify-content: space-between; +} + +.serviceBox { + max-width: 76.6875rem; + height: 33.75rem; + flex-shrink: 0; + border-radius: 0.625rem; + background: #130c49; + margin: 36px auto; + display: flex; + + gap: 32px; +} + +.serviceText { + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding: 74px; + + @media screen and (max-width: 800px) { + padding: 25px; + } + + h2 { + color: #fff; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3rem */ + + @media screen and (max-width: 800px) { + font-size: 2rem; + } + } + + span { + color: #61bb73; + + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + color: #fff; + + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 2.25rem */ + + @media screen and (max-width: 800px) { + font-size: 1.2rem; + } + } + + .buttonGradient, + .buttonGradient:hover { + border-radius: 0.375rem; + background: #61bd73; + color: #130c49; + } +} + +.serviceIcon { + background-image: url('/img/site/neople-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 10rem; + height: 10rem; +} + +.serviceImage { + background-image: url('/img/site/case-study-background.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 73.125rem; + height: 39.8125rem; + + @media screen and (max-width: 800px) { + display: none; + } +} diff --git a/src/components/Learn/Examples/index.jsx b/src/components/Learn/Examples/index.jsx new file mode 100644 index 0000000000..0444f956eb --- /dev/null +++ b/src/components/Learn/Examples/index.jsx @@ -0,0 +1,178 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Examples() { + return ( +
+
+
+

Code Examples

+

Go straight to the source and view these examples.

+
+
+
+
+
+
+

Recipes

+
+
+

End-to-end code examples for builders.

+
    +
  • + + Python recipes + :{' '} + Integrations (DSPy, Llamalndex, etc.), Reranking, + Search, Multi-tenancy, and more +
  • +
  • + + JS/TS recipes + :{' '} + Integrations (LangChain, etc.), Reranking, + Search, Multi-tenancy, and more +
  • +
+
+
+
+
+
+

Demos

+
+
+

Example projects and demo apps powered by Weaviate

+
    +
  • + + Verba: + {' '} + The Golden RAGtriever +
  • +
  • + + Healthsearch: + {' '} + Generative AI in Healthcare +
  • +
  • + + Awesome-moviate: + {' '} + A Movie Search Engine +
  • +
  • + + See more demos here + +
  • +
+
+
+
+ +
+
+
+

Weaviate repositories

+
+
+

We are proudly open source! Here are our key repositories

+
+
    +
  • + + weaviate: + {' '} + The "core" database & web server +
  • +
  • + + weaviate-python-client: + {' '} + Python client library +
  • +
  • + + typescript-client: + {' '} + TS/JS client library +
  • +
+ +
    +
  • + + weaviate-go-client: + {' '} + Golang client library +
  • +
  • + + java-client: + {' '} + Java client library +
  • +
+
+ + Weaviate repositories on GitHub + +
+
+
+ + {/*
+ Guides +

Build AI-Native Applications with Javascript

+
+

+ A learning resources hub for builders of all levels. Dive into the + world of AI-native applications with Weaviate and JavaScript. +

+ + Learn More + +
+
*/} +
+
+ ); +} diff --git a/src/components/Learn/Examples/styles.module.scss b/src/components/Learn/Examples/styles.module.scss new file mode 100644 index 0000000000..23a7053235 --- /dev/null +++ b/src/components/Learn/Examples/styles.module.scss @@ -0,0 +1,346 @@ +.bgCol { + background: #ecf4f8; +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } + + @media screen and (max-width: 750px) { + br { + display: none; + } + } +} + +.boxContainer { + display: flex; + gap: 30px; + flex-direction: column; + + @media screen and (max-width: 1100px) { + display: flex; + gap: 14px; + flex-direction: column; + } +} + +.typeContainer { + display: flex; + flex-wrap: wrap; + gap: 30px; +} + +.typeBox { + max-width: 37.25rem; + width: 100%; + height: 19.5625rem; + border-radius: 0.625rem; + background: #fff; + padding: 20px; + flex-shrink: 0; + display: flex; + flex-direction: column; + + @media screen and (max-width: 1440px) { + max-width: 31.6rem; + height: auto; + } + + @media screen and (max-width: 1140px) { + max-width: 100%; + height: auto; + } +} + +.big { + max-width: 76.25rem; + width: 100%; + min-height: 18.9375rem; + + @media screen and (max-width: 1440px) { + height: auto; + } + + @media screen and (max-width: 600px) { + height: auto; + } +} + +.typeIcon { + display: flex; + align-items: flex-start; + gap: 10px; + flex-direction: row; + + .homeIcon { + background-image: url('/img/site/learn-recipes-icon.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 2.3125rem; + height: 2.3125rem; + flex-shrink: 0; + } + + .repos { + background-image: url('/img/site/learn-logo-icon.svg'); + } + + .demos { + background-image: url('/img/site/learn-play-icon.svg'); + } + + h2 { + color: #130c49; + font-size: 1.25rem; + font-weight: 600; + line-height: 175.9%; + } +} + +.ragIcon { + background-image: url('/img/site/homepage-rag-icon.svg'); +} +.genIcon { + background-image: url('/img/site/homepage-gen-icon.svg'); +} + +.typeText { + display: flex; + flex-direction: column; + justify-content: space-between; + + @media screen and (max-width: 600px) { + height: auto; + } + + ul { + line-height: 200%; + margin: 10px 0px; + + @media screen and (max-width: 600px) { + height: auto; + } + } + + p { + color: #130c49; + + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + a { + color: #61bd73; + margin: 30px 0px 0px 0px; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + } + + .external { + color: #130c49; + font-weight: 700; + text-decoration-line: underline; + } +} + +.integrations { + display: flex; + flex-direction: column; + height: 120px; + flex-wrap: wrap; + + @media screen and (max-width: 1440px) { + flex-wrap: nowrap; + height: auto; + } +} + +.large { + height: 220px; + justify-content: space-between; + + @media screen and (max-width: 1440px) { + height: auto; + } +} + +.serviceBox { + max-width: 76.6875rem; + height: 33.75rem; + flex-shrink: 0; + border-radius: 0.625rem; + background: #130c49; + margin: 36px auto; + display: flex; + + gap: 32px; +} + +.serviceText { + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding: 74px; + + @media screen and (max-width: 800px) { + padding: 25px; + } + + h2 { + color: #fff; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3rem */ + + @media screen and (max-width: 800px) { + font-size: 2rem; + } + } + + span { + color: #61bb73; + + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + color: #fff; + + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 2.25rem */ + + @media screen and (max-width: 800px) { + font-size: 1.2rem; + } + } + + .buttonGradient, + .buttonGradient:hover { + border-radius: 0.375rem; + background: #61bd73; + color: #130c49; + } +} + +.serviceIcon { + background-image: url('/img/site/neople-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 10rem; + height: 10rem; +} + +.serviceImage { + background-image: url('/img/site/case-study-background.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 73.125rem; + height: 39.8125rem; + + @media screen and (max-width: 800px) { + display: none; + } +} + +.ctaContainer { + max-width: 76.5rem; + width: 100%; + margin: 60px 0px 0px 0px; + height: 12.25rem; + flex-shrink: 0; + border-radius: 0.625rem; + background: url('/img/site/learn-cta-bg.png'); + background-size: cover; + padding: 20px 30px; + display: flex; + flex-direction: column; + justify-content: space-between; + + @media screen and (max-width: 1100px) { + height: auto; + background-position-x: center; + } + + span { + color: #61bb73; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.6875rem */ + text-transform: uppercase; + } + + h2 { + color: #f4f9fd; + font-size: 1.625rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 1.95rem */ + } + + p { + color: #f4f9fd; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } +} + +.innerCta { + display: flex; + justify-content: space-between; + + .button { + border-radius: 0.3125rem; + background: #130c49; + width: 10.625rem; + height: 2.8125rem; + color: #fff; + text-align: center; + font-size: 0.875rem; + font-style: normal; + font-weight: 600; + display: flex; + flex-direction: column; + justify-content: center; + } + + p { + width: 60%; + + @media screen and (max-width: 1100px) { + width: 100%; + } + } + + @media screen and (max-width: 1100px) { + flex-direction: column; + gap: 30px; + } +} diff --git a/src/components/Learn/Further/index.jsx b/src/components/Learn/Further/index.jsx new file mode 100644 index 0000000000..a1aca69756 --- /dev/null +++ b/src/components/Learn/Further/index.jsx @@ -0,0 +1,72 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function GoFurther() { + return ( +
+
+
+

Go Further

+

+ There's much more to explore. Ask questions, learn about the latest + in AI & data science and dive into big topics from the experts. +

+
+
+
+ +
+
+
+

Forum

+
+
+

Ask technical questions to the community & Weaviators

+
+
+ + +
+
+
+

Paper reviews

+
+
+

Digestible summaries of the latest in Al & data science

+
+
+ + +
+
+
+

Podcast

+
+
+

+ Connor & guests dive into big topics & ideas in Al & data + science +

+
+
+ + +
+
+
+

Blog

+
+
+

More from the Weaviate team on what's going on

+
+
+ +
+
+
+
+ ); +} diff --git a/src/components/Learn/Further/styles.module.scss b/src/components/Learn/Further/styles.module.scss new file mode 100644 index 0000000000..76cf49488c --- /dev/null +++ b/src/components/Learn/Further/styles.module.scss @@ -0,0 +1,179 @@ +.bgCol { + background: #ecf4f8; +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + width: 70%; + + @media screen and (max-width: 1050px) { + width: 100%; + } + } + @media screen and (max-width: 950px) { + width: 100%; + } + + @media screen and (max-width: 750px) { + br { + display: none; + } + } +} + +.grid { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 110px; + + @media screen and (max-width: 950px) { + margin: none; + gap: 0px; + } + + @media screen and (max-width: 1050px) { + grid-template-columns: 1fr; + margin: 0px 10px; + } +} + +.boxContainer { + display: flex; + gap: 30px; + flex-direction: column; + + @media screen and (max-width: 1100px) { + display: flex; + gap: 10px; + flex-direction: column; + } +} + +.typeContainer { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + + @media screen and (max-width: 1440px) { + justify-content: flex-start; + gap: 10px; + } +} + +.typeBox { + max-width: 15.8rem; + width: 100%; + height: 11.5625rem; + border-radius: 0.625rem; + background: #fff; + padding: 20px; + flex-shrink: 0; + display: flex; + flex-direction: column; + + @media screen and (max-width: 540px) { + max-width: 100%; + margin: 10px 0px; + height: auto; + } +} + +.big { + max-width: 76.25rem; + width: 100%; + height: 22.9375rem; +} + +.typeIcon { + display: flex; + align-items: flex-start; + gap: 10px; + flex-direction: row; + + .homeIcon { + background-image: url('/img/site/learn-forum-icon.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 2.3125rem; + height: 2.3125rem; + flex-shrink: 0; + } + + .papers { + background-image: url('/img/site/learn-paper-icon.svg'); + } + + .podcast { + background-image: url('/img/site/learn-podcast-icon.svg'); + } + + .blog { + background-image: url('/img/site/learn-blog-icon.svg'); + } + + h2 { + color: #130c49; + font-size: 1.25rem; + font-weight: 600; + line-height: 175.9%; + } +} + +.ragIcon { + background-image: url('/img/site/homepage-rag-icon.svg'); +} +.genIcon { + background-image: url('/img/site/homepage-gen-icon.svg'); +} + +.typeText { + display: flex; + flex-direction: column; + max-width: max-content; + width: 100%; + gap: 12px; + + ul { + line-height: 240%; + } + + p { + color: #130c49; + + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + a { + color: #61bd73; + + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + } +} + +.integrations { + display: flex; + flex-direction: column; + height: 120px; + flex-wrap: wrap; +} + +.large { + height: 270px; + justify-content: space-between; +} diff --git a/src/components/Learn/GetStarted/index.jsx b/src/components/Learn/GetStarted/index.jsx new file mode 100644 index 0000000000..797e48d292 --- /dev/null +++ b/src/components/Learn/GetStarted/index.jsx @@ -0,0 +1,134 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function GetStarted() { + return ( +
+
+
+

Get Started

+

+ See what you can do with Weaviate through demos and hands-on guides. +

+
+
+
+
+
+
+

Quickstart guide

+
+
+

Essential concepts demonstrated (20-30 minutes).

+
    +
  • + + Quickstart: cloud + {' '} + (Weaviate Cloud & cloud inference API) +
  • +
  • + + Quickstart: local + {' '} + (Docker & Ollama) +
  • +
+
+
+
+
+
+

Live Online Workshops

+
+
+

+ Instructor-led, live workshops for varying experience levels + (60 minutes). +

+
    +
  • + + Register here + {' '} + for workshops and other events. +
  • +
+
+
+
+ +
+
+
+

Docs: Starter guides

+
+
+

Guides for key topics.

+
    +
  • + + Connect to Weaviate + +
  • +
  • + + Generative search (RAG) + {' '} +
  • +
  • + + Which Weaviate is right for me? + {' '} +
  • +
  • + + Collection definitions & data schema + {' '} +
  • +
  • + + Managing resources (hot, warm & cold) + {' '} +
  • +
+ + More starter guides + +
+
+
+
+
+ ); +} diff --git a/src/components/Learn/GetStarted/styles.module.scss b/src/components/Learn/GetStarted/styles.module.scss new file mode 100644 index 0000000000..912f49d2f4 --- /dev/null +++ b/src/components/Learn/GetStarted/styles.module.scss @@ -0,0 +1,238 @@ +.bgCol { + background: #ecf4f8; +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } + + @media screen and (max-width: 750px) { + br { + display: none; + } + } +} + +.boxContainer { + display: flex; + gap: 10px; + + @media screen and (max-width: 1100px) { + display: flex; + + flex-direction: column; + } +} + +.typeContainer { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.typeBox { + max-width: 38.25rem; + width: 100%; + min-height: 12.125rem; /* Change height to min-height */ + border-radius: 0.625rem; + background: #fff; + padding: 20px; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: space-between; + + @media screen and (max-width: 1100px) { + width: 100%; + max-width: 100%; + min-height: auto; + } +} + +.big { + max-width: 37.25rem; + width: 100%; + min-height: 24.9375rem; /* Adjust as above */ + + @media screen and (max-width: 1100px) { + width: 100%; + max-width: 100%; + min-height: auto; + } +} + +.typeIcon { + display: flex; + align-items: flex-start; + gap: 10px; + flex-direction: row; + + .homeIcon { + background-image: url('/img/site/learn-quickstart-icon.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 2.3125rem; + height: 2.3125rem; + flex-shrink: 0; + } + + .docs { + background-image: url('/img/site/learn-docs-icon.svg'); + } + + .workshops { + background-image: url('/img/site/learn-workshop-icon.svg'); + } + + h2 { + color: #130c49; + font-size: 1.25rem; + font-weight: 600; + line-height: 175.9%; + } +} + +.ragIcon { + background-image: url('/img/site/homepage-rag-icon.svg'); +} +.genIcon { + background-image: url('/img/site/homepage-gen-icon.svg'); +} + +.typeText { + display: flex; + flex-direction: column; + flex-grow: 1; /* Allow the text container to grow */ + gap: 30px; + overflow-wrap: break-word; /* Prevent overflow */ + + p { + color: #130c49; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + a { + color: #61bd73; + font-size: 0.875rem; + margin: 20px 0px 0px 0px; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + } + + .external { + color: #130c49; + font-weight: 400; + text-decoration-line: underline; + } + + .bold { + font-weight: 700; + } +} + +.large { + justify-content: space-between; + + @media screen and (max-width: 1100px) { + height: auto; + } +} + +.serviceBox { + max-width: 76.6875rem; + height: 33.75rem; + flex-shrink: 0; + border-radius: 0.625rem; + background: #130c49; + margin: 36px auto; + display: flex; + + gap: 32px; +} + +.serviceText { + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding: 74px; + + @media screen and (max-width: 800px) { + padding: 25px; + } + + h2 { + color: #fff; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3rem */ + + @media screen and (max-width: 800px) { + font-size: 2rem; + } + } + + span { + color: #61bb73; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + color: #fff; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 2.25rem */ + + @media screen and (max-width: 800px) { + font-size: 1.2rem; + } + } + + .buttonGradient, + .buttonGradient:hover { + border-radius: 0.375rem; + background: #61bd73; + color: #130c49; + } +} + +.serviceIcon { + background-image: url('/img/site/neople-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 10rem; + height: 10rem; +} + +.serviceImage { + background-image: url('/img/site/case-study-background.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 73.125rem; + height: 39.8125rem; + + @media screen and (max-width: 800px) { + display: none; + } +} diff --git a/src/components/Learn/Guides/index.jsx b/src/components/Learn/Guides/index.jsx new file mode 100644 index 0000000000..11451567c1 --- /dev/null +++ b/src/components/Learn/Guides/index.jsx @@ -0,0 +1,190 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Guides() { + return ( +
+
+
+

Guided Courses

+

Structured learning paths for Weaviate mastery.

+
+
+
+
+
+

Weaviate Academy

+
+ +
+

End-to-end courses designed by the Weaviate team.

+ +
+
    + Featured units +
  • + + PY_101T: Work with text data + +
  • +
  • + + PY_101V: Work with your own vectors + +
  • +
  • + + PY_101M: Work with multimodal data + +
  • +
  • + + PY_250: Vector compression + +
  • +
  • + + PY_280: Multi-tenancy + +
  • +
+ +
    + Short units / theory +
  • + + Which search is right for me? + +
  • +
  • + + Chunking long texts + +
  • +
  • + + Run Weaviate on Kubernetes + +
  • +
+
+ + + Go to Weaviate Academy + +
+
+
+
+
+
+

External courses

+
+
+

Courses created in conjunction with partners

+ Featured +
    +
  • + DeepLearning.AI:{' '} + + Vector Databases: from Embeddings to Applications + +
  • +
  • + Linkedin Learning:{' '} + + Introduction to AI-Native Vector Databases + +
  • +
+
+
+
+
+
+

Workshops & webinars

+
+
+

+ Intermediate level workshops, or webinars with industry users +

+
    +
  • + + Intro to Hybrid Search: + {' '} + Combining the power of keyword and vector search +
  • +
  • + + Build AI apps with Weaviate's TypeScript client: + {' '} + Vue.js, React.js and Angular.js +
  • +
+ + + More workshops & webinars + +
+
+
+
+ +
+ Live online workshop +

Intro to building applications with Weaviate

+
+

+ Learn why vector databases are great, how to create one with + Weaviate, and how to use

it with real data, including a + demo app and an end-to-end Jupyter notebook example. +

+ + Register for Free + +
+
+
+
+ ); +} diff --git a/src/components/Learn/Guides/styles.module.scss b/src/components/Learn/Guides/styles.module.scss new file mode 100644 index 0000000000..542fd7d022 --- /dev/null +++ b/src/components/Learn/Guides/styles.module.scss @@ -0,0 +1,332 @@ +.bgCol { + background: #ecf4f8; +} + +.header { + width: 70%; + margin: 30px 0px; + + p { + color: #130c49; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } + + @media screen and (max-width: 750px) { + br { + display: none; + } + } +} + +.boxContainer { + display: flex; + justify-content: space-between; + gap: 17px; + flex-wrap: wrap; + + @media screen and (max-width: 1100px) { + display: flex; + gap: 14px; + flex-direction: column; + } +} + +.typeContainer { + display: flex; + gap: 22px; + + @media screen and (max-width: 1100px) { + display: flex; + gap: 14px; + flex-direction: column; + } +} + +.typeBox { + max-width: 39.25rem; + width: 100%; + min-height: 17.7rem; + border-radius: 0.625rem; + background: #fff; + padding: 20px; + + display: flex; + flex-direction: column; + + @media screen and (max-width: 1440px) { + height: auto; + } + @media screen and (max-width: 1100px) { + width: 100%; + max-width: 100%; + } +} + +.big { + max-width: 76.25rem; + width: 100%; + min-height: 20.9375rem; + + @media screen and (max-width: 1100px) { + width: 100%; + max-width: 100%; + height: auto; + } +} + +.typeIcon { + display: flex; + align-items: flex-start; + gap: 10px; + flex-direction: row; + + .homeIcon { + background-image: url('/img/site/learn-courses-icon.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 2.3125rem; + height: 2.3125rem; + flex-shrink: 0; + } + + .docs { + background-image: url('/img/site/learn-academy-icon.svg'); + } + + .workshops { + background-image: url('/img/site/learn-videos-icon.svg'); + } + + h2 { + color: #130c49; + font-size: 1.25rem; + font-weight: 600; + line-height: 175.9%; + } +} + +.ragIcon { + background-image: url('/img/site/homepage-rag-icon.svg'); +} +.genIcon { + background-image: url('/img/site/homepage-gen-icon.svg'); +} + +.typeText { + display: flex; + flex-direction: column; + width: 560px; + gap: 12px; + + flex-grow: 1; /* Allow the text container to grow */ + overflow-wrap: break-word; /* Prevent overflow */ + + p { + color: #130c49; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + a { + color: #61bd73; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + } + + @media screen and (max-width: 1440px) { + width: unset; + } + .external { + color: #130c49; + font-weight: 400; + text-decoration-line: underline; + } + + .bold { + font-weight: 700; + } +} + +.large { + align-items: flex-start; + width: unset; +} + +.featuredList { + display: flex; + justify-content: flex-start; + gap: 270px; + align-items: center; + + @media screen and (max-width: 1100px) { + display: flex; + gap: 14px; + flex-direction: column; + align-items: flex-start; + } +} + +.serviceBox { + max-width: 76.6875rem; + height: 33.75rem; + flex-shrink: 0; + border-radius: 0.625rem; + background: #130c49; + margin: 36px auto; + display: flex; + + gap: 32px; +} + +.serviceText { + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding: 74px; + + @media screen and (max-width: 800px) { + padding: 25px; + } + + h2 { + color: #fff; + font-size: 2.5rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 3rem */ + + @media screen and (max-width: 800px) { + font-size: 2rem; + } + } + + span { + color: #61bb73; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + color: #fff; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 2.25rem */ + + @media screen and (max-width: 800px) { + font-size: 1.2rem; + } + } + + .buttonGradient, + .buttonGradient:hover { + border-radius: 0.375rem; + background: #61bd73; + color: #130c49; + } +} + +.serviceIcon { + background-image: url('/img/site/neople-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 10rem; + height: 10rem; +} + +.serviceImage { + background-image: url('/img/site/case-study-background.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 73.125rem; + height: 39.8125rem; + + @media screen and (max-width: 800px) { + display: none; + } +} + +.ctaContainer { + max-width: 76.5rem; + width: 100%; + margin: 60px 0px 0px 0px; + height: 12.25rem; + flex-shrink: 0; + border-radius: 0.625rem; + background: url('/img/site/learn-cta-bg.png'); + background-size: cover; + padding: 20px 30px; + display: flex; + flex-direction: column; + justify-content: space-between; + + @media screen and (max-width: 1100px) { + height: auto; + background-position-x: center; + } + + span { + color: #61bb73; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.6875rem */ + text-transform: uppercase; + } + + h2 { + color: #f4f9fd; + font-size: 1.625rem; + font-style: normal; + font-weight: 700; + line-height: 120%; /* 1.95rem */ + } + + p { + color: #f4f9fd; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } +} + +.innerCta { + display: flex; + justify-content: space-between; + + .button { + border-radius: 0.3125rem; + background: #130c49; + width: 10.625rem; + height: 2.8125rem; + color: #fff; + text-align: center; + font-size: 0.875rem; + font-style: normal; + font-weight: 600; + display: flex; + flex-direction: column; + justify-content: center; + } + + @media screen and (max-width: 1100px) { + flex-direction: column; + gap: 30px; + } +} diff --git a/src/components/Learn/Header/index.jsx b/src/components/Learn/Header/index.jsx new file mode 100644 index 0000000000..febd018eb2 --- /dev/null +++ b/src/components/Learn/Header/index.jsx @@ -0,0 +1,20 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Header() { + return ( +
+
+
+
+

Weaviate Learning Center

+

A learning resources hub for builders of all levels.

+
+
+
+
+ ); +} diff --git a/src/components/Learn/Header/styles.module.scss b/src/components/Learn/Header/styles.module.scss new file mode 100644 index 0000000000..006d4756ad --- /dev/null +++ b/src/components/Learn/Header/styles.module.scss @@ -0,0 +1,82 @@ +.headerHome { + background: url('/img/site/bg-3d-slim.png') #dce8ee; + + background-size: cover; + background-position-x: right; + background-repeat: no-repeat; + + @media screen and (max-width: 600px) { + background: url('/img/site/3d-weaviate-bubble-blur-bg.jpg') #dce8ee; + background-size: cover; + background-position-x: right; + background-repeat: no-repeat; + } +} + +.grid { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 110px; + + @media screen and (max-width: 950px) { + margin: none; + gap: 0px; + } + + @media screen and (max-width: 1050px) { + grid-template-columns: 1fr; + margin: 0px 10px; + } + @media screen and (max-width: 850px) { + flex-direction: column; + } +} + +.box { + display: flex; + flex-direction: column; + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + flex: 1; + gap: 20px; + + h1 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2.5rem; + font-style: normal; + font-weight: 600; + line-height: normal; + + @media screen and (max-width: 500px) { + br { + display: none; + } + } + + @media screen and (max-width: 400px) { + font-size: 2.3rem; + } + } + + span { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: normal; + text-transform: uppercase; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1.5rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 2.1rem */ + } +} diff --git a/src/components/Learn/Resources/index.jsx b/src/components/Learn/Resources/index.jsx new file mode 100644 index 0000000000..0c74ddc6f2 --- /dev/null +++ b/src/components/Learn/Resources/index.jsx @@ -0,0 +1,31 @@ +import React, { useState } from 'react'; +import { ButtonContainer } from '../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Resources() { + return ( +
+
+
+
    + Get started +
+
    + Guided courses +
+
    + Documentation +
+
    + Code examples +
+
    + Go further +
+
+
+
+ ); +} diff --git a/src/components/Learn/Resources/styles.module.scss b/src/components/Learn/Resources/styles.module.scss new file mode 100644 index 0000000000..72a29007f6 --- /dev/null +++ b/src/components/Learn/Resources/styles.module.scss @@ -0,0 +1,90 @@ +.container { + padding: 2rem; +} + +.bgCol { + background: #130c49; +} + +.header { + width: 70%; + margin: 30px 0px; + + h2 { + color: #ffffff; + } + + p { + color: #130c49; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.57331rem */ + } + @media screen and (max-width: 950px) { + width: 100%; + } +} + +.boxContainer { + display: flex; + justify-content: center; + gap: 50px; + flex-direction: row; + flex-wrap: wrap; + + p { + color: #ffffff; + } + ul { + color: #ffffff; + max-width: 210px; + width: 100%; + margin: 0; + + @media screen and (max-width: 1400px) { + max-width: 180px; + } + + @media screen and (max-width: 800px) { + width: 100%; + } + + @media screen and (max-width: 500px) { + width: 100%; + max-width: 160px; + } + } + + a { + color: #ffffff; + + font-size: 1.125rem; + font-style: normal; + font-weight: 600; + line-height: 163.8%; /* 1.84275rem */ + + margin-left: -13px; + transition: all 0.5s ease; + } + + a:hover { + color: #61bd73; + text-decoration-line: underline; + } + + @media screen and (max-width: 1300px) { + gap: 20px; + } + @media screen and (max-width: 1050px) { + display: flex; + gap: 10px; + flex-flow: wrap; + flex-direction: unset; + justify-content: flex-start; + } + + @media screen and (max-width: 800px) { + gap: 6px; + } +} diff --git a/src/components/Marketplace/AppFilter.jsx b/src/components/Marketplace/AppFilter.jsx index 6b3b6261fe..7f84232acd 100644 --- a/src/components/Marketplace/AppFilter.jsx +++ b/src/components/Marketplace/AppFilter.jsx @@ -8,7 +8,7 @@ const categoryDescriptions = { All: 'Browse all available apps.', 'Cloud Tools': 'Improve developer experience and accessibility for non-technical users. Available only in Weaviate Cloud.', - 'AI-Native Apps': 'Simplify the development of end-to-end AI solutions.', + 'AI-Native Services': 'Simplify the development of end-to-end AI solutions.', }; export default function AppFilter() { @@ -16,10 +16,6 @@ export default function AppFilter() { const [selectedCategory, setSelectedCategory] = useState('All'); const location = useLocation(); - useEffect(() => { - console.log(appData); - }, []); - const handleSearchChange = (e) => { setSearchQuery(e.target.value); }; @@ -28,13 +24,20 @@ export default function AppFilter() { setSelectedCategory(category); }; - const filteredApps = appData.filter((app) => { - return ( - (selectedCategory === 'All' || app.category === selectedCategory) && - (app.name.toLowerCase().includes(searchQuery.toLowerCase()) || - app.description.toLowerCase().includes(searchQuery.toLowerCase())) - ); - }); + // Add sorting logic here + const sortedApps = (apps) => { + return apps.sort((a, b) => a.id - b.id); // Sort by numeric `id` + }; + + const filteredApps = sortedApps( + appData.filter((app) => { + return ( + (selectedCategory === 'All' || app.category === selectedCategory) && + (app.name.toLowerCase().includes(searchQuery.toLowerCase()) || + app.description.toLowerCase().includes(searchQuery.toLowerCase())) + ); + }) + ); const renderCardsByCategory = (category) => { const appsInCategory = filteredApps.filter( @@ -86,12 +89,14 @@ export default function AppFilter() { Cloud Tools
  • handleCategoryChange('AI-Native Apps')} + onClick={() => handleCategoryChange('AI-Native Services')} className={ - selectedCategory === 'AI-Native Apps' ? styles.active : '' + selectedCategory === 'AI-Native Services' + ? styles.active + : '' } > - AI-Native Apps + AI-Native Services
  • diff --git a/src/components/Marketplace/card.jsx b/src/components/Marketplace/card.jsx index cb5b3214ee..d9466f5f4c 100644 --- a/src/components/Marketplace/card.jsx +++ b/src/components/Marketplace/card.jsx @@ -21,7 +21,7 @@ export default function AppCard({ app }) { ) : app.privateBeta ? (
    Private Beta
    ) : ( -
    Coming Soon
    +
    Coming Soon
    )} {app.url && Learn More} diff --git a/src/components/Marketplace/styles.module.scss b/src/components/Marketplace/styles.module.scss index c3a3d538ca..e6c9abf21f 100644 --- a/src/components/Marketplace/styles.module.scss +++ b/src/components/Marketplace/styles.module.scss @@ -1053,16 +1053,7 @@ width: 36.875rem; height: 20rem; flex-shrink: 0; - background: linear-gradient( - 216deg, - rgba(0, 183, 226, 0.3) 0.75%, - rgba(1, 185, 215, 0.3) 4.69%, - rgba(12, 199, 150, 0.3) 29.31%, - rgba(20, 211, 99, 0.3) 51.97%, - rgba(26, 219, 62, 0.3) 71.67%, - rgba(30, 224, 40, 0.3) 88.42%, - rgba(32, 226, 32, 0.3) 98.27% - ); + background: url('/img/site/workbench-overview-bg.png') no-repeat center center; display: flex; justify-content: center; align-items: center; @@ -1090,7 +1081,7 @@ @media (max-width: 768px) { .overviewImage { - width: 22rem; + width: 100%; height: 14rem; } @@ -1124,10 +1115,21 @@ height: 10rem; margin-right: 1px; } +} + +.overviewImage .embeddings { + width: 25.91263rem; + height: 15.49019rem; + flex-shrink: 0; + + @media screen and (max-width: 1025px) { + width: 100%; + height: 10rem; + } @media screen and (max-width: 500px) { - width: 8rem; - height: 8rem; + width: 100%; + height: 11rem; } } @@ -1198,7 +1200,6 @@ p { color: #130c4980; - font-size: 1rem; font-style: normal; font-weight: 400; @@ -1219,11 +1220,15 @@ ul { color: #130c4980; - font-size: 1rem; font-style: normal; font-weight: 400; line-height: 150%; /* 1.5rem */ + width: 600px; + + @media screen and (max-width: 1100px) { + width: 100%; + } } } @@ -1424,6 +1429,22 @@ line-height: 140.5%; } +.tba { + background: #c3c5d8; + color: #130c49; + width: 140px; + height: 35px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.325rem; + text-align: center; + font-size: 0.75rem; + font-style: normal; + font-weight: 400; + line-height: 140.5%; +} + .categorySection { margin: 30px 0px; } diff --git a/src/components/PartnersMarketplace/Card.jsx b/src/components/PartnersMarketplace/Card.jsx new file mode 100644 index 0000000000..a447dd5b5c --- /dev/null +++ b/src/components/PartnersMarketplace/Card.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import styles from './styles.module.scss'; +import partners from '/data/partners.json'; + +function Card({ name, image, link, description, tags }) { + return ( +
    +
    +

    {name}

    + {image && ( + {`${name} + )} + +

    {description}

    +
    + {tags.map((tag) => ( + + {tag} + + ))} +
    + + Learn More + +
    +
    + ); +} + +export default Card; diff --git a/src/components/PartnersMarketplace/CardsFilter.jsx b/src/components/PartnersMarketplace/CardsFilter.jsx new file mode 100644 index 0000000000..ceab6b4959 --- /dev/null +++ b/src/components/PartnersMarketplace/CardsFilter.jsx @@ -0,0 +1,98 @@ +import React, { useState, useEffect } from 'react'; +import partners from '/data/partners.json'; +import Card from './Card.jsx'; +import SideFilter from './SideFilter.jsx'; +import styles from './styles.module.scss'; + +function CardsFilter() { + const [searchQuery, setSearchQuery] = useState(''); + const [selectedFilters, setSelectedFilters] = useState([]); + const [filteredPartners, setFilteredPartners] = useState(partners); + + const handleSearch = (event) => + setSearchQuery(event.target.value.toLowerCase()); + + const handleFilterChange = (filters) => setSelectedFilters(filters); + + const removeFilter = (filterToRemove) => { + setSelectedFilters( + selectedFilters.filter((filter) => filter !== filterToRemove) + ); + }; + + useEffect(() => { + let updatedPartners = partners; + + if (searchQuery) { + updatedPartners = updatedPartners.filter( + (partner) => + partner.name.toLowerCase().includes(searchQuery) || + partner.description.toLowerCase().includes(searchQuery) + ); + } + + if (selectedFilters.length > 0) { + updatedPartners = updatedPartners.filter((partner) => { + const tags = partner.tags || []; + const maintainedBy = partner.maintainedBy || ''; + const programmingLanguage = partner.programmingLanguage || ''; + const weaviateFeatures = partner.weaviateFeatures || ''; + + return selectedFilters.every( + (filter) => + tags.includes(filter) || + maintainedBy.includes(filter) || + programmingLanguage.includes(filter) || + weaviateFeatures.includes(filter) + ); + }); + } + + setFilteredPartners(updatedPartners); + }, [searchQuery, selectedFilters]); + + return ( +
    + +
    + + +
    + {selectedFilters.map((filter) => ( + removeFilter(filter)} + > + {filter} ✕ + + ))} +
    + +
    + {filteredPartners.map((partner) => ( + + ))} +
    +
    +
    + ); +} + +export default CardsFilter; diff --git a/src/components/PartnersMarketplace/DocVersion/Card.jsx b/src/components/PartnersMarketplace/DocVersion/Card.jsx new file mode 100644 index 0000000000..1f0bb73707 --- /dev/null +++ b/src/components/PartnersMarketplace/DocVersion/Card.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import styles from './styles.module.scss'; + +function Card({ name, image, link, description, tags }) { + return ( +
    + {`${name} +
    +

    {name}

    +

    {description}

    +
    + {tags.map((tag) => ( + + {tag} + + ))} +
    + + Learn More + +
    +
    + ); +} + +export default Card; diff --git a/src/components/PartnersMarketplace/DocVersion/CardsFilter.jsx b/src/components/PartnersMarketplace/DocVersion/CardsFilter.jsx new file mode 100644 index 0000000000..c2f3d52b12 --- /dev/null +++ b/src/components/PartnersMarketplace/DocVersion/CardsFilter.jsx @@ -0,0 +1,49 @@ +import React, { useState, useEffect } from 'react'; +import partners from '/data/partners.json'; +import Card from './Card.jsx'; +import styles from './styles.module.scss'; + +function CardsFilter() { + const [searchQuery, setSearchQuery] = useState(''); + const [filteredPartners, setFilteredPartners] = useState(partners); + + // Function to handle search input changes + const handleSearch = (event) => { + const query = event.target.value.toLowerCase(); + setSearchQuery(query); + setFilteredPartners( + partners.filter( + (partner) => + partner.name.toLowerCase().includes(query) || + partner.description.toLowerCase().includes(query) || + partner.tags.some((tag) => tag.toLowerCase().includes(query)) + ) + ); + }; + + return ( +
    + +
    + {filteredPartners.map((partner) => ( + + ))} +
    +
    + ); +} + +export default CardsFilter; diff --git a/src/components/PartnersMarketplace/DocVersion/styles.module.scss b/src/components/PartnersMarketplace/DocVersion/styles.module.scss new file mode 100644 index 0000000000..a9d25c706a --- /dev/null +++ b/src/components/PartnersMarketplace/DocVersion/styles.module.scss @@ -0,0 +1,41 @@ +.cardsContainer { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +.card { + border: 1px solid #e0e0e0; + border-radius: 8px; + padding: 1rem; + width: 300px; +} + +.cardImage { + width: 50px; + height: 50px; +} + +.cardContent { + margin-top: 1rem; +} + +.cardTags { + margin-top: 0.5rem; +} + +.cardTag { + display: inline-block; + background-color: #f0f0f0; + padding: 0.25rem 0.5rem; + margin: 0.25rem 0.25rem 0.25rem 0rem; + border-radius: 4px; +} + +.searchInput { + margin-bottom: 1rem; + padding: 0.5rem; + width: 100%; + border: 1px solid #e0e0e0; + border-radius: 8px; +} diff --git a/src/components/PartnersMarketplace/Header/index.jsx b/src/components/PartnersMarketplace/Header/index.jsx new file mode 100644 index 0000000000..77f5507080 --- /dev/null +++ b/src/components/PartnersMarketplace/Header/index.jsx @@ -0,0 +1,36 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function ServiceHeader() { + return ( +
    +
    +
    +

    Integration Ecosystem

    +
    +

    + Find new ways to extend your applications and infrastructure with + our integration ecosystem. +

    +
    +
    + + Model Providers + + + Integrations + +
    +
    +
    +
    + ); +} diff --git a/src/components/PartnersMarketplace/Header/styles.module.scss b/src/components/PartnersMarketplace/Header/styles.module.scss new file mode 100644 index 0000000000..9a62b32267 --- /dev/null +++ b/src/components/PartnersMarketplace/Header/styles.module.scss @@ -0,0 +1,185 @@ +.buttons { + margin-top: 30px; + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + a { + height: 45px; + width: 220px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + width: 10.5625rem; + height: 2.5rem; + flex-shrink: 0; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f7f9fd; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + } + + .buttonOutline { + border-radius: 0.3125rem; + background: #fff; + color: #130c49; + text-align: center; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: 157.33%; + } +} + +p { + font-size: 1.2rem; + margin-bottom: 10px; +} + +.box { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + + h1 { + color: #130c49; + font-family: Plus Jakarta Sans; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; + margin-bottom: 1rem; + } + + .headerBox { + width: 50%; + @media screen and (max-width: 900px) { + width: 100%; + } + + p { + color: #130c49; + } + } + + hr { + background: #130c49; + width: 65rem; + height: 0.0625rem; + + @media screen and (max-width: 900px) { + width: 100%; + } + } +} + +.buttonGradient { + width: 10.5625rem; + height: 2.5rem; + flex-shrink: 0; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #130c49; + color: #f7f9fd; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + + line-height: 157.33%; /* 1.37663rem */ + display: flex; + justify-content: center; + align-items: center; + + &:hover { + color: #f7f9fd; + } +} + +.buttonOutline { + width: 10.5625rem; + height: 2.5rem; + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f4f4f4; + padding: 9px; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; /* 1.37663rem */ + transition: all 1s ease-out; + display: flex; + justify-content: center; + align-items: center; + + &:hover { + color: #130c49; + } +} + +.buttonsContainer { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: 30px; + padding: 20px 0px 10px; + + @media screen and (max-width: 900px) { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + gap: 10px; + padding: 20px 0px 10px; + } +} + +.headerSecurity { + background: #f5f5f5; + background-image: url('/img/site/3d-pricing-banner.png'); + background-size: cover; + + @media screen and (max-width: 500px) { + background-image: url('/img/site/3d-pricing-banner.png'); + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + } +} + +.topText { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 120%; /* 1.5rem */ + text-transform: uppercase; + margin: 10px 0px; +} diff --git a/src/components/PartnersMarketplace/SideFilter.jsx b/src/components/PartnersMarketplace/SideFilter.jsx new file mode 100644 index 0000000000..171861d6e5 --- /dev/null +++ b/src/components/PartnersMarketplace/SideFilter.jsx @@ -0,0 +1,58 @@ +import React, { useState } from 'react'; +import styles from './styles.module.scss'; + +// Example tags/categories that you want to filter by +const availableFilters = [ + { + label: 'Technical Tags', + values: [ + 'Cloud Hyperscalers', + 'Model Providers', + 'Data Platforms', + 'Compute Infrastructure', + 'LLM Framework', + 'Operations', + ], + }, + { + label: 'Additional', + values: ['Module', 'Integration', 'Popular'], + }, +]; + +function SideFilter({ selectedFilters, onFilterChange }) { + const handleFilterChange = (value) => { + if (selectedFilters.includes(value)) { + onFilterChange(selectedFilters.filter((filter) => filter !== value)); + } else { + onFilterChange([...selectedFilters, value]); + } + }; + + return ( +
    +

    Filter by

    + {availableFilters.map((filterCategory) => ( +
    +

    {filterCategory.label}

    +
    + {filterCategory.values.map((value) => ( +
    + handleFilterChange(value)} + /> + +
    + ))} +
    +
    + ))} +
    + ); +} + +export default SideFilter; diff --git a/src/components/PartnersMarketplace/styles.module.scss b/src/components/PartnersMarketplace/styles.module.scss new file mode 100644 index 0000000000..3700caa36d --- /dev/null +++ b/src/components/PartnersMarketplace/styles.module.scss @@ -0,0 +1,183 @@ +.cardsFilterContainer { + display: flex; + gap: 2rem; + + @media screen and (max-width: 900px) { + flex-direction: column; + gap: 0rem; + } + + @media (min-width: 1600px) { + max-width: 1515px; + margin: auto; + } +} + +.sideFilter { + width: 300px; + min-width: 300px; + border-right: 1px solid #e0e0e0; + color: #130c49; + + padding: 3rem; + + @media screen and (max-width: 900px) { + border-right: none; + width: 100%; + min-width: 0; + + padding: 2rem 2rem 0rem 2rem; + } +} + +.filterResults { + display: flex; + flex-wrap: wrap; + flex-direction: column; + + @media screen and (max-width: 900px) { + flex-direction: unset; + } +} + +.filterOption { + margin-bottom: 1rem; + @media screen and (max-width: 900px) { + margin: 0px 10px 10px 0px; + } +} + +.mainContent { + flex-grow: 1; + padding: 2rem 2rem 0rem 0rem; + + @media screen and (max-width: 900px) { + padding: 0rem 1rem; + } +} +.cardsContainer { + display: flex; + flex-wrap: wrap; + gap: 1rem; + justify-content: flex-start; +} + +.card { + border: 1px solid #e0e0e0; + border-radius: 8px; + padding: 1rem; + background-color: #ffffff; + flex-grow: 1; + max-width: 372px; + min-width: 282px; + transition: all 0.3s ease; + width: 100%; + + @media screen and (max-width: 1500px) { + max-width: 320px; + } + + @media screen and (max-width: 1400px) { + max-width: 300px; + } + + @media screen and (max-width: 1300px) { + max-width: 100%; + } + + @media screen and (max-width: 768px) { + width: 100%; + min-width: 100%; + } + + p { + font-size: 1rem; + height: 200px; + + @media screen and (max-width: 1300px) { + height: auto; + } + } +} + +.cardImage { + width: auto; + max-width: 90px; + height: auto; + max-height: 30px; + margin-bottom: 20px; +} + +.cardContent { + margin-top: 1rem; + display: flex; + flex-direction: column; + align-items: flex-start; + height: 350px; + + @media screen and (max-width: 1300px) { + height: auto; + } +} + +.cardTags { + margin-top: 0.5rem; +} + +.cardTag { + display: inline-block; + background-color: #f0f0f0; + padding: 0.25rem 0.5rem; + margin: 0.25rem 0.25rem 0.25rem 0rem; + border-radius: 4px; + font-size: 13px; +} + +.searchInput { + width: 100%; + margin: 1rem 0rem; + padding: 0.5rem; + + border: 1px solid #e0e0e0; + border-radius: 8px; +} + +.cardLink { + color: rgb(97, 189, 115); + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 157.33%; + text-decoration-line: underline; + margin: 10px 0px; + + &:hover { + color: rgb(97, 189, 115); + text-decoration-line: underline; + } +} + +.selectedFilters { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-top: 1rem; +} + +.filterLabel { + background-color: #f0f0f0; + color: #333; + padding: 0.25rem 0.5rem; + border-radius: 4px; + cursor: pointer; + display: flex; + align-items: center; + font-size: 0.875rem; + margin: 10px 0px; +} + +.filterLabel:hover { + background-color: #e0e0e0; +} diff --git a/src/components/Pricing/Calculator/SLAstyles.scss b/src/components/Pricing/Calculator/SLAstyles.scss index 382b63c25f..afd1833edd 100644 --- a/src/components/Pricing/Calculator/SLAstyles.scss +++ b/src/components/Pricing/Calculator/SLAstyles.scss @@ -74,7 +74,7 @@ @media screen and (max-width: 668px) { padding: 3.5rem 3.5rem; - max-width: 90%; + max-width: 100%; } label { @@ -609,12 +609,13 @@ } } -.info { +.infoSection { border-radius: 0.625rem; - width: 25.9375rem; + max-width: 25.9375rem; + width: 100%; height: auto; - flex-shrink: 0; + padding: 3rem; display: flex; flex-direction: column; @@ -622,12 +623,18 @@ border-radius: 0.625rem; background: #130c49; + @media screen and (max-width: 1300px) { + width: 60%; + } + @media screen and (max-width: 1110px) { - width: 80%; + width: 100%; } + @media screen and (max-width: 668px) { height: auto; - width: 90%; + width: 100%; + padding: 2rem; } h2 { diff --git a/src/components/Pricing/Calculator/index.jsx b/src/components/Pricing/Calculator/index.jsx index 4d58c57958..fcfcbb1a1c 100644 --- a/src/components/Pricing/Calculator/index.jsx +++ b/src/components/Pricing/Calculator/index.jsx @@ -165,7 +165,7 @@ export default function PricingCalculator({ props }) {
    -
    +

    Estimate your cost for Serverless

      All Packages include:

      diff --git a/src/components/Pricing/CalculatorContainer/index.jsx b/src/components/Pricing/CalculatorContainer/index.jsx index 2ea20988fc..1f63ea2d3d 100644 --- a/src/components/Pricing/CalculatorContainer/index.jsx +++ b/src/components/Pricing/CalculatorContainer/index.jsx @@ -33,7 +33,9 @@ export default function CalculatorContainer() {

      SLA Tiers

      -

      Price per 1M vector dimensions stored per month

      +

      + Price per 1M vector dimensions stored per month +

      Phone Escalation

      Response time: Severity 1 diff --git a/src/components/Pricing/CalculatorContainer/styles.module.scss b/src/components/Pricing/CalculatorContainer/styles.module.scss index 417c1ed723..f488448f90 100644 --- a/src/components/Pricing/CalculatorContainer/styles.module.scss +++ b/src/components/Pricing/CalculatorContainer/styles.module.scss @@ -357,9 +357,9 @@ gap: 70px; @media screen and (max-width: 668px) { - width: 95%; + width: 100%; margin: 20px auto; - height: 25.4rem; + height: auto; display: flex; padding: 2rem; @@ -437,6 +437,15 @@ color: #130c49; } } + + .longPrice { + height: 50px; + max-width: 240px; + width: 100%; + line-height: 16px; + display: flex; + align-items: center; + } } .standard, @@ -447,6 +456,7 @@ @media screen and (max-width: 668px) { width: 140px; } + h2 { color: #130c49; font-size: 1rem; @@ -481,12 +491,12 @@ font-weight: 700; @media screen and (max-width: 668px) { - font-size: 2.1rem; + font-size: 1.8rem; } } @media screen and (max-width: 668px) { - margin: 0px; + margin: 0px 0px 50px 0px; } } @@ -505,6 +515,10 @@ width: 21px; margin: 17px auto; height: 15px; + + @media screen and (max-width: 668px) { + margin: 0px 0px 0px 0px; + } } .lines { @@ -574,15 +588,14 @@ background-color: #fff; filter: drop-shadow(0px 24px 64px rgba(22, 27, 45, 0.08)); - @media screen and (max-width: 1150px) { + @media screen and (max-width: 1240px) { height: auto; - align-items: center; } - @media screen and (max-width: 640px) { flex-direction: column; justify-content: flex-start; align-items: flex-start; + width: 100%; } .features { diff --git a/src/components/Pricing/Header/index.jsx b/src/components/Pricing/Header/index.jsx index 5469b9a207..9e86d1b3d1 100644 --- a/src/components/Pricing/Header/index.jsx +++ b/src/components/Pricing/Header/index.jsx @@ -8,7 +8,7 @@ export default function PricingHeader() {

      -

      Pricing

      +

      Vector Database Pricing

      All the power of the AI-native vector

      database, without the overhead diff --git a/src/components/Pricing/Header/styles.module.scss b/src/components/Pricing/Header/styles.module.scss index 7248b34000..1df70074fd 100644 --- a/src/components/Pricing/Header/styles.module.scss +++ b/src/components/Pricing/Header/styles.module.scss @@ -89,11 +89,10 @@ flex-direction: row; flex-wrap: wrap; align-items: center; - justify-content: center; + + justify-content: flex-start; a { - height: 45px; - width: 220px; display: flex; align-items: center; justify-content: center; @@ -113,6 +112,13 @@ } .buttonOutline { + width: 20.0625rem !important; + color: #130c49; + text-align: center; + + font-weight: 600; + + height: 1.375rem; border-radius: 0.3125rem; color: #130c49; background: #fff; diff --git a/src/components/Pricing/Plan/businessCritical.jsx b/src/components/Pricing/Plan/businessCritical.jsx index b21375b04c..545a94955a 100644 --- a/src/components/Pricing/Plan/businessCritical.jsx +++ b/src/components/Pricing/Plan/businessCritical.jsx @@ -38,7 +38,8 @@ export default function PricingBusinessCritical() {

      - Choose a fully-managed solution or 24/7 support within your VPC. + Choose a fully-managed solution or 24/7 support within your VPC + (BYOC Vector Database).

      @@ -51,19 +52,18 @@ export default function PricingBusinessCritical() {
      -

      - For building and prototyping with seamless scaling and flexible - pay-as-you-go pricing. -

      +

      For running workflows within your Virtual Private Cloud (VPC).

      • - Serverless SaaS deployment + Customer-managed VPC
      • - Get started with a free trial in minutes + Weaviate-managed control plane
      • - Various SLA tiers to meet your needs + + Weaviate agent for monitoring, support, and troubleshooting +
      diff --git a/src/components/Pricing/Plan/enterprise.jsx b/src/components/Pricing/Plan/enterprise.jsx index e6de740180..0f888a7a58 100644 --- a/src/components/Pricing/Plan/enterprise.jsx +++ b/src/components/Pricing/Plan/enterprise.jsx @@ -1,10 +1,11 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import styles from './styles.module.scss'; import Link from '@docusaurus/Link'; import EnterpriseContainer from '../EnterpriseContainer'; export default function PricingEnterprise() { const [isModalOpen, setIsModalOpen] = useState(false); + const modalRef = useRef(null); // Ref for the modal content const openModal = () => { if (window.location.pathname === '/pricing') { @@ -20,6 +21,23 @@ export default function PricingEnterprise() { } }; + const handleOutsideClick = (e) => { + if (modalRef.current && !modalRef.current.contains(e.target)) { + closeModal(); + } + }; + + useEffect(() => { + if (isModalOpen) { + document.addEventListener('mousedown', handleOutsideClick); + } else { + document.removeEventListener('mousedown', handleOutsideClick); + } + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, [isModalOpen]); + useEffect(() => { if (window.location.pathname === '/pricing/enterprise') { setIsModalOpen(true); @@ -49,7 +67,7 @@ export default function PricingEnterprise() {

      We manage everything for you in a dedicated instance in Weaviate - Cloud. + Cloud (Enterprise Vector Database).

      from $2.64 / AIU @@ -79,12 +97,12 @@ export default function PricingEnterprise() {
      -
      +
      × -
      diff --git a/src/components/Pricing/Plan/sandbox.jsx b/src/components/Pricing/Plan/sandbox.jsx index 676b7ad9d3..4b1583cb36 100644 --- a/src/components/Pricing/Plan/sandbox.jsx +++ b/src/components/Pricing/Plan/sandbox.jsx @@ -12,7 +12,8 @@ export default function PricingSandBox() {

      With an enterprise subscription, customers have access to a variety of - support and training options to accelerate adoption and success. + support and vector database training options to accelerate adoption + and success.

      Learn More diff --git a/src/components/Pricing/Plan/standard.jsx b/src/components/Pricing/Plan/standard.jsx index 4a13c97448..671956f30c 100644 --- a/src/components/Pricing/Plan/standard.jsx +++ b/src/components/Pricing/Plan/standard.jsx @@ -1,10 +1,11 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import styles from './styles.module.scss'; import Link from '@docusaurus/Link'; import CalculatorContainer from '../CalculatorContainer'; export default function PricingStandard() { const [isModalOpen, setIsModalOpen] = useState(false); + const modalRef = useRef(null); const openModal = () => { if (window.location.pathname === '/pricing') { @@ -20,6 +21,23 @@ export default function PricingStandard() { } }; + const handleOutsideClick = (e) => { + if (modalRef.current && !modalRef.current.contains(e.target)) { + closeModal(); + } + }; + + useEffect(() => { + if (isModalOpen) { + document.addEventListener('mousedown', handleOutsideClick); + } else { + document.removeEventListener('mousedown', handleOutsideClick); + } + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, [isModalOpen]); + useEffect(() => { if (window.location.pathname === '/pricing/serverless') { setIsModalOpen(true); @@ -47,7 +65,10 @@ export default function PricingStandard() {

      Serverless Cloud

      -

      We manage everything for you in the Weaviate Cloud.

      +

      + Serverless SaaS deployment in Weaviate Cloud (Serverless Vector + Database). +

      Starting at $25 /mo

      per 1M vector dimensions stored/month

      @@ -60,16 +81,16 @@ export default function PricingStandard() {
      -
      +

      For building and prototyping with seamless scaling and flexible pay-as-you-go pricing.

        -
      • Serverless SaaS deployment
      • Get started with a free trial in minutes
      • Various SLA tiers to meet your needs
      • +
      • Weaviate Embeddings available starting at $0.04/M tokens
      View pricing @@ -79,12 +100,12 @@ export default function PricingStandard() {
      -
      +
      × -
      diff --git a/src/components/Pricing/Plan/styles.module.scss b/src/components/Pricing/Plan/styles.module.scss index 269175cce2..a881f21d6b 100644 --- a/src/components/Pricing/Plan/styles.module.scss +++ b/src/components/Pricing/Plan/styles.module.scss @@ -13,6 +13,7 @@ box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); transition: all 0.3s ease-in-out; min-height: 300px; + justify-content: space-between; @media screen and (max-width: 860px) { height: auto; @@ -81,6 +82,9 @@ justify-content: space-between; @media screen and (max-width: 1160px) { + height: 400px; + } + @media screen and (max-width: 800px) { height: auto; } @@ -88,6 +92,12 @@ list-style-type: none; padding-left: 1.5rem; /* adjust this value if needed */ margin: 10px 0px; + margin: 10px 0px; + + display: flex; + align-content: space-around; + flex-direction: column; + justify-content: space-around; @media screen and (max-width: 960px) { padding: 0px; @@ -638,35 +648,45 @@ display: flex; opacity: 1; } - .modalContents { + position: relative; margin: 7% auto; padding: 20px; border: 1px solid #888; width: 75.9375rem; - height: 40.5rem; - max-width: 75.9375rem; + max-width: 90%; + height: 80vh; + max-height: 95vh; border-radius: 1.5rem; background: #f5f5f5; - overflow-y: scroll; - - @media screen and (max-width: 1060px) { - width: 100%; - height: 100%; - } + overflow-y: auto; } .close { - position: absolute; - top: 102px; - right: 172px; - font-size: 3rem; + position: sticky; + top: 20px; + float: right; + right: 0; + font-size: 1.5rem; color: #130c49; cursor: pointer; + z-index: 10; + text-align: right; + margin-right: 20px; +} - @media screen and (max-width: 860px) { - top: 55px; - right: 11px; +@media screen and (max-width: 768px) { + .modalContents { + width: 95%; + margin: 90px auto 0px auto; + border-radius: 0.5rem; + height: auto; + } + + .close { + top: 10px; + right: 10px; + position: absolute; } } diff --git a/src/components/Security/SafetyTypes/index.jsx b/src/components/Security/SafetyTypes/index.jsx index 4fdbfd65f5..c03dc94a42 100644 --- a/src/components/Security/SafetyTypes/index.jsx +++ b/src/components/Security/SafetyTypes/index.jsx @@ -9,12 +9,21 @@ export default function SafetyTypes() {

      We keep your data safe (and available)

      - Weaviate Cloud was built to offload the burden of managing - a vector database and give development teams peace of mind. Whether - you’re running Weaviate as a Serverless, Weaviate Enterprise Cloud, or + Weaviate Cloud was built to offload the burden of managing a vector + database and give development teams peace of mind. Whether you’re + running Weaviate as a Serverless, Weaviate Enterprise Cloud, or Bring Your Own Cloud solution– our top priority is keeping your data safe and available. Read more about our SLAs{' '} - here.  + here. You can also read our Security + Checklist for Self-Managed Weaviate Deployments{' '} + + here + + .

      diff --git a/src/components/Service/BYOC/Integrations/index.jsx b/src/components/Service/BYOC/Integrations/index.jsx index e1305bdb8f..56fa0b0ea2 100644 --- a/src/components/Service/BYOC/Integrations/index.jsx +++ b/src/components/Service/BYOC/Integrations/index.jsx @@ -18,7 +18,7 @@ export default function Integrations() {

      Run Weaviate within your VPC

      Take advantage of all the best{' '} - vector search{' '} + vector search{' '} and RAG techniques while ensuring your data stays safe within your own cloud environment.

      diff --git a/src/components/Service/Finance/Header/index.jsx b/src/components/Service/Finance/Header/index.jsx new file mode 100644 index 0000000000..f8f2c97b5f --- /dev/null +++ b/src/components/Service/Finance/Header/index.jsx @@ -0,0 +1,20 @@ +import Link from '@docusaurus/Link'; +import React from 'react'; +import styles from './styles.module.scss'; +import { LinkButton, ButtonContainer } from '/src/theme/Buttons'; + +export default function StudyHeader() { + return ( +
      +
      +
      + Case Study +

      + How a Leading Financial Data Company Commercialized AI in Under a + Year +

      +
      +
      +
      + ); +} diff --git a/src/components/Service/Finance/Header/styles.module.scss b/src/components/Service/Finance/Header/styles.module.scss new file mode 100644 index 0000000000..4b0669aca4 --- /dev/null +++ b/src/components/Service/Finance/Header/styles.module.scss @@ -0,0 +1,97 @@ +.box { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + text-align: left; + margin-bottom: 40px; + + span { + color: #61bb73; + font-size: 1.25rem; + font-weight: 400; + text-transform: uppercase; + } + + .logo { + background-image: url('/img/site/study-instabase.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 12.09331rem; + height: 3.25rem; + flex-shrink: 0; + } + + h1 { + color: #ffffff; + font-size: 2.25rem; + font-weight: 700; + margin: 1rem 0rem; + width: 50%; + @media screen and (max-width: 900px) { + width: 100%; + } + } + + .headerBox { + width: 50%; + @media screen and (max-width: 900px) { + width: 100%; + } + + p { + color: #ffffff; + width: 80%; + @media screen and (max-width: 1000px) { + width: 100%; + } + } + } +} + +.buttonOutline { + border-radius: 0.3125rem; + border: 1px solid #130c49; + background: #f4f4f4; + padding: 9px; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; + transition: all 1s ease-out; +} +.buttonOutline:hover { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: rgb(15, 0, 50); + color: #fff; + font-weight: 400; +} + +.headerSecurity { + background: #130c49; + background-image: url('/img/site/header-bg.svg'); + background-size: cover; + + @media screen and (max-width: 500px) { + background-image: url('/img/site/header-bg.svg'); + background-size: 100%; + background-position-y: bottom; + background-repeat: no-repeat; + } +} + +.topText { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 120%; /* 1.5rem */ + text-transform: uppercase; + margin: 10px 0px; +} diff --git a/src/components/Service/Finance/Integrations/index.jsx b/src/components/Service/Finance/Integrations/index.jsx new file mode 100644 index 0000000000..40e01f91d6 --- /dev/null +++ b/src/components/Service/Finance/Integrations/index.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { ButtonContainer } from '../../../../theme/Buttons'; +import styles from './styles.module.scss'; +import { LinkButton } from '/src/theme/Buttons'; +import Link from '@docusaurus/Link'; + +export default function Integrations() { + return ( +
      +
      +
      +

      + Our team and community are here to support you at every stage of + your AI journey. +

      +
      + + Get in Touch + + + Check our Services + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + ); +} diff --git a/src/components/Service/Finance/Integrations/styles.module.scss b/src/components/Service/Finance/Integrations/styles.module.scss new file mode 100644 index 0000000000..cc3ce98a01 --- /dev/null +++ b/src/components/Service/Finance/Integrations/styles.module.scss @@ -0,0 +1,556 @@ +[data-theme='light'] { + .box { + .left { + .inside { + .logoAI { + background-image: url('/img/site/openai-logo.png'); + } + .logoH { + background-image: url('/img/site/higgingface-logo.png'); + } + .logoJ { + background-image: url('/img/site/jina-logo.png'); + } + .logoD { + background-image: url('/img/site/deepset-logo.png'); + } + .logoCo { + background-image: url('/img/site/cohere-logo.png'); + } + .logoW { + background-image: url('/img/site/wp-solar-logo.png'); + } + .logoG { + background-image: url('/img/site/googleAI.png'); + } + .logoL { + background-image: url('/img/site/langchain-logo.png'); + } + .logoLa { + background-image: url('/img/site/lama-logo.png'); + } + } + } + } +} + +.integrationsSection { + background: #f5f5f5; +} + +.integrationsLogos { + display: flex; + flex-direction: row; + flex: 1; + justify-content: space-around; + overflow: hidden; + + @media screen and (max-width: 500px) { + padding: 9px; + height: 140px; + overflow: hidden; + } + + .logoBg { + border-radius: 0.9375rem; + border: 1px solid #130c49; + width: 14.375rem; + display: flex; + height: 5.9375rem; + flex-shrink: 0; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + align-items: center; + scroll-snap-align: center; + margin: 0 10px; + } + + .inside { + display: flex; + padding-bottom: 4rem; + + animation: scrollSide 40s linear infinite; + + @keyframes scrollSide { + 0% { + transform: translateX(50%); + } + 100% { + transform: translateX(-50%); + } + } + + .integrationsLogos:hover { + animation-play-state: paused; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 2rem; + background-image: url('/img/site/deepset-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo-light.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoGoogle { + width: 100%; + height: 2rem; + background-image: url('/img/site/google-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoHaystack { + width: 100%; + height: 2rem; + background-image: url('/img/site/haystack-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + + .logoStreamlit { + width: 100%; + height: 2rem; + background-image: url('/img/site/streamlit-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } +} + +.integrationsLogos:hover { + .inside { + animation-play-state: paused; + } +} +.mobileIntegrations { + display: none !important; + + @media screen and (max-width: 500px) { + display: flex !important; + } +} + +.box { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-top: 4rem; + + @media screen and (max-width: 580px) { + flex-direction: column-reverse; + } + .left { + display: flex; + flex-direction: column; + flex: 1; + gap: 30px; + justify-content: center; + + .inside { + display: flex; + + @media screen and (max-width: 500px) { + flex-direction: row; + gap: 20px; + display: flex; + } + + .logoAI { + width: 100%; + height: 2rem; + background-image: url('/img/site/openai-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoH { + width: 100%; + height: 2rem; + background-image: url('/img/site/higgingface-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoJ { + width: 100%; + height: 2rem; + background-image: url('/img/site/jina-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoD { + width: 100%; + height: 2rem; + background-image: url('/img/site/deepset-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoCo { + width: 100%; + height: 2rem; + background-image: url('/img/site/cohere-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoW { + width: 100%; + height: 2rem; + background-image: url('/img/site/wp-solar-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoG { + width: 100%; + height: 2rem; + background-image: url('/img/site/googleAI.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoL { + width: 100%; + height: 2rem; + background-image: url('/img/site/langchain-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + .logoLa { + width: 100%; + height: 2rem; + background-image: url('/img/site/lama-logo.png'); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + } + } + } + .right { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 60%; + + @media screen and (max-width: 768px) { + width: 100%; + } + } +} + +.boxes { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: wrap; + margin-bottom: 20px; +} + +.card { + display: flex; + flex-direction: column; + justify-content: space-around; + + width: 14.3125rem; + height: 19.75rem; + + background-color: #141f39; + margin: 1rem; + padding: 2rem; + + border-radius: 0.4375rem; + border-radius: 0.4375rem; + background: #fff; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + + @media screen and (max-width: 600px) { + height: auto; + width: 100%; + } +} + +.longCard { + width: 92%; + display: flex; + flex-direction: column; + align-items: center; + height: 400px; + gap: 20px; + z-index: 1; + flex-wrap: nowrap; + background: #ffffff !important; + justify-content: center; + background-image: url('/img/site/home-page-bg-pattern.svg') !important; + background-size: cover !important; + + .cTextColor { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 1.5rem; + font-style: normal; + font-weight: 500; + line-height: 150%; /* 2.25rem */ + } + @media screen and (max-width: 1000px) { + height: auto; + min-height: 205px; + width: 100%; + } + + @media screen and (max-width: 500px) { + display: flex; + flex-direction: column; + } + + .contentDiv { + height: 100%; + width: 50%; + margin: 50px; + text-align: center; + + br { + display: none; + } + + @media screen and (max-width: 500px) { + width: 100%; + br { + display: inherit; + } + } + } +} + +.safetyTypeBottom { + width: 100%; + height: 186px; + background: #130c49; + margin-top: -200px; +} + +.longHead { + grid-template-columns: 1fr; +} + +.buttons { + gap: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: center; + + a { + height: 45px; + width: 200px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + cursor: pointer; + text-decoration: none; + } + + .buttonGradient { + border-radius: 0.3125rem; + outline: 1px solid #130c49; + background: #61bd73; + transition: all 1s ease-out; + color: #130c49; + } + + .buttonGradient:hover { + border-radius: 0.3125rem; + outline: 1px solid #ffffff; + background: rgb(15, 0, 50); + color: #fff; + } + + .buttonOutline { + outline: 1px solid #130c49; + color: #130c49; + transition: all 1s ease-out; + background-color: #f5f5f5; + } + + .buttonOutline:hover { + outline: 1px solid #ffffff; + color: #fff; + transition: all 1s ease-out; + background-color: #130c49; + } +} + +.teamContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + + h3 { + color: #130c49; + text-align: center; + font-size: 1.625rem; + font-weight: 500; + line-height: 157.33%; /* 2.55663rem */ + width: 50%; + + @media screen and (max-width: 840px) { + width: 100%; + } + } +} + +.parentGrid { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + grid-column-gap: 10px; + grid-row-gap: 10px; + width: 868px; + height: 353px; + + @media screen and (max-width: 840px) { + width: 100%; + } + + @media screen and (max-width: 500px) { + display: none; + } +} + +.imageGrid1 { + grid-area: 1 / 1 / 3 / 2; + background-image: url('/img/site/team-grid-01.png'); + background-size: cover; + + @media screen and (max-width: 840px) { + background-position-x: center; + } +} +.imageGrid2 { + grid-area: 1 / 2 / 2 / 3; + background-image: url('/img/site/team-grid-02.png'); + background-size: cover; + @media screen and (max-width: 840px) { + background-position-x: center; + } +} +.imageGrid3 { + grid-area: 2 / 2 / 3 / 3; + background-image: url('/img/site/team-grid-03.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid4 { + grid-area: 1 / 3 / 2 / 4; + background-image: url('/img/site/team-grid-04.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid5 { + grid-area: 1 / 4 / 2 / 5; + background-image: url('/img/site/team-grid-06.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} +.imageGrid6 { + grid-area: 2 / 3 / 3 / 5; + background-image: url('/img/site/team-grid-05.png'); + background-size: cover; + @media screen and (max-width: 640px) { + background-position-x: center; + } +} + +.mobileImage { + display: none; + background-image: url('/img/site/services-team-photo.png'); + background-size: cover; + width: 100%; + height: 630px; + + @media screen and (max-width: 500px) { + display: block; + } +} diff --git a/src/components/Service/Finance/Study/index.jsx b/src/components/Service/Finance/Study/index.jsx new file mode 100644 index 0000000000..c4335427b9 --- /dev/null +++ b/src/components/Service/Finance/Study/index.jsx @@ -0,0 +1,142 @@ +import React from 'react'; +import styles from './styles.module.scss'; +import Link from '@docusaurus/Link'; + +export default function Study() { + return ( +
      +
      +
      +
      +

      Summary

      +

      + + A leading US financial data analytics company needed to enable + their engineering teams to build and scale secure, reliable AI + applications, fast. Weaviate’s AI-native, open source vector + database came with robust out-of-the-box features, flexible + deployment options, strong performance, and reliable support, + making it the company’s vector database of choice. In less than + one year, this company commercialized AI and empowered every + internal employee to ask questions about their files in their + proprietary chat tool. + +

      +

      Challenge

      +

      + A Lead System Engineer (LSE) was tasked to determine which vector + database would best enable engineering teams across the company to + build and scale secure applications in production. As AI + excitement spread across the financial data industry, he noticed + that within a month there were four to five different vector + databases in use across internal teams. He needed to find and + implement the right solution before tool sprawl got out of hand + and his team would be stuck supporting a bloated tech stack. + Additionally, competitors were starting to build their own AI + tools to support faster and more accurate decision making – the + company needed to move quickly to maintain the best-in-class + service they provide their customers. +

      +

      Why Weaviate

      +

      + Early in his research, the LSE learned that his company’s + engineers weren’t just looking for a database to support basic + search features – they wanted to build chatbots, integrate + multiple data sources and large language models (LLMs), have + support for vector search, metadata, hybrid search, reranking, and + filtering. He worked across teams to determine the importance of + ease of implementation, performance benchmarks and infrastructure + requirements like backups, restoration, and being able to deploy a + vector database on premises or in their own AWS cloud environment. + Many vector databases could meet multiple requirements, but only + Weaviate could meet them all.{' '} +

      +

      + “Experimenting is one thing, but when you’re building long-term, + client-facing enterprise applications, you want the right vector + database with the right level of support. Weaviate was that + database for us,” +

      +

      + Lead System Engineer from a top US financial data analytics + company +

      + +

      Solution

      +

      + The company chose Weaviate because it fulfilled four primary + requirements: +

      +
        +
      • + Robust feature set: Weaviate’s modular + architecture allowed easy integration of various data types and + sources and popular LLMs. Out-of-the-box features like hybrid + search, reranking, and filtering allowed developers of various + skill levels across teams to focus on building applications + instead of creating those functions from scratch. +
      • +
      • + Flexible deployment options: The company could + deploy Weaviate on AWS EKS through a pre-vetted Kubernetes + blueprint for internal usage, fulfilling security requirements + and allowing teams to move quickly. As an open-source vector + database, Weaviate could be deployed on premises and in the + cloud allowing strict data control. +
      • +
      • + Meeting required benchmarks: The infrastructure + team surveyed internal teams about the technical requirements + for various use cases – including queries per second, speed of + implementation, and high availability. Weaviate was able to + perform well within their required benchmark ranges. +
      • +
      • + Reliable support: The company has an open + culture of sharing what’s working and not working in their Slack + channels for third-party developer tools. The Weaviate channel + became a source of internal collaboration, problem solving, and + best practice sharing with the Weaviate team. In addition, the + company has peace-of-mind knowing they can access Weaviate’s + 24/7 support team. +
      • +
      +
      +
      +
      +
      +

      {'<1 year to commercialized AI'}

      +

      + “Our whole value as a company is our expertise and content. We + were able to translate the speed of implementation of Weaviate to + the speed of delivering commercial AI products within a year,” + said the LSE. +

      +

      Unlocking AI for non-technical roles

      +

      + “Every employee can now upload files and ask questions about them + in our internal chat tool. Anyone, even if they're not an engineer + and know nothing about coding, is able to use really good RAG.” + said a VP, Principal Software Engineer who developed a data + platform built on Weaviate. +

      +
      +
      +
      + +

      + “Teams started flocking to it. I thought I would need to convince + them to move from Pinecone, ChromaDB or Postgres. But as internal + expertise grew, people just started adopting Weaviate for its + features, performance, and ease of use.” +

      +

      + Lead System Engineer from a top US financial data analytics + company +

      +
      +
      +
      +
      + ); +} diff --git a/src/components/Service/Finance/Study/styles.module.scss b/src/components/Service/Finance/Study/styles.module.scss new file mode 100644 index 0000000000..d59fb8ea66 --- /dev/null +++ b/src/components/Service/Finance/Study/styles.module.scss @@ -0,0 +1,172 @@ +.studyContainer { + padding: 2.5rem; + display: flex; + flex-direction: row; + justify-content: space-around; + padding: 2.5rem; + column-gap: 10px; + max-width: 1500px; + margin: auto; + + @media screen and (max-width: 900px) { + flex-direction: column; + align-items: center; + gap: 30px; + } +} + +.bgColor { + background: #ededed; +} + +.leftContainer { + width: 40%; + min-width: 360px; + + @media screen and (max-width: 900px) { + width: 100%; + } + + ul { + color: #130c49; + } + + h2 { + margin: 20px 0px; + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 2.1rem */ + } + + p { + margin: 20px 0px; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + + .quote { + color: #130c49; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.76994rem */ + } +} + +.rightContainer { + display: flex; + flex-direction: column; + gap: 60px; + + @media screen and (max-width: 900px) { + width: 100%; + } + + .topSection { + width: 28.625rem; + height: 30rem; + flex-shrink: 0; + border-radius: 0.9375rem; + background: #130c49; + padding: 30px; + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + } + + h2 { + margin: 20px 0px; + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 150%; /* 1.875rem */ + text-transform: uppercase; + } + + p { + margin: 20px 0px; + color: #fff; + font-family: Inter; + font-size: 0.9375rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 1.3125rem */ + } + } + + .bottomSection { + border-radius: 0.9375rem; + background: #f5f5f5; + box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); + width: 28.625rem; + height: auto; + flex-shrink: 0; + padding: 30px; + + @media screen and (max-width: 900px) { + width: 100%; + height: auto; + } + + .logo { + background-image: url('/img/site/case-study-finance-side.png'); + background-size: cover; + background-repeat: no-repeat; + width: 24.4375rem; + height: 18.5rem; + margin: auto; + border-radius: 0.9375rem; + + @media screen and (max-width: 900px) { + width: 100%; + } + } + + h2 { + margin: 20px 0px; + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 2.35994rem */ + } + + p { + margin: 20px 0px; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.5rem */ + } + span { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; + } + .quote { + color: #130c49; + font-family: Inter; + font-size: 1.125rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.76994rem */ + } + } +} diff --git a/src/components/Service/Instabase/Study/index.jsx b/src/components/Service/Instabase/Study/index.jsx index 1021b91910..998a4e0223 100644 --- a/src/components/Service/Instabase/Study/index.jsx +++ b/src/components/Service/Instabase/Study/index.jsx @@ -149,33 +149,20 @@ export default function Study() { insurance companies, transportation, retail, and public sector organizations.

      -

      Why AWS

      -

      - In 2017, the engineers at Instabase made the choice to build - entirely on Kubernetes. They have several microservices that run - on top of that and are deeply integrated with the{' '} - - AWS ecosystem - - , making use of products including AWS EC2, ECS, EKS, ELB, S3, - ElastiCache, CDN, and Shield. AWS allows Instabase to build a - highly-available, secure, scalable, and performant platform to - support even their largest customers. -

      +

      About Weaviate

      Vector databases are becoming core to the AI tech stack because they can handle a very large amount of unstructured data in an - efficient way. Weaviate is an AI-native vector database available - on the AWS marketplace that can scale to handle billions of - vectors and millions of tenants. Customers and community members - use Weaviate to power large-scale search and generative AI - applications like chatbots and agents. Weaviate’s extensible - architecture offers easy pluggability with the AI ecosystem, - empowering developers of all levels to build and iterate faster. - And flexible deployment options let teams abstract the burden of - hosting and managing their database, while still meeting - enterprise requirements for security and compliance. + efficient way. Weaviate is an AI-native vector database that can + scale to handle billions of vectors and millions of tenants. + Customers and community members use Weaviate to power large-scale + search and generative AI applications like chatbots and agents. + Weaviate’s extensible architecture offers easy pluggability with + the AI ecosystem, empowering developers of all levels to build and + iterate faster. And flexible deployment options let teams abstract + the burden of hosting and managing their database, while still + meeting enterprise requirements for security and compliance.

      diff --git a/src/components/Service/Instabase/Study/styles.module.scss b/src/components/Service/Instabase/Study/styles.module.scss index 3e8a24712b..edbc15523f 100644 --- a/src/components/Service/Instabase/Study/styles.module.scss +++ b/src/components/Service/Instabase/Study/styles.module.scss @@ -102,13 +102,12 @@ background: #f5f5f5; box-shadow: 0px 24px 64px 0px rgba(22, 27, 45, 0.08); width: 28.625rem; - height: 79.4375rem; + height: auto; flex-shrink: 0; padding: 30px; @media screen and (max-width: 900px) { width: 100%; - height: auto; } .logo { diff --git a/src/components/Signup/Alternative/introduction.jsx b/src/components/Signup/Alternative/introduction.jsx index b7364ad59d..f790dcd914 100644 --- a/src/components/Signup/Alternative/introduction.jsx +++ b/src/components/Signup/Alternative/introduction.jsx @@ -79,9 +79,7 @@ export default function introduction() {
      -
      +
      @@ -102,7 +100,7 @@ export default function introduction() { Have questions about pricing?

      - Contact us + Contact us
      diff --git a/src/components/Signup/Demo/introduction.jsx b/src/components/Signup/Demo/introduction.jsx new file mode 100644 index 0000000000..66c2cea406 --- /dev/null +++ b/src/components/Signup/Demo/introduction.jsx @@ -0,0 +1,119 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: '62449f1d-d31f-44b3-b52d-9903f1ed448e', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( +
      +
      +

      + Learn how to take your AI applications +
      to market faster with Weaviate +

      + +

      + See how Weaviate’s AI-native vector database gives AI builders the + tools needed to move fast—without compromising data privacy, + performance, or costs. +

      + +

      + Sign up for a 1:1 call with our team to see how to: +

      + +
      +
      +
      +
      +

      + Blend vector and keyword search (with no extra work) for + accurate, contextual results across every type of data. +

      +
      +
      +
      +
      +
      +

      + Connect to your LLM of choice and easily switch models for fast, + flexible RAG development. +

      +
      +
      +
      +
      +
      +

      + Reduce resource consumption with techniques like vector + compression and data offloading. +

      +
      +
      +
      +
      +
      +

      + “Through our corpus API connected to Weaviate, users can build + very powerful, low latency search engines in minutes with little + to no code.” +

      + Aisis Julian, Senior Software Engineer, Morningstar +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      + We’d love to give you a live +
      demo of what Weaviate can do +

      +
      +
      +
      +
      +
      +
      +
      +
      + ); +} diff --git a/src/components/Signup/Demo/styles.module.scss b/src/components/Signup/Demo/styles.module.scss new file mode 100644 index 0000000000..d8ce359543 --- /dev/null +++ b/src/components/Signup/Demo/styles.module.scss @@ -0,0 +1,604 @@ +.demoContainer { + background: #131144; + + background-image: url('/img/site/signup-background.png'); + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + height: 110vh; + + display: flex; + + @media screen and (max-width: 1100px) { + flex-direction: column; + overflow: auto; + } + + @media screen and (max-width: 900px) { + height: 120vh; + } +} + +.demoSideA { + flex: 1; + flex-basis: 50%; + padding: 3rem; + + background-image: url('/img/site/signup-bg-02.png'); + background-size: cover; + background-repeat: no-repeat; + + @media screen and (max-width: 1200px) { + flex-basis: 55%; + padding: 2rem; + } + + @media screen and (max-width: 900px) { + flex-basis: 100%; + background-position-x: center; + } + + img { + margin-bottom: 10px; + } + + h1 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.75rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 2.45rem */ + + @media screen and (max-width: 1200px) { + width: 100%; + } + } + + p { + margin-bottom: 20px; + + width: 85%; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + + @media screen and (max-width: 850px) { + width: 100%; + } + } + + .smallText { + font-size: 1rem; + } + + ul { + color: #130c49; + } +} + +.demoSideB { + flex: 1; + flex-basis: 50%; + justify-content: center; + background-image: url('/img/site/weaviate-bottom-right-bubble.png'); + background-color: #130c49; + background-color: #130c49; + background-position-x: right; + background-position-y: bottom; + background-repeat: no-repeat; + padding: 3rem; + display: flex; + align-items: flex-start; + + @media screen and (max-width: 1200px) { + flex-basis: 45%; + } + + @media screen and (max-width: 900px) { + flex-basis: 100%; + } + + @media screen and (max-width: 1280px) { + background-size: 90%; + } + + @media screen and (max-width: 780px) { + flex-direction: column; + gap: 20px; + padding: 2rem; + } + + h2 { + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 1.875rem; + font-style: normal; + font-weight: 600; + line-height: 140%; /* 2.625rem */ + margin: 0; + } + + p { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: italic; + font-weight: 400; + line-height: 140%; + } + + .button { + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: rgba(255, 255, 255, 0.6); + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.3125rem */ + } +} + +.signUpBox { + width: 35.3125rem; + height: 35.12813rem; + margin: auto; + flex-shrink: 0; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + } +} + +.signUp { + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 780px) { + width: 100%; + } +} + +.investorButton { + margin-top: 25px; +} + +.typeContainer { + display: flex; + gap: 30px; + flex-direction: column; + margin: 40px 0px; +} + +.typeBox { + width: calc(100% - 53px); + height: auto; + flex-shrink: 0; + border-radius: 0.3125rem; + display: flex; + flex-direction: column; + + @media screen and (max-width: 1300px) { + width: 100%; + } + + @media screen and (max-width: 1100px) { + width: calc(60% - 43px); + } + + @media screen and (max-width: 900px) { + width: 100%; + } +} + +.typeIcon { + display: flex; + align-items: center; + gap: 10px; + + p { + width: 80%; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + margin: 0; + + @media screen and (max-width: 1280px) { + width: 100%; + } + } + a { + color: #61bd73; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + margin: 15px 0px; + } + + .homeIcon { + background-image: url('/img/site/cloud-hybrid-icon.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 2.125rem; + height: 2.125rem; + } + + .ragIcon { + background-image: url('/img/site/cloud-pricing-icon-02.svg'); + } + .genIcon { + background-image: url('/img/site/cloud-pricing-icon-03.svg'); + } + + .infraIcon { + background-image: url('/img/site/hp-infrastructure-icon.svg'); + } + + h2 { + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.57331rem */ + margin: 0; + } +} + +.typeText { + display: flex; + flex-direction: column; + height: auto; + justify-content: space-between; + + margin: 0px 0px 0px 43px; + + @media screen and (max-width: 500px) { + margin: 20px 0px; + } + + a { + color: #61bd73; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + text-decoration-line: underline; + margin: 15px 0px; + } +} + +.bottomBar { + display: flex; + margin: -20px 0px; + flex-direction: column; + + @media screen and (max-width: 800px) { + margin: -20px -15px; + } +} + +.innerBar { + height: 3em; + display: grid; + grid-template-columns: auto auto auto auto auto auto; + + align-items: center; + justify-content: space-evenly; + padding: 0 var(--ifm-spacing-horizontal); + width: 100%; + max-width: 35rem; +} + +.secondLine { + grid-template-columns: auto auto auto auto; +} + +.customerLogo { + background-image: url('/img/site/redhat-dark-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + width: 3.48106rem; + height: 1.03581rem; + flex-shrink: 0; + margin: 0px 10px; + + @media screen and (max-width: 1300px) { + margin: 0px 1px; + } + + @media screen and (max-width: 800px) { + width: 3rem; + } +} + +.rakutenLogo { + background-image: url('/img/site/rakuten-demo.svg'); + background-position: center; +} + +.morningstarLogo { + background-image: url('/img/site/morningstar-demo.svg'); + background-position: center; +} + +.shippoLogo { + background-image: url('/img/site/shippo-demo.svg'); + background-position: center; +} + +.amdLogo { + background-image: url('/img/site/amd-demo.svg'); + background-position: center; +} + +.bunqLogo { + background-image: url('/img/site/bunq-demo.svg'); + background-position: center; +} + +.ciscoLogo { + background-image: url('/img/site/cisco-demo.svg'); + background-position: center; +} + +.writesonic { + background-image: url('/img/site/writesonic-demo.svg'); + background-position: center; + width: 4.48106rem; + height: 2.03581rem; + + @media screen and (max-width: 800px) { + width: 4rem; + } +} + +.instabaseLogo { + background-image: url('/img/site/instabase-demo.svg'); + background-position: center; + width: 6.48106rem; + height: 2.03581rem; + + @media screen and (max-width: 800px) { + width: 4rem; + } +} + +.stackLogo { + background-image: url('/img/site/stack-demo.svg'); + background-position: center; + width: 4.48106rem; + height: 2.03581rem; + + @media screen and (max-width: 800px) { + width: 4rem; + } +} + +.factsetLogo { + background-image: url('/img/site/factset-demo.svg'); + background-position: center; + width: 4.48106rem; + height: 2.03581rem; + + @media screen and (max-width: 800px) { + width: 4rem; + } +} + +.typeQuote { + max-width: 38.8125rem; + width: 100%; + height: 11.375rem; + flex-shrink: 0; + border-radius: 1.25rem; + background: #f7f9fd; + display: flex; + padding: 40px; + gap: 40px; + align-items: center; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + padding: 20px; + gap: 20px; + } + + @media screen and (max-width: 1100px) { + max-width: 38.8125rem; + width: 100%; + height: auto; + padding: 20px; + gap: 20px; + } + .image { + width: 5.9375rem; + height: 5.9375rem; + flex-shrink: 0; + background: url('/img/site/quote-image-demo.png'); + background-size: cover; + } + + p { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.57331rem */ + width: 100%; + } + + span { + color: #130c49; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + } +} + +.demoSideB h2 { + font-size: 1.5rem; +} + +.demoSideA h1 { + color: #130c49; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 2rem */ + margin-bottom: 40px; +} + +.demoSideA p, +.demoSideB p, +.typeQuote p, +.typeQuote span { + font-size: 0.9rem; +} + +.typeIcon .homeIcon, +.typeIcon .ragIcon, +.typeIcon .genIcon { + width: 1.75rem; + height: 1.75rem; +} + +.typeQuote .image { + width: 5rem; + height: 5rem; +} + +@media screen and (max-width: 1100px) { + .demoSideA h1, + .demoSideB h2 { + font-size: 1.75rem; + } + + .demoSideA p, + .demoSideB p { + font-size: 1rem; + } + + .typeIcon .homeIcon, + .typeIcon .ragIcon, + .typeIcon .genIcon { + width: 2.125rem; + height: 2.125rem; + } + + .signUpBox { + width: 100%; + height: auto; + } + + .typeQuote .image { + width: 5.5rem; + height: 5.5rem; + } +} + +@media screen and (max-width: 700px) { + .demoSideA h1, + .demoSideB h2 { + br { + display: none; + } + } +} + +.hs-custom-style + > div + > div:last-of-type + .hs-input:not([type='checkbox']):not([type='radio']), +.hs-custom-style + fieldset + > div:last-of-type + .hs-input:not([type='checkbox']):not([type='radio']) { + width: 100%; + max-width: 100%; + max-height: 100px; +} + +.hsForm { + color: #b5d2dc; + background: #d9e7ecb0; + padding: 20px; + border-radius: 1.25rem; + font-family: Inter; + font-size: 13px; + + input[type='text'], + [type='email'] { + background: #272361; + } + + input[type='textarea'] { + background: #272361; + height: 40px; + max-height: 200px !important; + } + + ::marker { + display: none; + } + + ul { + padding-left: 0; + } + + li, + span, + label { + list-style: none; + color: #b5d2dc; + font-size: 14px !important; + } +} + +.formWrapper { + max-height: 700px; + + width: 100%; + padding: 10px; + + @media screen and (max-width: 800px) { + max-height: 800px; + } +} diff --git a/src/components/Signup/Demo/v2.jsx b/src/components/Signup/Demo/v2.jsx new file mode 100644 index 0000000000..d642146692 --- /dev/null +++ b/src/components/Signup/Demo/v2.jsx @@ -0,0 +1,110 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: '62449f1d-d31f-44b3-b52d-9903f1ed448e', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( +
      +
      +

      + Our open-source vector database gives AI builders the tools needed to + move fast—without compromising data privacy, performance, or costs. +

      + +

      + Book a 30-min demo with our team to see how to: +

      + +
      +
      +
      +
      +

      + Blend vector and keyword search (with no extra work) for + accurate, contextual results across every type of data. +

      +
      +
      +
      +
      +
      +

      + Connect to your LLM of choice and easily switch models for fast, + flexible RAG development. +

      +
      +
      +
      +
      +
      +

      + Reduce resource consumption with techniques like vector + compression and data offloading. +

      +
      +
      +
      +
      +
      +

      + “Through our corpus API connected to Weaviate, users can build + very powerful, low latency search engines in minutes with little + to no code.” +

      + Aisis Julian, Senior Software Engineer, Morningstar +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Ready to accelerate AI development?

      +
      +
      +
      +
      +
      +
      +
      +
      + ); +} diff --git a/src/components/Signup/Ebooks/V2/styles.module.scss b/src/components/Signup/Ebooks/V2/styles.module.scss new file mode 100644 index 0000000000..0fb32c34a2 --- /dev/null +++ b/src/components/Signup/Ebooks/V2/styles.module.scss @@ -0,0 +1,399 @@ +.demoContainer { + margin: auto; + + background: #131144; + + background-image: url('/img/site/ebook-bg-00.png'); + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + height: 100vh; + + display: flex; + + @media screen and (max-width: 1100px) { + flex-direction: column; + overflow: auto; + background-position-x: center; + } + + @media screen and (max-width: 780px) { + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + background-position-x: left; + } +} + +.demoSideA { + flex: 1; + flex-basis: 50%; + padding: 3rem; + display: flex; + flex-direction: column; + justify-content: space-evenly; + + @media screen and (max-width: 1200px) { + flex-basis: 55%; + padding: 3rem; + gap: 20px; + } + + @media screen and (max-width: 900px) { + flex-basis: 100%; + } + + img { + margin-bottom: 10px; + } + + h1 { + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 3rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 4.2rem */ + + @media screen and (max-width: 1200px) { + width: 100%; + } + } + + span { + color: #ddebf2; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 2rem */ + } + + p { + margin-bottom: 20px; + + width: 85%; + color: #130c49; + font-family: 'Inter'; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + + @media screen and (max-width: 850px) { + width: 100%; + } + } + + .demoLogo { + width: 10.43744rem; + height: 1.43244rem; + flex-shrink: 0; + background-image: url('/img/site/weaviate-logo-light-alpha.svg'); + background-size: cover; + } + + .smallText { + font-size: 1rem; + } + + ul { + color: #ddebf2; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 600; + line-height: 160%; /* 2.4rem */ + padding: 0; + list-style-position: outside; + display: flex; + flex-direction: column; + gap: 40px; + + padding-left: 10px; + } + li { + padding-left: 10px; + color: #ddebf2; + font-family: 'Inter'; + font-size: 1.25rem; + font-style: normal; + font-weight: 300; + line-height: 160%; /* 2rem */ + + @media screen and (max-width: 1100px) { + width: 74%; + } + + @media screen and (max-width: 1060px) { + width: 60%; + } + + @media screen and (max-width: 780px) { + width: 100%; + } + } +} + +.demoSideB { + flex: 1; + flex-basis: 50%; + justify-content: center; + + padding: 3rem; + display: flex; + align-items: center; + + @media screen and (max-width: 1200px) { + flex-basis: 45%; + } + + @media screen and (max-width: 900px) { + flex-basis: 100%; + } + + @media screen and (max-width: 1280px) { + background-size: 70%; + } + + @media screen and (max-width: 780px) { + background-image: url('/img/site/ebook-bg-small.png'); + background-size: contain; + background-position-x: right; + background-position-y: bottom; + background-repeat: no-repeat; + flex-direction: column; + gap: 20px; + padding: 2rem; + } + + h2 { + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 1.875rem; + font-style: normal; + font-weight: 600; + line-height: 140%; /* 2.625rem */ + margin: 0; + } + + p { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: italic; + font-weight: 400; + line-height: 140%; + } + + .button { + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: rgba(255, 255, 255, 0.6); + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.3125rem */ + } +} + +.signUpBox { + margin: auto; + flex-shrink: 0; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + } +} + +.signUp { + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 780px) { + width: 100%; + } +} + +.investorButton { + margin-top: 25px; +} + +.demoSideB h2 { + font-size: 1.5rem; +} + +.demoSideA p, +.demoSideB p, +.typeQuote p, +.typeQuote span { + font-size: 0.9rem; +} + +.typeIcon .homeIcon, +.typeIcon .ragIcon, +.typeIcon .genIcon { + width: 1.75rem; + height: 1.75rem; +} + +.signUpBox { + width: 28rem; + height: auto; +} + +.typeQuote .image { + width: 5rem; + height: 5rem; /* Smaller starting quote image size */ +} + +/* Increase Font and Image Size as Screen Size Decreases */ + +@media screen and (max-width: 1100px) { + .demoSideA h1, + .demoSideB h2 { + font-size: 1.75rem; + } + + .demoSideA p, + .demoSideB p { + font-size: 1rem; + } + + .typeIcon .homeIcon, + .typeIcon .ragIcon, + .typeIcon .genIcon { + width: 2.125rem; + height: 2.125rem; + } + + .signUpBox { + width: 100%; + height: auto; + } + + .typeQuote .image { + width: 5.5rem; + height: 5.5rem; + } +} + +@media screen and (max-width: 700px) { + .demoSideA h1, + .demoSideB h2 { + br { + display: none; + } + } +} + +.ebookForm { + color: #b5d2dc; + background: #130c49; + padding: 20px; + border-radius: 1rem; + + input[type='text'], + [type='email'] { + display: flex; + color: #b5d2dc; + width: 100%; + height: 2.93694rem; + justify-content: center; + align-items: center; + margin: 0px 0px 20px 0px; + background: #272361; + border-radius: 0.5rem; + border-style: none; + } + + input[type='textarea'] { + background: #272361; + height: 40px; + max-height: 200px !important; + } + + .actions { + display: flex; + justify-content: center; + } + + input[type='submit'] { + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + ::marker { + display: none; + } + + ul { + padding-left: 0; + } + + li, + span, + label { + list-style: none; + color: #b5d2dc; + font-size: 14px !important; + text-align: left; + font-style: normal; + margin: 20px 0px; + font-family: Inter; + + p { + font-style: normal; + color: #6e84a3; + font-family: Inter; + font-size: 0.88106rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.38619rem */ + } + } +} + +.formWrapper { + max-height: 670px; + overflow-y: auto; + width: 100%; + padding: 10px; +} diff --git a/src/components/Signup/Ebooks/introduction.jsx b/src/components/Signup/Ebooks/introduction.jsx new file mode 100644 index 0000000000..66c2cea406 --- /dev/null +++ b/src/components/Signup/Ebooks/introduction.jsx @@ -0,0 +1,119 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: '62449f1d-d31f-44b3-b52d-9903f1ed448e', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( +
      +
      +

      + Learn how to take your AI applications +
      to market faster with Weaviate +

      + +

      + See how Weaviate’s AI-native vector database gives AI builders the + tools needed to move fast—without compromising data privacy, + performance, or costs. +

      + +

      + Sign up for a 1:1 call with our team to see how to: +

      + +
      +
      +
      +
      +

      + Blend vector and keyword search (with no extra work) for + accurate, contextual results across every type of data. +

      +
      +
      +
      +
      +
      +

      + Connect to your LLM of choice and easily switch models for fast, + flexible RAG development. +

      +
      +
      +
      +
      +
      +

      + Reduce resource consumption with techniques like vector + compression and data offloading. +

      +
      +
      +
      +
      +
      +

      + “Through our corpus API connected to Weaviate, users can build + very powerful, low latency search engines in minutes with little + to no code.” +

      + Aisis Julian, Senior Software Engineer, Morningstar +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      + We’d love to give you a live +
      demo of what Weaviate can do +

      +
      +
      +
      +
      +
      +
      +
      +
      + ); +} diff --git a/src/components/Signup/Ebooks/styles.module.scss b/src/components/Signup/Ebooks/styles.module.scss new file mode 100644 index 0000000000..feb29f1380 --- /dev/null +++ b/src/components/Signup/Ebooks/styles.module.scss @@ -0,0 +1,364 @@ +.demoContainer { + margin: auto; + + background: #131144; + + background-image: url('/img/site/ebook-bg-00.png'); + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + height: 100vh; + + display: flex; + + @media screen and (max-width: 1100px) { + flex-direction: column; + overflow: auto; + background-position-x: center; + } + + @media screen and (max-width: 780px) { + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + background-position-x: left; + } +} + +.demoSideA { + flex: 1; + flex-basis: 50%; + padding: 3rem; + display: flex; + flex-direction: column; + justify-content: space-evenly; + + @media screen and (max-width: 1200px) { + flex-basis: 55%; + padding: 3rem; + gap: 20px; + } + + @media screen and (max-width: 900px) { + flex-basis: 100%; + } + + img { + margin-bottom: 10px; + } + + h1 { + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 3rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 4.2rem */ + + @media screen and (max-width: 1200px) { + width: 100%; + } + } + + span { + color: #ddebf2; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 2rem */ + } + + p { + margin-bottom: 20px; + + width: 85%; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + + @media screen and (max-width: 850px) { + width: 100%; + } + } + + .demoLogo { + width: 10.43744rem; + height: 1.43244rem; + flex-shrink: 0; + background-image: url('/img/site/weaviate-logo-light-alpha.svg'); + background-size: cover; + } + + .smallText { + font-size: 1rem; + } + + ul { + color: #ddebf2; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: normal; + font-weight: 600; + line-height: 160%; /* 2.4rem */ + padding: 0; + list-style-position: outside; + display: flex; + flex-direction: column; + gap: 40px; + + padding-left: 10px; + } + li { + padding-left: 10px; + color: #ddebf2; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 300; + line-height: 160%; /* 2rem */ + + @media screen and (max-width: 1100px) { + width: 74%; + } + + @media screen and (max-width: 1060px) { + width: 60%; + } + + @media screen and (max-width: 780px) { + width: 100%; + } + } +} + +.demoSideB { + flex: 1; + flex-basis: 50%; + justify-content: center; + + padding: 3rem; + display: flex; + align-items: center; + + @media screen and (max-width: 1200px) { + flex-basis: 45%; + } + + @media screen and (max-width: 900px) { + flex-basis: 100%; + } + + @media screen and (max-width: 1280px) { + background-size: 70%; + } + + @media screen and (max-width: 780px) { + background-image: url('/img/site/ebook-bg-small.png'); + background-size: contain; + background-position-x: right; + background-position-y: bottom; + background-repeat: no-repeat; + flex-direction: column; + gap: 20px; + padding: 2rem; + } + + h2 { + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 1.875rem; + font-style: normal; + font-weight: 600; + line-height: 140%; /* 2.625rem */ + margin: 0; + } + + p { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 1.5rem; + font-style: italic; + font-weight: 400; + line-height: 140%; + } + + .button { + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: rgba(255, 255, 255, 0.6); + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.3125rem */ + } +} + +.signUpBox { + margin: auto; + flex-shrink: 0; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + } +} + +.signUp { + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 780px) { + width: 100%; + } +} + +.investorButton { + margin-top: 25px; +} + +.demoSideB h2 { + font-size: 1.5rem; +} + +.demoSideA p, +.demoSideB p, +.typeQuote p, +.typeQuote span { + font-size: 0.9rem; +} + +.typeIcon .homeIcon, +.typeIcon .ragIcon, +.typeIcon .genIcon { + width: 1.75rem; + height: 1.75rem; +} + +.signUpBox { + width: 28rem; + height: 32rem; +} + +.typeQuote .image { + width: 5rem; + height: 5rem; /* Smaller starting quote image size */ +} + +/* Increase Font and Image Size as Screen Size Decreases */ + +@media screen and (max-width: 1100px) { + .demoSideA h1, + .demoSideB h2 { + font-size: 1.75rem; + } + + .demoSideA p, + .demoSideB p { + font-size: 1rem; + } + + .typeIcon .homeIcon, + .typeIcon .ragIcon, + .typeIcon .genIcon { + width: 2.125rem; + height: 2.125rem; + } + + .signUpBox { + width: 100%; + height: auto; + } + + .typeQuote .image { + width: 5.5rem; + height: 5.5rem; + } +} + +@media screen and (max-width: 700px) { + .demoSideA h1, + .demoSideB h2 { + br { + display: none; + } + } +} + +.hs-custom-style + > div + > div:last-of-type + .hs-input:not([type='checkbox']):not([type='radio']), +.hs-custom-style + fieldset + > div:last-of-type + .hs-input:not([type='checkbox']):not([type='radio']) { + width: 100%; + max-width: 100%; + max-height: 100px; +} + +.hsForm { + color: #b5d2dc; + background: #d9e7ecb0; + padding: 20px; + border-radius: 1.25rem; + + input[type='text'], + [type='email'] { + background: #272361; + } + + input[type='textarea'] { + background: #272361; + height: 40px; + max-height: 200px !important; + } + + ::marker { + display: none; + } + + ul { + padding-left: 0; + } + + li, + span, + label { + list-style: none; + color: #b5d2dc; + font-size: 14px !important; + } +} + +.formWrapper { + max-height: 670px; + overflow-y: auto; + width: 100%; + padding: 10px; +} diff --git a/src/components/Signup/Ebooks/v2.jsx b/src/components/Signup/Ebooks/v2.jsx new file mode 100644 index 0000000000..8a5fc0503e --- /dev/null +++ b/src/components/Signup/Ebooks/v2.jsx @@ -0,0 +1,57 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './V2/styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: '62e704b7-b857-421e-a30d-46ac0a3f5d81', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( +
      +
      +
      + EBOOK +

      + Choosing the Right Database For AI  +

      + +
        + This guide covers: +
      • A comparison of AI-native and traditional databases.
      • +
      • + Key considerations for powering scalable, cost-effective AI + applications.{' '} +
      • +
      • + Practical tips for indexing, hybrid search, and seamless integration + with AI models. +
      • +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + ); +} diff --git a/src/components/Signup/Guides/index.jsx b/src/components/Signup/Guides/index.jsx new file mode 100644 index 0000000000..50eadea3e4 --- /dev/null +++ b/src/components/Signup/Guides/index.jsx @@ -0,0 +1,92 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: '62e704b7-b857-421e-a30d-46ac0a3f5d81', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( + <> +
      +
      +
      +
      + FREE GUIDE +

      + Getting Started With Vector Databases +

      +
      +
      +
      +
      +
      +

      Grab your copy today

      +
      +
      +
      +
      +
      +
      +
      +

      + Stay ahead on the future of AI-native software development +

      +

      + Vector databases are quickly emerging as a key component of the + AI-native tech stack, enabling fundamental use cases like + semantic search, recommendation engines, and retrieval augmented + generation (RAG).{' '} +

      + +

      + This Refcard provides an overview of vector databases, including + basic concepts, use cases, and examples. +

      +
      +
      +
      +
      +
      + Weaviate, 2024 +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      +
      + + ); +} diff --git a/src/components/Signup/Guides/styles.module.scss b/src/components/Signup/Guides/styles.module.scss new file mode 100644 index 0000000000..cce9a1d735 --- /dev/null +++ b/src/components/Signup/Guides/styles.module.scss @@ -0,0 +1,386 @@ +.demoContainer { + margin: auto; + + background: #131144; + + background-image: url('/img/site/bg-dark-1.png'); + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + height: 105vh; + + @media screen and (max-width: 900px) { + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + background-position-x: left; + height: auto; + } +} + +.demoTitle { + display: flex; + flex-direction: column; + gap: 24px; + + img { + margin-bottom: 10px; + } + + h1 { + color: #ffffff; + font-family: 'Plus Jakarta Sans'; + font-size: 3rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 4.2rem */ + + @media screen and (max-width: 1200px) { + width: 100%; + } + } + + span { + color: #ddebf2; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 2rem */ + } + + p { + margin-bottom: 20px; + + width: 85%; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + + @media screen and (max-width: 850px) { + width: 100%; + } + } + + .demoLogo { + width: 10.43744rem; + height: 1.43244rem; + flex-shrink: 0; + background-image: url('/img/site/weaviate-logo-light-alpha.svg'); + background-size: cover; + } +} + +.contentContainer { + max-width: 960px; + margin: auto; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 20px; +} +.content { + display: flex; + justify-content: center; + gap: 40px; + + @media screen and (max-width: 900px) { + flex-direction: column-reverse; + gap: 20px; + } +} + +.contentSideA { + display: flex; + flex-direction: column; + justify-content: space-evenly; + width: 100%; + + @media screen and (max-width: 1100px) { + width: 70%; + } + + @media screen and (max-width: 900px) { + width: 100%; + } + + .smallText { + font-size: 1rem; + } + + h3 { + font-size: 24px; + color: #fff; + } + + p { + font-size: 18px; + color: #fff; + font-family: 'Plus Jakarta Sans'; + } +} + +.contentSideB { + display: flex; + align-items: center; + + @media screen and (max-width: 780px) { + flex-direction: column; + gap: 20px; + } + + h3 { + font-size: 24px; + color: #fff; + } + + p { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 18px; + + font-weight: 400; + line-height: 140%; + } + + .button { + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: rgba(255, 255, 255, 0.6); + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.3125rem */ + } +} + +.signUpBox { + margin: auto; + flex-shrink: 0; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + } +} + +.signUp { + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 780px) { + width: 100%; + } +} + +.investorButton { + margin-top: 25px; +} + +.demoSideB h2 { + font-size: 1.5rem; +} + +.demoSideA p, +.demoSideB p, +.typeQuote p, +.typeQuote span { + font-size: 0.9rem; +} + +.typeIcon .homeIcon, +.typeIcon .ragIcon, +.typeIcon .genIcon { + width: 1.75rem; + height: 1.75rem; +} + +.signUpBox { + width: 28rem; + height: 32rem; +} + +.typeQuote .image { + width: 5rem; + height: 5rem; /* Smaller starting quote image size */ +} + +/* Increase Font and Image Size as Screen Size Decreases */ + +@media screen and (max-width: 1100px) { + .demoSideA h1, + .demoSideB h2 { + font-size: 1.75rem; + } + + .demoSideA p, + .demoSideB p { + font-size: 1rem; + } + + .typeIcon .homeIcon, + .typeIcon .ragIcon, + .typeIcon .genIcon { + width: 2.125rem; + height: 2.125rem; + } + + .signUpBox { + width: 100%; + height: auto; + } + + .typeQuote .image { + width: 5.5rem; + height: 5.5rem; + } +} + +@media screen and (max-width: 700px) { + .demoSideA h1, + .demoSideB h2 { + br { + display: none; + } + } +} + +.footer { + display: flex; + justify-content: space-evenly; + margin: 10px 0px; + + .footerLinks { + display: flex; + flex-direction: row; + gap: 10px; + + a { + color: #ffffff; + } + } + + .footerIcon { + background: #262262; + border-radius: 50%; + height: 25px; + width: 25px; + color: white; + display: flex; + align-items: center; + justify-content: center; + } +} + +.ebookForm { + color: #b5d2dc; + background: #130c49; + padding: 20px; + border-radius: 1rem; + + input[type='text'], + [type='email'] { + display: flex; + color: #b5d2dc; + width: 100%; + height: 2.93694rem; + justify-content: center; + align-items: center; + margin: 0px 0px 20px 0px; + background: #272361; + border-radius: 0.5rem; + border-style: none; + } + + input[type='textarea'] { + background: #272361; + height: 40px; + max-height: 200px !important; + } + + .actions { + display: flex; + justify-content: center; + } + + input[type='submit'] { + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + ::marker { + display: none; + } + + ul { + padding-left: 0; + } + + li, + span, + label { + list-style: none; + color: #b5d2dc; + font-size: 14px !important; + text-align: left; + font-style: normal; + margin: 20px 0px; + font-family: Inter; + + p { + font-style: normal; + color: #6e84a3; + font-family: Inter; + font-size: 0.88106rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.38619rem */ + } + } +} + +.formWrapper { + max-height: 670px; + overflow-y: auto; + width: 100%; + padding: 10px; +} diff --git a/src/components/Signup/Introduction/introduction.jsx b/src/components/Signup/Introduction/introduction.jsx index 2b15c2df0d..3bee413410 100644 --- a/src/components/Signup/Introduction/introduction.jsx +++ b/src/components/Signup/Introduction/introduction.jsx @@ -79,9 +79,7 @@ export default function introduction() {
      -
      +
      @@ -102,7 +100,7 @@ export default function introduction() { Have questions about pricing?

      - Contact us + Contact us
      diff --git a/src/components/Signup/Introduction/styles.module.scss b/src/components/Signup/Introduction/styles.module.scss index 37f18a00b9..24dfdf8dbc 100644 --- a/src/components/Signup/Introduction/styles.module.scss +++ b/src/components/Signup/Introduction/styles.module.scss @@ -496,10 +496,6 @@ p { background-position: center; } -.writesonic { - background-image: url('/img/site/writesonic-dark-logo.svg'); - background-position: center; -} .logoSection { display: contents; diff --git a/src/components/Signup/Party/index.jsx b/src/components/Signup/Party/index.jsx new file mode 100644 index 0000000000..aab7eea12a --- /dev/null +++ b/src/components/Signup/Party/index.jsx @@ -0,0 +1,42 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: 'b1edc7c4-e5ff-4077-832b-26c0ad4f5f7a', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( +
      +
      +
      +
      +
      +
      +
      +

      Weaviate

      +

      AI Builder Secret Party

      +
      +
      +
      +
      +
      +
      +
      + ); +} diff --git a/src/components/Signup/Party/styles.module.scss b/src/components/Signup/Party/styles.module.scss new file mode 100644 index 0000000000..2767650716 --- /dev/null +++ b/src/components/Signup/Party/styles.module.scss @@ -0,0 +1,377 @@ +@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap'); + +.demoContainer { + display: flex; + margin: auto; + background: #131144; + + background-image: linear-gradient( + to right, + rgba(128, 128, 255, 1) 1px, + transparent 1px + ), + linear-gradient(to bottom, rgba(128, 128, 255, 0.5) 1px, transparent 1px); + background-size: 40px 40px; + position: relative; + overflow: hidden; + height: 100vh; + animation: gridScroll 10s linear infinite; + + @media screen and (max-width: 780px) { + height: auto; + flex-direction: column-reverse; + } +} + +@keyframes gridGlow { + 0% { + background-color: #131144; + background-image: linear-gradient( + to right, + rgba(128, 128, 128, 0.8) 1px, + transparent 1px + ), + linear-gradient(to bottom, rgba(128, 128, 128, 0.3) 1px, transparent 1px); + } + 100% { + background-color: #0d1132; + background-image: linear-gradient( + to right, + rgba(128, 128, 255, 1) 1px, + transparent 1px + ), + linear-gradient(to bottom, rgba(128, 128, 255, 0.5) 1px, transparent 1px); + } +} + +@keyframes gridScroll { + from { + background-position: 0 0; + } + to { + background-position: 0 -40px; + } +} + +.demoTitle { + display: flex; + flex-direction: column; + gap: 24px; + + img { + margin-bottom: 10px; + } + + span { + color: #ddebf2; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 2rem */ + } + + p { + margin-bottom: 20px; + + width: 85%; + color: #130c49; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 1.6rem */ + + @media screen and (max-width: 850px) { + width: 100%; + } + } + + .demoLogo { + width: 10.43744rem; + height: 1.43244rem; + flex-shrink: 0; + background-image: url('/img/site/weaviate-logo-light-alpha.svg'); + background-size: cover; + } +} + +.contentContainer { + max-width: 1260px; + margin: auto; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 20px; +} +.content { + display: flex; + justify-content: center; + gap: 40px; + + @media screen and (max-width: 900px) { + flex-direction: column-reverse; + gap: 20px; + } +} + +.contentSideA { + display: flex; + flex-direction: column; + justify-content: space-evenly; + width: 100%; + + .smallText { + font-size: 1rem; + } + + h3 { + font-size: 2.5rem; + color: #fff; + font-family: 'Press Start 2P', cursive; + } + + p { + font-size: 18px; + color: #fff; + font-family: 'Plus Jakarta Sans'; + } + + .contentImage { + background: url('/img/site/weaviate-secret-party.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + width: 90%; + height: 100vh; + + @media screen and (max-width: 780px) { + width: 100%; + } + } +} + +.contentSideB { + display: flex; + align-items: center; + width: 100%; + padding: 1rem 2rem 1rem 1rem; + + @media screen and (max-width: 780px) { + flex-direction: column; + gap: 20px; + padding: 3rem; + } + + h1 { + color: #2fc514; + font-family: 'Press Start 2P'; + font-size: 3rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 4.2rem */ + + @media screen and (max-width: 1200px) { + width: 100%; + } + + @media screen and (max-width: 780px) { + font-size: 2rem; + word-wrap: normal; + } + } + + h3 { + font-size: 24px; + color: #b9c8de; + font-family: 'Press Start 2P', cursive; + } + + p { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 18px; + + font-weight: 400; + line-height: 140%; + } + + .button { + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: rgba(255, 255, 255, 0.6); + text-align: center; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 1.3125rem */ + } +} + +.signUpBox { + margin: auto; + flex-shrink: 0; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + } +} + +.signUp { + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 780px) { + width: 100%; + } +} + +.investorButton { + margin-top: 25px; +} + +.demoSideB h2 { + font-size: 1.5rem; +} + +.demoSideA p, +.demoSideB p, +.typeQuote p, +.typeQuote span { + font-size: 0.9rem; +} + +.typeIcon .homeIcon, +.typeIcon .ragIcon, +.typeIcon .genIcon { + width: 1.75rem; + height: 1.75rem; +} + +.typeQuote .image { + width: 5rem; + height: 5rem; /* Smaller starting quote image size */ +} + +/* Increase Font and Image Size as Screen Size Decreases */ + +@media screen and (max-width: 1100px) { + .demoSideA h1, + .demoSideB h2 { + font-size: 1.75rem; + } + + .demoSideA p, + .demoSideB p { + font-size: 1rem; + } + + .typeIcon .homeIcon, + .typeIcon .ragIcon, + .typeIcon .genIcon { + width: 2.125rem; + height: 2.125rem; + } + + .signUpBox { + width: 100%; + height: auto; + } + + .typeQuote .image { + width: 5.5rem; + height: 5.5rem; + } +} + +@media screen and (max-width: 700px) { + .demoSideA h1, + .demoSideB h2 { + br { + display: none; + } + } +} + +.footer { + display: flex; + justify-content: space-evenly; + margin: 10px 0px; + + span { + font-family: 'Press Start 2P', cursive; + } + + .footerLinks { + display: flex; + flex-direction: row; + gap: 10px; + } + + .footerIcon { + background: #262262; + border-radius: 50%; + height: 25px; + width: 25px; + color: white; + display: flex; + align-items: center; + justify-content: center; + } +} + +.hsForm { + span, + p, + ::placeholder { + font-family: 'Press Start 2P'; + } + input { + border: 2px solid #2fc514; + width: 100%; + background: none; + height: 50px; + margin: 10px 0px; + font-family: 'Press Start 2P'; + color: #fff; + } + + input[type='submit'] { + margin: 10px 0px; + border: 1px solid #2fc514; + background: #2fc514; + font-family: 'Press Start 2P'; + color: #130c49; + } + + label { + font-family: 'Press Start 2P'; + color: #fff; + font-size: 10px; + } + + ul { + padding: 0; + } +} diff --git a/src/components/Signup/Reports/index.jsx b/src/components/Signup/Reports/index.jsx new file mode 100644 index 0000000000..8bbbfeea3a --- /dev/null +++ b/src/components/Signup/Reports/index.jsx @@ -0,0 +1,89 @@ +import Link from '@docusaurus/Link'; +import React, { useEffect } from 'react'; +import styles from './styles.module.scss'; +import { css } from 'styled-components'; + +export default function Introduction() { + useEffect(() => { + // Load the external HubSpot form script + const script = document.createElement('script'); + script.src = '//js.hsforms.net/forms/embed/v2.js'; + script.async = true; + script.onload = () => { + if (window.hbspt) { + window.hbspt.forms.create({ + portalId: '8738733', + formId: '870eca82-9147-4753-a021-856a4cd6883e', + target: '#hs-form', + }); + } + }; + document.body.appendChild(script); + }, []); + + return ( + <> +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + ANALYST REPORT +

      + GigaOm Sonar Report for Vector Databases +

      + + Weaviate named a Leader and Fast-Mover{' '} + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + “[Weaviate] is in the Leader circle because of cost-saving + techniques that include storage tiering, its use of language models + for summarization and NLQ, and a modular approach to accessing + models for embedding content and ranking search results.” + +

      + Gigaom Sonar Report for Vector Databases by Andrew Brust and Jelani + Harper, December 11. 2024 +

      +
      +
      +

      About the report

      +

      + The GigaOm Sonar Report for Vector Databases provides a thorough + examination of the rapidly evolving vector database market. In its + second edition, the report equips IT decision-makers with detailed + insights into vendor offerings and evaluation criteria, including: +

      +

      +
        +
      • Cost-Saving Constructs
      • +
      • Indexing Utility
      • +
      • Multimodality
      • +
      • Use of Language Models
      • +
      • Embedding Flexibility
      • +
      • Search Versatility
      • +
      • Real-Time Applicability
      • +
      +
      +
      + + ); +} diff --git a/src/components/Signup/Reports/styles.module.scss b/src/components/Signup/Reports/styles.module.scss new file mode 100644 index 0000000000..cd7bfe8516 --- /dev/null +++ b/src/components/Signup/Reports/styles.module.scss @@ -0,0 +1,484 @@ +.demoContainer { + margin: auto; + background: #131144; + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + + @media screen and (max-width: 900px) { + background-size: cover; + background-position-y: bottom; + background-repeat: no-repeat; + background-position-x: left; + height: auto; + } +} + +.demoTitle { + display: flex; + flex-direction: column; + gap: 10px; + + img { + margin-bottom: 10px; + } + + .demoLogo { + width: 10.43744rem; + height: 1.43244rem; + flex-shrink: 0; + background-image: url('/img/site/weaviate-logo-light-alpha.svg'); + background-size: cover; + } +} + +.contentContainer { + max-width: 1060px; + margin: auto; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 20px; +} +.content { + display: flex; + justify-content: center; + gap: 40px; + + @media screen and (max-width: 900px) { + flex-direction: column-reverse; + gap: 20px; + } +} + +.contentSideA { + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + + @media screen and (max-width: 1100px) { + width: 70%; + } + + @media screen and (max-width: 900px) { + width: 100%; + } + + .smallText { + font-size: 1rem; + } + + h3 { + font-size: 24px; + color: #fff; + } + + p { + font-size: 15px; + color: #fff; + font-family: 'Plus Jakarta Sans'; + } + + span { + color: #ffffff; + font-style: italic; + font-size: 1.1rem; + } + + .reportImage { + background: url('/img/site/sonar-chart.svg'); + + background-size: contain; + background-position: center; + background-repeat: no-repeat; + height: 34rem; + width: 100%; + + @media screen and (max-width: 900px) { + background-size: contain; + background-position: center; + background-repeat: no-repeat; + height: 44rem; + width: 100%; + margin: 20px auto; + } + + @media screen and (max-width: 700px) { + background-size: contain; + background-position: center; + background-repeat: no-repeat; + height: 24rem; + width: 100%; + margin: 20px auto; + } + } +} + +.contentSideB { + display: flex; + align-items: flex-start; + justify-content: center; + flex-direction: column; + + @media screen and (max-width: 780px) { + flex-direction: column; + gap: 20px; + } + + h1 { + color: #61bd73; + font-family: 'Plus Jakarta Sans'; + font-size: 2rem; + font-style: normal; + font-weight: 600; + line-height: 140%; /* 3.5rem */ + } + + p { + color: #fff; + font-family: 'Plus Jakarta Sans'; + font-size: 18px; + + font-weight: 400; + line-height: 140%; + } + + .button { + border-radius: 0.3125rem; + background: #fff; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + span { + color: #ecf4f8; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: 140%; + text-transform: uppercase; + } + + .subTitle { + color: #ecf4f8; + font-family: 'Plus Jakarta Sans'; + text-transform: capitalize; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 2.1rem */ + } +} + +.signUpBox { + margin: auto; + flex-shrink: 0; + + @media screen and (max-width: 1300px) { + width: 100%; + height: auto; + } +} + +.signUp { + display: flex; + flex-direction: column; + gap: 20px; + + @media screen and (max-width: 780px) { + width: 100%; + } +} + +.contentBottom { + display: flex; + gap: 35px; + width: 100%; + flex-direction: row-reverse; + max-width: 1060px; + margin: 30px auto; + padding: 2rem; + + @media screen and (max-width: 1100px) { + flex-direction: column-reverse; + gap: 20px; + } + + .smallText { + font-size: 1rem; + } + + h3 { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 2.25rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + p { + color: #130c49; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + line-height: 160%; /* 2rem */ + } + + span { + color: #130c49; + font-family: 'Plus Jakarta Sans'; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 157.33%; /* 1.96663rem */ + } + + .quoteContainer { + display: flex; + flex-direction: column; + justify-content: space-evenly; + border-radius: 1.25rem; + background: #f7f9fd; + max-width: 25.6875rem; + width: 100%; + + height: 30rem; + flex-shrink: 0; + filter: drop-shadow(0px 3px 5px rgba(79, 150, 172, 0.1)); + padding: 2rem; + + @media screen and (max-width: 1100px) { + max-width: 100%; + } + } + + .quote { + color: #130c49; + font-family: Inter; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.37663rem */ + } + + ul, + li { + color: #130c49; + font-family: Inter; + font-size: 1.25rem; + font-style: normal; + font-weight: 500; + line-height: 160%; /* 2rem */ + } +} + +.investorButton { + margin-top: 25px; +} + +.demoSideB h2 { + font-size: 1.5rem; +} + +.demoSideA p, +.demoSideB p, +.typeQuote p, +.typeQuote span { + font-size: 0.9rem; +} + +.typeIcon .homeIcon, +.typeIcon .ragIcon, +.typeIcon .genIcon { + width: 1.75rem; + height: 1.75rem; +} + +.signUpBox { + width: 28rem; + height: auto; +} + +.typeQuote .image { + width: 5rem; + height: 5rem; /* Smaller starting quote image size */ +} + +/* Increase Font and Image Size as Screen Size Decreases */ + +@media screen and (max-width: 1100px) { + .demoSideA h1, + .demoSideB h2 { + font-size: 1.75rem; + } + + .demoSideA p, + .demoSideB p { + font-size: 1rem; + } + + .typeIcon .homeIcon, + .typeIcon .ragIcon, + .typeIcon .genIcon { + width: 2.125rem; + height: 2.125rem; + } + + .signUpBox { + width: 100%; + height: auto; + } + + .typeQuote .image { + width: 5.5rem; + height: 5.5rem; + } +} + +@media screen and (max-width: 700px) { + .demoSideA h1, + .demoSideB h2 { + br { + display: none; + } + } +} + +.footer { + display: flex; + justify-content: space-evenly; + margin: 10px 0px; + + .footerLinks { + display: flex; + flex-direction: row; + gap: 10px; + + a { + color: #ffffff; + } + } + + .footerIcon { + background: #262262; + border-radius: 50%; + height: 25px; + width: 25px; + color: white; + display: flex; + align-items: center; + justify-content: center; + } +} + +.ebookForm { + color: #b5d2dc; + background: #130c49; + padding: 20px 0px; + + input[type='text'], + input[type='email'] { + display: flex; + color: #b5d2dc; + width: 100% !important; + height: 2.93694rem; + justify-content: center; + align-items: center; + margin: 0px 0px 20px 0px; + background: #272361; + border-radius: 0.5rem; + border-style: none; + } + + input[type='textarea'] { + background: #272361; + height: 40px; + max-height: 200px !important; + } + + .actions { + display: flex; + justify-content: center; + } + + input[type='submit'] { + display: flex; + width: 100%; + padding: 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + border-radius: 0.3125rem; + + background: #61bd73; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08), + 0px 0px 1px 0px rgba(0, 0, 0, 0.25); + color: #130c49; + text-align: center; + font-family: Inter; + font-size: 1rem; + font-style: normal; + font-weight: 600; + line-height: normal; + } + + ::marker { + display: none; + } + + ul { + padding-left: 0; + } + + li, + span, + label { + list-style: none; + color: #b5d2dc; + font-size: 14px !important; + text-align: left; + font-style: normal; + text-transform: capitalize; + font-family: Inter; + + p { + margin-left: 24px; + font-style: normal; + color: #6e84a3; + font-family: Inter; + font-size: 0.75rem; + font-style: normal; + font-weight: 400; + line-height: 157.33%; /* 1.38619rem */ + } + } + + fieldset { + @media screen and (max-width: 895px) { + max-width: 100%; + } + } +} + +.formWrapper { + max-height: 670px; + overflow-y: auto; + width: 100%; +} diff --git a/src/components/Subprocessors/Header/index.jsx b/src/components/Subprocessors/Header/index.jsx new file mode 100644 index 0000000000..ef0fa7ff96 --- /dev/null +++ b/src/components/Subprocessors/Header/index.jsx @@ -0,0 +1,19 @@ +import React from 'react'; +import styles from './styles.module.scss'; + +export default function Header() { + return ( +
      +
      +

      List of Subprocessors

      +
      +

      + This page lists the subprocessors that we use to provide our + services. Subprocessors are third-party data processors that we use + to provide our services. +

      +
      +
      +
      + ); +} diff --git a/src/components/Subprocessors/Header/styles.module.scss b/src/components/Subprocessors/Header/styles.module.scss new file mode 100644 index 0000000000..f3af6d6185 --- /dev/null +++ b/src/components/Subprocessors/Header/styles.module.scss @@ -0,0 +1,30 @@ +.box { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + margin: 0px 0px 40px 0px; + + h1 { + color: #130c49; + text-align: center; + font-family: Plus Jakarta Sans; + font-size: 2.25rem; + font-style: normal; + font-weight: 700; + line-height: 140%; /* 3.15rem */ + margin-bottom: 1rem; + } + + .headerBox { + width: 50%; + @media screen and (max-width: 900px) { + width: 100%; + } + + p { + color: #130c49; + } + } +} diff --git a/src/css/custom.scss b/src/css/custom.scss index 1fd73e60ef..cadea1d2b8 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -529,7 +529,7 @@ button.close { img { display: none; } - background-image: url('/img/site/weaviate-nav-logo-light.svg'); + background-image: url('/img/site/weaviate-logo-horizontal-dark-1.svg'); } } @@ -560,20 +560,24 @@ button.close { } .navbar { - background: linear-gradient( - 90deg, - rgba(0, 0, 0, 1) 4%, - rgba(17, 11, 62, 1) 50%, - rgba(25, 16, 92, 1) 96% - ); + background: var(--site-background); box-shadow: none; + border-bottom: solid var(--ifm-toc-border-color); + border-width: 1px; } .navbar__logo { img { display: none; } - background-image: url('/img/site/weaviate-nav-logo-dark.svg'); + + background-image: url('/img/site/weaviate-logo-horizontal-light-1.svg'); + background-size: contain; + background-repeat: no-repeat; + } + + .blogContainer { + background-color: #0c1428; } .footer--dark { @@ -752,13 +756,13 @@ Dropdown style removed. .custom-page .footer__links:before { content: ''; - background-image: url('/img/site/weaviate-nav-logo-dark.svg'); + background-image: url('/img/site/weaviate-logo-horizontal-light-1.svg'); background-size: contain; background-repeat: no-repeat; - width: 11rem; - height: 11rem; - margin: -21px 0px 0px 0px; + height: 2rem; + margin: -1px 0 0; + width: 8rem; } .content_node_modules-\@docusaurus-theme-classic-lib-theme-AnnouncementBar-Content-styles-module { @@ -1026,3 +1030,7 @@ ul.dropdown__menu { .loadingIcon { margin: auto; } + +.support-page li { + font-size: 1.2rem; +} diff --git a/src/css/shared.scss b/src/css/shared.scss index 3b9bfe4962..4f43c7eaf8 100644 --- a/src/css/shared.scss +++ b/src/css/shared.scss @@ -17,7 +17,9 @@ // fonticon links a { - .fab, .fas, .far { + .fab, + .fas, + .far { color: var(--site-link-font-color); } } @@ -25,3 +27,21 @@ a { .page-title { font-family: var(--site-font-fun-heading-family) !important; } + +.subprocessors { + color: #130c49; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 20px; + width: 80%; + margin: auto; + + @media screen and (max-width: 900px) { + width: 100%; + + table { + width: 100%; + } + } +} diff --git a/src/pages/SLA.md b/src/pages/SLA.md index 2a03e5193a..ae650bd40e 100644 --- a/src/pages/SLA.md +++ b/src/pages/SLA.md @@ -64,9 +64,9 @@ Planned maintenance windows are periods during which the availability of the ser Weaviate employs different backup policies for each tier: -- **Standard Tier:** Daily full backup stored in the same region for 7 days. -- **Professional Tier:** Daily full backup stored in another region for 30 days. -- **Business Critical Tier:** Daily full backup stored in another region for 30 days. +- **Standard Tier:** Daily full backup, stored in the same region for 7 days. +- **Professional Tier:** Daily full backup, stored in the same region for 14 days. +- **Business Critical Tier:** Daily full backup, stored in the same region for 30 days.

      ### **Monitoring** diff --git a/src/pages/_javascript.jsx b/src/pages/_javascript.jsx new file mode 100644 index 0000000000..9621f4b06c --- /dev/null +++ b/src/pages/_javascript.jsx @@ -0,0 +1,39 @@ +import React, { useEffect } from 'react'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import { MetaSEO } from '/src/theme/MetaSEO'; + +import Recipes from '/src/components/Javascript/Recipes'; +import Steps from '/src/components/Javascript/Steps'; +import Details from '/src/components/Javascript/Details'; +import Header from '/src/components/Javascript/Header'; +import List from '/src/components/Javascript/List'; +import Tabs from '/src/components/Javascript/Tabs'; +import ThemeSwitch from '/src/components/ThemeSwitch'; +import Resources from '/src/components/Javascript/Resources'; +import BuildWith from '../components/Javascript/BWW'; + +export default function Home() { + const { siteConfig } = useDocusaurusContext(); + + return ( +
      + + +
      +
      +
      + + + + + +
      + + +
      + ); +} diff --git a/src/pages/case-studies/_morningstarV2.jsx b/src/pages/case-studies/_morningstarV2.jsx new file mode 100644 index 0000000000..9ed479bdd7 --- /dev/null +++ b/src/pages/case-studies/_morningstarV2.jsx @@ -0,0 +1,25 @@ +import React, { useState, useEffect } from 'react'; +import Layout from '@theme/Layout'; +import StudyHeader from '/src/components/CaseStudies/V2/Header'; +import ContactUsForm from '/src/components/ContactUsForm'; +import Main from '/src/components/CaseStudies/V2/Main'; +import Study from '/src/components/CaseStudies/V2/Study'; +import Stories from '/src/components/CaseStudies/V2/Stories'; +import ThemeSwitch from '/src/components/ThemeSwitch'; +import Integrations from '/src/components/CaseStudies/V2/Integrations'; + +export default function CaseStudyPage() { + return ( +
      + + +
      + + + +
      + ); +} diff --git a/src/pages/case-studies/finance.jsx b/src/pages/case-studies/finance.jsx new file mode 100644 index 0000000000..a8f87b66db --- /dev/null +++ b/src/pages/case-studies/finance.jsx @@ -0,0 +1,25 @@ +import React, { useState, useEffect } from 'react'; +import Layout from '@theme/Layout'; +import StudyHeader from '/src/components/Service/Finance/Header'; +import ContactUsForm from '/src/components/ContactUsForm'; +import Study from '/src/components/Service/Finance/Study'; +import ThemeSwitch from '/src/components/ThemeSwitch'; + +import Integrations from '/src/components/Service/CaseStudy/Integrations'; + +export default function CaseStudyPage() { + return ( +
      + + + + + + + +
      + ); +} diff --git a/src/pages/case-studies/index.jsx b/src/pages/case-studies/index.jsx new file mode 100644 index 0000000000..ff04cc7a71 --- /dev/null +++ b/src/pages/case-studies/index.jsx @@ -0,0 +1,20 @@ +import React, { useState, useEffect } from 'react'; +import Layout from '@theme/Layout'; +import StudyHeader from '/src/components/CaseStudies/Header'; +import Main from '/src/components/CaseStudies/Main'; +import ThemeSwitch from '/src/components/ThemeSwitch'; + +export default function CaseStudyPage() { + return ( +
      + + +
      + + +
      + ); +} diff --git a/src/pages/contact.jsx b/src/pages/contact.jsx new file mode 100644 index 0000000000..4510f42862 --- /dev/null +++ b/src/pages/contact.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import { MetaSEO } from '/src/theme/MetaSEO'; + +import Header from '/src/components/Contact/Header'; +import ContactFrom from '/src/components/Contact/contactForm.jsx'; +import ThemeSwitch from '/src/components/ThemeSwitch'; +import CTA from '/src/components/Home/Redesign/CTA'; + +export default function ContactPage() { + return ( +
      + + +
      + + + + +
      + ); +} diff --git a/src/pages/demo.jsx b/src/pages/demo.jsx new file mode 100644 index 0000000000..143f5ca67e --- /dev/null +++ b/src/pages/demo.jsx @@ -0,0 +1,32 @@ +import React, { useState } from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import { MetaSEO } from '/src/theme/MetaSEO'; +import Head from '@docusaurus/Head'; + +import Introduction from '/src/components/Signup/Demo/v2'; +import ThemeSwitch from '/src/components/ThemeSwitch'; + +export default function signUpPage() { + return ( + <> + + Request a Demo + + + + + +
      + + +
      + + ); +} diff --git a/src/pages/ebooks/_index.jsx b/src/pages/ebooks/_index.jsx new file mode 100644 index 0000000000..1793f7895a --- /dev/null +++ b/src/pages/ebooks/_index.jsx @@ -0,0 +1,32 @@ +import React, { useState } from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import { MetaSEO } from '/src/theme/MetaSEO'; +import Head from '@docusaurus/Head'; + +import Introduction from '/src/components/Signup/Guides'; +import ThemeSwitch from '/src/components/ThemeSwitch'; + +export default function signUpPage() { + return ( + <> + + Get Started For Free + + + + + +
      + + +
      + + ); +} diff --git a/src/pages/ebooks/choosing-the-right-database-for-AI.jsx b/src/pages/ebooks/choosing-the-right-database-for-AI.jsx new file mode 100644 index 0000000000..8b1b136336 --- /dev/null +++ b/src/pages/ebooks/choosing-the-right-database-for-AI.jsx @@ -0,0 +1,35 @@ +import React, { useState } from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import { MetaSEO } from '/src/theme/MetaSEO'; +import Head from '@docusaurus/Head'; + +import Introduction from '/src/components/Signup/Ebooks/v2'; +import ThemeSwitch from '/src/components/ThemeSwitch'; + +export default function signUpPage() { + return ( + <> + + Ebook: Choosing the Right Database For AI + + + + + +
      + + +
      + + ); +} diff --git a/src/pages/index.jsx b/src/pages/index.jsx index ce3025b568..1600134f49 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -8,7 +8,7 @@ import HomepageHeader from '/src/components/Home/Redesign/Header'; import HomepageWhatYouCanDo from '/src/components/Home/Redesign/WhatYouCanDoUpdate'; import HomepageLovedByDevelopers from '/src/components/Home/Redesign/LovedByDeveloperUpdate/index.jsx'; import HomepageJoinCommunity from '/src/components/Home/Redesign/JoinCommunityUpdate'; -import HomepageIntegrations from '/src/components/Home/Redesign/IntegrationsUpdate'; +import HomepageIntegrations from '/src/components/Home/Redesign/IntegrationsUpdate/v2.jsx'; import HomepageTestimonials from '/src/components/Home/Redesign/Testimonials'; import Resources from '/src/components/Home/Redesign/Resources'; import CTA from '/src/components/Home/Redesign/CTA'; diff --git a/src/pages/learn/index.jsx b/src/pages/learn/index.jsx new file mode 100644 index 0000000000..5c396f36f6 --- /dev/null +++ b/src/pages/learn/index.jsx @@ -0,0 +1,36 @@ +import React, { useEffect } from 'react'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import { MetaSEO } from '/src/theme/MetaSEO'; + +import Header from '/src/components/Learn/Header'; +import GetStarted from '/src/components/Learn/GetStarted'; +import Documentation from '/src/components/Learn/Documentation'; +import Examples from '/src/components/Learn/Examples'; +import Guides from '/src/components/Learn/Guides'; +import GoFurther from '/src/components/Learn/Further'; +import Resources from '../../components/Learn/Resources'; +import ThemeSwitch from '/src/components/ThemeSwitch'; + +export default function Home() { + return ( +
      + + +
      +
      + + + + + + +
      + + +
      + ); +} diff --git a/src/pages/learn/knowledgecards.jsx b/src/pages/learn/knowledgecards.jsx index 648ca75543..ae69439706 100644 --- a/src/pages/learn/knowledgecards.jsx +++ b/src/pages/learn/knowledgecards.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import Layout from '@theme/Layout'; import { MetaSEO } from '/src/theme/MetaSEO'; - +import Head from '@docusaurus/Head'; import KnowledgeHeader from '/src/components/Knowledgebase/Knowledgeheader'; import KnowledgeBase from '/src/components/Knowledgebase/knowledgebase'; import ThemeSwitch from '/src/components/ThemeSwitch'; @@ -14,6 +14,9 @@ export default function KnowledgeBasePage() { }; return (
      + + + +
      ); diff --git a/src/pages/learn/knowledgecards/Knowledgeheader.jsx b/src/pages/learn/knowledgecards/Knowledgeheader.jsx index dc54f31c30..3f43369768 100644 --- a/src/pages/learn/knowledgecards/Knowledgeheader.jsx +++ b/src/pages/learn/knowledgecards/Knowledgeheader.jsx @@ -6,9 +6,6 @@ import Head from '@docusaurus/Head'; export default function KnowledgeHeader() { return ( <> - - -
      diff --git a/src/pages/learn/knowledgecards/alpha-parameter.jsx b/src/pages/learn/knowledgecards/alpha-parameter.jsx index af2e53981e..269d2269b9 100644 --- a/src/pages/learn/knowledgecards/alpha-parameter.jsx +++ b/src/pages/learn/knowledgecards/alpha-parameter.jsx @@ -67,6 +67,7 @@ const KnowledgeBasePage = () => { property="og:title" content="Alpha Parameter - Weaviate Knowledge Cards" /> + { property="og:title" content="ANN - Approximate Nearest Neighbor - Weaviate Knowledge Cards" /> + { property="og:title" content="Any-to-any Search - Weaviate Knowledge Cards" /> + { property="og:title" content="Binary Embeddings - Weaviate Knowledge Cards" /> + { property="og:title" content="BM25/BM25F - Weaviate Knowledge Cards" /> + { property="og:title" content="Chunking - Weaviate Knowledge Cards" /> + { property="og:title" content="Cross Modal Reasoning - Weaviate Knowledge Cards" /> + { property="og:title" content="Dense Embeddings - Weaviate Knowledge Cards" /> + { property="og:title" content="Dense Vectors - Weaviate Knowledge Cards" /> + { property="og:title" content="Document-Based Chunking - Weaviate Knowledge Cards" /> + { property="og:title" content="Embedding model - Weaviate Knowledge Cards" /> + { property="og:title" content="Embeddings Model - Weaviate Knowledge Cards" /> + { property="og:title" content="Finetuning - Weaviate Knowledge Cards" /> + { property="og:title" content="Fixed Size Chunking - Weaviate Knowledge Cards" /> + { property="og:title" content="Fusion Algorithm - Weaviate Knowledge Cards" /> + { property="og:title" content="Generative AI - Weaviate Knowledge Cards" /> + { property="og:title" content="Graph Database - Weaviate Knowledge Cards" /> + { property="og:title" content="Graph-Based Index - Weaviate Knowledge Cards" /> + { property="og:title" content="Hierarchical Graph Structure - Weaviate Knowledge Cards" /> + { {card.title} - Weaviate Knowledge Cards {/* Open Graph */} + { property="og:title" content="Hybrid Search - Weaviate Knowledge Cards" /> + { property="og:title" content="Inverted Indexes - Weaviate Knowledge Cards" /> + { property="og:title" content="Keyword Search - Weaviate Knowledge Cards" /> + { property="og:title" content="Large Language Model (LLM) - Weaviate Knowledge Cards" /> + { property="og:title" content="Layered Navigation - Weaviate Knowledge Cards" /> + { property="og:title" content="LLM-Based Chunking - Weaviate Knowledge Cards" /> + { property="og:title" content="Multi Tenancy - Weaviate Knowledge Cards" /> + { property="og:title" content="Multimodal Contrastive Finetuning - Weaviate Knowledge Cards" /> + { property="og:title" content="Multimodal Embeddings Models - Weaviate Knowledge Cards" /> + { property="og:title" content="Multimodal RAG - Weaviate Knowledge Cards" /> + { property="og:title" content="Multi-modal - Weaviate Knowledge Cards" /> + diff --git a/src/pages/learn/knowledgecards/multivector-embeddings.jsx b/src/pages/learn/knowledgecards/multivector-embeddings.jsx index c79600c803..028d291f91 100644 --- a/src/pages/learn/knowledgecards/multivector-embeddings.jsx +++ b/src/pages/learn/knowledgecards/multivector-embeddings.jsx @@ -67,6 +67,7 @@ const KnowledgeBasePage = () => { property="og:title" content="Multi-vector Embeddings - Weaviate Knowledge Cards" /> + { {card.title} - Weaviate Knowledge Cards {/* Open Graph */} + { property="og:title" content="Quantized Embeddings - Weaviate Knowledge Cards" /> + { property="og:title" content="Recursive Chunking - Weaviate Knowledge Cards" /> + { property="og:title" content="Relational Database - Weaviate Knowledge Cards" /> + { property="og:title" content="Reranking - Weaviate Knowledge Cards" /> + { property="og:title" content="Retrieval Augmented Generation (RAG) - Weaviate Knowledge Cards" /> + { property="og:title" content="Semantic Chunking - Weaviate Knowledge Cards" /> + { property="og:title" content="Semantic/Vector Search - Weaviate Knowledge Cards" /> + { property="og:title" content="Sharding - Weaviate Knowledge Cards" /> + { return ( <> - - -
      {!shareSuccess && !showShareOptions && ( + + ) : ( + + + + )} +
      +
      +
      + {app.name} +
      +
      +
      + +
      +
      +
      +

      Overview

      +

      + Weaviate Embeddings is a service in Weaviate Cloud that + simplifies the creation and management of vector + embeddings. With Weaviate Embeddings, developers can + access to various embedding models without needing to send + data to an external provider. +

      +
        +
      • + Fast, flexible development: Simply + operations with one less API and vendor to manage. + Choose between class-leading OSS and proprietary models. +
      • +
      • + Freedom from rate limits: Bring models + closer to your data to reduce latency. Enable limitless + embeddings per second without artificial constraints. +
      • +
      • + GPU-powered and cost-efficient:{' '} + Maximize performance while managing costs with simple, + pay-as-you-go pricing. +
      • +
      + Details and Pricing +

      + Weaviate Embeddings is now available in Preview with the{' '} + + Snowflake arctic-embed-m-v1.5 + {' '} + text embedding model. +

      +

      + When generally available, pricing will start at $0.04 per + million tokens. +

      +
      + +
      +

      Additional details

      +

      + Availabilty:{' '} + + Preview + +

      +
      +
      +
      +
      +
      +

      Related Products

      +
      + {appData + .filter( + (relatedApp) => + relatedApp.category === app.category && + relatedApp.id !== app.id + ) + .map((relatedApp) => ( + + ))} +
      +
      +
      +
      +
      + +
      + ); +} diff --git a/src/pages/workbench/explorer.jsx b/src/pages/workbench/explorer.jsx index 35bb6c9953..235135df3a 100644 --- a/src/pages/workbench/explorer.jsx +++ b/src/pages/workbench/explorer.jsx @@ -7,7 +7,7 @@ import styles from '/src/components/Marketplace/styles.module.scss'; import AppCard from '/src/components/Marketplace/card'; export default function QueryPage() { - const app = appData.find((app) => app.id === 'explorer'); + const app = appData.find((app) => app.name === 'Explorer'); if (!app) return
      App not found
      ; diff --git a/src/pages/workbench/query.jsx b/src/pages/workbench/query.jsx index 9fe06c1344..00dca093d1 100644 --- a/src/pages/workbench/query.jsx +++ b/src/pages/workbench/query.jsx @@ -7,7 +7,7 @@ import styles from '/src/components/Marketplace/styles.module.scss'; import AppCard from '/src/components/Marketplace/card'; export default function QueryPage() { - const app = appData.find((app) => app.id === 'query'); + const app = appData.find((app) => app.name === 'Query'); if (!app) return
      App not found
      ; diff --git a/src/pages/workbench/recommender.jsx b/src/pages/workbench/recommender.jsx index 73a8d4334e..68fef8cc18 100644 --- a/src/pages/workbench/recommender.jsx +++ b/src/pages/workbench/recommender.jsx @@ -7,7 +7,7 @@ import styles from '/src/components/Marketplace/styles.module.scss'; import AppCard from '/src/components/Marketplace/card'; export default function QueryPage() { - const app = appData.find((app) => app.id === 'recommender'); + const app = appData.find((app) => app.name === 'Recommender Service'); if (!app) return
      App not found
      ; diff --git a/src/theme/BlogListPage/index.js b/src/theme/BlogListPage/index.js index 6480567672..a5bb454b3e 100644 --- a/src/theme/BlogListPage/index.js +++ b/src/theme/BlogListPage/index.js @@ -13,55 +13,59 @@ import BlogPostItems from '@theme/BlogPostItems'; import FeaturedBlogTags from '../FeaturedBlogTags'; import { MetaSEO } from '/src/theme/MetaSEO'; - - function BlogListPageMetadata(props) { - const {metadata} = props; + const { metadata } = props; const { - siteConfig: {title: siteTitle}, + siteConfig: { title: siteTitle }, } = useDocusaurusContext(); - const {blogDescription, blogTitle, permalink} = metadata; + const { blogDescription, blogTitle, permalink, page } = metadata; const isBlogOnlyMode = permalink === '/'; const title = isBlogOnlyMode ? siteTitle : blogTitle; - const ogimg = `og/content/${metadata.blogTitle.toLowerCase()}.jpg` + const ogimg = `og/content/${metadata.blogTitle.toLowerCase()}.jpg`; + + + const description = + page > 1 + ? `${blogDescription} - Page ${page}` + : blogDescription; + return ( <> - + - ); } + function BlogListPageContent(props) { - const {metadata, items, sidebar} = props; + const { metadata, items, sidebar } = props; return ( -

      Weaviate {metadata.blogTitle}

      +

      + Weaviate {metadata.blogTitle} +

      - {metadata.permalink == '/blog' && - - } + {metadata.permalink === '/blog' && }
      ); } + export default function BlogListPage(props) { return ( -
      - - - - - - - +
      + + + +
      ); } diff --git a/src/theme/BlogPostPage/index.js b/src/theme/BlogPostPage/index.js index 7fb4df25b8..2487cda68d 100644 --- a/src/theme/BlogPostPage/index.js +++ b/src/theme/BlogPostPage/index.js @@ -1,7 +1,7 @@ // src/theme/BlogPostPage/index.js import React from 'react'; import OriginalBlogPostPage from '@theme-original/BlogPostPage'; -import BackToBlogHub from '../../components/Blog/BacktoBlog'; +import BackToBlogHub from '/src/components/Blog/BacktoBlog'; export default function BlogPostPageWrapper(props) { return ( diff --git a/src/theme/BlogTagsPostsPage/index.js b/src/theme/BlogTagsPostsPage/index.js index e845fcccfa..9cb1ea0b25 100644 --- a/src/theme/BlogTagsPostsPage/index.js +++ b/src/theme/BlogTagsPostsPage/index.js @@ -15,6 +15,7 @@ import BlogPostItems from '@theme/BlogPostItems'; + // import BlogPostItems from '../BlogPostItems'; // Very simple pluralization: probably good enough for now function useBlogPostsPlural() { @@ -50,13 +51,15 @@ function BlogTagsPostsPageMetadata({tag}) { <> + ); } function BlogTagsPostsPageContent({tag, items, sidebar, listMetadata}) { const title = useBlogTagsPostsPageTitle(tag); return ( - + +

      {title}

      @@ -77,7 +80,8 @@ function BlogTagsPostsPageContent({tag, items, sidebar, listMetadata}) { } export default function BlogTagsPostsPage(props) { return ( -
      +
      + {/* className="custom-page noBG"*/} { + const logoElement = document.querySelector('.navbar__logo'); + + if (logoElement) { + + const handleRightClick = (e) => { + e.preventDefault(); + + if (showTooltip) { + + + + + const logoUrl = colorMode === 'dark' + ? '/img/site/weaviate-logo-horizontal-light-1.svg' + : '/img/site/weaviate-logo-horizontal-dark-1.svg'; + + + const link = document.createElement('a'); + link.href = logoUrl; + link.download = 'weaviate-logo.svg'; + link.click(); + setShowTooltip(false); + } else { + + + setShowTooltip(true); + } + }; + + + const handleClickOutside = (e) => { + if (showTooltip && !logoElement.contains(e.target)) { + + setShowTooltip(false); + } + }; + + + logoElement.addEventListener('contextmenu', handleRightClick); + document.addEventListener('mousedown', handleClickOutside); + + + return () => { + logoElement.removeEventListener('contextmenu', handleRightClick); + document.removeEventListener('mousedown', handleClickOutside); + }; + } + }, [showTooltip, colorMode]); + + return ( +
      + + {showTooltip && ( +
      + Right-click to download our logo +
      + )} +
      + ); +} diff --git a/static/_redirects b/static/_redirects index 0172886296..b0a5d7f042 100644 --- a/static/_redirects +++ b/static/_redirects @@ -1,2 +1,3 @@ # Redirect from weaviate.io/slack to the slack invite link -/slack https://join.slack.com/t/weaviate/shared_invite/zt-2r794ju2r-pqqkedoeiZ4Zt_2dk8HjtQ +# See https://www.notion.so/weaviate/Community-Slack-invite-link-updates-12d70562ccd68034abb9fdfd77cbdc02?pvs=4 for instructions +/slack https://join.slack.com/t/weaviate/shared_invite/zt-2wkvcegxt-Yn1zSWihmjjy8RlEKnx7QA diff --git a/static/data/apps.json b/static/data/apps.json index 2c9956eac1..304a1da400 100644 --- a/static/data/apps.json +++ b/static/data/apps.json @@ -1,6 +1,6 @@ [ { - "id": "query", + "id": "4", "name": "Query", "category": "Cloud Tools", "description": "Work interactively with Weaviate Cloud clusters using GraphQL.", @@ -18,7 +18,7 @@ "released": "yes" }, { - "id": "collections", + "id": "5", "name": "Collections", "category": "Cloud Tools", "description": "Create and manage collections through a graphical user interface (GUI).", @@ -36,7 +36,7 @@ "released": "yes" }, { - "id": "explorer", + "id": "6", "name": "Explorer", "category": "Cloud Tools", "description": "Search and validate object data, without writing any code.", @@ -51,13 +51,12 @@ "size": "11.09MB", "languages": ["English", "Spanish", "French", "German"], "url": "/workbench/explorer", - "released": "no", - "earlyAccess": "yes" + "released": "no" }, { - "id": "recommender", + "id": "2", "name": "Recommender Service", - "category": "AI-Native Apps", + "category": "AI-Native Services", "description": "Build personalized, multi-modal recommendations with a simple interface.", "image": "apps-recommender-icon.svg", "overviewImage1": "recommender-screenshot-01.png", @@ -70,13 +69,12 @@ "size": "11.09MB", "languages": ["English", "Spanish", "French", "German"], "url": "/workbench/recommender", - "released": "no", - "privateBeta": "yes" + "released": "yes" }, { - "id": "gfl", + "id": "3", "name": "Generative Feedback Loops", - "category": "AI-Native Apps", + "category": "AI-Native Services", "description": "Automate mundane tasks and improve the quality of your data.", "image": "apps-gfl-icon.svg", "overviewImage1": "app-screenshot-01.png", @@ -90,5 +88,22 @@ "languages": ["English", "Spanish", "French", "German"], "url": "", "released": "no" + }, + { + "id": "1", + "name": "Embeddings", + "category": "AI-Native Services", + "description": "Generate embeddings within Weaviate Cloud, without needing to connect to a third-party provider.", + "image": "embeddings-icon.svg", + "overviewImage1": "weaviate-embedding-image.svg", + "longDescription": "Say goodbye to rate limits and the hassle of managing multiple embedding providers.", + "rating": 4.5, + "price": "Free", + "version": "7.3.0", + "updated": "January 28, 2023", + "size": "2.09MB", + "languages": ["English", "Spanish", "French", "German"], + "url": "/workbench/embeddings", + "released": "yes" } ] diff --git a/static/data/blogposts.json b/static/data/blogposts.json index 62c0412f8a..cbafedd416 100644 --- a/static/data/blogposts.json +++ b/static/data/blogposts.json @@ -15,7 +15,7 @@ "type": "Blog", "backgroundImage": "/img/site/about-playbook-02.png", "tagline": "Hiring at Weaviate - finding our perfect matches!", - "photo": "jessie.png", + "photo": "jessie.jpg", "name": "Jessie de Groot", "title": "Head of People and Culture", "date": "July 7, 2023" @@ -153,9 +153,9 @@ "type": "Video", "backgroundImage": "/img/site/hero-gen-03.png", "tagline": "Weaviate Podcast Search meets Generative Feedback Loops!", - "photo": "byron.png", - "name": "Byron Voorbach", - "title": "Head of Sales Engineering", + "photo": "connor.jpg", + "name": "Connor Shorten", + "title": "Product Researcher", "date": "September 21, 2023" } ], @@ -185,9 +185,9 @@ "type": "Video", "backgroundImage": "/img/site/hero-gen-03.png", "tagline": "Weaviate Podcast Search meets Generative Feedback Loops!", - "photo": "byron.png", - "name": "Byron Voorbach", - "title": "Head of Sales Engineering", + "photo": "connor.jpg", + "name": "Connor Shorten", + "title": "Product Researcher", "date": "September 21, 2023" } ] diff --git a/static/data/demos.json b/static/data/demos.json index cdabe13f04..aabd3911e8 100644 --- a/static/data/demos.json +++ b/static/data/demos.json @@ -1,6 +1,6 @@ [ { - "stars": 41, + "stars": 54, "title": "BookRecs", "description": "Book Recommendation System", "demoLink": "https://bookrecs.weaviate.io/", @@ -9,7 +9,7 @@ "githubLink": "https://github.com/weaviate/BookRecs/" }, { - "stars": 4900, + "stars": 6300, "title": "Verba", "description": "The Golden RAGtriever", "demoLink": "https://verba.weaviate.io", @@ -19,7 +19,7 @@ "githubLink": "https://github.com/weaviate/Verba" }, { - "stars": 69, + "stars": 79, "title": "Awesome-moviate", "description": "A Movie Search Engine", "demoLink": "https://awesome-moviate.weaviate.io/", @@ -28,7 +28,7 @@ "githubLink": "https://github.com/weaviate-tutorials/awesome-moviate" }, { - "stars": 153, + "stars": 163, "title": "Heathsearch", "description": "Generative AI in Healthcare", "demoLink": "https://healthsearch.weaviate.io/", @@ -37,7 +37,16 @@ "githubLink": "https://github.com/weaviate/healthsearch-demo" }, { - "stars": 44, + "stars": 12, + "title": "Wealingo", + "description": "A personalized language-learning app", + "demoLink": "http://wealingo.weaviate.io/", + "details": "A language-learning app built using Weaviate’s vector database and Confluent Cloud, a fully managed streaming data service based on Apache Kafka. See how real-time data and vector embeddings enable personalized learning by continuously adapting to user performance.", + "blogLink": "https://weaviate.io/blog/wealingo-demo", + "githubLink": "https://github.com/weaviate/wealingo-demo" + }, + { + "stars": 46, "title": "Generator9000", "description": "Generate Synthetic Multimodal Data", "demoLink": "https://gen9000.co", @@ -46,7 +55,7 @@ "githubLink": "https://github.com/weaviate/generator9000" }, { - "stars": 45, + "stars": 52, "title": "Magic Chat", "description": "The Generative Gathering", "demoLink": "https://weaviate-magic-chat.streamlit.app/", @@ -54,7 +63,7 @@ "githubLink": "https://github.com/weaviate/st-weaviate-connection/tree/main" }, { - "stars": 8, + "stars": 9, "title": "QuoteFinder", "description": "Find a Quote to Support Any Argument", "demoLink": "https://quotefinder.weaviate.io/", diff --git a/static/data/heroes.json b/static/data/heroes.json index bc341de897..d3feb290a0 100644 --- a/static/data/heroes.json +++ b/static/data/heroes.json @@ -2,7 +2,7 @@ { "name": "Ron Parker", "title": "Senior Engineer", - "image": "/img/people/heroes/ron-parker.png", + "image": "/img/people/heroes/ron-parker.jpg", "socialLinks": { "linkedin": "https://www.linkedin.com/in/ron-parker-scbbs/", "slack": "https://weaviate.slack.com/team/U04TUKD2RK7" @@ -11,7 +11,7 @@ { "name": "Travis Rehl", "title": "Technologist & Product Leader", - "image": "/img/people/heroes/travis-rehl.png", + "image": "/img/people/heroes/travis-rehl.jpg", "socialLinks": { "linkedin": "https://linkedin.com/in/travis-rehl-tech", "slack": "https://weaviate.slack.com/team/U059QN8UMJR" @@ -20,7 +20,7 @@ { "name": "Patrice Bourgougnon", "title": "Lead Developer", - "image": "/img/people/heroes/patrice-bourgougnon.png", + "image": "/img/people/heroes/patrice-bourgougnon.jpg", "socialLinks": { "linkedin": "https://www.linkedin.com/in/patrice-bourgougnon-46a2b71b3/", "slack": "https://weaviate.slack.com/team/U02CQ2T48BC" @@ -29,7 +29,7 @@ { "name": "Bob Kozdemba", "title": "Principal Specialist Solution Architect", - "image": "/img/people/heroes/bob-kozdemba.png", + "image": "/img/people/heroes/bob-kozdemba.jpg", "socialLinks": { "linkedin": "https://www.linkedin.com/in/bob-kozdemba-230743/", "slack": "https://weaviate.slack.com/team/U05P0RU1BN2" @@ -38,7 +38,7 @@ { "name": "Eda Johnson", "title": "Principal Product Architect", - "image": "/img/people/heroes/eda-johnson.png", + "image": "/img/people/heroes/eda-johnson.jpg", "socialLinks": { "linkedin": "https://www.linkedin.com/in/eda-johnson-0a2783/", "slack": "https://weaviate.slack.com/team/U05R1P491L4" diff --git a/static/data/knowledgecards.json b/static/data/knowledgecards.json index ca4775240f..cfca066a3a 100644 --- a/static/data/knowledgecards.json +++ b/static/data/knowledgecards.json @@ -300,7 +300,7 @@ "text": "ANN algorithms calculate the approximate nearest neighbors to a query, as opposed to kNN algorithms, which calculate the true nearest neighbors...", "longText": "ANN algorithms calculate the approximate nearest neighbors to a query, as opposed to kNN algorithms, which calculate the true nearest neighbors. ANN algorithms enable the quick and efficient identification of the closest data points at scale. This makes ANN suitable for big data where speed matters more than perfect accuracy.", "link": "/developers/weaviate/quickstart", - "bloglink": "https://weaviate.io/blog/why-is-vector-search-so-fast", + "bloglink": "https://weaviate.io/blog/vector-search-explained", "blogTitle": "Why is Vector Search so Fast?", "bloglink2": "https://weaviate.io/blog/crud-support-in-weaviate", "blogTitle2": "CRUD Support in Weaviate", @@ -336,7 +336,7 @@ "text": "HNSW is a graph-based indexing technique, meaning that it organizes the data points in a graph structure rather than traditional tree-based or hash-based structures...", "longText": "HNSW is a graph-based indexing technique, meaning that it organizes the data points in a graph structure rather than traditional tree-based or hash-based structures. This graph-based approach is key to its performance in high-dimensional vector space searches.", "link": "/developers/weaviate/quickstart", - "bloglink": "https://weaviate.io/blog/why-is-vector-search-so-fast", + "bloglink": "https://weaviate.io/blog/vector-search-explained", "blogTitle": "Why is Vector Search so Fast?", "doclink": "https://weaviate.io/developers/weaviate/concepts/vector-index#hierarchical-navigable-small-world-hnsw-index", "docTitle": "HNSW Index", diff --git a/static/data/map.json b/static/data/map.json index 6c7daec3ad..4c55802a1a 100644 --- a/static/data/map.json +++ b/static/data/map.json @@ -2,7 +2,7 @@ { "name": "Aarthi Iyer", "location": { "lat": 51.5074, "lng": -0.1278 }, - "photo": "aarthi.jpeg" + "photo": "aarthi.jpg" }, { "name": "Abdel Rodriguez", @@ -17,22 +17,22 @@ { "name": "Alea Abed", "location": { "lat": 38.7759, "lng": -121.4204 }, - "photo": "alea.png" + "photo": "alea.jpg" }, { "name": "André Duis", "location": { "lat": 51.1657, "lng": 7.0846 }, - "photo": "andre.png" + "photo": "andre.jpg" }, { "name": "André Mourão", "location": { "lat": 38.7177, "lng": -9.14 }, - "photo": "andre-m.jpeg" + "photo": "andre-m.jpg" }, { "name": "Andrzej Liszka", "location": { "lat": 51.1089, "lng": 17.0395 }, - "photo": "andrzej.png" + "photo": "andrzej.jpg" }, { "name": "Ara González", @@ -52,52 +52,47 @@ { "name": "Bob van Luijt", "location": { "lat": 52.3686, "lng": 4.9051 }, - "photo": "bob.png" + "photo": "bob.jpg" }, { "name": "Byron Voorbach", "location": { "lat": 52.3686, "lng": 4.9051 }, - "photo": "byron.png" + "photo": "byron.jpg" }, { "name": "Cari Liebenberg", "location": { "lat": 52.3696, "lng": 4.9061 }, - "photo": "cari.jpeg" + "photo": "cari.jpg" }, { "name": "Charles Pierse", "location": { "lat": 53.3508, "lng": -6.2613 }, - "photo": "charles-pierse.png" + "photo": "charles-pierse.jpg" }, { "name": "Charlie Harr", "location": { "lat": 42.3611, "lng": -71.0599 }, - "photo": "charles.png" + "photo": "charles.jpg" }, { "name": "Connor Shorten", "location": { "lat": 42.3621, "lng": -71.0609 }, - "photo": "connor.png" + "photo": "connor.jpg" }, { "name": "Daniel Madalitso Phiri", "location": { "lat": 48.8576, "lng": 2.3532 }, - "photo": "daniel.png" - }, - { - "name": "David Cuthbert", - "location": { "lat": 30.3332, "lng": -81.6567 }, - "photo": "dave.jpg" + "photo": "daniel.jpg" }, { "name": "David Earl Street", "location": { "lat": 32.0819, "lng": -81.0922 }, - "photo": "david.png" + "photo": "david.jpg" }, { "name": "Dirk Kulawiak", "location": { "lat": 48.1361, "lng": 11.583 }, - "photo": "dirk.png" + "photo": "dirk.jpg" }, { "name": "Duda Nogueira", @@ -107,17 +102,17 @@ { "name": "Edward Schmuhl", "location": { "lat": 52.521, "lng": 13.406 }, - "photo": "edward.png" + "photo": "edward.jpg" }, { "name": "Emma O'Keefe", "location": { "lat": 53.3518, "lng": -6.2623 }, - "photo": "emma.png" + "photo": "emma.jpg" }, { "name": "Eric Caleb Macharia", "location": { "lat": 52.3686, "lng": 4.9051 }, - "photo": "eric.png" + "photo": "eric.jpg" }, { "name": "Erika Cardenas", @@ -127,12 +122,12 @@ { "name": "Etienne Dilocker", "location": { "lat": 51.1667, "lng": 10.4525 }, - "photo": "etienne.png" + "photo": "etienne.jpg" }, { "name": "Femke Plantinga", "location": { "lat": 41.3861, "lng": 2.1744 }, - "photo": "femke.png" + "photo": "femke.jpg" }, { "name": "Griffin James Foster", @@ -142,47 +137,42 @@ { "name": "Ieva Urbaite", "location": { "lat": 40.7138, "lng": -74.007 }, - "photo": "ieva.png" - }, - { - "name": "Jenna Claunch Zarum", - "location": { "lat": 51.5084, "lng": -0.1288 }, - "photo": "jenna.png" + "photo": "ieva.jpg" }, { "name": "Jeremy Price", "location": { "lat": 35.2571, "lng": 139.1604 }, - "photo": "jeremy.png" + "photo": "jeremy.jpg" }, { "name": "Jerónimo Irazábal", "location": { "lat": -34.6047, "lng": -58.3826 }, - "photo": "Jeronimo.jpeg" + "photo": "Jeronimo.jpg" }, { "name": "Jessie de Groot", "location": { "lat": 52.3686, "lng": 4.9051 }, - "photo": "jessie.png" + "photo": "jessie.jpg" }, { "name": "Jobi George", "location": { "lat": 37.3392, "lng": -121.8873 }, - "photo": "jobi.png" + "photo": "jobi.jpg" }, { "name": "John Trengrove", "location": { "lat": -27.4708, "lng": 153.0261 }, - "photo": "john.png" + "photo": "john.jpg" }, { "name": "Jonathan Tuite", "location": { "lat": 47.6072, "lng": -122.3331 }, - "photo": "jonathan-tuite.jpeg" + "photo": "jonathan.jpg" }, { "name": "José Luis Franco Arza", "location": { "lat": 40.4178, "lng": -3.7048 }, - "photo": "Jose-Luis-Franco.jpeg" + "photo": "Jose-Luis-Franco.jpg" }, { "name": "Joseph Stephen Green", @@ -192,12 +182,12 @@ { "name": "JP Hwang", "location": { "lat": 55.9543, "lng": -3.1893 }, - "photo": "jp.png" + "photo": "jp.jpg" }, { "name": "Kaviraj Kanagaraj", "location": { "lat": 52.0917, "lng": 5.1224 }, - "photo": "kaviraj.png" + "photo": "kaviraj.jpg" }, { "name": "Laura Ann Webster Stoye", @@ -212,12 +202,12 @@ { "name": "Loic Reyreaud", "location": { "lat": 47.3779, "lng": 8.5427 }, - "photo": "loic.png" + "photo": "loic.jpg" }, { "name": "Marcin Antas", "location": { "lat": 51.1089, "lng": 17.0395 }, - "photo": "marcin.png" + "photo": "marcin.jpg" }, { "name": "Marion Nehring", @@ -232,7 +222,7 @@ { "name": "Mike Hoppe", "location": { "lat": 41.8791, "lng": -87.6308 }, - "photo": "Mike-Hoppe.jpeg" + "photo": "Mike-Hoppe.jpg" }, { "name": "Mike Wyer", @@ -242,12 +232,12 @@ { "name": "Mohamed Badawi", "location": { "lat": 53.5521, "lng": 9.9947 }, - "photo": "Mohamed-Badawi.jpeg" + "photo": "Mohamed-Badawi.jpg" }, { "name": "Mohamed Shahin", "location": { "lat": 53.0355, "lng": -7.3005 }, - "photo": "mohamed.jpeg" + "photo": "mohamed.jpg" }, { "name": "Nathan Wilkinson", @@ -257,12 +247,12 @@ { "name": "Nick Olivetti", "location": { "lat": 40.1553, "lng": -75.2228 }, - "photo": "nick.png" + "photo": "nick.jpg" }, { "name": "Parker Duckworth", "location": { "lat": 35.4878, "lng": -80.8611 }, - "photo": "parker.png" + "photo": "parker.jpg" }, { "name": "Patrick Das", @@ -277,7 +267,7 @@ { "name": "Philip Vollet", "location": { "lat": 52.521, "lng": 13.406 }, - "photo": "philip.png" + "photo": "philip.jpg" }, { "name": "Roberto Esposito", @@ -297,7 +287,7 @@ { "name": "Sebastian Stefan Witalec", "location": { "lat": 50.2659, "lng": 19.0248 }, - "photo": "sebastian.png" + "photo": "sebastian.jpg" }, { "name": "Shan Micah Blackwood", @@ -307,7 +297,7 @@ { "name": "Shukri Hasan", "location": { "lat": 52.523, "lng": 13.407 }, - "photo": "shukri.png" + "photo": "shukri.jpg" }, { "name": "Soham Maniar", @@ -317,12 +307,12 @@ { "name": "Stefan Bogdan", "location": { "lat": 52.3696, "lng": 4.9061 }, - "photo": "stefan.png" + "photo": "stefan.jpg" }, { "name": "Svitlana Smolianova", "location": { "lat": 52.3706, "lng": 4.9071 }, - "photo": "svitlana.png" + "photo": "svitlana.jpg" }, { "name": "Thomas Benjamin Smith", @@ -337,7 +327,7 @@ { "name": "Tony Le", "location": { "lat": 47.6072, "lng": -122.3321 }, - "photo": "tony.jpeg" + "photo": "tony.jpg" }, { "name": "Victoria Slocum", @@ -347,11 +337,6 @@ { "name": "Weronika Krajcarz", "location": { "lat": 50.2659, "lng": 19.0248 }, - "photo": "wera.png" - }, - { - "name": "Zain Hasan", - "location": { "lat": 43.8793, "lng": -79.1339 }, - "photo": "zain.png" + "photo": "wera.jpg" } ] diff --git a/static/data/partners.json b/static/data/partners.json new file mode 100644 index 0000000000..35574e0101 --- /dev/null +++ b/static/data/partners.json @@ -0,0 +1,420 @@ +[ + { + "name": "Microsoft Azure", + "image": "/img/site/azure-logo-partners.svg", + "link": "/developers/weaviate/model-providers/openai-azure", + "description": "Deploy Weaviate on the Azure Marketplace and access models from OpenAI via the Microsoft Azure API.", + "tags": ["Cloud Hyperscalers", "Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Google Cloud Platform", + "image": "/img/site/gcp-icon-partners.svg", + "link": "/developers/integrations/cloud-hyperscalers/google", + "description": "Deploy Weaviate on the GCP Marketplace and seamlessly access models on AI Studio and Vertex AI.", + "tags": ["Cloud Hyperscalers", "Model Providers", "Module", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": true + }, + { + "name": "Amazon Web Services", + "image": "/img/site/awsLogo.svg", + "link": "/developers/integrations/cloud-hyperscalers/aws", + "description": "Deploy Weaviate on the AWS Marketplace and use the SageMaker and Bedrock API to access a variety of models.", + "tags": ["Cloud Hyperscalers", "Model Providers", "Module", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": true + }, + { + "name": "Firecrawl", + "image": "/img/site/firecrawl_logo.svg", + "link": "/developers/integrations/data-platforms/firecrawl", + "description": "AI-first web scraping tool.", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Context Data", + "image": "/img/site/contextdata_logo.png", + "link": "/developers/integrations/data-platforms/context-data", + "description": "VectorETL enables you to ingest data into Weaviate by using the target connection.", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Aryn", + "image": "/img/site/aryn_logo.svg", + "link": "/developers/integrations/data-platforms/aryn", + "description": "AI powered ETL system for language model applications.", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Airbyte", + "image": "/img/site/airbyte_logo.svg", + "link": "/developers/integrations/data-platforms/airbyte", + "description": "An open-source data integration engine.", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Confluent", + "image": "/img/site/confluent_logo.svg", + "link": "/developers/integrations/data-platforms/confluent-cloud", + "description": "Fully managed Apache Kafka service for real-time streaming. ", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "Internal", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Astronomer", + "image": "/img/site/astronomer_logo.svg", + "link": "/developers/integrations/data-platforms/astronomer", + "description": "Managed Apache Airflow for data ingestion into Weaviate.", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Databricks", + "image": "/img/site/databricks_logo.svg", + "link": "/developers/integrations/data-platforms/databricks", + "description": "Use models hosted on the Databricks platform and ingest Spark data structured from Databricks into Weaviate.", + "tags": ["Data Platforms", "Model Providers", "Module", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": true + }, + { + "name": "Unstructured", + "image": "/img/site/unstructuredio_logo.png", + "link": "/developers/integrations/data-platforms/unstructured", + "description": "Platform and tools to work with unstructured data for RAG applications.", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Replicate", + "image": "/img/site/replicate_logo.jpeg", + "link": "/developers/integrations/compute-infrastructure/replicate", + "description": "Run machine learning models through a cloud API.", + "tags": ["Compute Infrastructure", "Integration"], + "maintainedBy": "", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Modal", + "image": "/img/site/modal_logo.svg", + "link": "/developers/integrations/compute-infrastructure/modal", + "description": "Serverless platform for on-demand access to GPUs.", + "tags": ["Compute Infrastructure", "Integration"], + "maintainedBy": "", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Composio", + "image": "/img/site/composio_logo.png", + "link": "/developers/integrations/llm-frameworks/composio", + "description": "Manage and integrate tools with language models and AI agents. ", + "tags": ["LLM Framework", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Semantic Kernel", + "image": "/img/site/sk_logo.png", + "link": "/developers/integrations/llm-frameworks/semantic-kernel", + "description": "Framework by Microsoft for building large language model (LLM) applications.", + "tags": ["LLM Framework", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "C#, Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Deepset", + "image": "/img/site/deepset_logo.svg", + "link": "/developers/integrations/llm-frameworks/haystack", + "description": "Build with Haystack for a simple way to build LLM applications.", + "tags": ["LLM Framework", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "LlamaIndex", + "image": "/img/site/llamaindex_logo.svg", + "link": "/developers/integrations/llm-frameworks/llamaindex", + "description": "Framework for building large language model (LLM) applications and ingesting data.", + "tags": ["LLM Framework", "Integration", "Popular"], + "maintainedBy": "External", + "programmingLanguage": "Python, TS/JS", + "weaviateFeatures": "Filters, Hybrid Search", + "featured": true + }, + { + "name": "LangChain", + "image": "/img/site/langchain_logo.png", + "link": "/developers/integrations/llm-frameworks/langchain", + "description": "Framework for building large language models (LLM) applications.", + "tags": ["LLM Framework", "Integration", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "Python, TS/JS", + "weaviateFeatures": "Filters, Hybrid Search, Multi-tenancy", + "featured": true + }, + { + "name": "DSPy", + "image": "/img/site/dspy_logo.png", + "link": "/developers/integrations/llm-frameworks/dspy", + "description": "Framework for programming language model applications. ", + "tags": ["LLM Framework", "Integration", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "Python", + "weaviateFeatures": "Hybrid Search", + "featured": true + }, + { + "name": "KubeAI", + "image": "/img/site/kubeai_logo.png", + "link": "/developers/weaviate/model-providers/kubeai", + "description": "Run Open AI embedding and generative models on kubernetes.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Anyscale", + "image": "/img/site/anyscale_logo.jpg", + "link": "/developers/weaviate/model-providers/anyscale", + "description": "Seamlessly connect to models on Anyscale directly from Weaviate.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "FriendliAI", + "image": "/img/site/friendliai_logo.svg", + "link": "/developers/weaviate/model-providers/friendliai", + "description": "Access models on FriendliAI directly from Weaviate.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Mistral", + "image": "/img/site/mistralai_logo.png", + "link": "/developers/weaviate/model-providers/mistral", + "description": "Access embedding and generative models from Mistral.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Jina AI", + "image": "/img/site/jina_logo.svg", + "link": "/developers/weaviate/model-providers/jinaai", + "description": "Access embedding models from Jina AI.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Hugging Face", + "image": "/img/site/huggingface_logo.svg", + "link": "/developers/weaviate/model-providers/huggingface", + "description": "Weaviate integrates with Hugging Face\u2019s API and Transformers library.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Ollama", + "image": "/img/site/ollama_logo.png", + "link": "/developers/weaviate/model-providers/ollama", + "description": "Easily run a range of embedding and generative models locally.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "OctoAI", + "image": "/img/site/octoai_logo.png", + "link": "/developers/weaviate/model-providers/octoai", + "description": "Access models on OctoAI directly from Weaviate.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "VoyageAI", + "image": "/img/site/voyageai_logo.svg", + "link": "/developers/weaviate/model-providers/voyageai", + "description": "Access Voyage AI\u2019s models (embedding and reranker) directly from Weaviate.", + "tags": ["Model Providers", "Module"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Anthropic", + "image": "/img/site/anthropic_logo.svg", + "link": "/developers/weaviate/model-providers/anthropic", + "description": "Access a variety of generative models from Anthropic.", + "tags": ["Model Providers", "Module", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": true + }, + { + "name": "Cohere", + "image": "/img/site/cohere_logo.svg", + "link": "/developers/weaviate/model-providers/cohere", + "description": "Use a variety of embedding, reranker, and language models from Cohere.", + "tags": ["Model Providers", "Module", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": true + }, + { + "name": "OpenAI", + "image": "/img/site/openai_logo.svg", + "link": "/developers/weaviate/model-providers/openai", + "description": "Use a variety of embedding and language models from OpenAI", + "tags": ["Model Providers", "Module", "Popular"], + "maintainedBy": "Internal", + "programmingLanguage": "All languages", + "weaviateFeatures": "", + "featured": true + }, + { + "name": "Weights and Biases", + "image": "/img/site/wandb_logo2.png", + "link": "/developers/integrations/operations/wandb", + "description": "Weave by W&B offers data analysis APIs for monitoring applications.", + "tags": ["Operations", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Ragas", + "image": "/img/site/ragas_logo.png", + "link": "/developers/integrations/operations/ragas", + "description": "Evaluate your retrieval augmented generation (RAG) applications. ", + "tags": ["Operations", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Nomic", + "image": "/img/site/nomic_logo.svg", + "link": "/developers/integrations/operations/nomic", + "description": "Run GPT4All models and use Atlas to visualize vector embeddings.", + "tags": ["Model Providers", "Operations", "Integration", "Module"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "LangWatch", + "image": "/img/site/langwatch_logo.png", + "link": "/developers/integrations/operations/langwatch", + "description": "Connect LangWatch to your Weaviate instance to log operational traces.", + "tags": ["Operations", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Langtrace", + "image": "/img/site/langtrace_logo.png", + "link": "/developers/integrations/operations/langtrace", + "description": "View vector search queries and generative calls that are made to your Weaviate cluster.", + "tags": ["Operations", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "Arize AI", + "image": "/img/site/arize_logo.svg", + "link": "/developers/integrations/operations/arize", + "description": "Log search queries sent to Weaviate and requests sent to LLM providers in Phoenix.", + "tags": ["Operations", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "Python", + "weaviateFeatures": "", + "featured": false + }, + { + "name": "IBM", + "image": "/img/site/IBM_logo.svg.png", + "link": "/developers/integrations/data-platforms/ibm", + "description": "IBM offers a variety of solutions for building generative AI applications", + "tags": ["Data Platforms", "Integration"], + "maintainedBy": "External", + "programmingLanguage": "", + "weaviateFeatures": "", + "featured": false + } +] diff --git a/static/data/paths.json b/static/data/paths.json new file mode 100644 index 0000000000..43e7128074 --- /dev/null +++ b/static/data/paths.json @@ -0,0 +1,107 @@ +{ + "siteSearch": [ + { + "link": "developers/academy/js/standalone/which-search", + "title": "What type of search is right for me?", + "description": "Discover what type of search might be best for your application." + }, + { + "link": "developers/academy/js/standalone/using-ml-models", + "title": "Using Machine Learning Models", + "description": "Learn how to pick and use various machine learning models." + }, + { + "link": "developers/academy/js/standalone/client-server", + "title": "The client-server architecture", + "description": "Understand the client-server approach to building with Weaviate." + }, + { + "link": "developers/academy/js/starter_web_applications", + "title": "Building AI-Native Web Applications", + "description": "Learn how to build production ready full-stack AI-Native Web Apps." + } + ], + "siteSearchTemp": [ + { + "link": "blog/what-is-a-vector-database", + "title": "A Gentle Introduction to Vector Databases", + "description": "Vector databases explained by their core concepts of vector embeddings, vector search, and vector indexing." + }, + { + "link": "blog/vector-embeddings-explained", + "title": "Vector Embeddings Explained", + "description": "Get an intuitive understanding of what vector embeddings are, how they're generated, and how they're used in semantic search." + }, + { + "link": "developers/academy/js/starter_text_data", + "title": "Semantic Search for Text Data", + "description": "Learn how to work with text data using Weaviate and semantic search to power your text-based search applications." + } + ], + "chatbots": [ + { + "link": "developers/academy/js/starter_text_data", + "title": "Getting Started with Vector Search", + "description": "Understand the concepts and technology behind Vector Search." + }, + { + "link": "developers/academy/js/standalone/using-ml-models/generative", + "title": "Using Generative AI Models", + "description": "Learn how to pick and use various generative models" + }, + { + "link": "blog/introduction-to-rag", + "title": "Demystifying RAG", + "description": "Learn about Retrieval Augmented Generation & how to implement it." + }, + { + "link": "developers/academy/js", + "title": "Building Stateful RAG Applications", + "description": "Coming soon!" + } + ], + "ecommerce": [ + { + "link": "developers/academy/js/starter_text_data", + "title": "Getting Started with Vector Search", + "description": "Understand the concepts and technology behind Vector Search." + }, + { + "link": "developers/academy/js/standalone/using-ml-models/embedding", + "title": "Using Embedding AI Models", + "description": "Learn how to pick and use various embedding models." + }, + { + "link": "developers/academy/js", + "title": "Building Recommender Systems Applications", + "description": "Coming soon!" + }, + { + "link": "developers/academy/js/starter_multimodal_data", + "title": "Working with Multimodal Data", + "description": "Learn how to handle and treat multimodal data." + } + ], + "automation": [ + { + "link": "developers/academy/js/starter_text_data", + "title": "Getting Started with Vector Search", + "description": "Understand the concepts and technology behind Vector Search." + }, + { + "link": "developers/academy/js/standalone/using-ml-models/generative", + "title": "Using Generative AI Models", + "description": "Learn how to pick and use various generative models." + }, + { + "link": "developers/academy/js/set_up_typescript", + "title": "Demystifying Agents", + "description": "Coming soon!" + }, + { + "link": "/developers/academy/js", + "title": "Building Agentic Applications", + "description": "Coming soon!" + } + ] +} diff --git a/static/data/people.json b/static/data/people.json index 936201d4e5..4333ffe847 100644 --- a/static/data/people.json +++ b/static/data/people.json @@ -1,10 +1,16 @@ [ { "name": "Aarthi Iyer", - "title": "QA Engineer", - "photo": "aarthi.jpeg", + "title": "Lead QA Engineer", + "photo": "aarthi.jpg", "linkedin": "aarthiiyer", - "team": "delivery" + "team": "wcd" + }, + { + "name": "Aaron Trott", + "title": "Enterprise Account Executive", + "photo": "Aaron.jpg", + "team": "sales" }, { "name": "Abdel Rodriquez", @@ -22,16 +28,29 @@ "twitter": "itsajchan", "team": "developer-growth" }, + { + "name": "Ajay Chavan", + "title": "Client-Focused SRE", + "photo": "Ajay.jpg", + "team": "applied-research", + "linkedin": "ajaxchavan" + }, + { + "name": "Ajit Mistry", + "title": "ML Engineering Intern", + "photo": "ajit.jpg", + "team": "applied-research" + }, { "name": "Alea Abed", - "title": "Head of Marketing", - "photo": "alea.png", + "title": "VP of Marketing", + "photo": "alea.jpg", "linkedin": "alea-abed", "team": "marketing" }, { "name": "Alvin Richards", - "title": "Head of Product", + "title": "VP of Product", "photo": "Alvin.jpg", "linkedin": "alvinrichards", "twitter": "jonnyeight", @@ -39,22 +58,22 @@ }, { "name": "André Duis", - "title": "Technical Executive", - "photo": "andre.png", + "title": "VP of Platform Operations", + "photo": "andre.jpg", "linkedin": "andre-duis", "team": "delivery" }, { "name": "André Mourão", "title": "Software Engineer", - "photo": "andre-m.jpeg", + "photo": "andre-m.jpg", "linkedin": "andre-mourao", "team": "database" }, { "name": "Andrzej Liszka", "title": "Core Engineer", - "photo": "andrzej.png", + "photo": "andrzej.jpg", "linkedin": "andrzej-liszka-897ab8234", "github": "aliszka", "team": "database" @@ -83,7 +102,7 @@ }, { "name": "Benjamin Sabrin", - "title": "Head of Sales", + "title": "VP of Sales", "photo": "benjamin.jpg", "linkedin": "bsabrin", "team": "sales" @@ -91,16 +110,22 @@ { "name": "Bob van Luijt", "title": "Co-founder and CEO", - "photo": "bob.png", + "photo": "bob.jpg", "linkedin": "bobvanluijt", "twitter": "bobvanluijt", "github": "bobvanluijt", "team": "ceo-team" }, + { + "name": "Brendan McNally", + "title": "Enterprise Account Executive", + "photo": "Brendan.jpg", + "team": "sales" + }, { "name": "Byron Voorbach", "title": "Field-CTO", - "photo": "byron.png", + "photo": "byron.jpg", "linkedin": "byronvoorbach", "twitter": "byronvoorbach", "github": "byronvoorbach", @@ -109,9 +134,9 @@ { "name": "Cari Liebenberg", "title": "Platform Engineer", - "photo": "cari.jpeg", + "photo": "cari.jpg", "linkedin": "cari-liebenberg-1b40b0a6", - "team": "wcd" + "team": "delivery" }, { "name": "Chad Tindel", @@ -121,18 +146,25 @@ "twitter": "ctindel", "team": "sales" }, + { + "name": "Chara Tzimi", + "title": "People Operations Specialist", + "photo": "Chara.jpg", + "linkedin": "chara-tzimi", + "team": "people-and-culture" + }, { "name": "Charles Harr", "title": "Software Engineer", - "photo": "charles.png", + "photo": "charles.jpg", "linkedin": "ceharr", "github": "harrlight00", "team": "wcd" }, { "name": "Charles Pierse", - "title": "Head of Weaviate Labs", - "photo": "charles-pierse.png", + "title": "Director of Innovation Labs", + "photo": "charles-pierse.jpg", "linkedin": "charles-pierse", "twitter": "cdpierse", "team": "weaviate-labs" @@ -153,25 +185,25 @@ { "name": "Connor Shorten", "title": "Research Scientist", - "photo": "connor.png", + "photo": "connor.jpg", "linkedin": "connor-shorten-34923a178/", "twitter": "cshorten30", "github": "CShorten", "team": "weaviate-labs" }, + { + "name": "Damien Gasparina", + "title": "Enterprise Solution Engineer", + "photo": "Damien.jpg", + "linkedin": "gasparinadamien", + "team": "sales" + }, { "name": "Daniel Phiri", "title": "Developer Advocate", - "photo": "daniel.png", + "photo": "daniel.jpg", "team": "developer-relations" }, - { - "name": "Daniel McGee", - "title": "Full Stack Engineer", - "photo": "Daniel-McGee.jpg", - "linkedin": "danieltmcgee", - "team": "developer-growth" - }, { "name": "Daniel Williams", "title": "Machine Learning Engineer", @@ -179,10 +211,17 @@ "linkedin": "dannyjameswilliams", "team": "developer-growth" }, + { + "name": "Danielle Nugent", + "title": "Talent Acquisition Manager", + "photo": "Danielle.jpg", + "linkedin": "daniellesnugent", + "team": "people-and-culture" + }, { "name": "David Street", "title": "Full Stack Engineer", - "photo": "david.png", + "photo": "david.jpg", "linkedin": "david-street-552b7563", "team": "wcd" }, @@ -204,7 +243,7 @@ { "name": "Dirk Kulawiak", "title": "UX Engineering Tech Lead", - "photo": "dirk.png", + "photo": "dirk.jpg", "linkedin": "dirk-kulawiak", "github": "dirkkul", "team": "database" @@ -213,7 +252,9 @@ "name": "Dmytro Solovei", "title": "Software Engineer", "photo": "dmytro.jpg", - "team": "database" + "team": "database", + "linkedin": "dyma-solovei-335344131", + "twitter": "dymasolovei" }, { "name": "Duda Nogueira", @@ -224,15 +265,15 @@ }, { "name": "Emma O'Keefe", - "title": "Director of Customer Operations", - "photo": "emma.png", + "title": "Director of Business Data Strategy & Enablement", + "photo": "emma.jpg", "linkedin": "emma-o-keefe-03777b80", - "team": "sales" + "team": "finance" }, { "name": "Edward Schmuhl", "title": "Machine Learning Engineer", - "photo": "edward.png", + "photo": "edward.jpg", "linkedin": "edward-schmuhl-563161195", "twitter": "aestheticedwar1", "github": "thomashacker", @@ -241,10 +282,10 @@ { "name": "Eric Caleb", "title": "Senior Software Engineer", - "photo": "eric.png", + "photo": "eric.jpg", "linkedin": "iamcaleberic", "twitter": "iamcaleberic", - "team": "wcd" + "team": "delivery" }, { "name": "Erika Cardenas", @@ -258,7 +299,7 @@ { "name": "Etienne Dilocker", "title": "Co-founder and CTO", - "photo": "etienne.png", + "photo": "etienne.jpg", "linkedin": "etienne-dilocker-60727b175", "twitter": "etiennedi", "github": "etiennedi", @@ -267,43 +308,43 @@ { "name": "Femke Plantinga", "title": "Developer Growth Manager", - "photo": "femke.png", + "photo": "femke.jpg", "linkedin": "femke-plantinga-a60b9a172", "twitter": "femke_plantinga", "team": "developer-growth" }, { "name": "Griffin Foster", - "title": "Enterprise Account Executive", + "title": "Director of Sales - West", "photo": "griffin.jpg", "linkedin": "griffin-foster", "team": "sales" }, - { - "name": "Hina Shah", - "title": "System Integrator Partner Manager", - "photo": "Hina.jpg", - "linkedin": "hinashah1", - "twitter": "hinashah98", - "team": "partnerships" - }, { "name": "Ian Gregson", "title": "Full Stack Engineer", - "photo": "ian.jpeg", + "photo": "ian.jpg", "team": "wcd" }, { "name": "Ieva Urbaite", "title": "Corporate Marketing Lead", - "photo": "ieva.png", + "photo": "ieva.jpg", "linkedin": "ievaurbaite", "team": "marketing" }, + { + "name": "Ivan Despot", + "title": "Technical Documentation Writer", + "photo": "Ivan.jpg", + "team": "developer-relations", + "linkedin": "ivan-g-despot", + "twitter": "ivan_g_despot" + }, { "name": "JP Hwang", "title": "Technical Curriculum Developer", - "photo": "jp.png", + "photo": "jp.jpg", "linkedin": "jphwang", "twitter": "_jphwang", "github": "databyjp", @@ -312,37 +353,30 @@ { "name": "Jeremy Price", "title": "Core Engineer", - "photo": "jeremy.png", + "photo": "jeremy.jpg", "github": "donomii", "team": "database" }, - { - "name": "Jenna Zarum", - "title": "Chief of Staff", - "photo": "jenna.png", - "github": "jzarum", - "team": "ceo-team" - }, { "name": "Jessie de Groot", - "title": "Head of People & Culture", - "photo": "jessie.png", + "title": "VP of People & Culture", + "photo": "jessie.jpg", "linkedin": "jessiedegroot/", "twitter": "jessie_groot", "team": "people-and-culture" }, { "name": "Jobi George", - "title": "Head of Partnerships", - "photo": "jobi.png", + "title": "VP of Partnerships & Business Development", + "photo": "jobi.jpg", "linkedin": "jobigeorge", "twitter": "jobig630", "team": "partnerships" }, { "name": "John Trengrove", - "title": "Head of Applied Research", - "photo": "john.png", + "title": "Director of Applied Research", + "photo": "john.jpg", "linkedin": "trengrj", "twitter": "trengrj", "github": "trengrj", @@ -351,7 +385,7 @@ { "name": "Jonathan Tuite", "title": "Sales Engineer", - "photo": "jonathan-tuite.jpeg", + "photo": "jonathan.jpg", "linkedin": "jontuite", "twitter": "pendragn00", "github": "tuitejc", @@ -360,12 +394,12 @@ { "name": "Jose Luis Franco", "title": "QA Engineer", - "photo": "Jose-Luis-Franco.jpeg", - "team": "delivery" + "photo": "Jose-Luis-Franco.jpg", + "team": "database" }, { "name": "Joseph Green", - "title": "Product Support Engineer", + "title": "Director of Support Engineering", "photo": "joseph-green.jpg", "team": "delivery", "linkedin": "joe-green-11381620a" @@ -387,7 +421,7 @@ }, { "name": "Laura Stoye", - "title": "Executive Assistant", + "title": "Executive Operations Manager", "photo": "laura.jpg", "linkedin": "laurastoye", "team": "ceo-team" @@ -402,14 +436,14 @@ { "name": "Loic Reyreaud", "title": "Software Engineer", - "photo": "loic.png", + "photo": "loic.jpg", "linkedin": "loic-reyreaud", "team": "database" }, { "name": "Marcin Antas", "title": "Core Engineer", - "photo": "marcin.png", + "photo": "marcin.jpg", "linkedin": "antasmarcin", "twitter": "antas_marcin", "github": "antas-marcin", @@ -446,7 +480,7 @@ { "name": "Mike Hoppe", "title": "Client-Focused SRE", - "photo": "Mike-Hoppe.jpeg", + "photo": "Mike-Hoppe.jpg", "team": "delivery" }, { @@ -455,18 +489,18 @@ "photo": "mike.jpg", "linkedin": "mikewyer", "twitter": "BigBeardyGeek", - "team": "wcd" + "team": "delivery" }, { "name": "Mohamed Badawi", "title": "Software Engineer", - "photo": "Mohamed-Badawi.jpeg", + "photo": "Mohamed-Badawi.jpg", "team": "database" }, { "name": "Mohamed Shahin", "title": "Product Support Engineer", - "photo": "mohamed.jpeg", + "photo": "mohamed.jpg", "linkedin": "shahinmohamed", "twitter": "shah91n", "team": "delivery" @@ -484,30 +518,24 @@ "team": "marketing", "linkedin": "nenadmalic" }, - { - "name": "Nick Olivetti", - "title": "Enterprise Account Executive", - "photo": "nick.png", - "team": "sales" - }, { "name": "Parker Duckworth", - "title": "Head of Database", - "photo": "parker.png", + "title": "Director of Database", + "photo": "parker.jpg", "linkedin": "parkerduckworth", "github": "parkerduckworth", "team": "database" }, { "name": "Patrick Das", - "title": "Head of Finance", + "title": "VP of Legal & Finance", "photo": "patrick.jpg", "linkedin": "patrickdas", "team": "finance" }, { "name": "Paul de Grijp", - "title": "Head of Weaviate Cloud", + "title": "Director of Weaviate Cloud Console", "photo": "paul-de-grijp.jpg", "linkedin": "pauldegrijp", "twitter": "pauldegrijp", @@ -515,19 +543,18 @@ }, { "name": "Philip Vollet", - "title": "Head of Developer Growth", - "photo": "philip.png", + "title": "VP of Growth", + "photo": "philip.jpg", "linkedin": "philipvollet", "twitter": "philipvollet", "team": "developer-growth" }, { - "name": "Rich Lapham", - "title": "Recruiter", - "photo": "rich-lapham.jpg", - "linkedin": "richlapham", - "twitter": "laphamr66", - "team": "people-and-culture" + "name": "Pietro Antonacci", + "title": "Client-Focused SRE", + "photo": "Pietro.jpg", + "linkedin": "pietro-antonacci", + "team": "delivery" }, { "name": "Roberto Esposito", @@ -542,7 +569,14 @@ "title": "QA Engineer", "photo": "Rodrigo-Lopez.jpg", "linkedin": "rodrigo-antonio-lópez-manrique-a3778a93", - "team": "delivery" + "team": "applied-research" + }, + { + "name": "Ryan Colbert", + "title": "Enterprise Account Executive", + "photo": "ryan.jpg", + "linkedin": "ryantcolbert", + "team": "sales" }, { "name": "Scott Alexander", @@ -556,10 +590,16 @@ "photo": "Sebastian-Farriol.jpg", "team": "delivery" }, + { + "name": "Sean Romberg", + "title": "Business Development Representative", + "photo": "Sean-Romberg.jpg", + "team": "sales" + }, { "name": "Sebastian Witalec", - "title": "Head of Developer Relations", - "photo": "sebastian.png", + "title": "Director of Education & Developer Experience", + "photo": "sebastian.jpg", "linkedin": "sebawita", "twitter": "sebawita", "github": "sebawita", @@ -575,7 +615,7 @@ { "name": "Shukri Hasan", "title": "Community Solution Engineer", - "photo": "shukri.png", + "photo": "shukri.jpg", "linkedin": "mohdshukrihasan", "twitter": "MohdShukriHasa1", "team": "partnerships" @@ -590,7 +630,7 @@ }, { "name": "Spiros Andreou", - "title": "Security & Compliance Lead", + "title": "Director of Security & Compliance", "photo": "spiros.jpg", "team": "delivery" }, @@ -604,15 +644,15 @@ { "name": "Stefan Bogdan", "title": "Solution Engineer", - "photo": "stefan.png", + "photo": "stefan.jpg", "linkedin": "stefan-bogdan", "github": "StefanBogdan", - "team": "delivery" + "team": "applied-research" }, { "name": "Svitlana Smolianova", "title": "Creative Director", - "photo": "svitlana.png", + "photo": "svitlana.jpg", "linkedin": "svitlana-sm", "twitter": "switlana_c", "team": "marketing" @@ -622,7 +662,7 @@ "title": "Platform Engineer", "photo": "thomas.jpg", "linkedin": "thomas-maurice-80846b61", - "team": "wcd" + "team": "delivery" }, { "name": "Thomas Smith", @@ -631,6 +671,14 @@ "linkedin": "tbs181194", "team": "database" }, + { + "name": "Tuana Celik", + "title": "Developer Relations Engineer", + "photo": "Tuana.jpg", + "team": "developer-relations", + "linkedin": "tuanacelik", + "twitter": "tuanacelik" + }, { "name": "Victoria Slocum", "title": "Machine Learning Engineer", @@ -642,7 +690,7 @@ { "name": "Weronika Krajcarz", "title": "Frontend Engineer", - "photo": "wera.png", + "photo": "wera.jpg", "linkedin": "wera-kr", "github": "Weroiko", "team": "wcd" @@ -650,14 +698,14 @@ { "name": "Chrétien Minke", "title": "Advisor", - "photo": "chretien.jpeg", + "photo": "chretien.jpg", "linkedin": "chretienminke", "team": "board-advisors" }, { "name": "Erik Bernhardsson", "title": "Advisor", - "photo": "erik.jpeg", + "photo": "erik.jpg", "linkedin": "erikbern", "twitter": "bernhardsson", "team": "board-advisors" @@ -665,27 +713,27 @@ { "name": "Erin Price-Wright", "title": "Board Member", - "photo": "erin.jpeg", + "photo": "erin.jpg", "team": "board-advisors" }, { "name": "Igor Taber", "title": "Board Member", - "photo": "igor.jpeg", + "photo": "igor.jpg", "linkedin": "itaber", "team": "board-advisors" }, { "name": "James Alcorn", "title": "Board Member", - "photo": "james-alcorn.jpeg", + "photo": "james-alcorn.jpg", "linkedin": "james-alcorn-b04880ba", "team": "board-advisors" }, { "name": "Marcus Eagan", "title": "Advisor", - "photo": "marcus.jpeg", + "photo": "marcus.jpg", "linkedin": "marcuseagan", "team": "board-advisors" }, @@ -699,7 +747,7 @@ { "name": "Sam Ramji", "title": "Advisor", - "photo": "sam-ramji.jpeg", + "photo": "sam-ramji.jpg", "linkedin": "sramji", "twitter": "sramji", "team": "board-advisors" @@ -707,21 +755,21 @@ { "name": "Tal Shaked", "title": "Advisor", - "photo": "tal.jpeg", + "photo": "tal.jpg", "linkedin": "tshaked", "team": "board-advisors" }, { "name": "Tony Florence", "title": "Board Member", - "photo": "tony-florence.jpeg", + "photo": "tony-florence.jpg", "linkedin": "toflorence", "team": "board-advisors" }, { "name": "Zack Kass", "title": "Advisor", - "photo": "zack.jpeg", + "photo": "zack.jpg", "linkedin": "zackkass", "twitter": "iamthezack", "team": "board-advisors" @@ -729,7 +777,7 @@ { "name": "Jerónimo Irazábal", "title": "Software Engineer", - "photo": "Jeronimo.jpeg", + "photo": "Jeronimo.jpg", "linkedin": "jeronimoirazabal", "twitter": "jeroiraz", "github": "jeroiraz", @@ -738,7 +786,7 @@ { "name": "Tony Le", "title": "Business Development Director", - "photo": "tony.jpeg", + "photo": "tony.jpg", "team": "partnerships" } ] diff --git a/static/data/templates.json b/static/data/templates.json new file mode 100644 index 0000000000..e691816498 --- /dev/null +++ b/static/data/templates.json @@ -0,0 +1,227 @@ +{ + "playbook": [ + { + "link": "/company/playbook/weaviate-celebrates-a-fourth-birthday", + "type": "Blog", + "backgroundImage": "/img/site/about-playbook-01.png", + "tagline": "Weaviate celebrates a fourth birthday!", + "photo": "bob.jpg", + "name": "Bob van Luijt", + "title": "CEO", + "date": "July 11, 2023" + }, + { + "link": "/company/playbook/hiring-at-weaviate-finding-our-perfect-matches", + "type": "Blog", + "backgroundImage": "/img/site/about-playbook-02.png", + "tagline": "Hiring at Weaviate - finding our perfect matches!", + "photo": "jessie.jpg", + "name": "Jessie de Groot", + "title": "Head of People and Culture", + "date": "July 7, 2023" + }, + { + "link": "/company/playbook/cell-theory-planning-for-organic-growth", + "type": "Blog", + "backgroundImage": "/img/site/about-playbook-03.png", + "tagline": "Cell Theory - Planning for organic growth", + "photo": "bob.jpg", + "name": "Bob van Luijt", + "title": "CEO", + "date": "June 23, 2023" + } + ], + "react": [ + { + "link": "https://github.com/weaviate-tutorials/next-vector-search", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/next-vector-search", + "tagline": "Vector Search and RAG template application in React with Next.js.", + "name": "Next.js Vector Search", + "stack": "Next" + }, + { + "link": "https://github.com/weaviate/quote-finder", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate/quote-finder", + "tagline": "Hybrid Search template application in React with Next.js", + "name": "Next.js Hybrid Search", + "stack": "Next" + }, + { + "link": "https://github.com/weaviate-tutorials/next-multimodal-search-demo", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/next-multimodal-search-demo", + "tagline": "Multimodal Search template application in React with Next.js", + "name": "Next.js Multimodal Search", + "stack": "Next" + } + + ], + "vue": [ + { + "link": "https://github.com/weaviate-tutorials/nuxt-vector-search", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/nuxt-vector-search", + "tagline": "Vector Search and RAG in Vue with Nuxt.js", + "name": "Nuxt.js Vector Search", + "stack": "Nuxt" + }, + { + "link": "https://github.com/weaviate-tutorials/nuxt-ecommerce-rag", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/nuxt-ecommerce-rag", + "tagline": "eCommerce Search and RAG in Vue with Nuxt.js", + "name": "Nuxt.js eCommerce Search", + "stack": "Nuxt" + }, + { + "link": "https://github.com/weaviate-tutorials/nuxt-multimodal-search", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/nuxt-multimodal-search", + "tagline": "Multimodal Search in Vue with Nuxt.js", + "name": "Nuxt.js Multimodal Search", + "stack": "Nuxt" + } + + ], + "others": [ + { + "link": "https://github.com/weaviate-tutorials/angular-search", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/angular-search", + "tagline": "Vector Search and RAG in Angular", + "name": "Angular Vector Search", + "stack": "Nuxt" + }, + { + "link": "https://github.com/weaviate-tutorials/quickstart-typescript", + "backgroundImage": "https://opengraph.githubassets.com/b4a0c46fab0a6d4f8f2601528a4f0e91ff4effe7d84746ca1879db67698c2304/weaviate-tutorials/quickstart-typescript", + "tagline": "Data Import and Vector Search in Typescript", + "name": "Typescript Import and Search", + "stack": "Typescript" + } + + ], + "hybrid": [ + { + "link": "/blog/hybrid-search-fusion-algorithms", + "type": "Blog", + "backgroundImage": "/img/site/hero-hybrid-search-01.png", + "tagline": "Unlocking the Power of Hybrid Search", + "photo": "dirk.jpg", + "name": "Dirk Kulawiak", + "title": "Core Engineer", + "date": "August 29, 2023" + }, + { + "link": "/blog/hybrid-search-for-web-developers", + "type": "Blog", + "backgroundImage": "/img/site/hero-hybrid-search-02.png", + "tagline": "A Web Developers Guide to Hybrid Search", + "photo": "daniel.jpg", + "name": "Daniel Phiri", + "title": "Developer Advocate", + "date": "April 2, 2024" + }, + { + "link": "/blog/moonsift-story", + "type": "Blog", + "backgroundImage": "/img/site/hero-hybrid-search-03.png", + "tagline": "Building an AI-Powered Shopping Copilot with Weaviate", + "photo": "alea.jpg", + "name": "Alea Abed", + "title": "Head of Marketing", + "date": "November 15, 2023" + } + ], + "rag": [ + { + "link": "/blog/multimodal-RAG", + "type": "Blog", + "backgroundImage": "/img/site/hero-rag-01.png", + "tagline": "Multimodal Retrieval Augmented Generation(RAG)", + "photo": "zain.jpg", + "name": "Zain Hasan", + "title": "Developer Advocate", + "date": "December 5, 2023" + }, + { + "link": "/case-studies/neople", + "type": "Case Study", + "backgroundImage": "/img/site/hero-rag-02.png", + "tagline": "Transforming Customer Service with Generative AI", + "photo": "alea.jpg", + "name": "Alea Abed", + "title": "Head of Marketing", + "date": "April 2, 2024" + }, + { + "link": "/blog/rag-evaluation", + "type": "Blog", + "backgroundImage": "/img/site/hero-rag-03.png", + "tagline": "An Overview on RAG Evaluation", + "photo": "erika.jpg", + "name": "Erika Cardenas", + "title": "Technology Partner Manager", + "date": "November 21, 2023" + } + ], + "gen": [ + { + "link": "https://www.youtube.com/watch?v=ickqCzFxWj0", + "type": "Video", + "backgroundImage": "/img/site/hero-gen-01.png", + "tagline": "DSPy + Weaviate for the Next Generation of LLM Apps", + "photo": "erika.jpg", + "name": "Erika Cardenas", + "title": "Technology Partner Manager", + "date": "November 21, 2023" + }, + { + "link": "/blog/generative-feedback-loops-with-llms", + "type": "Blog", + "backgroundImage": "/img/site/hero-gen-02.png", + "tagline": "Generative Feedback Loops with LLMs for Vector Databases", + "photo": "connor.jpg", + "name": "Connor Shorten", + "title": "Product Researcher", + "date": "May 5, 2023" + }, + { + "link": "https://www.youtube.com/watch?v=I4Jle80AOaU", + "type": "Video", + "backgroundImage": "/img/site/hero-gen-03.png", + "tagline": "Weaviate Podcast Search meets Generative Feedback Loops!", + "photo": "connor.jpg", + "name": "Connor Shorten", + "title": "Product Researcher", + "date": "September 21, 2023" + } + ], + "infrastructure": [ + { + "link": "https://www.youtube.com/watch?v=ickqCzFxWj0", + "type": "Video", + "backgroundImage": "/img/site/hero-gen-01.png", + "tagline": "DSPy + Weaviate for the Next Generation of LLM Apps", + "photo": "erika.jpg", + "name": "Erika Cardenas", + "title": "Technology Partner Manager", + "date": "November 21, 2023" + }, + { + "link": "/blog/generative-feedback-loops-with-llms", + "type": "Blog", + "backgroundImage": "/img/site/hero-gen-02.png", + "tagline": "Generative Feedback Loops with LLMs for Vector Databases", + "photo": "connor.jpg", + "name": "Connor Shorten", + "title": "Product Researcher", + "date": "May 5, 2023" + }, + { + "link": "https://www.youtube.com/watch?v=I4Jle80AOaU", + "type": "Video", + "backgroundImage": "/img/site/hero-gen-03.png", + "tagline": "Weaviate Podcast Search meets Generative Feedback Loops!", + "photo": "connor.jpg", + "name": "Connor Shorten", + "title": "Product Researcher", + "date": "September 21, 2023" + } + ] +} diff --git a/static/img/benchmark/dbpedia-openai-1000k-angular-dark.svg b/static/img/benchmark/dbpedia-openai-1000k-angular-dark.svg new file mode 100644 index 0000000000..ff681e62a7 --- /dev/null +++ b/static/img/benchmark/dbpedia-openai-1000k-angular-dark.svg @@ -0,0 +1,1336 @@ + + + + + + + + 2024-10-29T11:41:02.933469 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/dbpedia-openai-1000k-angular-light.svg b/static/img/benchmark/dbpedia-openai-1000k-angular-light.svg new file mode 100644 index 0000000000..18be50a58d --- /dev/null +++ b/static/img/benchmark/dbpedia-openai-1000k-angular-light.svg @@ -0,0 +1,1336 @@ + + + + + + + + 2024-10-29T11:41:02.874931 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/sift-128-euclidean-dark.svg b/static/img/benchmark/sift-128-euclidean-dark.svg new file mode 100644 index 0000000000..67ef85bf28 --- /dev/null +++ b/static/img/benchmark/sift-128-euclidean-dark.svg @@ -0,0 +1,1360 @@ + + + + + + + + 2024-10-29T11:40:37.609759 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/sift-128-euclidean-light.svg b/static/img/benchmark/sift-128-euclidean-light.svg new file mode 100644 index 0000000000..6dd1a56ce9 --- /dev/null +++ b/static/img/benchmark/sift-128-euclidean-light.svg @@ -0,0 +1,1360 @@ + + + + + + + + 2024-10-29T11:40:37.546484 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/snowflake-msmarco-arctic-embed-m-v1-dark.svg b/static/img/benchmark/snowflake-msmarco-arctic-embed-m-v1-dark.svg new file mode 100644 index 0000000000..8dbd433b57 --- /dev/null +++ b/static/img/benchmark/snowflake-msmarco-arctic-embed-m-v1-dark.svg @@ -0,0 +1,1252 @@ + + + + + + + + 2024-10-29T11:40:55.064018 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/snowflake-msmarco-arctic-embed-m-v1-light.svg b/static/img/benchmark/snowflake-msmarco-arctic-embed-m-v1-light.svg new file mode 100644 index 0000000000..76d6a9c374 --- /dev/null +++ b/static/img/benchmark/snowflake-msmarco-arctic-embed-m-v1-light.svg @@ -0,0 +1,1252 @@ + + + + + + + + 2024-10-29T11:40:55.010274 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/sphere-10M-meta-dpr-dark.svg b/static/img/benchmark/sphere-10M-meta-dpr-dark.svg new file mode 100644 index 0000000000..b67212ad95 --- /dev/null +++ b/static/img/benchmark/sphere-10M-meta-dpr-dark.svg @@ -0,0 +1,1317 @@ + + + + + + + + 2024-10-29T11:40:49.486747 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/benchmark/sphere-10M-meta-dpr-light.svg b/static/img/benchmark/sphere-10M-meta-dpr-light.svg new file mode 100644 index 0000000000..0a349c305e --- /dev/null +++ b/static/img/benchmark/sphere-10M-meta-dpr-light.svg @@ -0,0 +1,1317 @@ + + + + + + + + 2024-10-29T11:40:49.426027 + image/svg+xml + + + Matplotlib v3.9.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/people/heroes/bob-kozdemba.jpg b/static/img/people/heroes/bob-kozdemba.jpg new file mode 100644 index 0000000000..02182abfc4 Binary files /dev/null and b/static/img/people/heroes/bob-kozdemba.jpg differ diff --git a/static/img/people/heroes/bob-kozdemba.png b/static/img/people/heroes/bob-kozdemba.png deleted file mode 100644 index e58912b9fc..0000000000 Binary files a/static/img/people/heroes/bob-kozdemba.png and /dev/null differ diff --git a/static/img/people/heroes/eda-johnson.jpg b/static/img/people/heroes/eda-johnson.jpg new file mode 100644 index 0000000000..dae622fd2b Binary files /dev/null and b/static/img/people/heroes/eda-johnson.jpg differ diff --git a/static/img/people/heroes/eda-johnson.png b/static/img/people/heroes/eda-johnson.png deleted file mode 100644 index 5e3910d0a4..0000000000 Binary files a/static/img/people/heroes/eda-johnson.png and /dev/null differ diff --git a/static/img/people/heroes/patrice-bourgougnon.jpg b/static/img/people/heroes/patrice-bourgougnon.jpg new file mode 100644 index 0000000000..11eeb0ad9a Binary files /dev/null and b/static/img/people/heroes/patrice-bourgougnon.jpg differ diff --git a/static/img/people/heroes/patrice-bourgougnon.png b/static/img/people/heroes/patrice-bourgougnon.png deleted file mode 100644 index ce758f7d3f..0000000000 Binary files a/static/img/people/heroes/patrice-bourgougnon.png and /dev/null differ diff --git a/static/img/people/heroes/ron-parker.jpg b/static/img/people/heroes/ron-parker.jpg new file mode 100644 index 0000000000..49b17b8bcc Binary files /dev/null and b/static/img/people/heroes/ron-parker.jpg differ diff --git a/static/img/people/heroes/ron-parker.png b/static/img/people/heroes/ron-parker.png deleted file mode 100644 index 63894c86c7..0000000000 Binary files a/static/img/people/heroes/ron-parker.png and /dev/null differ diff --git a/static/img/people/heroes/travis-rehl.jpg b/static/img/people/heroes/travis-rehl.jpg new file mode 100644 index 0000000000..0b001b04ec Binary files /dev/null and b/static/img/people/heroes/travis-rehl.jpg differ diff --git a/static/img/people/heroes/travis-rehl.png b/static/img/people/heroes/travis-rehl.png deleted file mode 100644 index 8d4a015e5d..0000000000 Binary files a/static/img/people/heroes/travis-rehl.png and /dev/null differ diff --git a/static/img/people/icon/adam.jpg b/static/img/people/icon/adam.jpg new file mode 100644 index 0000000000..c2b5190871 Binary files /dev/null and b/static/img/people/icon/adam.jpg differ diff --git a/static/img/people/icon/adam.png b/static/img/people/icon/adam.png deleted file mode 100644 index b7230d68d2..0000000000 Binary files a/static/img/people/icon/adam.png and /dev/null differ diff --git a/static/img/people/icon/ajit.jpg b/static/img/people/icon/ajit.jpg new file mode 100644 index 0000000000..bfb589b10a Binary files /dev/null and b/static/img/people/icon/ajit.jpg differ diff --git a/static/img/people/icon/ajit.png b/static/img/people/icon/ajit.png deleted file mode 100644 index a67ad63091..0000000000 Binary files a/static/img/people/icon/ajit.png and /dev/null differ diff --git a/static/img/people/icon/alea.jpg b/static/img/people/icon/alea.jpg index 5ab68bebb9..489c2e8046 100644 Binary files a/static/img/people/icon/alea.jpg and b/static/img/people/icon/alea.jpg differ diff --git a/static/img/people/icon/alvin.jpg b/static/img/people/icon/alvin.jpg new file mode 100644 index 0000000000..6b6ab08f99 Binary files /dev/null and b/static/img/people/icon/alvin.jpg differ diff --git a/static/img/people/icon/aman.jpg b/static/img/people/icon/aman.jpg new file mode 100644 index 0000000000..d7e2496554 Binary files /dev/null and b/static/img/people/icon/aman.jpg differ diff --git a/static/img/people/icon/amir.jpeg b/static/img/people/icon/amir.jpeg deleted file mode 100644 index 180439637b..0000000000 Binary files a/static/img/people/icon/amir.jpeg and /dev/null differ diff --git a/static/img/people/icon/amir.jpg b/static/img/people/icon/amir.jpg new file mode 100644 index 0000000000..29bf0b6f6f Binary files /dev/null and b/static/img/people/icon/amir.jpg differ diff --git a/static/img/people/icon/ara.jpg b/static/img/people/icon/ara.jpg new file mode 100644 index 0000000000..26b7124c51 Binary files /dev/null and b/static/img/people/icon/ara.jpg differ diff --git a/static/img/people/icon/ara.png b/static/img/people/icon/ara.png deleted file mode 100644 index 34e37a4c61..0000000000 Binary files a/static/img/people/icon/ara.png and /dev/null differ diff --git a/static/img/people/icon/asdine.jpg b/static/img/people/icon/asdine.jpg index 91a9e94a57..bc9f4c84dc 100644 Binary files a/static/img/people/icon/asdine.jpg and b/static/img/people/icon/asdine.jpg differ diff --git a/static/img/people/icon/bob.jpg b/static/img/people/icon/bob.jpg index c5d99d8d1e..459e5a6330 100644 Binary files a/static/img/people/icon/bob.jpg and b/static/img/people/icon/bob.jpg differ diff --git a/static/img/people/icon/byron.jpg b/static/img/people/icon/byron.jpg new file mode 100644 index 0000000000..9ce46892a8 Binary files /dev/null and b/static/img/people/icon/byron.jpg differ diff --git a/static/img/people/icon/byron.png b/static/img/people/icon/byron.png deleted file mode 100644 index 4c82929fae..0000000000 Binary files a/static/img/people/icon/byron.png and /dev/null differ diff --git a/static/img/people/icon/charles-modal.jpg b/static/img/people/icon/charles-modal.jpg new file mode 100644 index 0000000000..3d990c506c Binary files /dev/null and b/static/img/people/icon/charles-modal.jpg differ diff --git a/static/img/people/icon/charles-modal.png b/static/img/people/icon/charles-modal.png deleted file mode 100644 index a2fb2a7081..0000000000 Binary files a/static/img/people/icon/charles-modal.png and /dev/null differ diff --git a/static/img/people/icon/charly.jpeg b/static/img/people/icon/charly.jpeg new file mode 100644 index 0000000000..8f6aea43b5 Binary files /dev/null and b/static/img/people/icon/charly.jpeg differ diff --git a/static/img/people/icon/dan.jpg b/static/img/people/icon/dan.jpg index 2cf53a9b58..fc4e53c300 100644 Binary files a/static/img/people/icon/dan.jpg and b/static/img/people/icon/dan.jpg differ diff --git a/static/img/people/icon/daniel.jpg b/static/img/people/icon/daniel.jpg index 06972baa3e..0dd676923a 100644 Binary files a/static/img/people/icon/daniel.jpg and b/static/img/people/icon/daniel.jpg differ diff --git a/static/img/people/icon/dave.jpg b/static/img/people/icon/dave.jpg index 3f58431d0b..7076addd9a 100644 Binary files a/static/img/people/icon/dave.jpg and b/static/img/people/icon/dave.jpg differ diff --git a/static/img/people/icon/deepti.jpg b/static/img/people/icon/deepti.jpg new file mode 100644 index 0000000000..0d13680547 Binary files /dev/null and b/static/img/people/icon/deepti.jpg differ diff --git a/static/img/people/icon/deepti.png b/static/img/people/icon/deepti.png deleted file mode 100644 index bcb0be81bf..0000000000 Binary files a/static/img/people/icon/deepti.png and /dev/null differ diff --git a/static/img/people/icon/edward.jpg b/static/img/people/icon/edward.jpg index 543e2d5f17..d7bee9086a 100644 Binary files a/static/img/people/icon/edward.jpg and b/static/img/people/icon/edward.jpg differ diff --git a/static/img/people/icon/erika.jpg b/static/img/people/icon/erika.jpg index 329ef3f8cd..2e49ee33a4 100644 Binary files a/static/img/people/icon/erika.jpg and b/static/img/people/icon/erika.jpg differ diff --git a/static/img/people/icon/femke.jpg b/static/img/people/icon/femke.jpg index 1dcf021688..a75c28c93e 100644 Binary files a/static/img/people/icon/femke.jpg and b/static/img/people/icon/femke.jpg differ diff --git a/static/img/people/icon/hossein.jpg b/static/img/people/icon/hossein.jpg new file mode 100644 index 0000000000..f77c0c090d Binary files /dev/null and b/static/img/people/icon/hossein.jpg differ diff --git a/static/img/people/icon/ieva.jpg b/static/img/people/icon/ieva.jpg new file mode 100644 index 0000000000..be0daf0677 Binary files /dev/null and b/static/img/people/icon/ieva.jpg differ diff --git a/static/img/people/icon/ieva.png b/static/img/people/icon/ieva.png deleted file mode 100644 index 6b8abeed76..0000000000 Binary files a/static/img/people/icon/ieva.png and /dev/null differ diff --git a/static/img/people/icon/jerry.jpg b/static/img/people/icon/jerry.jpg new file mode 100644 index 0000000000..d78060aece Binary files /dev/null and b/static/img/people/icon/jerry.jpg differ diff --git a/static/img/people/icon/jerry.png b/static/img/people/icon/jerry.png deleted file mode 100644 index d7f0b6c64c..0000000000 Binary files a/static/img/people/icon/jerry.png and /dev/null differ diff --git a/static/img/people/icon/jessie.jpg b/static/img/people/icon/jessie.jpg new file mode 100644 index 0000000000..26110fb2db Binary files /dev/null and b/static/img/people/icon/jessie.jpg differ diff --git a/static/img/people/icon/jessie.png b/static/img/people/icon/jessie.png deleted file mode 100644 index cf34551af6..0000000000 Binary files a/static/img/people/icon/jessie.png and /dev/null differ diff --git a/static/img/people/icon/jobi.jpg b/static/img/people/icon/jobi.jpg new file mode 100644 index 0000000000..8bbd792187 Binary files /dev/null and b/static/img/people/icon/jobi.jpg differ diff --git a/static/img/people/icon/john.jpg b/static/img/people/icon/john.jpg new file mode 100644 index 0000000000..a99091017c Binary files /dev/null and b/static/img/people/icon/john.jpg differ diff --git a/static/img/people/icon/john.png b/static/img/people/icon/john.png deleted file mode 100755 index b88c603f2d..0000000000 Binary files a/static/img/people/icon/john.png and /dev/null differ diff --git a/static/img/people/icon/jon.jpg b/static/img/people/icon/jon.jpg index 339cac28f5..07f4028cba 100644 Binary files a/static/img/people/icon/jon.jpg and b/static/img/people/icon/jon.jpg differ diff --git a/static/img/people/icon/leonie.jpg b/static/img/people/icon/leonie.jpg index 52b292d052..52d187d825 100644 Binary files a/static/img/people/icon/leonie.jpg and b/static/img/people/icon/leonie.jpg differ diff --git a/static/img/people/icon/marion.jpg b/static/img/people/icon/marion.jpg index f2fdf8c28c..92368514d4 100644 Binary files a/static/img/people/icon/marion.jpg and b/static/img/people/icon/marion.jpg differ diff --git a/static/img/people/icon/mary.jpg b/static/img/people/icon/mary.jpg new file mode 100644 index 0000000000..40009c151f Binary files /dev/null and b/static/img/people/icon/mary.jpg differ diff --git a/static/img/people/icon/mary.png b/static/img/people/icon/mary.png deleted file mode 100644 index 64b678e2e1..0000000000 Binary files a/static/img/people/icon/mary.png and /dev/null differ diff --git a/static/img/people/icon/pete.jpg b/static/img/people/icon/pete.jpg index 6699b723f1..af2336d500 100644 Binary files a/static/img/people/icon/pete.jpg and b/static/img/people/icon/pete.jpg differ diff --git a/static/img/people/icon/randy.jpeg b/static/img/people/icon/randy.jpeg deleted file mode 100644 index a877bce472..0000000000 Binary files a/static/img/people/icon/randy.jpeg and /dev/null differ diff --git a/static/img/people/icon/randy.jpg b/static/img/people/icon/randy.jpg new file mode 100644 index 0000000000..05a19eaf8b Binary files /dev/null and b/static/img/people/icon/randy.jpg differ diff --git a/static/img/people/icon/sam.jpg b/static/img/people/icon/sam.jpg new file mode 100644 index 0000000000..097150c9fa Binary files /dev/null and b/static/img/people/icon/sam.jpg differ diff --git a/static/img/people/icon/sam.png b/static/img/people/icon/sam.png deleted file mode 100644 index 80b0e7eea2..0000000000 Binary files a/static/img/people/icon/sam.png and /dev/null differ diff --git a/static/img/people/icon/shukri.jpeg b/static/img/people/icon/shukri.jpeg deleted file mode 100644 index 1bc6ab726a..0000000000 Binary files a/static/img/people/icon/shukri.jpeg and /dev/null differ diff --git a/static/img/people/icon/shukri.jpg b/static/img/people/icon/shukri.jpg new file mode 100644 index 0000000000..e224bc9040 Binary files /dev/null and b/static/img/people/icon/shukri.jpg differ diff --git a/static/img/people/icon/spiros.jpg b/static/img/people/icon/spiros.jpg new file mode 100644 index 0000000000..811c5e88e6 Binary files /dev/null and b/static/img/people/icon/spiros.jpg differ diff --git a/static/img/people/icon/staci.jpg b/static/img/people/icon/staci.jpg new file mode 100644 index 0000000000..df0c810a9a Binary files /dev/null and b/static/img/people/icon/staci.jpg differ diff --git a/static/img/people/icon/svitlana.jpg b/static/img/people/icon/svitlana.jpg new file mode 100644 index 0000000000..b4d322d05a Binary files /dev/null and b/static/img/people/icon/svitlana.jpg differ diff --git a/static/img/people/icon/svitlana.png b/static/img/people/icon/svitlana.png deleted file mode 100644 index 3ab181b3d7..0000000000 Binary files a/static/img/people/icon/svitlana.png and /dev/null differ diff --git a/static/img/people/icon/tommy.jpg b/static/img/people/icon/tommy.jpg index 4da23901c1..343b6651c7 100644 Binary files a/static/img/people/icon/tommy.jpg and b/static/img/people/icon/tommy.jpg differ diff --git a/static/img/people/icon/tony.jpg b/static/img/people/icon/tony.jpg new file mode 100644 index 0000000000..534e302abe Binary files /dev/null and b/static/img/people/icon/tony.jpg differ diff --git a/static/img/people/icon/victoria.jpg b/static/img/people/icon/victoria.jpg new file mode 100644 index 0000000000..c225c602f3 Binary files /dev/null and b/static/img/people/icon/victoria.jpg differ diff --git a/static/img/people/icon/victoria.png b/static/img/people/icon/victoria.png deleted file mode 100644 index 06e1fdcd72..0000000000 Binary files a/static/img/people/icon/victoria.png and /dev/null differ diff --git a/static/img/people/team/Aaron.jpg b/static/img/people/team/Aaron.jpg new file mode 100644 index 0000000000..1beaefef18 Binary files /dev/null and b/static/img/people/team/Aaron.jpg differ diff --git a/static/img/people/team/Ajay.jpg b/static/img/people/team/Ajay.jpg new file mode 100644 index 0000000000..894c697ca2 Binary files /dev/null and b/static/img/people/team/Ajay.jpg differ diff --git a/static/img/people/team/Alvin.jpg b/static/img/people/team/Alvin.jpg index cdf7e3d75a..7b06798a6e 100644 Binary files a/static/img/people/team/Alvin.jpg and b/static/img/people/team/Alvin.jpg differ diff --git a/static/img/people/team/Brendan.jpg b/static/img/people/team/Brendan.jpg new file mode 100644 index 0000000000..30669f46fd Binary files /dev/null and b/static/img/people/team/Brendan.jpg differ diff --git a/static/img/people/team/Chad.jpg b/static/img/people/team/Chad.jpg index caf0456166..339189c3f7 100644 Binary files a/static/img/people/team/Chad.jpg and b/static/img/people/team/Chad.jpg differ diff --git a/static/img/people/team/Chara.jpg b/static/img/people/team/Chara.jpg new file mode 100644 index 0000000000..e0b395a453 Binary files /dev/null and b/static/img/people/team/Chara.jpg differ diff --git a/static/img/people/team/Christopher-McCurry.jpg b/static/img/people/team/Christopher-McCurry.jpg index 8942cc46b4..bd324798a7 100644 Binary files a/static/img/people/team/Christopher-McCurry.jpg and b/static/img/people/team/Christopher-McCurry.jpg differ diff --git a/static/img/people/team/Connor-Alkin.jpg b/static/img/people/team/Connor-Alkin.jpg index c564395dc2..c8a8db9e12 100644 Binary files a/static/img/people/team/Connor-Alkin.jpg and b/static/img/people/team/Connor-Alkin.jpg differ diff --git a/static/img/people/team/Damien.jpg b/static/img/people/team/Damien.jpg new file mode 100644 index 0000000000..ec2e030517 Binary files /dev/null and b/static/img/people/team/Damien.jpg differ diff --git a/static/img/people/team/Daniel-McGee.jpg b/static/img/people/team/Daniel-McGee.jpg deleted file mode 100644 index 1edc67d034..0000000000 Binary files a/static/img/people/team/Daniel-McGee.jpg and /dev/null differ diff --git a/static/img/people/team/Danielle.jpg b/static/img/people/team/Danielle.jpg new file mode 100644 index 0000000000..a1bea1b630 Binary files /dev/null and b/static/img/people/team/Danielle.jpg differ diff --git a/static/img/people/team/Hina.jpg b/static/img/people/team/Hina.jpg deleted file mode 100644 index 9d570f4814..0000000000 Binary files a/static/img/people/team/Hina.jpg and /dev/null differ diff --git a/static/img/people/team/Ivan.jpg b/static/img/people/team/Ivan.jpg new file mode 100644 index 0000000000..f50d38096d Binary files /dev/null and b/static/img/people/team/Ivan.jpg differ diff --git a/static/img/people/team/Jeronimo.jpeg b/static/img/people/team/Jeronimo.jpeg deleted file mode 100644 index 9c9f50887f..0000000000 Binary files a/static/img/people/team/Jeronimo.jpeg and /dev/null differ diff --git a/static/img/people/team/Jeronimo.jpg b/static/img/people/team/Jeronimo.jpg new file mode 100644 index 0000000000..b289d17387 Binary files /dev/null and b/static/img/people/team/Jeronimo.jpg differ diff --git a/static/img/people/team/Jose-Luis-Franco.jpeg b/static/img/people/team/Jose-Luis-Franco.jpeg deleted file mode 100644 index ac60e319d7..0000000000 Binary files a/static/img/people/team/Jose-Luis-Franco.jpeg and /dev/null differ diff --git a/static/img/people/team/Jose-Luis-Franco.jpg b/static/img/people/team/Jose-Luis-Franco.jpg new file mode 100644 index 0000000000..0c80915a53 Binary files /dev/null and b/static/img/people/team/Jose-Luis-Franco.jpg differ diff --git a/static/img/people/team/Kaviraj.jpg b/static/img/people/team/Kaviraj.jpg index 3c79c0920d..58050aa0f1 100644 Binary files a/static/img/people/team/Kaviraj.jpg and b/static/img/people/team/Kaviraj.jpg differ diff --git a/static/img/people/team/Mary-Newhauser.jpg b/static/img/people/team/Mary-Newhauser.jpg index ec9ba1230a..0f9cf0d567 100644 Binary files a/static/img/people/team/Mary-Newhauser.jpg and b/static/img/people/team/Mary-Newhauser.jpg differ diff --git a/static/img/people/team/Michael-Morgan.jpg b/static/img/people/team/Michael-Morgan.jpg index 6c904afccd..41cc84925d 100644 Binary files a/static/img/people/team/Michael-Morgan.jpg and b/static/img/people/team/Michael-Morgan.jpg differ diff --git a/static/img/people/team/Mike-Hoppe.jpeg b/static/img/people/team/Mike-Hoppe.jpeg deleted file mode 100644 index a7f549cf67..0000000000 Binary files a/static/img/people/team/Mike-Hoppe.jpeg and /dev/null differ diff --git a/static/img/people/team/Mike-Hoppe.jpg b/static/img/people/team/Mike-Hoppe.jpg new file mode 100644 index 0000000000..026db2807b Binary files /dev/null and b/static/img/people/team/Mike-Hoppe.jpg differ diff --git a/static/img/people/team/Mohamed-Badawi.jpeg b/static/img/people/team/Mohamed-Badawi.jpeg deleted file mode 100644 index d439bee871..0000000000 Binary files a/static/img/people/team/Mohamed-Badawi.jpeg and /dev/null differ diff --git a/static/img/people/team/Mohamed-Badawi.jpg b/static/img/people/team/Mohamed-Badawi.jpg new file mode 100644 index 0000000000..349cab1eb2 Binary files /dev/null and b/static/img/people/team/Mohamed-Badawi.jpg differ diff --git a/static/img/people/team/Pietro.jpg b/static/img/people/team/Pietro.jpg new file mode 100644 index 0000000000..00cc08e0ed Binary files /dev/null and b/static/img/people/team/Pietro.jpg differ diff --git a/static/img/people/team/Rodrigo-Lopez.jpg b/static/img/people/team/Rodrigo-Lopez.jpg index 033faae814..f81a88122a 100644 Binary files a/static/img/people/team/Rodrigo-Lopez.jpg and b/static/img/people/team/Rodrigo-Lopez.jpg differ diff --git a/static/img/people/team/Sean-Romberg.jpg b/static/img/people/team/Sean-Romberg.jpg new file mode 100644 index 0000000000..9845d6fefb Binary files /dev/null and b/static/img/people/team/Sean-Romberg.jpg differ diff --git a/static/img/people/team/Sebastian-Farriol.jpg b/static/img/people/team/Sebastian-Farriol.jpg index c901c2be1b..cdccf89a7e 100644 Binary files a/static/img/people/team/Sebastian-Farriol.jpg and b/static/img/people/team/Sebastian-Farriol.jpg differ diff --git a/static/img/people/team/Sebastian.jpg b/static/img/people/team/Sebastian.jpg new file mode 100644 index 0000000000..e0a43749f3 Binary files /dev/null and b/static/img/people/team/Sebastian.jpg differ diff --git a/static/img/people/team/Tuana.jpg b/static/img/people/team/Tuana.jpg new file mode 100644 index 0000000000..e4ae50f68b Binary files /dev/null and b/static/img/people/team/Tuana.jpg differ diff --git a/static/img/people/team/aarthi.jpeg b/static/img/people/team/aarthi.jpeg deleted file mode 100644 index 1598ed1349..0000000000 Binary files a/static/img/people/team/aarthi.jpeg and /dev/null differ diff --git a/static/img/people/team/aarthi.jpg b/static/img/people/team/aarthi.jpg new file mode 100644 index 0000000000..8e03d4d62a Binary files /dev/null and b/static/img/people/team/aarthi.jpg differ diff --git a/static/img/people/team/abdel.jpg b/static/img/people/team/abdel.jpg index 5c82f674eb..382c6d2dae 100644 Binary files a/static/img/people/team/abdel.jpg and b/static/img/people/team/abdel.jpg differ diff --git a/static/img/people/team/adam.jpg b/static/img/people/team/adam.jpg index 8e0546f486..cdf0866cc5 100644 Binary files a/static/img/people/team/adam.jpg and b/static/img/people/team/adam.jpg differ diff --git a/static/img/people/team/ajit.jpg b/static/img/people/team/ajit.jpg new file mode 100644 index 0000000000..14899584c7 Binary files /dev/null and b/static/img/people/team/ajit.jpg differ diff --git a/static/img/people/team/albert.jpeg b/static/img/people/team/albert.jpeg deleted file mode 100644 index 9d954abfa7..0000000000 Binary files a/static/img/people/team/albert.jpeg and /dev/null differ diff --git a/static/img/people/team/alea.jpg b/static/img/people/team/alea.jpg new file mode 100644 index 0000000000..04115ee4f5 Binary files /dev/null and b/static/img/people/team/alea.jpg differ diff --git a/static/img/people/team/alea.png b/static/img/people/team/alea.png deleted file mode 100644 index 5ab68bebb9..0000000000 Binary files a/static/img/people/team/alea.png and /dev/null differ diff --git a/static/img/people/team/andre-m.jpeg b/static/img/people/team/andre-m.jpeg deleted file mode 100644 index b09188c8be..0000000000 Binary files a/static/img/people/team/andre-m.jpeg and /dev/null differ diff --git a/static/img/people/team/andre-m.jpg b/static/img/people/team/andre-m.jpg new file mode 100644 index 0000000000..cb48601989 Binary files /dev/null and b/static/img/people/team/andre-m.jpg differ diff --git a/static/img/people/team/andre.jpg b/static/img/people/team/andre.jpg new file mode 100644 index 0000000000..8bf16f42a5 Binary files /dev/null and b/static/img/people/team/andre.jpg differ diff --git a/static/img/people/team/andre.png b/static/img/people/team/andre.png deleted file mode 100644 index bcb622f1ae..0000000000 Binary files a/static/img/people/team/andre.png and /dev/null differ diff --git a/static/img/people/team/andrzej.jpg b/static/img/people/team/andrzej.jpg new file mode 100644 index 0000000000..acaf7b91ea Binary files /dev/null and b/static/img/people/team/andrzej.jpg differ diff --git a/static/img/people/team/andrzej.png b/static/img/people/team/andrzej.png deleted file mode 100755 index fcf9965f9b..0000000000 Binary files a/static/img/people/team/andrzej.png and /dev/null differ diff --git a/static/img/people/team/ara.jpg b/static/img/people/team/ara.jpg index 17486bf4ef..40aefb57bb 100644 Binary files a/static/img/people/team/ara.jpg and b/static/img/people/team/ara.jpg differ diff --git a/static/img/people/team/asdine.jpg b/static/img/people/team/asdine.jpg index 91a9e94a57..dbf50be8d4 100644 Binary files a/static/img/people/team/asdine.jpg and b/static/img/people/team/asdine.jpg differ diff --git a/static/img/people/team/augustas.jpg b/static/img/people/team/augustas.jpg index 84d7584599..1eba6e5813 100644 Binary files a/static/img/people/team/augustas.jpg and b/static/img/people/team/augustas.jpg differ diff --git a/static/img/people/team/benjamin.jpg b/static/img/people/team/benjamin.jpg index 4cf0fa3bd2..19062fe25f 100644 Binary files a/static/img/people/team/benjamin.jpg and b/static/img/people/team/benjamin.jpg differ diff --git a/static/img/people/team/bob.jpg b/static/img/people/team/bob.jpg new file mode 100644 index 0000000000..eecb3da338 Binary files /dev/null and b/static/img/people/team/bob.jpg differ diff --git a/static/img/people/team/bob.png b/static/img/people/team/bob.png deleted file mode 100755 index 9937701ce6..0000000000 Binary files a/static/img/people/team/bob.png and /dev/null differ diff --git a/static/img/people/team/byron.jpg b/static/img/people/team/byron.jpg new file mode 100644 index 0000000000..0f16deb4d1 Binary files /dev/null and b/static/img/people/team/byron.jpg differ diff --git a/static/img/people/team/byron.png b/static/img/people/team/byron.png deleted file mode 100755 index 67c8e0f2ca..0000000000 Binary files a/static/img/people/team/byron.png and /dev/null differ diff --git a/static/img/people/team/cari.jpeg b/static/img/people/team/cari.jpeg deleted file mode 100644 index 75e75dd2d2..0000000000 Binary files a/static/img/people/team/cari.jpeg and /dev/null differ diff --git a/static/img/people/team/cari.jpg b/static/img/people/team/cari.jpg new file mode 100644 index 0000000000..53a7e8ddfd Binary files /dev/null and b/static/img/people/team/cari.jpg differ diff --git a/static/img/people/team/charles-pierse.jpg b/static/img/people/team/charles-pierse.jpg new file mode 100644 index 0000000000..18e9787904 Binary files /dev/null and b/static/img/people/team/charles-pierse.jpg differ diff --git a/static/img/people/team/charles-pierse.png b/static/img/people/team/charles-pierse.png deleted file mode 100644 index 4f091d9928..0000000000 Binary files a/static/img/people/team/charles-pierse.png and /dev/null differ diff --git a/static/img/people/team/charles.jpg b/static/img/people/team/charles.jpg new file mode 100644 index 0000000000..1d67c76ae0 Binary files /dev/null and b/static/img/people/team/charles.jpg differ diff --git a/static/img/people/team/charles.png b/static/img/people/team/charles.png deleted file mode 100755 index da42b45f9b..0000000000 Binary files a/static/img/people/team/charles.png and /dev/null differ diff --git a/static/img/people/team/chretien.jpeg b/static/img/people/team/chretien.jpeg deleted file mode 100644 index 853339feb8..0000000000 Binary files a/static/img/people/team/chretien.jpeg and /dev/null differ diff --git a/static/img/people/team/chretien.jpg b/static/img/people/team/chretien.jpg new file mode 100644 index 0000000000..d2a22d5fd0 Binary files /dev/null and b/static/img/people/team/chretien.jpg differ diff --git a/static/img/people/team/connor.jpg b/static/img/people/team/connor.jpg new file mode 100644 index 0000000000..9dbaac2933 Binary files /dev/null and b/static/img/people/team/connor.jpg differ diff --git a/static/img/people/team/connor.png b/static/img/people/team/connor.png deleted file mode 100755 index bba474fff7..0000000000 Binary files a/static/img/people/team/connor.png and /dev/null differ diff --git a/static/img/people/team/daniel-williams.jpg b/static/img/people/team/daniel-williams.jpg index 4780ebd742..ecb78f5718 100644 Binary files a/static/img/people/team/daniel-williams.jpg and b/static/img/people/team/daniel-williams.jpg differ diff --git a/static/img/people/team/daniel.jpg b/static/img/people/team/daniel.jpg new file mode 100644 index 0000000000..4af5456e51 Binary files /dev/null and b/static/img/people/team/daniel.jpg differ diff --git a/static/img/people/team/daniel.png b/static/img/people/team/daniel.png deleted file mode 100644 index e223d6a08a..0000000000 Binary files a/static/img/people/team/daniel.png and /dev/null differ diff --git a/static/img/people/team/darwin.jpg b/static/img/people/team/darwin.jpg index e7f6e22de1..830b08324c 100644 Binary files a/static/img/people/team/darwin.jpg and b/static/img/people/team/darwin.jpg differ diff --git a/static/img/people/team/dave.jpg b/static/img/people/team/dave.jpg deleted file mode 100644 index f515109b85..0000000000 Binary files a/static/img/people/team/dave.jpg and /dev/null differ diff --git a/static/img/people/team/david.jpg b/static/img/people/team/david.jpg new file mode 100644 index 0000000000..47fad016e3 Binary files /dev/null and b/static/img/people/team/david.jpg differ diff --git a/static/img/people/team/david.png b/static/img/people/team/david.png deleted file mode 100644 index 271ef6476f..0000000000 Binary files a/static/img/people/team/david.png and /dev/null differ diff --git a/static/img/people/team/deepti.jpg b/static/img/people/team/deepti.jpg index 0dfc1b5520..8b04c9eaf6 100644 Binary files a/static/img/people/team/deepti.jpg and b/static/img/people/team/deepti.jpg differ diff --git a/static/img/people/team/dirk.jpg b/static/img/people/team/dirk.jpg new file mode 100644 index 0000000000..6d60578547 Binary files /dev/null and b/static/img/people/team/dirk.jpg differ diff --git a/static/img/people/team/dirk.png b/static/img/people/team/dirk.png deleted file mode 100755 index 346d48678d..0000000000 Binary files a/static/img/people/team/dirk.png and /dev/null differ diff --git a/static/img/people/team/dmytro.jpg b/static/img/people/team/dmytro.jpg index 5321baad6c..ba85d80f32 100644 Binary files a/static/img/people/team/dmytro.jpg and b/static/img/people/team/dmytro.jpg differ diff --git a/static/img/people/team/duda.jpg b/static/img/people/team/duda.jpg index f371ea64b0..ba4c85a5c4 100644 Binary files a/static/img/people/team/duda.jpg and b/static/img/people/team/duda.jpg differ diff --git a/static/img/people/team/edward.jpg b/static/img/people/team/edward.jpg new file mode 100644 index 0000000000..b27ba94dc7 Binary files /dev/null and b/static/img/people/team/edward.jpg differ diff --git a/static/img/people/team/edward.png b/static/img/people/team/edward.png deleted file mode 100644 index b0f0720f28..0000000000 Binary files a/static/img/people/team/edward.png and /dev/null differ diff --git a/static/img/people/team/emma.jpg b/static/img/people/team/emma.jpg new file mode 100644 index 0000000000..1e118c41ff Binary files /dev/null and b/static/img/people/team/emma.jpg differ diff --git a/static/img/people/team/emma.png b/static/img/people/team/emma.png deleted file mode 100644 index 8a6ede5ccc..0000000000 Binary files a/static/img/people/team/emma.png and /dev/null differ diff --git a/static/img/people/team/eric.jpg b/static/img/people/team/eric.jpg new file mode 100644 index 0000000000..d04d61463d Binary files /dev/null and b/static/img/people/team/eric.jpg differ diff --git a/static/img/people/team/eric.png b/static/img/people/team/eric.png deleted file mode 100644 index dcdbf3d690..0000000000 Binary files a/static/img/people/team/eric.png and /dev/null differ diff --git a/static/img/people/team/erik.jpeg b/static/img/people/team/erik.jpeg deleted file mode 100644 index 3a2a768fed..0000000000 Binary files a/static/img/people/team/erik.jpeg and /dev/null differ diff --git a/static/img/people/team/erik.jpg b/static/img/people/team/erik.jpg new file mode 100644 index 0000000000..6943d57aa7 Binary files /dev/null and b/static/img/people/team/erik.jpg differ diff --git a/static/img/people/team/erika.jpg b/static/img/people/team/erika.jpg index 329ef3f8cd..1661b1f665 100644 Binary files a/static/img/people/team/erika.jpg and b/static/img/people/team/erika.jpg differ diff --git a/static/img/people/team/erin.jpeg b/static/img/people/team/erin.jpeg deleted file mode 100644 index 59a25f73f5..0000000000 Binary files a/static/img/people/team/erin.jpeg and /dev/null differ diff --git a/static/img/people/team/erin.jpg b/static/img/people/team/erin.jpg new file mode 100644 index 0000000000..1ddf9e7183 Binary files /dev/null and b/static/img/people/team/erin.jpg differ diff --git a/static/img/people/team/etienne.jpg b/static/img/people/team/etienne.jpg new file mode 100644 index 0000000000..488cb29398 Binary files /dev/null and b/static/img/people/team/etienne.jpg differ diff --git a/static/img/people/team/etienne.png b/static/img/people/team/etienne.png deleted file mode 100755 index a0545846b6..0000000000 Binary files a/static/img/people/team/etienne.png and /dev/null differ diff --git a/static/img/people/team/femke.jpg b/static/img/people/team/femke.jpg new file mode 100644 index 0000000000..fc9695921a Binary files /dev/null and b/static/img/people/team/femke.jpg differ diff --git a/static/img/people/team/femke.png b/static/img/people/team/femke.png deleted file mode 100755 index 423d7f0634..0000000000 Binary files a/static/img/people/team/femke.png and /dev/null differ diff --git a/static/img/people/team/griffin.jpg b/static/img/people/team/griffin.jpg index 4c1a9d537c..44b42d6c08 100644 Binary files a/static/img/people/team/griffin.jpg and b/static/img/people/team/griffin.jpg differ diff --git a/static/img/people/team/ian.jpeg b/static/img/people/team/ian.jpeg deleted file mode 100644 index 07cc2425fd..0000000000 Binary files a/static/img/people/team/ian.jpeg and /dev/null differ diff --git a/static/img/people/team/ian.jpg b/static/img/people/team/ian.jpg new file mode 100644 index 0000000000..8cf22dd044 Binary files /dev/null and b/static/img/people/team/ian.jpg differ diff --git a/static/img/people/team/ieva.jpg b/static/img/people/team/ieva.jpg new file mode 100644 index 0000000000..7352bbb70f Binary files /dev/null and b/static/img/people/team/ieva.jpg differ diff --git a/static/img/people/team/ieva.png b/static/img/people/team/ieva.png deleted file mode 100644 index 162f0fc658..0000000000 Binary files a/static/img/people/team/ieva.png and /dev/null differ diff --git a/static/img/people/team/igor.jpeg b/static/img/people/team/igor.jpeg deleted file mode 100644 index 6fbdef9c53..0000000000 Binary files a/static/img/people/team/igor.jpeg and /dev/null differ diff --git a/static/img/people/team/igor.jpg b/static/img/people/team/igor.jpg new file mode 100644 index 0000000000..eee25dc681 Binary files /dev/null and b/static/img/people/team/igor.jpg differ diff --git a/static/img/people/team/james-alcorn.jpeg b/static/img/people/team/james-alcorn.jpeg deleted file mode 100644 index 87e5e966fe..0000000000 Binary files a/static/img/people/team/james-alcorn.jpeg and /dev/null differ diff --git a/static/img/people/team/james-alcorn.jpg b/static/img/people/team/james-alcorn.jpg new file mode 100644 index 0000000000..6531d0a6bc Binary files /dev/null and b/static/img/people/team/james-alcorn.jpg differ diff --git a/static/img/people/team/jenna.jpg b/static/img/people/team/jenna.jpg deleted file mode 100644 index 4d52d6ad1c..0000000000 Binary files a/static/img/people/team/jenna.jpg and /dev/null differ diff --git a/static/img/people/team/jenna.png b/static/img/people/team/jenna.png deleted file mode 100644 index 3f383796f2..0000000000 Binary files a/static/img/people/team/jenna.png and /dev/null differ diff --git a/static/img/people/team/jeremy.jpg b/static/img/people/team/jeremy.jpg new file mode 100644 index 0000000000..a415412f52 Binary files /dev/null and b/static/img/people/team/jeremy.jpg differ diff --git a/static/img/people/team/jeremy.png b/static/img/people/team/jeremy.png deleted file mode 100755 index 4e683ea022..0000000000 Binary files a/static/img/people/team/jeremy.png and /dev/null differ diff --git a/static/img/people/team/jessie.jpg b/static/img/people/team/jessie.jpg new file mode 100644 index 0000000000..2a0e0d93bc Binary files /dev/null and b/static/img/people/team/jessie.jpg differ diff --git a/static/img/people/team/jessie.png b/static/img/people/team/jessie.png deleted file mode 100755 index 1ec8c4c885..0000000000 Binary files a/static/img/people/team/jessie.png and /dev/null differ diff --git a/static/img/people/team/jobi.jpg b/static/img/people/team/jobi.jpg new file mode 100644 index 0000000000..e59cd5514b Binary files /dev/null and b/static/img/people/team/jobi.jpg differ diff --git a/static/img/people/team/jobi.png b/static/img/people/team/jobi.png deleted file mode 100644 index ed08180e25..0000000000 Binary files a/static/img/people/team/jobi.png and /dev/null differ diff --git a/static/img/people/team/john.jpg b/static/img/people/team/john.jpg new file mode 100644 index 0000000000..644bfd224b Binary files /dev/null and b/static/img/people/team/john.jpg differ diff --git a/static/img/people/team/john.png b/static/img/people/team/john.png deleted file mode 100755 index b88c603f2d..0000000000 Binary files a/static/img/people/team/john.png and /dev/null differ diff --git a/static/img/people/team/jonathan-tuite.jpeg b/static/img/people/team/jonathan-tuite.jpeg deleted file mode 100644 index 25ea3acc96..0000000000 Binary files a/static/img/people/team/jonathan-tuite.jpeg and /dev/null differ diff --git a/static/img/people/team/jonathan.jpg b/static/img/people/team/jonathan.jpg new file mode 100644 index 0000000000..f563bbae39 Binary files /dev/null and b/static/img/people/team/jonathan.jpg differ diff --git a/static/img/people/team/jonathan.png b/static/img/people/team/jonathan.png deleted file mode 100644 index 7b0ea17769..0000000000 Binary files a/static/img/people/team/jonathan.png and /dev/null differ diff --git a/static/img/people/team/joseph-green.jpg b/static/img/people/team/joseph-green.jpg index f3f19ce379..2530091ed4 100644 Binary files a/static/img/people/team/joseph-green.jpg and b/static/img/people/team/joseph-green.jpg differ diff --git a/static/img/people/team/josh-goldstein.jpg b/static/img/people/team/josh-goldstein.jpg index a949cd29e3..0b095be466 100644 Binary files a/static/img/people/team/josh-goldstein.jpg and b/static/img/people/team/josh-goldstein.jpg differ diff --git a/static/img/people/team/jp.jpg b/static/img/people/team/jp.jpg new file mode 100644 index 0000000000..3af2c17e5a Binary files /dev/null and b/static/img/people/team/jp.jpg differ diff --git a/static/img/people/team/jp.png b/static/img/people/team/jp.png deleted file mode 100755 index 111f77fe0e..0000000000 Binary files a/static/img/people/team/jp.png and /dev/null differ diff --git a/static/img/people/team/ken.png b/static/img/people/team/ken.png deleted file mode 100644 index 5d17d763f6..0000000000 Binary files a/static/img/people/team/ken.png and /dev/null differ diff --git a/static/img/people/team/laura.jpg b/static/img/people/team/laura.jpg index 03c31ccc5f..af6031d178 100644 Binary files a/static/img/people/team/laura.jpg and b/static/img/people/team/laura.jpg differ diff --git a/static/img/people/team/leonie.jpg b/static/img/people/team/leonie.jpg index 52b292d052..28a73cb9a7 100644 Binary files a/static/img/people/team/leonie.jpg and b/static/img/people/team/leonie.jpg differ diff --git a/static/img/people/team/loic.jpg b/static/img/people/team/loic.jpg new file mode 100644 index 0000000000..5c94702dd0 Binary files /dev/null and b/static/img/people/team/loic.jpg differ diff --git a/static/img/people/team/loic.png b/static/img/people/team/loic.png deleted file mode 100644 index 39da429d61..0000000000 Binary files a/static/img/people/team/loic.png and /dev/null differ diff --git a/static/img/people/team/marcin.jpg b/static/img/people/team/marcin.jpg new file mode 100644 index 0000000000..1faf1c6bbb Binary files /dev/null and b/static/img/people/team/marcin.jpg differ diff --git a/static/img/people/team/marcin.png b/static/img/people/team/marcin.png deleted file mode 100755 index 64db05a172..0000000000 Binary files a/static/img/people/team/marcin.png and /dev/null differ diff --git a/static/img/people/team/marcus.jpeg b/static/img/people/team/marcus.jpeg deleted file mode 100644 index 3d89207e12..0000000000 Binary files a/static/img/people/team/marcus.jpeg and /dev/null differ diff --git a/static/img/people/team/marcus.jpg b/static/img/people/team/marcus.jpg new file mode 100644 index 0000000000..c6cdc7ab3a Binary files /dev/null and b/static/img/people/team/marcus.jpg differ diff --git a/static/img/people/team/marion.jpg b/static/img/people/team/marion.jpg index 0684fad72b..8af5c56a3b 100644 Binary files a/static/img/people/team/marion.jpg and b/static/img/people/team/marion.jpg differ diff --git a/static/img/people/team/mariska.jpg b/static/img/people/team/mariska.jpg index 16498c4f82..547e406c04 100644 Binary files a/static/img/people/team/mariska.jpg and b/static/img/people/team/mariska.jpg differ diff --git a/static/img/people/team/mike.jpg b/static/img/people/team/mike.jpg index 119e32a2b4..b595dd7726 100644 Binary files a/static/img/people/team/mike.jpg and b/static/img/people/team/mike.jpg differ diff --git a/static/img/people/team/mohamed.jpeg b/static/img/people/team/mohamed.jpeg deleted file mode 100644 index f7809617bc..0000000000 Binary files a/static/img/people/team/mohamed.jpeg and /dev/null differ diff --git a/static/img/people/team/mohamed.jpg b/static/img/people/team/mohamed.jpg new file mode 100644 index 0000000000..dd51bccb8f Binary files /dev/null and b/static/img/people/team/mohamed.jpg differ diff --git a/static/img/people/team/nate-wilkinson.jpg b/static/img/people/team/nate-wilkinson.jpg index a386243ce0..6c06076064 100644 Binary files a/static/img/people/team/nate-wilkinson.jpg and b/static/img/people/team/nate-wilkinson.jpg differ diff --git a/static/img/people/team/nenad.jpg b/static/img/people/team/nenad.jpg index 8b1b8a1af9..08977b1f68 100644 Binary files a/static/img/people/team/nenad.jpg and b/static/img/people/team/nenad.jpg differ diff --git a/static/img/people/team/nick.jpg b/static/img/people/team/nick.jpg new file mode 100644 index 0000000000..1f6af96822 Binary files /dev/null and b/static/img/people/team/nick.jpg differ diff --git a/static/img/people/team/nick.png b/static/img/people/team/nick.png deleted file mode 100644 index 7e378ed2fd..0000000000 Binary files a/static/img/people/team/nick.png and /dev/null differ diff --git a/static/img/people/team/parker.jpg b/static/img/people/team/parker.jpg new file mode 100644 index 0000000000..ad3d0fea7a Binary files /dev/null and b/static/img/people/team/parker.jpg differ diff --git a/static/img/people/team/parker.png b/static/img/people/team/parker.png deleted file mode 100755 index b04be9c4b2..0000000000 Binary files a/static/img/people/team/parker.png and /dev/null differ diff --git a/static/img/people/team/patrick.jpg b/static/img/people/team/patrick.jpg index e5d42aeb08..61e6dd3214 100644 Binary files a/static/img/people/team/patrick.jpg and b/static/img/people/team/patrick.jpg differ diff --git a/static/img/people/team/paul-de-grijp.jpg b/static/img/people/team/paul-de-grijp.jpg index 418556d2f5..50b4b9654f 100644 Binary files a/static/img/people/team/paul-de-grijp.jpg and b/static/img/people/team/paul-de-grijp.jpg differ diff --git a/static/img/people/team/paul.jpg b/static/img/people/team/paul.jpg new file mode 100644 index 0000000000..3ce3c3ccd5 Binary files /dev/null and b/static/img/people/team/paul.jpg differ diff --git a/static/img/people/team/paul.png b/static/img/people/team/paul.png deleted file mode 100644 index 2f9609a81c..0000000000 Binary files a/static/img/people/team/paul.png and /dev/null differ diff --git a/static/img/people/team/peter.png b/static/img/people/team/peter.png deleted file mode 100755 index d4a13faa37..0000000000 Binary files a/static/img/people/team/peter.png and /dev/null differ diff --git a/static/img/people/team/philip.jpg b/static/img/people/team/philip.jpg new file mode 100644 index 0000000000..264d16be82 Binary files /dev/null and b/static/img/people/team/philip.jpg differ diff --git a/static/img/people/team/philip.png b/static/img/people/team/philip.png deleted file mode 100644 index 5b279cb41d..0000000000 Binary files a/static/img/people/team/philip.png and /dev/null differ diff --git a/static/img/people/team/piaras-hoban.jpg b/static/img/people/team/piaras-hoban.jpg index f3054288d9..45c6f7be3e 100644 Binary files a/static/img/people/team/piaras-hoban.jpg and b/static/img/people/team/piaras-hoban.jpg differ diff --git a/static/img/people/team/redo.png b/static/img/people/team/redo.png deleted file mode 100755 index ae0857b4d2..0000000000 Binary files a/static/img/people/team/redo.png and /dev/null differ diff --git a/static/img/people/team/rich-lapham.jpg b/static/img/people/team/rich-lapham.jpg index cba64fdca9..de1dc1b909 100644 Binary files a/static/img/people/team/rich-lapham.jpg and b/static/img/people/team/rich-lapham.jpg differ diff --git a/static/img/people/team/roberto-esposito.jpg b/static/img/people/team/roberto-esposito.jpg index d375c5e73f..5772c3fe70 100644 Binary files a/static/img/people/team/roberto-esposito.jpg and b/static/img/people/team/roberto-esposito.jpg differ diff --git a/static/img/people/team/rodrigo.png b/static/img/people/team/rodrigo.png deleted file mode 100644 index 11ba5ed115..0000000000 Binary files a/static/img/people/team/rodrigo.png and /dev/null differ diff --git a/static/img/people/team/rohan.jpg b/static/img/people/team/rohan.jpg index d449146935..4dac73b3eb 100644 Binary files a/static/img/people/team/rohan.jpg and b/static/img/people/team/rohan.jpg differ diff --git a/static/img/people/team/ryan.jpg b/static/img/people/team/ryan.jpg new file mode 100644 index 0000000000..bd772e3894 Binary files /dev/null and b/static/img/people/team/ryan.jpg differ diff --git a/static/img/people/team/sam-ramji.jpeg b/static/img/people/team/sam-ramji.jpeg deleted file mode 100644 index 3a6bc6a97e..0000000000 Binary files a/static/img/people/team/sam-ramji.jpeg and /dev/null differ diff --git a/static/img/people/team/sam-ramji.jpg b/static/img/people/team/sam-ramji.jpg new file mode 100644 index 0000000000..37bfac82e2 Binary files /dev/null and b/static/img/people/team/sam-ramji.jpg differ diff --git a/static/img/people/team/scott-alexander.jpg b/static/img/people/team/scott-alexander.jpg index babfb90564..6844c91143 100644 Binary files a/static/img/people/team/scott-alexander.jpg and b/static/img/people/team/scott-alexander.jpg differ diff --git a/static/img/people/team/sebastian.png b/static/img/people/team/sebastian.png deleted file mode 100755 index c8739097ae..0000000000 Binary files a/static/img/people/team/sebastian.png and /dev/null differ diff --git a/static/img/people/team/shan.jpg b/static/img/people/team/shan.jpg index 7f057c2cd9..2a16874f19 100644 Binary files a/static/img/people/team/shan.jpg and b/static/img/people/team/shan.jpg differ diff --git a/static/img/people/team/shukri.jpg b/static/img/people/team/shukri.jpg new file mode 100644 index 0000000000..05cf252d07 Binary files /dev/null and b/static/img/people/team/shukri.jpg differ diff --git a/static/img/people/team/shukri.png b/static/img/people/team/shukri.png deleted file mode 100644 index 5f5e246f17..0000000000 Binary files a/static/img/people/team/shukri.png and /dev/null differ diff --git a/static/img/people/team/sila.png b/static/img/people/team/sila.png deleted file mode 100755 index 88c4ebd95e..0000000000 Binary files a/static/img/people/team/sila.png and /dev/null differ diff --git a/static/img/people/team/soham-maniar.jpg b/static/img/people/team/soham-maniar.jpg index 4158fdf9f5..63d75f4744 100644 Binary files a/static/img/people/team/soham-maniar.jpg and b/static/img/people/team/soham-maniar.jpg differ diff --git a/static/img/people/team/spiros.jpg b/static/img/people/team/spiros.jpg index 8f207470a3..c862ca7a58 100644 Binary files a/static/img/people/team/spiros.jpg and b/static/img/people/team/spiros.jpg differ diff --git a/static/img/people/team/staci.jpg b/static/img/people/team/staci.jpg index 485747a641..c9afc31d7c 100644 Binary files a/static/img/people/team/staci.jpg and b/static/img/people/team/staci.jpg differ diff --git a/static/img/people/team/stefan.jpg b/static/img/people/team/stefan.jpg new file mode 100644 index 0000000000..959bb97c2a Binary files /dev/null and b/static/img/people/team/stefan.jpg differ diff --git a/static/img/people/team/stefan.png b/static/img/people/team/stefan.png deleted file mode 100755 index 6aab16c2b7..0000000000 Binary files a/static/img/people/team/stefan.png and /dev/null differ diff --git a/static/img/people/team/svitlana.jpg b/static/img/people/team/svitlana.jpg new file mode 100644 index 0000000000..5f95ceb69e Binary files /dev/null and b/static/img/people/team/svitlana.jpg differ diff --git a/static/img/people/team/svitlana.png b/static/img/people/team/svitlana.png deleted file mode 100755 index ca04ba7e1a..0000000000 Binary files a/static/img/people/team/svitlana.png and /dev/null differ diff --git a/static/img/people/team/tal.jpeg b/static/img/people/team/tal.jpeg deleted file mode 100644 index 549fdaa5ed..0000000000 Binary files a/static/img/people/team/tal.jpeg and /dev/null differ diff --git a/static/img/people/team/tal.jpg b/static/img/people/team/tal.jpg new file mode 100644 index 0000000000..d21b9d3123 Binary files /dev/null and b/static/img/people/team/tal.jpg differ diff --git a/static/img/people/team/thomas.jpg b/static/img/people/team/thomas.jpg index 9e1eaf843f..5d32983e25 100644 Binary files a/static/img/people/team/thomas.jpg and b/static/img/people/team/thomas.jpg differ diff --git a/static/img/people/team/tommy.jpg b/static/img/people/team/tommy.jpg index 517ba0b603..f39e6dcd04 100644 Binary files a/static/img/people/team/tommy.jpg and b/static/img/people/team/tommy.jpg differ diff --git a/static/img/people/team/tony-florence.jpeg b/static/img/people/team/tony-florence.jpeg deleted file mode 100644 index c92206e51f..0000000000 Binary files a/static/img/people/team/tony-florence.jpeg and /dev/null differ diff --git a/static/img/people/team/tony-florence.jpg b/static/img/people/team/tony-florence.jpg new file mode 100644 index 0000000000..f016f222be Binary files /dev/null and b/static/img/people/team/tony-florence.jpg differ diff --git a/static/img/people/team/tony.jpeg b/static/img/people/team/tony.jpeg deleted file mode 100644 index 60a075c2ca..0000000000 Binary files a/static/img/people/team/tony.jpeg and /dev/null differ diff --git a/static/img/people/team/tony.jpg b/static/img/people/team/tony.jpg new file mode 100644 index 0000000000..ad56dd7f6a Binary files /dev/null and b/static/img/people/team/tony.jpg differ diff --git a/static/img/people/team/victoria.jpg b/static/img/people/team/victoria.jpg index 903bc120ad..f5dad844de 100644 Binary files a/static/img/people/team/victoria.jpg and b/static/img/people/team/victoria.jpg differ diff --git a/static/img/people/team/wera.jpg b/static/img/people/team/wera.jpg new file mode 100644 index 0000000000..16c125b365 Binary files /dev/null and b/static/img/people/team/wera.jpg differ diff --git a/static/img/people/team/wera.png b/static/img/people/team/wera.png deleted file mode 100755 index 90c0b1bf49..0000000000 Binary files a/static/img/people/team/wera.png and /dev/null differ diff --git a/static/img/people/team/zack.jpeg b/static/img/people/team/zack.jpeg deleted file mode 100644 index 000cd397f2..0000000000 Binary files a/static/img/people/team/zack.jpeg and /dev/null differ diff --git a/static/img/people/team/zack.jpg b/static/img/people/team/zack.jpg new file mode 100644 index 0000000000..34dfd12038 Binary files /dev/null and b/static/img/people/team/zack.jpg differ diff --git a/static/img/people/team/zain.png b/static/img/people/team/zain.png deleted file mode 100755 index 3187e07869..0000000000 Binary files a/static/img/people/team/zain.png and /dev/null differ diff --git a/static/img/site/AI-in-prod-NY-mobile.png b/static/img/site/AI-in-prod-NY-mobile.png index 71ceb2235b..e8c460b15a 100644 Binary files a/static/img/site/AI-in-prod-NY-mobile.png and b/static/img/site/AI-in-prod-NY-mobile.png differ diff --git a/static/img/site/AI-in-prod-NY-web.png b/static/img/site/AI-in-prod-NY-web.png index d50092161f..191faa1a1b 100644 Binary files a/static/img/site/AI-in-prod-NY-web.png and b/static/img/site/AI-in-prod-NY-web.png differ diff --git a/static/img/site/ArrowButton.svg b/static/img/site/ArrowButton.svg new file mode 100644 index 0000000000..c3790758c2 --- /dev/null +++ b/static/img/site/ArrowButton.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/Bob-tweet.png b/static/img/site/Bob-tweet.png index 634a36eb28..6f14d57344 100644 Binary files a/static/img/site/Bob-tweet.png and b/static/img/site/Bob-tweet.png differ diff --git a/static/img/site/CPO-hot.png b/static/img/site/CPO-hot.png index bec710fa9c..e103ba4039 100644 Binary files a/static/img/site/CPO-hot.png and b/static/img/site/CPO-hot.png differ diff --git a/static/img/site/CPO-warm.png b/static/img/site/CPO-warm.png index 65c17ee889..800569f267 100644 Binary files a/static/img/site/CPO-warm.png and b/static/img/site/CPO-warm.png differ diff --git a/static/img/site/IBM_logo.svg.png b/static/img/site/IBM_logo.svg.png new file mode 100644 index 0000000000..06fddd6d9d Binary files /dev/null and b/static/img/site/IBM_logo.svg.png differ diff --git a/static/img/site/Jina_logo.svg b/static/img/site/Jina_logo.svg new file mode 100644 index 0000000000..605c0cff86 --- /dev/null +++ b/static/img/site/Jina_logo.svg @@ -0,0 +1,13 @@ + + + Jina-color + + + + + + + + + + \ No newline at end of file diff --git a/static/img/site/RicAI.svg b/static/img/site/RicAI.svg new file mode 100644 index 0000000000..f4adda3937 --- /dev/null +++ b/static/img/site/RicAI.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/Security-Checklist.pdf b/static/img/site/Security-Checklist.pdf new file mode 100644 index 0000000000..4ba3e425c1 Binary files /dev/null and b/static/img/site/Security-Checklist.pdf differ diff --git a/static/img/site/Wealingo_Video.mov b/static/img/site/Wealingo_Video.mov new file mode 100644 index 0000000000..1b77f2d2a7 Binary files /dev/null and b/static/img/site/Wealingo_Video.mov differ diff --git a/static/img/site/Wealingo_Video.mp4 b/static/img/site/Wealingo_Video.mp4 new file mode 100644 index 0000000000..b82e13a0c7 Binary files /dev/null and b/static/img/site/Wealingo_Video.mp4 differ diff --git a/static/img/site/Wealingo_Video.webm b/static/img/site/Wealingo_Video.webm new file mode 100644 index 0000000000..1a50285ac7 Binary files /dev/null and b/static/img/site/Wealingo_Video.webm differ diff --git a/static/img/site/about-playbook-01.png b/static/img/site/about-playbook-01.png index 9e302ae42b..ef32540d7f 100644 Binary files a/static/img/site/about-playbook-01.png and b/static/img/site/about-playbook-01.png differ diff --git a/static/img/site/about-playbook-03.png b/static/img/site/about-playbook-03.png index 60bb59bac5..27a029a29c 100644 Binary files a/static/img/site/about-playbook-03.png and b/static/img/site/about-playbook-03.png differ diff --git a/static/img/site/ai-berlin-event.png b/static/img/site/ai-berlin-event.png index d3e1516ab7..db7b8a0b91 100644 Binary files a/static/img/site/ai-berlin-event.png and b/static/img/site/ai-berlin-event.png differ diff --git a/static/img/site/ai-head.png b/static/img/site/ai-head.png index 536bcaac97..c4a733199f 100644 Binary files a/static/img/site/ai-head.png and b/static/img/site/ai-head.png differ diff --git a/static/img/site/ai-in-prod-weaviate-m.png b/static/img/site/ai-in-prod-weaviate-m.png index bd0df2be21..9856dc04ae 100644 Binary files a/static/img/site/ai-in-prod-weaviate-m.png and b/static/img/site/ai-in-prod-weaviate-m.png differ diff --git a/static/img/site/ai-in-prod-weaviate.png b/static/img/site/ai-in-prod-weaviate.png index 0c0391c3f7..8fcd67059c 100644 Binary files a/static/img/site/ai-in-prod-weaviate.png and b/static/img/site/ai-in-prod-weaviate.png differ diff --git a/static/img/site/airbyte_logo.svg b/static/img/site/airbyte_logo.svg new file mode 100644 index 0000000000..c4eb95a689 --- /dev/null +++ b/static/img/site/airbyte_logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/site/amd-demo.svg b/static/img/site/amd-demo.svg new file mode 100644 index 0000000000..035a462e81 --- /dev/null +++ b/static/img/site/amd-demo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/anthropic_logo.svg b/static/img/site/anthropic_logo.svg new file mode 100644 index 0000000000..cbcc39ea91 --- /dev/null +++ b/static/img/site/anthropic_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/anyscale_logo.jpg b/static/img/site/anyscale_logo.jpg new file mode 100644 index 0000000000..adf8b102f5 Binary files /dev/null and b/static/img/site/anyscale_logo.jpg differ diff --git a/static/img/site/apps-embeddings-icon.svg b/static/img/site/apps-embeddings-icon.svg new file mode 100644 index 0000000000..5153b87703 --- /dev/null +++ b/static/img/site/apps-embeddings-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/site/arize_logo.svg b/static/img/site/arize_logo.svg new file mode 100644 index 0000000000..b8f424cc4d --- /dev/null +++ b/static/img/site/arize_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/aryn-logo-partners.svg b/static/img/site/aryn-logo-partners.svg new file mode 100644 index 0000000000..4ddedf8edf --- /dev/null +++ b/static/img/site/aryn-logo-partners.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/site/aryn_logo.svg b/static/img/site/aryn_logo.svg new file mode 100644 index 0000000000..4ddedf8edf --- /dev/null +++ b/static/img/site/aryn_logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/site/astronomer-logo-cs.svg b/static/img/site/astronomer-logo-cs.svg new file mode 100644 index 0000000000..9bfd665129 --- /dev/null +++ b/static/img/site/astronomer-logo-cs.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/img/site/astronomer_logo.svg b/static/img/site/astronomer_logo.svg new file mode 100644 index 0000000000..537eb22217 --- /dev/null +++ b/static/img/site/astronomer_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/b4b-logo.png b/static/img/site/b4b-logo.png index 1a5e87333a..d860a03d97 100644 Binary files a/static/img/site/b4b-logo.png and b/static/img/site/b4b-logo.png differ diff --git a/static/img/site/bg-3d-slim.png b/static/img/site/bg-3d-slim.png new file mode 100644 index 0000000000..a3d48c8f94 Binary files /dev/null and b/static/img/site/bg-3d-slim.png differ diff --git a/static/img/site/bg-dark-1.png b/static/img/site/bg-dark-1.png new file mode 100644 index 0000000000..fc3111b77f Binary files /dev/null and b/static/img/site/bg-dark-1.png differ diff --git a/static/img/site/binary-hero.png b/static/img/site/binary-hero.png index def1f6d1dd..e07f0d7415 100644 Binary files a/static/img/site/binary-hero.png and b/static/img/site/binary-hero.png differ diff --git a/static/img/site/bunq-demo.svg b/static/img/site/bunq-demo.svg new file mode 100644 index 0000000000..2cde39a9ba --- /dev/null +++ b/static/img/site/bunq-demo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/site/bww-bg-logo-01.svg b/static/img/site/bww-bg-logo-01.svg new file mode 100644 index 0000000000..579d370c38 --- /dev/null +++ b/static/img/site/bww-bg-logo-01.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/site/bww-bg-logo-02.svg b/static/img/site/bww-bg-logo-02.svg new file mode 100644 index 0000000000..aad7bd1669 --- /dev/null +++ b/static/img/site/bww-bg-logo-02.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/bww-share-example-01.png b/static/img/site/bww-share-example-01.png index 44b044fbaf..874da4a7bc 100644 Binary files a/static/img/site/bww-share-example-01.png and b/static/img/site/bww-share-example-01.png differ diff --git a/static/img/site/bww-share-example-02.png b/static/img/site/bww-share-example-02.png index c12b840068..cc257d1eb5 100644 Binary files a/static/img/site/bww-share-example-02.png and b/static/img/site/bww-share-example-02.png differ diff --git a/static/img/site/bww-share-example-03.png b/static/img/site/bww-share-example-03.png index e6b3d6766d..6444a7a963 100644 Binary files a/static/img/site/bww-share-example-03.png and b/static/img/site/bww-share-example-03.png differ diff --git a/static/img/site/byoc-grid-01.png b/static/img/site/byoc-grid-01.png index f8a810f09d..00375e21d3 100644 Binary files a/static/img/site/byoc-grid-01.png and b/static/img/site/byoc-grid-01.png differ diff --git a/static/img/site/byoc-grid-02.png b/static/img/site/byoc-grid-02.png index e9dc4f6e4a..e4ced30713 100644 Binary files a/static/img/site/byoc-grid-02.png and b/static/img/site/byoc-grid-02.png differ diff --git a/static/img/site/calling-section-image-01.png b/static/img/site/calling-section-image-01.png index a70f1deb4a..800a784130 100644 Binary files a/static/img/site/calling-section-image-01.png and b/static/img/site/calling-section-image-01.png differ diff --git a/static/img/site/calling-section-image-02.png b/static/img/site/calling-section-image-02.png index ae7f8ae99a..ada25ca4ef 100644 Binary files a/static/img/site/calling-section-image-02.png and b/static/img/site/calling-section-image-02.png differ diff --git a/static/img/site/case-study-bg-image-01.png b/static/img/site/case-study-bg-image-01.png new file mode 100644 index 0000000000..b8fbf14363 Binary files /dev/null and b/static/img/site/case-study-bg-image-01.png differ diff --git a/static/img/site/case-study-finance-side.png b/static/img/site/case-study-finance-side.png new file mode 100644 index 0000000000..0064771c8d Binary files /dev/null and b/static/img/site/case-study-finance-side.png differ diff --git a/static/img/site/case-study-header-image-01.png b/static/img/site/case-study-header-image-01.png new file mode 100644 index 0000000000..8c39008ceb Binary files /dev/null and b/static/img/site/case-study-header-image-01.png differ diff --git a/static/img/site/case-study-main-01.png b/static/img/site/case-study-main-01.png new file mode 100644 index 0000000000..a915c34666 Binary files /dev/null and b/static/img/site/case-study-main-01.png differ diff --git a/static/img/site/case-study-main-02.png b/static/img/site/case-study-main-02.png new file mode 100644 index 0000000000..49b819082a Binary files /dev/null and b/static/img/site/case-study-main-02.png differ diff --git a/static/img/site/case-study-main-icon-01.svg b/static/img/site/case-study-main-icon-01.svg new file mode 100644 index 0000000000..65034e72b6 --- /dev/null +++ b/static/img/site/case-study-main-icon-01.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/cisco-demo.svg b/static/img/site/cisco-demo.svg new file mode 100644 index 0000000000..eb8c19016c --- /dev/null +++ b/static/img/site/cisco-demo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/img/site/code-box-3.png b/static/img/site/code-box-3.png index 70ffcdcce9..2a07a9d569 100644 Binary files a/static/img/site/code-box-3.png and b/static/img/site/code-box-3.png differ diff --git a/static/img/site/cohere_logo.svg b/static/img/site/cohere_logo.svg new file mode 100644 index 0000000000..64f26a5209 --- /dev/null +++ b/static/img/site/cohere_logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/img/site/collections-screenshot-01.png b/static/img/site/collections-screenshot-01.png index 8d68176902..756eebf923 100644 Binary files a/static/img/site/collections-screenshot-01.png and b/static/img/site/collections-screenshot-01.png differ diff --git a/static/img/site/composio_logo.png b/static/img/site/composio_logo.png new file mode 100644 index 0000000000..a10bbcbe83 Binary files /dev/null and b/static/img/site/composio_logo.png differ diff --git a/static/img/site/confluent-logo-partners.svg b/static/img/site/confluent-logo-partners.svg new file mode 100644 index 0000000000..6a42aec35b --- /dev/null +++ b/static/img/site/confluent-logo-partners.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/confluent_logo.svg b/static/img/site/confluent_logo.svg new file mode 100644 index 0000000000..081faccb8a --- /dev/null +++ b/static/img/site/confluent_logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/contextdata_logo.png b/static/img/site/contextdata_logo.png new file mode 100644 index 0000000000..0a6d685083 Binary files /dev/null and b/static/img/site/contextdata_logo.png differ diff --git a/static/img/site/databricks_logo.svg b/static/img/site/databricks_logo.svg new file mode 100644 index 0000000000..553c3e4124 --- /dev/null +++ b/static/img/site/databricks_logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/site/deepset_logo.svg b/static/img/site/deepset_logo.svg new file mode 100644 index 0000000000..47495f30db --- /dev/null +++ b/static/img/site/deepset_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/distance-metrics-blog.png b/static/img/site/distance-metrics-blog.png index 2c130989f1..247d716d83 100644 Binary files a/static/img/site/distance-metrics-blog.png and b/static/img/site/distance-metrics-blog.png differ diff --git a/static/img/site/dspy_logo.png b/static/img/site/dspy_logo.png new file mode 100644 index 0000000000..c68fd7b132 Binary files /dev/null and b/static/img/site/dspy_logo.png differ diff --git a/static/img/site/ebook-bg-00.png b/static/img/site/ebook-bg-00.png new file mode 100644 index 0000000000..8c83423f6f Binary files /dev/null and b/static/img/site/ebook-bg-00.png differ diff --git a/static/img/site/ebook-bg-small.png b/static/img/site/ebook-bg-small.png new file mode 100644 index 0000000000..78d402fe25 Binary files /dev/null and b/static/img/site/ebook-bg-small.png differ diff --git a/static/img/site/education-course-seb.png b/static/img/site/education-course-seb.png index b9351da5db..01096f3b27 100644 Binary files a/static/img/site/education-course-seb.png and b/static/img/site/education-course-seb.png differ diff --git a/static/img/site/education-course-zain.png b/static/img/site/education-course-zain.png index 457b026d17..8be005821e 100644 Binary files a/static/img/site/education-course-zain.png and b/static/img/site/education-course-zain.png differ diff --git a/static/img/site/embeddings-icon.svg b/static/img/site/embeddings-icon.svg new file mode 100644 index 0000000000..1b37b7d366 --- /dev/null +++ b/static/img/site/embeddings-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/img/site/embeddings-screenshot-01.png b/static/img/site/embeddings-screenshot-01.png new file mode 100644 index 0000000000..8514e28b37 Binary files /dev/null and b/static/img/site/embeddings-screenshot-01.png differ diff --git a/static/img/site/embeddings-screenshot-02.png b/static/img/site/embeddings-screenshot-02.png new file mode 100644 index 0000000000..3f7751d558 Binary files /dev/null and b/static/img/site/embeddings-screenshot-02.png differ diff --git a/static/img/site/enterprise-grid-01.png b/static/img/site/enterprise-grid-01.png index 8c7e176469..f16889c97a 100644 Binary files a/static/img/site/enterprise-grid-01.png and b/static/img/site/enterprise-grid-01.png differ diff --git a/static/img/site/enterprise-grid-02.png b/static/img/site/enterprise-grid-02.png index a658d480d5..63c5c4b25b 100644 Binary files a/static/img/site/enterprise-grid-02.png and b/static/img/site/enterprise-grid-02.png differ diff --git a/static/img/site/event-team-photo.png b/static/img/site/event-team-photo.png index d64f90f867..be432d2e58 100644 Binary files a/static/img/site/event-team-photo.png and b/static/img/site/event-team-photo.png differ diff --git a/static/img/site/events-connor.png b/static/img/site/events-connor.png index e7e93984bb..67cdb3ded4 100644 Binary files a/static/img/site/events-connor.png and b/static/img/site/events-connor.png differ diff --git a/static/img/site/explorer-screenshot-01.png b/static/img/site/explorer-screenshot-01.png index 9ffa09dd97..f4e55b8393 100644 Binary files a/static/img/site/explorer-screenshot-01.png and b/static/img/site/explorer-screenshot-01.png differ diff --git a/static/img/site/factset-demo.svg b/static/img/site/factset-demo.svg new file mode 100644 index 0000000000..36381e2c70 --- /dev/null +++ b/static/img/site/factset-demo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/img/site/firecrawl_logo.svg b/static/img/site/firecrawl_logo.svg new file mode 100644 index 0000000000..b6a813426d --- /dev/null +++ b/static/img/site/firecrawl_logo.svg @@ -0,0 +1,11 @@ + + 🔥 + + + + + + + \ No newline at end of file diff --git a/static/img/site/friendliai_logo.svg b/static/img/site/friendliai_logo.svg new file mode 100644 index 0000000000..70f1f43f33 --- /dev/null +++ b/static/img/site/friendliai_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/gcp-meeting-01.png b/static/img/site/gcp-meeting-01.png index 888048806c..06fec1d539 100644 Binary files a/static/img/site/gcp-meeting-01.png and b/static/img/site/gcp-meeting-01.png differ diff --git a/static/img/site/gcp-meeting-02.png b/static/img/site/gcp-meeting-02.png index 0aaa5df4be..68279c4d32 100644 Binary files a/static/img/site/gcp-meeting-02.png and b/static/img/site/gcp-meeting-02.png differ diff --git a/static/img/site/gcp_header.png b/static/img/site/gcp_header.png index 0df31f0681..e65c5a0487 100644 Binary files a/static/img/site/gcp_header.png and b/static/img/site/gcp_header.png differ diff --git a/static/img/site/giga-report.jpg b/static/img/site/giga-report.jpg new file mode 100644 index 0000000000..aa40e5944e Binary files /dev/null and b/static/img/site/giga-report.jpg differ diff --git a/static/img/site/gradient-bg-cs.png b/static/img/site/gradient-bg-cs.png new file mode 100644 index 0000000000..2fbcd5200b Binary files /dev/null and b/static/img/site/gradient-bg-cs.png differ diff --git a/static/img/site/grpc-head.png b/static/img/site/grpc-head.png index 19e5e2f0b8..2d8e0ff475 100644 Binary files a/static/img/site/grpc-head.png and b/static/img/site/grpc-head.png differ diff --git a/static/img/site/hack-night-event.png b/static/img/site/hack-night-event.png index e1fb330657..4917148ffa 100644 Binary files a/static/img/site/hack-night-event.png and b/static/img/site/hack-night-event.png differ diff --git a/static/img/site/health-search-blog.png b/static/img/site/health-search-blog.png index f2fd642ebb..c31ee6ccf9 100644 Binary files a/static/img/site/health-search-blog.png and b/static/img/site/health-search-blog.png differ diff --git a/static/img/site/hero-gen-01.png b/static/img/site/hero-gen-01.png index 0a5a68a13f..1221cf525e 100644 Binary files a/static/img/site/hero-gen-01.png and b/static/img/site/hero-gen-01.png differ diff --git a/static/img/site/hero-gen-02.png b/static/img/site/hero-gen-02.png index 802e8983de..f58939ce1b 100644 Binary files a/static/img/site/hero-gen-02.png and b/static/img/site/hero-gen-02.png differ diff --git a/static/img/site/hero-gen-03.png b/static/img/site/hero-gen-03.png index d1eb852138..03c8c081bf 100644 Binary files a/static/img/site/hero-gen-03.png and b/static/img/site/hero-gen-03.png differ diff --git a/static/img/site/hero-hybrid-search-01.png b/static/img/site/hero-hybrid-search-01.png index 028994a839..78d4db14f0 100644 Binary files a/static/img/site/hero-hybrid-search-01.png and b/static/img/site/hero-hybrid-search-01.png differ diff --git a/static/img/site/hero-hybrid-search-03.png b/static/img/site/hero-hybrid-search-03.png index 9916177a62..4680b898cb 100644 Binary files a/static/img/site/hero-hybrid-search-03.png and b/static/img/site/hero-hybrid-search-03.png differ diff --git a/static/img/site/hero-python-ga.png b/static/img/site/hero-python-ga.png index 26cca614e9..aea87520f2 100644 Binary files a/static/img/site/hero-python-ga.png and b/static/img/site/hero-python-ga.png differ diff --git a/static/img/site/hero-rag-01.png b/static/img/site/hero-rag-01.png index 9d527b9bb3..a39db45730 100644 Binary files a/static/img/site/hero-rag-01.png and b/static/img/site/hero-rag-01.png differ diff --git a/static/img/site/hero-rag-02.png b/static/img/site/hero-rag-02.png index cca4954afc..170d4404a5 100644 Binary files a/static/img/site/hero-rag-02.png and b/static/img/site/hero-rag-02.png differ diff --git a/static/img/site/hero-rag-03.png b/static/img/site/hero-rag-03.png index bbc491bd42..9404e8b6b3 100644 Binary files a/static/img/site/hero-rag-03.png and b/static/img/site/hero-rag-03.png differ diff --git a/static/img/site/hero-weaviate-hero.png b/static/img/site/hero-weaviate-hero.png index 6a2b9b56b5..463721cbf0 100644 Binary files a/static/img/site/hero-weaviate-hero.png and b/static/img/site/hero-weaviate-hero.png differ diff --git a/static/img/site/highlight-01.png b/static/img/site/highlight-01.png index b8b2124276..1a3773ed60 100644 Binary files a/static/img/site/highlight-01.png and b/static/img/site/highlight-01.png differ diff --git a/static/img/site/highlight-02.png b/static/img/site/highlight-02.png index 48a1e24b53..6f2ba98b7d 100644 Binary files a/static/img/site/highlight-02.png and b/static/img/site/highlight-02.png differ diff --git a/static/img/site/highlight-03.png b/static/img/site/highlight-03.png index 9104c823a4..90d11b786c 100644 Binary files a/static/img/site/highlight-03.png and b/static/img/site/highlight-03.png differ diff --git a/static/img/site/huggingface_logo.svg b/static/img/site/huggingface_logo.svg new file mode 100644 index 0000000000..ab959d165f --- /dev/null +++ b/static/img/site/huggingface_logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/site/humach-logo-cs.svg b/static/img/site/humach-logo-cs.svg new file mode 100644 index 0000000000..5df39b7fdd --- /dev/null +++ b/static/img/site/humach-logo-cs.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/hybrid-search-webinar-head.png b/static/img/site/hybrid-search-webinar-head.png index ceba45df2a..3a337e535b 100644 Binary files a/static/img/site/hybrid-search-webinar-head.png and b/static/img/site/hybrid-search-webinar-head.png differ diff --git a/static/img/site/instabase-bg-image.png b/static/img/site/instabase-bg-image.png new file mode 100644 index 0000000000..182f1cf55c Binary files /dev/null and b/static/img/site/instabase-bg-image.png differ diff --git a/static/img/site/instabase-cs.svg b/static/img/site/instabase-cs.svg new file mode 100644 index 0000000000..b4f5007cb0 --- /dev/null +++ b/static/img/site/instabase-cs.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/instabase-demo.svg b/static/img/site/instabase-demo.svg new file mode 100644 index 0000000000..6eb9d3e181 --- /dev/null +++ b/static/img/site/instabase-demo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/static/img/site/investors-diagram.png b/static/img/site/investors-diagram.png index 7b8ebe870a..ba0c4c7c81 100644 Binary files a/static/img/site/investors-diagram.png and b/static/img/site/investors-diagram.png differ diff --git a/static/img/site/js-diagram-header.png b/static/img/site/js-diagram-header.png new file mode 100644 index 0000000000..93e18d0e11 Binary files /dev/null and b/static/img/site/js-diagram-header.png differ diff --git a/static/img/site/js-gradient-bg.png b/static/img/site/js-gradient-bg.png new file mode 100644 index 0000000000..ed4d2344d8 Binary files /dev/null and b/static/img/site/js-gradient-bg.png differ diff --git a/static/img/site/js-whatsnext-01.svg b/static/img/site/js-whatsnext-01.svg new file mode 100644 index 0000000000..dd954d164c --- /dev/null +++ b/static/img/site/js-whatsnext-01.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/js-whatsnext-02.svg b/static/img/site/js-whatsnext-02.svg new file mode 100644 index 0000000000..e4b2fa002f --- /dev/null +++ b/static/img/site/js-whatsnext-02.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/site/js-whatsnext-03.svg b/static/img/site/js-whatsnext-03.svg new file mode 100644 index 0000000000..2b9bda5f20 --- /dev/null +++ b/static/img/site/js-whatsnext-03.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/site/js-whatsnext-04.svg b/static/img/site/js-whatsnext-04.svg new file mode 100644 index 0000000000..9b20830f6f --- /dev/null +++ b/static/img/site/js-whatsnext-04.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/site/kubeai_logo.png b/static/img/site/kubeai_logo.png new file mode 100644 index 0000000000..ba0b0058ba Binary files /dev/null and b/static/img/site/kubeai_logo.png differ diff --git a/static/img/site/kubeflow_logo.png b/static/img/site/kubeflow_logo.png new file mode 100644 index 0000000000..f29aa94be9 Binary files /dev/null and b/static/img/site/kubeflow_logo.png differ diff --git a/static/img/site/langchain_logo.png b/static/img/site/langchain_logo.png new file mode 100644 index 0000000000..6de50154a7 Binary files /dev/null and b/static/img/site/langchain_logo.png differ diff --git a/static/img/site/langtrace_logo.png b/static/img/site/langtrace_logo.png new file mode 100644 index 0000000000..32a08b8a33 Binary files /dev/null and b/static/img/site/langtrace_logo.png differ diff --git a/static/img/site/langwatch_logo.png b/static/img/site/langwatch_logo.png new file mode 100644 index 0000000000..cf979e7c24 Binary files /dev/null and b/static/img/site/langwatch_logo.png differ diff --git a/static/img/site/learn-academy-icon.svg b/static/img/site/learn-academy-icon.svg new file mode 100644 index 0000000000..18158d5e5d --- /dev/null +++ b/static/img/site/learn-academy-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/learn-blog-icon.svg b/static/img/site/learn-blog-icon.svg new file mode 100644 index 0000000000..24426d7c02 --- /dev/null +++ b/static/img/site/learn-blog-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/learn-courses-icon.svg b/static/img/site/learn-courses-icon.svg new file mode 100644 index 0000000000..6df4c57916 --- /dev/null +++ b/static/img/site/learn-courses-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/learn-cta-bg.png b/static/img/site/learn-cta-bg.png new file mode 100644 index 0000000000..11fdec2289 Binary files /dev/null and b/static/img/site/learn-cta-bg.png differ diff --git a/static/img/site/learn-docs-icon.svg b/static/img/site/learn-docs-icon.svg new file mode 100644 index 0000000000..8e050798e6 --- /dev/null +++ b/static/img/site/learn-docs-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/img/site/learn-forum-icon.svg b/static/img/site/learn-forum-icon.svg new file mode 100644 index 0000000000..5904cecf2a --- /dev/null +++ b/static/img/site/learn-forum-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/learn-howto-icon.svg b/static/img/site/learn-howto-icon.svg new file mode 100644 index 0000000000..a8565cc31c --- /dev/null +++ b/static/img/site/learn-howto-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/learn-intergrate-icon.svg b/static/img/site/learn-intergrate-icon.svg new file mode 100644 index 0000000000..789b94d18f --- /dev/null +++ b/static/img/site/learn-intergrate-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/img/site/learn-logo-icon.svg b/static/img/site/learn-logo-icon.svg new file mode 100644 index 0000000000..aa42c690e1 --- /dev/null +++ b/static/img/site/learn-logo-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/learn-paper-icon.svg b/static/img/site/learn-paper-icon.svg new file mode 100644 index 0000000000..2ceaa9f817 --- /dev/null +++ b/static/img/site/learn-paper-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/learn-play-icon.svg b/static/img/site/learn-play-icon.svg new file mode 100644 index 0000000000..18bdeb64e5 --- /dev/null +++ b/static/img/site/learn-play-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/site/learn-podcast-icon.svg b/static/img/site/learn-podcast-icon.svg new file mode 100644 index 0000000000..b368419ec3 --- /dev/null +++ b/static/img/site/learn-podcast-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/learn-quickstart-icon.svg b/static/img/site/learn-quickstart-icon.svg new file mode 100644 index 0000000000..ac78a96dbd --- /dev/null +++ b/static/img/site/learn-quickstart-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/learn-recipes-icon.svg b/static/img/site/learn-recipes-icon.svg new file mode 100644 index 0000000000..8db2b009d5 --- /dev/null +++ b/static/img/site/learn-recipes-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/img/site/learn-references-icon.svg b/static/img/site/learn-references-icon.svg new file mode 100644 index 0000000000..dcc16c7c4a --- /dev/null +++ b/static/img/site/learn-references-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/img/site/learn-starter-icon.svg b/static/img/site/learn-starter-icon.svg new file mode 100644 index 0000000000..f4291349cb --- /dev/null +++ b/static/img/site/learn-starter-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/learn-videos-icon.svg b/static/img/site/learn-videos-icon.svg new file mode 100644 index 0000000000..434ef37ee1 --- /dev/null +++ b/static/img/site/learn-videos-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/site/learn-workshop-icon.svg b/static/img/site/learn-workshop-icon.svg new file mode 100644 index 0000000000..08871c46ab --- /dev/null +++ b/static/img/site/learn-workshop-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/img/site/lightlogos/amd.svg b/static/img/site/lightlogos/amd.svg new file mode 100644 index 0000000000..3dca0aeda2 --- /dev/null +++ b/static/img/site/lightlogos/amd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/lightlogos/bunq.svg b/static/img/site/lightlogos/bunq.svg new file mode 100644 index 0000000000..b742ad0b16 --- /dev/null +++ b/static/img/site/lightlogos/bunq.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/site/lightlogos/cisco.svg b/static/img/site/lightlogos/cisco.svg new file mode 100644 index 0000000000..ff17c24494 --- /dev/null +++ b/static/img/site/lightlogos/cisco.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/lightlogos/factset.svg b/static/img/site/lightlogos/factset.svg new file mode 100644 index 0000000000..4a0fcc00a9 --- /dev/null +++ b/static/img/site/lightlogos/factset.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/site/lightlogos/instabase.svg b/static/img/site/lightlogos/instabase.svg new file mode 100644 index 0000000000..1b9b6fb667 --- /dev/null +++ b/static/img/site/lightlogos/instabase.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/img/site/lightlogos/morningstar.svg b/static/img/site/lightlogos/morningstar.svg new file mode 100644 index 0000000000..eaf87f80d3 --- /dev/null +++ b/static/img/site/lightlogos/morningstar.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/img/site/lightlogos/mutiny.svg b/static/img/site/lightlogos/mutiny.svg new file mode 100644 index 0000000000..ee5f333ce1 --- /dev/null +++ b/static/img/site/lightlogos/mutiny.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/site/lightlogos/netapp.svg b/static/img/site/lightlogos/netapp.svg new file mode 100644 index 0000000000..810ed5f2c3 --- /dev/null +++ b/static/img/site/lightlogos/netapp.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/site/lightlogos/rakuten.svg b/static/img/site/lightlogos/rakuten.svg new file mode 100644 index 0000000000..e3f27d8488 --- /dev/null +++ b/static/img/site/lightlogos/rakuten.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/site/lightlogos/redbull.svg b/static/img/site/lightlogos/redbull.svg new file mode 100644 index 0000000000..c56babbc72 --- /dev/null +++ b/static/img/site/lightlogos/redbull.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/site/lightlogos/redhat.svg b/static/img/site/lightlogos/redhat.svg new file mode 100644 index 0000000000..76a4766d80 --- /dev/null +++ b/static/img/site/lightlogos/redhat.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/site/lightlogos/shippo.svg b/static/img/site/lightlogos/shippo.svg new file mode 100644 index 0000000000..c35c8c0947 --- /dev/null +++ b/static/img/site/lightlogos/shippo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/site/lightlogos/stack.svg b/static/img/site/lightlogos/stack.svg new file mode 100644 index 0000000000..191f46d668 --- /dev/null +++ b/static/img/site/lightlogos/stack.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/img/site/lightlogos/stackoverflow.svg b/static/img/site/lightlogos/stackoverflow.svg new file mode 100644 index 0000000000..8d5c2b921f --- /dev/null +++ b/static/img/site/lightlogos/stackoverflow.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/lightlogos/writesonic.svg b/static/img/site/lightlogos/writesonic.svg new file mode 100644 index 0000000000..b6b4af2b17 --- /dev/null +++ b/static/img/site/lightlogos/writesonic.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/llamaindex_logo.svg b/static/img/site/llamaindex_logo.svg new file mode 100644 index 0000000000..b0ab155b79 --- /dev/null +++ b/static/img/site/llamaindex_logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/logo-go.svg b/static/img/site/logo-go.svg new file mode 100644 index 0000000000..64e9620777 --- /dev/null +++ b/static/img/site/logo-go.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/logo-java.svg b/static/img/site/logo-java.svg new file mode 100644 index 0000000000..1af6b37c07 --- /dev/null +++ b/static/img/site/logo-java.svg @@ -0,0 +1,78 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/logo-py.svg b/static/img/site/logo-py.svg new file mode 100644 index 0000000000..467b07b265 --- /dev/null +++ b/static/img/site/logo-py.svg @@ -0,0 +1,265 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/logo-ts.svg b/static/img/site/logo-ts.svg new file mode 100644 index 0000000000..a46d53d49f --- /dev/null +++ b/static/img/site/logo-ts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/make-realtime-hero.png b/static/img/site/make-realtime-hero.png index 2b3ac27688..3b6f13dab5 100644 Binary files a/static/img/site/make-realtime-hero.png and b/static/img/site/make-realtime-hero.png differ diff --git a/static/img/site/mistralai_logo.png b/static/img/site/mistralai_logo.png new file mode 100644 index 0000000000..997957ed64 Binary files /dev/null and b/static/img/site/mistralai_logo.png differ diff --git a/static/img/site/modal_logo.svg b/static/img/site/modal_logo.svg new file mode 100644 index 0000000000..4618ce46a3 --- /dev/null +++ b/static/img/site/modal_logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/moonsift-background-image.png b/static/img/site/moonsift-background-image.png new file mode 100644 index 0000000000..258310a986 Binary files /dev/null and b/static/img/site/moonsift-background-image.png differ diff --git a/static/img/site/moonsift-cs.svg b/static/img/site/moonsift-cs.svg new file mode 100644 index 0000000000..60ca1dd888 --- /dev/null +++ b/static/img/site/moonsift-cs.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/morningstar-avatar.png b/static/img/site/morningstar-avatar.png index a9e7b54329..ce5f26e5c0 100644 Binary files a/static/img/site/morningstar-avatar.png and b/static/img/site/morningstar-avatar.png differ diff --git a/static/img/site/morningstar-demo.svg b/static/img/site/morningstar-demo.svg new file mode 100644 index 0000000000..72cbd61082 --- /dev/null +++ b/static/img/site/morningstar-demo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/img/site/morningstar-header-image.png b/static/img/site/morningstar-header-image.png new file mode 100644 index 0000000000..ce5f26e5c0 Binary files /dev/null and b/static/img/site/morningstar-header-image.png differ diff --git a/static/img/site/morningstar-results-01.png b/static/img/site/morningstar-results-01.png index 54a0ad38fa..ed305626be 100644 Binary files a/static/img/site/morningstar-results-01.png and b/static/img/site/morningstar-results-01.png differ diff --git a/static/img/site/multi-node-set-up.png b/static/img/site/multi-node-set-up.png index a45dc9b401..506bba38e1 100644 Binary files a/static/img/site/multi-node-set-up.png and b/static/img/site/multi-node-set-up.png differ diff --git a/static/img/site/multimodal-event.png b/static/img/site/multimodal-event.png index 3ae2a7a03b..dd77b3c089 100644 Binary files a/static/img/site/multimodal-event.png and b/static/img/site/multimodal-event.png differ diff --git a/static/img/site/ndc-london-highlight.png b/static/img/site/ndc-london-highlight.png index bd39569a82..835b91caeb 100644 Binary files a/static/img/site/ndc-london-highlight.png and b/static/img/site/ndc-london-highlight.png differ diff --git a/static/img/site/neople-background-image-alpha.png b/static/img/site/neople-background-image-alpha.png new file mode 100644 index 0000000000..0a35468a46 Binary files /dev/null and b/static/img/site/neople-background-image-alpha.png differ diff --git a/static/img/site/neople-background-image.png b/static/img/site/neople-background-image.png new file mode 100644 index 0000000000..7927573b99 Binary files /dev/null and b/static/img/site/neople-background-image.png differ diff --git a/static/img/site/neople-cs.svg b/static/img/site/neople-cs.svg new file mode 100644 index 0000000000..964d72c37e --- /dev/null +++ b/static/img/site/neople-cs.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/nomic_logo.svg b/static/img/site/nomic_logo.svg new file mode 100644 index 0000000000..26e624a88b --- /dev/null +++ b/static/img/site/nomic_logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/octoai_logo.png b/static/img/site/octoai_logo.png new file mode 100644 index 0000000000..d7967d6213 Binary files /dev/null and b/static/img/site/octoai_logo.png differ diff --git a/static/img/site/ollama_logo.png b/static/img/site/ollama_logo.png new file mode 100644 index 0000000000..8cd2cf1ed8 Binary files /dev/null and b/static/img/site/ollama_logo.png differ diff --git a/static/img/site/openai_logo.svg b/static/img/site/openai_logo.svg new file mode 100644 index 0000000000..859d7af321 --- /dev/null +++ b/static/img/site/openai_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/partners_header.png b/static/img/site/partners_header.png index 8efac27017..4b8b719cb4 100644 Binary files a/static/img/site/partners_header.png and b/static/img/site/partners_header.png differ diff --git a/static/img/site/platform-02.png b/static/img/site/platform-02.png index c7ade563e4..d09ec32492 100644 Binary files a/static/img/site/platform-02.png and b/static/img/site/platform-02.png differ diff --git a/static/img/site/platform-03.png b/static/img/site/platform-03.png index 4376d1a509..046b929f9a 100644 Binary files a/static/img/site/platform-03.png and b/static/img/site/platform-03.png differ diff --git a/static/img/site/platform-04.png b/static/img/site/platform-04.png index b06c63e9e4..e89c01a0f5 100644 Binary files a/static/img/site/platform-04.png and b/static/img/site/platform-04.png differ diff --git a/static/img/site/playbook-code-image.png b/static/img/site/playbook-code-image.png index ea977ebc1f..965f7085ad 100644 Binary files a/static/img/site/playbook-code-image.png and b/static/img/site/playbook-code-image.png differ diff --git a/static/img/site/preverity-logo-cs.svg b/static/img/site/preverity-logo-cs.svg new file mode 100644 index 0000000000..d3b3945a5d --- /dev/null +++ b/static/img/site/preverity-logo-cs.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/site/query-screenshot-01.png b/static/img/site/query-screenshot-01.png index c1b0df362e..95522b0033 100644 Binary files a/static/img/site/query-screenshot-01.png and b/static/img/site/query-screenshot-01.png differ diff --git a/static/img/site/quote-image-demo.png b/static/img/site/quote-image-demo.png new file mode 100644 index 0000000000..d3a956f220 Binary files /dev/null and b/static/img/site/quote-image-demo.png differ diff --git a/static/img/site/rag-evaluation.png b/static/img/site/rag-evaluation.png index bbc491bd42..4b1019f72a 100644 Binary files a/static/img/site/rag-evaluation.png and b/static/img/site/rag-evaluation.png differ diff --git a/static/img/site/ragas_logo.png b/static/img/site/ragas_logo.png new file mode 100644 index 0000000000..a107f39672 Binary files /dev/null and b/static/img/site/ragas_logo.png differ diff --git a/static/img/site/rakuten-demo.svg b/static/img/site/rakuten-demo.svg new file mode 100644 index 0000000000..8c46bdd571 --- /dev/null +++ b/static/img/site/rakuten-demo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/site/recipes-js-bg.png b/static/img/site/recipes-js-bg.png new file mode 100644 index 0000000000..46fa062d5a Binary files /dev/null and b/static/img/site/recipes-js-bg.png differ diff --git a/static/img/site/remote-grid-01.png b/static/img/site/remote-grid-01.png index ed41aad901..0997e58adb 100644 Binary files a/static/img/site/remote-grid-01.png and b/static/img/site/remote-grid-01.png differ diff --git a/static/img/site/remote-grid-02-01.png b/static/img/site/remote-grid-02-01.png index 9639b4406d..da5844691f 100644 Binary files a/static/img/site/remote-grid-02-01.png and b/static/img/site/remote-grid-02-01.png differ diff --git a/static/img/site/remote-grid-06.png b/static/img/site/remote-grid-06.png index 7d099c0520..703c608ddb 100644 Binary files a/static/img/site/remote-grid-06.png and b/static/img/site/remote-grid-06.png differ diff --git a/static/img/site/remote-map.png b/static/img/site/remote-map.png index 05c85df858..c849afbc3e 100644 Binary files a/static/img/site/remote-map.png and b/static/img/site/remote-map.png differ diff --git a/static/img/site/replicate_logo.jpeg b/static/img/site/replicate_logo.jpeg new file mode 100644 index 0000000000..9033339f80 Binary files /dev/null and b/static/img/site/replicate_logo.jpeg differ diff --git a/static/img/site/reranker-head.png b/static/img/site/reranker-head.png index 57a3c93ec1..645d6777f9 100644 Binary files a/static/img/site/reranker-head.png and b/static/img/site/reranker-head.png differ diff --git a/static/img/site/resource-image-01.png b/static/img/site/resource-image-01.png index a0a14adfe5..8f896ec3fd 100644 Binary files a/static/img/site/resource-image-01.png and b/static/img/site/resource-image-01.png differ diff --git a/static/img/site/screenshot-healthsearch.png b/static/img/site/screenshot-healthsearch.png index a0743e23d7..eae7e46804 100644 Binary files a/static/img/site/screenshot-healthsearch.png and b/static/img/site/screenshot-healthsearch.png differ diff --git a/static/img/site/screenshot-verba.png b/static/img/site/screenshot-verba.png index 17b02d5c6c..703f353090 100644 Binary files a/static/img/site/screenshot-verba.png and b/static/img/site/screenshot-verba.png differ diff --git a/static/img/site/screenshot-wealingo.png b/static/img/site/screenshot-wealingo.png new file mode 100644 index 0000000000..7ceaa5990f Binary files /dev/null and b/static/img/site/screenshot-wealingo.png differ diff --git a/static/img/site/secure-slide-01.png b/static/img/site/secure-slide-01.png index b9368d1e0d..d8c0c17769 100644 Binary files a/static/img/site/secure-slide-01.png and b/static/img/site/secure-slide-01.png differ diff --git a/static/img/site/secure-slide-02.png b/static/img/site/secure-slide-02.png index 5488b55ea8..73975bf531 100644 Binary files a/static/img/site/secure-slide-02.png and b/static/img/site/secure-slide-02.png differ diff --git a/static/img/site/secure-slide-03.png b/static/img/site/secure-slide-03.png index bafc625fd7..5b1b3d5ddd 100644 Binary files a/static/img/site/secure-slide-03.png and b/static/img/site/secure-slide-03.png differ diff --git a/static/img/site/secure-slide-04.png b/static/img/site/secure-slide-04.png index a03de761c4..35525dfe38 100644 Binary files a/static/img/site/secure-slide-04.png and b/static/img/site/secure-slide-04.png differ diff --git a/static/img/site/secure-slide-cloud.png b/static/img/site/secure-slide-cloud.png index 7562f67e51..f62116483b 100644 Binary files a/static/img/site/secure-slide-cloud.png and b/static/img/site/secure-slide-cloud.png differ diff --git a/static/img/site/secure-slide-community.png b/static/img/site/secure-slide-community.png index 515485a3d0..5c7e8aa282 100644 Binary files a/static/img/site/secure-slide-community.png and b/static/img/site/secure-slide-community.png differ diff --git a/static/img/site/secure-slide-tiers.png b/static/img/site/secure-slide-tiers.png index c84958d205..67f4106273 100644 Binary files a/static/img/site/secure-slide-tiers.png and b/static/img/site/secure-slide-tiers.png differ diff --git a/static/img/site/service-grid-01.png b/static/img/site/service-grid-01.png index ed9364acde..1ee2111d88 100644 Binary files a/static/img/site/service-grid-01.png and b/static/img/site/service-grid-01.png differ diff --git a/static/img/site/service-grid-02.png b/static/img/site/service-grid-02.png index 531b0744e5..a5179e2476 100644 Binary files a/static/img/site/service-grid-02.png and b/static/img/site/service-grid-02.png differ diff --git a/static/img/site/service-grid-03.png b/static/img/site/service-grid-03.png index 24cda4ee92..2a3fe2ce09 100644 Binary files a/static/img/site/service-grid-03.png and b/static/img/site/service-grid-03.png differ diff --git a/static/img/site/services-team-photo.png b/static/img/site/services-team-photo.png index 344a13fd32..623861d751 100644 Binary files a/static/img/site/services-team-photo.png and b/static/img/site/services-team-photo.png differ diff --git a/static/img/site/sf-diagram.png b/static/img/site/sf-diagram.png index 0d9b7e3c5c..d064938bbb 100644 Binary files a/static/img/site/sf-diagram.png and b/static/img/site/sf-diagram.png differ diff --git a/static/img/site/sf-meetup-highlight.png b/static/img/site/sf-meetup-highlight.png index 566106b083..be5169aa5f 100644 Binary files a/static/img/site/sf-meetup-highlight.png and b/static/img/site/sf-meetup-highlight.png differ diff --git a/static/img/site/shape-future-hero.png b/static/img/site/shape-future-hero.png index b3cc201320..d7b47912e1 100644 Binary files a/static/img/site/shape-future-hero.png and b/static/img/site/shape-future-hero.png differ diff --git a/static/img/site/shippo-demo.svg b/static/img/site/shippo-demo.svg new file mode 100644 index 0000000000..1dbdcbee7b --- /dev/null +++ b/static/img/site/shippo-demo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/site/shopping-copilot.png b/static/img/site/shopping-copilot.png index 9916177a62..4680b898cb 100644 Binary files a/static/img/site/shopping-copilot.png and b/static/img/site/shopping-copilot.png differ diff --git a/static/img/site/sk_logo.png b/static/img/site/sk_logo.png new file mode 100644 index 0000000000..266df854cf Binary files /dev/null and b/static/img/site/sk_logo.png differ diff --git a/static/img/site/snowflake-blog-resource-02.png b/static/img/site/snowflake-blog-resource-02.png index bdc92c4d18..7a645dcb93 100644 Binary files a/static/img/site/snowflake-blog-resource-02.png and b/static/img/site/snowflake-blog-resource-02.png differ diff --git a/static/img/site/snowflake-blog-resource-2.png b/static/img/site/snowflake-blog-resource-2.png index 80c4641849..b4d6bc72c0 100644 Binary files a/static/img/site/snowflake-blog-resource-2.png and b/static/img/site/snowflake-blog-resource-2.png differ diff --git a/static/img/site/snowflake-blog-resource-3.png b/static/img/site/snowflake-blog-resource-3.png index e1201a7b7c..1b7d851426 100644 Binary files a/static/img/site/snowflake-blog-resource-3.png and b/static/img/site/snowflake-blog-resource-3.png differ diff --git a/static/img/site/sonar-chart.svg b/static/img/site/sonar-chart.svg new file mode 100644 index 0000000000..1ba78e7712 --- /dev/null +++ b/static/img/site/sonar-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/site/stack-demo.svg b/static/img/site/stack-demo.svg new file mode 100644 index 0000000000..8252199cce --- /dev/null +++ b/static/img/site/stack-demo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/img/site/storage-tiers.png b/static/img/site/storage-tiers.png index 981e9ca368..af1b4b42fa 100644 Binary files a/static/img/site/storage-tiers.png and b/static/img/site/storage-tiers.png differ diff --git a/static/img/site/support-grid-01.png b/static/img/site/support-grid-01.png index fc7b55a90d..346bd1f013 100644 Binary files a/static/img/site/support-grid-01.png and b/static/img/site/support-grid-01.png differ diff --git a/static/img/site/support-grid-02.png b/static/img/site/support-grid-02.png index e1d9a89548..ee81c5f9f6 100644 Binary files a/static/img/site/support-grid-02.png and b/static/img/site/support-grid-02.png differ diff --git a/static/img/site/support-grid-03.png b/static/img/site/support-grid-03.png index f96979a83e..54969ca3d6 100644 Binary files a/static/img/site/support-grid-03.png and b/static/img/site/support-grid-03.png differ diff --git a/static/img/site/support-grid-04.png b/static/img/site/support-grid-04.png index fa1790363f..ad455cf726 100644 Binary files a/static/img/site/support-grid-04.png and b/static/img/site/support-grid-04.png differ diff --git a/static/img/site/support-grid-05.png b/static/img/site/support-grid-05.png index 9b616a9210..bb047ccf7f 100644 Binary files a/static/img/site/support-grid-05.png and b/static/img/site/support-grid-05.png differ diff --git a/static/img/site/team-grid-01.png b/static/img/site/team-grid-01.png index f322bde830..39d812444c 100644 Binary files a/static/img/site/team-grid-01.png and b/static/img/site/team-grid-01.png differ diff --git a/static/img/site/team-grid-02.png b/static/img/site/team-grid-02.png index 06c9136a97..3cd9dedf5c 100644 Binary files a/static/img/site/team-grid-02.png and b/static/img/site/team-grid-02.png differ diff --git a/static/img/site/team-grid-05.png b/static/img/site/team-grid-05.png index 1d72789768..da3153e7ab 100644 Binary files a/static/img/site/team-grid-05.png and b/static/img/site/team-grid-05.png differ diff --git a/static/img/site/unbody-box-js.png b/static/img/site/unbody-box-js.png new file mode 100644 index 0000000000..61edda613f Binary files /dev/null and b/static/img/site/unbody-box-js.png differ diff --git a/static/img/site/unbody-header-image.png b/static/img/site/unbody-header-image.png new file mode 100644 index 0000000000..33aa2ee620 Binary files /dev/null and b/static/img/site/unbody-header-image.png differ diff --git a/static/img/site/unbody-logo-js.png b/static/img/site/unbody-logo-js.png new file mode 100644 index 0000000000..4b31437afb Binary files /dev/null and b/static/img/site/unbody-logo-js.png differ diff --git a/static/img/site/unbody-logo.svg b/static/img/site/unbody-logo.svg new file mode 100644 index 0000000000..d4c88e0fb4 --- /dev/null +++ b/static/img/site/unbody-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/img/site/unstructuredio_logo.png b/static/img/site/unstructuredio_logo.png new file mode 100644 index 0000000000..a6ec855b65 Binary files /dev/null and b/static/img/site/unstructuredio_logo.png differ diff --git a/static/img/site/vector-databases-blog.png b/static/img/site/vector-databases-blog.png index ba418f564f..2b699b88c7 100644 Binary files a/static/img/site/vector-databases-blog.png and b/static/img/site/vector-databases-blog.png differ diff --git a/static/img/site/vision-circle.png b/static/img/site/vision-circle.png index 28e00921d9..f688fc3dba 100644 Binary files a/static/img/site/vision-circle.png and b/static/img/site/vision-circle.png differ diff --git a/static/img/site/voyageai_logo.svg b/static/img/site/voyageai_logo.svg new file mode 100644 index 0000000000..e88c07532d --- /dev/null +++ b/static/img/site/voyageai_logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/site/wandb_logo.png b/static/img/site/wandb_logo.png new file mode 100644 index 0000000000..4569ead9f7 Binary files /dev/null and b/static/img/site/wandb_logo.png differ diff --git a/static/img/site/wandb_logo2.png b/static/img/site/wandb_logo2.png new file mode 100644 index 0000000000..1f12532d10 Binary files /dev/null and b/static/img/site/wandb_logo2.png differ diff --git a/static/img/site/weaviate-embedding-image.svg b/static/img/site/weaviate-embedding-image.svg new file mode 100644 index 0000000000..d573136672 --- /dev/null +++ b/static/img/site/weaviate-embedding-image.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/weaviate-hacktoberfest.png b/static/img/site/weaviate-hacktoberfest.png index 0d37229442..e8f224b00a 100644 Binary files a/static/img/site/weaviate-hacktoberfest.png and b/static/img/site/weaviate-hacktoberfest.png differ diff --git a/static/img/site/weaviate-home-diagram-light.png b/static/img/site/weaviate-home-diagram-light.png index 457771ce7d..df3014f9c8 100644 Binary files a/static/img/site/weaviate-home-diagram-light.png and b/static/img/site/weaviate-home-diagram-light.png differ diff --git a/static/img/site/weaviate-logo-horizontal-dark-1.svg b/static/img/site/weaviate-logo-horizontal-dark-1.svg new file mode 100644 index 0000000000..3d04b312a2 --- /dev/null +++ b/static/img/site/weaviate-logo-horizontal-dark-1.svg @@ -0,0 +1,859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +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 +57iw2N8kaCBCAcMAgowHGx0V/Y0GhQMNGQ82FDFEDJDoi5cXkAIFFCOBJlThs+DF4pOfTAMEnRVy +GYnBAMUB03DxsIIvLBcnKCDDyCZdMEBAOjwYKB4IFMVlIiITk0mZZBtaMskhkyIeFmwcMunDxEGF +w4AEBTQOIyOfBhQJ3gDHgYKFJRxI4UhrEOLITAqxwNFiMAImbC6K0JGgo6GAVzgFIRA2GfMAAT8h +IQUGYAiAyJBJmZQySUNikUkRB1ZkksWBFY4Dh1rgASpU8AptHAwM2LA+C/BjAQPEgHUeYEQwYBJ4 +hcukDBkuQmfBMdFxHimeBJ0FoAotGB2UjUzyTIgyKZMahLLhpRMrPYH+/tTfzFLEp7xyt3nZGqbo +3O9z9Wy9159x2W/ZXF8TaPsTM9nWJd330BLzuc+W2qnO6L12v+R8W52Jnup7rphfGZ/z/hefOUfd +Y2ffLebdrVOVqhyViv+cjuyJi5mjVBEZ1/q7H5n7d+k3p7u/rfrvMzay/qm9XN+gcxd11tzGl4sf +3/T6eLOXt1q75UVsRVzHlxHKUO6mr3qHtti/FTZb3zryL1Q7zi1uv+0yrmdvjmLf/Obtz+V/l1xG +VKf7bfJuL757RL7W1LW+ve2+fuuOo477DFdXNkfpqbaanxna8uSo1P7NZDP7Xvu3aWyK2Wa/aqe5 +zjnKFB87HiueqWvSAeiR2diVa/Z7+z07tvOumV0C2epXqex25s/nfHjIumzd//LM7pPz8lr7zHJ9 +tat9az07M04gW9qrvK/Iv4idj9cZuc/IqIr9tjaUoY6bMZ27eemaK9/37rNt9oX8zVHumlxGzs7X +ve8pXTxHdzUz93XNUaqduTo5Cp+jrD9xE9UZFdFar5N3aUe/aMp7mta6Gk8dW3q7OePZylfsvbt8 +Zu+r7xLoL9MZDZe78tQ7PbPVZazMzezazs2Z3fZ/dtb4uVq1t+3MsJe7wn3rPH5G7sVMRzyz9nWf +IkRGNl37uiodTW3zzNQXf/Ne4psZ+ur//m7OO7NMNb50M8tdio7KuGbmqhczG/0ZG9c1r7+69rK8 +FDH73XGvM+qtbbX1eimky7Z16Sq8fsz+/++Ve4p7j120NZQlmI/SSw9GlGZCsWFSyTjpcBBycvIf +n5MVFQwTXF4wUGjw8Ykm1EkmCUCAl5gUBBkZyhKFFMpQ6fxovqmsvt6Md6qGuE4zlL397bO/f/Ur +ZNZ1uzNW//WcFMpQqMirx+252L05Kn+v/zvTd/k6Zr5mIrYvxG/FyNmd6Z2rzTnJZURlv1u+H6vr +4lSJmZuIamv46W299tSltd26at7SPbXJ6vf4j99t9o5nZsfrjpNYMtSpbT/8v1+Zivd9q9yv77dO +sZunKSP7+dpXpvLsFk/Nr11tGUddUslIoP7edX9K/dQUnZET39rQ/9V1GYLUpkhtpuf3OaP5OlfL +y15zxkS9/Xz/51z8p/LN/g2d0Zfvz77/tdf+pZBCd1fk9Nulf6or/6zve9ldzxmR17N6vwRS6bqM +3s1K97tR//91cV+K1DW37a0z+ulivrz8XFYz61zGpzL78LedEbMPjc/MehfuJRDqO+M26yUHbKb/ +a/XU9Rk6qzVaGjdz/r+D1L+e8/czai5etep7bP+fvlYvRbwsHxNv1RnvWjUqcub/7y+/SyCF6atZ +Hdrh2//fLr379G7sz3+Vyqs4sU8P/z9x/au1W7xK/51V8f/51j+/rf8UqUPcNtzG/9dc/ir9uzf7 +GRPXrbq9/0de+Gr31HTVGfGXrXI3ezv+f/SlnkDqLj+V7Rm7l666xV7L/+9e3gn0t45V8h8j3v8/ +L+cUKd1tz7Rn/F3PSs81P3ftKuV2PHdn1F/WqStXtbKbmT7j9sJWrH56yv+/vW4TKEXuS1v1Wrq7 +/r/xslXamev2i1spXvf1/6+uV/WY6xuk+PjMG5/Re52nSPnq77KtvkxW9nvG12V46s2fD5+xeSWe +av49Rv5/5mWbQApv7TOf8f0f0bU3Reoyv3mfUXEZ51/z//utb3Wpm8+Y6HfXrStdfb+z7TMmr1dj +S31G56V5IOXrr634jNbP68s9Reo++V6fUR0xU3+xnUptxt1nXE3W9jWz38WXZs/It/JOcTuio5np +LsdLIOXO+5zP2LvaTn1vqqmZMS5PdNTFe8a81Z8ixY2uns/IvHQP71if8Xh9nsJPxncz+1y8pzSf +8XoZvnmeWfc6vgRSzXuI+4yIy/RUZ+5bmxnbYr7koli1tfkZO9fiqdbztHV/GuoSzEdlbkgrH2Up +ACPK0kdZOskkkZiXz4kpDcyJ0vgQidn4KEsXQEoDo5IKSJmyVcrx1PdNuLCRyaQJFzZO7pJnAJ9M +yqTOJApeHiuiYAJoaGdlgJWnm0BqUb3Z7Lpt3RkZdVUfXuqmCC91EW9ZN4UaT912k8ut2820gYJC +AoHeFmIfeq5DfcZTTf+79xS6ZeteXnunf+e29hcPL/FOdft3rVHx9+7OFKScfd3Pt/XTVf9XF/r3 +/SsuPEdf9el7rr5rrPv/xvbLnH13tW8Kve/1MnfXNv/9zl9f3u+9KcRr07H1H3fpZzsu/U0Rtq/8 +vV6O1Jr1/Vrb37LfFHrfXl911unXvti2srk3Rb3fb89sptmtri1xDbE3RebXi+sOUr686k5585BX +7443hXoN73hT5P1nn468h5eMmby5nm2b/5hLMR//eHkTSDViipbT+Nz9kD2texW3arfnXX/2ujbF +XtPs1d4U6lV7uLpXqfemSL2p5rUzrp72/936XtN2/f3vX9+L+bas1mu+KdLlab6KrfO+V+f5Mjtn +4qOzb4IQzzdF9qsQ8e7XRSHer4pQJAoJBNqVa9fqbrlpZ38r9a3RGfV31dXfzn/Z3T3rdZrl5jHi +mq1ubvLjyuQUsmTTlXfIeLd4d4is2JAVut3lcmbjW/O797RLoBSZsp2d80I1NcVFQ3dG33V2uuii +NpWThjIKCQTitXnq3KnWiLf0X5mf3dHS7H+xcgJxrnw97lZv93+ztcfqL1uvzRpZl/see68uWqPu +Yu9jdT9Gd0dT1E5kc+XY+4pqpr8W2ZFT6JINk/WW+XFkvslq3XJ1si9zPk9WX+eHvrdQWXXnqyJ6 +HrZ6o9ne43GnGet6Z6tZW7paPtXrNXNbqpyu+FWV1c00UftXnqorVkV3V3V16Hz33copckTfPTdL +XK5stoau9nSbuV85RbcQrc/Vqbm6XkvOZa7SzrIxzfKXLX/bfwp5Nz+iWd+65VaHqWumyymyvb5N +V+5d2YhLT69P+XxZ3/JkTU6hX5assK0ZWal5Ktqta6WLyCnCXdh/rDT70PN4L63Rfm3npdtinjVi +Lv9lx77MFT8nH+7/8nLjXunMavjfz65YX595rbHyW/bqEbFf/1mXGmcKqe1nbOtU/l9fafyLe9v5 +f7bWbpcdnvNqY703Vo2oys+ouvoO77MXH+Mv87n5GaLfvy1yClm6rdRkhXidnCKV6/DU9RrruSmr +M7xUVubPq5wixa2scO9eWeGd+u3u5f7fiJfd4XJ6LrdTuHLZf20K2eH9+tfux+Xksm/rltGWqXf+ +VDt011RdpnBTd/f3VPlyHWbaQCEyYUSZyLdZ56Xj5doyVpmviKgrQ+8OVf3YfPn79zA//f1+D1fz +t2LXPdO1XVv8fmdniexptsyGd73QnLPn2b+P+7r8lbfqcrZ6aq58hetqfNh82bhU9bmru69TjtpD +zn39M2tNX9bk3Xvd7DvrVONW9LXv6ovIqvr8x4fd7Y2GuOprzM2oyo2+3ovO/2iXm0Aq1ZuxO82z +e3ft3mKrfTP6ud+z4nFbamvGW/fa6v9Wn8nO6mb7z1HrZ6cQFV2f9/1Z/dchR52nHq+27/VaI67a +mT07Jz6uNd4vW3VbR2v8BFLHu29q1pj+KVL5i4aLi9c/L481rTGzbfmt3U+R2mW+NrVG/aWra593 +6drCV27HpojWeLx604/vbP+T/bltMSt3c9PLs9y1n9Hv39q/LjkqrzVRM83PfyVnM7cXq7lCez/b +N871fmeqrMlnvVzXU/fs1df7v7+yomPfWqpta/7drv9T7fuNfPyIuGuVnrVaYuJqLkM0T8z/vj1b +ZU9eymk8PXvlx1un9I0V0Vz9bbW+pfG3/p/7dfPun+qZ+RomWv6Z3Sbz9Xq/P7ZFPjNOLvrM7P24 +2uZKtTn3zWxxmZlz1HufQsQzTY7K3ms289y2hchRx6AU6epZrl3lrZdAuHi/tVub8UCM65j7Ekj7 ++PW8/85Mcy+56Osta1t+xqK2d+NaN++yNVePm7y63r45St1d35rtVT53svdKU0P+X5BSRk771olD +wUYmk8mkFZaUDAHAUAFGrbxgiIFZeWFRKywpGVZiUmIwXLiQolYAkALDkl5WLAiQ8tKAwwF9EtE7 +zM1rxb58jNfo/aiQ+/DxGtn/DM8f1W2/nV9j/3JUrfbufH3/fMm512j++NjpeZ0Ls1F5Lv/iq2fu +eWPuetvttqKfszWer+tzRLO9ZEfrb/xGb0yhbuTexhS1NrY2qse/9ldrdE1RNirNxsbvld23Sxsb +E0j52t31nnXbYooWlfO6fsV7xfZlrqiuuxVTaBVV76+6Xaui+ttH/lZMkeW5m3orqtxsRe91fdbY +mCJsPTRt/m1FtZat1Fq1Fbox8j2m//PtKd9hg1SK/A7RFDGFGPEU1yKm6BZRIabIVyM+omJ8v8S+ +c0fMxPvTxAR6X/X740V1i7142Iu+mCJU/+5eVPeLjCl0jAoZNxlTpIxqaxmXMUXKcBkVMqM3MyZQ +N6bo3FHhOypFRHtElXi88jG5PIIyM1Fz8zMzM1MoszETM/3SMjMz2dz2M8020yU1QSlSnKpbdd+t +sV8TD5vR93AzN//XppBq9F9HbWvEX/+52Y+bKXrNVNRW6/9N1Uy9zL7MTMzFdMwUytTM7MxM0zxN +zEzOzFzN1WTN1HTN19S0zUxRZmZmZqpmZiZj5l9eZmaK1lIlf2amWlqqzMvMzM7MzOTSmqD0fzT9 +z/7cz7RP91RP9PxORsNOZ/9E8//DlZ1rdtvZnZ7r6Zn5mf35n2ZqiqYgxdM8dTs9Nbs3TSFdbqp2 +f5ZsumpqnKymittuiqb7n/+Lpmy+6Lv/lwtNj9eZmql/or7tp+LOtH7Hf8SVn7fsM4VOd+8/LRf/ +8xP1P23XdXJ2O2f3nSJnL+S09ZWcl++4jMvZnK+X65n/m+s52RH/87UbtbM77/TSPDOFsj09/Tj1 +n32956d+OqY59+cv/zRVZWysaOrHptab2/+ZK03T9JX3HvtfeaWpmq6paQq56Zu2m/K2/6etO1XQ +4bUq/lBfn9/6KVrrdbZqX0ZmNPNdVX+rKbpWhfiqrppC/832aNbJqupVU8Rv7Hyq2qiaHKTi/3zb +SzMGqbU+1T1E1fO7v/tbiIqoqClCXNTTPsRER02RSnxES71LTaA/TE0gpeqtmiJ/dkZWhch6yZoi +xZq8ljWbNbkoxHvWSzRPbn38xk+htrWZl5+X39vImIevlmp5b699j5mPp5aHl6fJ/n++59v7zqjn +yqh5r5an8vW/9f7N/XNNcdlVl9/X2fQ4r/nYzzpPPQ9Xc08/fx32Gb4pJj7jZS51vV9eZHVRpneI +ZpYP81F7IGdXTl+zRVW/xlfvu71XfE3EVp3ee6z4ip2+7lXdfZo69nvbq3rrd9cU4uvUdl1XPMRP +TnVNkR9nuqeZ9+G10m71yqZ2m/2Jrtrbd67nmiJF28ZTM8TDQ1dlKw/TFc91XVOoXVXhuyYXe+VL +G0Bslp/O7v92ptvmuSrffnHa82Ku5aaQov6urvNtLsVVeLgpUnb3Z+pO7ThXz9LtFH4K8f7d2u/C +O09nVbTmvVV56psi9Fx/u4qbQo1rbumYmyJ0Te1clczuiWl/uurZ7vUtXdTzo66CbvvsGh8XKvae +4f012q81tu97mltjfi7c7sxua7R3Ze60Rsb1jX5o7YiaeG2NisuZt5WuI6eh+S9c3U1Rdjf3mbJb +mzWfefL1rRsae3T4fea2bleptX7jmeayXVyvm0L3v1rbFuu26vMZ+lLd5ODNfhP37DnzF/Xsmi3x +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 +kmtZmU4W + + + + \ No newline at end of file diff --git a/static/img/site/weaviate-logo-horizontal-light-1.svg b/static/img/site/weaviate-logo-horizontal-light-1.svg new file mode 100644 index 0000000000..0af6942cf2 --- /dev/null +++ b/static/img/site/weaviate-logo-horizontal-light-1.svg @@ -0,0 +1,1706 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +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 +N+44U9U41g== + + + + \ No newline at end of file diff --git a/static/img/site/weaviate-logo-light-alpha.svg b/static/img/site/weaviate-logo-light-alpha.svg new file mode 100644 index 0000000000..238fe453bc --- /dev/null +++ b/static/img/site/weaviate-logo-light-alpha.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/weaviate-reinvent-aws-banner-mobile.png b/static/img/site/weaviate-reinvent-aws-banner-mobile.png index 4a026267ae..ac25b091e0 100644 Binary files a/static/img/site/weaviate-reinvent-aws-banner-mobile.png and b/static/img/site/weaviate-reinvent-aws-banner-mobile.png differ diff --git a/static/img/site/weaviate-reinvent-aws-banner.png b/static/img/site/weaviate-reinvent-aws-banner.png index 2d493a6613..fe8481314b 100644 Binary files a/static/img/site/weaviate-reinvent-aws-banner.png and b/static/img/site/weaviate-reinvent-aws-banner.png differ diff --git a/static/img/site/weaviate-secret-party.png b/static/img/site/weaviate-secret-party.png new file mode 100644 index 0000000000..fb83bc8c99 Binary files /dev/null and b/static/img/site/weaviate-secret-party.png differ diff --git a/static/img/site/weaviate-workshop-highlight.png b/static/img/site/weaviate-workshop-highlight.png index b6a1cb7276..1977364a67 100644 Binary files a/static/img/site/weaviate-workshop-highlight.png and b/static/img/site/weaviate-workshop-highlight.png differ diff --git a/static/img/site/workbench-overview-bg.png b/static/img/site/workbench-overview-bg.png new file mode 100644 index 0000000000..456d88bf89 Binary files /dev/null and b/static/img/site/workbench-overview-bg.png differ diff --git a/static/img/site/workshops-daniel.png b/static/img/site/workshops-daniel.png index 56f2d81685..ba587859b4 100644 Binary files a/static/img/site/workshops-daniel.png and b/static/img/site/workshops-daniel.png differ diff --git a/static/img/site/workshops-jp-website.png b/static/img/site/workshops-jp-website.png index 2a4f04ac34..e732c9be1f 100644 Binary files a/static/img/site/workshops-jp-website.png and b/static/img/site/workshops-jp-website.png differ diff --git a/static/img/site/workshops-nyc-visual.png b/static/img/site/workshops-nyc-visual.png index 2a3a059b6e..6797eb22db 100644 Binary files a/static/img/site/workshops-nyc-visual.png and b/static/img/site/workshops-nyc-visual.png differ diff --git a/static/img/site/workshops-zain-website.png b/static/img/site/workshops-zain-website.png index 414d822574..d2ccf6b4c6 100644 Binary files a/static/img/site/workshops-zain-website.png and b/static/img/site/workshops-zain-website.png differ diff --git a/static/img/site/writesonic-demo.svg b/static/img/site/writesonic-demo.svg new file mode 100644 index 0000000000..5b322046b8 --- /dev/null +++ b/static/img/site/writesonic-demo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/site/writesonic-hp-logo.svg b/static/img/site/writesonic-hp-logo.svg deleted file mode 100644 index 760dc57e29..0000000000 --- a/static/img/site/writesonic-hp-logo.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/og/content/contact.jpg b/static/og/content/contact.jpg new file mode 100644 index 0000000000..18d279aa97 Binary files /dev/null and b/static/og/content/contact.jpg differ diff --git a/static/og/content/learning-centre.jpg b/static/og/content/learning-centre.jpg new file mode 100644 index 0000000000..f73eb6721b Binary files /dev/null and b/static/og/content/learning-centre.jpg differ diff --git a/static/og/docs/integrations/provider_integrations_wes.jpg b/static/og/docs/integrations/provider_integrations_wes.jpg new file mode 100644 index 0000000000..db4a3ba34c Binary files /dev/null and b/static/og/docs/integrations/provider_integrations_wes.jpg differ diff --git a/static/robots.txt b/static/robots.txt index bdfdc29023..b9b8b7bed2 100644 --- a/static/robots.txt +++ b/static/robots.txt @@ -1,3 +1,4 @@ Sitemap: https://weaviate.io/sitemap.xml User-agent: * -Allow: / \ No newline at end of file +Allow: / +Disallow: /*?* \ No newline at end of file diff --git a/tests/docker-compose-anon-2.yml b/tests/docker-compose-anon-2.yml index 8106313c57..8d5a0ba512 100644 --- a/tests/docker-compose-anon-2.yml +++ b/tests/docker-compose-anon-2.yml @@ -8,19 +8,17 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 ports: - 8090:8080 - 50061:50051 restart: on-failure:0 environment: - OPENAI_APIKEY: $OPENAI_APIKEY QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' CLUSTER_HOSTNAME: 'node1' diff --git a/tests/docker-compose-anon-bind.yml b/tests/docker-compose-anon-bind.yml index e4c154a221..d36fbaaeea 100644 --- a/tests/docker-compose-anon-bind.yml +++ b/tests/docker-compose-anon-bind.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 ports: - 8380:8080 - 50351:50051 @@ -20,9 +20,9 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'multi2vec-bind' + BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'multi2vec-bind,text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' multi2vec-bind: diff --git a/tests/docker-compose-anon-clip.yml b/tests/docker-compose-anon-clip.yml index e20b8d1d1a..8c6a7069b9 100644 --- a/tests/docker-compose-anon-clip.yml +++ b/tests/docker-compose-anon-clip.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 ports: - 8280:8080 - 50251:50051 @@ -20,9 +20,9 @@ services: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'multi2vec-clip' + BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'multi2vec-clip,text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' CLUSTER_HOSTNAME: 'node1' multi2vec-clip: diff --git a/tests/docker-compose-anon-offload.yml b/tests/docker-compose-anon-offload.yml new file mode 100644 index 0000000000..665ae53a2a --- /dev/null +++ b/tests/docker-compose-anon-offload.yml @@ -0,0 +1,28 @@ +--- +services: + weaviate_anon: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 + ports: + - 8080:8080 + - 50051:50051 + restart: on-failure:0 + environment: + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ASYNC_INDEXING: 'true' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_API_BASED_MODULES: 'true' + BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' + OFFLOAD_S3_BUCKET_AUTO_CREATE: 'true' + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY:-} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_KEY:-} + CLUSTER_HOSTNAME: 'node1' +... diff --git a/tests/docker-compose-anon.yml b/tests/docker-compose-anon.yml index 7c8f2e3a98..d1f4d52b74 100644 --- a/tests/docker-compose-anon.yml +++ b/tests/docker-compose-anon.yml @@ -8,23 +8,18 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 ports: - 8080:8080 - 50051:50051 restart: on-failure:0 environment: - OPENAI_APIKEY: $OPENAI_APIKEY QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY:-} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_KEY:-} - OFFLOAD_S3_BUCKET_AUTO_CREATE: 'true' BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' CLUSTER_HOSTNAME: 'node1' ... diff --git a/tests/docker-compose-rbac.yml b/tests/docker-compose-rbac.yml new file mode 100644 index 0000000000..703f5dda18 --- /dev/null +++ b/tests/docker-compose-rbac.yml @@ -0,0 +1,32 @@ +--- +services: + weaviate_rbac: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 + ports: + - 8580:8080 + - 50551:50051 + restart: on-failure:0 + environment: + QUERY_DEFAULTS_LIMIT: 25 + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ASYNC_INDEXING: 'true' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem' + ENABLE_API_BASED_MODULES: 'true' + BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' + CLUSTER_HOSTNAME: 'node1' + # AuthN and AuthZ settings + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + AUTHENTICATION_APIKEY_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'viewer-key,admin-key,other-user,jane-key' + AUTHENTICATION_APIKEY_USERS: 'viewer-user,admin-user,other-user,jane-doe' + AUTHORIZATION_ENABLE_RBAC: 'true' + AUTHORIZATION_ADMIN_USERS: 'admin-user' + AUTHORIZATION_VIEWER_USERS: 'viewer-user' +... diff --git a/tests/docker-compose-three-nodes.yml b/tests/docker-compose-three-nodes.yml index 3944f79aff..1bb895f97f 100644 --- a/tests/docker-compose-three-nodes.yml +++ b/tests/docker-compose-three-nodes.yml @@ -8,26 +8,20 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 restart: on-failure:0 ports: - "8180:8080" - 50151:50051 environment: AUTOSCHEMA_ENABLED: 'false' - OPENAI_APIKEY: $OPENAI_APIKEY - COHERE_APIKEY: $COHERE_APIKEY QUERY_DEFAULTS_LIMIT: 25 QUERY_MAXIMUM_RESULTS: 10000 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY:-} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_KEY:-} - OFFLOAD_S3_BUCKET_AUTO_CREATE: 'true' BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' CLUSTER_HOSTNAME: 'node1' CLUSTER_GOSSIP_BIND_PORT: '7100' @@ -42,26 +36,20 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 restart: on-failure:0 ports: - "8181:8080" - 50152:50051 environment: AUTOSCHEMA_ENABLED: 'false' - OPENAI_APIKEY: $OPENAI_APIKEY - COHERE_APIKEY: $COHERE_APIKEY QUERY_DEFAULTS_LIMIT: 25 QUERY_MAXIMUM_RESULTS: 10000 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY:-} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_KEY:-} - OFFLOAD_S3_BUCKET_AUTO_CREATE: 'true' BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' CLUSTER_HOSTNAME: 'node2' CLUSTER_GOSSIP_BIND_PORT: '7102' @@ -77,26 +65,20 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 restart: on-failure:0 ports: - "8182:8080" - 50153:50051 environment: AUTOSCHEMA_ENABLED: 'false' - OPENAI_APIKEY: $OPENAI_APIKEY - COHERE_APIKEY: $COHERE_APIKEY QUERY_DEFAULTS_LIMIT: 25 QUERY_MAXIMUM_RESULTS: 10000 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' ASYNC_INDEXING: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem' ENABLE_API_BASED_MODULES: 'true' - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY:-} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_KEY:-} - OFFLOAD_S3_BUCKET_AUTO_CREATE: 'true' BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' CLUSTER_HOSTNAME: 'node3' CLUSTER_GOSSIP_BIND_PORT: '7104' diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index 167bfe3f69..abfbbaed57 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -8,17 +8,16 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.26.4 + image: cr.weaviate.io/semitechnologies/weaviate:1.28.0 ports: - 8099:8080 - 50052:50051 restart: on-failure:0 environment: - OPENAI_APIKEY: ${OPENAI_APIKEY} QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - DEFAULT_VECTORIZER_MODULE: 'none' + BACKUP_FILESYSTEM_PATH: '/var/lib/weaviate/backups' ASYNC_INDEXING: 'true' ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-filesystem,offload-s3' ENABLE_API_BASED_MODULES: 'true' diff --git a/tests/start-weaviate.sh b/tests/start-weaviate.sh index f14bb15cd6..81e6065a1b 100755 --- a/tests/start-weaviate.sh +++ b/tests/start-weaviate.sh @@ -1,8 +1,9 @@ #!/bin/bash echo "Run Docker compose" -nohup docker-compose -f ./tests/docker-compose.yml up -d -nohup docker-compose -f ./tests/docker-compose-anon.yml up -d -nohup docker-compose -f ./tests/docker-compose-anon-2.yml up -d -nohup docker-compose -f ./tests/docker-compose-anon-clip.yml up -d -nohup docker-compose -f ./tests/docker-compose-three-nodes.yml up -d +nohup docker compose -f ./tests/docker-compose.yml up -d +nohup docker compose -f ./tests/docker-compose-rbac.yml up -d +nohup docker compose -f ./tests/docker-compose-anon.yml up -d +nohup docker compose -f ./tests/docker-compose-anon-2.yml up -d +nohup docker compose -f ./tests/docker-compose-anon-clip.yml up -d +nohup docker compose -f ./tests/docker-compose-three-nodes.yml up -d diff --git a/tests/stop-weaviate.sh b/tests/stop-weaviate.sh index 98cb87bada..3656f2ac69 100755 --- a/tests/stop-weaviate.sh +++ b/tests/stop-weaviate.sh @@ -1,8 +1,9 @@ #!/bin/bash echo "Stop Docker compose" -docker-compose -f ./tests/docker-compose.yml down --timeout 30 -docker-compose -f ./tests/docker-compose-anon.yml down --timeout 30 -docker-compose -f ./tests/docker-compose-anon-2.yml down --timeout 30 -docker-compose -f ./tests/docker-compose-anon-clip.yml down --timeout 30 -docker-compose -f ./tests/docker-compose-three-nodes.yml down --timeout 30 +docker compose -f ./tests/docker-compose.yml down --timeout 30 +docker compose -f ./tests/docker-compose-rbac.yml down --timeout 30 +docker compose -f ./tests/docker-compose-anon.yml down --timeout 30 +docker compose -f ./tests/docker-compose-anon-2.yml down --timeout 30 +docker compose -f ./tests/docker-compose-anon-clip.yml down --timeout 30 +docker compose -f ./tests/docker-compose-three-nodes.yml down --timeout 30 diff --git a/tests/test_configure.py b/tests/test_configure.py index 7816accece..5339bf6564 100644 --- a/tests/test_configure.py +++ b/tests/test_configure.py @@ -8,6 +8,8 @@ "script_loc", [ "./_includes/code/howto/configure.backups.py", + "./_includes/code/python/howto.configure.rbac.permissions.py", + "./_includes/code/python/howto.configure.rbac.roles.py", ], ) def test_pyv4(empty_weaviates, script_loc): diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py index ecf46dfe98..0870017a64 100644 --- a/tests/test_quickstart.py +++ b/tests/test_quickstart.py @@ -7,7 +7,17 @@ @pytest.mark.parametrize( "script_loc", [ - "./_includes/code/quickstart/endtoend.py", + # "./_includes/code/quickstart/endtoend.py", + "_includes/code/python/quickstart.is_ready.py", + "_includes/code/python/quickstart.create_collection.py", + "_includes/code/python/quickstart.import_objects.py", + "_includes/code/python/quickstart.query.neartext.py", + "_includes/code/python/quickstart.query.rag.py", + "_includes/code/python/local.quickstart.is_ready.py", + "_includes/code/python/local.quickstart.create_collection.py", + "_includes/code/python/local.quickstart.import_objects.py", + "_includes/code/python/local.quickstart.query.neartext.py", + "_includes/code/python/local.quickstart.query.rag.py", ], ) def test_pyv4(empty_weaviates, script_loc): @@ -31,7 +41,17 @@ def test_pyv3(empty_weaviates, script_loc): @pytest.mark.parametrize( "script_loc", [ - "./_includes/code/quickstart/endtoend.ts", + # "./_includes/code/quickstart/endtoend.ts", + "_includes/code/typescript/quickstart.is_ready.ts", + "_includes/code/typescript/quickstart.create_collection.ts", + "_includes/code/typescript/quickstart.import_objects.ts", + "_includes/code/typescript/quickstart.query.neartext.ts", + "_includes/code/typescript/quickstart.query.rag.ts", + "_includes/code/typescript/local.quickstart.is_ready.ts", + "_includes/code/typescript/local.quickstart.create_collection.ts", + "_includes/code/typescript/local.quickstart.import_objects.ts", + "_includes/code/typescript/local.quickstart.query.neartext.ts", + "_includes/code/typescript/local.quickstart.query.rag.ts" ], ) def test_ts(empty_weaviates, script_loc): diff --git a/versions-config.json b/versions-config.json index 44c7a0548f..1b67c74069 100644 --- a/versions-config.json +++ b/versions-config.json @@ -1,13 +1,13 @@ { "COMMENT1": "These values are used for yarn local yarn builds", "COMMENT2": "Build time values are set in _build_scripts/update-config-versions.js", - "weaviate_version": "1.18.2", - "helm_version": "16.0.0", - "weaviate_cli_version": "2.0.0", - "python_client_version": "3.15.3", - "go_client_version": "4.6.3", - "java_client_version": "4.0.1", + "weaviate_version": "1.28.1", + "helm_version": "17.3.3", + "weaviate_cli_version": "3.1.0", + "python_client_version": "4.9.6", + "go_client_version": "4.9.0", + "java_client_version": "5.0.1", "javascript_client_version": "2.14.5", - "typescript_client_version": "1.6.0", - "spark_connector_version": "1.2.4" -} + "typescript_client_version": "3.2.5", + "spark_connector_version": "1.3.3" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 421a69f0ed..b36cd1b2f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1299,6 +1299,11 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@braintree/sanitize-url@^6.0.0": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== + "@bugsnag/browser@^7.22.7": version "7.22.7" resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-7.22.7.tgz#ba1f9f3596b9d3cf1b4db11250f8be2f178a78c1" @@ -1886,6 +1891,20 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" +"@docusaurus/theme-mermaid@^2.3.1": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-2.4.3.tgz#b40194fb4f46813a18d1350a188d43b68a8192dd" + integrity sha512-S1tZ3xpowtFiTrpTKmvVbRHUYGOlEG5CnPzWlO4huJT1sAwLR+pD6f9DYUlPv2+9NezF3EfUrUyW9xLH0UP58w== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + "@mdx-js/react" "^1.6.22" + mermaid "^9.2.2" + tslib "^2.4.0" + "@docusaurus/theme-search-algolia@2.4.3": version "2.4.3" resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz#32d4cbefc3deba4112068fbdb0bde11ac51ece53" @@ -5395,6 +5414,26 @@ adm-zip@^0.5.10: resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.13.tgz#e2fbd87d0bb75603ccfdcb03a57a57c4831d9758" integrity sha512-4U51tTl9J8UVEcuKGr6zRzY95tWoAa9l+ureGBNmsfleszjZblm5NyEEL/ZQxkhi86co5mZhSvL2T7gkZ6feYQ== +ag-charts-types@10.3.3: + version "10.3.3" + resolved "https://registry.yarnpkg.com/ag-charts-types/-/ag-charts-types-10.3.3.tgz#042c747f1247af827c29ccfdd0890d7b9adcaae9" + integrity sha512-8rmyquaTkwfP4Lzei/W/cbkq9wwEl8+grIo3z97mtxrMIXh9sHJK1oJipd/u08MmBZrca5Jjtn5F1+UNPu/4fQ== + +ag-grid-community@32.3.3: + version "32.3.3" + resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-32.3.3.tgz#d0c2c15b342b49a3bb5dddfdad9d0332b08f1505" + integrity sha512-KhSJ3B6mwRFA4cLjNjOZkDndJBh8o83794ZHl4Q7xP9MJf43oCN9qoZ8pyBanohgpVfLcP0scYYCr9xIlzjdiA== + dependencies: + ag-charts-types "10.3.3" + +ag-grid-react@^32.3.3: + version "32.3.3" + resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-32.3.3.tgz#320be8fcef248fcd9d07b442263f00b2b6a815a3" + integrity sha512-0u6oYoSHf7P2eRgK8FtnXix+bW8hcbiGXhYhg+UpYJHNlKug+spNqjGSzX43f70AZ2QpOBLsL7Bz2FPsadv3HA== + dependencies: + ag-grid-community "32.3.3" + prop-types "^15.8.1" + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -6897,6 +6936,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -6917,11 +6961,6 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.0.0, commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -7154,6 +7193,20 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -7462,6 +7515,277 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape-fcose@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.23.0: + version "3.30.3" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.3.tgz#1b2726bbfa6673f643488a81147354841c252352" + integrity sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g== + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.4.0, d3@^7.8.2: + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.9: + version "7.0.9" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" + integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== + dependencies: + d3 "^7.8.2" + lodash-es "^4.17.21" + data-uri-to-buffer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" @@ -7479,6 +7803,11 @@ date-time@^3.1.0: dependencies: time-zone "^1.0.0" +dayjs@^1.11.7: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" @@ -7738,6 +8067,13 @@ del@^7.0.0: rimraf "^3.0.2" slash "^4.0.0" +delaunator@5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -8046,6 +8382,11 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" + integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== + dompurify@^2.2.8: version "2.5.5" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.5.tgz#0540a05b8020d4691ee9c6083fb23b2c919276fc" @@ -8157,6 +8498,11 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== +elkjs@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" + integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -10470,6 +10816,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" @@ -10613,6 +10966,11 @@ inquirer@^6.0.0, inquirer@^6.5.1: strip-ansi "^5.1.0" through "^2.3.6" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -11364,6 +11722,11 @@ keyv@^4.0.0, keyv@^4.5.3: dependencies: json-buffer "3.0.1" +khroma@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -11429,6 +11792,16 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -12243,6 +12616,28 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +mermaid@^9.2.2: + version "9.4.3" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.4.3.tgz#62cf210c246b74972ea98c19837519b6f03427f2" + integrity sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw== + dependencies: + "@braintree/sanitize-url" "^6.0.0" + cytoscape "^3.23.0" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.1.0" + d3 "^7.4.0" + dagre-d3-es "7.0.9" + dayjs "^1.11.7" + dompurify "2.4.3" + elkjs "^0.8.2" + khroma "^2.0.0" + lodash-es "^4.17.21" + non-layered-tidy-tree-layout "^2.0.2" + stylis "^4.1.2" + ts-dedent "^2.2.0" + uuid "^9.0.0" + web-worker "^1.2.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -13049,11 +13444,12 @@ netlify@^13.1.17, netlify@^13.1.2: p-wait-for "^4.0.0" qs "^6.9.6" -nice-grpc-client-middleware-deadline@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/nice-grpc-client-middleware-deadline/-/nice-grpc-client-middleware-deadline-2.0.12.tgz#4b2b4589559a5201b7adc6a9ee1673fb0dda21de" - integrity sha512-drKxQJzTbh+Qkd6v+BcRhTmY2mw9zR8Qigu/jk0vIkDi90K6NOOJGgvBdbTxKXtv6QY1g07T1LvwaqW3Mlwdvw== +nice-grpc-client-middleware-retry@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.9.tgz#a9b4909cbf17c1d95f44dccd30890949c44cf7b3" + integrity sha512-BgbsNjuppxD6hoeCfO5gkBA/G69Tq5d9QX35QLdA46NSjKllelC+FlcgSPMlO9VQKCAPDfp4zzzDJZTNtbvzVw== dependencies: + abort-controller-x "^0.4.0" nice-grpc-common "^2.0.2" nice-grpc-common@^2.0.2: @@ -13063,10 +13459,10 @@ nice-grpc-common@^2.0.2: dependencies: ts-error "^1.0.6" -nice-grpc@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/nice-grpc/-/nice-grpc-2.1.9.tgz#5c4b26e7051eebd31b5f54ce1348524ab151ee2d" - integrity sha512-shJlg1t4Wn3qTVE31gxofbTrgCX/p4tS1xRnk4bNskCYKvXNEUpJQZpjModsVk1aau69YZDViyC18K9nC7QHYA== +nice-grpc@^2.1.10: + version "2.1.10" + resolved "https://registry.yarnpkg.com/nice-grpc/-/nice-grpc-2.1.10.tgz#64355848951a143fc2a2d40d1d6b0f49f47567bb" + integrity sha512-Nujs/4wWJvE5OSxWPp3M5H+zHJAgsWMo38bMNfKQP1VDeCChp7MiKTkhJBV5JZvrBIkPhYQCLIbfvVqEoSuTuA== dependencies: "@grpc/grpc-js" "^1.10.8" abort-controller-x "^0.4.0" @@ -13168,6 +13564,11 @@ node-version-alias@^1.0.1: path-exists "^4.0.0" semver "^7.3.2" +non-layered-tidy-tree-layout@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== + noop2@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/noop2/-/noop2-2.0.0.tgz#4b636015e9882b54783c02b412f699d8c5cd0a5b" @@ -14572,7 +14973,7 @@ prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5.0, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.0, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -15753,6 +16154,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + rtl-detect@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" @@ -15785,6 +16191,11 @@ rusha@^0.8.14: resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.14.tgz#a977d0de9428406138b7bb90d3de5dcd024e2f68" integrity sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA== +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.6.2: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -15833,7 +16244,7 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -16745,6 +17156,11 @@ stylis@4.3.2: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== +stylis@^4.1.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.4.tgz#ca5c6c4a35c4784e4e93a2a24dc4e9fa075250a4" + integrity sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now== + sucrase@^3.32.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" @@ -17254,6 +17670,11 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + ts-deepmerge@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-deepmerge/-/ts-deepmerge-7.0.1.tgz#4b3dceb5a9b4308b7279d738c8d29834fbd5856b" @@ -17978,16 +18399,16 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -weaviate-client@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/weaviate-client/-/weaviate-client-3.1.5.tgz#7607cea99a836bb9264fa86d5f9a0d65df11408d" - integrity sha512-IS+tZTAIWwofcsr2guRiHNY9KswS8J7OO/OJqQi0SUJE5E22DDIaJAzNoIOnZtWX+K4frhAez6GyjlpHL1rAWg== +weaviate-client@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/weaviate-client/-/weaviate-client-3.2.4.tgz#9ba1b4016e9eec45a4f8c677e352f4e33423abc4" + integrity sha512-Y6KnrPQqUDK1hf15aH4/ib3FJwCXbUE8yGGtK8Pq8REbjgHCGXs+2cDr0XbihTbe75yXmBZ5UIgbIusgabgieQ== dependencies: graphql "^16.9.0" graphql-request "^6.1.0" long "^5.2.3" - nice-grpc "^2.1.9" - nice-grpc-client-middleware-deadline "^2.0.12" + nice-grpc "^2.1.10" + nice-grpc-client-middleware-retry "^3.1.9" uuid "^9.0.1" weaviate-ts-client@^1.3.3: @@ -18036,6 +18457,11 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== +web-worker@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"