diff --git a/cli/planoai/config_generator.py b/cli/planoai/config_generator.py index 929b7657..3ffebe09 100644 --- a/cli/planoai/config_generator.py +++ b/cli/planoai/config_generator.py @@ -21,6 +21,7 @@ SUPPORTED_PROVIDERS_WITHOUT_BASE_URL = [ "groq", "mistral", "openai", + "xiaomi", "gemini", "anthropic", "together_ai", diff --git a/config/envoy.template.yaml b/config/envoy.template.yaml index c2dd5ed0..5669511d 100644 --- a/config/envoy.template.yaml +++ b/config/envoy.template.yaml @@ -901,6 +901,33 @@ static_resources: validation_context: trusted_ca: filename: {{ upstream_tls_ca_path | default('/etc/ssl/certs/ca-certificates.crt') }} + - name: xiaomi + connect_timeout: {{ upstream_connect_timeout | default('5s') }} + type: LOGICAL_DNS + dns_lookup_family: V4_ONLY + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: xiaomi + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: api.xiaomimimo.com + port_value: 443 + hostname: "api.xiaomimimo.com" + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext + sni: api.xiaomimimo.com + common_tls_context: + tls_params: + tls_minimum_protocol_version: TLSv1_2 + tls_maximum_protocol_version: TLSv1_3 + validation_context: + trusted_ca: + filename: {{ upstream_tls_ca_path | default('/etc/ssl/certs/ca-certificates.crt') }} - name: mistral_7b_instruct connect_timeout: 0.5s type: STRICT_DNS diff --git a/config/plano_config_schema.yaml b/config/plano_config_schema.yaml index a2c34c91..0bdca9e4 100644 --- a/config/plano_config_schema.yaml +++ b/config/plano_config_schema.yaml @@ -188,6 +188,7 @@ properties: - groq - mistral - openai + - xiaomi - gemini routing_preferences: type: array @@ -235,6 +236,7 @@ properties: - groq - mistral - openai + - xiaomi - gemini routing_preferences: type: array diff --git a/crates/common/src/configuration.rs b/crates/common/src/configuration.rs index ac95185b..7aa23c67 100644 --- a/crates/common/src/configuration.rs +++ b/crates/common/src/configuration.rs @@ -339,6 +339,8 @@ pub enum LlmProviderType { Mistral, #[serde(rename = "openai")] OpenAI, + #[serde(rename = "xiaomi")] + Xiaomi, #[serde(rename = "gemini")] Gemini, #[serde(rename = "xai")] @@ -370,6 +372,7 @@ impl Display for LlmProviderType { LlmProviderType::Gemini => write!(f, "gemini"), LlmProviderType::Mistral => write!(f, "mistral"), LlmProviderType::OpenAI => write!(f, "openai"), + LlmProviderType::Xiaomi => write!(f, "xiaomi"), LlmProviderType::XAI => write!(f, "xai"), LlmProviderType::TogetherAI => write!(f, "together_ai"), LlmProviderType::AzureOpenAI => write!(f, "azure_openai"), diff --git a/crates/hermesllm/src/bin/fetch_models.rs b/crates/hermesllm/src/bin/fetch_models.rs index 0f473d4c..575fe38d 100644 --- a/crates/hermesllm/src/bin/fetch_models.rs +++ b/crates/hermesllm/src/bin/fetch_models.rs @@ -316,6 +316,12 @@ fn fetch_all_models() -> Result> { "https://open.bigmodel.cn/api/paas/v4/models", "z-ai", ), + ( + "xiaomi", + "MIMO_API_KEY", + "https://api.xiaomimimo.com/v1/models", + "xiaomi", + ), ]; // Fetch from OpenAI-compatible providers diff --git a/crates/hermesllm/src/providers/id.rs b/crates/hermesllm/src/providers/id.rs index 9f5f42c9..c410bd78 100644 --- a/crates/hermesllm/src/providers/id.rs +++ b/crates/hermesllm/src/providers/id.rs @@ -28,6 +28,7 @@ fn load_provider_models() -> &'static HashMap> { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ProviderId { OpenAI, + Xiaomi, Mistral, Deepseek, Groq, @@ -51,6 +52,7 @@ impl TryFrom<&str> for ProviderId { fn try_from(value: &str) -> Result { match value.to_lowercase().as_str() { "openai" => Ok(ProviderId::OpenAI), + "xiaomi" => Ok(ProviderId::Xiaomi), "mistral" => Ok(ProviderId::Mistral), "deepseek" => Ok(ProviderId::Deepseek), "groq" => Ok(ProviderId::Groq), @@ -84,6 +86,7 @@ impl ProviderId { ProviderId::TogetherAI => "together", ProviderId::Gemini => "google", ProviderId::OpenAI => "openai", + ProviderId::Xiaomi => "xiaomi", ProviderId::Anthropic => "anthropic", ProviderId::Mistral => "mistralai", ProviderId::Deepseek => "deepseek", @@ -132,6 +135,7 @@ impl ProviderId { // OpenAI-compatible providers only support OpenAI chat completions ( ProviderId::OpenAI + | ProviderId::Xiaomi | ProviderId::Groq | ProviderId::Mistral | ProviderId::Deepseek @@ -150,6 +154,7 @@ impl ProviderId { ( ProviderId::OpenAI + | ProviderId::Xiaomi | ProviderId::Groq | ProviderId::Mistral | ProviderId::Deepseek @@ -213,6 +218,7 @@ impl Display for ProviderId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { ProviderId::OpenAI => write!(f, "OpenAI"), + ProviderId::Xiaomi => write!(f, "xiaomi"), ProviderId::Mistral => write!(f, "Mistral"), ProviderId::Deepseek => write!(f, "Deepseek"), ProviderId::Groq => write!(f, "Groq"),