diff --git a/src/artifacts.rs b/src/artifacts.rs new file mode 100644 index 0000000..dd75e7c --- /dev/null +++ b/src/artifacts.rs @@ -0,0 +1,45 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; + + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum Artifact { + Bandcamp(BandcampResult), + BeetsTrack(serde_json::Value) +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum BandcampResult { + Artist { name: String, bio: Option, location: Option }, + Album { title: String, about: Option, credits: Option, release_date: DateTime, artist: String } +} + +impl Into for bandcamp::Artist { + fn into(self) -> BandcampResult { + BandcampResult::Artist { name: self.name, bio: self.bio, location: self.location } + } +} + +impl Into for bandcamp::Album { + fn into(self) -> BandcampResult { + BandcampResult::Album { + about: self.about, + title: self.title, + artist: self.band.name, + credits: self.credits, + release_date: self.release_date + } + } +} + +impl Into for bandcamp::Album { + fn into(self) -> Artifact { + Artifact::Bandcamp(self.into()) + } +} + +impl Into for bandcamp::Artist { + fn into(self) -> Artifact { + Artifact::Bandcamp(self.into()) + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 3aaee3b..c984fd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,7 @@ mod transcription; mod tts; mod prediction; mod audio; +mod artifacts; // TODO: We should be able to delete entries from the conversation, or at least go back and edit something I said. // TODO: I want a "mark" command or keyboard shortcut, that inserts a marker into the log, so I know where to come back for the next speaking segment. diff --git a/src/prediction.rs b/src/prediction.rs index 1ffcf25..49775e2 100644 --- a/src/prediction.rs +++ b/src/prediction.rs @@ -2,13 +2,12 @@ use std::process::{Command, Stdio}; 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::{mpsc, watch}; -use crate::{SaveData, scene::{Artifact, ConversationEntry, PredictionAction, Scene, Scenery, StageDirection}}; +use crate::{SaveData, artifacts::{Artifact, BandcampResult}, scene::{ConversationEntry, PredictionAction, Scene, Scenery, StageDirection}}; const SYSTEM_PROMPT: &str = include_str!("system-prompt.txt"); @@ -62,30 +61,6 @@ struct BandcampQueryArgs { query: String } -#[derive(Debug, Serialize, Deserialize, Clone)] -pub enum BandcampResult { - Artist { name: String, bio: Option, location: Option }, - Album { title: String, about: Option, credits: Option, release_date: DateTime, artist: String } -} - -impl Into for bandcamp::Artist { - fn into(self) -> BandcampResult { - BandcampResult::Artist { name: self.name, bio: self.bio, location: self.location } - } -} - -impl Into for bandcamp::Album { - fn into(self) -> BandcampResult { - BandcampResult::Album { - about: self.about, - title: self.title, - artist: self.band.name, - credits: self.credits, - release_date: self.release_date - } - } -} - #[derive(Default, Debug)] struct ToolResults { result: Option, @@ -133,12 +108,12 @@ impl Session { for result in results { match result { SearchResultItem::Artist(data) => { - let result: BandcampResult = bandcamp::fetch_artist(data.artist_id).await.unwrap().into(); - json_results.push(Artifact::Bandcamp(result)); + let result = bandcamp::fetch_artist(data.artist_id).await.unwrap().into(); + json_results.push(result); }, SearchResultItem::Album(data) => { - let result: BandcampResult = bandcamp::fetch_album(data.band_id, data.album_id).await.unwrap().into(); - json_results.push(Artifact::Bandcamp(result)); + let result = bandcamp::fetch_album(data.band_id, data.album_id).await.unwrap().into(); + json_results.push(result); } _ => () } diff --git a/src/scene.rs b/src/scene.rs index 1ee6760..53a9615 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -3,7 +3,7 @@ use chrono::{DateTime, Duration, Utc}; use serde::{Deserialize, Serialize}; use sqlite::OpenFlags; -use crate::prediction::{BandcampResult, GeneratedResponses, PossibleResponse}; +use crate::{artifacts::Artifact, prediction::{GeneratedResponses, PossibleResponse}}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub enum ConversationEntry { @@ -74,12 +74,6 @@ impl Default for StageDirection { } } -#[derive(Debug, Serialize, Deserialize, Clone)] -pub enum Artifact { - Bandcamp(BandcampResult), - BeetsTrack(serde_json::Value) -} - #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct Scenery { pub artifacts: Vec