ariadne-agent
The installable Ariadne Agent backend: a fixed-role, in-memory conversation over native Ariadne Python tools — no CLI, no shell, no server, no raw SQL (spec 2026-09-29-0006, ADR-0014, issue #23). This revision ships the Analyst and Authoring roles plus optionally configured role-restricted stdio MCP tools (issue #25).
Install
Depends on ariadne-data (never the unrelated PyPI ariadne GraphQL project),
the verified Tau release tau-ai==0.4.6, whose embeddable
tau_agent.AgentHarness / tau_ai.OpenAICompatibleProvider import paths this
package uses, and the owned tau-mcp embeddable stdio MCP core. The tau-ai
wheel also installs tau_coding's files, but this package never imports or
invokes tau_coding at runtime (the tau_mcp.proxy module is likewise not
imported here because it is the Tau-extension flavor), and never launches a
server — installing ariadne-data alone does not install the agent.
Local development resolves ariadne-data from the repository checkout through
[tool.uv.sources] in pyproject.toml (non-published tool configuration
only; the published dependency metadata names the distribution); tau-mcp
resolves the same way from its own repository checkout:
cd ariadne-agent && uv run pytest -q tests/test_analyst.py
Use
The host selects everything up front — project root, role, model, and a fully configured provider (model identity, endpoint and credentials are constructed outside user messages and data-project artifacts; the agent loads no global provider or MCP configuration):
from ariadne_agent import AssistantText, ToolActivity, open_session
from tau_ai import OpenAICompatibleProvider, OpenAICompatibleConfig
provider = OpenAICompatibleProvider(OpenAICompatibleConfig(api_key=..., base_url=...))
session = open_session(role="analyst", project="/path/to/project",
model="your-model", provider=provider)
async for event in session.send("gross margin by region?"):
match event:
case AssistantText(text=text): print(text)
case ToolActivity(tool=tool): print(f"[tool] {tool}")
session.cancel() # cooperative: ends subsequent model turns
session.close()
MCP (optional, role-restricted)
Passing mcp_settings attaches ONE restricted MCP registry to that session,
built from host-supplied configuration only — validated stdio server entries,
a cache root, and each role's operator-approved qualified tool names. No
~/.tau/mcp.json or any other ambient MCP configuration is ever loaded, and a
model request can never alter server commands, the allowlist, or credentials:
from ariadne_agent.mcp_tools import McpSettings
from tau_mcp.config import ServerConfig
mcp = McpSettings(
servers={"weather": ServerConfig(name="weather", command="...", args=(...))},
cache_root=Path("/var/cache/ariadne-mcp"),
role_tools={"analyst": ("weather__lookup",)}, # authoring absent => no MCP tools
)
session = open_session(role="analyst", ..., mcp_settings=mcp)
Permitted tools surface to the model as one mcp proxy tool (search and call
by server__tool name); direct MCP registration stays a Tau extension and is
not offered. The registry's frozen per-instance allowlist restricts discovery
and dispatch, so a forbidden name the model supplies through the proxy is
rejected before any spawn or call — the server never sees it. close() reaps
every MCP child this session spawned; a call already executing finishes or
times out under the MCP client's bounded request timeout (no immediate
interruption is promised). Omit mcp_settings and the native tool surface is
exactly as before.
The host always selects a Git data project root: the session resolves
through QueryRuntime.open_project and serves its pinned human-admitted
snapshot. Before the first admission an Analyst session still opens (discovery
stays source-free); the first governed query then refuses honestly, naming the
human-only ariadne-admit step — never a fallback to mutable files or a plain
artifact root. The first real admission is picked up once and stays pinned for
the session.
Contract
- Typed async events: assistant text, tool activity (verbatim JSON payload, error flag), session errors, and run completion. Harness-internal event types never leak through.
- One active run per session;
sendwhile running raises. Fixed role/project/model — a different one requires a new session, with no silent transcript or tool-access transfer. - In memory only: a process restart loses the messages; there is no resume operation, deliberately.
- Analyst tools are exactly the nine read-only admitted-snapshot operations
(
discover,list_metrics,search_context,get_metric,list_datasets,define_metric,resolve_term,list_context_pages,read_context_page) as thin native tools: values, Policy text and citations, paths, andgovernedlabels pass through verbatim.define_metricis ephemeral (persistence: not_saved) — it writes nothing. Term resolution is read-only admitted-context guidance — an alias never authorizes a join. No source approval, no admission, no filesystem writes. - Authoring tools mirror
AuthoringProject's Git contract one-to-one —start_proposal,read_artifact,edit_proposal,propose_sources,inputs,validate_proposal,refresh_schema,inspect_mapping,resolve_term,review_proposal,read_skill_reference— with automatic labeled-hypothesis saves throughedit_proposal(no per-save prompt) and restart-readable Git/evidence state. Original documents are external, operator-placed inputs: there is no upload tool, and the agent never reads outside the operator-managed boundary. Source approval, admission, reconciliation and Git Review Admission are deliberately absent: human-only, outside the agent.propose_sourcesaccepts optional namedstorages:S3 profile declarations: the agent proposes the credential-free declarations and never reads or sets environment values — the host process supplies them, and the human-only approval gate is unchanged. - Guidance: the version-matched packaged
ariadne/skill_assets/SKILL.mdfrom the installedariadne-data, plus a short native-tool mapping. No global skill scans, no model-invocable skill scripts. - No admission yet: an Analyst session on a not-yet-admitted Git project
opens with source-free discovery; the first governed query fails fast with an
actionable error naming the human
ariadne-admitstep. The failure is session-local — it cannot block a later (e.g. Authoring) session.
Metadata
Release files for ariadne-agent 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ariadne_agent-0.4.1.tar.gz | 61.3 kB | Without provenance | Details for ariadne_agent-0.4.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ariadne_agent-0.4.1-py3-none-any.whl | Python 3 | none | any | Details for ariadne_agent-0.4.1-py3-none-any.whl |
Total release size: 91.5 kB
Release files / ariadne_agent-0.4.1.tar.gz
| Download URL | ariadne_agent-0.4.1.tar.gz |
|---|---|
| Size | 61.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4fc9839fbb3ae7673c41116492ba577b454ccd6b6978f16eb1b83efeee564a7
|
|
BLAKE2b-256 checksum How to use checksums |
e337f3d427516f759ae65671e89807dd59d6ccf263a944fab65788b64704dd1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ariadne_agent-0.4.1-py3-none-any.whl
| Download URL | ariadne_agent-0.4.1-py3-none-any.whl |
|---|---|
| Size | 30.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dedda2971a5c9820001b98c4b9e4576f96142fed0b3db064b7d3262bb01f5466
|
|
BLAKE2b-256 checksum How to use checksums |
681c3e693da18c2570fa6b8ba8691337557d455154480371898c5530e3325185
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for ariadne-agent 0.4.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.