use otherone_ai::types::Message;
pub fn messages_to_sequence(messages: &[Message]) -> String {
let mut sequences: Vec<String> = Vec::new();
for message in messages {
let content = match &message.content {
otherone_ai::types::MessageContent::Text(text) => text.clone(),
_ => "[非文本内容]".to_string(),
};
match message.role.as_str() {
"user" => {
sequences.push(format!("[User]: {}", content));
}
"assistant" => {
let mut entry = format!("[Assistant]: {}", content);
if let Some(ref tool_calls) = message.tool_calls {
if !tool_calls.is_empty() {
let tool_calls_info: Vec<String> = tool_calls
.iter()
.map(|tc| {
format!(" - {}({})", tc.function.name, tc.function.arguments)
})
.collect();
entry.push_str(&format!("\n[Tool Calls]:\n{}", tool_calls_info.join("\n")));
}
}
sequences.push(entry);
}
"tool" => {
let tool_name = message.name.as_deref().unwrap_or("unknown_tool");
sequences.push(format!("[Tool Result - {}]: {}", tool_name, content));
}
"system" => {
sequences.push(format!("[System]: {}", content));
}
"developer" => {
sequences.push(format!("[Developer]: {}", content));
}
other => {
sequences.push(format!("[{}]: {}", other, content));
}
}
}
sequences.join("\n\n")
}
#[cfg(test)]
mod tests {
use super::*;
use otherone_ai::types::{FunctionCall, MessageContent, ToolCall};
#[test]
fn test_messages_to_sequence_empty() {
let result = messages_to_sequence(&[]);
assert!(result.is_empty());
}
#[test]
fn test_messages_to_sequence_user() {
let messages = vec![Message {
role: "user".to_string(),
content: MessageContent::Text("Hello".to_string()),
name: None,
tool_calls: None,
tool_call_id: None,
}];
let result = messages_to_sequence(&messages);
assert_eq!(result, "[User]: Hello");
}
#[test]
fn test_messages_to_sequence_assistant() {
let messages = vec![Message {
role: "assistant".to_string(),
content: MessageContent::Text("Hi there!".to_string()),
name: None,
tool_calls: None,
tool_call_id: None,
}];
let result = messages_to_sequence(&messages);
assert_eq!(result, "[Assistant]: Hi there!");
}
#[test]
fn test_messages_to_sequence_with_tool_calls() {
let messages = vec![Message {
role: "assistant".to_string(),
content: MessageContent::Text("Let me check.".to_string()),
name: None,
tool_calls: Some(vec![ToolCall {
index: None,
id: "call_1".to_string(),
call_type: "function".to_string(),
function: FunctionCall {
name: "get_weather".to_string(),
arguments: r#"{"city":"Beijing"}"#.to_string(),
},
}]),
tool_call_id: None,
}];
let result = messages_to_sequence(&messages);
assert!(result.contains("[Assistant]:"));
assert!(result.contains("[Tool Calls]:"));
assert!(result.contains("get_weather"));
}
#[test]
fn test_messages_to_sequence_multiple() {
let messages = vec![
Message {
role: "user".to_string(),
content: MessageContent::Text("Hello".to_string()),
name: None,
tool_calls: None,
tool_call_id: None,
},
Message {
role: "assistant".to_string(),
content: MessageContent::Text("Hi!".to_string()),
name: None,
tool_calls: None,
tool_call_id: None,
},
];
let result = messages_to_sequence(&messages);
assert!(result.contains("\n\n"));
}
}