#[ cfg( feature = "enabled" ) ]
mod private
{
use serde::{ Serialize, Deserialize };
use std::collections::HashMap;
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct Message
{
pub role : MessageRole,
pub content : String,
#[ cfg( feature = "vision_support" ) ]
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub images : Option< Vec< String > >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub enum MessageRole
{
#[ serde( rename = "user" ) ]
User,
#[ serde( rename = "assistant" ) ]
Assistant,
#[ serde( rename = "system" ) ]
System,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ChatMessage
{
pub role : MessageRole,
pub content : String,
#[ cfg( feature = "vision_support" ) ]
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub images : Option< Vec< String > >,
#[ cfg( feature = "tool_calling" ) ]
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub tool_calls : Option< Vec< ToolCall > >,
}
#[ cfg( feature = "tool_calling" ) ]
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ToolCall
{
pub function : String,
pub arguments : serde_json::Value,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ChatRequest
{
pub model : String,
pub messages : Vec< ChatMessage >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub stream : Option< bool >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub temperature : Option< f32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub top_p : Option< f32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub top_k : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub max_tokens : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub stop : Option< Vec< String > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub system : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub template : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub options : Option< HashMap< String, serde_json::Value > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub format : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub keep_alive : Option< String >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ChatResponse
{
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub model : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub created_at : Option< String >,
pub message : ChatMessage,
pub done : bool,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub done_reason : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub total_duration : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub load_duration : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub prompt_eval_count : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub prompt_eval_duration : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub eval_count : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub eval_duration : Option< u64 >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct GenerateRequest
{
pub model : String,
pub prompt : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub stream : Option< bool >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub system : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub template : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub context : Option< Vec< u8 > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub options : Option< HashMap< String, serde_json::Value > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub format : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub keep_alive : Option< String >,
#[ cfg( feature = "vision_support" ) ]
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub images : Option< Vec< String > >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct GenerateResponse
{
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub model : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub created_at : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub response : Option< String >,
#[ serde( default ) ]
pub done : bool,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub context : Option< Vec< u8 > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub total_duration : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub load_duration : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub prompt_eval_count : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub prompt_eval_duration : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub eval_count : Option< u32 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub eval_duration : Option< u64 >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ModelInfo
{
pub name : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub size : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub family : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub parameter_size : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub quantization_level : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub details : Option< ModelDetails >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub digest : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub modified_at : Option< String >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ModelDetails
{
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub format : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub family : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub families : Option< Vec< String > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub parameter_size : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub quantization_level : Option< String >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ModelEntry
{
pub name : String,
pub digest : String,
pub size : u64,
pub modified_at : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub details : Option< ModelDetails >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct TagsResponse
{
pub models : Vec< ModelEntry >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ShowModelRequest
{
pub name : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub verbose : Option< bool >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct PullModelRequest
{
pub name : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub insecure : Option< bool >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub stream : Option< bool >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct PushModelRequest
{
pub name : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub insecure : Option< bool >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub stream : Option< bool >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct DeleteModelRequest
{
pub name : String,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct EmbeddingsRequest
{
pub model : String,
pub prompt : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub options : Option< HashMap< String, serde_json::Value > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub keep_alive : Option< String >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct EmbeddingsResponse
{
pub embedding : Vec< f64 >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ProgressInfo
{
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub status : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub digest : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub total : Option< u64 >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub completed : Option< u64 >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ApiError
{
pub error : String,
}
impl ChatRequest
{
#[ inline ]
#[ must_use ]
pub fn new( model : String, messages : Vec< ChatMessage > ) -> Self
{
Self
{
model,
messages,
stream : None,
temperature : None,
top_p : None,
top_k : None,
max_tokens : None,
stop : None,
system : None,
template : None,
options : None,
format : None,
keep_alive : None,
}
}
#[ inline ]
#[ must_use ]
pub fn with_stream( mut self, stream : bool ) -> Self
{
self.stream = Some( stream );
self
}
#[ inline ]
#[ must_use ]
pub fn with_temperature( mut self, temperature : f32 ) -> Self
{
self.temperature = Some( temperature );
self
}
#[ inline ]
#[ must_use ]
pub fn with_system( mut self, system : String ) -> Self
{
self.system = Some( system );
self
}
}
impl GenerateRequest
{
#[ inline ]
#[ must_use ]
pub fn new( model : String, prompt : String ) -> Self
{
Self
{
model,
prompt,
stream : None,
system : None,
template : None,
context : None,
options : None,
format : None,
keep_alive : None,
#[ cfg( feature = "vision_support" ) ]
images : None,
}
}
#[ inline ]
#[ must_use ]
pub fn with_stream( mut self, stream : bool ) -> Self
{
self.stream = Some( stream );
self
}
#[ inline ]
#[ must_use ]
pub fn with_system( mut self, system : String ) -> Self
{
self.system = Some( system );
self
}
#[ inline ]
#[ must_use ]
pub fn with_context( mut self, context : Vec< u8 > ) -> Self
{
self.context = Some( context );
self
}
}
impl ChatMessage
{
#[ inline ]
#[ must_use ]
pub fn user( content : String ) -> Self
{
Self
{
role : MessageRole::User,
content,
#[ cfg( feature = "vision_support" ) ]
images : None,
#[ cfg( feature = "tool_calling" ) ]
tool_calls : None,
}
}
#[ inline ]
#[ must_use ]
pub fn assistant( content : String ) -> Self
{
Self
{
role : MessageRole::Assistant,
content,
#[ cfg( feature = "vision_support" ) ]
images : None,
#[ cfg( feature = "tool_calling" ) ]
tool_calls : None,
}
}
#[ inline ]
#[ must_use ]
pub fn system( content : String ) -> Self
{
Self
{
role : MessageRole::System,
content,
#[ cfg( feature = "vision_support" ) ]
images : None,
#[ cfg( feature = "tool_calling" ) ]
tool_calls : None,
}
}
}
impl EmbeddingsRequest
{
#[ inline ]
#[ must_use ]
pub fn new( model : String, prompt : String ) -> Self
{
Self
{
model,
prompt,
options : None,
keep_alive : None,
}
}
}
}
#[ cfg( feature = "enabled" ) ]
crate ::mod_interface!
{
exposed use private::Message;
exposed use private::MessageRole;
exposed use private::ChatMessage;
exposed use private::ChatRequest;
exposed use private::ChatResponse;
exposed use private::GenerateRequest;
exposed use private::GenerateResponse;
exposed use private::ModelInfo;
exposed use private::ModelDetails;
exposed use private::ModelEntry;
exposed use private::TagsResponse;
exposed use private::ShowModelRequest;
exposed use private::PullModelRequest;
exposed use private::PushModelRequest;
exposed use private::DeleteModelRequest;
exposed use private::EmbeddingsRequest;
exposed use private::EmbeddingsResponse;
exposed use private::ProgressInfo;
exposed use private::ApiError;
#[ cfg( feature = "tool_calling" ) ]
exposed use private::ToolCall;
}