Skip to main content

openai_core/resources/
core.rs

1//! Core resource implementations that do not need additional namespace files.
2
3use 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/// 表示 legacy completions 接口返回值。
17#[derive(Debug, Clone, Serialize, Deserialize, Default)]
18pub struct Completion {
19    /// 补全 ID。
20    pub id: String,
21    /// 对象类型。
22    #[serde(default)]
23    pub object: String,
24    /// 创建时间。
25    pub created: Option<i64>,
26    /// 模型 ID。
27    #[serde(default)]
28    pub model: String,
29    /// 候选项。
30    #[serde(default)]
31    pub choices: Vec<CompletionChoice>,
32    /// 用量统计。
33    pub usage: Option<CompletionUsage>,
34    /// 系统指纹。
35    pub system_fingerprint: Option<String>,
36    /// 额外字段。
37    #[serde(flatten)]
38    pub extra: BTreeMap<String, Value>,
39}
40
41/// 表示 legacy completions 候选项。
42#[derive(Debug, Clone, Serialize, Deserialize, Default)]
43pub struct CompletionChoice {
44    /// 结束原因。
45    pub finish_reason: Option<String>,
46    /// 候选索引。
47    pub index: u32,
48    /// token 级 logprobs。
49    pub logprobs: Option<CompletionLogProbs>,
50    /// 生成文本。
51    #[serde(default)]
52    pub text: String,
53    /// 额外字段。
54    #[serde(flatten)]
55    pub extra: BTreeMap<String, Value>,
56}
57
58/// 表示 legacy completions 的 token 级 logprobs。
59#[derive(Debug, Clone, Serialize, Deserialize, Default)]
60pub struct CompletionLogProbs {
61    /// token 偏移量。
62    #[serde(default)]
63    pub text_offset: Vec<i64>,
64    /// token logprob。
65    #[serde(default)]
66    pub token_logprobs: Vec<f64>,
67    /// token 列表。
68    #[serde(default)]
69    pub tokens: Vec<String>,
70    /// top logprobs。
71    #[serde(default)]
72    pub top_logprobs: Vec<BTreeMap<String, f64>>,
73    /// 额外字段。
74    #[serde(flatten)]
75    pub extra: BTreeMap<String, Value>,
76}
77
78/// 表示 legacy completions 的用量统计。
79#[derive(Debug, Clone, Serialize, Deserialize, Default)]
80pub struct CompletionUsage {
81    /// completion token 数。
82    pub completion_tokens: u64,
83    /// prompt token 数。
84    pub prompt_tokens: u64,
85    /// 总 token 数。
86    pub total_tokens: u64,
87    /// prompt token 明细。
88    pub prompt_tokens_details: Option<CompletionUsagePromptTokensDetails>,
89    /// completion token 明细。
90    pub completion_tokens_details: Option<CompletionUsageCompletionTokensDetails>,
91    /// 额外字段。
92    #[serde(flatten)]
93    pub extra: BTreeMap<String, Value>,
94}
95
96/// 表示 prompt token 的用量明细。
97#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
98pub struct CompletionUsagePromptTokensDetails {
99    /// prompt 中的音频 token 数。
100    pub audio_tokens: Option<u64>,
101    /// prompt 中命中的缓存 token 数。
102    pub cached_tokens: Option<u64>,
103    /// 额外字段。
104    #[serde(flatten)]
105    pub extra: BTreeMap<String, Value>,
106}
107
108/// 表示 completion token 的用量明细。
109#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
110pub struct CompletionUsageCompletionTokensDetails {
111    /// 预测命中的 token 数。
112    pub accepted_prediction_tokens: Option<u64>,
113    /// completion 中的音频 token 数。
114    pub audio_tokens: Option<u64>,
115    /// reasoning token 数。
116    pub reasoning_tokens: Option<u64>,
117    /// 预测未命中的 token 数。
118    pub rejected_prediction_tokens: Option<u64>,
119    /// 额外字段。
120    #[serde(flatten)]
121    pub extra: BTreeMap<String, Value>,
122}
123
124/// 表示 moderation 接口返回值。
125#[derive(Debug, Clone, Serialize, Deserialize, Default)]
126pub struct ModerationCreateResponse {
127    /// 请求 ID。
128    pub id: String,
129    /// 模型 ID。
130    #[serde(default)]
131    pub model: String,
132    /// 分类结果列表。
133    #[serde(default)]
134    pub results: Vec<ModerationResult>,
135    /// 额外字段。
136    #[serde(flatten)]
137    pub extra: BTreeMap<String, Value>,
138}
139
140/// 表示单个 moderation 结果。
141#[derive(Debug, Clone, Serialize, Deserialize, Default)]
142pub struct ModerationResult {
143    /// 命中的分类布尔值。
144    #[serde(default)]
145    pub categories: BTreeMap<String, bool>,
146    /// 分类对应的输入类型。
147    #[serde(default)]
148    pub category_applied_input_types: BTreeMap<String, Vec<String>>,
149    /// 分类分数。
150    #[serde(default)]
151    pub category_scores: BTreeMap<String, f64>,
152    /// 是否命中任一分类。
153    #[serde(default)]
154    pub flagged: bool,
155    /// 额外字段。
156    #[serde(flatten)]
157    pub extra: BTreeMap<String, Value>,
158}
159
160impl CompletionsResource {
161    /// 创建 completions 请求构建器。
162    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    /// 创建 embeddings 请求构建器。
175    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    /// 创建 moderation 请求。
187    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    /// 列出模型。
200    pub fn list(&self) -> ListRequestBuilder<Model> {
201        ListRequestBuilder::new(self.client.clone(), "models.list", "/models")
202    }
203
204    /// 获取单个模型。
205    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    /// 删除模型。
215    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}