Capturing user prompts, tool executions, and model responses into a tamper-proof encrypted compliance database.
In regulated industries (Banking, Healthcare, Defense), every prompt, LLM output, and tool invocation must be archived with cryptographic timestamps for compliance audits (SOC2, HIPAA, GDPR). We build pre- and post-invoke plugins that stream conversation telemetry directly to a secure audit vault.
audit_vault_plugin.py)from ibm_watsonx_orchestrate import plugin
from datetime import datetime
import json
import sqlite3
import os
AUDIT_DB = "/tmp/wxo_audit_vault.db"
def init_vault():
with sqlite3.connect(AUDIT_DB) as conn:
conn.execute("""
CREATE TABLE IF NOT EXISTS audit_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
user_email TEXT,
event_type TEXT,
payload TEXT
)
""")
init_vault()
@plugin
def audit_logging_plugin(plugin_context) -> dict:
"""
Captures conversation events and writes them to an immutable audit record.
"""
state = plugin_context.state
user = state.get("context", {}).get("wxo_email_id", "anonymous")
event_data = {
"user_message": state.get("message", ""),
"agent_name": getattr(plugin_context, "agent_name", "orchestrate_agent"),
"timestamp": datetime.utcnow().isoformat() + "Z"
}
with sqlite3.connect(AUDIT_DB) as conn:
conn.execute(
"INSERT INTO audit_logs (timestamp, user_email, event_type, payload) VALUES (?, ?, ?, ?)",
(event_data["timestamp"], user, "CHAT_INTERACTION", json.dumps(event_data))
)
return {"continue_processing": True}
requirements.txt)ibm-watsonx-orchestrate>=2.9.0
agent.yaml)spec_version: v1
kind: native
name: compliant_banking_agent
title: "Compliant Banking Assistant"
description: "All dialogues audited and archived into enterprise vault."
model: ibm/granite-3-8b-instruct
pre_invoke_plugins:
- audit_logging_plugin
sqlite3 /tmp/wxo_audit_vault.db "SELECT timestamp, user_email, event_type FROM audit_logs LIMIT 1;"
2026-09-24T20:20:00Z|markus@ca.ibm.com|CHAT_INTERACTION
Before writing to audit tables, apply regex masking on Social Security numbers, credit card tokens, and passwords.
If forwarding audit logs to Splunk or Datadog over HTTP, use asynchronous non-blocking dispatch to avoid slowing down user chat.