1use serde::Serialize;
2
3use crate::{
4 config::Config,
5 error::OpenAIError,
6 types::{
7 CreateMessageRequest, DeleteMessageResponse, ListMessagesResponse, MessageObject,
8 ModifyMessageRequest,
9 },
10 Client,
11};
12
13pub struct Messages<'c, C: Config> {
15 pub thread_id: String,
17 client: &'c Client<C>,
18}
19
20impl<'c, C: Config> Messages<'c, C> {
21 pub fn new(client: &'c Client<C>, thread_id: &str) -> Self {
22 Self {
23 client,
24 thread_id: thread_id.into(),
25 }
26 }
27
28 #[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
30 pub async fn create(
31 &self,
32 request: CreateMessageRequest,
33 ) -> Result<MessageObject, OpenAIError> {
34 self.client
35 .post(&format!("/threads/{}/messages", self.thread_id), request)
36 .await
37 }
38
39 #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
41 pub async fn retrieve(&self, message_id: &str) -> Result<MessageObject, OpenAIError> {
42 self.client
43 .get(&format!(
44 "/threads/{}/messages/{message_id}",
45 self.thread_id
46 ))
47 .await
48 }
49
50 #[crate::byot(T0 = std::fmt::Display, T1 = serde::Serialize, R = serde::de::DeserializeOwned)]
52 pub async fn update(
53 &self,
54 message_id: &str,
55 request: ModifyMessageRequest,
56 ) -> Result<MessageObject, OpenAIError> {
57 self.client
58 .post(
59 &format!("/threads/{}/messages/{message_id}", self.thread_id),
60 request,
61 )
62 .await
63 }
64
65 #[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
67 pub async fn list<Q>(&self, query: &Q) -> Result<ListMessagesResponse, OpenAIError>
68 where
69 Q: Serialize + ?Sized,
70 {
71 self.client
72 .get_with_query(&format!("/threads/{}/messages", self.thread_id), &query)
73 .await
74 }
75
76 #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
77 pub async fn delete(&self, message_id: &str) -> Result<DeleteMessageResponse, OpenAIError> {
78 self.client
79 .delete(&format!(
80 "/threads/{}/messages/{message_id}",
81 self.thread_id
82 ))
83 .await
84 }
85}