rig_core/providers/
minimax.rs1pub const GLOBAL_API_BASE_URL: &str = "https://api.minimax.io/v1";
23pub const CHINA_API_BASE_URL: &str = "https://api.minimax.cn/v1";
25pub const GLOBAL_ANTHROPIC_API_BASE_URL: &str = "https://api.minimax.io/anthropic";
27pub const CHINA_ANTHROPIC_API_BASE_URL: &str = "https://api.minimax.cn/anthropic";
29
30pub const MINIMAX_M3: &str = "MiniMax-M3";
32pub const MINIMAX_M2_7: &str = "MiniMax-M2.7";
34pub const MINIMAX_M2_7_HIGHSPEED: &str = "MiniMax-M2.7-highspeed";
36pub const MINIMAX_M2_5: &str = "MiniMax-M2.5";
38pub const MINIMAX_M2_5_HIGHSPEED: &str = "MiniMax-M2.5-highspeed";
40
41#[derive(Clone, Copy, PartialEq, Eq)]
43pub(crate) enum Family {
44 M31Flash,
45 M3,
46 Other,
47}
48
49pub(crate) fn family(model: &str) -> Family {
51 let model = model.to_ascii_lowercase();
52 match model.as_str() {
53 id if id.starts_with("minimax-m3.1") => Family::M31Flash,
54 id if id.starts_with("minimax-m3") => Family::M3,
55 _ => Family::Other,
56 }
57}
58
59pub(crate) fn reads_images(model: &str) -> bool {
64 !model.to_ascii_lowercase().starts_with("minimax-m2")
65}
66
67#[cfg(feature = "audio")]
68pub mod audio_generation;
69pub mod extension;
70#[cfg(feature = "image")]
71pub mod image_generation;
72#[cfg(feature = "audio")]
73pub mod voice_clone;
74
75#[cfg(feature = "audio")]
76pub use audio_generation::*;
77#[cfg(feature = "image")]
78pub use image_generation::*;
79#[cfg(feature = "audio")]
80pub use voice_clone::voice_cloning;
81
82pub const PROVIDER_NAME: &str = "minimax";
85
86crate::client::macros::openai_vendor!(crate::providers::openai::wire::MINIMAX, "MiniMax");
87crate::client::macros::anthropic_vendor!(
88 crate::providers::anthropic::wire::MINIMAX,
89 "MiniMax",
90 anthropic_from_env,
91 anthropic_new
92);
93
94#[cfg(any(feature = "image", feature = "audio"))]
98pub(crate) fn decode_reply<T: serde::de::DeserializeOwned>(
99 body: &[u8],
100) -> Result<T, crate::error::ProviderError> {
101 #[derive(serde::Deserialize)]
102 struct Status {
103 #[serde(default)]
104 base_resp: Option<BaseResp>,
105 }
106 #[derive(serde::Deserialize)]
107 struct BaseResp {
108 #[serde(default)]
109 status_code: i64,
110 }
111
112 let status: Status = serde_json::from_slice(body)?;
113 if status
114 .base_resp
115 .is_some_and(|status| status.status_code != 0)
116 {
117 return Err(crate::error::ProviderError::from_provider_body(
118 String::from_utf8_lossy(body),
119 ));
120 }
121 Ok(serde_json::from_slice(body)?)
122}
123
124#[cfg(all(test, any(feature = "image", feature = "audio")))]
125mod tests;