Files
tkmind_go/crates/goose/src/providers/xai.rs
T

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(),
))
})
}
}