Observed since 20 Oct, 21:30 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Lightweight Python middleware that wraps any agent framework and logs every tool call. SOC 2 audit trail for small teams.
Every agent call logged. SOC 2 ready.
A lightweight Python middleware that wraps any agent framework (LangChain, CrewAI, AutoGen, n8n, Hermes) and logs every tool call — what was invoked, what data passed through, what changed. Output as JSON to file or Google Sheets. Exportable PDF reports for compliance.
Target: startups that need SOC 2 prep but can't afford $10K/mo enterprise stacks.
pip install agent-audit-logger
from agent_audit_logger import AuditLogger, AuditEntry, AuditMiddleware
from agent_audit_logger.exporters.json_logger import JsonLogExporter
# Create logger and add JSON output
logger = AuditLogger()
logger.add_exporter(JsonLogExporter("audit_logs/"))
# Create middleware
middleware = AuditMiddleware(logger, agent_name="my_agent")
# Use as a decorator
@middleware(tool_name="search_web", tags=["search"])
def search_web(query: str) -> str:
return f"Results for {query}"
# Or wrap existing functions
wrapped_func = middleware.wrap(
my_existing_tool,
agent_name="worker",
tool_name="my_tool",
)
# Log manually
entry = AuditEntry(
agent_name="my_agent",
tool_name="web_search",
tool_input={"query": "SOC 2 compliance"},
tool_output="Results...",
duration_ms=1200.5,
)
logger.log(entry)
from langchain.tools import Tool
from agent_audit_logger import AuditLogger, AuditMiddleware
logger = AuditLogger()
logger.add_exporter(JsonLogExporter("audit_logs/"))
middleware = AuditMiddleware(logger, agent_name="langchain-agent")
wrapped_tools = AuditMiddleware.wrap_langchain_tools(middleware, tools_list)
middleware = AuditMiddleware(logger, agent_name="crewai-agent")
AuditMiddleware.wrap_crewai_tools(middleware, crew_tools_list)
report_path = logger.generate_report(
"compliance_report.pdf",
title="Q3 SOC 2 Audit Log",
date_range=("2025-01-01", "2025-03-31"),
)
# Manual rotation (happens automatically on file size threshold)
summary = logger.rotate(archive=True)
| Setting | Default | Description |
|---|---|---|
AGENT_AUDIT_LOG_DIR | audit_logs/ | Directory for JSON log files |
AGENT_AUDIT_MAX_FILE_MB | 10 | Rotate when log file exceeds this size |
AGENT_AUDIT_COMPRESS | False | Gzip old rotated files |
GOOGLE_SERVICE_ACCOUNT_PATH | ~/.hermes/secrets/client_secret.json | Path to Google service account JSON |
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 27 May 2026 | 3 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 21:30 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:fb9b7b019efbc08e31014422d2b3332c2b7b3c769d92efe5263fe06a59bbd069