Files

1 line
26 KiB
JSON

{"repo": "avonyu/cadence-desktop", "files": {"src-tauri/src/deepseek.rs": {"04fe6499b15876c3c035b189b30e215d6d82750e": {"t": 1785746245.5585034, "n": 4829, "h": "593f267f861835e0", "c": "use serde::Serialize;\nuse tauri_plugin_http::reqwest;\n\nuse crate::util::strip_markdown_fences;\n\n#[derive(Serialize)]\npub struct DeepSeekModel {\n pub id: String,\n}\n\n#[tauri::command]\npub async fn fetch_deepseek_models(api_key: String) -> Result<Vec<DeepSeekModel>, String> {\n if api_key.trim().is_empty() {\n return Err(\"API key is required\".to_string());\n }\n\n let client = reqwest::Client::builder()\n .timeout(std::time::Duration::from_secs(15))\n .build()\n .map_err(|e| format!(\"Failed to build client: {}\", e))?;\n\n let response = client\n .get(\"https://api.deepseek.com/models\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n let models = json[\"data\"]\n .as_array()\n .ok_or(\"Invalid API response format\")?\n .iter()\n .filter_map(|m| {\n m[\"id\"]\n .as_str()\n .map(|id| DeepSeekModel { id: id.to_string() })\n })\n .collect();\n\n Ok(models)\n}\n\n#[tauri::command]\npub async fn call_deepseek_api(\n content: String,\n format: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/subtitle-processor.md\");\n let user_content = format!(\"Format: {}\\n\\n{}\", format, content);\n\n let text = deepseek_chat(&api_key, &model, system_prompt, &user_content, 0.1, Some(65536)).await?;\n\n let stripped = strip_markdown_fences(&text)\n .replace(\"\\\\r\", \"\")\n .trim()\n .to_string();\n\n Ok(stripped)\n}\n\npub(crate) async fn deepseek_chat(\n api_key: &str,\n model: &str,\n system_prompt: &str,\n user_content: &str,\n temperature: f64,\n max_tokens: Option<u32>,\n) -> Result<String, String> {\n let mut body = serde_json::json!({\n \"model\": model,\n \"messages\": [\n { \"role\": \"system\", \"content\": system_prompt },\n { \"role\": \"user\", \"content\": user_content }\n ],\n \"temperature\": temperature,\n });\n\n if let Some(tokens) = max_tokens {\n body[\"max_tokens\"] = serde_json::json!(tokens);\n }\n\n let client = reqwest::Client::new();\n let response = client\n .post(\"https://api.deepseek.com/chat/completions\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .header(\"Content-Type\", \"application/json\")\n .json(&body)\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n Ok(json[\"choices\"][0][\"message\"][\"content\"]\n .as_str()\n .ok_or(\"Invalid API response format\")?\n .to_string())\n}\n\n#[tauri::command]\npub async fn call_deepseek_dictionary(\n word: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/word-dictionary.md\");\n let user_content = format!(\"Define: {}\", word.trim().to_lowercase());\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(1024),\n )\n .await\n}\n\n#[tauri::command]\npub async fn call_deepseek_explain_sentence(\n sentence: String,\n translation: String,\n learning_language: String,\n native_language: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/sentence-explainer.md\");\n let learning_name = match learning_language.as_str() {\n \"zh\" => \"Chinese\",\n \"en\" => \"English\",\n _ => &learning_language,\n };\n let native_name = match native_language.as_str() {\n \"zh\" => \"Chinese\",\n \"en\" => \"English\",\n _ => &native_language,\n };\n let user_content = format!(\n \"The student is learning {}. Their native language is {}.\\n\\nSentence: {}\\nTranslation: {}\",\n learning_name,\n native_name,\n sentence.trim(),\n translation.trim()\n );\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(2048),\n )\n .await\n}\n"}, "3f79244d349bf4896458f3296323fe97a550e076": {"t": 1785761025.5511625, "n": 4829, "h": "593f267f861835e0", "c": "use serde::Serialize;\nuse tauri_plugin_http::reqwest;\n\nuse crate::util::strip_markdown_fences;\n\n#[derive(Serialize)]\npub struct DeepSeekModel {\n pub id: String,\n}\n\n#[tauri::command]\npub async fn fetch_deepseek_models(api_key: String) -> Result<Vec<DeepSeekModel>, String> {\n if api_key.trim().is_empty() {\n return Err(\"API key is required\".to_string());\n }\n\n let client = reqwest::Client::builder()\n .timeout(std::time::Duration::from_secs(15))\n .build()\n .map_err(|e| format!(\"Failed to build client: {}\", e))?;\n\n let response = client\n .get(\"https://api.deepseek.com/models\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n let models = json[\"data\"]\n .as_array()\n .ok_or(\"Invalid API response format\")?\n .iter()\n .filter_map(|m| {\n m[\"id\"]\n .as_str()\n .map(|id| DeepSeekModel { id: id.to_string() })\n })\n .collect();\n\n Ok(models)\n}\n\n#[tauri::command]\npub async fn call_deepseek_api(\n content: String,\n format: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/subtitle-processor.md\");\n let user_content = format!(\"Format: {}\\n\\n{}\", format, content);\n\n let text = deepseek_chat(&api_key, &model, system_prompt, &user_content, 0.1, Some(65536)).await?;\n\n let stripped = strip_markdown_fences(&text)\n .replace(\"\\\\r\", \"\")\n .trim()\n .to_string();\n\n Ok(stripped)\n}\n\npub(crate) async fn deepseek_chat(\n api_key: &str,\n model: &str,\n system_prompt: &str,\n user_content: &str,\n temperature: f64,\n max_tokens: Option<u32>,\n) -> Result<String, String> {\n let mut body = serde_json::json!({\n \"model\": model,\n \"messages\": [\n { \"role\": \"system\", \"content\": system_prompt },\n { \"role\": \"user\", \"content\": user_content }\n ],\n \"temperature\": temperature,\n });\n\n if let Some(tokens) = max_tokens {\n body[\"max_tokens\"] = serde_json::json!(tokens);\n }\n\n let client = reqwest::Client::new();\n let response = client\n .post(\"https://api.deepseek.com/chat/completions\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .header(\"Content-Type\", \"application/json\")\n .json(&body)\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n Ok(json[\"choices\"][0][\"message\"][\"content\"]\n .as_str()\n .ok_or(\"Invalid API response format\")?\n .to_string())\n}\n\n#[tauri::command]\npub async fn call_deepseek_dictionary(\n word: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/word-dictionary.md\");\n let user_content = format!(\"Define: {}\", word.trim().to_lowercase());\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(1024),\n )\n .await\n}\n\n#[tauri::command]\npub async fn call_deepseek_explain_sentence(\n sentence: String,\n translation: String,\n learning_language: String,\n native_language: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/sentence-explainer.md\");\n let learning_name = match learning_language.as_str() {\n \"zh\" => \"Chinese\",\n \"en\" => \"English\",\n _ => &learning_language,\n };\n let native_name = match native_language.as_str() {\n \"zh\" => \"Chinese\",\n \"en\" => \"English\",\n _ => &native_language,\n };\n let user_content = format!(\n \"The student is learning {}. Their native language is {}.\\n\\nSentence: {}\\nTranslation: {}\",\n learning_name,\n native_name,\n sentence.trim(),\n translation.trim()\n );\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(2048),\n )\n .await\n}\n"}, "7409f0ffbbec88938de641fc7dcb2450f99a1ea1": {"t": 1785761026.9743767, "n": 4365, "h": "8628ea199a45cc1a", "c": "use serde::Serialize;\nuse tauri_plugin_http::reqwest;\n\nuse crate::util::strip_markdown_fences;\n\n#[derive(Serialize)]\npub struct DeepSeekModel {\n pub id: String,\n}\n\n#[tauri::command]\npub async fn fetch_deepseek_models(api_key: String) -> Result<Vec<DeepSeekModel>, String> {\n if api_key.trim().is_empty() {\n return Err(\"API key is required\".to_string());\n }\n\n let client = reqwest::Client::builder()\n .timeout(std::time::Duration::from_secs(15))\n .build()\n .map_err(|e| format!(\"Failed to build client: {}\", e))?;\n\n let response = client\n .get(\"https://api.deepseek.com/models\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n let models = json[\"data\"]\n .as_array()\n .ok_or(\"Invalid API response format\")?\n .iter()\n .filter_map(|m| {\n m[\"id\"]\n .as_str()\n .map(|id| DeepSeekModel { id: id.to_string() })\n })\n .collect();\n\n Ok(models)\n}\n\n#[tauri::command]\npub async fn call_deepseek_api(\n content: String,\n format: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/subtitle-processor.md\");\n let user_content = format!(\"Format: {}\\n\\n{}\", format, content);\n\n let text = deepseek_chat(&api_key, &model, system_prompt, &user_content, 0.1, Some(65536)).await?;\n\n let stripped = strip_markdown_fences(&text)\n .replace(\"\\\\r\", \"\")\n .trim()\n .to_string();\n\n Ok(stripped)\n}\n\npub(crate) async fn deepseek_chat(\n api_key: &str,\n model: &str,\n system_prompt: &str,\n user_content: &str,\n temperature: f64,\n max_tokens: Option<u32>,\n) -> Result<String, String> {\n let mut body = serde_json::json!({\n \"model\": model,\n \"messages\": [\n { \"role\": \"system\", \"content\": system_prompt },\n { \"role\": \"user\", \"content\": user_content }\n ],\n \"temperature\": temperature,\n });\n\n if let Some(tokens) = max_tokens {\n body[\"max_tokens\"] = serde_json::json!(tokens);\n }\n\n let client = reqwest::Client::new();\n let response = client\n .post(\"https://api.deepseek.com/chat/completions\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .header(\"Content-Type\", \"application/json\")\n .json(&body)\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n Ok(json[\"choices\"][0][\"message\"][\"content\"]\n .as_str()\n .ok_or(\"Invalid API response format\")?\n .to_string())\n}\n\n#[tauri::command]\npub async fn call_deepseek_dictionary(\n word: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/word-dictionary.md\");\n let user_content = format!(\"Define: {}\", word.trim().to_lowercase());\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(1024),\n )\n .await\n}\n\n#[tauri::command]\npub async fn call_deepseek_explain_sentence(\n sentence: String,\n translation: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/sentence-explainer.md\");\n let user_content = format!(\n \"Sentence: {}\\nTranslation: {}\",\n sentence.trim(),\n translation.trim()\n );\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(2048),\n )\n .await\n}\n"}, "7f588a9dbaaf31da04338acfbd575caeba595a62": {"t": 1785761028.1651933, "n": 3826, "h": "9e672adfd25d0bd1", "c": "use serde::Serialize;\nuse tauri_plugin_http::reqwest;\n\nuse crate::util::strip_markdown_fences;\n\n#[derive(Serialize)]\npub struct DeepSeekModel {\n pub id: String,\n}\n\n#[tauri::command]\npub async fn fetch_deepseek_models(api_key: String) -> Result<Vec<DeepSeekModel>, String> {\n if api_key.trim().is_empty() {\n return Err(\"API key is required\".to_string());\n }\n\n let client = reqwest::Client::builder()\n .timeout(std::time::Duration::from_secs(15))\n .build()\n .map_err(|e| format!(\"Failed to build client: {}\", e))?;\n\n let response = client\n .get(\"https://api.deepseek.com/models\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n let models = json[\"data\"]\n .as_array()\n .ok_or(\"Invalid API response format\")?\n .iter()\n .filter_map(|m| {\n m[\"id\"]\n .as_str()\n .map(|id| DeepSeekModel { id: id.to_string() })\n })\n .collect();\n\n Ok(models)\n}\n\n#[tauri::command]\npub async fn call_deepseek_api(\n content: String,\n format: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/subtitle-processor.md\");\n let user_content = format!(\"Format: {}\\n\\n{}\", format, content);\n\n let text = deepseek_chat(&api_key, &model, system_prompt, &user_content, 0.1, Some(65536)).await?;\n\n let stripped = strip_markdown_fences(&text)\n .replace(\"\\\\r\", \"\")\n .trim()\n .to_string();\n\n Ok(stripped)\n}\n\npub(crate) async fn deepseek_chat(\n api_key: &str,\n model: &str,\n system_prompt: &str,\n user_content: &str,\n temperature: f64,\n max_tokens: Option<u32>,\n) -> Result<String, String> {\n let mut body = serde_json::json!({\n \"model\": model,\n \"messages\": [\n { \"role\": \"system\", \"content\": system_prompt },\n { \"role\": \"user\", \"content\": user_content }\n ],\n \"temperature\": temperature,\n });\n\n if let Some(tokens) = max_tokens {\n body[\"max_tokens\"] = serde_json::json!(tokens);\n }\n\n let client = reqwest::Client::new();\n let response = client\n .post(\"https://api.deepseek.com/chat/completions\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .header(\"Content-Type\", \"application/json\")\n .json(&body)\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n Ok(json[\"choices\"][0][\"message\"][\"content\"]\n .as_str()\n .ok_or(\"Invalid API response format\")?\n .to_string())\n}\n\n#[tauri::command]\npub async fn call_deepseek_dictionary(\n word: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/word-dictionary.md\");\n let user_content = format!(\"Define: {}\", word.trim().to_lowercase());\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(1024),\n )\n .await\n}\n"}, "b07acb373d8a53f914a45e19dc169b01df4cb54e": {"t": 1785761029.4399796, "n": 3725, "h": "fcaeee6f45688b9d", "c": "use serde::Serialize;\nuse tauri_plugin_http::reqwest;\n\nuse crate::util::strip_markdown_fences;\n\n#[derive(Serialize)]\npub struct DeepSeekModel {\n pub id: String,\n}\n\n#[tauri::command]\npub async fn fetch_deepseek_models(api_key: String) -> Result<Vec<DeepSeekModel>, String> {\n if api_key.trim().is_empty() {\n return Err(\"API key is required\".to_string());\n }\n\n let client = reqwest::Client::builder()\n .timeout(std::time::Duration::from_secs(15))\n .build()\n .map_err(|e| format!(\"Failed to build client: {}\", e))?;\n\n let response = client\n .get(\"https://api.deepseek.com/models\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n let models = json[\"data\"]\n .as_array()\n .ok_or(\"Invalid API response format\")?\n .iter()\n .filter_map(|m| {\n m[\"id\"]\n .as_str()\n .map(|id| DeepSeekModel { id: id.to_string() })\n })\n .collect();\n\n Ok(models)\n}\n\n#[tauri::command]\npub async fn call_deepseek_api(\n content: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/subtitle-processor.md\");\n\n let text = deepseek_chat(&api_key, &model, system_prompt, &content, 0.1, None).await?;\n\n let stripped = strip_markdown_fences(&text)\n .replace(\"\\\\r\", \"\")\n .trim()\n .to_string();\n\n Ok(stripped)\n}\n\npub(crate) async fn deepseek_chat(\n api_key: &str,\n model: &str,\n system_prompt: &str,\n user_content: &str,\n temperature: f64,\n max_tokens: Option<u32>,\n) -> Result<String, String> {\n let mut body = serde_json::json!({\n \"model\": model,\n \"messages\": [\n { \"role\": \"system\", \"content\": system_prompt },\n { \"role\": \"user\", \"content\": user_content }\n ],\n \"temperature\": temperature,\n });\n\n if let Some(tokens) = max_tokens {\n body[\"max_tokens\"] = serde_json::json!(tokens);\n }\n\n let client = reqwest::Client::new();\n let response = client\n .post(\"https://api.deepseek.com/chat/completions\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .header(\"Content-Type\", \"application/json\")\n .json(&body)\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n Ok(json[\"choices\"][0][\"message\"][\"content\"]\n .as_str()\n .ok_or(\"Invalid API response format\")?\n .to_string())\n}\n\n#[tauri::command]\npub async fn call_deepseek_dictionary(\n word: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/word-dictionary.md\");\n let user_content = format!(\"Define: {}\", word.trim().to_lowercase());\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(1024),\n )\n .await\n}\n"}, "fbc53ad780a29100ee64fb83b84271ad21d1253a": {"t": 1785761030.6841364, "n": 2364, "h": "f00fec942db3df9a", "c": "use tauri_plugin_http::reqwest;\n\nuse crate::util::strip_markdown_fences;\n\n#[tauri::command]\npub async fn call_deepseek_api(\n content: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/subtitle-processor.md\");\n\n let text = deepseek_chat(&api_key, &model, system_prompt, &content, 0.1, None).await?;\n\n let stripped = strip_markdown_fences(&text)\n .replace(\"\\\\r\", \"\")\n .trim()\n .to_string();\n\n Ok(stripped)\n}\n\npub(crate) async fn deepseek_chat(\n api_key: &str,\n model: &str,\n system_prompt: &str,\n user_content: &str,\n temperature: f64,\n max_tokens: Option<u32>,\n) -> Result<String, String> {\n let mut body = serde_json::json!({\n \"model\": model,\n \"messages\": [\n { \"role\": \"system\", \"content\": system_prompt },\n { \"role\": \"user\", \"content\": user_content }\n ],\n \"temperature\": temperature,\n });\n\n if let Some(tokens) = max_tokens {\n body[\"max_tokens\"] = serde_json::json!(tokens);\n }\n\n let client = reqwest::Client::new();\n let response = client\n .post(\"https://api.deepseek.com/chat/completions\")\n .header(\"Authorization\", format!(\"Bearer {}\", api_key))\n .header(\"Content-Type\", \"application/json\")\n .json(&body)\n .send()\n .await\n .map_err(|e| format!(\"Request failed: {}\", e))?;\n\n if !response.status().is_success() {\n let status = response.status();\n let body = response.text().await.unwrap_or_default();\n return Err(format!(\"API error {}: {}\", status, body));\n }\n\n let json: serde_json::Value = response\n .json()\n .await\n .map_err(|e| format!(\"Failed to parse response: {}\", e))?;\n\n Ok(json[\"choices\"][0][\"message\"][\"content\"]\n .as_str()\n .ok_or(\"Invalid API response format\")?\n .to_string())\n}\n\n#[tauri::command]\npub async fn call_deepseek_dictionary(\n word: String,\n api_key: String,\n model: String,\n) -> Result<String, String> {\n let system_prompt = include_str!(\"../prompts/word-dictionary.md\");\n let user_content = format!(\"Define: {}\", word.trim().to_lowercase());\n\n deepseek_chat(\n &api_key,\n &model,\n system_prompt,\n &user_content,\n 0.3,\n Some(1024),\n )\n .await\n}\n"}}}}