feat: a2ui interface to enablee the LLM to give structured information
This commit is contained in:
@@ -1,6 +1,79 @@
|
||||
use super::*;
|
||||
|
||||
impl App {
|
||||
pub(super) fn clear_a2ui(&mut self) {
|
||||
self.a2ui.clear();
|
||||
self.a2ui_tabs.clear();
|
||||
self.a2ui_modals.clear();
|
||||
self.a2ui_editors.clear();
|
||||
self.a2ui_markdown.clear();
|
||||
self.a2ui_choice_filters.clear();
|
||||
self.a2ui_images.clear();
|
||||
self.a2ui_image_requests.clear();
|
||||
self.a2ui_image_loading = false;
|
||||
}
|
||||
|
||||
pub(super) fn load_next_a2ui_image(&mut self) -> Task<Message> {
|
||||
if self.a2ui_image_loading {
|
||||
return Task::none();
|
||||
}
|
||||
let Some(url) = self
|
||||
.a2ui
|
||||
.image_urls()
|
||||
.find(|url| !self.a2ui_image_requests.contains(url))
|
||||
else {
|
||||
return Task::none();
|
||||
};
|
||||
self.a2ui_image_requests.insert(url.clone());
|
||||
self.a2ui_image_loading = true;
|
||||
let request_url = url.clone();
|
||||
Task::perform(
|
||||
async move {
|
||||
let mut response = ureq::get(&request_url)
|
||||
.call()
|
||||
.map_err(|error| error.to_string())?;
|
||||
if !response
|
||||
.headers()
|
||||
.get("content-type")
|
||||
.and_then(|value| value.to_str().ok())
|
||||
.is_some_and(|value| value.starts_with("image/"))
|
||||
{
|
||||
return Err("the URL did not return an image".to_owned());
|
||||
}
|
||||
response
|
||||
.body_mut()
|
||||
.read_to_vec()
|
||||
.map_err(|error| error.to_string())
|
||||
},
|
||||
move |result| Message::A2uiImageLoaded(url, result),
|
||||
)
|
||||
}
|
||||
|
||||
pub(super) fn change_a2ui_data(
|
||||
&mut self,
|
||||
surface_id: String,
|
||||
path: String,
|
||||
value: serde_json::Value,
|
||||
) -> Task<Message> {
|
||||
let owner = self
|
||||
.a2ui
|
||||
.surface(&surface_id)
|
||||
.map(|surface| surface.owner_message_id);
|
||||
match self.a2ui.local_update(&surface_id, &path, value) {
|
||||
Ok(raw) => {
|
||||
if let (Some(session_id), Some(message_id), Some(database)) =
|
||||
(self.selected_session, owner, &mut self.database)
|
||||
&& let Err(error) = database.insert_a2ui_message(session_id, message_id, &raw)
|
||||
{
|
||||
self.error = Some(format!("Could not save the A2UI edit: {error}"));
|
||||
}
|
||||
}
|
||||
Err(error) => self.error = Some(error),
|
||||
}
|
||||
self.sync_a2ui_renderer_state();
|
||||
self.load_next_a2ui_image()
|
||||
}
|
||||
|
||||
pub(super) fn prepare_project(&mut self, path: PathBuf) {
|
||||
let Ok(path) = fs::canonicalize(path) else {
|
||||
self.error = Some("The selected folder is no longer available.".into());
|
||||
@@ -49,6 +122,7 @@ impl App {
|
||||
Ok(project) => {
|
||||
self.remember_project(project.id);
|
||||
self.selected_session = None;
|
||||
self.clear_a2ui();
|
||||
self.system_prompt_seen_at = 0;
|
||||
self.pending_project_path = None;
|
||||
self.project_name_input.clear();
|
||||
@@ -78,6 +152,7 @@ impl App {
|
||||
self.remember_project(project_id);
|
||||
self.selected_session = None;
|
||||
self.conversation.clear();
|
||||
self.clear_a2ui();
|
||||
self.composer.clear();
|
||||
self.queued_inputs.clear();
|
||||
self.system_prompt_seen_at = 0;
|
||||
@@ -90,6 +165,7 @@ impl App {
|
||||
pub(super) fn discard_session(&mut self, project_id: i32) {
|
||||
if self.drafts.remove(&project_id).is_some() && self.draft_selected(project_id) {
|
||||
self.conversation.clear();
|
||||
self.clear_a2ui();
|
||||
self.composer.clear();
|
||||
self.queued_inputs.clear();
|
||||
self.system_prompt_seen_at = 0;
|
||||
|
||||
Reference in New Issue
Block a user