async_openai/
messages.rs

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
13/// Represents a message within a [thread](https://platform.openai.com/docs/api-reference/threads).
14pub struct Messages<'c, C: Config> {
15    ///  The ID of the [thread](https://platform.openai.com/docs/api-reference/threads) to create a message for.
16    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    /// Create a message.
29    #[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    /// Retrieve a message.
40    #[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    /// Modifies a message.
51    #[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    /// Returns a list of messages for a given thread.
66    #[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}