diff --git a/cli/planoai/config_generator.py b/cli/planoai/config_generator.py index 5a3d4f63..d9d76d79 100644 --- a/cli/planoai/config_generator.py +++ b/cli/planoai/config_generator.py @@ -28,6 +28,7 @@ SUPPORTED_PROVIDERS_WITHOUT_BASE_URL = [ "xai", "moonshotai", "zhipu", + "digitalocean", ] SUPPORTED_PROVIDERS = ( diff --git a/cli/uv.lock b/cli/uv.lock index 665ebdb8..e8c85648 100644 --- a/cli/uv.lock +++ b/cli/uv.lock @@ -337,7 +337,7 @@ wheels = [ [[package]] name = "planoai" -version = "0.4.18" +version = "0.4.19" source = { editable = "." } dependencies = [ { name = "click" }, diff --git a/config/envoy.template.yaml b/config/envoy.template.yaml index 5669511d..b2b9fb1f 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: digitalocean + connect_timeout: {{ upstream_connect_timeout | default('5s') }} + type: LOGICAL_DNS + dns_lookup_family: V4_ONLY + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: digitalocean + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: inference.do-ai.run + port_value: 443 + hostname: "inference.do-ai.run" + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext + sni: inference.do-ai.run + 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: xiaomi connect_timeout: {{ upstream_connect_timeout | default('5s') }} type: LOGICAL_DNS diff --git a/crates/hermesllm/src/bin/provider_models.yaml b/crates/hermesllm/src/bin/provider_models.yaml index 53dac7f4..22f69a7d 100644 --- a/crates/hermesllm/src/bin/provider_models.yaml +++ b/crates/hermesllm/src/bin/provider_models.yaml @@ -328,7 +328,53 @@ providers: - xiaomi/mimo-v2-flash - xiaomi/mimo-v2-omni - xiaomi/mimo-v2-pro + digitalocean: + - digitalocean/openai-gpt-4.1 + - digitalocean/openai-gpt-4o + - digitalocean/openai-gpt-4o-mini + - digitalocean/openai-gpt-5 + - digitalocean/openai-gpt-5-mini + - digitalocean/openai-gpt-5-nano + - digitalocean/openai-gpt-5.1-codex-max + - digitalocean/openai-gpt-5.2 + - digitalocean/openai-gpt-5.2-pro + - digitalocean/openai-gpt-5.3-codex + - digitalocean/openai-gpt-5.4 + - digitalocean/openai-gpt-5.4-mini + - digitalocean/openai-gpt-5.4-nano + - digitalocean/openai-gpt-5.4-pro + - digitalocean/openai-gpt-oss-120b + - digitalocean/openai-gpt-oss-20b + - digitalocean/openai-o1 + - digitalocean/openai-o3 + - digitalocean/openai-o3-mini + - digitalocean/anthropic-claude-4.1-opus + - digitalocean/anthropic-claude-4.5-sonnet + - digitalocean/anthropic-claude-4.6-sonnet + - digitalocean/anthropic-claude-haiku-4.5 + - digitalocean/anthropic-claude-opus-4 + - digitalocean/anthropic-claude-opus-4.5 + - digitalocean/anthropic-claude-opus-4.6 + - digitalocean/anthropic-claude-opus-4.7 + - digitalocean/anthropic-claude-sonnet-4 + - digitalocean/alibaba-qwen3-32b + - digitalocean/arcee-trinity-large-thinking + - digitalocean/deepseek-3.2 + - digitalocean/deepseek-r1-distill-llama-70b + - digitalocean/gemma-4-31B-it + - digitalocean/glm-5 + - digitalocean/kimi-k2.5 + - digitalocean/llama3.3-70b-instruct + - digitalocean/minimax-m2.5 + - digitalocean/nvidia-nemotron-3-super-120b + - digitalocean/qwen3-coder-flash + - digitalocean/qwen3.5-397b-a17b + - digitalocean/all-mini-lm-l6-v2 + - digitalocean/gte-large-en-v1.5 + - digitalocean/multi-qa-mpnet-base-dot-v1 + - digitalocean/qwen3-embedding-0.6b + - digitalocean/router:software-engineering metadata: - total_providers: 11 - total_models: 316 - last_updated: 2026-04-03T23:14:46.956158+00:00 + total_providers: 12 + total_models: 361 + last_updated: 2026-04-16T00:00:00.000000+00:00 diff --git a/crates/hermesllm/src/providers/id.rs b/crates/hermesllm/src/providers/id.rs index c410bd78..ee0fcff3 100644 --- a/crates/hermesllm/src/providers/id.rs +++ b/crates/hermesllm/src/providers/id.rs @@ -44,6 +44,7 @@ pub enum ProviderId { Zhipu, Qwen, AmazonBedrock, + DigitalOcean, } impl TryFrom<&str> for ProviderId { @@ -71,6 +72,9 @@ impl TryFrom<&str> for ProviderId { "qwen" => Ok(ProviderId::Qwen), "amazon_bedrock" => Ok(ProviderId::AmazonBedrock), "amazon" => Ok(ProviderId::AmazonBedrock), // alias + "digitalocean" => Ok(ProviderId::DigitalOcean), + "do" => Ok(ProviderId::DigitalOcean), // alias + "do_ai" => Ok(ProviderId::DigitalOcean), // alias _ => Err(format!("Unknown provider: {}", value)), } } @@ -95,6 +99,7 @@ impl ProviderId { ProviderId::Moonshotai => "moonshotai", ProviderId::Zhipu => "z-ai", ProviderId::Qwen => "qwen", + ProviderId::DigitalOcean => "digitalocean", _ => return Vec::new(), }; @@ -148,7 +153,8 @@ impl ProviderId { | ProviderId::Ollama | ProviderId::Moonshotai | ProviderId::Zhipu - | ProviderId::Qwen, + | ProviderId::Qwen + | ProviderId::DigitalOcean, SupportedAPIsFromClient::AnthropicMessagesAPI(_), ) => SupportedUpstreamAPIs::OpenAIChatCompletions(OpenAIApi::ChatCompletions), @@ -167,7 +173,8 @@ impl ProviderId { | ProviderId::Ollama | ProviderId::Moonshotai | ProviderId::Zhipu - | ProviderId::Qwen, + | ProviderId::Qwen + | ProviderId::DigitalOcean, SupportedAPIsFromClient::OpenAIChatCompletions(_), ) => SupportedUpstreamAPIs::OpenAIChatCompletions(OpenAIApi::ChatCompletions), @@ -234,6 +241,7 @@ impl Display for ProviderId { ProviderId::Zhipu => write!(f, "zhipu"), ProviderId::Qwen => write!(f, "qwen"), ProviderId::AmazonBedrock => write!(f, "amazon_bedrock"), + ProviderId::DigitalOcean => write!(f, "digitalocean"), } } }