From 0396bc12e01c5b461d0ac821e7cc9bdedf0b2801 Mon Sep 17 00:00:00 2001 From: Victoria Fischer Date: Tue, 9 Jun 2026 23:34:07 +0200 Subject: [PATCH] prediction: move actions into prediction mod --- src/main.rs | 10 +++++----- src/prediction.rs | 17 ++++++++++++++--- src/scene/mod.rs | 11 +---------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index b58747c..9bbddca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::{cell::RefCell, rc::Rc, sync::Arc}; +use std::sync::Arc; use async_openai::types::chat::ChatCompletionRequestMessage; use chrono::{Duration, Utc}; @@ -9,14 +9,14 @@ use ratatui::{Frame, layout::{Constraint, Direction, Layout}, widgets::{Block, B use static_cell::StaticCell; use throbber_widgets_tui::{Throbber, ThrobberState}; use crossterm::{event::{self, EventStream, KeyCode, KeyModifiers}}; -use tokio::{sync::RwLock, time::Instant}; +use tokio::time::Instant; use tui_input::{Input, backend::crossterm::EventHandler}; use futures::{StreamExt, future::FutureExt}; use ratatui::prelude::*; use tui_skeleton::{AnimationMode, SkeletonText}; -use crate::{audio::{AudioInputControl, start_audio_input}, prediction::{SessionControl, SessionUpdate}, scene::{PredictionAction, Scene, Scenery, StageDirection, conversation::ConversationEntry}, transcription::TranscriptionControl, tts::{TtsControl, start_tts}}; +use crate::{audio::{AudioInputControl, start_audio_input}, prediction::{PredictionAction, SessionControl, SessionUpdate}, scene::{Scene, Scenery, StageDirection, conversation::ConversationEntry}, transcription::TranscriptionControl, tts::{TtsControl, start_tts}}; mod scene; mod events; @@ -380,7 +380,7 @@ impl App { // FIXME: Need some new kind of /bandcamp command to force loading of specific urls "/episode" => { if let Ok(episode_number) = arg.trim().parse() { - self.predictions.insert(scene::PredictionAction::SetEpisodeNumber(episode_number)).await; + self.predictions.insert(PredictionAction::SetEpisodeNumber(episode_number)).await; } else { self.predictions.log("Invalid episode number format. Use /episode [number]".into()).await; return; @@ -498,7 +498,7 @@ impl SaveData { struct SysMessageLogger(Arc>); impl log::Log for SysMessageLogger { - fn enabled(&self, metadata: &log::Metadata) -> bool { + fn enabled(&self, _metadata: &log::Metadata) -> bool { true } diff --git a/src/prediction.rs b/src/prediction.rs index d99efcb..78ab636 100644 --- a/src/prediction.rs +++ b/src/prediction.rs @@ -2,16 +2,27 @@ use std::sync::Arc; use async_openai::{Client, config::OpenAIConfig, types::chat::{ChatCompletionMessageToolCalls, ChatCompletionRequestAssistantMessageArgs, ChatCompletionRequestMessage, ChatCompletionRequestSystemMessageArgs, ChatCompletionRequestToolMessageArgs, ChatCompletionTool, ChatCompletionTools, CreateChatCompletionRequestArgs, FinishReason, FunctionObjectArgs, ResponseFormat, ResponseFormatJsonSchema}}; use bandcamp::SearchResultItem; +use chrono::{DateTime, Utc}; use schemars::{JsonSchema, schema_for}; use serde::{Deserialize, Serialize}; use serde_json::{Serializer, ser::CompactFormatter}; use tokio::sync::{RwLock, mpsc, watch}; -use crate::{SaveData, archive::BeatsQueryArgs, artifacts::{Artifact, Artist, BandcampQueryArgs, MixxxDB}, scene::{PredictionAction, Scene, Scenery, StageDirection, conversation::ConversationEntry}}; +use crate::{SaveData, archive::BeatsQueryArgs, artifacts::{BandcampQueryArgs, MixxxDB}, scene::{Scene, Scenery, StageDirection, conversation::ConversationEntry}}; const SYSTEM_PROMPT: &str = include_str!("system-prompt.txt"); +#[derive(Debug, Clone)] +pub enum PredictionAction { + ConversationAppend(ConversationEntry), + SetEpisodeNumber(u32), + GeneratePredictions, + SetNarrative(String), + SetShowEndTime(DateTime) +} + + #[derive(JsonSchema, Deserialize, Serialize, Debug, Clone)] pub struct PossibleResponse { pub text: String, @@ -112,7 +123,7 @@ impl Session { for track in &json_results { if let Some(merge_target) = self.scenery.artifacts.iter_mut().find(|a| { *a == track }) { - merge_target.merge(track); + merge_target.merge(track.clone()); } else { self.scenery.artifacts.push(track.clone()); } @@ -390,7 +401,7 @@ pub async fn start_prediction(saved_session: SaveData, mut messages: tokio::sync Ok(playlist) => { for track in &playlist { if let Some(merge_target) = session.scenery.artifacts.iter_mut().find(|a| { *a == track }) { - merge_target.merge(track); + merge_target.merge(track.clone()); } else { session.scenery.artifacts.push(track.clone()); } diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 7a9a4e0..5e6de37 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -1,7 +1,7 @@ use chrono::{DateTime, Duration, Utc}; use serde::{Deserialize, Serialize}; -use crate::{artifacts::{Artifact, MixxxDB, MixxxError}, prediction::{GeneratedResponses, PossibleResponse}, scene::conversation::ConversationEntry}; +use crate::{artifacts::Artifact, prediction::{GeneratedResponses, PossibleResponse}, scene::conversation::ConversationEntry}; pub mod conversation; @@ -35,15 +35,6 @@ pub struct Scenery { pub current_playlist: Vec } -#[derive(Debug, Clone)] -pub enum PredictionAction { - ConversationAppend(ConversationEntry), - SetEpisodeNumber(u32), - GeneratePredictions, - SetNarrative(String), - SetShowEndTime(DateTime) -} - #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct Scene { reply_options: GeneratedResponses,