use serde::{Deserialize, Serialize}; pub fn continue_content( context: &str, instruction: &str, _max_tokens: usize, ) -> Result> { let client = reqwest::blocking::Client::new(); let messages = vec![ Message { role: "system".to_string(), content: " Please generate content that is a direct continuation of the given text. Your response should be a logical next step in the content and should not repeat any of the text from the instruction or the content. Do not generate any text that is not a direct continuation of the content. if extra instructions are provided, follow them exactly, otherwise continue the text in a logical way. ".to_string(), }, Message { role: "user".to_string(), content: context.to_string(), }, Message { role: "user".to_string(), content: format!("Instructions: {instruction}"), }, ]; let request = ChatRequest { messages, temperature: 0.7, }; let response = client .post("http://localhost:1234/v1/chat/completions") .json(&request) .send()?; if !response.status().is_success() { return Err(format!("Request failed: {}", response.text()?).into()); } let response: ChatResponse = response.json()?; if let Some(choice) = response.choices.into_iter().next() { Ok(choice.message.content) } else { Err("No response from model".into()) } } pub fn ai_enabled() -> bool { let client = reqwest::blocking::Client::new(); client.get("http://localhost:1234/v1/models").send().is_ok() } // Simple request structure #[derive(Serialize)] struct ChatRequest { messages: Vec, temperature: f32, } #[derive(Serialize, Deserialize, Debug)] struct Message { role: String, content: String, } #[derive(Deserialize, Debug)] struct ChatResponse { choices: Vec, } #[derive(Deserialize, Debug)] struct Choice { message: Message, }