Files
baibot-withmcp/src/agent/provider/entity/agent_provider.rs
Slavi Pantaleev 946aa9d9e9 Initial commit
2024-09-12 13:44:06 +03:00

199 lines
9.5 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
use crate::agent::AgentPurpose;
#[derive(Debug, Clone)]
pub enum AgentProvider {
Anthropic,
Groq,
LocalAI,
Mistral,
Ollama,
OpenAI,
OpenAICompat,
OpenRouter,
TogetherAI,
}
impl AgentProvider {
pub fn choices() -> Vec<&'static Self> {
vec![
&Self::Anthropic,
&Self::Groq,
&Self::LocalAI,
&Self::Mistral,
&Self::Ollama,
&Self::OpenAI,
&Self::OpenAICompat,
&Self::OpenRouter,
&Self::TogetherAI,
]
}
pub fn to_static_str(&self) -> &'static str {
match &self {
Self::Anthropic => "anthropic",
Self::Groq => "groq",
Self::LocalAI => "localai",
Self::Mistral => "mistral",
Self::Ollama => "ollama",
Self::OpenAI => "openai",
Self::OpenAICompat => "openai-compatible",
Self::OpenRouter => "openrouter",
Self::TogetherAI => "together-ai",
}
}
pub fn from_string(s: &str) -> Result<Self, &'static str> {
match s {
"anthropic" => Ok(Self::Anthropic),
"groq" => Ok(Self::Groq),
"localai" => Ok(Self::LocalAI),
"mistral" => Ok(Self::Mistral),
"ollama" => Ok(Self::Ollama),
"openai" => Ok(Self::OpenAI),
"openai-compatible" => Ok(Self::OpenAICompat),
"openrouter" => Ok(Self::OpenRouter),
"together-ai" => Ok(Self::TogetherAI),
_ => Err("Unexpected string value"),
}
}
pub fn info(&self) -> AgentProviderInfo {
match &self {
Self::Anthropic => AgentProviderInfo {
id: Self::Anthropic.to_static_str(),
name: "Anthropic",
description: "Anthropic is an American AI company founded by former OpenAI engineers and providing powerful language models.",
homepage_url: Some("https://www.anthropic.com/"),
wiki_url: Some("https://en.wikipedia.org/wiki/Anthropic"),
sign_up_url: Some("https://console.anthropic.com/"),
models_list_url: Some("https://docs.anthropic.com/en/docs/about-claude/models"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
],
},
Self::Groq => AgentProviderInfo {
id: Self::Groq.to_static_str(),
name: "Groq",
description: "Groq is an American company developing optimized Language Processing Units (LPU) and offering cloud service which runs various models (built by others) with very high performance.",
homepage_url: Some("https://groq.com/"),
wiki_url: Some("https://en.wikipedia.org/wiki/Groq"),
sign_up_url: Some("https://console.groq.com/login"),
models_list_url: Some("https://console.groq.com/docs/models"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
AgentPurpose::SpeechToText,
],
},
Self::LocalAI => AgentProviderInfo {
id: Self::LocalAI.to_static_str(),
name: "LocalAI",
description: "LocalAI is the free, Open Source OpenAI alternative. LocalAI act as a drop-in replacement REST API that’s compatible with OpenAI API specifications for local inferencing. It allows you to run LLMs, generate images, audio (and not only) locally or on-prem with consumer grade hardware, supporting multiple model families and architectures.",
homepage_url: Some("https://localai.io/"),
wiki_url: None,
sign_up_url: None,
models_list_url: Some("https://localai.io/gallery.html"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
AgentPurpose::TextToSpeech,
AgentPurpose::SpeechToText,
],
},
Self::Mistral => AgentProviderInfo {
id: Self::Mistral.to_static_str(),
name: "Mistral",
description: "Mistral AI is a research lab based in Europe (France) which produces their own language models.",
homepage_url: Some("https://mistral.ai/"),
wiki_url: Some("https://en.wikipedia.org/wiki/Mistral_AI"),
sign_up_url: Some("https://auth.mistral.ai/ui/registration"),
models_list_url: Some("https://docs.mistral.ai/getting-started/models/"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
],
},
Self::Ollama => AgentProviderInfo {
id: Self::Ollama.to_static_str(),
name: "Ollama",
description: "Ollama lets you run various models in a [self-hosted](https://github.com/ollama/ollama?tab=readme-ov-file#ollama) way. This is more advanced and requires powerful hardware for running some of the better models, but ensures your data stays with you.",
homepage_url: Some("https://ollama.com/"),
wiki_url: None,
sign_up_url: None,
models_list_url: Some("https://ollama.com/library"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
],
},
Self::OpenAI => AgentProviderInfo {
id: Self::OpenAI.to_static_str(),
name: "OpenAI",
description: "OpenAI is an American AI company providing powerful language models.\n\nUse this provider either with the OpenAI API or with other OpenAI-compatible API services which **fully** adhere to the [OpenAI API spec](https://github.com/openai/openai-openapi/).\nFor services which are not fully compatible with the OpenAI API, consider using the **OpenAI Compatible** provider.",
homepage_url: Some("https://openai.com/"),
wiki_url: Some("https://en.wikipedia.org/wiki/OpenAI"),
sign_up_url: Some("https://platform.openai.com/signup"),
models_list_url: Some("https://platform.openai.com/docs/models"),
supported_purposes: vec![
AgentPurpose::ImageGeneration,
AgentPurpose::TextGeneration,
AgentPurpose::TextToSpeech,
AgentPurpose::SpeechToText,
],
},
Self::OpenAICompat => AgentProviderInfo {
id: Self::OpenAICompat.to_static_str(),
name: "OpenAI Compatible",
description: "This provider allows you to use OpenAI-compatible API services like [OpenRouter](https://openrouter.ai/), [Together AI](https://www.together.ai/), etc.\n\nSome of these popular services already have **shortcut** providers (leading to this one behind the scenes) - this make it easier to get started.\n\nThis provider just as featureful as the **OpenAI** provider, but is more compatible with services which do not fully adhere to the [OpenAI API spec](https://github.com/openai/openai-openapi/).",
homepage_url: None,
wiki_url: None,
sign_up_url: None,
models_list_url: None,
supported_purposes: vec![
AgentPurpose::ImageGeneration,
AgentPurpose::TextGeneration,
AgentPurpose::TextToSpeech,
AgentPurpose::SpeechToText,
],
},
Self::OpenRouter => AgentProviderInfo {
id: Self::OpenRouter.to_static_str(),
name: "OpenRouter",
description: "OpenRouter is a unified interface for LLMs. The platform scouts for the lowest prices and best latencies/throughputs across dozens of providers, and lets you choose how to [prioritize](https://openrouter.ai/docs/provider-routing) them.",
homepage_url: Some("https://openrouter.ai/"),
wiki_url: None,
sign_up_url: Some("https://openrouter.ai/"),
models_list_url: Some("https://openrouter.ai/models"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
],
},
Self::TogetherAI => AgentProviderInfo {
id: Self::TogetherAI.to_static_str(),
name: "Together AI",
description: "Together AI makes it easy to run or [fine-tune](https://docs.together.ai/docs/fine-tuning-overview) leading open source models with only a few lines of code.",
homepage_url: Some("https://www.together.ai/"),
wiki_url: None,
sign_up_url: Some("https://api.together.ai/signup"),
models_list_url: Some("https://api.together.xyz/models"),
supported_purposes: vec![
AgentPurpose::TextGeneration,
],
},
}
}
}
impl std::fmt::Display for AgentProvider {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.to_static_str())
}
}
pub struct AgentProviderInfo {
pub id: &'static str,
pub name: &'static str,
pub description: &'static str,
pub homepage_url: Option<&'static str>,
pub wiki_url: Option<&'static str>,
pub sign_up_url: Option<&'static str>,
pub models_list_url: Option<&'static str>,
pub supported_purposes: Vec<AgentPurpose>,
}