notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit b50bc2e988e2456959036ceb892d9b128acae545
parent bf18eb4e69345736248efb819f4cc7dbde2449f8
Author: William Casarin <jb55@jb55.com>
Date:   Wed, 16 Apr 2025 22:41:41 -0700

dave: refactor a bit

pulling tokens isn't really a part of rendering,
so let's pull that out

Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mcrates/notedeck_dave/src/lib.rs | 91++++++++++++++++++++++++++++++++++++++-----------------------------------------
1 file changed, 44 insertions(+), 47 deletions(-)

diff --git a/crates/notedeck_dave/src/lib.rs b/crates/notedeck_dave/src/lib.rs @@ -97,44 +97,52 @@ You are an AI agent for the nostr protocol called Dave, created by Damus. nostr } } - fn render(&mut self, app_ctx: &AppContext, ui: &mut egui::Ui) { + /// Process incoming tokens from the ai backend + fn process_events(&mut self, app_ctx: &AppContext) -> bool { let mut should_send = false; - if let Some(recvr) = &self.incoming_tokens { - while let Ok(res) = recvr.try_recv() { - if let Some(avatar) = &mut self.avatar { - avatar.random_nudge(); - } - match res { - DaveResponse::Token(token) => match self.chat.last_mut() { - Some(Message::Assistant(msg)) => *msg = msg.clone() + &token, - Some(_) => self.chat.push(Message::Assistant(token)), - None => {} - }, - - DaveResponse::ToolCalls(toolcalls) => { - tracing::info!("got tool calls: {:?}", toolcalls); - self.chat.push(Message::ToolCalls(toolcalls.clone())); - - let txn = Transaction::new(app_ctx.ndb).unwrap(); - for call in &toolcalls { - // execute toolcall - match call.calls() { - ToolCalls::Query(search_call) => { - let resp = search_call.execute(&txn, app_ctx.ndb); - self.chat.push(Message::ToolResponse(ToolResponse::new( - call.id().to_owned(), - ToolResponses::Query(resp), - ))) - } + + let Some(recvr) = &self.incoming_tokens else { + return should_send; + }; + + while let Ok(res) = recvr.try_recv() { + if let Some(avatar) = &mut self.avatar { + avatar.random_nudge(); + } + match res { + DaveResponse::Token(token) => match self.chat.last_mut() { + Some(Message::Assistant(msg)) => *msg = msg.clone() + &token, + Some(_) => self.chat.push(Message::Assistant(token)), + None => {} + }, + + DaveResponse::ToolCalls(toolcalls) => { + tracing::info!("got tool calls: {:?}", toolcalls); + self.chat.push(Message::ToolCalls(toolcalls.clone())); + + let txn = Transaction::new(app_ctx.ndb).unwrap(); + for call in &toolcalls { + // execute toolcall + match call.calls() { + ToolCalls::Query(search_call) => { + let resp = search_call.execute(&txn, app_ctx.ndb); + self.chat.push(Message::ToolResponse(ToolResponse::new( + call.id().to_owned(), + ToolResponses::Query(resp), + ))) } } - - should_send = true; } + + should_send = true; } } } + should_send + } + + fn render(&mut self, app_ctx: &AppContext, ui: &mut egui::Ui) { // Scroll area for chat messages egui::Frame::new() .inner_margin(egui::Margin { @@ -150,26 +158,11 @@ You are an AI agent for the nostr protocol called Dave, created by Damus. nostr .show(ui, |ui| { ui.vertical(|ui| { self.render_chat(ui); - - self.inputbox(app_ctx, ui); }) }); - }); - - /* - // he lives in the sidebar now - if let Some(avatar) = &mut self.avatar { - let avatar_size = Vec2::splat(300.0); - let pos = Vec2::splat(100.0).to_pos2(); - let pos = Rect::from_min_max(pos, pos + avatar_size); - avatar.render(pos, ui); - } - */ - // send again - if should_send { - self.send_user_message(app_ctx, ui.ctx()); - } + self.inputbox(app_ctx, ui); + }); } fn render_chat(&self, ui: &mut egui::Ui) { @@ -388,6 +381,10 @@ impl notedeck::App for Dave { */ //update_dave(self, ctx, ui.ctx()); + let should_send = self.process_events(ctx); self.render(ctx, ui); + if should_send { + self.send_user_message(ctx, ui.ctx()); + } } }