use crate::core::{GenericProvider, HttpClient, Protocol};
use crate::protocols::AliyunProtocol;
use crate::error::LlmConnectorError;
use std::collections::HashMap;
pub type AliyunProvider = GenericProvider<AliyunProtocol>;
pub fn aliyun(api_key: &str) -> Result<AliyunProvider, LlmConnectorError> {
aliyun_with_config(api_key, None, None, None)
}
pub fn aliyun_with_config(
api_key: &str,
base_url: Option<&str>,
timeout_secs: Option<u64>,
proxy: Option<&str>,
) -> Result<AliyunProvider, LlmConnectorError> {
let protocol = AliyunProtocol::new(api_key);
let client = HttpClient::with_config(
base_url.unwrap_or("https://dashscope.aliyuncs.com"),
timeout_secs,
proxy,
)?;
let auth_headers: HashMap<String, String> = protocol.auth_headers().into_iter().collect();
let client = client.with_headers(auth_headers);
Ok(GenericProvider::new(protocol, client))
}
pub fn aliyun_international(
api_key: &str,
region: &str,
) -> Result<AliyunProvider, LlmConnectorError> {
let base_url = format!("https://dashscope.{}.aliyuncs.com", region);
aliyun_with_config(api_key, Some(&base_url), None, None)
}
pub fn aliyun_private(
api_key: &str,
endpoint: &str,
) -> Result<AliyunProvider, LlmConnectorError> {
aliyun_with_config(api_key, Some(endpoint), None, None)
}
pub fn aliyun_with_timeout(
api_key: &str,
timeout_secs: u64,
) -> Result<AliyunProvider, LlmConnectorError> {
aliyun_with_config(api_key, None, Some(timeout_secs), None)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_aliyun_provider_creation() {
let provider = aliyun("test-key");
assert!(provider.is_ok());
let provider = provider.unwrap();
assert_eq!(provider.protocol().name(), "aliyun");
assert_eq!(provider.protocol().api_key(), "test-key");
}
#[test]
fn test_aliyun_with_config() {
let provider = aliyun_with_config(
"test-key",
Some("https://custom.dashscope.com"),
Some(60),
None
);
assert!(provider.is_ok());
let provider = provider.unwrap();
assert_eq!(provider.client().base_url(), "https://custom.dashscope.com");
}
#[test]
fn test_aliyun_international() {
let provider = aliyun_international("test-key", "us-west-1");
assert!(provider.is_ok());
let provider = provider.unwrap();
assert_eq!(provider.client().base_url(), "https://dashscope.us-west-1.aliyuncs.com");
}
#[test]
fn test_aliyun_private() {
let provider = aliyun_private("test-key", "https://private.dashscope.com");
assert!(provider.is_ok());
let provider = provider.unwrap();
assert_eq!(provider.client().base_url(), "https://private.dashscope.com");
}
#[test]
fn test_aliyun_with_timeout() {
let provider = aliyun_with_timeout("test-key", 120);
assert!(provider.is_ok());
}
}