2024-09-12 13:44:06 +03:00
|
|
|
use async_openai::types::{
|
2026-01-23 22:05:53 +01:00
|
|
|
responses::{
|
|
|
|
|
EasyInputContent, EasyInputMessage, ImageDetail, InputContent, InputImageContent,
|
|
|
|
|
InputItem, InputParam, MessageType, Role,
|
2025-11-30 10:31:06 +02:00
|
|
|
},
|
2024-09-12 13:44:06 +03:00
|
|
|
};
|
|
|
|
|
|
2025-05-10 11:47:50 +03:00
|
|
|
use crate::conversation::llm::{
|
|
|
|
|
Author as LLMAuthor, Message as LLMMessage, MessageContent as LLMMessageContent,
|
|
|
|
|
};
|
2025-05-10 09:18:01 +03:00
|
|
|
use crate::utils::base64::base64_encode;
|
2024-09-12 13:44:06 +03:00
|
|
|
|
2026-01-23 22:05:53 +01:00
|
|
|
pub fn convert_llm_messages_to_openai_response_input(
|
2024-09-12 13:44:06 +03:00
|
|
|
conversation_messages: Vec<LLMMessage>,
|
2026-01-23 22:05:53 +01:00
|
|
|
) -> InputParam {
|
|
|
|
|
let mut items = Vec::with_capacity(conversation_messages.len());
|
2024-09-12 13:44:06 +03:00
|
|
|
|
|
|
|
|
for message in conversation_messages {
|
2026-01-23 22:05:53 +01:00
|
|
|
let role = match message.author {
|
|
|
|
|
LLMAuthor::Prompt => Role::System,
|
|
|
|
|
LLMAuthor::Assistant => Role::Assistant,
|
|
|
|
|
LLMAuthor::User => Role::User,
|
|
|
|
|
};
|
2025-05-10 09:18:01 +03:00
|
|
|
|
2026-01-23 22:05:53 +01:00
|
|
|
let content = match message.content {
|
|
|
|
|
LLMMessageContent::Text(text) => EasyInputContent::Text(text),
|
|
|
|
|
LLMMessageContent::Image(image_details) => {
|
|
|
|
|
let image_url = format!(
|
|
|
|
|
"data:{};base64,{}",
|
|
|
|
|
image_details.mime,
|
|
|
|
|
base64_encode(&image_details.data)
|
|
|
|
|
);
|
2025-05-10 09:18:01 +03:00
|
|
|
|
2026-01-23 22:05:53 +01:00
|
|
|
EasyInputContent::ContentList(vec![InputContent::InputImage(InputImageContent {
|
|
|
|
|
image_url: Some(image_url),
|
|
|
|
|
detail: ImageDetail::Auto,
|
|
|
|
|
file_id: None,
|
|
|
|
|
})])
|
2025-05-10 09:18:01 +03:00
|
|
|
}
|
2026-01-23 22:05:53 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
items.push(InputItem::EasyMessage(EasyInputMessage {
|
|
|
|
|
r#type: MessageType::Message,
|
|
|
|
|
role,
|
|
|
|
|
content,
|
|
|
|
|
}));
|
2024-09-12 13:44:06 +03:00
|
|
|
}
|
2026-01-23 22:05:53 +01:00
|
|
|
|
|
|
|
|
InputParam::Items(items)
|
2024-09-12 13:44:06 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub(super) fn convert_string_to_enum<T>(value: &str) -> Result<T, String>
|
|
|
|
|
where
|
|
|
|
|
T: serde::de::DeserializeOwned,
|
|
|
|
|
{
|
|
|
|
|
// This is a hacky way to construct an enum from the string we have.
|
|
|
|
|
let enum_result: serde_json::Result<T> = serde_json::from_str(&format!("\"{}\"", value));
|
|
|
|
|
match enum_result {
|
|
|
|
|
Ok(enum_result) => Ok(enum_result),
|
|
|
|
|
Err(err) => {
|
|
|
|
|
tracing::debug!(?err, "Failed to parse into enum");
|
|
|
|
|
|
|
|
|
|
Err(format!("The value ({}) is not supported.", value))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|