1use std::collections::BTreeMap;
4
5use http::Method;
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use crate::generated::endpoints;
10
11use super::{
12 CompletionsResource, DeleteResponse, EmbeddingResponse, EmbeddingsResource, JsonRequestBuilder,
13 ListRequestBuilder, Model, ModelsResource, ModerationsResource, encode_path_segment,
14};
15
16#[derive(Debug, Clone, Serialize, Deserialize, Default)]
18pub struct Completion {
19 pub id: String,
21 #[serde(default)]
23 pub object: String,
24 pub created: Option<i64>,
26 #[serde(default)]
28 pub model: String,
29 #[serde(default)]
31 pub choices: Vec<CompletionChoice>,
32 pub usage: Option<CompletionUsage>,
34 pub system_fingerprint: Option<String>,
36 #[serde(flatten)]
38 pub extra: BTreeMap<String, Value>,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize, Default)]
43pub struct CompletionChoice {
44 pub finish_reason: Option<String>,
46 pub index: u32,
48 pub logprobs: Option<CompletionLogProbs>,
50 #[serde(default)]
52 pub text: String,
53 #[serde(flatten)]
55 pub extra: BTreeMap<String, Value>,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize, Default)]
60pub struct CompletionLogProbs {
61 #[serde(default)]
63 pub text_offset: Vec<i64>,
64 #[serde(default)]
66 pub token_logprobs: Vec<f64>,
67 #[serde(default)]
69 pub tokens: Vec<String>,
70 #[serde(default)]
72 pub top_logprobs: Vec<BTreeMap<String, f64>>,
73 #[serde(flatten)]
75 pub extra: BTreeMap<String, Value>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, Default)]
80pub struct CompletionUsage {
81 pub completion_tokens: u64,
83 pub prompt_tokens: u64,
85 pub total_tokens: u64,
87 pub prompt_tokens_details: Option<CompletionUsagePromptTokensDetails>,
89 pub completion_tokens_details: Option<CompletionUsageCompletionTokensDetails>,
91 #[serde(flatten)]
93 pub extra: BTreeMap<String, Value>,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
98pub struct CompletionUsagePromptTokensDetails {
99 pub audio_tokens: Option<u64>,
101 pub cached_tokens: Option<u64>,
103 #[serde(flatten)]
105 pub extra: BTreeMap<String, Value>,
106}
107
108#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
110pub struct CompletionUsageCompletionTokensDetails {
111 pub accepted_prediction_tokens: Option<u64>,
113 pub audio_tokens: Option<u64>,
115 pub reasoning_tokens: Option<u64>,
117 pub rejected_prediction_tokens: Option<u64>,
119 #[serde(flatten)]
121 pub extra: BTreeMap<String, Value>,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize, Default)]
126pub struct ModerationCreateResponse {
127 pub id: String,
129 #[serde(default)]
131 pub model: String,
132 #[serde(default)]
134 pub results: Vec<ModerationResult>,
135 #[serde(flatten)]
137 pub extra: BTreeMap<String, Value>,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize, Default)]
142pub struct ModerationResult {
143 #[serde(default)]
145 pub categories: BTreeMap<String, bool>,
146 #[serde(default)]
148 pub category_applied_input_types: BTreeMap<String, Vec<String>>,
149 #[serde(default)]
151 pub category_scores: BTreeMap<String, f64>,
152 #[serde(default)]
154 pub flagged: bool,
155 #[serde(flatten)]
157 pub extra: BTreeMap<String, Value>,
158}
159
160impl CompletionsResource {
161 pub fn create(&self) -> JsonRequestBuilder<Completion> {
163 let endpoint = endpoints::core::COMPLETIONS_CREATE;
164 JsonRequestBuilder::new(
165 self.client.clone(),
166 endpoint.id,
167 Method::POST,
168 endpoint.template,
169 )
170 }
171}
172
173impl EmbeddingsResource {
174 pub fn create(&self) -> JsonRequestBuilder<EmbeddingResponse> {
176 JsonRequestBuilder::new(
177 self.client.clone(),
178 "embeddings.create",
179 Method::POST,
180 "/embeddings",
181 )
182 }
183}
184
185impl ModerationsResource {
186 pub fn create(&self) -> JsonRequestBuilder<ModerationCreateResponse> {
188 let endpoint = endpoints::core::MODERATIONS_CREATE;
189 JsonRequestBuilder::new(
190 self.client.clone(),
191 endpoint.id,
192 Method::POST,
193 endpoint.template,
194 )
195 }
196}
197
198impl ModelsResource {
199 pub fn list(&self) -> ListRequestBuilder<Model> {
201 ListRequestBuilder::new(self.client.clone(), "models.list", "/models")
202 }
203
204 pub fn retrieve(&self, model_id: impl Into<String>) -> JsonRequestBuilder<Model> {
206 JsonRequestBuilder::new(
207 self.client.clone(),
208 "models.retrieve",
209 Method::GET,
210 format!("/models/{}", encode_path_segment(model_id.into())),
211 )
212 }
213
214 pub fn delete(&self, model_id: impl Into<String>) -> JsonRequestBuilder<DeleteResponse> {
216 JsonRequestBuilder::new(
217 self.client.clone(),
218 "models.delete",
219 Method::DELETE,
220 format!("/models/{}", encode_path_segment(model_id.into())),
221 )
222 }
223}