feat(evidence): contribute to semantic stages (#42)
This commit is contained in:
@@ -143,7 +143,13 @@ class QdrantVectorStore:
|
||||
filter_must.append(self._semantic_kind_filter(allowed_record_kinds))
|
||||
filter_must.append({"key": "record_kind", "match": {"any": allowed_record_kinds}})
|
||||
if metadata_filter is not None:
|
||||
if set(metadata_filter) != {"vector_generation", "document_ids", "workspace_id"}:
|
||||
allowed_filters = {
|
||||
"vector_generation", "document_ids", "workspace_id", "purpose",
|
||||
"required_kinds", "required_concepts", "required_tables", "required_columns",
|
||||
}
|
||||
if not {"vector_generation", "document_ids", "workspace_id"} <= set(metadata_filter) or (
|
||||
set(metadata_filter) - allowed_filters
|
||||
):
|
||||
raise VectorStoreError("Unsupported vector metadata filter")
|
||||
generation = metadata_filter["vector_generation"]
|
||||
document_ids = metadata_filter["document_ids"]
|
||||
@@ -160,6 +166,25 @@ class QdrantVectorStore:
|
||||
{"key": "vector_generation", "match": {"value": generation}},
|
||||
{"key": "document_id", "match": {"any": document_ids}},
|
||||
])
|
||||
purpose = metadata_filter.get("purpose")
|
||||
if purpose is not None:
|
||||
if not isinstance(purpose, str):
|
||||
raise VectorStoreError("Invalid vector metadata filter")
|
||||
filter_must.append({"key": "purposes", "match": {"value": purpose}})
|
||||
required_kinds = metadata_filter.get("required_kinds", [])
|
||||
if not isinstance(required_kinds, list) or not all(isinstance(item, str) for item in required_kinds):
|
||||
raise VectorStoreError("Invalid vector metadata filter")
|
||||
if required_kinds:
|
||||
filter_must.append({"key": "evidence_kind", "match": {"any": required_kinds}})
|
||||
for filter_key, payload_key in (
|
||||
("required_concepts", "scope.concepts"),
|
||||
("required_tables", "scope.tables"),
|
||||
("required_columns", "scope.columns"),
|
||||
):
|
||||
values = metadata_filter.get(filter_key, [])
|
||||
if not isinstance(values, list) or not all(isinstance(item, str) for item in values):
|
||||
raise VectorStoreError("Invalid vector metadata filter")
|
||||
filter_must.extend({"key": payload_key, "match": {"value": item}} for item in values)
|
||||
if query_text is None:
|
||||
if allowed_record_kinds == ["evidence"]:
|
||||
raise VectorStoreError("Evidence hybrid query text is required")
|
||||
|
||||
Reference in New Issue
Block a user