74 lines
2.7 KiB
Go
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"`
|
|
}
|