fix: build error

This commit is contained in:
imeepos 2025-07-21 15:29:31 +08:00
parent e9e5837a1f
commit 764b4d7420
1 changed files with 2 additions and 216 deletions

View File

@ -820,223 +820,9 @@ impl GeminiService {
println!("❌ TolerantJsonParser解析失败: {}", e); println!("❌ TolerantJsonParser解析失败: {}", e);
println!("📝 响应内容预览: {}", &response[..response.len().min(200)]); println!("📝 响应内容预览: {}", &response[..response.len().min(200)]);
// 如果TolerantJsonParser也失败了尝试回退到原有的修复方案 // 直接返回错误,不使用回退方案,便于调试和问题定位
println!("⚠️ 回退到传统修复方案"); Err(anyhow!("TolerantJsonParser解析失败: {}. 响应内容: {}", e, &response[..response.len().min(500)]))
match self.fallback_json_extraction(response) {
Ok(result) => {
println!("✅ 传统修复方案成功");
Ok(result)
}
Err(fallback_error) => {
println!("❌ 传统修复方案也失败: {}", fallback_error);
Err(anyhow!("所有JSON解析方案都失败了。TolerantJsonParser错误: {}; 传统方案错误: {}", e, fallback_error))
}
}
} }
} }
} }
/// 回退的JSON提取方案保留原有逻辑作为备用
fn fallback_json_extraction(&self, response: &str) -> Result<String> {
println!("🔍 使用传统方法提取JSON");
// 尝试直接解析为JSON
if let Ok(_) = serde_json::from_str::<serde_json::Value>(response) {
println!("✅ 直接解析JSON成功");
return Ok(response.to_string());
}
// 查找JSON代码块 ```json ... ```
if let Some(start) = response.find("```json") {
println!("🔍 找到```json标记位置: {}", start);
let json_start = start + 7; // "```json".len()
// 从json_start位置开始查找结束的```
if let Some(end_offset) = response[json_start..].find("```") {
let json_end = json_start + end_offset;
let json_content = response[json_start..json_end].trim();
println!("🔍 提取的JSON内容长度: {}", json_content.len());
println!("🔍 JSON内容预览: {}", &json_content[..json_content.len().min(100)]);
// 验证提取的JSON
match serde_json::from_str::<serde_json::Value>(json_content) {
Ok(_) => {
println!("✅ 从代码块提取JSON成功");
return Ok(json_content.to_string());
}
Err(e) => {
println!("❌ JSON解析失败: {}", e);
}
}
} else {
println!("⚠️ 未找到结束的```标记尝试修复截断的JSON");
// 尝试修复截断的JSON
let json_content = response[json_start..].trim();
if let Ok(fixed_json) = self.legacy_fix_truncated_json(json_content) {
println!("✅ 修复截断JSON成功");
return Ok(fixed_json);
}
}
}
// 查找普通的JSON对象 { ... }
if let Some(start) = response.find('{') {
println!("🔍 找到JSON对象开始位置: {}", start);
// 使用更智能的方法找到匹配的结束括号
let mut brace_count = 0;
let mut end_pos = None;
for (i, ch) in response[start..].char_indices() {
match ch {
'{' => brace_count += 1,
'}' => {
brace_count -= 1;
if brace_count == 0 {
end_pos = Some(start + i);
break;
}
}
_ => {}
}
}
if let Some(end) = end_pos {
let json_content = &response[start..=end];
println!("🔍 提取的JSON对象长度: {}", json_content.len());
// 验证提取的JSON
match serde_json::from_str::<serde_json::Value>(json_content) {
Ok(_) => {
println!("✅ 从对象提取JSON成功");
return Ok(json_content.to_string());
}
Err(e) => {
println!("❌ JSON对象解析失败: {}", e);
}
}
} else {
println!("⚠️ 未找到匹配的结束括号");
}
}
// 如果无法提取有效JSON尝试最后的修复方案
println!("⚠️ 无法从响应中提取有效JSON尝试最后的修复方案");
// 尝试从整个响应中修复JSON
if let Ok(fixed_json) = self.legacy_fix_truncated_json(response) {
println!("✅ 最后修复方案成功");
return Ok(fixed_json);
}
// 如果所有方法都失败了,返回错误
Err(anyhow!("无法从Gemini响应中提取有效的JSON数据。响应内容: {}",
response.chars().take(500).collect::<String>()))
}
/// 传统的截断JSON修复方法保留作为备用
fn legacy_fix_truncated_json(&self, json_str: &str) -> Result<String> {
println!("🔧 尝试修复截断的JSON");
// 尝试解析部分JSON并提取有用信息
let mut fixed_json = serde_json::json!({
"environment_tags": ["Unknown"],
"environment_color_pattern": {
"hue": 0.0,
"saturation": 0.0,
"value": 0.5
},
"dress_color_pattern": {
"hue": 0.0,
"saturation": 0.0,
"value": 0.5
},
"style_description": "",
"products": []
});
// 尝试提取环境标签
if let Some(env_start) = json_str.find("\"environment_tags\"") {
if let Some(array_start) = json_str[env_start..].find('[') {
let start_pos = env_start + array_start;
if let Some(array_end) = json_str[start_pos..].find(']') {
let end_pos = start_pos + array_end + 1;
let env_array_str = &json_str[start_pos..end_pos];
if let Ok(env_tags) = serde_json::from_str::<Vec<String>>(env_array_str) {
fixed_json["environment_tags"] = serde_json::json!(env_tags);
println!("✅ 提取环境标签成功: {:?}", env_tags);
}
}
}
}
// 尝试提取风格描述
if let Some(desc_start) = json_str.find("\"style_description\"") {
if let Some(quote_start) = json_str[desc_start..].find('"') {
let start_pos = desc_start + quote_start + 1;
// 查找下一个未转义的引号
let mut end_pos = None;
let mut chars = json_str[start_pos..].char_indices();
while let Some((i, ch)) = chars.next() {
if ch == '"' {
// 检查是否是转义的引号
let prev_char = if i > 0 {
json_str[start_pos..].chars().nth(i - 1)
} else {
None
};
if prev_char != Some('\\') {
end_pos = Some(start_pos + i);
break;
}
}
}
if let Some(end) = end_pos {
let description = &json_str[start_pos..end];
fixed_json["style_description"] = serde_json::json!(description);
println!("✅ 提取风格描述成功");
}
}
}
// 尝试提取颜色信息
for (color_key, json_key) in [
("environment_color_pattern", "environment_color_pattern"),
("dress_color_pattern", "dress_color_pattern")
] {
if let Some(color_start) = json_str.find(&format!("\"{}\"", color_key)) {
if let Some(obj_start) = json_str[color_start..].find('{') {
let start_pos = color_start + obj_start;
let mut brace_count = 0;
let mut end_pos = None;
for (i, ch) in json_str[start_pos..].char_indices() {
match ch {
'{' => brace_count += 1,
'}' => {
brace_count -= 1;
if brace_count == 0 {
end_pos = Some(start_pos + i + 1);
break;
}
}
_ => {}
}
}
if let Some(end) = end_pos {
let color_obj_str = &json_str[start_pos..end];
if let Ok(color_obj) = serde_json::from_str::<serde_json::Value>(color_obj_str) {
fixed_json[json_key] = color_obj;
println!("✅ 提取{}成功", color_key);
}
}
}
}
}
Ok(fixed_json.to_string())
}
} }