use openai_client_base::models::{
AssistantsNamedToolChoiceFunction, ChatCompletionTool, ChatCompletionToolChoiceOption,
CompletionUsage, CreateChatCompletionResponse, CreateChatCompletionStreamResponse,
FunctionObject,
};
pub mod assistants;
pub mod audio;
pub mod batch;
pub mod chat;
pub mod embeddings;
pub mod files;
pub mod fine_tuning;
pub mod images;
pub mod moderations;
pub mod threads;
pub mod uploads;
pub mod vector_stores;
pub use chat::*;
pub trait Response {
fn id(&self) -> Option<&str>;
fn model(&self) -> Option<&str>;
fn usage(&self) -> Option<&CompletionUsage>;
}
#[derive(Debug, Clone)]
pub struct ChatCompletionResponseWrapper {
inner: CreateChatCompletionResponse,
base_url: Option<String>,
}
impl ChatCompletionResponseWrapper {
pub fn new(response: CreateChatCompletionResponse) -> Self {
Self {
inner: response,
base_url: None,
}
}
pub fn with_base_url(response: CreateChatCompletionResponse, base_url: String) -> Self {
Self {
inner: response,
base_url: Some(base_url),
}
}
pub fn content(&self) -> Option<&str> {
self.inner.choices.first()?.message.content.as_deref()
}
pub fn choices(
&self,
) -> &[openai_client_base::models::CreateChatCompletionResponseChoicesInner] {
&self.inner.choices
}
pub fn tool_calls(
&self,
) -> Vec<&openai_client_base::models::ChatCompletionMessageToolCallsInner> {
self.inner
.choices
.first()
.and_then(|c| c.message.tool_calls.as_ref())
.map(|calls| calls.iter().collect())
.unwrap_or_default()
}
pub fn is_refusal(&self) -> bool {
self.inner
.choices
.first()
.and_then(|c| c.message.refusal.as_ref())
.is_some()
}
pub fn refusal(&self) -> Option<&str> {
self.inner
.choices
.first()
.and_then(|c| c.message.refusal.as_ref())
.map(std::string::String::as_str)
}
pub fn finish_reason(&self) -> Option<String> {
use openai_client_base::models::create_chat_completion_response_choices_inner::FinishReason;
self.inner.choices.first().map(|c| match &c.finish_reason {
FinishReason::Stop => "stop".to_string(),
FinishReason::Length => "length".to_string(),
FinishReason::ToolCalls => "tool_calls".to_string(),
FinishReason::ContentFilter => "content_filter".to_string(),
FinishReason::FunctionCall => "function_call".to_string(),
})
}
pub fn url(&self) -> Option<String> {
self.base_url
.as_ref()
.map(|base| format!("{}/chat/{}", base, self.inner.id))
}
pub fn inner(&self) -> &CreateChatCompletionResponse {
&self.inner
}
}
impl Response for ChatCompletionResponseWrapper {
fn id(&self) -> Option<&str> {
Some(&self.inner.id)
}
fn model(&self) -> Option<&str> {
Some(&self.inner.model)
}
fn usage(&self) -> Option<&CompletionUsage> {
self.inner.usage.as_deref()
}
}
#[derive(Debug, Clone)]
pub struct ChatCompletionStreamResponseWrapper {
inner: CreateChatCompletionStreamResponse,
}
impl ChatCompletionStreamResponseWrapper {
pub fn new(response: CreateChatCompletionStreamResponse) -> Self {
Self { inner: response }
}
pub fn delta_content(&self) -> Option<&str> {
self.inner
.choices
.first()
.and_then(|c| c.delta.content.as_ref())
.and_then(|c| c.as_ref())
.map(std::string::String::as_str)
}
pub fn delta_tool_calls(
&self,
) -> Vec<&openai_client_base::models::ChatCompletionMessageToolCallChunk> {
self.inner
.choices
.first()
.and_then(|c| c.delta.tool_calls.as_ref())
.map(|calls| calls.iter().collect())
.unwrap_or_default()
}
pub fn is_finished(&self) -> bool {
use openai_client_base::models::create_chat_completion_stream_response_choices_inner::FinishReason;
self.inner.choices.first().is_none_or(|c| {
!matches!(
c.finish_reason,
FinishReason::Stop
| FinishReason::Length
| FinishReason::ToolCalls
| FinishReason::ContentFilter
| FinishReason::FunctionCall
)
})
}
pub fn inner(&self) -> &CreateChatCompletionStreamResponse {
&self.inner
}
}
#[must_use]
pub fn tool_function(
name: impl Into<String>,
description: impl Into<String>,
parameters: serde_json::Value,
) -> ChatCompletionTool {
use std::collections::HashMap;
let params_map = if let serde_json::Value::Object(map) = parameters {
map.into_iter()
.collect::<HashMap<String, serde_json::Value>>()
} else {
HashMap::new()
};
ChatCompletionTool {
r#type: openai_client_base::models::chat_completion_tool::Type::Function,
function: Box::new(FunctionObject {
name: name.into(),
description: Some(description.into()),
parameters: Some(params_map),
strict: None,
}),
}
}
#[must_use]
pub fn tool_web_search() -> ChatCompletionTool {
tool_function(
"web_search",
"Search the web for current information",
serde_json::json!({
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The search query"
}
},
"required": ["query"],
"additionalProperties": false
}),
)
}
pub struct ToolChoiceHelper;
impl ToolChoiceHelper {
pub fn auto() -> ChatCompletionToolChoiceOption {
use openai_client_base::models::chat_completion_tool_choice_option::ChatCompletionToolChoiceOptionAutoEnum;
ChatCompletionToolChoiceOption::Auto(ChatCompletionToolChoiceOptionAutoEnum::Auto)
}
pub fn none() -> ChatCompletionToolChoiceOption {
use openai_client_base::models::chat_completion_tool_choice_option::ChatCompletionToolChoiceOptionAutoEnum;
ChatCompletionToolChoiceOption::Auto(ChatCompletionToolChoiceOptionAutoEnum::None)
}
pub fn required() -> ChatCompletionToolChoiceOption {
use openai_client_base::models::chat_completion_tool_choice_option::ChatCompletionToolChoiceOptionAutoEnum;
ChatCompletionToolChoiceOption::Auto(ChatCompletionToolChoiceOptionAutoEnum::Required)
}
pub fn specific(name: impl Into<String>) -> ChatCompletionToolChoiceOption {
ChatCompletionToolChoiceOption::Chatcompletionnamedtoolchoice(
openai_client_base::models::ChatCompletionNamedToolChoice {
r#type:
openai_client_base::models::chat_completion_named_tool_choice::Type::Function,
function: Box::new(AssistantsNamedToolChoiceFunction { name: name.into() }),
},
)
}
}
pub use openai_client_base::models::{
ChatCompletionMessageToolCall as ToolCall,
ChatCompletionResponseMessageFunctionCall as FunctionCall, ChatCompletionTool as Tool,
ChatCompletionToolChoiceOption as ToolChoice, CompletionUsage as Usage,
CreateChatCompletionResponse as ChatResponse,
CreateChatCompletionStreamResponse as StreamResponse,
};
#[derive(Debug, Clone)]
pub struct ResponseBuilder;
#[derive(Debug, Clone)]
pub struct ResponsePlaceholder;