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 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 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}