mini_chat_sdk/plugin_api.rs
1use async_trait::async_trait;
2use uuid::Uuid;
3
4use crate::audit_models::{
5 TurnAuditEvent, TurnDeleteAuditEvent, TurnEditAuditEvent, TurnRetryAuditEvent,
6};
7use crate::error::{MiniChatAuditPluginError, MiniChatModelPolicyPluginError, PublishError};
8use crate::models::{PolicySnapshot, PolicyVersionInfo, UsageEvent, UserLimits};
9
10/// Plugin API trait for mini-chat model policy implementations.
11///
12/// Plugins implement this trait to provide model catalog and policy data.
13/// The mini-chat module discovers plugins via GTS types-registry and
14/// delegates policy queries to the selected plugin.
15#[async_trait]
16pub trait MiniChatModelPolicyPluginClientV1: Send + Sync {
17 /// Get the current policy version for a user.
18 async fn get_current_policy_version(
19 &self,
20 user_id: Uuid,
21 ) -> Result<PolicyVersionInfo, MiniChatModelPolicyPluginError>;
22
23 /// Get the full policy snapshot for a given version, including
24 /// model catalog and kill switches.
25 async fn get_policy_snapshot(
26 &self,
27 user_id: Uuid,
28 policy_version: u64,
29 ) -> Result<PolicySnapshot, MiniChatModelPolicyPluginError>;
30
31 /// Get per-user credit limits for a specific policy version.
32 async fn get_user_limits(
33 &self,
34 user_id: Uuid,
35 policy_version: u64,
36 ) -> Result<UserLimits, MiniChatModelPolicyPluginError>;
37
38 /// Publish a usage event after turn finalization.
39 ///
40 /// Called by the outbox processor after the finalization transaction
41 /// commits. Plugins can forward the event to external billing systems.
42 async fn publish_usage(&self, payload: UsageEvent) -> Result<(), PublishError>;
43}
44
45/// Plugin API trait for mini-chat audit event publishing.
46///
47/// Plugins implement this trait to receive audit events from the mini-chat
48/// module. The mini-chat module discovers plugins via GTS types-registry and
49/// dispatches audit events to all registered implementations.
50///
51/// # Caller contract
52///
53/// The **caller** (mini-chat domain service) MUST redact secret patterns and
54/// truncate string content (max 8 KiB per field) *before* invoking any method
55/// on this trait. Plugins MUST assume all content fields are already sanitized.
56/// See DESIGN.md "Audit content handling (P1)" for the full redaction rule table.
57///
58/// # Delivery semantics
59///
60/// Audit emission is best-effort (fire-and-forget after DB commit). There is no
61/// transactional outbox for audit events. If the process crashes between DB
62/// commit and audit emission, the event is lost. Callers SHOULD track emission
63/// outcomes via `mini_chat_audit_emit_total{result}` metrics.
64///
65/// # Independence
66///
67/// When multiple audit plugin instances are registered, each MUST be
68/// independent. A failure in one plugin MUST NOT prevent delivery to others.
69#[async_trait]
70pub trait MiniChatAuditPluginClientV1: Send + Sync {
71 /// Emit a turn audit event (turn completed or failed).
72 async fn emit_turn_audit(&self, event: TurnAuditEvent) -> Result<(), MiniChatAuditPluginError>;
73
74 /// Emit a turn-retry audit event.
75 async fn emit_turn_retry_audit(
76 &self,
77 event: TurnRetryAuditEvent,
78 ) -> Result<(), MiniChatAuditPluginError>;
79
80 /// Emit a turn-edit audit event.
81 async fn emit_turn_edit_audit(
82 &self,
83 event: TurnEditAuditEvent,
84 ) -> Result<(), MiniChatAuditPluginError>;
85
86 /// Emit a turn-delete audit event.
87 async fn emit_turn_delete_audit(
88 &self,
89 event: TurnDeleteAuditEvent,
90 ) -> Result<(), MiniChatAuditPluginError>;
91}