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}