async_openai_alt/
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, MessageFiles,
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    /// Call [MessageFiles] API group
29    pub fn files(&self, message_id: &str) -> MessageFiles<C> {
30        MessageFiles::new(self.client, &self.thread_id, message_id)
31    }
32
33    /// Create a message.
34    pub async fn create(
35        &self,
36        request: CreateMessageRequest,
37    ) -> Result<MessageObject, OpenAIError> {
38        self.client
39            .post(&format!("/threads/{}/messages", self.thread_id), request)
40            .await
41    }
42
43    /// Retrieve a message.
44    pub async fn retrieve(&self, message_id: &str) -> Result<MessageObject, OpenAIError> {
45        self.client
46            .get(&format!(
47                "/threads/{}/messages/{message_id}",
48                self.thread_id
49            ))
50            .await
51    }
52
53    /// Modifies a message.
54    pub async fn update(
55        &self,
56        message_id: &str,
57        request: ModifyMessageRequest,
58    ) -> Result<MessageObject, OpenAIError> {
59        self.client
60            .post(
61                &format!("/threads/{}/messages/{message_id}", self.thread_id),
62                request,
63            )
64            .await
65    }
66
67    /// Returns a list of messages for a given thread.
68    pub async fn list<Q>(&self, query: &Q) -> Result<ListMessagesResponse, OpenAIError>
69    where
70        Q: Serialize + ?Sized,
71    {
72        self.client
73            .get_with_query(&format!("/threads/{}/messages", self.thread_id), query)
74            .await
75    }
76
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}