Skip to main content

Quality observability for RAG and agents — Brazilian-Portuguese vertical with claim-by-claim hallucination diagnosis, trajectory quality, tool-use correctness, and goal completion metrics.

Project description

aferiq-eval

PyPI Python License

Quality observability for RAG and agents — vertical for the Brazilian market. PT-BR judge prompts hand-tuned for BR patterns (Lei nº, CNPJ/CPF, Receita Federal, INSS, BACEN, ANPD), claim-by-claim hallucination diagnosis, trajectory + tool-use evaluation for LangGraph / AgentExecutor / OpenAI Assistants.

The internal Python namespace is rageval (legacy from when the library was called RAG Eval BR). It will be renamed to aferiq_eval in v0.2.0 with a 90-day import alias. For now, pip install aferiq-eval then from rageval import ….

Install

pip install aferiq-eval

# Optional integrations:
pip install 'aferiq-eval[langchain]'      # LangChain (RAG + AgentExecutor)
pip install 'aferiq-eval[langgraph]'      # LangGraph
pip install 'aferiq-eval[openai]'         # OpenAI SDK + Assistants
pip install 'aferiq-eval[anthropic]'      # Anthropic SDK

RAG eval (single-turn)

from rageval import evaluate

result = evaluate(
    queries=["Qual o prazo do CDC pra arrependimento?"],
    contexts=[["Art. 49 do CDC: o consumidor pode desistir em 7 dias."]],
    answers=["O CDC garante 7 dias contados do recebimento."],
    metrics=["faithfulness", "hallucination"],
    language="pt",  # default
)

print(result)            # rich-rendered table
result.to_dict()         # JSON-friendly
result.aggregate         # {"faithfulness": 0.95, "hallucination": 0.92}

Decorator capture

from rageval import trace, register_trace_handler
from rageval.client import CloudClient

# Ship every captured trace to aferiq cloud:
register_trace_handler(CloudClient.from_env().send)  # uses RAGEVAL_API_KEY

@trace
def my_rag(query: str, context: list[str]) -> str:
    chunks = retriever.search(query)
    return llm.generate(query, chunks)

# every call is automatically captured + shipped
my_rag("Qual o aviso prévio mínimo na CLT?", ["..."])

Agent eval (multi-step)

For LangChain AgentExecutor, LangGraph state machines, or OpenAI Assistants — no decorator needed. Run your application under aferiq-trace-run, attach the agent callback, and full trajectories (LLM calls + tool calls + tokens + latency) get captured automatically.

aferiq-trace-run python my_agent.py
from rageval.integrations.agent_callback import AferiqAgentCallbackHandler

handler = AferiqAgentCallbackHandler(goal="Qual o prazo do CDC?")
agent_executor.invoke(
    {"input": "Qual o prazo do CDC?"},
    config={"callbacks": [handler]},
)
# handler.last_trace is an AgentTrace; also broadcast to registered handlers

The dashboard at https://aferiq.com.br auto-detects trace shape: agent runs render as a step-by-step tree; RAG traces render claim-by-claim with PT-BR categorisation (lei_inventada, cnpj_fabricado, etc.).

CLI

export OPENAI_API_KEY=sk-...

# RAG eval
aferiq-eval evaluate --dataset rag_traces.jsonl --metrics faithfulness,hallucination

# Agent eval
aferiq-eval evaluate-agent --dataset agent_traces.jsonl \
    --metrics trajectory_quality,goal_completion,cost_efficiency

Examples

Runnable demos under examples/:

  • langchain_agent_executor.py — calculator + search agent
  • langgraph_agent.py — state-machine agent
  • openai_assistants.py — Assistants API streaming

Supported judge models

Anything litellm supports — OpenAI, Anthropic, Google, Maritaca Sabiá, Ollama. Default: gpt-4o-mini (cheapest with acceptable quality on PT-BR judging).

Caching

By default, identical (prompt, model, temperature) tuples are cached on disk under ~/.cache/rageval. Repeated evals don't re-call the LLM.

from rageval.cache import DiskCache, MemoryCache, NullCache

DiskCache()                          # default location
DiskCache("/custom/path")            # custom location
MemoryCache()                        # in-process, tests
NullCache()                          # disable caching

Dev

git clone https://github.com/leo94pena/rag_eval
cd rag_eval/packages/lib
pip install -e ".[dev]"

pytest --cov=rageval         # tests
ruff check src tests         # lint
mypy --strict src            # type-check

Documentation

  • Full docs: https://docs.aferiq.com.br (coming soon)
  • Issues + roadmap: https://github.com/ileoh/aferiq/issues
  • LGPD + data handling: auth in São Paulo (Supabase) · traces in ClickHouse Cloud us-east-1 under SCC + signed DPA per LGPD Art. 33 · redact_pii=True flag strips CPF/CNPJ/email/phone before transmission · TLS in transit · AES-256-GCM at rest for sensitive fields.

License

Proprietary — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aferiq_eval-0.2.1.tar.gz (91.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aferiq_eval-0.2.1-py3-none-any.whl (71.9 kB view details)

Uploaded Python 3

File details

Details for the file aferiq_eval-0.2.1.tar.gz.

File metadata

  • Download URL: aferiq_eval-0.2.1.tar.gz
  • Upload date:
  • Size: 91.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aferiq_eval-0.2.1.tar.gz
Algorithm Hash digest
SHA256 a5edc5a0628ff490883bda9c1e9cdff350d4d3418ee63905ab921bab5dde7f8a
MD5 8d2e61d5a3bd82a8b239b96d9d217f2f
BLAKE2b-256 5cb7827bf7d2246783a7176941f85fa2a5be1d057793b3f1148c4f8a0dda9ac3

See more details on using hashes here.

Provenance

The following attestation bundles were made for aferiq_eval-0.2.1.tar.gz:

Publisher: release-lib.yml on ileoh/aferiq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aferiq_eval-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: aferiq_eval-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 71.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aferiq_eval-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 69898b0c7d5f9cbba1845bc0c85b0c185e398abc4de6ab040d64b4f8e6854a53
MD5 936edb3dc00f9a49e4c284f6ede76832
BLAKE2b-256 6e8ae8289d86ece53139c2e369b390bfa2db12dfaf0791e5e4aa9909466c0cdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for aferiq_eval-0.2.1-py3-none-any.whl:

Publisher: release-lib.yml on ileoh/aferiq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page