rig_extra/
simple_rand_builder.rs

1use rig::client::completion::CompletionClientDyn;
2use rig::providers::*;
3use serde::{Deserialize, Serialize};
4use strum_macros::Display;
5use crate::extra_providers::bigmodel;
6use crate::rand_agent::RandAgentBuilder;
7
8#[derive(Debug,Display, Deserialize,Serialize)]
9#[serde(rename_all="lowercase")]
10pub enum ProviderEnum{
11    Anthropic,
12    Cohere,
13    Gemini,
14    Huggingface,
15    Mistral,
16    OpenAi,
17    OpenRouter,
18    Together,
19    XAI,
20    Azure,
21    DeepSeek,
22    Galadriel,
23    Groq,
24    Hyperbolic,
25    Mira,
26    Mooshot,
27    Ollama,
28    Perplexity,
29    Voyageai,
30    Bigmodel,
31}
32
33#[derive(Debug, Deserialize)]
34pub struct AgentConfig {
35    pub id: i32,
36    pub provider: ProviderEnum,
37    pub model_name: String,
38    pub api_key: String,
39    pub api_base_url: Option<String>,
40    pub system_prompt: Option<String>,
41}
42
43impl RandAgentBuilder{
44    /// 简单构建器
45    pub fn simple_builder(mut self, agent_configs: Vec<AgentConfig>,global_system_prompt: String) -> Self {
46        for agent_conf in agent_configs {
47            match agent_conf.provider {
48                ProviderEnum::Anthropic => {
49                    let mut client_builder = anthropic::ClientBuilder::new(&agent_conf.api_key);
50                    if let Some(api_base_url) = &agent_conf.api_base_url {
51                        client_builder = client_builder.base_url(api_base_url);
52                    }
53                    let client = client_builder.build();
54                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
55                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
56                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
57                }
58                ProviderEnum::Cohere => {
59                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
60                        cohere::Client::from_url(&agent_conf.api_key,&api_base_url)
61                    }else {
62                        cohere::Client::new(&agent_conf.api_key)
63                    };
64                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
65                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
66                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
67                }
68                ProviderEnum::Gemini => {
69                    tracing::info!("Gemini 暂不支持,没有实现BoxAgent........ ")
70                }
71                ProviderEnum::Huggingface => {
72                    let client = huggingface::Client::new(&agent_conf.api_key);
73                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
74                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
75                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
76                }
77                ProviderEnum::Mistral => {
78                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
79                        mistral::Client::from_url(&agent_conf.api_key,&api_base_url)
80                    }else {
81                        mistral::Client::new(&agent_conf.api_key)
82                    };
83                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
84                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
85                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
86                }
87                ProviderEnum::OpenAi => {
88                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
89                        openai::Client::from_url(&agent_conf.api_key,&api_base_url)
90                    }else {
91                        openai::Client::new(&agent_conf.api_key)
92                    };
93                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
94                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
95                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
96                }
97                ProviderEnum::OpenRouter => {
98                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
99                        openrouter::Client::from_url(&agent_conf.api_key,&api_base_url)
100                    }else {
101                        openrouter::Client::new(&agent_conf.api_key)
102                    };
103                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
104                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
105                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
106                }
107                ProviderEnum::Together => {
108                    let client = together::Client::new(&agent_conf.api_key);
109                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
110                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
111                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
112                }
113                ProviderEnum::XAI => {
114                    let client = xai::Client::new(&agent_conf.api_key);
115                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
116                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
117                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
118                }
119                ProviderEnum::Azure => {
120                    tracing::info!("Azure simple_builder暂不支持,参数有点多,可以自行添加........ ")
121                }
122                ProviderEnum::DeepSeek => {
123                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
124                        deepseek::Client::from_url(&agent_conf.api_key,&api_base_url)
125                    }else {
126                        deepseek::Client::new(&agent_conf.api_key)
127                    };
128                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
129                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
130                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
131                }
132                ProviderEnum::Galadriel => {
133                    tracing::info!("Galadriel simple_builder暂不支持,可以自行添加........ ")
134                }
135                ProviderEnum::Groq => {
136                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
137                        groq::Client::from_url(&agent_conf.api_key,&api_base_url)
138                    }else {
139                        groq::Client::new(&agent_conf.api_key)
140                    };
141                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
142                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
143                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
144                }
145                ProviderEnum::Hyperbolic => {
146                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
147                        hyperbolic::Client::from_url(&agent_conf.api_key,&api_base_url)
148                    }else {
149                        hyperbolic::Client::new(&agent_conf.api_key)
150                    };
151                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
152                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
153                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
154                }
155                ProviderEnum::Mira => {
156                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
157                        moonshot::Client::from_url(&agent_conf.api_key,&api_base_url)
158                    }else {
159                        moonshot::Client::new(&agent_conf.api_key)
160                    };
161                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
162                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
163                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
164                }
165                ProviderEnum::Mooshot => {
166                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
167                        moonshot::Client::from_url(&agent_conf.api_key,&api_base_url)
168                    }else {
169                        moonshot::Client::new(&agent_conf.api_key)
170                    };
171                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
172                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
173                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
174                }
175                ProviderEnum::Ollama => {
176                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
177                        ollama::Client::from_url(&api_base_url)
178                    }else {
179                        ollama::Client::new()
180                    };
181                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
182                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
183                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
184                }
185                ProviderEnum::Perplexity => {
186                    tracing::info!("Perplexity 暂不支持,没有实现BoxAgent........ ")
187                }
188                ProviderEnum::Voyageai => {
189                    tracing::info!("Voyageai 暂不支持,........ ")
190                }
191                ProviderEnum::Bigmodel => {
192                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
193                        bigmodel::Client::from_url(&agent_conf.api_key,&api_base_url)
194                    }else {
195                        bigmodel::Client::new(&agent_conf.api_key)
196                    };
197                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
198                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
199                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
200                }
201            }
202        }
203        self
204    }
205}