Skip to main content

synth_ai_core/data/
sensors.rs

1use crate::data::levers::ScopeKey;
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use std::collections::HashMap;
6
7#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
8#[serde(rename_all = "snake_case")]
9pub enum SensorKind {
10    Reward,
11    Timing,
12    Rollout,
13    Resource,
14    Safety,
15    Quality,
16    Trace,
17    ContextApply,
18    Experiment,
19    Custom,
20}
21
22#[derive(Clone, Debug, Serialize, Deserialize)]
23pub struct Sensor {
24    pub sensor_id: String,
25    pub kind: SensorKind,
26    pub scope: Vec<ScopeKey>,
27    pub value: Value,
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub units: Option<String>,
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub timestamp: Option<DateTime<Utc>>,
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub trace_id: Option<String>,
34    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
35    pub metadata: HashMap<String, Value>,
36}
37
38#[derive(Clone, Debug, Serialize, Deserialize)]
39pub struct SensorFrame {
40    pub scope: Vec<ScopeKey>,
41    pub sensors: Vec<Sensor>,
42    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
43    pub lever_versions: HashMap<String, i64>,
44    #[serde(default, skip_serializing_if = "Vec::is_empty")]
45    pub trace_ids: Vec<String>,
46    #[serde(default, skip_serializing_if = "Option::is_none")]
47    pub created_at: Option<DateTime<Utc>>,
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub frame_id: Option<String>,
50    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
51    pub metadata: HashMap<String, Value>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize)]
55pub struct SensorFrameSummary {
56    pub frame_id: String,
57    pub created_at: DateTime<Utc>,
58    pub sensor_count: usize,
59    #[serde(default)]
60    pub sensor_kinds: Vec<String>,
61    #[serde(default)]
62    pub trace_ids: Vec<String>,
63    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
64    pub lever_versions: HashMap<String, i64>,
65}