Repository navigation
feat(weaviate): add the Weaviate provider, read-only over its REST API - #1949
Open
kaya-abdullah wants to merge 1 commit into
Open
kaya-abdullah wants to merge 1 commit into
kaya-abdullah wants to merge 1 commit into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Add the weaviate connection type. Studio browses a Weaviate server's collections with their properties and vectors, shows tenants and aliases in a collection's Source, and runs Weaviate's own REST read requests from a closed console of 17 routes: object reads, BM25, hybrid at alpha 0, near-vector and near-object searches, and aggregates. A search is written in the REST shape on every server. The provider sends it over REST search from 1.39.7 (near-vector from 1.39.8) and over GraphQL below, falls back once when a path is switched off, and shows the same columns and cell types on both paths. Tested on 1.40.2, 1.38.22 and 1.37.4, the line DigitalOcean Managed Weaviate runs. Every request is a read. Searches that would make the server send text to a model (near-text, generative, rerank, hybrid with alpha other than 0) are refused before anything is sent; a request naming a tenant that is not HOT is refused after reading the tenant's own record, so no read wakes a COLD tenant; an API key or OIDC token goes without TLS only to this machine or through an SSH tunnel. Register the type in every shared table, add the provider document, security control 3.25, six fixture servers with seeds, 17 captures with the harness that writes them, a live check and a REST/GraphQL parity check, unit, integration and end-to-end tests, and update every engine count and list in the docs, READMEs, chart, operator and listings. Closes #1566
kaya-abdullah
force-pushed
the
feat/weaviate-provider
branch
from
October 24, 2026 09:26
f114775 to
169845c
Compare
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Description
The Weaviate provider,
weaviate: read-only over Weaviate's REST API, and over GraphQL for the searches of a server older than 1.39.7, tested on Weaviate 1.40.2, 1.38.22 and 1.37.4.Browse collections with their properties and vectors, see tenants and aliases in a collection's Source, and run Weaviate's own REST read requests (object reads, BM25, hybrid at
alpha0, near-vector and near-object searches, aggregates) from a closed console of 17 routes over a REST client of Studio's own.A search is written in the REST shape on every server; the provider picks REST or GraphQL from the server's version and falls back once when a path is switched off.
Studio sends no text to a model on Weaviate (every search that would embed text on the server is refused before anything is sent), never wakes a COLD tenant, and sends a key without TLS only to this machine or through an SSH tunnel.
The design is the body of #1566; the measurements behind each rule are in
docs/providers/weaviate.md.Release note
New: Weaviate, as the
weaviateconnection type, tested on Weaviate 1.40.2, 1.38.22 and 1.37.4 (the line DigitalOcean Managed Weaviate runs).Browse collections with their properties, vectors, tenants and aliases; read objects; and run BM25, hybrid, near-vector and near-object searches and aggregates from a console that takes Weaviate's own
METHOD /v1/pathrequests with one JSON body.Studio only reads on Weaviate, refuses every search that would send text to a model provider, refuses a request that names a tenant that is not HOT, accepts an API key or a pasted OIDC access token, and shows MCP clients the declared properties and vectors alone.
Published types widened:
DatabaseType,QueryTab["type"]andProviderCapabilities.queryDialectgainweaviate, and theQueryEditorlanguageprop gainsweaviate.Type of Change
Related Issue
Closes #1566. Part of #424 and #1089.
Changes Made
Provider (
src/lib/db/providers/vector/weaviate/, 24 modules)client.ts,routes.ts,rest-client.ts: the 19 operations the client can send, the 17 console routes plus the readiness probe and the GraphQL read; every other route is refused by name before the wire.versions.ts: the version table (REST search from 1.39.7, REST near-vector from 1.39.8, GraphQL below), measured on ten releases from 1.37.4 to 1.40.2.request.ts,guard.ts: the two-phase request rules: closed body and filter keys at every level,alphamust be 0, no near-text, generative or rerank search, tenant and name rules, bounds.graphql.ts,execute.ts,results.ts: one REST-shaped request encoded for either path, the one-time fallback when a path is switched off, the tenant guard, and the same columns and cell types on both paths.schema.ts,objects.ts,source.ts,monitoring*.ts,labels.ts,generators.ts: the tree, columns, Source (Schema and State), Tables and index panels, and the generated requests.connection-options.ts,errors.ts: the bearer header, the plaintext-key rule, TLS material, and the error table with the secret withheld from every server text.connection-string.ts,execution-ui.ts,sql-grammar.ts,sql-writing.ts,migration-ddl.ts.Registration (every shared table gains a
weaviaterow; no other engine's row changes)src/lib/types.ts,src/lib/db/types.ts,compatibility.ts(shipped, external, read-only enforced, MCP),factory.ts,connection-fields.ts,connection-form.ts(appended to the picker),credential-warnings.ts,destructive-commands.ts,query-dialects.ts,src/lib/agent/agent-manifest.ts(no agent language).db-ui-config.ts,db-icons.tsx,db-showcase.ts,QueryEditor.tsx,AnswerCard.tsx, and azinchue intheme.css(light, dark and@theme), mapped in the VS Code extension's theme bridge.Fixtures and live tools
database-compose.ymlanddocker/weaviate/: six servers (1.40.2, 1.38.22, 1.37.4, 1.40.2 with GraphQL disabled, a keyed server with avieweruser, and a TLS server), their seeds and key generation.tests/live/weaviate-evidence.tswrites the 17 captures undertests/fixtures/weaviate/;tests/live/weaviate-live-check.tsholds a live run to them;tests/live/weaviate-path-parity.tscompares REST and GraphQL answers.Security
docs/SECURITY.md: control 3.25 (the Weaviate console's read routes, no text to a model, no COLD tenant) with its tests, and the Known limits entry;scripts/security-check.mjslists the control.Docs
docs/providers/weaviate.md, the providers index,ARCHITECTURE.md,DATABASE_PROVIDERS.md,FEATURES.md,API_DOCS.md,MCP.md,SCHEMA_DIFF.md,editor/query-optimization.md,AGENT_GUIDE.md,AGENT_DATA_FLOW.md,AGENT.md,SEED_CONNECTIONS.md,ADDING_A_PROVIDER.md,BRAND_MESSAGING.md.DOCKERHUB.md, the chart description, keywords and README (chart 0.1.103), the operator CSV and its bundle copy, the AWS, Azure, CapRover, DigitalOcean, Koyeb, Railway and Rancher listings, AUR, nfpm, winget, Chocolatey, snap, Flatpak and the desktop entry.Testing
Gates
main.mainas well: the Databend wire-heap test on Node 24.11 (passes on Node 24.16), and the Kafka TLS handshake, Snowflake key-runtimes and Docker build-context tests under parallel load (each passes on its own).New tests
tests/unit/db/weaviate/, all 24 modules at 100% line coverage on their own.tests/integration/db/weaviate-provider.test.tsreplays 17 captures written against the six live servers: every request the provider sends and every outcome it shows must match what the servers answered.e2e/weaviate-provider.spec.ts(5 tests, own Playwright project).Live checks against the six servers
text2vec-openaibase URL is a listener on the Docker bridge, nothing Studio sends reached the listener on 1.37.4 or 1.40.2.In the browser (the built app and Chromium on the fixture network; each step screenshotted and checked)
viewerkey and a read-only seed, the TLS server in every SSL mode, seven Test Connection cases (no key, wrong key, a key without TLS to a remote host, plain HTTP to the TLS port, nothing listening), Paste URL of a Weaviate Cloud address, and a user's own connection created, kept across a reload, edited, duplicated and deleted.mcp: trueseed:list_connections,inspect_schema(properties and vectors, no tenants or aliases) and therun_read_queryrefusal.Other engines, this branch against
mainmaintoo (a PostgreSQL connection onlocalhostblocked by the local VPN, and two WebKit tests).Test Environment
mainat 1d5f63b plus this branchScreenshots (if applicable)
Not attached; the browser pass above saved a screenshot of every step, available on request.
Checklist
bun run test:coverageandbun run coverage:check)src/lib/db/providers/, I updated the matchingdocs/providers/documentation andtests/integration/db/tests in the same PR (provider triad)AGENT_STATEMENT_LANGUAGErow, I kept its agent leg in step (theweaviaterow is null: no agent leg)Additional Notes
Decisions worth a look during review:
alpha0: measured, it then sends nothing to the vectorizer, while any otheralphaand near-text do.groupByand no limit is sent with 100, the number both paths return then, and says when the groups reached it.WithinGeoRangeas 0 while a search finds the objects (1.38 and 1.40 count them); such a count carries a note.targetVector, andoffset=0.mainand left for separate issues: the Qdrant scroll notice can skip points the result budget dropped, and a seed'squeryTimeoutfield is ignored (the dialog's value works).