Merge branch 'evals' of https://github.com/buster-so/buster into evals

This commit is contained in:
Nate Kelley 2025-04-18 14:42:17 -06:00
commit 96853b8757
No known key found for this signature in database
GPG Key ID: FD90372AB8D98B4F
3 changed files with 136 additions and 35 deletions

View File

@ -228,6 +228,19 @@ pub enum AssetType {
DashboardFile,
}
impl AssetType {
pub fn to_string(&self) -> &'static str {
match *self {
AssetType::Dashboard => "dashboard_deprecated",
AssetType::Thread => "thread",
AssetType::Collection => "collection",
AssetType::Chat => "chat",
AssetType::MetricFile => "metric",
AssetType::DashboardFile => "dashboard",
}
}
}
#[derive(
Serialize,
Deserialize,

View File

@ -85,6 +85,98 @@ pub enum ShowLegendHeadline {
String(String),
}
// --- Axis Configuration Enums ---
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum YAxisScaleType {
Log,
Linear,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum XAxisTimeInterval {
Day,
Week,
Month,
Quarter,
Year,
}
// Use strings to represent numbers and 'auto' for compatibility with TS/JSON
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum XAxisLabelRotation {
#[serde(rename = "0")]
Rotate0,
#[serde(rename = "45")]
Rotate45,
#[serde(rename = "90")]
Rotate90,
#[serde(rename = "auto")]
Auto,
}
// --- Axis Configuration Structs ---
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct YAxisConfig {
#[serde(skip_serializing_if = "Option::is_none", alias = "y_axis_show_axis_label")]
pub y_axis_show_axis_label: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y_axis_show_axis_title")]
pub y_axis_show_axis_title: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y_axis_axis_title")]
pub y_axis_axis_title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y_axis_start_axis_at_zero")]
pub y_axis_start_axis_at_zero: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y_axis_scale_type")]
pub y_axis_scale_type: Option<YAxisScaleType>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct Y2AxisConfig {
#[serde(skip_serializing_if = "Option::is_none", alias = "y2_axis_show_axis_label")]
pub y2_axis_show_axis_label: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y2_axis_show_axis_title")]
pub y2_axis_show_axis_title: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y2_axis_axis_title")]
pub y2_axis_axis_title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y2_axis_start_axis_at_zero")]
pub y2_axis_start_axis_at_zero: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "y2_axis_scale_type")]
pub y2_axis_scale_type: Option<YAxisScaleType>, // Reuses YAxisScaleType enum
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct XAxisConfig {
#[serde(skip_serializing_if = "Option::is_none", alias = "x_axis_time_interval")]
pub x_axis_time_interval: Option<XAxisTimeInterval>,
#[serde(skip_serializing_if = "Option::is_none", alias = "x_axis_show_axis_label")]
pub x_axis_show_axis_label: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "x_axis_show_axis_title")]
pub x_axis_show_axis_title: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", alias = "x_axis_axis_title")]
pub x_axis_axis_title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "x_axis_label_rotation")]
pub x_axis_label_rotation: Option<XAxisLabelRotation>,
#[serde(skip_serializing_if = "Option::is_none", alias = "x_axis_data_zoom")]
pub x_axis_data_zoom: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct CategoryAxisStyleConfig {
#[serde(skip_serializing_if = "Option::is_none", alias = "category_axis_title")]
pub category_axis_title: Option<String>,
}
// --- Base Chart Config ---
// Base chart config shared by all chart types
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
@ -113,18 +205,15 @@ pub struct BaseChartConfig {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "disable_tooltip")]
pub disable_tooltip: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "y_axis_config")]
pub y_axis_config: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "x_axis_config")]
pub x_axis_config: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "category_axis_style_config")]
pub category_axis_style_config: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "y2_axis_config")]
pub y2_axis_config: Option<serde_json::Value>,
// Updated Axis Configs using defined structs
#[serde(flatten, default)] // Flatten includes fields directly, default handles Option
pub y_axis_config: YAxisConfig,
#[serde(flatten, default)]
pub x_axis_config: XAxisConfig,
#[serde(flatten, default)]
pub category_axis_style_config: CategoryAxisStyleConfig,
#[serde(flatten, default)]
pub y2_axis_config: Y2AxisConfig,
}
#[derive(Debug, Serialize, Deserialize, Clone)]

View File

@ -4,9 +4,9 @@ use database::{
enums::AssetType,
models::{Message, MessageToFile},
pool::get_pg_pool,
schema::{messages, messages_to_files},
schema::{chats, messages, messages_to_files},
};
use diesel::{insert_into, ExpressionMethods, QueryDsl};
use diesel::{insert_into, update, ExpressionMethods, QueryDsl};
use diesel_async::RunQueryDsl;
use middleware::AuthenticatedUser;
use serde::{Deserialize, Serialize};
@ -44,7 +44,8 @@ pub struct ChatRestoreRequest {
/// 1. Restores the specified asset version using the appropriate handler
/// 2. Creates a text message in the chat documenting the restoration
/// 3. Creates a file message linking to the restored asset
/// 4. Returns the updated chat with all messages
/// 4. Updates the chat record with the latest file info
/// 5. Returns the updated chat with all messages
pub async fn restore_chat_handler(
chat_id: &Uuid,
user: &AuthenticatedUser,
@ -161,32 +162,15 @@ pub async fn restore_chat_handler(
let now = Utc::now();
let timestamp = now.timestamp();
// Create restoration message text response
let restoration_text = format!(
"Version {} was created by restoring version {}",
version_number, request.version_number
);
// Create file response message for the restored asset
// Create response messages array with both text and file response
let response_messages = json!([
// Text response message
{
"id": format!("chatcmpl-{}", Uuid::new_v4().to_string().replace("-", "")),
"type": "text",
"message": restoration_text,
"message_chunk": null,
"is_final_message": true
},
// File response message
{
"id": file_id.to_string(),
"type": "file",
"metadata": [
{
"status": "completed",
"message": format!("File {} completed", file_name),
"message": format!("Restored from version {}", request.version_number),
"timestamp": timestamp
}
],
@ -205,7 +189,10 @@ pub async fn restore_chat_handler(
reasoning: json!([]),
title: "Version Restoration".to_string(),
raw_llm_messages: Value::Array(raw_llm_messages.clone()),
final_reasoning_message: None,
final_reasoning_message: Some(format!(
"v{} was created by restoring v{}",
version_number, request.version_number
)),
chat_id: *chat_id,
created_at: now,
updated_at: now,
@ -233,11 +220,23 @@ pub async fn restore_chat_handler(
};
// Insert the message-to-file association into the database
insert_into(messages_to_files::table)
diesel::insert_into(messages_to_files::table)
.values(&message_to_file)
.execute(&mut conn)
.await?;
// Step 4: Update the chat record with the latest file info
update(chats::table)
.filter(chats::id.eq(chat_id))
.set((
chats::most_recent_file_id.eq(Some(file_id)),
chats::most_recent_version_number.eq(Some(version_number)),
chats::most_recent_file_type.eq(Some(request.asset_type.to_string())),
chats::updated_at.eq(now),
))
.execute(&mut conn)
.await?;
// Return the updated chat with messages
get_chat_handler(chat_id, user, false).await
}