LlamaIndex#
pip install "needtoknow[llamaindex]"
A permission-aware retriever for query and chat engines#
NeedToKnowRetriever is a LlamaIndex retriever for one subject:
from llama_index.core.query_engine import RetrieverQueryEngine
from needtoknow import MetadataACLAuthorizer, PermissionedRetriever, Subject
from needtoknow.llamaindex import NeedToKnowRetriever
permissioned = PermissionedRetriever(backend, MetadataACLAuthorizer())
retriever = NeedToKnowRetriever(permissioned, Subject("bob", ["engineering"]), k=4)
nodes = retriever.retrieve("How long is annual leave?")
engine = RetrieverQueryEngine.from_args(retriever) # uses your configured LLM
Create one per request or session, from the authenticated user. Returned nodes carry the chunk’s
metadata and score; aretrieve uses needtoknow’s async path.
Adding permissions to an existing pipeline#
PermissionNodePostprocessor drops the nodes a subject may not read, after whatever retrieval your
pipeline already does:
from needtoknow.llamaindex import PermissionNodePostprocessor
postprocessor = PermissionNodePostprocessor(authorizer=authorizer, subject=subject)
engine = index.as_query_engine(node_postprocessors=[postprocessor])
It post-filters, so it can return fewer nodes than were retrieved; NeedToKnowRetriever with a
pre-filtering backend does not have that problem. Like the retriever, it fails closed: an
authorizer error, a missing decision or a non-boolean decision raises AuthorizationError.
Any LlamaIndex index as a backend#
from needtoknow.llamaindex import LlamaIndexBackend
backend = LlamaIndexBackend(index) # anything with as_retriever(similarity_top_k=...)
retriever = PermissionedRetriever(backend, authorizer) # post-filtered