mirror of https://github.com/buster-so/buster.git
Merge branch 'evals' of https://github.com/buster-so/buster into evals
This commit is contained in:
commit
96853b8757
|
@ -228,6 +228,19 @@ pub enum AssetType {
|
||||||
DashboardFile,
|
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(
|
#[derive(
|
||||||
Serialize,
|
Serialize,
|
||||||
Deserialize,
|
Deserialize,
|
||||||
|
|
|
@ -85,6 +85,98 @@ pub enum ShowLegendHeadline {
|
||||||
String(String),
|
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
|
// Base chart config shared by all chart types
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
@ -113,18 +205,15 @@ pub struct BaseChartConfig {
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(alias = "disable_tooltip")]
|
#[serde(alias = "disable_tooltip")]
|
||||||
pub disable_tooltip: Option<bool>,
|
pub disable_tooltip: Option<bool>,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
// Updated Axis Configs using defined structs
|
||||||
#[serde(alias = "y_axis_config")]
|
#[serde(flatten, default)] // Flatten includes fields directly, default handles Option
|
||||||
pub y_axis_config: Option<serde_json::Value>,
|
pub y_axis_config: YAxisConfig,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(flatten, default)]
|
||||||
#[serde(alias = "x_axis_config")]
|
pub x_axis_config: XAxisConfig,
|
||||||
pub x_axis_config: Option<serde_json::Value>,
|
#[serde(flatten, default)]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
pub category_axis_style_config: CategoryAxisStyleConfig,
|
||||||
#[serde(alias = "category_axis_style_config")]
|
#[serde(flatten, default)]
|
||||||
pub category_axis_style_config: Option<serde_json::Value>,
|
pub y2_axis_config: Y2AxisConfig,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
#[serde(alias = "y2_axis_config")]
|
|
||||||
pub y2_axis_config: Option<serde_json::Value>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
|
|
@ -4,9 +4,9 @@ use database::{
|
||||||
enums::AssetType,
|
enums::AssetType,
|
||||||
models::{Message, MessageToFile},
|
models::{Message, MessageToFile},
|
||||||
pool::get_pg_pool,
|
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 diesel_async::RunQueryDsl;
|
||||||
use middleware::AuthenticatedUser;
|
use middleware::AuthenticatedUser;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -44,7 +44,8 @@ pub struct ChatRestoreRequest {
|
||||||
/// 1. Restores the specified asset version using the appropriate handler
|
/// 1. Restores the specified asset version using the appropriate handler
|
||||||
/// 2. Creates a text message in the chat documenting the restoration
|
/// 2. Creates a text message in the chat documenting the restoration
|
||||||
/// 3. Creates a file message linking to the restored asset
|
/// 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(
|
pub async fn restore_chat_handler(
|
||||||
chat_id: &Uuid,
|
chat_id: &Uuid,
|
||||||
user: &AuthenticatedUser,
|
user: &AuthenticatedUser,
|
||||||
|
@ -161,32 +162,15 @@ pub async fn restore_chat_handler(
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
let timestamp = now.timestamp();
|
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
|
// Create response messages array with both text and file response
|
||||||
let response_messages = json!([
|
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(),
|
"id": file_id.to_string(),
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"metadata": [
|
"metadata": [
|
||||||
{
|
{
|
||||||
"status": "completed",
|
"status": "completed",
|
||||||
"message": format!("File {} completed", file_name),
|
"message": format!("Restored from version {}", request.version_number),
|
||||||
"timestamp": timestamp
|
"timestamp": timestamp
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -205,7 +189,10 @@ pub async fn restore_chat_handler(
|
||||||
reasoning: json!([]),
|
reasoning: json!([]),
|
||||||
title: "Version Restoration".to_string(),
|
title: "Version Restoration".to_string(),
|
||||||
raw_llm_messages: Value::Array(raw_llm_messages.clone()),
|
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,
|
chat_id: *chat_id,
|
||||||
created_at: now,
|
created_at: now,
|
||||||
updated_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 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)
|
.values(&message_to_file)
|
||||||
.execute(&mut conn)
|
.execute(&mut conn)
|
||||||
.await?;
|
.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
|
// Return the updated chat with messages
|
||||||
get_chat_handler(chat_id, user, false).await
|
get_chat_handler(chat_id, user, false).await
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue