76 lines
2.2 KiB
Rust
76 lines
2.2 KiB
Rust
use super::api_client::{ApiClient, AuthMethod};
|
|
use super::base::{ConfigKey, ProviderDef, ProviderMetadata};
|
|
use super::openai_compatible::OpenAiCompatibleProvider;
|
|
use crate::model::ModelConfig;
|
|
use anyhow::Result;
|
|
use futures::future::BoxFuture;
|
|
|
|
const XAI_PROVIDER_NAME: &str = "xai";
|
|
pub const XAI_API_HOST: &str = "https://api.x.ai/v1";
|
|
pub const XAI_DEFAULT_MODEL: &str = "grok-code-fast-1";
|
|
pub const XAI_KNOWN_MODELS: &[&str] = &[
|
|
"grok-code-fast-1",
|
|
"grok-4-0709",
|
|
"grok-3",
|
|
"grok-3-fast",
|
|
"grok-3-mini",
|
|
"grok-3-mini-fast",
|
|
"grok-2-vision-1212",
|
|
"grok-2-image-1212",
|
|
"grok-3-latest",
|
|
"grok-3-fast-latest",
|
|
"grok-3-mini-latest",
|
|
"grok-3-mini-fast-latest",
|
|
"grok-2-vision",
|
|
"grok-2-vision-latest",
|
|
"grok-2-image",
|
|
"grok-2-image-latest",
|
|
"grok-2",
|
|
"grok-2-latest",
|
|
];
|
|
|
|
pub const XAI_DOC_URL: &str = "https://docs.x.ai/docs/overview";
|
|
|
|
pub struct XaiProvider;
|
|
|
|
impl ProviderDef for XaiProvider {
|
|
type Provider = OpenAiCompatibleProvider;
|
|
|
|
fn metadata() -> ProviderMetadata {
|
|
ProviderMetadata::new(
|
|
XAI_PROVIDER_NAME,
|
|
"xAI",
|
|
"Grok models from xAI, including reasoning and multimodal capabilities",
|
|
XAI_DEFAULT_MODEL,
|
|
XAI_KNOWN_MODELS.to_vec(),
|
|
XAI_DOC_URL,
|
|
vec![
|
|
ConfigKey::new("XAI_API_KEY", true, true, None, true),
|
|
ConfigKey::new("XAI_HOST", false, false, Some(XAI_API_HOST), false),
|
|
],
|
|
)
|
|
}
|
|
|
|
fn from_env(
|
|
model: ModelConfig,
|
|
_extensions: Vec<crate::config::ExtensionConfig>,
|
|
) -> BoxFuture<'static, Result<OpenAiCompatibleProvider>> {
|
|
Box::pin(async move {
|
|
let config = crate::config::Config::global();
|
|
let api_key: String = config.get_secret("XAI_API_KEY")?;
|
|
let host: String = config
|
|
.get_param("XAI_HOST")
|
|
.unwrap_or_else(|_| XAI_API_HOST.to_string());
|
|
|
|
let api_client = ApiClient::new(host, AuthMethod::BearerToken(api_key))?;
|
|
|
|
Ok(OpenAiCompatibleProvider::new(
|
|
XAI_PROVIDER_NAME.to_string(),
|
|
api_client,
|
|
model,
|
|
String::new(),
|
|
))
|
|
})
|
|
}
|
|
}
|