use crate::content::ContentPart;
use crate::message::Role;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use ts_rs::TS;
#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct LanguageModelPromptMessage {
pub role: Role,
pub content: Vec<ContentPart>,
pub provider_options: Option<Value>,
}
pub type LanguageModelPrompt = Vec<LanguageModelPromptMessage>;
pub fn convert_to_language_model_prompt(
messages: &[crate::message::ModelMessage],
instructions: Option<&str>,
) -> LanguageModelPrompt {
let mut result = Vec::new();
if let Some(instructions) = instructions {
result.push(LanguageModelPromptMessage {
role: Role::System,
content: vec![ContentPart::text(instructions)],
provider_options: None,
});
}
for msg in messages {
let parts = match &msg.content {
crate::message::MessageContent::Text(text) => vec![ContentPart::text(text)],
crate::message::MessageContent::Parts(parts) => parts.clone(),
};
result.push(LanguageModelPromptMessage {
role: msg.role,
content: parts,
provider_options: None,
});
}
result
}