summary refs log tree commit diff
path: root/src/components/smart_summary.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/smart_summary.rs')
-rw-r--r--src/components/smart_summary.rs46
1 files changed, 20 insertions, 26 deletions
diff --git a/src/components/smart_summary.rs b/src/components/smart_summary.rs
index 050a52c..7b2df7d 100644
--- a/src/components/smart_summary.rs
+++ b/src/components/smart_summary.rs
@@ -8,20 +8,20 @@ use relm4::{gtk, prelude::{Component, ComponentParts}, ComponentSender};
 // All of this is incredibly minimalist.
 // This should be expanded later.
 #[derive(Debug, serde::Serialize)]
-struct OllamaRequest {
+pub(crate) struct OllamaRequest {
     model: String,
     prompt: String,
     system: String,
 }
 
 #[derive(Debug, serde::Deserialize)]
-struct OllamaChunk {
+pub(crate) struct OllamaChunk {
     response: String,
     done: bool,
 }
 
 #[derive(Debug, serde::Deserialize)]
-struct OllamaError {
+pub(crate) struct OllamaError {
     error: String
 }
 impl std::error::Error for OllamaError {}
@@ -33,7 +33,7 @@ impl std::fmt::Display for OllamaError {
 
 #[derive(serde::Deserialize)]
 #[serde(untagged)]
-enum OllamaResult {
+pub(crate) enum OllamaResult {
     Ok(OllamaChunk),
     Err(OllamaError),
 }
@@ -57,16 +57,22 @@ pub(crate) struct SmartSummaryButton {
 }
 
 impl SmartSummaryButton {
-    async fn prompt_llm(
+    async fn summarize(
         sender: relm4::Sender<Result<String, Error>>,
         http: soup::Session,
-        endpoint: glib::Uri,
-        model: String,
-        system_prompt: String,
-        prompt_prefix: String,
-        mut prompt_suffix: String,
         text: String,
     ) {
+        let settings = gio::Settings::new(crate::APPLICATION_ID);
+        // We shouldn't let the user record a bad setting anyway.
+        let endpoint = glib::Uri::parse(
+            &settings.string("llm-endpoint"),
+            glib::UriFlags::NONE,
+        ).unwrap();
+        let model = settings.get::<String>("smart-summary-model");
+        let system_prompt = settings.get::<String>("smart-summary-system-prompt");
+        let prompt_prefix = settings.get::<String>("smart-summary-prompt-prefix");
+        let mut prompt_suffix = settings.get::<String>("smart-summary-prompt-suffix");
+
         let endpoint = endpoint.parse_relative("./api/generate", glib::UriFlags::NONE).unwrap();
         log::debug!("endpoint: {}, model: {}", endpoint, model);
         log::debug!("system prompt: {}", system_prompt);
@@ -93,7 +99,7 @@ impl SmartSummaryButton {
             }
         };
         log::debug!("response: {:?} ({})", msg.status(), msg.reason_phrase().unwrap_or_default());
-        let mut buffer = Vec::new();
+        let mut buffer = Vec::with_capacity(2048);
         const DELIM: u8 = b'\n';
         loop {
             let len = match stream.read_until(DELIM, &mut buffer).await {
@@ -136,6 +142,7 @@ pub(crate) enum Error {
     #[error("json error: {0}")]
     Json(#[from] serde_json::Error),
     #[error("ollama error: {0}")]
+    #[allow(private_interfaces)]
     Ollama(#[from] OllamaError),
     #[error("i/o error: {0}")]
     Io(#[from] std::io::Error)
@@ -224,22 +231,9 @@ impl Component for SmartSummaryButton {
                 log::debug!("Would generate summary for the following text:\n{}", text);
 
                 log::debug!("XDG_DATA_DIRS={:?}", std::env::var("XDG_DATA_DIRS"));
-                let settings = gio::Settings::new(crate::APPLICATION_ID);
-                // We shouldn't let the user record a bad setting anyway.
-                let endpoint = glib::Uri::parse(
-                    &settings.get::<String>("llm-endpoint"),
-                    glib::UriFlags::NONE,
-                ).unwrap();
-                let model = settings.get::<String>("smart-summary-model");
-                let system_prompt = settings.get::<String>("smart-summary-system-prompt");
-                let prompt_prefix = settings.get::<String>("smart-summary-prompt-prefix");
-                let prompt_suffix = settings.get::<String>("smart-summary-prompt-suffix");
                 let sender = sender.command_sender().clone();
-                relm4::spawn_local(Self::prompt_llm(
-                    sender, self.http.clone(),
-                    endpoint, model, system_prompt,
-                    prompt_prefix, prompt_suffix,
-                    text
+                relm4::spawn_local(Self::summarize(
+                    sender, self.http.clone(), text
                 ));
             }
         }