notedeck

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

messages.rs (2536B)


      1 use crate::tools::{ToolCall, ToolResponse};
      2 use async_openai::types::*;
      3 use nostrdb::{Ndb, Transaction};
      4 
      5 #[derive(Debug, Clone)]
      6 pub enum Message {
      7     System(String),
      8     Error(String),
      9     User(String),
     10     Assistant(String),
     11     ToolCalls(Vec<ToolCall>),
     12     ToolResponse(ToolResponse),
     13 }
     14 
     15 /// The ai backends response. Since we are using streaming APIs these are
     16 /// represented as individual tokens or tool calls
     17 pub enum DaveApiResponse {
     18     ToolCalls(Vec<ToolCall>),
     19     Token(String),
     20     Failed(String),
     21 }
     22 
     23 impl Message {
     24     pub fn tool_error(id: String, msg: String) -> Self {
     25         Self::ToolResponse(ToolResponse::error(id, msg))
     26     }
     27 
     28     pub fn to_api_msg(&self, txn: &Transaction, ndb: &Ndb) -> Option<ChatCompletionRequestMessage> {
     29         match self {
     30             Message::Error(_err) => None,
     31 
     32             Message::User(msg) => Some(ChatCompletionRequestMessage::User(
     33                 ChatCompletionRequestUserMessage {
     34                     name: None,
     35                     content: ChatCompletionRequestUserMessageContent::Text(msg.clone()),
     36                 },
     37             )),
     38 
     39             Message::Assistant(msg) => Some(ChatCompletionRequestMessage::Assistant(
     40                 ChatCompletionRequestAssistantMessage {
     41                     content: Some(ChatCompletionRequestAssistantMessageContent::Text(
     42                         msg.clone(),
     43                     )),
     44                     ..Default::default()
     45                 },
     46             )),
     47 
     48             Message::System(msg) => Some(ChatCompletionRequestMessage::System(
     49                 ChatCompletionRequestSystemMessage {
     50                     content: ChatCompletionRequestSystemMessageContent::Text(msg.clone()),
     51                     ..Default::default()
     52                 },
     53             )),
     54 
     55             Message::ToolCalls(calls) => Some(ChatCompletionRequestMessage::Assistant(
     56                 ChatCompletionRequestAssistantMessage {
     57                     tool_calls: Some(calls.iter().map(|c| c.to_api()).collect()),
     58                     ..Default::default()
     59                 },
     60             )),
     61 
     62             Message::ToolResponse(resp) => {
     63                 let tool_response = resp.responses().format_for_dave(txn, ndb);
     64 
     65                 Some(ChatCompletionRequestMessage::Tool(
     66                     ChatCompletionRequestToolMessage {
     67                         tool_call_id: resp.id().to_owned(),
     68                         content: ChatCompletionRequestToolMessageContent::Text(tool_response),
     69                     },
     70                 ))
     71             }
     72         }
     73     }
     74 }