use std::cell::RefCell;
use std::collections::HashMap;
use std::error::Error;
use std::rc::Rc;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::core::RequestOptions;
use crate::{OpenAI, OpenAIObject};
use crate::resource::APIResource;
use crate::resources::completions as completion_api;
use crate::shared;
#[derive(Debug, Clone)]
pub struct Completions {
pub client: Option<APIResource>,
}
impl Completions {
pub fn new() -> Self {
Completions {
client: None,
}
}
pub async fn create<'a>(&self, body: ChatCompletionCreateParams<'a>) -> Result<ChatCompletion, Box<dyn Error>> {
let stream = body.stream.unwrap_or(false);
self.client.as_ref().unwrap().borrow().post(
"/chat/completions",
Some( RequestOptions {
body: Some(body),
stream: Some(stream),
..Default::default()
})
).await
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletion {
pub id: String,
pub choices: Vec<chat_completion::Choice>,
pub created: u64,
pub model: String,
pub object: OpenAIObject,
pub service_tier: Option<ServiceTier>,
pub system_fingerprint: Option<String>,
pub usage: Option<completion_api::CompletionUsage>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FinishReason {
#[default]
Stop,
Length,
ToolCalls,
ContentFilter,
FunctionCall,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChatCompletionRole {
#[default]
Assistant,
User,
System,
Tool,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ServiceTier {
#[default]
Default,
Scale,
}
pub mod chat_completion {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Choice {
pub finish_reason: FinishReason,
pub index: u32,
pub logprobs: Option<choice::Logprobs>,
pub message: ChatCompletionMessage,
}
}
pub mod choice {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Logprobs {
pub content: Option<Vec<ChatCompletionTokenLogprob>>,
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionAssistantMessageParam {
pub role: String,
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<ChatCompletionMessageToolCall>>,
#[deprecated(note = "Deprecated and replaced by `tool_calls`. The name and arguments of a function that should be called, as generated by the model.")]
pub function_call: Option<chat_completion_assistant_message_param::FunctionCall>,
}
pub mod chat_completion_assistant_message_param {
use super::*;
#[deprecated(note = "Deprecated and replaced by `tool_calls`. The name and arguments of a function that should be called, as generated by the model.")]
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct FunctionCall {
pub arguments: String,
pub name: String,
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionChunk {
pub id: String,
pub choices: Vec<chat_completion_chunk::Choice>,
pub created: u64,
pub model: String,
pub object: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_fingerprint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<completion_api::CompletionUsage>,
}
pub mod chat_completion_chunk {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Choice {
pub delta: choice::Delta,
pub finish_reason: FinishReason,
pub index: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<choice::Logprobs>,
}
pub mod choice {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Delta {
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_call: Option<delta::FunctionCall>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<ChatCompletionRole>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<delta::ToolCall>>,
}
pub mod delta {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct FunctionCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ToolCall {
pub index: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function: Option<tool_call::Function>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub tool_call_type: Option<String>, }
pub mod tool_call {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Function {
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Logprobs {
pub content: Option<Vec<ChatCompletionTokenLogprob>>, }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ChatCompletionContent<'a> {
Text(&'a str),
Multiple(Vec<ChatCompletionContentPart>),
}
impl<'a> Default for ChatCompletionContent<'a> {
fn default() -> Self {
ChatCompletionContent::Text(Default::default())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ChatCompletionContentPart {
Text{ text: String },
#[serde(rename = "image_url")]
Image { image_url: chat_completion_content_part_image::ImageURL },
}
impl Default for ChatCompletionContentPart {
fn default() -> Self {
ChatCompletionContentPart::Text{ text: Default::default() }
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionContentPartImage {
pub image_url: chat_completion_content_part_image::ImageURL,
#[serde(rename = "type")]
pub content_type: String, }
pub mod chat_completion_content_part_image {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ImageURL {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<Detail>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Detail {
#[default]
Auto,
Low,
High,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionContentPartText {
text: String,
content_type: String, }
pub struct ChatCompletionFunctionCallOption {
pub name: String,
}
#[deprecated()]
pub struct ChatCompletionFunctionMessageParam {
content: Option<String>,
name: String,
role: String, }
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionMessage {
pub content: Option<String>,
pub role: String,
#[deprecated(note = "Deprecated and replaced by `tool_calls`. The name and arguments of a function that should be called, as generated by the model.")]
pub function_call: Option<chat_completion_message::FunctionCall>,
pub tool_calls: Option<Vec<ChatCompletionMessageToolCall>>,
}
pub mod chat_completion_message {
use super::*;
#[deprecated(note = "Deprecated and replaced by `tool_calls`. The name and arguments of a function that should be called, as generated by the model.")]
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct FunctionCall {
pub arguments: String,
pub name: String,
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "role", rename_all = "snake_case")]
pub enum ChatCompletionMessageParam<'a> {
Assistant{
#[serde(skip_serializing_if = "Option::is_none")]
content: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
tool_calls: Option<Vec<ChatCompletionMessageToolCall>>,
},
User{
content: ChatCompletionContent<'a>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<&'a str>,
},
System{
content: &'a str,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<&'a str>,
},
Tool{
content: &'a str,
tool_call_id: &'a str,
},
}
impl<'a> Default for ChatCompletionMessageParam<'a> {
fn default() -> Self {
ChatCompletionMessageParam::Assistant{ content: None, name: None, tool_calls: None }
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionMessageToolCall {
pub id: String,
pub function: chat_completion_message_tool_call::Function,
#[serde(rename = "type")]
pub tool_call_type: String,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChatCompletionMessageToolCallType {
#[default]
Function,
}
mod chat_completion_message_tool_call {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Function {
pub arguments: String,
pub name: String,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionNamedToolChoice {
pub function: chat_completion_named_tool_choice::Function,
#[serde(rename = "type")]
tool_choice_type: ChatCompletionNamedToolChoiceType,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChatCompletionNamedToolChoiceType {
#[default]
Function,
}
pub mod chat_completion_named_tool_choice {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Function {
name: String,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionStreamOptions {
pub include_usage: Option<bool>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionSystemMessageParam {
pub content: String,
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionTokenLogprob {
pub token: String,
pub bytes: Option<Vec<u8>>,
pub logprob: f32,
pub top_logprobs: Vec<chat_completion_token_logprob::TopLogprob>,
}
pub mod chat_completion_token_logprob {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct TopLogprob {
token: String,
pub bytes: Option<Vec<u8>>,
pub logprob: f32,
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionTool {
pub function: shared::FunctionDefinition,
pub tool_type: String, }
pub type ChatCompletionToolChoiceOption = String;
pub struct ChatCompletionToolMessageParam {
pub content: String,
pub role: String,
pub tool_call_id: String,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionUserMessageParam {
pub content: String,
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionCreateParams<'a> {
pub messages: Vec<ChatCompletionMessageParam<'a>>,
pub model: &'a str,
#[serde(skip_serializing_if = "Option::is_none")]
pub frequency_penalty: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_call: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub functions: Option<Vec<chat_completion_create_params::Function>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logit_bias: Option<HashMap<String, f32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presence_penalty: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<chat_completion_create_params::ResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream_options: Option<ChatCompletionStreamOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ChatCompletionToolChoiceOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ChatCompletionTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
pub mod chat_completion_create_params {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
#[deprecated]
pub struct Function {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<shared::FunctionParameters>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ResponseFormat {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
response_format_type: Option<String>, }
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ChatCompletionCreateParamsNonStreaming { #[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>, }
pub struct ChatCompletionCreateParamsStreaming { pub stream: bool, }