ai_lib/provider/
config.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4/// 提供商配置模板,定义API访问参数
5/// 
6/// Provider configuration template defining API access parameters
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ProviderConfig {
9    /// Base URL
10    pub base_url: String,
11    /// API key environment variable name
12    pub api_key_env: String,
13    /// Chat completion endpoint path
14    pub chat_endpoint: String,
15    /// Model list endpoint path
16    pub models_endpoint: Option<String>,
17    /// Request headers template
18    pub headers: HashMap<String, String>,
19    /// Field mapping configuration
20    pub field_mapping: FieldMapping,
21}
22
23/// 字段映射配置,定义不同API格式的字段映射
24/// 
25/// Field mapping configuration defining field mappings for different API formats
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct FieldMapping {
28    /// Messages array field name (OpenAI: "messages", Gemini: "contents")
29    pub messages_field: String,
30    /// Model field name
31    pub model_field: String,
32    /// Role field mapping
33    pub role_mapping: HashMap<String, String>,
34    /// Response content path (e.g. "choices.0.message.content")
35    pub response_content_path: String,
36}
37
38impl ProviderConfig {
39    /// OpenAI-compatible configuration template
40    pub fn openai_compatible(base_url: &str, api_key_env: &str) -> Self {
41        let mut headers = HashMap::new();
42        headers.insert("Content-Type".to_string(), "application/json".to_string());
43        
44        let mut role_mapping = HashMap::new();
45        role_mapping.insert("System".to_string(), "system".to_string());
46        role_mapping.insert("User".to_string(), "user".to_string());
47        role_mapping.insert("Assistant".to_string(), "assistant".to_string());
48
49        Self {
50            base_url: base_url.to_string(),
51            api_key_env: api_key_env.to_string(),
52            chat_endpoint: "/chat/completions".to_string(),
53            models_endpoint: Some("/models".to_string()),
54            headers,
55            field_mapping: FieldMapping {
56                messages_field: "messages".to_string(),
57                model_field: "model".to_string(),
58                role_mapping,
59                response_content_path: "choices.0.message.content".to_string(),
60            },
61        }
62    }
63}