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;
7use crate::thread_safe_rand_agent::ThreadSafeRandAgentBuilder;
8
9#[derive(Debug,Display, Deserialize,Serialize)]
10#[serde(rename_all="lowercase")]
11pub enum ProviderEnum{
12    Anthropic,
13    Cohere,
14    Gemini,
15    Huggingface,
16    Mistral,
17    OpenAi,
18    OpenRouter,
19    Together,
20    XAI,
21    Azure,
22    DeepSeek,
23    Galadriel,
24    Groq,
25    Hyperbolic,
26    Mira,
27    Mooshot,
28    Ollama,
29    Perplexity,
30    Voyageai,
31    Bigmodel,
32}
33
34#[derive(Debug, Deserialize)]
35pub struct AgentConfig {
36    pub id: i32,
37    pub provider: ProviderEnum,
38    pub model_name: String,
39    pub api_key: String,
40    pub api_base_url: Option<String>,
41    pub system_prompt: Option<String>,
42}
43
44impl ThreadSafeRandAgentBuilder{
45    /// 简单构建器
46    pub fn simple_builder(mut self, agent_configs: Vec<AgentConfig>,global_system_prompt: String) -> Self {
47        for agent_conf in agent_configs {
48            match agent_conf.provider {
49                ProviderEnum::Anthropic => {
50                    let mut client_builder = anthropic::ClientBuilder::new(&agent_conf.api_key);
51                    if let Some(api_base_url) = &agent_conf.api_base_url {
52                        client_builder = client_builder.base_url(api_base_url);
53                    }
54                    let client = client_builder.build();
55                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
56                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
57                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
58                }
59                ProviderEnum::Cohere => {
60                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
61                        cohere::Client::from_url(&agent_conf.api_key,&api_base_url)
62                    }else {
63                        cohere::Client::new(&agent_conf.api_key)
64                    };
65                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
66                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
67                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
68                }
69                ProviderEnum::Gemini => {
70                    tracing::info!("Gemini 暂不支持,没有实现BoxAgent........ ")
71                }
72                ProviderEnum::Huggingface => {
73                    let client = huggingface::Client::new(&agent_conf.api_key);
74                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
75                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
76                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
77                }
78                ProviderEnum::Mistral => {
79                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
80                        mistral::Client::from_url(&agent_conf.api_key,&api_base_url)
81                    }else {
82                        mistral::Client::new(&agent_conf.api_key)
83                    };
84                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
85                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
86                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
87                }
88                ProviderEnum::OpenAi => {
89                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
90                        openai::Client::from_url(&agent_conf.api_key,&api_base_url)
91                    }else {
92                        openai::Client::new(&agent_conf.api_key)
93                    };
94                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
95                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
96                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
97                }
98                ProviderEnum::OpenRouter => {
99                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
100                        openrouter::Client::from_url(&agent_conf.api_key,&api_base_url)
101                    }else {
102                        openrouter::Client::new(&agent_conf.api_key)
103                    };
104                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
105                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
106                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
107                }
108                ProviderEnum::Together => {
109                    let client = together::Client::new(&agent_conf.api_key);
110                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
111                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
112                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
113                }
114                ProviderEnum::XAI => {
115                    let client = xai::Client::new(&agent_conf.api_key);
116                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
117                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
118                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
119                }
120                ProviderEnum::Azure => {
121                    tracing::info!("Azure simple_builder暂不支持,参数有点多,可以自行添加........ ")
122                }
123                ProviderEnum::DeepSeek => {
124                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
125                        deepseek::Client::from_url(&agent_conf.api_key,&api_base_url)
126                    }else {
127                        deepseek::Client::new(&agent_conf.api_key)
128                    };
129                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
130                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
131                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
132                }
133                ProviderEnum::Galadriel => {
134                    tracing::info!("Galadriel simple_builder暂不支持,可以自行添加........ ")
135                }
136                ProviderEnum::Groq => {
137                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
138                        groq::Client::from_url(&agent_conf.api_key,&api_base_url)
139                    }else {
140                        groq::Client::new(&agent_conf.api_key)
141                    };
142                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
143                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
144                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
145                }
146                ProviderEnum::Hyperbolic => {
147                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
148                        hyperbolic::Client::from_url(&agent_conf.api_key,&api_base_url)
149                    }else {
150                        hyperbolic::Client::new(&agent_conf.api_key)
151                    };
152                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
153                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
154                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
155                }
156                ProviderEnum::Mira => {
157                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
158                        moonshot::Client::from_url(&agent_conf.api_key,&api_base_url)
159                    }else {
160                        moonshot::Client::new(&agent_conf.api_key)
161                    };
162                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
163                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
164                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
165                }
166                ProviderEnum::Mooshot => {
167                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
168                        moonshot::Client::from_url(&agent_conf.api_key,&api_base_url)
169                    }else {
170                        moonshot::Client::new(&agent_conf.api_key)
171                    };
172                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
173                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
174                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
175                }
176                ProviderEnum::Ollama => {
177                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
178                        ollama::Client::from_url(&api_base_url)
179                    }else {
180                        ollama::Client::new()
181                    };
182                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
183                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
184                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
185                }
186                ProviderEnum::Perplexity => {
187                    tracing::info!("Perplexity 暂不支持,没有实现BoxAgent........ ")
188                }
189                ProviderEnum::Voyageai => {
190                    tracing::info!("Voyageai 暂不支持,........ ")
191                }
192                ProviderEnum::Bigmodel => {
193                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
194                        bigmodel::Client::from_url(&agent_conf.api_key,&api_base_url)
195                    }else {
196                        bigmodel::Client::new(&agent_conf.api_key)
197                    };
198                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
199                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
200                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
201                }
202            }
203        }
204        self
205    }
206}
207
208impl<'a> RandAgentBuilder<'a> {
209    /// 简单构建器
210    pub fn simple_builder(mut self, agent_configs: Vec<AgentConfig>,global_system_prompt: String) -> Self {
211        for agent_conf in agent_configs {
212            match agent_conf.provider {
213                ProviderEnum::Anthropic => {
214                    let mut client_builder = anthropic::ClientBuilder::new(&agent_conf.api_key);
215                    if let Some(api_base_url) = &agent_conf.api_base_url {
216                        client_builder = client_builder.base_url(api_base_url);
217                    }
218                    let client = client_builder.build();
219                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
220                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
221                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
222                }
223                ProviderEnum::Cohere => {
224                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
225                        cohere::Client::from_url(&agent_conf.api_key,&api_base_url)
226                    }else {
227                        cohere::Client::new(&agent_conf.api_key)
228                    };
229                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
230                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
231                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
232                }
233                ProviderEnum::Gemini => {
234                    tracing::info!("Gemini 暂不支持,没有实现BoxAgent........ ")
235                }
236                ProviderEnum::Huggingface => {
237                    let client = huggingface::Client::new(&agent_conf.api_key);
238                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
239                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
240                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
241                }
242                ProviderEnum::Mistral => {
243                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
244                        mistral::Client::from_url(&agent_conf.api_key,&api_base_url)
245                    }else {
246                        mistral::Client::new(&agent_conf.api_key)
247                    };
248                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
249                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
250                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
251                }
252                ProviderEnum::OpenAi => {
253                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
254                        openai::Client::from_url(&agent_conf.api_key,&api_base_url)
255                    }else {
256                        openai::Client::new(&agent_conf.api_key)
257                    };
258                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
259                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
260                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
261                }
262                ProviderEnum::OpenRouter => {
263                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
264                        openrouter::Client::from_url(&agent_conf.api_key,&api_base_url)
265                    }else {
266                        openrouter::Client::new(&agent_conf.api_key)
267                    };
268                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
269                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
270                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
271                }
272                ProviderEnum::Together => {
273                    let client = together::Client::new(&agent_conf.api_key);
274                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
275                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
276                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
277                }
278                ProviderEnum::XAI => {
279                    let client = xai::Client::new(&agent_conf.api_key);
280                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
281                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
282                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
283                }
284                ProviderEnum::Azure => {
285                    tracing::info!("Azure simple_builder暂不支持,参数有点多,可以自行添加........ ")
286                }
287                ProviderEnum::DeepSeek => {
288                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
289                        deepseek::Client::from_url(&agent_conf.api_key,&api_base_url)
290                    }else {
291                        deepseek::Client::new(&agent_conf.api_key)
292                    };
293                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
294                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
295                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
296                }
297                ProviderEnum::Galadriel => {
298                    tracing::info!("Galadriel simple_builder暂不支持,可以自行添加........ ")
299                }
300                ProviderEnum::Groq => {
301                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
302                        groq::Client::from_url(&agent_conf.api_key,&api_base_url)
303                    }else {
304                        groq::Client::new(&agent_conf.api_key)
305                    };
306                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
307                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
308                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
309                }
310                ProviderEnum::Hyperbolic => {
311                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
312                        hyperbolic::Client::from_url(&agent_conf.api_key,&api_base_url)
313                    }else {
314                        hyperbolic::Client::new(&agent_conf.api_key)
315                    };
316                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
317                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
318                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
319                }
320                ProviderEnum::Mira => {
321                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
322                        moonshot::Client::from_url(&agent_conf.api_key,&api_base_url)
323                    }else {
324                        moonshot::Client::new(&agent_conf.api_key)
325                    };
326                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
327                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
328                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
329                }
330                ProviderEnum::Mooshot => {
331                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
332                        moonshot::Client::from_url(&agent_conf.api_key,&api_base_url)
333                    }else {
334                        moonshot::Client::new(&agent_conf.api_key)
335                    };
336                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
337                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
338                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
339                }
340                ProviderEnum::Ollama => {
341                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
342                        ollama::Client::from_url(&api_base_url)
343                    }else {
344                        ollama::Client::new()
345                    };
346                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
347                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
348                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
349                }
350                ProviderEnum::Perplexity => {
351                    tracing::info!("Perplexity 暂不支持,没有实现BoxAgent........ ")
352                }
353                ProviderEnum::Voyageai => {
354                    tracing::info!("Voyageai 暂不支持,........ ")
355                }
356                ProviderEnum::Bigmodel => {
357                    let client = if let Some(api_base_url) = agent_conf.api_base_url {
358                        bigmodel::Client::from_url(&agent_conf.api_key,&api_base_url)
359                    }else {
360                        bigmodel::Client::new(&agent_conf.api_key)
361                    };
362                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
363                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
364                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
365                }
366            }
367        }
368        self
369    }
370}