mod private
{
use serde::{ Serialize, Deserialize };
use former::Former;
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq, Eq ) ]
#[ serde( rename_all = "lowercase" ) ]
pub enum Role
{
System,
User,
Assistant,
Tool,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq ) ]
pub struct ToolCall
{
pub id : String,
#[ serde( rename = "type" ) ]
pub tool_type : String,
pub function : FunctionCall,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq ) ]
pub struct FunctionCall
{
pub name : String,
pub arguments : String,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq ) ]
pub struct Message
{
pub role : Role,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub content : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub tool_calls : Option< Vec< ToolCall > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub tool_call_id : Option< String >,
}
impl Message
{
#[ inline ]
pub fn system( content : impl Into< String > ) -> Self
{
Self
{
role : Role::System,
content : Some( content.into() ),
tool_calls : None,
tool_call_id : None,
}
}
#[ inline ]
pub fn user( content : impl Into< String > ) -> Self
{
Self
{
role : Role::User,
content : Some( content.into() ),
tool_calls : None,
tool_call_id : None,
}
}
#[ inline ]
pub fn assistant( content : impl Into< String > ) -> Self
{
Self
{
role : Role::Assistant,
content : Some( content.into() ),
tool_calls : None,
tool_call_id : None,
}
}
#[ inline ]
pub fn tool
(
tool_call_id : impl Into< String >,
content : impl Into< String >,
)
-> Self
{
Self
{
role : Role::Tool,
content : Some( content.into() ),
tool_calls : None,
tool_call_id : Some( tool_call_id.into() ),
}
}
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq, Former ) ]
pub struct Tool
{
#[ serde( rename = "type" ) ]
pub tool_type : String,
pub function : Function,
}
impl Tool
{
#[ inline ]
pub fn function
(
name : impl Into< String >,
description : impl Into< String >,
parameters : serde_json::Value,
)
-> Self
{
Self
{
tool_type : "function".to_string(),
function : Function
{
name : name.into(),
description : description.into(),
parameters,
},
}
}
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq, Former ) ]
pub struct Function
{
pub name : String,
pub description : String,
pub parameters : serde_json::Value,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq, Eq ) ]
pub struct Usage
{
pub prompt_tokens : u32,
pub completion_tokens : u32,
pub total_tokens : u32,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq, Former ) ]
pub struct ChatCompletionRequest
{
pub model : String,
pub messages : Vec< Message >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub temperature : Option< f32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub max_tokens : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub top_p : Option< f32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub frequency_penalty : Option< f32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub presence_penalty : Option< f32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub stream : Option< bool >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub tools : Option< Vec< Tool > >,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq ) ]
pub struct ChatCompletionResponse
{
pub id : String,
pub object : String,
pub created : u64,
pub model : String,
pub choices : Vec< Choice >,
pub usage : Usage,
}
#[ derive( Debug, Serialize, Deserialize, Clone, PartialEq ) ]
pub struct Choice
{
pub index : u32,
pub message : Message,
pub finish_reason : Option< String >,
}
}
crate::mod_interface!
{
exposed use
{
Role,
ToolCall,
FunctionCall,
Message,
Tool,
Function,
Usage,
ChatCompletionRequest,
ChatCompletionResponse,
Choice,
};
}