mirror of https://github.com/buster-so/buster.git
some updates to better align with types
This commit is contained in:
parent
ab0538c737
commit
e5f25a6356
|
@ -98,7 +98,7 @@ pub async fn validate_metric_ids(ids: &[Uuid]) -> Result<Vec<Uuid>> {
|
|||
}
|
||||
|
||||
pub const METRIC_YML_SCHEMA: &str = r##"
|
||||
# METRIC CONFIGURATION - YAML STRUCTURE
|
||||
# METRIC CONFIGURATION - YML STRUCTURE
|
||||
# -------------------------------------
|
||||
# Required top-level fields:
|
||||
#
|
||||
|
@ -483,7 +483,7 @@ definitions:
|
|||
"##;
|
||||
|
||||
pub const DASHBOARD_YML_SCHEMA: &str = r##"
|
||||
# DASHBOARD CONFIGURATION - YAML STRUCTURE
|
||||
# DASHBOARD CONFIGURATION - YML STRUCTURE
|
||||
# ----------------------------------------
|
||||
# Required fields:
|
||||
#
|
||||
|
@ -590,7 +590,7 @@ pub async fn process_metric_file(
|
|||
let metric_file = MetricFile {
|
||||
id: metric_id,
|
||||
name: metric_yml.title.clone(),
|
||||
file_name: format!("{}.yml", file_name),
|
||||
file_name: file_name.clone(),
|
||||
content: serde_json::to_value(metric_yml.clone())
|
||||
.map_err(|e| format!("Failed to process metric: {}", e))?,
|
||||
created_by: Uuid::new_v4(),
|
||||
|
|
|
@ -101,7 +101,7 @@ async fn process_dashboard_file(
|
|||
let dashboard_file = DashboardFile {
|
||||
id: dashboard_id,
|
||||
name: dashboard_yml.name.clone(),
|
||||
file_name: format!("{}.yml", file.name),
|
||||
file_name: file.name.clone(),
|
||||
content: serde_json::to_value(dashboard_yml.clone())
|
||||
.map_err(|e| format!("Failed to process dashboard: {}", e))?,
|
||||
filter: None,
|
||||
|
@ -260,7 +260,7 @@ impl ToolExecutor for CreateDashboardFilesTool {
|
|||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "The name of the dashboard file to be created. This should exclude the file extension. (i.e. '.yml')"
|
||||
"description": "The name of the dashboard file to be created. Do not include the file_extension."
|
||||
},
|
||||
"yml_content": {
|
||||
"type": "string",
|
||||
|
|
|
@ -205,7 +205,7 @@ impl ToolExecutor for CreateMetricFilesTool {
|
|||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Name of the file"
|
||||
"description": "Name of the file. Do not include the file_extension."
|
||||
},
|
||||
"yml_content": {
|
||||
"type": "string",
|
||||
|
|
|
@ -39,8 +39,10 @@ pub struct DashboardFile {
|
|||
#[diesel(table_name = messages)]
|
||||
pub struct Message {
|
||||
pub id: Uuid,
|
||||
pub request: String,
|
||||
pub response: Value,
|
||||
pub request_message: String,
|
||||
pub response_messages: Value,
|
||||
pub reasoning: Value,
|
||||
pub final_reasoning_message: String,
|
||||
pub chat_id: Uuid,
|
||||
pub created_at: DateTime<Utc>,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
|
@ -89,6 +91,7 @@ pub struct Chat {
|
|||
pub updated_at: DateTime<Utc>,
|
||||
pub deleted_at: Option<DateTime<Utc>>,
|
||||
pub created_by: Uuid,
|
||||
pub updated_by: Uuid,
|
||||
}
|
||||
|
||||
#[derive(Queryable, Insertable, Associations, Debug)]
|
||||
|
|
|
@ -91,6 +91,7 @@ diesel::table! {
|
|||
updated_at -> Timestamptz,
|
||||
deleted_at -> Nullable<Timestamptz>,
|
||||
created_by -> Uuid,
|
||||
updated_by -> Uuid,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -315,8 +316,10 @@ diesel::table! {
|
|||
diesel::table! {
|
||||
messages (id) {
|
||||
id -> Uuid,
|
||||
request -> Text,
|
||||
response -> Jsonb,
|
||||
request_message -> Text,
|
||||
response_messages -> Jsonb,
|
||||
reasoning -> Jsonb,
|
||||
final_reasoning_message -> Text,
|
||||
chat_id -> Uuid,
|
||||
created_at -> Timestamptz,
|
||||
updated_at -> Timestamptz,
|
||||
|
@ -590,7 +593,6 @@ diesel::table! {
|
|||
diesel::joinable!(api_keys -> organizations (organization_id));
|
||||
diesel::joinable!(api_keys -> users (owner_id));
|
||||
diesel::joinable!(chats -> organizations (organization_id));
|
||||
diesel::joinable!(chats -> users (created_by));
|
||||
diesel::joinable!(collections -> organizations (organization_id));
|
||||
diesel::joinable!(dashboard_versions -> dashboards (dashboard_id));
|
||||
diesel::joinable!(dashboards -> organizations (organization_id));
|
||||
|
|
|
@ -47,10 +47,10 @@ impl ContextLoader for ChatContextLoader {
|
|||
let mut agent_messages = Vec::new();
|
||||
for message in messages {
|
||||
// Add user message
|
||||
agent_messages.push(AgentMessage::user(message.request));
|
||||
agent_messages.push(AgentMessage::user(message.request_message));
|
||||
|
||||
// Add assistant messages from response
|
||||
if let Ok(response_messages) = serde_json::from_value::<Vec<AgentMessage>>(message.response)
|
||||
if let Ok(response_messages) = serde_json::from_value::<Vec<AgentMessage>>(message.response_messages)
|
||||
{
|
||||
agent_messages.extend(response_messages);
|
||||
}
|
||||
|
|
|
@ -27,8 +27,10 @@ pub struct ThreadWithUser {
|
|||
#[derive(Queryable)]
|
||||
pub struct MessageWithUser {
|
||||
pub id: Uuid,
|
||||
pub request: String,
|
||||
pub response: Value,
|
||||
pub request_message: String,
|
||||
pub response_messages: Value,
|
||||
pub reasoning: Value,
|
||||
pub final_reasoning_message: String,
|
||||
pub created_at: DateTime<Utc>,
|
||||
pub user_id: Uuid,
|
||||
pub user_name: Option<String>,
|
||||
|
@ -83,8 +85,10 @@ pub async fn get_chat_handler(chat_id: &Uuid, user_id: &Uuid) -> Result<ChatWith
|
|||
.order_by(messages::created_at.desc())
|
||||
.select((
|
||||
messages::id,
|
||||
messages::request,
|
||||
messages::response,
|
||||
messages::request_message,
|
||||
messages::response_messages,
|
||||
messages::reasoning,
|
||||
messages::final_reasoning_message,
|
||||
messages::created_at,
|
||||
users::id,
|
||||
users::name.nullable(),
|
||||
|
@ -124,29 +128,21 @@ pub async fn get_chat_handler(chat_id: &Uuid, user_id: &Uuid) -> Result<ChatWith
|
|||
.and_then(|v| v.as_str())
|
||||
.map(String::from);
|
||||
|
||||
// Parse the response JSON to extract reasoning and response messages
|
||||
let (reasoning, response_messages) = msg
|
||||
.response
|
||||
// Convert response_messages and reasoning to Vec<Value>
|
||||
let response_messages = msg.response_messages
|
||||
.as_array()
|
||||
.map(|arr| {
|
||||
arr.iter().fold(
|
||||
(Vec::new(), Vec::new()),
|
||||
|(mut reasoning, mut responses), item| {
|
||||
if let Some(reasoning_obj) = item.get("reasoning") {
|
||||
reasoning.push(reasoning_obj.clone());
|
||||
} else if let Some(response_obj) = item.get("response_message") {
|
||||
responses.push(response_obj.clone());
|
||||
}
|
||||
(reasoning, responses)
|
||||
},
|
||||
)
|
||||
})
|
||||
.map(|arr| arr.to_vec())
|
||||
.unwrap_or_default();
|
||||
|
||||
let reasoning = msg.reasoning
|
||||
.as_array()
|
||||
.map(|arr| arr.to_vec())
|
||||
.unwrap_or_default();
|
||||
|
||||
ChatMessage {
|
||||
id: msg.id,
|
||||
request_message: crate::messages::types::ChatUserMessage {
|
||||
request: msg.request,
|
||||
request: msg.request_message,
|
||||
sender_id: msg.user_id,
|
||||
sender_name: msg.user_name.unwrap_or_else(|| "Unknown".to_string()),
|
||||
sender_avatar,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use std::collections::HashMap;
|
||||
use std::{collections::HashMap, time::Instant};
|
||||
|
||||
use agents::{
|
||||
tools::file_tools::search_data_catalog::SearchDataCatalogOutput, AgentExt, AgentMessage,
|
||||
|
@ -59,6 +59,7 @@ pub async fn post_chat_handler(
|
|||
user: User,
|
||||
tx: Option<mpsc::Sender<Result<(BusterContainer, ThreadEvent)>>>,
|
||||
) -> Result<ChatWithMessages> {
|
||||
let reasoning_duration = Instant::now();
|
||||
// Validate context request
|
||||
validate_context_request(request.chat_id, request.metric_id, request.dashboard_id)?;
|
||||
|
||||
|
@ -87,6 +88,7 @@ pub async fn post_chat_handler(
|
|||
created_at: Utc::now(),
|
||||
updated_at: Utc::now(),
|
||||
deleted_at: None,
|
||||
updated_by: user.id.clone(),
|
||||
};
|
||||
|
||||
let mut chat_with_messages = ChatWithMessages {
|
||||
|
@ -236,17 +238,22 @@ pub async fn post_chat_handler(
|
|||
}
|
||||
|
||||
let title = title_handle.await??;
|
||||
let reasoning_duration = reasoning_duration.elapsed().as_secs();
|
||||
|
||||
let final_reasoning_message = format!("Reasoned for {} seconds", reasoning_duration);
|
||||
|
||||
// Create and store message in the database
|
||||
let message = Message {
|
||||
id: message_id,
|
||||
request: request.prompt,
|
||||
response: serde_json::to_value(&all_messages)?,
|
||||
chat_id: chat_id,
|
||||
request_message: request.prompt,
|
||||
chat_id,
|
||||
created_by: user.id.clone(),
|
||||
created_at: Utc::now(),
|
||||
updated_at: Utc::now(),
|
||||
deleted_at: None,
|
||||
response_messages: serde_json::to_value(&all_messages)?,
|
||||
reasoning: serde_json::to_value(&all_messages)?,
|
||||
final_reasoning_message,
|
||||
};
|
||||
|
||||
// Insert message into database
|
||||
|
@ -319,7 +326,7 @@ async fn store_final_message_state(
|
|||
diesel::update(messages::table)
|
||||
.filter(messages::id.eq(message.id))
|
||||
.set((
|
||||
messages::response.eq(&message.response),
|
||||
messages::response_messages.eq(&message.response_messages),
|
||||
messages::updated_at.eq(message.updated_at),
|
||||
))
|
||||
.execute(conn)
|
||||
|
@ -561,7 +568,7 @@ pub fn transform_message(
|
|||
} => {
|
||||
if let Some(content) = content {
|
||||
let mut containers = Vec::new();
|
||||
|
||||
|
||||
// Create the regular content message
|
||||
let chat_messages = match transform_text_message(
|
||||
id.clone().unwrap_or_else(|| Uuid::new_v4().to_string()),
|
||||
|
@ -599,11 +606,13 @@ pub fn transform_message(
|
|||
status: Some("completed".to_string()),
|
||||
});
|
||||
|
||||
containers.push(BusterContainer::ReasoningMessage(BusterReasoningMessageContainer {
|
||||
reasoning: reasoning_message,
|
||||
chat_id: *chat_id,
|
||||
message_id: *message_id,
|
||||
}));
|
||||
containers.push(BusterContainer::ReasoningMessage(
|
||||
BusterReasoningMessageContainer {
|
||||
reasoning: reasoning_message,
|
||||
chat_id: *chat_id,
|
||||
message_id: *message_id,
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
return Ok((containers, ThreadEvent::GeneratingResponseMessage));
|
||||
|
|
|
@ -10,7 +10,8 @@ CREATE TABLE chats(
|
|||
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMP WITH TIME ZONE,
|
||||
created_by UUID NOT NULL REFERENCES users(id)
|
||||
created_by UUID NOT NULL REFERENCES users(id),
|
||||
updated_by UUID NOT NULL REFERENCES users(id)
|
||||
);
|
||||
|
||||
-- Create indexes for common query patterns
|
||||
|
|
|
@ -7,8 +7,10 @@ ALTER TABLE messages RENAME TO messages_deprecated;
|
|||
-- Create new messages table with updated schema
|
||||
CREATE TABLE messages (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
request TEXT NOT NULL,
|
||||
response JSONB NOT NULL,
|
||||
request_message TEXT NOT NULL,
|
||||
response_messages JSONB NOT NULL,
|
||||
reasoning JSONB NOT NULL,
|
||||
final_reasoning_message TEXT NOT NULL,
|
||||
chat_id UUID NOT NULL REFERENCES chats(id),
|
||||
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
||||
|
|
Loading…
Reference in New Issue