Metadata-Version: 2.1
Name: agent-ledger-adapters
Version: 0.1.0
Summary: One-liner audit trails + policy enforcement for LangChain, LlamaIndex and OpenAI Agents — zero dependencies
License: MIT
Keywords: ai,agents,audit,langchain,llamaindex,llm
Requires-Python: >=3.8
Description-Content-Type: text/markdown

# AgentLedger Adapters

One-liner **audit trails and policy enforcement** for the most popular Python agent frameworks.

```python
from agent_ledger_adapters import build_ledger
from agent_ledger_adapters.langchain import AgentLedgerCallbackHandler

ledger = build_ledger("agent_ledger.db", policy_path="policy.json")
chain.run(question, callbacks=[AgentLedgerCallbackHandler(ledger, agent_id="my-agent", enforce=True)])
```

Built on [AgentLedger](https://github.com/mlazeez/agent-ledger) (vendored, zero dependencies). Every agent action lands in a tamper-proof SHA-256 chain; with `enforce=True`, policy violations raise and stop the offending action.

## Supported frameworks

| Framework | Adapter | How to attach |
|---|---|---|
| LangChain / LangGraph | `agent_ledger_adapters.langchain.AgentLedgerCallbackHandler` | `callbacks=[handler]` |
| LlamaIndex | `agent_ledger_adapters.llamaindex.AgentLedgerCallbackHandler` | `CallbackManager([handler])` |
| OpenAI Agents SDK | `agent_ledger_adapters.openai_agents.AgentLedgerRunHooks` | `Runner.run(agent, input, hooks=hooks)` |

No framework is required to install this package — imports are lazy, so only the adapter you use pulls in its framework.

## What gets logged

`chain_start/end`, `agent_action`, `tool_call`, `tool_result`, `tool_error`, `llm_start/end/error`, `agent_start/end`, `run_start/end`, `handoff` — with run IDs, inputs, outputs, and error messages (truncated).

## Policy enforcement

```json
{
  "version": 1,
  "default": "deny",
  "policies": [
    {"agent": "my-agent", "action": "delete_*", "target": "*", "decision": "deny"},
    {"agent": "my-agent", "action": "deploy", "target": "production", "decision": "require_approval"}
  ]
}
```

- `deny` → `PolicyViolation` raised (with `errors="raise"`), violation logged
- `require_approval` → logged with `policy_status: pending_approval`
- `errors="ignore"` (default) → auditing never breaks your agent

## Run the tests

```bash
cd tests && python3 test_adapters.py   # mock framework objects, no frameworks needed
```

MIT
