rust_chatgpt/
lib.rs

1pub(crate) mod error;
2pub(crate) mod http;
3mod v1;
4
5use crate::error::ChatGptError;
6use crate::http::HttpClient;
7use reqwest::multipart::Form;
8use serde_json::Value;
9
10pub use crate::v1::audio::*;
11pub use crate::v1::chat::*;
12pub use crate::v1::completions::*;
13pub use crate::v1::edits::*;
14pub use crate::v1::embeddings::*;
15pub use crate::v1::images::*;
16pub use crate::v1::models::*;
17pub use crate::v1::{ChatGptRequest, ChatGptResponse};
18
19pub struct ChatGpt {
20    oepenai_api_key: String,
21    org_id: String,
22    base_url: String,
23}
24
25impl ChatGpt {
26    pub fn new(oepenai_api_key: &str) -> Self {
27        Self {
28            oepenai_api_key: oepenai_api_key.to_string(),
29            org_id: "".to_string(),
30            base_url: "https://api.openai.com".to_string(),
31        }
32    }
33    pub fn new_org(oepenai_api_key: String, org_id: String) -> Self {
34        Self {
35            oepenai_api_key,
36            org_id,
37            base_url: "https://api.openai.com".to_string(),
38        }
39    }
40
41    pub fn new_with_base_url(oepenai_api_key: &str, base_url: &str) -> Self {
42        Self {
43            oepenai_api_key: oepenai_api_key.to_string(),
44            org_id: "".to_string(),
45            base_url: base_url.to_string(),
46        }
47    }
48
49    pub fn new_org_with_base_url(
50        oepenai_api_key: String,
51        org_id: String,
52        base_url: String,
53    ) -> Self {
54        Self {
55            oepenai_api_key,
56            org_id,
57            base_url,
58        }
59    }
60
61    pub async fn models_list(&self) -> Result<ChatGptResponseModelList, ChatGptError> {
62        let url = format!("{}/v1/models", self.base_url);
63        let value = HttpClient::get(
64            self.oepenai_api_key.as_str(),
65            self.org_id.as_str(),
66            &url,
67            &Value::default(),
68        )
69        .await?;
70        Ok(ChatGptResponseModelList { value })
71    }
72    pub async fn models_retrieve(
73        &self,
74        model: &str,
75    ) -> Result<ChatGptResponseModelRetrieve, ChatGptError> {
76        let url = format!("{}/v1/models/{}", self.base_url, model);
77        let value = HttpClient::get(
78            self.oepenai_api_key.as_str(),
79            self.org_id.as_str(),
80            &url,
81            &Value::default(),
82        )
83        .await?;
84        Ok(ChatGptResponseModelRetrieve { value })
85    }
86    pub async fn completions_create(
87        &self,
88        request: &ChatGptRequestCompletionsCreate,
89    ) -> Result<ChatGptResponseModelRetrieve, ChatGptError> {
90        let url = format!("{}/v1/completions", self.base_url);
91
92        let value = HttpClient::post(
93            self.oepenai_api_key.as_str(),
94            self.org_id.as_str(),
95            &url,
96            &request.to_value(),
97        )
98        .await?;
99        Ok(ChatGptResponseModelRetrieve { value })
100    }
101    pub async fn chat_completions(
102        &self,
103        request: &ChatGptRequestChatCompletions,
104    ) -> Result<ChatGptResponseChatCompletions, ChatGptError> {
105        let url = format!("{}/v1/chat/completions", self.base_url);
106        let data = request.to_value();
107        let value = HttpClient::post(
108            self.oepenai_api_key.as_str(),
109            self.org_id.as_str(),
110            &url,
111            &data,
112        )
113        .await?;
114        Ok(ChatGptResponseChatCompletions { value })
115    }
116    pub async fn edits(&self, request: &ChatGptRequestEdits) -> Result<Value, ChatGptError> {
117        let url = format!("{}/v1/edits", self.base_url);
118        let data = request.to_value();
119        HttpClient::post(
120            self.oepenai_api_key.as_str(),
121            self.org_id.as_str(),
122            &url,
123            &data,
124        )
125        .await
126    }
127    pub async fn images_generations(
128        &self,
129        request: &ChatGptRequestImagesGenerations,
130    ) -> Result<ChatGptResponseImagesGenerations, ChatGptError> {
131        let url = format!("{}/v1/images/generations", self.base_url);
132        let data = request.to_value();
133        let value = HttpClient::post(
134            self.oepenai_api_key.as_str(),
135            self.org_id.as_str(),
136            &url,
137            &data,
138        )
139        .await?;
140        Ok(ChatGptResponseImagesGenerations { value })
141    }
142    pub async fn images_edits(
143        &self,
144        request: &ChatGptRequestImagesEdits,
145    ) -> Result<ChatGptResponseImagesEdits, ChatGptError> {
146        let url = format!("{}/v1/images/edits", self.base_url);
147        let value = HttpClient::post_data(
148            self.oepenai_api_key.as_str(),
149            self.org_id.as_str(),
150            &url,
151            Form::from(request.clone()),
152        )
153        .await?;
154        Ok(ChatGptResponseImagesEdits { value })
155    }
156    pub async fn images_variations(
157        &self,
158        request: &ChatGptRequestImagesVariation,
159    ) -> Result<ChatGptResponseImagesVariation, ChatGptError> {
160        let url = format!("{}/v1/images/variations", self.base_url);
161        let value = HttpClient::post_data(
162            self.oepenai_api_key.as_str(),
163            self.org_id.as_str(),
164            &url,
165            Form::from(request.clone()),
166        )
167        .await?;
168        Ok(ChatGptResponseImagesVariation { value })
169    }
170    pub async fn embeddings(
171        &self,
172        request: &ChatGptRequestEmbeddingsGenerations,
173    ) -> Result<Value, ChatGptError> {
174        let url = format!("{}/v1/embeddings", self.base_url);
175        let data = request.to_value();
176        HttpClient::post(
177            self.oepenai_api_key.as_str(),
178            self.org_id.as_str(),
179            &url,
180            &data,
181        )
182        .await
183    }
184    pub async fn audio_transcriptions(
185        &self,
186        request: &ChatGptRequestAudioTranscriptions,
187    ) -> Result<ChatGptResponseAudioTranscriptions, ChatGptError> {
188        let url = format!("{}/v1/audio/transcriptions", self.base_url);
189        let value = HttpClient::post_data(
190            self.oepenai_api_key.as_str(),
191            self.org_id.as_str(),
192            &url,
193            Form::from(request.clone()),
194        )
195        .await?;
196        Ok(ChatGptResponseAudioTranscriptions { value })
197    }
198    pub async fn audio_translations(
199        &self,
200        request: &ChatGptRequestAudioTranslations,
201    ) -> Result<ChatGptResponseAudioTranslations, ChatGptError> {
202        let url = format!("{}/v1/audio/translations", self.base_url);
203        let value = HttpClient::post_data(
204            self.oepenai_api_key.as_str(),
205            self.org_id.as_str(),
206            &url,
207            Form::from(request.clone()),
208        )
209        .await?;
210        Ok(ChatGptResponseAudioTranslations { value })
211    }
212}