#[derive(Debug, Clone)]
pub struct ChatRequest {
pub model: String,
pub messages: Vec<super::Message>,
pub tools: Vec<crate::tool_parser::ToolDefinition>,
pub tool_choice: Option<crate::tool_parser::ToolChoice>,
pub sampling: SamplingParams,
pub max_tokens: usize,
pub min_tokens: usize,
pub stop: Vec<String>,
pub stream: bool,
pub n: usize,
pub response_format: Option<ResponseFormat>,
pub thinking: ThinkingDirective,
pub reasoning_effort: Option<ReasoningEffort>,
pub preserve_thinking: Option<bool>,
pub template_thinking: Option<bool>,
pub repetition_detection: Option<crate::api::inference_types::RepetitionDetectionParams>,
pub adapter: Option<String>,
pub src_lang: Option<String>,
pub tgt_lang: Option<String>,
pub num_beams: Option<u32>,
pub length_penalty: Option<f32>,
pub early_stopping: Option<bool>,
pub logit_bias: Vec<(u32, f32)>,
pub top_logprobs: Option<u8>,
pub seed: Option<u64>,
pub timeout_secs: Option<f32>,
pub return_token_ids: bool,
pub lookup_tenant: Option<crate::auth::LookupTenant>,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct SamplingParams {
pub temperature: Option<f32>,
pub top_k: Option<u32>,
pub top_p: Option<f32>,
pub top_n_sigma: Option<f32>,
pub min_p: Option<f32>,
pub repetition_penalty: Option<f32>,
pub presence_penalty: Option<f32>,
pub frequency_penalty: Option<f32>,
}
#[derive(Debug, Clone)]
pub enum ResponseFormat {
JsonObject,
JsonSchema {
name: String,
schema: serde_json::Value,
strict: bool,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ThinkingDirective {
#[default]
Unspecified,
Off,
On { budget: Option<u32> },
OnEffort(EffortLevel),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EffortLevel {
Minimal,
Low,
Medium,
High,
XHigh,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReasoningEffort {
Low,
Medium,
High,
Max,
}
impl ReasoningEffort {
pub fn as_str(self) -> &'static str {
match self {
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
Self::Max => "xhigh",
}
}
}
pub fn parse_wire_effort(s: &str) -> Option<(Option<ReasoningEffort>, ThinkingDirective)> {
Some(match s {
"none" => (None, ThinkingDirective::Off),
"minimal" => (
Some(ReasoningEffort::Low),
ThinkingDirective::OnEffort(EffortLevel::Minimal),
),
"low" => (
Some(ReasoningEffort::Low),
ThinkingDirective::OnEffort(EffortLevel::Low),
),
"medium" => (
Some(ReasoningEffort::Medium),
ThinkingDirective::OnEffort(EffortLevel::Medium),
),
"high" => (
Some(ReasoningEffort::High),
ThinkingDirective::OnEffort(EffortLevel::High),
),
"xhigh" | "max" => (
Some(ReasoningEffort::Max),
ThinkingDirective::OnEffort(EffortLevel::XHigh),
),
_ => return None,
})
}
impl ThinkingDirective {
pub fn is_explicit(&self) -> bool {
!matches!(self, ThinkingDirective::Unspecified)
}
}