use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct OllamaVisionConfig {
pub endpoint: String,
pub model: String,
pub timeout: Duration,
pub connect_timeout: Duration,
pub options: GenerateOptions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GenerateOptions {
pub num_predict: u32,
pub repeat_penalty: f32,
pub repeat_last_n: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
}
impl Default for GenerateOptions {
fn default() -> Self {
Self {
num_predict: 512,
repeat_penalty: 1.2,
repeat_last_n: 128,
temperature: None,
top_p: None,
}
}
}
impl Default for OllamaVisionConfig {
fn default() -> Self {
Self {
endpoint: "http://localhost:11434".to_string(),
model: "llava".to_string(),
timeout: Duration::from_secs(120),
connect_timeout: Duration::from_secs(10),
options: GenerateOptions::default(),
}
}
}
impl OllamaVisionConfig {
pub fn with_model(model: impl Into<String>) -> Self {
Self {
model: model.into(),
..Default::default()
}
}
pub fn connect_timeout(mut self, timeout: Duration) -> Self {
self.connect_timeout = timeout;
self
}
pub fn endpoint(mut self, endpoint: impl Into<String>) -> Self {
self.endpoint = endpoint.into();
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
pub fn options(mut self, options: GenerateOptions) -> Self {
self.options = options;
self
}
}
#[derive(Debug, Clone)]
pub struct TagOptions {
pub prompt: Option<String>,
pub request_json_format: bool,
pub max_tags: usize,
pub max_tag_length: usize,
pub max_retries: u32,
}
impl Default for TagOptions {
fn default() -> Self {
Self {
prompt: None,
request_json_format: true,
max_tags: 30,
max_tag_length: 50,
max_retries: 2,
}
}
}
#[derive(Debug, Clone)]
pub struct CaptionOptions {
pub prompt: Option<String>,
pub max_caption_length: usize,
pub max_retries: u32,
}
impl Default for CaptionOptions {
fn default() -> Self {
Self {
prompt: None,
max_caption_length: 500,
max_retries: 2,
}
}
}