dynamo_async_openai/
messages.rs

1// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3//
4// Based on https://github.com/64bit/async-openai/ by Himanshu Neema
5// Original Copyright (c) 2022 Himanshu Neema
6// Licensed under MIT License (see ATTRIBUTIONS-Rust.md)
7//
8// Modifications Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES.
9// Licensed under Apache 2.0
10
11use serde::Serialize;
12
13use crate::{
14    Client,
15    config::Config,
16    error::OpenAIError,
17    types::{
18        CreateMessageRequest, DeleteMessageResponse, ListMessagesResponse, MessageObject,
19        ModifyMessageRequest,
20    },
21};
22
23/// Represents a message within a [thread](https://platform.openai.com/docs/api-reference/threads).
24pub struct Messages<'c, C: Config> {
25    ///  The ID of the [thread](https://platform.openai.com/docs/api-reference/threads) to create a message for.
26    pub thread_id: String,
27    client: &'c Client<C>,
28}
29
30impl<'c, C: Config> Messages<'c, C> {
31    pub fn new(client: &'c Client<C>, thread_id: &str) -> Self {
32        Self {
33            client,
34            thread_id: thread_id.into(),
35        }
36    }
37
38    /// Create a message.
39    #[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
40    pub async fn create(
41        &self,
42        request: CreateMessageRequest,
43    ) -> Result<MessageObject, OpenAIError> {
44        self.client
45            .post(&format!("/threads/{}/messages", self.thread_id), request)
46            .await
47    }
48
49    /// Retrieve a message.
50    #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
51    pub async fn retrieve(&self, message_id: &str) -> Result<MessageObject, OpenAIError> {
52        self.client
53            .get(&format!(
54                "/threads/{}/messages/{message_id}",
55                self.thread_id
56            ))
57            .await
58    }
59
60    /// Modifies a message.
61    #[crate::byot(T0 = std::fmt::Display, T1 = serde::Serialize, R = serde::de::DeserializeOwned)]
62    pub async fn update(
63        &self,
64        message_id: &str,
65        request: ModifyMessageRequest,
66    ) -> Result<MessageObject, OpenAIError> {
67        self.client
68            .post(
69                &format!("/threads/{}/messages/{message_id}", self.thread_id),
70                request,
71            )
72            .await
73    }
74
75    /// Returns a list of messages for a given thread.
76    #[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
77    pub async fn list<Q>(&self, query: &Q) -> Result<ListMessagesResponse, OpenAIError>
78    where
79        Q: Serialize + ?Sized,
80    {
81        self.client
82            .get_with_query(&format!("/threads/{}/messages", self.thread_id), &query)
83            .await
84    }
85
86    #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
87    pub async fn delete(&self, message_id: &str) -> Result<DeleteMessageResponse, OpenAIError> {
88        self.client
89            .delete(&format!(
90                "/threads/{}/messages/{message_id}",
91                self.thread_id
92            ))
93            .await
94    }
95}