Omneum agent

An open-source context evaluator for AI agents and RAG.

by cole-h06·MIT license·★ 1 Stars on the repo·GitHub ↗

Inside this agent

README.md · the author's own words
<!-- mcp-name: ai.omneum/omneum -->
# What is Omneum

  An open-source context evaluator for AI agents.

Agents routinely assemble context from many different sources — a RAG pipeline, web search, APIs, databases, files, memory systems, other a…

Most agents focus on retrieving more context. Omneum is focused on making sure the context reaching the model is clean and reliable.

**⚡ Fast context auditing for AI agents.**

**33 ms median evaluation latency:** Measured across 250 observations, 3 independent sources, 84 claims on Apple M5. No additional LLM infe…

**Dependency-aware:** Detects when multiple retrieved context chunks repeat information from the same upstream source.

**Local by default:** A content-blind graph algorithm running entirely within your environment, with SQLite persistence and optional Postgr…

Word-for-word excerpt, not a result. Read the full README.md ↓

Files of Omneum

cole-h06/main1 file
README.md
Show the full text567 lines

What is Omneum

Omneum

An open-source context evaluator for AI agents.

CI PyPI Python 3.11–3.14 MIT License

Agents routinely assemble context from many different sources — a RAG pipeline, web search, APIs, databases, files, memory systems, other agents — but stuffing dozens of raw chunks into a single context window can leave the model working through a mess of information that was never organized for it.

Most agents focus on retrieving more context. Omneum is focused on making sure the context reaching the model is clean and reliable.

⚡ Fast context auditing for AI agents.

33 ms median evaluation latency: Measured across 250 observations, 3 independent sources, 84 claims on Apple M5. No additional LLM inference or model judge steps.

Dependency-aware: Detects when multiple retrieved context chunks repeat information from the same upstream source.

Local by default: A content-blind graph algorithm running entirely within your environment, with SQLite persistence and optional PostgreSQL deployment.

Quick Start

Install the Python package:

pip install omneum

Run the included demo:

python -m omneum.demo

Create evaluate.py to evaluate three observations against a single claim. Two sources reference the same upstream document.

import omneum
from omneum.explanations import explain_evaluation

observations = [
    {
        "url": "https://a.example",
        "value": 4200000000,
        "claim": {
            "entity_namespace": "company",
            "entity": "acme",
            "attribute": "fy2025_gross_revenue",
        },
        "upstream": ["https://sec.example"],
    },
    {
        "url": "https://b.example",
        "value": 4200000000,
        "claim": {
            "entity_namespace": "company",
            "entity": "acme",
            "attribute": "fy2025_gross_revenue",
        },
        "upstream": ["https://sec.example"],
    },
    {
        "url": "https://c.example",
        "value": 4200000000,
        "claim": {
            "entity_namespace": "company",
            "entity": "acme",
            "attribute": "fy2025_gross_revenue",
        },
        "upstream": [],
    },
]

result = omneum.evaluate(observations)
print(explain_evaluation(result))

Run:

python evaluate.py

Output:

Omneum Evaluation
Evaluation latency: 1.6 ms

Fy2025 gross revenue

  4200000000
  Support: 0.67
  Supporting sources: 3
  Estimated independent support: 2.00
  Dependency signal coverage: 1.00

  Explanation:
    3 sources support this claim, with an estimated 2.00 independent sources. The available dependency signals indicate that some supporting sources are related.

evaluate() runs Omneum's graph-based evaluation algorithm in-process; it computes source reliability and claim support scores, adjusting for dependencies between sources.

For raw retrieval text, use the optional extract_observations() API to extract structured claims with an LLM before evaluation. See Python SDK.

Why Omneum and how it works

Modern agent pipelines use several different techniques to decide what context should reach a model:

Semantic similarity (Vector DBs). The piece of text that looks closest to the prompt wins.

Semantic reranking. Retrieved context is reordered based on how relevant it is to the query.

LLM-as-a-Judge. An LLM reads the retrieved context and is instructed to evaluate it against a set of instructions.

These techniques can be highly effective at selecting context, but relevance is only one dimension of context quality.

Chunks can still hold conflicting or stale information. Multiple retrieved chunks might not be deduplicated or appear independent despite sharing an upstream source. This contributes to context bloat: low-quality information consumes context-window capacity that could otherwise be used for higher quality information.

Omneum addresses many of these limitations: it uses a graph-based mathematical analysis to model the relationships between claims and their supporting sources. Importantly, this analysis does not naively assume every source has derived its information independently. The same information often propagates across multiple sources. Without dependency tracking, an agent cannot distinguish five independent observations from the same information repeated five times.

Agent pipelines already handle structured metadata alongside retrieved context. Omneum uses available provenance and lineage metadata to estimate source dependencies, then incorporates those estimates into its calculation of source reliability and claim support scores.

These scores are computed without interpreting the semantic meaning of the context. For instance, when considering a claim such as:

“Acme reported $4.2 billion in revenue in 2025.”

Its support score depends on the reliability of the sources supporting it. In turn, those sources receive reliability from the claims they support.

This definition seems circular, and it is. Nonetheless, it yields a well-defined notion of reliability that helps distinguish strongly supported context from weakly supported context.

Omneum uses BRAID, its open-source algorithm, to compute these reliability and support scores. Explore the algorithm and research →

Where Omneum fits

Omneum runs locally through its Python SDK or as a Model Context Protocol (MCP) server. It adds a lightweight post-retrieval evaluation layer to your existing retrieval or ranking stack; no inference request, no extra model call.

Retrieval / tools → Reranking (optional) → Omneum evaluation → agent control flow → LLM

Omneum returns context-quality signals; your agent makes evidence-aware decisions throughout its workflow.

Architecture and design →

MCP Installation

Note: This tutorial assumes Python 3.11–3.14. SDKs for other languages are not currently supported.

Supported Platforms:

Platform Supported
macOS (Apple Silicon / arm64) ✅
macOS (Intel / x86_64) ✅
Linux (Ubuntu 22.04+ / x86_64) ✅
1. Install the local evaluator

Run the installer to configure the local evaluator:

omneum install

Run omneum install from your normal login account. Don't run the command with sudo.

The installer runs unprivileged while it downloads and verifies the evaluator release. The daemon version is pinned to the installed Python package version. For example, Omneum 1.0.3 only accepts daemon assets from v1.0.3; it doesn't resolve latest or fall back to another release.

The archive is verified against the release SHA256SUMS before installation. A missing checksum, mismatched digest, unexpected archive entry, link, or path traversal stops the install before anything from the archive runs.

Administrator access is requested only when installing machine-level service files. On Ubuntu, this includes the managed runtime under:

/opt/omneum

and public client configuration at:

/etc/omneum/config.toml

The evaluator runs as a system service because its VOPRF private key is isolated from the login account and MCP process. On macOS it runs under launchd; on Ubuntu it runs under systemd with a separate service identity.

omneum-server connects MCP clients to the installed local service. The installer finishes by sending a VOPRF request through that path and verifying the response against the configured public key. A running service alone does not count as a successful installation.

See docs/guides/installation.md for service accounts, sockets, installed paths, custom endpoints, and failure handling.

2. Connect an MCP client

Add Omneum to your MCP client configuration:

{
  "mcpServers": {
    "omneum": {
      "command": "omneum-server"
    }
  }
}

Restart your MCP client to expose Omneum's tools to your agent.

If your MCP client cannot find omneum-server, set command to the absolute path returned by command -v omneum-server.

3. Verify the connection

Ask your agent to call Omneum's ping tool. A successful response returns "status": "ok", confirming that your agent can reach the Omneum MCP server.

Running an Evaluation

Evaluate retrieved context using Omneum's Python SDK and local MCP server.

1. Map retrieved context

Use ContextMapper to map retrieved records into Omneum observations. The example uses three sources, two of which reference the same upstream document.

import asyncio
from datetime import datetime, timezone

from omneum.mcp import StdioServerParameters
from omneum import (
    ContextMapper,
    OmneumClientConfig,
    Source,
    open_stdio_client,
)

now = datetime.now(timezone.utc)

records = [
    {
        "id": "obs-1",
        "url": "https://example.com/report-a",
        "value": 4_200_000_000,
        "upstream": ["https://example.com/filing"],
        "observed_at": now,
    },
    {
        "id": "obs-2",
        "url": "https://example.org/report-b",
        "value": 4_200_000_000,
        "upstream": ["https://example.com/filing"],
        "observed_at": now,
    },
    {
        "id": "obs-3",
        "url": "https://example.net/report-c",
        "value": 4_200_000_000,
        "upstream": [],
        "observed_at": now,
    },
]

mapper = ContextMapper(
    source=lambda r: Source(kind="web_document", identifier=r["url"]),
    entity_namespace=lambda r: "company",
    entity=lambda r: "acme",
    attribute=lambda r: "fy2025_gross_revenue",
    value="value",
    observation_id="id",
    observed_at="observed_at",
    upstream_sources=lambda r: [
        {"kind": "web_document", "identifier": url}
        for url in r["upstream"]
    ],
)

The SDK handles canonicalization. See Canonicalization.

2. Evaluate context

Connect to omneum-server and call evaluate_mapped():

async def main():
    config = OmneumClientConfig.from_local_deployment()
    server = StdioServerParameters(command="omneum-server")

    async with open_stdio_client(config, server=server) as client:
        evaluation = await client.evaluate_mapped(
            records,
            mapper,
        )
        print(evaluation.explanation)


asyncio.run(main())

Save both Python blocks in evaluate_mcp.py, then run:

python evaluate_mcp.py
3. Evaluation results

evaluation.explanation formats the evaluation result for inspection.

Omneum Evaluation
Evaluation latency: 10.6 ms

Fy2025 gross revenue

  4200000000
  Support: 0.67
  Supporting sources: 3
  Estimated independent support: 2.00
  Dependency signal coverage: 1.00

  Explanation:
    3 sources support this claim, with an estimated 2.00 independent sources. The available dependency signals indicate that some supporting sources are related.

Three sources report the same value, but two reference a shared upstream document. Omneum identifies this dependency and estimates 2.00 independent supporting sources instead of treating all three as independent evidence.

An agent can use this result to trigger additional retrieval or route execution back to a verification step before generating a response.

See Evaluation schema for result fields.

Integrations

Use the Python SDK and ContextMapper to add Omneum to your agent.

Framework examples:

For a complete framework-independent workflow, see the enterprise policy example.

Optional: Contribute to the Omneum Network (Closed Beta)

Omneum runs locally by default. You can opt in to contribute observations to the shared Omneum Context Graph without uploading raw context.

Network contributions help build a shared evidence base across agent deployments, extending the Context Graph beyond any single installation.

Contributions use privacy-preserving cryptographic linkage via an RFC 9497 VOPRF. Network contribution is disabled by default. Local evaluation works without it.

Hosted Network enrollment is currently limited to approved beta participants.

See Enable Network contribution (MCP) to get started, or How Network contribution works for technical details.

Data Model & Evaluation

Observations

Context is more than a collection of text chunks. Omneum represents information encountered by an agent as observations — immutable records that preserve structured data and its provenance. The first supported type, an assertion observation, records a claim, its source, and the metadata needed to evaluate it.

Observation(
    observation_id="obs-1",
    source=source,
    claim=claim,
    observed_at=datetime.now(timezone.utc),
)

Observations retain available provenance and metadata, including source ownership, timestamps, citations, upstream source relationships, and assertion lineage. Multiple assertion observations can support the same claim or report conflicting values without being merged or overwritten. Observations are not generated judgments about what is true: they preserve the evidence as reported.

Observations docs →

Sources

Sources identify where an assertion originated. Each source has a kind and a canonical identifier for recognizing the same source across multiple observations. Sources can represent web documents, databases, internal services, or other information providers.

Source(
    kind="web_document",
    identifier="https://example.com/acme-filing",
)

Sources docs →

Claims

Claims represent specific assertions extracted from retrieved context, such as text chunks and tool outputs. Each claim consists of an entity_namespace, entity, attribute, and value. An integrating agent or retrieval pipeline extracts these fields, and ContextMapper maps them into Omneum's data model.

Claim(
    entity_namespace="company",
    entity="acme",
    attribute="fy2025_gross_revenue",
    value=4_200_000_000,
)

Claims docs →

Source Dependence

Multiple sources can report the same claim without providing independent support. Omneum estimates source dependence from upstream lineage, citations, assertion lineage, shared ownership, timestamps, and graph structure.

Estimated source dependencies adjust the contribution of related sources when calculating independent support for each claim.

Source dependence docs →

ContextMapper

ContextMapper maps structured data from agent and retrieval pipelines into Omneum's observation model. It defines how source identifiers, claim fields, timestamps, and provenance metadata are read from existing records.

ContextMapper docs →

ContextEvaluation

ContextEvaluation returns source reliability and claim support scores adjusted for source dependence, alongside conflict and provenance information.

evaluation = await client.evaluate_mapped(
    records,
    mapper,
)
print(evaluation.explanation)

ContextEvaluation docs →

Performance & Accuracy

Evaluated on 24 held-out cases across six domains: coding agents, enterprise RAG, research and analysis agents, multi-agent systems, data analytics agents, and support and operations agents.

Semantic Rerankers

Measures how Omneum improves evidence selection when combined with semantic rerankers across diverse agent workflows.

Semantic Reranker Selection Precision

Configuration Precision ↑ Recall ↑ Answer Accuracy ↑ Selection p50 ↓ E2E p50 ↓ Generator Tokens ↓ Generator Cost ↓
BGE Reranker v2-m3 69.44% 47.46% 91.67% 201 ms 2.467s 11,941 $0.074618
BGE + Omneum 85.51% 59.31% 87.50% 660 ms 3.020s 11,595 $0.070662
Cohere Rerank v4.0 Pro 77.78% 53.99% 87.50% 151 ms 2.634s 11,577 $0.071242
Cohere + Omneum 82.64% 55.72% 79.17% 624 ms 3.176s 11,535 $0.070654

Costs reflect estimated downstream generator API usage only; reranker API charges and local compute are excluded. Omneum improves selection precision and recall in both comparisons.

Frontier LLM Judges

Each LLM judge is evaluated alongside Omneum under the same model-specific benchmark configuration.

Frontier LLM Judge Selection Latency

Configuration Precision ↑ Recall ↑ Answer Accuracy ↑ Selection p50 ↓ E2E p50 ↓ Generator Tokens ↓ Generator Cost ↓
BGE + Claude Sonnet 5.5 Judge 92.36% 65.24% 95.83% 1.831s 4.165s 11,356 $0.068208
BGE + Omneum 86.11% 59.34% 91.67% 0.697s 3.141s 11,811 $0.072822
BGE + GPT-6 Astra Judge 92.78% 65.45% 92.50% 3.421s 5.849s 111,247 $0.658998
BGE + Omneum 86.11% 59.34% 91.67% 0.641s 2.983s 115,119 $0.698310
BGE + Gemini 3.8 Flash Judge 94.44% 66.28% 95.83% 2.487s 4.924s 114,250 $0.686916
BGE + Omneum 86.11% 59.34% 91.67% 0.639s 3.130s 115,535 $0.702470

Costs reflect estimated downstream generator API usage only; LLM judge inference costs and local compute are excluded. Omneum achieves competitive selection quality and downstream answer accuracy against frontier LLM judges, with 2.6–5.3× lower selection latency and no additional LLM inference step.

Detailed evaluations: Methodology · Coding Agents · Enterprise RAG · Research Agents · Multi-Agent Systems · Data Analytics · Support Operations

Production

Omneum uses SQLite as its default local storage backend. PostgreSQL is supported for deployments that use an external database.

Component Implementation
MCP server Local omneum-server process
Evaluator Managed local daemon
Local database SQLite
Graph model Relational source, claim, observation, and dependency tables
External database PostgreSQL
Graph extension Apache AGE
Service manager launchd on macOS; systemd on Ubuntu
Cryptography RFC 9497 VOPRF, Ristretto255-SHA512

Local installations create context.db automatically:

macOS
~/Library/Application Support/Omneum/context.db

Linux
~/.local/share/omneum/context.db

For a new default graph with unsafe data-directory ancestors, Omneum uses ~/.omneum/data/context.db. Existing graphs and explicit paths are never silently relocated; shared directory permissions are preserved.

PostgreSQL can be configured for deployments that use an external database. Apache AGE provides the graph projection for PostgreSQL deployments.

See docs/storage.md for the storage schema and deployment options.

Security & Privacy

Omneum evaluates context locally. omneum-server, the evaluator daemon, and context.db run within the local environment.

Component Boundary
Context Passed to the local evaluation path
Context graph Stored in local context.db
VOPRF private key Held by the evaluator daemon
MCP process Cannot read the evaluator's private key
Source payloads Not required in the graph
Omneum Network Optional contribution through the ingestion API

Omneum persists the local context graph across MCP sessions.

application data
      │
      ▼
  omneum-server
      │
      ├── evaluator daemon
      │
      └── context.db

Local persistence and Omneum Network contribution are configured independently.

Option Behavior
Local persistence Writes observations to context.db
Network contribution Sends pseudonymous observations to the Omneum Network through the ingestion API

See Omneum Network for Network contribution and Local Persistence for Context Graph storage.

External Evaluations

External evaluations are published with the test inputs and Omneum outputs in evaluations/.

SearchTS. SearchTS 0.13.0 returned the same Go 1.22 claim from thenewstack.io through curl_cffi and go.dev through stealth-browser. Omneum received the original final_url and fetched_at values for both captures. The evaluation returned 2.00 estimated independent support, pairwise dependency 0.0000, and dependency-signal coverage 0.25. Results →

Bastra Recall. Recall ran Omneum 1.0.3 dependency-estimator-v4 against a 30-memory synthetic harness. Four memories sharing one upstream source collapsed to 1.0 effective independent support; three independent sources remained at 3.0. A temporal-only sweep moved continuously from 2.5 effective sources at identical timestamps to 3.0 at 48 hours. The evaluation also exposed an open lineage-chain case where v1 → v2 → v3 → v4 produces 1.6 rather than 1.0 because dependency is currently computed only across direct lineage edges. Results →

Contributing

Contributions are welcome. See CONTRIBUTING.md.

If you find a security issue, please follow the private reporting process in SECURITY.md instead of opening a public issue.

License

Omneum is open source under the MIT License.

1<!-- mcp-name: ai.omneum/omneum -->
2# What is Omneum
3 
4<p align="center">
5 <img src="https://raw.githubusercontent.com/cole-h06/omneum/main/assets/omneum-logotype-white-bg.png" alt="Omneum" width="240">
6</p>
7 
8<p align="center">
9 An open-source context evaluator for AI agents.
10</p>
11 
12<p align="center">
13 <a href="https://github.com/cole-h06/omneum/actions/workflows/CI.yml">
14 <img src="https://github.com/cole-h06/omneum/actions/workflows/CI.yml/badge.svg" alt="CI">
15 </a>
16 <a href="https://pypi.org/project/omneum/">
17 <img src="https://img.shields.io/pypi/v/omneum?refresh=20261012" alt="PyPI">
18 </a>
19 <img src="https://img.shields.io/badge/Python-3.11%E2%80%933.14-blue" alt="Python 3.11–3.14">
20 <a href="LICENSE">
21 <img src="https://img.shields.io/badge/License-MIT-yellow" alt="MIT License">
22 </a>
23</p>
24 
25Agents routinely assemble context from many different sources — a RAG pipeline, web search, APIs, databases, files, memory systems, other agents — but stuffing dozens of raw chunks into a single context window can leave the model working through a mess of information that was never organized for it.
26 
27Most agents focus on retrieving more context. Omneum is focused on making sure the context reaching the model is clean and reliable.
28 
29**⚡ Fast context auditing for AI agents.**
30 
31**33 ms median evaluation latency:** Measured across 250 observations, 3 independent sources, 84 claims on Apple M5. No additional LLM inference or model judge steps.
32 
33**Dependency-aware:** Detects when multiple retrieved context chunks repeat information from the same upstream source.
34 
35**Local by default:** A content-blind graph algorithm running entirely within your environment, with SQLite persistence and optional PostgreSQL deployment.
36 
37## Quick Start
38 
39Install the Python package:
40 
41```bash
42pip install omneum
43```
44 
45Run the included demo:
46 
47```bash
48python -m omneum.demo
49```
50 
51Create `evaluate.py` to evaluate three observations against a single claim. Two sources reference the same upstream document.
52 
53```python
54import omneum
55from omneum.explanations import explain_evaluation
56 
57observations = [
58 {
59 "url": "https://a.example",
60 "value": 4200000000,
61 "claim": {
62 "entity_namespace": "company",
63 "entity": "acme",
64 "attribute": "fy2025_gross_revenue",
65 },
66 "upstream": ["https://sec.example"],
67 },
68 {
69 "url": "https://b.example",
70 "value": 4200000000,
71 "claim": {
72 "entity_namespace": "company",
73 "entity": "acme",
74 "attribute": "fy2025_gross_revenue",
75 },
76 "upstream": ["https://sec.example"],
77 },
78 {
79 "url": "https://c.example",
80 "value": 4200000000,
81 "claim": {
82 "entity_namespace": "company",
83 "entity": "acme",
84 "attribute": "fy2025_gross_revenue",
85 },
86 "upstream": [],
87 },
88]
89 
90result = omneum.evaluate(observations)
91print(explain_evaluation(result))
92```
93 
94Run:
95 
96```bash
97python evaluate.py
98```
99 
100Output:
101 
102```text
103Omneum Evaluation
104Evaluation latency: 1.6 ms
105 
106Fy2025 gross revenue
107 
108 4200000000
109 Support: 0.67
110 Supporting sources: 3
111 Estimated independent support: 2.00
112 Dependency signal coverage: 1.00
113 
114 Explanation:
115 3 sources support this claim, with an estimated 2.00 independent sources. The available dependency signals indicate that some supporting sources are related.
116```
117 
118`evaluate()` runs Omneum's graph-based evaluation algorithm in-process; it computes source reliability and claim support scores, adjusting for dependencies between sources.
119 
120For raw retrieval text, use the optional `extract_observations()` API to extract structured claims with an LLM before evaluation. See [Python SDK](docs/sdk.md#extract-assertions-from-text).
121 
122 
123## Why Omneum and how it works
124 
125Modern agent pipelines use several different techniques to decide what context should reach a model:
126 
127**Semantic similarity (Vector DBs).** The piece of text that *looks* closest to the prompt wins.
128 
129**Semantic reranking.** Retrieved context is reordered based on how relevant it is to the query.
130 
131**LLM-as-a-Judge.** An LLM reads the retrieved context and is instructed to evaluate it against a set of instructions.
132 
133These techniques can be highly effective at selecting context, but relevance is only one dimension of context quality.
134 
135Chunks can still hold conflicting or stale information. Multiple retrieved chunks might not be deduplicated or appear independent despite sharing an upstream source. This contributes to context bloat: low-quality information consumes context-window capacity that could otherwise be used for higher quality information.
136 
137Omneum addresses many of these limitations: it uses a graph-based mathematical analysis to model the relationships between claims and their supporting sources. Importantly, this analysis does not naively assume every source has derived its information independently. The same information often propagates across multiple sources. Without dependency tracking, an agent cannot distinguish five independent observations from the same information repeated five times.
138 
139Agent pipelines already handle structured metadata alongside retrieved context. Omneum uses available provenance and lineage metadata to estimate source dependencies, then incorporates those estimates into its calculation of source reliability and claim support scores.
140 
141These scores are computed without interpreting the semantic meaning of the context. For instance, when considering a claim such as:
142 
143**“Acme reported $4.2 billion in revenue in 2025.”**
144 
145Its support score depends on the reliability of the sources supporting it. In turn, those sources receive reliability from the claims they support.
146 
147This definition seems circular, and it is. Nonetheless, it yields a well-defined notion of reliability that helps distinguish strongly supported context from weakly supported context.
148 
149Omneum uses **BRAID**, its open-source algorithm, to compute these reliability and support scores. [Explore the algorithm and research →](https://github.com/cole-h06/braid)
150 
151## Where Omneum fits
152 
153Omneum runs locally through its Python SDK or as a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server. It adds a lightweight post-retrieval evaluation layer to your existing retrieval or ranking stack; no inference request, no extra model call.
154 
155**Retrieval / tools → Reranking (optional) → Omneum evaluation → agent control flow → LLM**
156 
157Omneum returns context-quality signals; your agent makes evidence-aware decisions throughout its workflow.
158 
159[Architecture and design →](docs/architecture.md)
160 
161## MCP Installation
162 
163**Note:** This tutorial assumes Python 3.11–3.14. SDKs for other languages are not currently supported.
164 
165**Supported Platforms:**
166 
167| Platform | Supported |
168| --- | :---: |
169| macOS (Apple Silicon / arm64) | ✅ |
170| macOS (Intel / x86_64) | ✅ |
171| Linux (Ubuntu 22.04+ / x86_64) | ✅ |
172 
173### 1. Install the local evaluator
174 
175Run the installer to configure the local evaluator:
176 
177```bash
178omneum install
179```
180 
181Run `omneum install` from your normal login account. Don't run the command with `sudo`.
182 
183The installer runs unprivileged while it downloads and verifies the evaluator release. The daemon version is pinned to the installed Python package version. For example, Omneum `1.0.3` only accepts daemon assets from `v1.0.3`; it doesn't resolve `latest` or fall back to another release.
184 
185The archive is verified against the release `SHA256SUMS` before installation. A missing checksum, mismatched digest, unexpected archive entry, link, or path traversal stops the install before anything from the archive runs.
186 
187Administrator access is requested only when installing machine-level service files. On Ubuntu, this includes the managed runtime under:
188 
189```text
190/opt/omneum
191```
192 
193and public client configuration at:
194 
195```text
196/etc/omneum/config.toml
197```
198 
199The evaluator runs as a system service because its VOPRF private key is isolated from the login account and MCP process. On macOS it runs under `launchd`; on Ubuntu it runs under systemd with a separate service identity.
200 
201`omneum-server` connects MCP clients to the installed local service. The installer finishes by sending a VOPRF request through that path and verifying the response against the configured public key. A running service alone does not count as a successful installation.
202 
203See [`docs/guides/installation.md`](docs/guides/installation.md) for service accounts, sockets, installed paths, custom endpoints, and failure handling.
204 
205### 2. Connect an MCP client
206 
207Add Omneum to your MCP client configuration:
208 
209```json
210{
211 "mcpServers": {
212 "omneum": {
213 "command": "omneum-server"
214 }
215 }
216}
217```
218 
219Restart your MCP client to expose Omneum's tools to your agent.
220 
221If your MCP client cannot find `omneum-server`, set `command` to the absolute path returned by `command -v omneum-server`.
222 
223### 3. Verify the connection
224 
225Ask your agent to call Omneum's `ping` tool. A successful response returns `"status": "ok"`, confirming that your agent can reach the Omneum MCP server.
226 
227## Running an Evaluation
228 
229Evaluate retrieved context using Omneum's Python SDK and local MCP server.
230 
231### 1. Map retrieved context
232 
233Use `ContextMapper` to map retrieved records into Omneum observations. The example uses three sources, two of which reference the same upstream document.
234 
235```python
236import asyncio
237from datetime import datetime, timezone
238 
239from omneum.mcp import StdioServerParameters
240from omneum import (
241 ContextMapper,
242 OmneumClientConfig,
243 Source,
244 open_stdio_client,
245)
246 
247now = datetime.now(timezone.utc)
248 
249records = [
250 {
251 "id": "obs-1",
252 "url": "https://example.com/report-a",
253 "value": 4_200_000_000,
254 "upstream": ["https://example.com/filing"],
255 "observed_at": now,
256 },
257 {
258 "id": "obs-2",
259 "url": "https://example.org/report-b",
260 "value": 4_200_000_000,
261 "upstream": ["https://example.com/filing"],
262 "observed_at": now,
263 },
264 {
265 "id": "obs-3",
266 "url": "https://example.net/report-c",
267 "value": 4_200_000_000,
268 "upstream": [],
269 "observed_at": now,
270 },
271]
272 
273mapper = ContextMapper(
274 source=lambda r: Source(kind="web_document", identifier=r["url"]),
275 entity_namespace=lambda r: "company",
276 entity=lambda r: "acme",
277 attribute=lambda r: "fy2025_gross_revenue",
278 value="value",
279 observation_id="id",
280 observed_at="observed_at",
281 upstream_sources=lambda r: [
282 {"kind": "web_document", "identifier": url}
283 for url in r["upstream"]
284 ],
285)
286```
287 
288The SDK handles canonicalization. See [Canonicalization](docs/canonicalization.md).
289 
290### 2. Evaluate context
291 
292Connect to `omneum-server` and call `evaluate_mapped()`:
293 
294```python
295async def main():
296 config = OmneumClientConfig.from_local_deployment()
297 server = StdioServerParameters(command="omneum-server")
298 
299 async with open_stdio_client(config, server=server) as client:
300 evaluation = await client.evaluate_mapped(
301 records,
302 mapper,
303 )
304 print(evaluation.explanation)
305 
306 
307asyncio.run(main())
308```
309 
310Save both Python blocks in `evaluate_mcp.py`, then run:
311 
312```bash
313python evaluate_mcp.py
314```
315 
316### 3. Evaluation results
317 
318`evaluation.explanation` formats the evaluation result for inspection.
319 
320```text
321Omneum Evaluation
322Evaluation latency: 10.6 ms
323 
324Fy2025 gross revenue
325 
326 4200000000
327 Support: 0.67
328 Supporting sources: 3
329 Estimated independent support: 2.00
330 Dependency signal coverage: 1.00
331 
332 Explanation:
333 3 sources support this claim, with an estimated 2.00 independent sources. The available dependency signals indicate that some supporting sources are related.
334```
335 
336Three sources report the same value, but two reference a shared upstream document. Omneum identifies this dependency and estimates 2.00 independent supporting sources instead of treating all three as independent evidence.
337 
338An agent can use this result to trigger additional retrieval or route execution back to a verification step before generating a response.
339 
340See [Evaluation schema](docs/architecture.md#evaluation-results) for result fields.
341 
342## Integrations
343 
344Use the [Python SDK](docs/sdk.md) and [ContextMapper](docs/context-mapper.md) to add Omneum to your agent.
345 
346Framework examples:
347 
348- [LangGraph](examples/langgraph/)
349- [LlamaIndex](examples/llamaindex/)
350- [CrewAI](examples/crewai/)
351- [OpenAI Agents SDK](examples/openai_agents/)
352- [Microsoft Agent Framework](examples/microsoft/)
353- [Google ADK](examples/google_adk/)
354 
355For a complete framework-independent workflow, see the
356[enterprise policy example](examples/enterprise/).
357 
358### Optional: Contribute to the Omneum Network (Closed Beta)
359 
360Omneum runs locally by default. You can opt in to contribute observations to the shared Omneum Context Graph without uploading raw context.
361 
362Network contributions help build a shared evidence base across agent deployments, extending the Context Graph beyond any single installation.
363 
364Contributions use privacy-preserving cryptographic linkage via an RFC 9497 VOPRF. Network contribution is disabled by default. Local evaluation works without it.
365 
366Hosted Network enrollment is currently limited to approved beta participants.
367 
368See [Enable Network contribution (MCP)](docs/guides/configuration.md#mcp-configuration) to get started, or [How Network contribution works](docs/context-graph.md#omneum-network) for technical details.
369 
370## Data Model & Evaluation
371 
372### Observations
373 
374Context is more than a collection of text chunks. Omneum represents information encountered by an agent as **observations** — immutable records that preserve structured data and its provenance. The first supported type, an assertion observation, records a claim, its source, and the metadata needed to evaluate it.
375 
376```python
377Observation(
378 observation_id="obs-1",
379 source=source,
380 claim=claim,
381 observed_at=datetime.now(timezone.utc),
382)
383```
384 
385Observations retain available provenance and metadata, including source ownership, timestamps, citations, upstream source relationships, and assertion lineage. Multiple assertion observations can support the same claim or report conflicting values without being merged or overwritten. Observations are not generated judgments about what is true: they preserve the evidence as reported.
386 
387[Observations docs →](docs/architecture.md#observation)
388 
389### Sources
390 
391Sources identify where an assertion originated. Each source has a `kind` and a canonical `identifier` for recognizing the same source across multiple observations. Sources can represent web documents, databases, internal services, or other information providers.
392 
393```python
394Source(
395 kind="web_document",
396 identifier="https://example.com/acme-filing",
397)
398```
399 
400[Sources docs →](docs/architecture.md#source)
401 
402### Claims
403 
404Claims represent specific assertions extracted from retrieved context, such as text chunks and tool outputs. Each claim consists of an `entity_namespace`, `entity`, `attribute`, and `value`. An integrating agent or retrieval pipeline extracts these fields, and `ContextMapper` maps them into Omneum's data model.
405 
406```python
407Claim(
408 entity_namespace="company",
409 entity="acme",
410 attribute="fy2025_gross_revenue",
411 value=4_200_000_000,
412)
413```
414 
415[Claims docs →](docs/architecture.md#claim)
416 
417### Source Dependence
418 
419Multiple sources can report the same claim without providing independent support. Omneum estimates source dependence from upstream lineage, citations, assertion lineage, shared ownership, timestamps, and graph structure.
420 
421Estimated source dependencies adjust the contribution of related sources when calculating independent support for each claim.
422 
423[Source dependence docs →](docs/architecture.md#dependency-estimation)
424 
425### ContextMapper
426 
427`ContextMapper` maps structured data from agent and retrieval pipelines into Omneum's observation model. It defines how source identifiers, claim fields, timestamps, and provenance metadata are read from existing records.
428 
429[ContextMapper docs →](docs/context-mapper.md)
430 
431### ContextEvaluation
432 
433`ContextEvaluation` returns source reliability and claim support scores adjusted for source dependence, alongside conflict and provenance information.
434 
435```python
436evaluation = await client.evaluate_mapped(
437 records,
438 mapper,
439)
440print(evaluation.explanation)
441```
442 
443[ContextEvaluation docs →](docs/architecture.md#evaluation-results)
444 
445## Performance & Accuracy
446 
447Evaluated on **24 held-out cases across six domains**: coding agents, enterprise RAG, research and analysis agents, multi-agent systems, data analytics agents, and support and operations agents.
448 
449### Semantic Rerankers
450 
451Measures how Omneum improves evidence selection when combined with semantic rerankers across diverse agent workflows.
452 
453![Semantic Reranker Selection Precision](assets/benchmarks/semantic-reranker-selection-precision.png)
454 
455| Configuration | Precision ↑ | Recall ↑ | Answer Accuracy ↑ | Selection p50 ↓ | E2E p50 ↓ | Generator Tokens ↓ | Generator Cost ↓ |
456|---|---:|---:|---:|---:|---:|---:|---:|
457| BGE Reranker v2-m3 | 69.44% | 47.46% | 91.67% | 201 ms | 2.467s | 11,941 | $0.074618 |
458| BGE + Omneum | **85.51%** | **59.31%** | 87.50% | 660 ms | 3.020s | 11,595 | **$0.070662** |
459| Cohere Rerank v4.0 Pro | 77.78% | 53.99% | 87.50% | 151 ms | 2.634s | 11,577 | $0.071242 |
460| Cohere + Omneum | **82.64%** | **55.72%** | 79.17% | 624 ms | 3.176s | 11,535 | **$0.070654** |
461 
462*Costs reflect estimated downstream generator API usage only; reranker API charges and local compute are excluded. Omneum improves selection precision and recall in both comparisons.*
463 
464### Frontier LLM Judges
465 
466Each LLM judge is evaluated alongside Omneum under the same model-specific benchmark configuration.
467 
468![Frontier LLM Judge Selection Latency](assets/benchmarks/llm-judge-selection-latency.png)
469 
470| Configuration | Precision ↑ | Recall ↑ | Answer Accuracy ↑ | Selection p50 ↓ | E2E p50 ↓ | Generator Tokens ↓ | Generator Cost ↓ |
471|---|---:|---:|---:|---:|---:|---:|---:|
472| BGE + Claude Sonnet 5.5 Judge | **92.36%** | **65.24%** | **95.83%** | 1.831s | 4.165s | **11,356** | **$0.068208** |
473| BGE + Omneum | 86.11% | 59.34% | 91.67% | **0.697s** | **3.141s** | 11,811 | $0.072822 |
474| BGE + GPT-6 Astra Judge | **92.78%** | **65.45%** | **92.50%** | 3.421s | 5.849s | **111,247** | **$0.658998** |
475| BGE + Omneum | 86.11% | 59.34% | 91.67% | **0.641s** | **2.983s** | 115,119 | $0.698310 |
476| BGE + Gemini 3.8 Flash Judge | **94.44%** | **66.28%** | **95.83%** | 2.487s | 4.924s | **114,250** | **$0.686916** |
477| BGE + Omneum | 86.11% | 59.34% | 91.67% | **0.639s** | **3.130s** | 115,535 | $0.702470 |
478 
479*Costs reflect estimated downstream generator API usage only; LLM judge inference costs and local compute are excluded. Omneum achieves competitive selection quality and downstream answer accuracy against frontier LLM judges, with 2.6–5.3× lower selection latency and no additional LLM inference step.*
480 
481**Detailed evaluations:** [Methodology](benchmarks/README.md) · [Coding Agents](benchmarks/coding.md) · [Enterprise RAG](benchmarks/enterprise-rag.md) · [Research Agents](benchmarks/research.md) · [Multi-Agent Systems](benchmarks/multi-agent.md) · [Data Analytics](benchmarks/analytics.md) · [Support Operations](benchmarks/support.md)
482 
483## Production
484 
485Omneum uses SQLite as its default local storage backend. PostgreSQL is supported for deployments that use an external database.
486 
487| Component | Implementation |
488|---|---|
489| **MCP server** | Local `omneum-server` process |
490| **Evaluator** | Managed local daemon |
491| **Local database** | SQLite |
492| **Graph model** | Relational source, claim, observation, and dependency tables |
493| **External database** | PostgreSQL |
494| **Graph extension** | Apache AGE |
495| **Service manager** | `launchd` on macOS; systemd on Ubuntu |
496| **Cryptography** | RFC 9497 VOPRF, Ristretto255-SHA512 |
497 
498Local installations create `context.db` automatically:
499 
500```text
501macOS
502~/Library/Application Support/Omneum/context.db
503 
504Linux
505~/.local/share/omneum/context.db
506```
507 
508For a new default graph with unsafe data-directory ancestors, Omneum uses
509`~/.omneum/data/context.db`. Existing graphs and explicit paths are never
510silently relocated; shared directory permissions are preserved.
511 
512PostgreSQL can be configured for deployments that use an external database. Apache AGE provides the graph projection for PostgreSQL deployments.
513 
514See [`docs/storage.md`](docs/storage.md) for the storage schema and deployment options.
515 
516## Security & Privacy
517 
518Omneum evaluates context locally. `omneum-server`, the evaluator daemon, and `context.db` run within the local environment.
519 
520| Component | Boundary |
521|---|---|
522| **Context** | Passed to the local evaluation path |
523| **Context graph** | Stored in local `context.db` |
524| **VOPRF private key** | Held by the evaluator daemon |
525| **MCP process** | Cannot read the evaluator's private key |
526| **Source payloads** | Not required in the graph |
527| **Omneum Network** | Optional contribution through the ingestion API |
528 
529Omneum persists the local context graph across MCP sessions.
530 
531```text
532application data
533 │
534 ▼
535 omneum-server
536 │
537 ├── evaluator daemon
538 │
539 └── context.db
540```
541 
542Local persistence and Omneum Network contribution are configured independently.
543 
544| Option | Behavior |
545|---|---|
546| **Local persistence** | Writes observations to `context.db` |
547| **Network contribution** | Sends pseudonymous observations to the Omneum Network through the ingestion API |
548 
549See [Omneum Network](docs/context-graph.md#omneum-network) for Network contribution and [Local Persistence](docs/context-graph.md#local-persistence) for Context Graph storage.
550 
551## External Evaluations
552 
553External evaluations are published with the test inputs and Omneum outputs in [`evaluations/`](evaluations/).
554 
555**SearchTS.** SearchTS 0.13.0 returned the same Go 1.22 claim from `thenewstack.io` through `curl_cffi` and `go.dev` through `stealth-browser`. Omneum received the original `final_url` and `fetched_at` values for both captures. The evaluation returned `2.00` estimated independent support, pairwise dependency `0.0000`, and dependency-signal coverage `0.25`. [Results →](evaluations/searchts/)
556 
557**Bastra Recall.** Recall ran Omneum 1.0.3 `dependency-estimator-v4` against a 30-memory synthetic harness. Four memories sharing one upstream source collapsed to `1.0` effective independent support; three independent sources remained at `3.0`. A temporal-only sweep moved continuously from `2.5` effective sources at identical timestamps to `3.0` at 48 hours. The evaluation also exposed an open lineage-chain case where `v1 → v2 → v3 → v4` produces `1.6` rather than `1.0` because dependency is currently computed only across direct lineage edges. [Results →](evaluations/bastra-recall/)
558 
559## Contributing
560 
561Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
562 
563If you find a security issue, please follow the private reporting process in [SECURITY.md](SECURITY.md) instead of opening a public issue.
564 
565## License
566 
567Omneum is open source under the [MIT License](LICENSE).

Discussion

Alternatives

AI engineerAct as an expert AI engineer specializing in practical machine learning implementation and AI integration for production applications, ensuring efficient and robust AI solutions.Data & AI · CC0-1.0OneKGPd: Individual-Level Queries over the 1000 Genomes ProjectQuery the 1000 Genomes Project dataset (3,202 whole-genome-sequenced individuals, GRCh38) at the level of individual participants. Use when a question is about individuals or variants in the 1000 Genomes Project cohort: which individuals carry variants matching specific criteria in a gene or region, which individuals are homozygous-reference at a position, which variants exist in the dataset or carried by specified individuals in a gene or region, the relatedness between two specified individuals. Variants are returned with 1000 Genomes allele frequencies (AF), gnomAD v4.1 exome and genome AF, AlphaMissense score, and HGVSp annotations.Science · MITPyMC Bayesian ModelingBayesian modeling with PyMC. Build hierarchical models, MCMC (NUTS), variational inference, LOO/WAIC comparison, posterior checks, for probabilistic programming and inference.Science · MITStatsmodels: Statistical Modeling and EconometricsStatistical models library for Python. Use when you need specific model classes (OLS, GLM, mixed models, ARIMA) with detailed diagnostics, residuals, and inference. Best for econometrics, time series, rigorous inference with coefficient tables. For guided statistical test selection with APA reporting use statistical-analysis.Science · MIT