feat(evidence): contribute to semantic stages (#42)

This commit is contained in:
2026-08-24 22:05:30 +02:00
parent 3420c57c8b
commit f1a9b567ba
17 changed files with 619 additions and 23 deletions
+26 -1
View File
@@ -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")