Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

persona-lattice

pytest for your user population.

Coverage-based persona testing for conversational AI systems: factorize your simulated users into a lattice of communication style x behavioral disposition x domain, drive every cell against your system, and gate CI on per-cell pass rates.

0.1.0.dev0 — API still settling. Interfaces may change between dev releases; pin exact versions if you depend on this today.

Why

Simulated-user tools exist, but they score one scenario at a time. What they leave open is coverage semantics: a factorized population, balanced cell assignment with synthetic backfill, bidirectional expectations (attack cells must trigger defenses; benign cells carry false-positive budgets), pluggable product-side oracles instead of judge-only scoring, and per-cell regression reporting built for CI.

Install

pip install persona-lattice              # core
pip install 'persona-lattice[personahub]'  # + PersonaHub corpus sampling

Quickstart

from persona_lattice import Lattice, dispositions, PersonaHubSource
from persona_lattice.llm import OpenAICompatibleClient
from persona_lattice.sut import OpenAICompatibleSUT
from persona_lattice.oracles import GuardrailOracle, LLMJudgeOracle

llm = OpenAICompatibleClient(
    base_url="https://api.example.com/v1", api_key="...", model="your-model"
)

lattice = Lattice(
    styles=PersonaHubSource(),
    dispositions=dispositions.default(),  # or a custom subset / your own
    domains={"support": SUPPORT_CFG, "sales": SALES_CFG},
    affinity={"sales": {"cooperative", "impatient", "adversarial_pricing"}},
)

run = lattice.run(
    sut=OpenAICompatibleSUT(llm),  # or implement SUTAdapter for your product API
    oracles=[GuardrailOracle(false_positive_budget=1), LLMJudgeOracle(llm)],
    persona_client=llm,
    target_n=120,
    seed=42,
    workers=8,
)

run.save_report("report.json")
assert run.cell("support", "adversarial_pii").pass_rate >= 0.8  # CI gate

For a zero-network end-to-end demo, run examples/toy_support_bot.py.

Features

  • Coverage lattice — style x disposition x domain with an affinity map for which combinations are valid; seeded round-robin balancing; synthetic-persona backfill so every required cell is always populated.
  • 9 built-in dispositions (6 non-cooperative), each carrying its expected outcomes: guardrail triggers, safety gates, sentiment direction, turn bounds.
  • Persona sources — inline, JSONL, or seeded sampling from the public PersonaHub corpus; plus an LLM classifier to map corpus personas onto dispositions.
  • Pluggable SUT adaptersCallableSUT for in-process functions, OpenAICompatibleSUT for any chat endpoint, or implement SUTAdapter against your product's API to surface real guardrail events and halts.
  • Bidirectional oraclesGuardrailOracle (attacks must trigger; benign cells get a false-positive budget) and LLMJudgeOracle (sentiment + turn bounds) on a soft-assertion engine (in_range, one_of, at_most).
  • Parallel runner + reports — thread-pooled execution, a formal JSON report schema, a self-contained HTML domain x disposition pass-rate heatmap, and run.cell(...).pass_rate accessors for CI gates.
  • Experimental pytest plugin — parametrize tests over lattice cells.

Planned for v0.2: multilingual cells, a simulator-fidelity validator, and report diffing across runs.

License

Apache-2.0 — see LICENSE.

Download files

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

Source Distribution

persona_lattice-0.1.0.dev1.tar.gz (40.4 kB view details)

Uploaded Source

Built Distribution

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

persona_lattice-0.1.0.dev1-py3-none-any.whl (31.7 kB view details)

Uploaded Python 3

File details

Details for the file persona_lattice-0.1.0.dev1.tar.gz.

File metadata

  • Download URL: persona_lattice-0.1.0.dev1.tar.gz
  • Upload date:
  • Size: 40.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for persona_lattice-0.1.0.dev1.tar.gz
Algorithm Hash digest
SHA256 7e55d0ae4db6adcc989c1bf0ff6855d9d8761302dd2a90ce9eb71aa176af6ddb
MD5 837b28a7d5b9f97e3c0b7aa098a5d89d
BLAKE2b-256 b107c6b23638537a21f83fc3c22a3143f678ceb3c0fea6f78cc75e9e907b1423

See more details on using hashes here.

Provenance

The following attestation bundles were made for persona_lattice-0.1.0.dev1.tar.gz:

Publisher: release.yml on yevgenkravets/persona-lattice

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

File details

Details for the file persona_lattice-0.1.0.dev1-py3-none-any.whl.

File metadata

File hashes

Hashes for persona_lattice-0.1.0.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 58baec2646a48fb8dce96a9b84b668797968b489303d8c4bff4b48bedc61ec10
MD5 9c0edc7254bac9bd7a6453f45324dc56
BLAKE2b-256 3e1de10234d35a75d46c17c560f37d42eaa6be26687e729250392fc988307f25

See more details on using hashes here.

Provenance

The following attestation bundles were made for persona_lattice-0.1.0.dev1-py3-none-any.whl:

Publisher: release.yml on yevgenkravets/persona-lattice

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