From cef3812745f37053ba0b7e3404ad904e9d305c79 Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Tue, 20 Jan 2026 14:39:12 +0800 Subject: [PATCH] fix(stream-check): use Gemini native streaming API format - Change endpoint from OpenAI-compatible to native streamGenerateContent - Add alt=sse parameter for SSE format response - Use x-goog-api-key header instead of Bearer token - Convert request body to Gemini contents/parts format --- src-tauri/src/services/stream_check.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/services/stream_check.rs b/src-tauri/src/services/stream_check.rs index aeacdd6a4..38ca76523 100644 --- a/src-tauri/src/services/stream_check.rs +++ b/src-tauri/src/services/stream_check.rs @@ -436,6 +436,8 @@ impl StreamCheckService { } /// Gemini 流式检查 + /// + /// 使用 Gemini 原生 API 格式 (streamGenerateContent) async fn check_gemini_stream( client: &Client, base_url: &str, @@ -445,20 +447,28 @@ impl StreamCheckService { timeout: std::time::Duration, ) -> Result<(u16, String), AppError> { let base = base_url.trim_end_matches('/'); - let url = format!("{base}/v1/chat/completions"); + // Gemini 原生 API: /v1beta/models/{model}:streamGenerateContent?alt=sse + // 智能处理 /v1beta 路径:如果 base_url 不包含版本路径,则添加 /v1beta + // alt=sse 参数使 API 返回 SSE 格式(text/event-stream)而非 JSON 数组 + let url = if base.contains("/v1beta") || base.contains("/v1/") { + format!("{base}/models/{model}:streamGenerateContent?alt=sse") + } else { + format!("{base}/v1beta/models/{model}:streamGenerateContent?alt=sse") + }; + // Gemini 原生请求体格式 let body = json!({ - "model": model, - "messages": [{ "role": "user", "content": test_prompt }], - "max_tokens": 1, - "temperature": 0, - "stream": true + "contents": [{ + "role": "user", + "parts": [{ "text": test_prompt }] + }] }); let response = client .post(&url) - .header("Authorization", format!("Bearer {}", auth.api_key)) + .header("x-goog-api-key", &auth.api_key) .header("Content-Type", "application/json") + .header("Accept", "text/event-stream") .timeout(timeout) .json(&body) .send()