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::Client::builder(&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                    match client_builder.build() {
54                        Ok(client) => {
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                        Err(err) => {
60                            tracing::error!("添加 {} 错误: {}",agent_conf.provider,err);
61                        }
62                    }
63                }
64                ProviderEnum::Cohere => {
65                    let client = cohere::Client::new(&agent_conf.api_key);
66                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
67                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
68                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
69                }
70                ProviderEnum::Gemini => {
71                    tracing::info!("Gemini 暂不支持,没有实现BoxAgent........ ")
72                }
73                ProviderEnum::Huggingface => {
74                    let client = huggingface::Client::new(&agent_conf.api_key);
75                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
76                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
77                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
78                }
79                ProviderEnum::Mistral => {
80                    let client = mistral::Client::new(&agent_conf.api_key);
81                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
82                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
83                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
84                }
85                ProviderEnum::OpenAi => {
86                    let mut client_builder = openai::Client::builder(&agent_conf.api_key);
87                    if let Some(api_base_url) = &agent_conf.api_base_url {
88                        client_builder = client_builder.base_url(api_base_url)
89                    }
90
91                    match client_builder.build() {
92                        Ok(client) => {
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                        Err(err) => {
98                            tracing::error!("添加 {} 错误: {}",agent_conf.provider,err);
99                        }
100                    }
101                }
102                ProviderEnum::OpenRouter => {
103
104                    let mut client_builder = openrouter::Client::builder(&agent_conf.api_key);
105                    if let Some(api_base_url) = &agent_conf.api_base_url {
106                        client_builder = client_builder.base_url(api_base_url)
107                    }
108
109                    match client_builder.build() {
110                        Ok(client) => {
111                            let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
112                            let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
113                            self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
114                        }
115                        Err(err) => {
116                            tracing::error!("添加 {} 错误: {}",agent_conf.provider,err);
117                        }
118                    }
119                }
120                ProviderEnum::Together => {
121                    let client = together::Client::new(&agent_conf.api_key);
122                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
123                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
124                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
125                }
126                ProviderEnum::XAI => {
127                    let client = xai::Client::new(&agent_conf.api_key);
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::Azure => {
133                    tracing::info!("Azure simple_builder暂不支持,参数有点多,可以自行添加........ ")
134                }
135                ProviderEnum::DeepSeek => {
136                    let client = deepseek::Client::new(&agent_conf.api_key);
137                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
138                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
139                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
140                }
141                ProviderEnum::Galadriel => {
142                    tracing::info!("Galadriel simple_builder暂不支持,可以自行添加........ ")
143                }
144                ProviderEnum::Groq => {
145                    let client =groq::Client::new(&agent_conf.api_key);
146                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
147                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
148                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
149                }
150                ProviderEnum::Hyperbolic => {
151                    let client = hyperbolic::Client::new(&agent_conf.api_key);
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 = mira::Client::new(&agent_conf.api_key);
158                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
159                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
160                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
161                }
162                ProviderEnum::Mooshot => {
163                    let client = moonshot::Client::new(&agent_conf.api_key);
164                    let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
165                    let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
166                    self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
167                }
168                ProviderEnum::Ollama => {
169                    let mut client_builder = ollama::Client::builder();
170                    if let Some(api_base_url) = &agent_conf.api_base_url {
171                        client_builder = client_builder.base_url(api_base_url);
172                    }
173
174                    match client_builder.build() {
175                        Ok(client) => {
176                            let system_prompt = agent_conf.system_prompt.unwrap_or(global_system_prompt.clone());
177                            let agent = client.agent(&agent_conf.model_name).preamble(&system_prompt).build();
178                            self.agents.push((agent, agent_conf.id, agent_conf.provider.to_string(), agent_conf.model_name));
179                        }
180                        Err(err) => {
181                            tracing::error!("添加 {} 错误: {}",agent_conf.provider,err);
182                        }
183                    }
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}