pub struct AiLogging {
pub enabled: bool,
pub sample_rate: f64,
pub retention_secs: u64,
pub redaction: RedactionConfig,
pub external_sink: Option<AiLoggingExternalSink>,
}Expand description
Prompt/response logging (DW-081 ai.logging): opt-in capture of
the canonical prompt and response with PII redaction, sampling,
and retention. Capture is OFF by default (privacy-first): the
enabled field defaults to false, so an ai.logging block
without enabled: true captures nothing. When on, a redaction
pass scrubs PII/secrets before storage, sample_rate controls
volume, and retention_secs ages records out. Per-consumer
ai_logging overrides respect tenant preference.
Fields§
§enabled: boolMaster switch. Default false (privacy-first): no prompt or response text is stored unless this is explicitly true.
sample_rate: f64Sampling rate 0.0..=1.0. Default 1.0 (capture all when enabled). The sample decision is deterministic per request (a hash of the request id), so a re-send with the same id lands on the same decision.
retention_secs: u64Retention in seconds. Records older than this are deleted by the analytics maintenance tick. Default 7 days (604800).
redaction: RedactionConfigPII redaction patterns. Built-in defaults (emails, phone numbers, API keys, credit card numbers) are always active when redaction is on; custom patterns are added to the set.
external_sink: Option<AiLoggingExternalSink>SCALE-12 (#190): external sink for prompt/response logs. When
configured, the analytics maintenance tick invokes the
specified command to sync exported prompt log files to an
external storage system (S3, GCS, etc.). The command receives
the export directory as its first argument. This is a
lean-dependency alternative to embedding S3/GCS SDKs — the
operator provides the sync tool (e.g., aws s3 sync, gsutil rsync). The sink has its own retention (retention_secs
above); the local store prunes on its schedule, the external
sink prunes on the operator’s policy.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for AiLogging
impl<'de> Deserialize<'de> for AiLogging
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for AiLogging
impl JsonSchema for AiLogging
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreimpl StructuralPartialEq for AiLogging
Auto Trait Implementations§
impl Freeze for AiLogging
impl RefUnwindSafe for AiLogging
impl Send for AiLogging
impl Sync for AiLogging
impl Unpin for AiLogging
impl UnwindSafe for AiLogging
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more