Skip to main content

comindly_api/
events.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4#[serde(rename_all = "lowercase")]
5pub enum Level {
6    Info,
7    Warn,
8    Error,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum Kind {
14    /// A new step begins; its message names it.
15    Step,
16    /// A result.
17    Done,
18    /// A detail.
19    Note,
20    Warning,
21    Error,
22    /// How far a step is: `done` of `total`, with LLM usage so far.
23    Progress,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct Event {
28    pub timestamp: String,
29    pub level: Level,
30    pub kind: Kind,
31    pub message: String,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub step: Option<String>,
34    /// The job this event belongs to, when it runs as one.
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub job_id: Option<String>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub done: Option<u64>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub total: Option<u64>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub tokens_in: Option<u64>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub tokens_out: Option<u64>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub usd: Option<f64>,
47}
48
49impl Event {
50    pub fn new(level: Level, kind: Kind, message: impl Into<String>) -> Self {
51        Event {
52            timestamp: chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true),
53            level,
54            kind,
55            message: message.into(),
56            step: None,
57            job_id: None,
58            done: None,
59            total: None,
60            tokens_in: None,
61            tokens_out: None,
62            usd: None,
63        }
64    }
65}