feat: add structured output to Gemini endpoint

Gemini endpoint now accepts responseMimeType and responseSchema
fields, injected into Google's generationConfig via MITM. Supports
both snake_case and camelCase aliases.
This commit is contained in:
Nikketryhard
2026-02-16 19:57:18 -06:00
parent 135cd47f8f
commit cac30067ef

View File

@@ -67,6 +67,14 @@ pub(crate) struct GeminiRequest {
/// When true, injects {"googleSearch": {}} into tools via MITM. /// When true, injects {"googleSearch": {}} into tools via MITM.
#[serde(default, alias = "googleSearch")] #[serde(default, alias = "googleSearch")]
pub google_search: bool, pub google_search: bool,
/// Response MIME type for structured output, e.g. "application/json".
/// Injected as generationConfig.responseMimeType via MITM.
#[serde(default, alias = "responseMimeType")]
pub response_mime_type: Option<String>,
/// Response schema for structured output (JSON Schema object).
/// Injected as generationConfig.responseSchema via MITM.
#[serde(default, alias = "responseSchema")]
pub response_schema: Option<serde_json::Value>,
} }
fn default_timeout() -> u64 { fn default_timeout() -> u64 {
@@ -257,8 +265,8 @@ pub(crate) async fn handle_gemini(
frequency_penalty: None, frequency_penalty: None,
presence_penalty: None, presence_penalty: None,
reasoning_effort: body.thinking_level.clone(), reasoning_effort: body.thinking_level.clone(),
response_mime_type: None, response_mime_type: body.response_mime_type.clone(),
response_schema: None, response_schema: body.response_schema.clone(),
google_search: body.google_search, google_search: body.google_search,
}; };
if gp.temperature.is_some() if gp.temperature.is_some()
@@ -267,6 +275,8 @@ pub(crate) async fn handle_gemini(
|| gp.max_output_tokens.is_some() || gp.max_output_tokens.is_some()
|| gp.stop_sequences.is_some() || gp.stop_sequences.is_some()
|| gp.reasoning_effort.is_some() || gp.reasoning_effort.is_some()
|| gp.response_mime_type.is_some()
|| gp.response_schema.is_some()
|| gp.google_search || gp.google_search
{ {
state.mitm_store.set_generation_params(gp).await; state.mitm_store.set_generation_params(gp).await;