{"repo": "2025ppo/aqw", "files": {"src-tauri/src/llm_provider.rs": {"461db44a071adfc9ca78f81d0e45cb38d22a385c": {"t": 1785745871.6692321, "n": 5793, "h": "eea35930a734acfc", "c": "use serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\n\n/// 模型提供商定义\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ModelProvider {\n pub id: String,\n pub name: String,\n pub base_url: String,\n pub api_key_env: String,\n pub supports_streaming: bool,\n pub supports_function_calling: bool,\n pub max_context_window: usize,\n pub default_model: String,\n}\n\n/// Provider注册表:管理所有可用的LLM Provider\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ProviderRegistry {\n providers: HashMap,\n pub default_provider_id: String,\n}\n\nimpl ProviderRegistry {\n /// 创建内置所有Provider的注册表\n pub fn new() -> Self {\n let mut providers = HashMap::new();\n\n providers.insert(\n \"deepseek\".to_string(),\n ModelProvider {\n id: \"deepseek\".to_string(),\n name: \"DeepSeek\".to_string(),\n base_url: \"https://api.deepseek.com/v1\".to_string(),\n api_key_env: \"DEEPSEEK_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 64000,\n default_model: \"deepseek-chat\".to_string(),\n },\n );\n\n providers.insert(\n \"openai\".to_string(),\n ModelProvider {\n id: \"openai\".to_string(),\n name: \"OpenAI\".to_string(),\n base_url: \"https://api.openai.com/v1\".to_string(),\n api_key_env: \"OPENAI_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 128000,\n default_model: \"gpt-4o\".to_string(),\n },\n );\n\n providers.insert(\n \"anthropic\".to_string(),\n ModelProvider {\n id: \"anthropic\".to_string(),\n name: \"Anthropic\".to_string(),\n base_url: \"https://api.anthropic.com/v1\".to_string(),\n api_key_env: \"ANTHROPIC_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 200000,\n default_model: \"claude-sonnet-4-20250514\".to_string(),\n },\n );\n\n providers.insert(\n \"aliyun\".to_string(),\n ModelProvider {\n id: \"aliyun\".to_string(),\n name: \"阿里云百炼\".to_string(),\n base_url: \"https://dashscope.aliyuncs.com/compatible-mode/v1\".to_string(),\n api_key_env: \"DASHSCOPE_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 131072,\n default_model: \"qwen-plus\".to_string(),\n },\n );\n\n providers.insert(\n \"ollama\".to_string(),\n ModelProvider {\n id: \"ollama\".to_string(),\n name: \"Ollama (本地)\".to_string(),\n base_url: \"http://localhost:11434/v1\".to_string(),\n api_key_env: \"\".to_string(),\n supports_streaming: true,\n supports_function_calling: false,\n max_context_window: 8192,\n default_model: \"llama3\".to_string(),\n },\n );\n\n ProviderRegistry {\n providers,\n default_provider_id: \"deepseek\".to_string(),\n }\n }\n\n /// 根据ID获取Provider\n pub fn get_provider(&self, id: &str) -> Option<&ModelProvider> {\n self.providers.get(id)\n }\n\n /// 获取默认Provider\n pub fn get_default(&self) -> &ModelProvider {\n self.providers\n .get(&self.default_provider_id)\n .expect(\"default provider must exist\")\n }\n\n /// 列出所有Provider\n pub fn list_providers(&self) -> Vec<&ModelProvider> {\n self.providers.values().collect()\n }\n\n /// 添加自定义Provider\n pub fn add_custom_provider(&mut self, provider: ModelProvider) {\n self.providers.insert(provider.id.clone(), provider);\n }\n}\n\n/// LLM请求结构\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct LLMRequest {\n pub provider_id: String,\n pub model: Option,\n pub messages: Vec,\n pub temperature: Option,\n pub max_tokens: Option,\n pub tools: Option>,\n pub stream: bool,\n}\n\n/// 聊天消息\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ChatMessage {\n pub role: String,\n pub content: String,\n #[serde(skip_serializing_if = \"Option::is_none\")]\n pub tool_calls: Option>,\n #[serde(skip_serializing_if = \"Option::is_none\")]\n pub tool_call_id: Option,\n}\n\n/// 工具Schema定义\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolSchema {\n pub r#type: String,\n pub function: ToolFunction,\n}\n\n/// 工具函数定义\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolFunction {\n pub name: String,\n pub description: String,\n pub parameters: serde_json::Value,\n}\n\n/// 工具调用\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolCall {\n pub id: String,\n pub r#type: String,\n pub function: ToolCallFunction,\n}\n\n/// 工具调用函数\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolCallFunction {\n pub name: String,\n pub arguments: String,\n}\n\n/// LLM响应结构\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct LLMResponse {\n pub content: Option,\n pub tool_calls: Option>,\n pub usage: TokenUsage,\n pub model: String,\n pub finish_reason: String,\n}\n\n/// Token使用统计\n#[derive(Debug, Clone, Serialize, Deserialize, Default)]\npub struct TokenUsage {\n pub prompt_tokens: u32,\n pub completion_tokens: u32,\n pub total_tokens: u32,\n}\n"}, "740a5c6a81f16e9ffbb2ca0d4ad186b236c8d640": {"t": 1785757444.5179167, "n": 5793, "h": "eea35930a734acfc", "c": "use serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\n\n/// 模型提供商定义\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ModelProvider {\n pub id: String,\n pub name: String,\n pub base_url: String,\n pub api_key_env: String,\n pub supports_streaming: bool,\n pub supports_function_calling: bool,\n pub max_context_window: usize,\n pub default_model: String,\n}\n\n/// Provider注册表:管理所有可用的LLM Provider\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ProviderRegistry {\n providers: HashMap,\n pub default_provider_id: String,\n}\n\nimpl ProviderRegistry {\n /// 创建内置所有Provider的注册表\n pub fn new() -> Self {\n let mut providers = HashMap::new();\n\n providers.insert(\n \"deepseek\".to_string(),\n ModelProvider {\n id: \"deepseek\".to_string(),\n name: \"DeepSeek\".to_string(),\n base_url: \"https://api.deepseek.com/v1\".to_string(),\n api_key_env: \"DEEPSEEK_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 64000,\n default_model: \"deepseek-chat\".to_string(),\n },\n );\n\n providers.insert(\n \"openai\".to_string(),\n ModelProvider {\n id: \"openai\".to_string(),\n name: \"OpenAI\".to_string(),\n base_url: \"https://api.openai.com/v1\".to_string(),\n api_key_env: \"OPENAI_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 128000,\n default_model: \"gpt-4o\".to_string(),\n },\n );\n\n providers.insert(\n \"anthropic\".to_string(),\n ModelProvider {\n id: \"anthropic\".to_string(),\n name: \"Anthropic\".to_string(),\n base_url: \"https://api.anthropic.com/v1\".to_string(),\n api_key_env: \"ANTHROPIC_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 200000,\n default_model: \"claude-sonnet-4-20250514\".to_string(),\n },\n );\n\n providers.insert(\n \"aliyun\".to_string(),\n ModelProvider {\n id: \"aliyun\".to_string(),\n name: \"阿里云百炼\".to_string(),\n base_url: \"https://dashscope.aliyuncs.com/compatible-mode/v1\".to_string(),\n api_key_env: \"DASHSCOPE_API_KEY\".to_string(),\n supports_streaming: true,\n supports_function_calling: true,\n max_context_window: 131072,\n default_model: \"qwen-plus\".to_string(),\n },\n );\n\n providers.insert(\n \"ollama\".to_string(),\n ModelProvider {\n id: \"ollama\".to_string(),\n name: \"Ollama (本地)\".to_string(),\n base_url: \"http://localhost:11434/v1\".to_string(),\n api_key_env: \"\".to_string(),\n supports_streaming: true,\n supports_function_calling: false,\n max_context_window: 8192,\n default_model: \"llama3\".to_string(),\n },\n );\n\n ProviderRegistry {\n providers,\n default_provider_id: \"deepseek\".to_string(),\n }\n }\n\n /// 根据ID获取Provider\n pub fn get_provider(&self, id: &str) -> Option<&ModelProvider> {\n self.providers.get(id)\n }\n\n /// 获取默认Provider\n pub fn get_default(&self) -> &ModelProvider {\n self.providers\n .get(&self.default_provider_id)\n .expect(\"default provider must exist\")\n }\n\n /// 列出所有Provider\n pub fn list_providers(&self) -> Vec<&ModelProvider> {\n self.providers.values().collect()\n }\n\n /// 添加自定义Provider\n pub fn add_custom_provider(&mut self, provider: ModelProvider) {\n self.providers.insert(provider.id.clone(), provider);\n }\n}\n\n/// LLM请求结构\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct LLMRequest {\n pub provider_id: String,\n pub model: Option,\n pub messages: Vec,\n pub temperature: Option,\n pub max_tokens: Option,\n pub tools: Option>,\n pub stream: bool,\n}\n\n/// 聊天消息\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ChatMessage {\n pub role: String,\n pub content: String,\n #[serde(skip_serializing_if = \"Option::is_none\")]\n pub tool_calls: Option>,\n #[serde(skip_serializing_if = \"Option::is_none\")]\n pub tool_call_id: Option,\n}\n\n/// 工具Schema定义\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolSchema {\n pub r#type: String,\n pub function: ToolFunction,\n}\n\n/// 工具函数定义\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolFunction {\n pub name: String,\n pub description: String,\n pub parameters: serde_json::Value,\n}\n\n/// 工具调用\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolCall {\n pub id: String,\n pub r#type: String,\n pub function: ToolCallFunction,\n}\n\n/// 工具调用函数\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ToolCallFunction {\n pub name: String,\n pub arguments: String,\n}\n\n/// LLM响应结构\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct LLMResponse {\n pub content: Option,\n pub tool_calls: Option>,\n pub usage: TokenUsage,\n pub model: String,\n pub finish_reason: String,\n}\n\n/// Token使用统计\n#[derive(Debug, Clone, Serialize, Deserialize, Default)]\npub struct TokenUsage {\n pub prompt_tokens: u32,\n pub completion_tokens: u32,\n pub total_tokens: u32,\n}\n"}}}}