Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
da77b9e
docs: reference updates for Weaviate 1.39
g-despot Jul 19, 2026
9a08110
Document HNSW snapshot automation and env var deprecation in v1.39
g-despot Jul 19, 2026
ea6236e
Correct corrupt segment recovery description in storage concepts
g-despot Jul 19, 2026
9e2a168
Reword the HNSW Snapshots configuration card
g-despot Jul 19, 2026
4bad93c
Apply editor feedback to the v1.39 HNSW snapshot docs
g-despot Jul 19, 2026
08668c6
Merge latest main into v1-39 release branch
g-despot Jul 22, 2026
32403d4
Merge #474: reference updates for 1.39 (schema_tx removal, Boost GA)
g-despot Jul 22, 2026
d2d19a5
Merge #475: HNSW snapshots automatic in 1.39
g-despot Jul 22, 2026
903ec89
docs(release-notes): fill the TypeScript client cell for the v1.38 row
g-despot Aug 4, 2026
f1ff2ae
docs(api): document the gRPC-web interface on the REST port
g-despot Aug 4, 2026
88ad31d
docs(cloud): note that gRPC-web uses the REST endpoint URL
g-despot Aug 4, 2026
6451887
docs(config): list grpc_web_enabled as a runtime-config-only override
g-despot Aug 4, 2026
07d3dfb
docs: apply editor review to the gRPC-Web mentions
g-despot Aug 4, 2026
8090da9
docs: cover both gRPC-Web toggle surfaces and their casing split
g-despot Aug 4, 2026
81aadd5
Merge pull request #490 from weaviate/v1-39/compat-table-138
g-despot Aug 4, 2026
725373f
Update descriptions
g-despot Aug 4, 2026
aba483d
Merge pull request #491 from weaviate/v1-39/grpc-web
g-despot Aug 4, 2026
25c6641
docs: fold HNSW snapshots into concepts/storage for v1.39
g-despot Aug 4, 2026
89b1085
docs: correct seven inaccurate claims about snapshots and the commit log
g-despot Aug 11, 2026
e6b6947
Merge pull request #492 from weaviate/v1-39/hnsw-snapshots-review-fixes
g-despot Aug 12, 2026
b0f569f
Merge origin/main into the v1.39 release branch
g-despot Aug 12, 2026
cbeebc1
docs: 1.39 Python client surfaces, corrections, and pin bump
g-despot Aug 12, 2026
049d71f
Merge pull request #508 from weaviate/nakama/7b80ac75
g-despot Aug 12, 2026
a356134
docs: add the text2vec-morph model provider page set
g-despot Aug 13, 2026
2109ef7
docs: add the multi2vec-twelvelabs model provider page set
g-despot Aug 13, 2026
fee24b6
fix(morph): replace the dead Morph Embedding API links
g-despot Aug 13, 2026
dfd7450
Potential fix for pull request finding
g-despot Aug 13, 2026
43811d4
Potential fix for pull request finding
g-despot Aug 13, 2026
ea899cd
Potential fix for pull request finding
g-despot Aug 13, 2026
dad1c2d
Potential fix for pull request finding
g-despot Aug 13, 2026
e4a199d
Merge pull request #510 from weaviate/v1-39/morph
g-despot Aug 13, 2026
50396ef
Merge pull request #511 from weaviate/v1-39/twelvelabs
g-despot Aug 13, 2026
9a86e5b
docs: add generative-deepseek model provider integration page
g-despot Jun 26, 2026
2a53a7f
docs: correct generative-deepseek model, header and timeout guidance
g-despot Jul 30, 2026
577f4d5
docs: add DeepSeek RAG integration illustrations
g-despot Jul 30, 2026
dba6cd3
docs: enable the DeepSeek snippets against the pinned client
g-despot Aug 13, 2026
13a73a7
docs: add the missing DeepSeek _category_.json
g-despot Aug 13, 2026
03b767a
chore: regenerate uv.lock for weaviate-client 4.23.0
g-despot Aug 13, 2026
3af4e3d
Potential fix for pull request finding
g-despot Aug 13, 2026
772e278
Merge pull request #513 from weaviate/v1-39/generative-deepseek
g-despot Aug 13, 2026
9cc115e
docs: add and_cross to the BM25 concepts operator list
g-despot Aug 13, 2026
39fbed4
docs: finish the and_cross sweep on the two remaining pages
g-despot Aug 13, 2026
1f039cf
chore: point the REST API reference at the v1-39 OpenAPI spec
g-despot Aug 13, 2026
cbb101b
Merge pull request #514 from weaviate/v1-39/uv-lock
g-despot Aug 13, 2026
6437fc7
chore: upgrade weaviate-agents to 1.8.0
g-despot Aug 13, 2026
4df7b25
fix(docs-tests): wait for the async geo index in manage-data.create
g-despot Aug 13, 2026
11a41a0
docs(release-history): set the Java cell for 1.39.x to 6.3.1
g-despot Aug 13, 2026
8629c2d
Merge pull request #515 from weaviate/v1-39/uv-lock
g-despot Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions _build_scripts/link-validator.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ const domainsToIgnore = [
'medium.com', // TODO[g-despot]: started throwing Forbidden 403 (incl. subdomains, e.g. *.medium.com)
'https://www.npmjs.com',
'https://openai.com',
'https://platform.deepseek.com', // 403s automated requests (site loads fine in a browser)
'https://platform.openai.com',
'https://www.researchgate.net',
'https://simple/',
Expand Down
89 changes: 89 additions & 0 deletions _includes/code/csharp/ModelProvidersTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,95 @@ await client.Collections.Create(
await client.Collections.Delete("DemoCollection");
}

[Fact(Skip = "Requires MORPH_APIKEY, not configured in CI")]
public async Task TestMorphInstantiation()
{
// START MorphInstantiation
// Best practice: store your credentials in environment variables
string weaviateUrl = Environment.GetEnvironmentVariable("WEAVIATE_URL");
string weaviateApiKey = Environment.GetEnvironmentVariable("WEAVIATE_API_KEY");
string morphApiKey = Environment.GetEnvironmentVariable("MORPH_APIKEY");

// highlight-start
// Morph requests are built by Weaviate's OpenAI-compatible client,
// so the Morph key is supplied under the OpenAI header name.
using var client = await Connect.Cloud(
weaviateUrl,
weaviateApiKey,
headers: new Dictionary<string, string>
{
["X-Openai-Api-Key"] = morphApiKey,
}
);

var meta = await client.GetMeta();
Console.WriteLine(meta.Version);
// highlight-end
// END MorphInstantiation
}

[Fact(Skip = "Requires MORPH_APIKEY, not configured in CI")]
public async Task TestMorphVectorizer()
{
if (await client.Collections.Exists("DemoCollection"))
await client.Collections.Delete("DemoCollection");

// START BasicVectorizerMorph
await client.Collections.Create(
new CollectionCreateParams
{
Name = "DemoCollection",
VectorConfig = new VectorConfigList
{
Configure.Vector(
"title_vector",
v => v.Text2VecMorph(),
sourceProperties: ["title"]
),
},
Properties = [Property.Text("title"), Property.Text("description")],
}
);
// END BasicVectorizerMorph

var config = await client.Collections.Export("DemoCollection");
Assert.True(config.VectorConfig.ContainsKey("title_vector"));
Assert.Equal("text2vec-morph", config.VectorConfig["title_vector"].Vectorizer.Identifier);

await client.Collections.Delete("DemoCollection");
}

[Fact(Skip = "Requires MORPH_APIKEY, not configured in CI")]
public async Task TestMorphVectorizerFull()
{
if (await client.Collections.Exists("DemoCollection"))
await client.Collections.Delete("DemoCollection");

// START FullVectorizerMorph
await client.Collections.Create(
new CollectionCreateParams
{
Name = "DemoCollection",
VectorConfig = new VectorConfigList
{
Configure.Vector(
"title_vector",
v => v.Text2VecMorph(model: "morph-embedding-v3"),
sourceProperties: ["title"]
),
},
Properties = [Property.Text("title"), Property.Text("description")],
}
);
// END FullVectorizerMorph

var config = await client.Collections.Export("DemoCollection");
Assert.True(config.VectorConfig.ContainsKey("title_vector"));
Assert.Equal("text2vec-morph", config.VectorConfig["title_vector"].Vectorizer.Identifier);

await client.Collections.Delete("DemoCollection");
}

[Fact]
public async Task TestWeaviateVectorizerModel()
{
Expand Down
18 changes: 18 additions & 0 deletions _includes/code/howto/configure.backups.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,24 @@
assert client.collections.exists("Article")
assert client.collections.exists("Publication")

# START ListBackups
backups = client.backup.list_backups(
backend="filesystem",
sort_by_starting_time_asc=True,
)

for backup in backups:
print(backup.backup_id, backup.status, backup.incremental_base_backup_id)
# END ListBackups

# Test
backup_ids = [backup.backup_id for backup in backups]
assert {"base-backup", "incremental-backup-1", "incremental-backup-2"}.issubset(backup_ids)
bases = {backup.backup_id: backup.incremental_base_backup_id for backup in backups}
assert bases["base-backup"] is None
assert bases["incremental-backup-1"] == "base-backup"
assert bases["incremental-backup-2"] == "incremental-backup-1"

# Clean up
client.collections.delete(["Article", "Publication"])

Expand Down
37 changes: 26 additions & 11 deletions _includes/code/howto/manage-data.create.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@
# WithGeoCoordinates
# ========================================

# Test scaffolding; not rendered in the docs. Start from an empty collection so
# the exact count asserted below cannot pick up an object left by an earlier run.
client.collections.delete("Publication")

# START WithGeoCoordinates
publications = client.collections.use("Publication")

Expand All @@ -196,23 +200,34 @@
# END WithGeoCoordinates

# TEST - Confirm insert & delete object
# Test scaffolding below; not rendered in the docs.
# A geo property is backed by its own index, and that index is filled in the
# background when the server runs with ASYNC_INDEXING enabled (the test
# instance does), so a geo filter does not see the object the moment insert
# returns. Wait (bounded) for the write to become visible, so the assertion
# tests the geo range and not index visibility. The assertion stays exact.
import time
from weaviate.classes.data import GeoCoordinate
from weaviate.classes.query import Filter

response = publications.query.fetch_objects(
filters=(
Filter
.by_property("headquartersGeoLocation")
.within_geo_range(
coordinate=GeoCoordinate(
latitude=52.39,
longitude=4.84
),
distance=1000 # In meters
)
geo_range_filter = (
Filter
.by_property("headquartersGeoLocation")
.within_geo_range(
coordinate=GeoCoordinate(
latitude=52.39,
longitude=4.84
),
distance=1000 # In meters
)
)

for _ in range(30):
response = publications.query.fetch_objects(filters=geo_range_filter)
if len(response.objects) >= 1:
break
time.sleep(1)

assert len(response.objects) == 1
obj_uuid = response.objects[0].uuid
publications.data.delete_by_id(obj_uuid)
Expand Down
25 changes: 25 additions & 0 deletions _includes/code/howto/search.bm25.gql.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,29 @@

gqlresponse = client.graphql_raw_query(gql_query)

gql_query = """
# START BM25OperatorCrossPropertyAnd
{
Get {
JeopardyQuestion(
limit: 3
bm25: {
query: "Australian mammal cute"
# highlight-start
searchOperator: {
operator: AndCross,
}
# highlight-end
}
) {
question
answer
}
}
}
# END BM25OperatorCrossPropertyAnd
"""

gqlresponse = client.graphql_raw_query(gql_query)

client.close()
30 changes: 30 additions & 0 deletions _includes/code/howto/search.bm25.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,36 @@
# End test


# ============================
# ===== BM25 w/ AND_CROSS =====
# ============================

# START BM25OperatorCrossPropertyAnd
# highlight-start
from weaviate.classes.query import BM25Operator
# highlight-end

jeopardy = client.collections.use("JeopardyQuestion")
response = jeopardy.query.bm25(
# highlight-start
query="African desert wind",
# Each token must be matched by at least one searched property,
# but not necessarily all by the same property
operator=BM25Operator.and_cross(),
# highlight-end
limit=3,
)

for o in response.objects:
print(o.properties)
# END BM25OperatorCrossPropertyAnd


# Tests
assert response.objects[0].collection == "JeopardyQuestion"
# End test


# ================================================
# ===== BM25 Query with score / explainScore =====
# ================================================
Expand Down
77 changes: 77 additions & 0 deletions _includes/code/howto/search.similarity.mmr.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,83 @@
relevant_questions = [o.properties["question"] for o in response_relevant.objects]
assert diverse_questions != relevant_questions, "Pure diversity and pure relevance should differ"

# START MMRHybridExample
from weaviate.classes.query import Diversity

collection = client.collections.get("MMRDemo")

# Fuse the keyword and vector results into 20 candidates, then select 5 diverse results
response = collection.query.hybrid(
query="Question",
vector=base_vec,
limit=20,
# highlight-start
diversity_selection=Diversity.mmr(
limit=5,
balance=0.5,
),
# highlight-end
)

for o in response.objects:
print(o.properties["question"])
# END MMRHybridExample

# Test
assert len(response.objects) == 5
hybrid_mmr_questions = [o.properties["question"] for o in response.objects]

hybrid_standard = collection.query.hybrid(
query="Question",
vector=base_vec,
limit=5,
)
hybrid_standard_questions = [o.properties["question"] for o in hybrid_standard.objects]
assert set(hybrid_standard_questions) != set(
hybrid_mmr_questions
), "MMR should select different items than standard hybrid search"

# START MMRPagination
from weaviate.classes.query import Diversity

collection = client.collections.get("MMRDemo")

# The query limit is the size of the window that gets diversified.
# The diversity limit is the page size.
query_limit = 10
page_size = 3

# Advance offset by the query limit, NOT by the number of returned objects
for offset in range(0, 30, query_limit):
page = collection.query.near_vector(
near_vector=base_vec,
limit=query_limit,
# highlight-start
offset=offset,
diversity_selection=Diversity.mmr(limit=page_size, balance=0.5),
# highlight-end
)

for o in page.objects:
print(offset, o.properties["question"])
# END MMRPagination

# Test
paged_questions = []
for offset in range(0, 30, query_limit):
page = collection.query.near_vector(
near_vector=base_vec,
limit=query_limit,
offset=offset,
diversity_selection=Diversity.mmr(limit=page_size, balance=0.5),
)
paged_questions += [o.properties["question"] for o in page.objects]

assert len(paged_questions) == 9
assert len(set(paged_questions)) == len(
paged_questions
), "Advancing offset by the query limit must not repeat objects across pages"

# Cleanup
client.collections.delete("MMRDemo")
client.close()
Loading
Loading