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