Skip to content

Commit f29c14d

Browse files
committed
[HOTFIX] revert server response with configuration_json for coll config
1 parent 60be7e3 commit f29c14d

File tree

5 files changed

+140
-9
lines changed

5 files changed

+140
-9
lines changed

Diff for: chromadb/api/async_fastapi.py

+54
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
UpdateCollectionConfiguration,
1616
create_collection_configuration_to_json,
1717
update_collection_configuration_to_json,
18+
create_collection_configuration_from_legacy_metadata_dict,
19+
populate_create_hnsw_defaults,
20+
validate_create_hnsw_config,
21+
CreateHNSWConfiguration,
22+
populate_create_spann_defaults,
23+
validate_create_spann_config,
1824
)
1925
from chromadb.config import DEFAULT_DATABASE, DEFAULT_TENANT, System, Settings
2026
from chromadb.telemetry.opentelemetry import (
@@ -311,6 +317,54 @@ async def create_collection(
311317
)
312318
model = CollectionModel.from_json(resp_json)
313319

320+
# TODO: @jairad26 Remove this once server response contains configuration
321+
hnsw = None
322+
spann = None
323+
if configuration is not None:
324+
hnsw = configuration.get("hnsw")
325+
spann = configuration.get("spann")
326+
327+
# if neither are specified, use the legacy metadata to populate the configuration
328+
if hnsw is None and spann is None:
329+
if model.metadata is not None:
330+
# update the configuration with the legacy metadata
331+
configuration = (
332+
create_collection_configuration_from_legacy_metadata_dict(
333+
model.metadata
334+
)
335+
)
336+
hnsw = configuration.get("hnsw")
337+
spann = configuration.get("spann")
338+
339+
else:
340+
# At this point we know at least one of hnsw or spann is not None
341+
if hnsw is not None:
342+
populate_create_hnsw_defaults(hnsw)
343+
validate_create_hnsw_config(hnsw)
344+
if spann is not None:
345+
populate_create_spann_defaults(spann)
346+
validate_create_spann_config(spann)
347+
348+
assert configuration is not None
349+
configuration["hnsw"] = hnsw
350+
configuration["spann"] = spann
351+
352+
# if hnsw and spann are both still None, it was neither specified in config nor in legacy metadata
353+
# in this case, rfe will take care of defaults, so we just need to populate the hnsw config
354+
if hnsw is None and spann is None:
355+
hnsw = CreateHNSWConfiguration()
356+
populate_create_hnsw_defaults(hnsw)
357+
validate_create_hnsw_config(hnsw)
358+
if configuration is not None:
359+
configuration["hnsw"] = hnsw
360+
else:
361+
configuration = CreateCollectionConfiguration(hnsw=hnsw)
362+
363+
assert configuration is not None
364+
model.configuration_json = create_collection_configuration_to_json(
365+
configuration
366+
)
367+
314368
return model
315369

316370
@trace_method("AsyncFastAPI.get_collection", OpenTelemetryGranularity.OPERATION)

Diff for: chromadb/api/collection_configuration.py

+20
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,26 @@ class CreateSpannConfiguration(TypedDict, total=False):
224224
merge_threshold: int
225225

226226

227+
def populate_create_spann_defaults(
228+
config: CreateSpannConfiguration,
229+
) -> CreateSpannConfiguration:
230+
if config.get("space") is None:
231+
config["space"] = "l2"
232+
if config.get("ef_construction") is None:
233+
config["ef_construction"] = 200
234+
if config.get("max_neighbors") is None:
235+
config["max_neighbors"] = 64
236+
if config.get("ef_search") is None:
237+
config["ef_search"] = 200
238+
if config.get("reassign_neighbor_count") is None:
239+
config["reassign_neighbor_count"] = 64
240+
if config.get("split_threshold") is None:
241+
config["split_threshold"] = 200
242+
if config.get("merge_threshold") is None:
243+
config["merge_threshold"] = 100
244+
return config
245+
246+
227247
def validate_create_spann_config(
228248
config: Optional[CreateSpannConfiguration], ef: Optional[EmbeddingFunction] = None # type: ignore
229249
) -> None:

Diff for: chromadb/api/fastapi.py

+57
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
UpdateCollectionConfiguration,
1313
update_collection_configuration_to_json,
1414
create_collection_configuration_to_json,
15+
create_collection_configuration_from_legacy_metadata_dict,
16+
populate_create_hnsw_defaults,
17+
validate_create_hnsw_config,
18+
CreateHNSWConfiguration,
19+
validate_create_spann_config,
20+
populate_create_spann_defaults,
1521
)
1622
from chromadb import __version__
1723
from chromadb.api.base_http_client import BaseHTTPClient
@@ -264,6 +270,57 @@ def create_collection(
264270
)
265271
model = CollectionModel.from_json(resp_json)
266272

273+
# TODO: @jairad26 Remove this once server response contains configuration
274+
hnsw = None
275+
spann = None
276+
if configuration is not None:
277+
hnsw = configuration.get("hnsw")
278+
spann = configuration.get("spann")
279+
280+
# if neither are specified, use the legacy metadata to populate the configuration
281+
print("Test legacy metadata: ", model.metadata)
282+
if hnsw is None and spann is None:
283+
if model.metadata is not None:
284+
# update the configuration with the legacy metadata
285+
configuration = (
286+
create_collection_configuration_from_legacy_metadata_dict(
287+
model.metadata
288+
)
289+
)
290+
print("Test legacy metadata configuration: ", configuration)
291+
hnsw = configuration.get("hnsw")
292+
spann = configuration.get("spann")
293+
294+
else:
295+
# At this point we know at least one of hnsw or spann is not None
296+
if hnsw is not None:
297+
populate_create_hnsw_defaults(hnsw)
298+
validate_create_hnsw_config(hnsw)
299+
if spann is not None:
300+
populate_create_spann_defaults(spann)
301+
validate_create_spann_config(spann)
302+
303+
assert configuration is not None
304+
configuration["hnsw"] = hnsw
305+
configuration["spann"] = spann
306+
307+
# if hnsw and spann are both still None, it was neither specified in config nor in legacy metadata
308+
# in this case, rfe will take care of defaults, so we just need to populate the hnsw config
309+
if hnsw is None and spann is None:
310+
hnsw = CreateHNSWConfiguration()
311+
populate_create_hnsw_defaults(hnsw)
312+
validate_create_hnsw_config(hnsw)
313+
if configuration is not None:
314+
configuration["hnsw"] = hnsw
315+
else:
316+
configuration = CreateCollectionConfiguration(hnsw=hnsw)
317+
318+
print("Test configuration: ", configuration)
319+
assert configuration is not None
320+
model.configuration_json = create_collection_configuration_to_json(
321+
configuration
322+
)
323+
267324
return model
268325

269326
@trace_method("FastAPI.get_collection", OpenTelemetryGranularity.OPERATION)

Diff for: chromadb/types.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from chromadb.api.collection_configuration import (
1818
CollectionConfiguration,
1919
HNSWConfiguration,
20-
SpannConfiguration,
2120
collection_configuration_to_json,
2221
load_collection_configuration_from_json,
2322
)
@@ -156,7 +155,7 @@ def get_configuration(self) -> CollectionConfiguration:
156155
)
157156
return CollectionConfiguration(
158157
hnsw=HNSWConfiguration(),
159-
spann=SpannConfiguration(),
158+
spann=None,
160159
embedding_function=None,
161160
)
162161

@@ -175,11 +174,11 @@ def get_model_fields(self) -> Dict[Any, Any]:
175174
@override
176175
def from_json(cls, json_map: Dict[str, Any]) -> Self:
177176
"""Deserializes a Collection object from JSON"""
178-
configuration: CollectionConfiguration = {
179-
"hnsw": {},
180-
"spann": {},
181-
"embedding_function": None,
182-
}
177+
configuration = CollectionConfiguration(
178+
hnsw=None,
179+
spann=None,
180+
embedding_function=None,
181+
)
183182
try:
184183
configuration_json = json_map.get("configuration_json", None)
185184
configuration = load_collection_configuration_from_json(configuration_json)

Diff for: rust/types/src/collection.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl std::fmt::Display for CollectionUuid {
5252
}
5353
}
5454

55-
fn serialize_internal_collection_configuration<S: serde::Serializer>(
55+
fn _serialize_internal_collection_configuration<S: serde::Serializer>(
5656
config: &InternalCollectionConfiguration,
5757
serializer: S,
5858
) -> Result<S::Ok, S::Error> {
@@ -76,7 +76,8 @@ pub struct Collection {
7676
pub collection_id: CollectionUuid,
7777
pub name: String,
7878
#[serde(
79-
serialize_with = "serialize_internal_collection_configuration",
79+
// serialize_with = "serialize_internal_collection_configuration",
80+
skip_serializing,
8081
deserialize_with = "deserialize_internal_collection_configuration",
8182
rename = "configuration_json"
8283
)]

0 commit comments

Comments
 (0)