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