Skip to main content

entrenar/ecosystem/ruchy/
types.rs

1//! Ruchy-specific types for session conversion.
2
3use super::session::{CodeCell, EntrenarSession};
4use std::collections::HashMap;
5
6/// Simulated Ruchy session type for conversion.
7///
8/// In a real implementation, this would be `ruchy::Session`.
9/// Here we define a compatible structure for testing.
10#[derive(Debug, Clone)]
11pub struct RuchySession {
12    /// Session ID
13    pub session_id: String,
14    /// Session title
15    pub title: String,
16    /// Username
17    pub username: Option<String>,
18    /// Start time
19    pub start_time: chrono::DateTime<chrono::Utc>,
20    /// End time
21    pub end_time: Option<chrono::DateTime<chrono::Utc>>,
22    /// Kernel info
23    pub kernel: Option<String>,
24    /// Cells
25    pub cells: Vec<RuchyCell>,
26    /// Variables (serialized)
27    pub variables: HashMap<String, String>,
28    /// Training runs
29    pub training_runs: Vec<TrainingRun>,
30}
31
32/// A cell in a Ruchy session.
33#[derive(Debug, Clone)]
34pub struct RuchyCell {
35    /// Cell ID
36    pub id: String,
37    /// Cell type (code, markdown)
38    pub cell_type: String,
39    /// Source content
40    pub source: String,
41    /// Outputs
42    pub outputs: Vec<String>,
43    /// Execution count
44    pub execution_count: Option<u32>,
45    /// Timestamp
46    pub executed_at: Option<chrono::DateTime<chrono::Utc>>,
47}
48
49/// A training run within a session.
50#[derive(Debug, Clone)]
51pub struct TrainingRun {
52    /// Run ID
53    pub run_id: String,
54    /// Model name
55    pub model: String,
56    /// Dataset
57    pub dataset: Option<String>,
58    /// Epochs
59    pub epochs: u32,
60    /// Loss values
61    pub losses: Vec<f64>,
62    /// Metrics
63    pub metrics: HashMap<String, Vec<f64>>,
64}
65
66impl From<RuchySession> for EntrenarSession {
67    fn from(ruchy: RuchySession) -> Self {
68        let mut session = EntrenarSession::new(&ruchy.session_id, &ruchy.title);
69
70        session.user = ruchy.username;
71        session.created_at = ruchy.start_time;
72        session.ended_at = ruchy.end_time;
73        session.model_architecture = ruchy.kernel;
74
75        // Convert cells
76        for cell in ruchy.cells {
77            if cell.cell_type == "code" {
78                let code_cell = CodeCell {
79                    execution_order: cell.execution_count.unwrap_or(0),
80                    source: cell.source,
81                    output: cell.outputs.first().cloned(),
82                    timestamp: cell.executed_at.unwrap_or(ruchy.start_time),
83                    duration_ms: None,
84                };
85                session.code_history.push(code_cell);
86            }
87        }
88
89        // Convert training runs to metrics
90        for run in ruchy.training_runs {
91            for loss in run.losses {
92                session.metrics.add_loss(loss);
93            }
94            for (name, values) in run.metrics {
95                for value in values {
96                    session.metrics.add_custom(&name, value);
97                }
98            }
99            if session.dataset_id.is_none() {
100                session.dataset_id = run.dataset;
101            }
102        }
103
104        // Copy variables as config
105        session.config = ruchy.variables;
106
107        session
108    }
109}