use crate::providers::trait_::Provider;
use crate::types::chat_api::{ChatRequest, ChatResponse, ChatStreamChunk, Content, MessageRole};
pub struct MiniMaxProvider;
impl Default for MiniMaxProvider {
fn default() -> Self {
Self
}
}
impl MiniMaxProvider {
pub fn new() -> Self {
Self
}
}
impl Provider for MiniMaxProvider {
fn name(&self) -> &'static str {
"minimax"
}
fn chat_completions_path(&self) -> String {
"/chat/completions".to_string()
}
fn transform_request(&self, request: &mut ChatRequest) {
for message in &mut request.messages {
if matches!(message.content, Content::Array(_)) {
let text = message.content.as_text();
message.content = Content::String(text);
}
if message.role == MessageRole::Developer {
message.role = MessageRole::User;
}
}
}
fn transform_response(&self, response: &mut ChatResponse) {
for choice in &mut response.choices {
if matches!(choice.message.content, Content::Array(_)) {
let text = choice.message.content.as_text();
choice.message.content = Content::String(text);
}
}
}
fn transform_stream_chunk(&self, chunk: &mut ChatStreamChunk) {
for choice in &mut chunk.choices {
if let Some(delta) = &mut choice.delta
&& matches!(delta.content, Some(Content::Array(_)))
&& let Some(content) = delta.content.take() {
let text = content.as_text();
if !text.is_empty() {
delta.content = Some(Content::String(text));
}
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::chat_api::{ChatMessage, Content, MessageRole};
#[test]
fn test_minimax_flattens_content() {
let mut request = ChatRequest {
model: "ab-01".to_string(),
messages: vec![ChatMessage {
role: MessageRole::User,
content: Content::Array(vec![crate::types::chat_api::ContentBlock {
block_type: "text".to_string(),
text: Some("Hello".to_string()),
image_url: None,
}]),
name: None,
annotations: None,
tool_calls: None,
tool_call_id: None,
function_call: None,
refusal: None,
}],
tools: None,
tool_choice: None,
stream: Some(false),
temperature: None,
max_tokens: None,
top_p: None,
user: None,
stream_options: None,
frequency_penalty: None,
presence_penalty: None,
logit_bias: None,
logprobs: None,
top_logprobs: None,
n: None,
stop: None,
response_format: None,
reasoning_effort: None,
parallel_tool_calls: None,
seed: None,
service_tier: None,
};
let provider = MiniMaxProvider;
provider.transform_request(&mut request);
let msg = request.messages.first().unwrap();
assert!(matches!(msg.content, Content::String(_)));
assert_eq!(msg.content.as_text(), "Hello");
}
}