Skip to main content

operonx-kb

Knowledge base and document intelligence on operonx: files become versioned documents whose every character has an address (version, span → page, bbox), indexed for retrieval, and answers cite spans that were checked against the text they quote.

uv sync --extra pdf --extra faiss     # core + PDF text layer + FAISS index
PYTHONPATH=../operonx-wt/feat-kb-upstream uv run pytest -q   # until operonx PR #74 merges
import operonx
from operonx_kb import CollectionSpec, DenseIndexSpec, KnowledgeBase
from operonx_kb.model.collection import LexicalIndexSpec

operonx.bootstrap(resources="resources.yaml")  # kb_catalog:, kb_blob:, kb_lexical:, embedding:, vector_store:, llm:
kb = KnowledgeBase()
kb.create_collection("handbook", CollectionSpec(
    dense=DenseIndexSpec(embedder="e5", store="vector_store:kb",
                         passage_template="passage: {text}", query_template="query: {text}"),
    lexical=LexicalIndexSpec(),  # SQLite FTS5 or Postgres FTS
    filterable={"dept": "keyword"},
))
await kb.add("handbook", "policy.pdf", key="policy.pdf", tags=["hr"], acl=["team:hr"],
             metadata={"dept": "hr"})
found = await kb.search("handbook", "how many days of leave", mode="hybrid",
                        filter={"acl_any": ["team:hr"]}, reranker="ce")
answer = await kb.ask("handbook", "how many days of leave", "assistant")
answer["citations"]  # each: quote, canonical span, pages, bboxes; unverified ones are in answer["dropped"]
operonx-kb query handbook "how many days of leave" --mode hybrid --tag hr
operonx-kb query wiki "who directed the film that won in 1999"   # created with --graph: mode auto sends relation questions to the graph (docs/bench/router.md)
operonx-kb query handbook "how many days of leave" --answer assistant
operonx-kb eval handbook datasets/handbook.jsonl --mode hybrid

Use it inside your flows

A search is an operonx graph, so it is one step of your own flow — traced with it, no service in between (tests/graphs/test_in_a_flow.py):

from operonx.kb.graphs import search   # module level: the collection's settings are read per run

@graph
def answer_flow(question, catalog):
    found = search(query=question, collection="handbook", filter=None, k=5, mode="hybrid",
                   catalog=catalog)
    reply = cite(hits=found["hits"])          # your own op
    START >> found >> reply >> END

engine = Operon(answer_flow, params={"question": None, "catalog": None})
out = await engine.run(inputs={"question": "...", "catalog": "kb_catalog:main"})

For an agent (operonx-agents installed beside it), kb_tools gives a read-only kb_search / kb_read toolset. The scope comes from your code or the run's context — the model only sends a query — and kb_read checks it again (tests/graphs/test_agent_tools.py):

from operonx.kb.tools import kb_tools

tools = kb_tools(kb, "handbook", scope=lambda ctx: {"acl_any": ctx.deps.principals})
agent = Agent(name="hr", model=Model("assistant"), tools=[tools])

A client outside your code (Claude Desktop, an IDE) gets the same two tools over MCP (extra mcp). The scope is the server's, fixed when it starts — one server per audience:

operonx-kb mcp handbook --acl team:hr

Scanned PDFs: a page with no text layer is read by OCR when the collection asks for it (extra ocr, plus the tesseract binary with its language data) — CollectionSpec(ocr=OcrSpec(languages="vie+eng")).

Files from S3 or Google Drive (extras s3, drive): S3Source("bucket", prefix="hr/") and DriveSource(folder_id) are job sources, like a folder, so an ingest job reads them and resumes.

Studio's Knowledge tab reads a knowledge base through its admin API (extra admin), served as one of the project's services:

import operonx
from operonx.app import Service, asgi
from operonx_kb.admin import kb_admin_app

operonx.bootstrap()  # operonx serve loads no resources for an asgi service
Service("kb_admin", asgi("/kb", port=8021), app=kb_admin_app(llm="assistant"))

Outstanding work (K5 visual retrieval needs a GPU): BACKLOG.md. Design and phase gates: PLAN.md; measured gates: docs/bench. Contributor and agent rules: AGENTS.md.

Metadata

Release files for operonx-kb 0.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for operonx-kb 0.2.3
File Size Uploaded
operonx_kb-0.2.3.tar.gz 205.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for operonx-kb 0.2.3
File Interpreter ABI Platform
operonx_kb-0.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 471.9 kB

Release files / operonx_kb-0.2.3.tar.gz

Download URL operonx_kb-0.2.3.tar.gz
Size 205.4 kB
Tags Source
SHA-256 checksum
How to use checksums
69534371731b7d688f2730ff03ba74c2006baccb0179333c5a0d941f493ff72c
BLAKE2b-256 checksum
How to use checksums
07f2eb21f91b99b964e9b73b5af7a676e4e88dc2e5cc4dee3a76b7ba00c9609b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / operonx_kb-0.2.3-py3-none-any.whl

Download URL operonx_kb-0.2.3-py3-none-any.whl
Size 266.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9355fffc02cbbc1d1f8fb56bdec65fe2b6a070e39a3b4015394b03b78875adff
BLAKE2b-256 checksum
How to use checksums
c01669deb24b62af269f7e67d8f682a20da7a82fa2aa3dc9a371903a8a0d8af8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.2.5

2 release files

0.2.4

2 release files

This release

0.2.3 This release

2 release files

0.2.2

2 release files

0.2.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page