veylant/internal/auditlog/entry.go
2026-03-10 12:01:34 +01:00

74 lines
2.7 KiB
Go

// Package auditlog defines the immutable audit log types and the Logger interface
// for recording every LLM request processed by the proxy.
package auditlog
import "time"
// AuditEntry holds all metadata for a single proxied LLM request.
// It is written to ClickHouse asynchronously via BatchWriter.
// prompt_anonymized is stored encrypted (AES-256-GCM) and is never
// returned to API callers.
type AuditEntry struct {
RequestID string `json:"request_id"`
TenantID string `json:"tenant_id"`
UserID string `json:"user_id"`
Timestamp time.Time `json:"timestamp"`
ModelRequested string `json:"model_requested"`
ModelUsed string `json:"model_used"`
Provider string `json:"provider"`
Department string `json:"department"`
UserRole string `json:"user_role"`
PromptHash string `json:"prompt_hash"`
ResponseHash string `json:"response_hash"`
PromptAnonymized string `json:"-"` // AES-256-GCM base64-encoded anonymized prompt — never returned to API callers
SensitivityLevel string `json:"sensitivity_level"` // "none"|"low"|"medium"|"high"|"critical"
TokenInput int `json:"token_input"`
TokenOutput int `json:"token_output"`
TokenTotal int `json:"token_total"`
CostUSD float64 `json:"cost_usd"`
LatencyMs int `json:"latency_ms"`
Status string `json:"status"` // "ok"|"error"
ErrorType string `json:"error_type"`
PIIEntityCount int `json:"pii_entity_count"`
Stream bool `json:"stream"`
}
// AuditQuery filters audit log entries for the GET /v1/admin/logs endpoint.
type AuditQuery struct {
TenantID string
UserID string // filter by specific user (GDPR Art. 15)
StartTime time.Time
EndTime time.Time
Provider string
MinSensitivity string // "none"|"low"|"medium"|"high"|"critical"
Limit int // default 50, max 200
Offset int
}
// AuditResult is the paginated response for AuditQuery.
type AuditResult struct {
Data []AuditEntry `json:"data"`
Total int `json:"total"`
}
// CostQuery filters cost aggregation for the GET /v1/admin/costs endpoint.
type CostQuery struct {
TenantID string
StartTime time.Time
EndTime time.Time
GroupBy string // "provider"|"model"|"department"
}
// CostSummary is one row in a cost aggregation result.
type CostSummary struct {
Key string `json:"key"`
TotalTokens int `json:"total_tokens"`
TotalCostUSD float64 `json:"total_cost_usd"`
RequestCount int `json:"request_count"`
}
// CostResult is the response for CostQuery.
type CostResult struct {
Data []CostSummary `json:"data"`
}