use super::canonical_json;
use crate::providers::ProviderConversationItem;
pub(crate) fn conversation_cache_material(
provider: &str,
model: &str,
system_prompt: &str,
conversation_items: &[ProviderConversationItem],
) -> String {
let mut data = String::new();
push_material_field(&mut data, "provider", provider);
push_material_field(&mut data, "model", model);
push_material_field(&mut data, "system_prompt", system_prompt);
for item in conversation_items {
match item {
ProviderConversationItem::Message(message) => {
push_material_field(&mut data, "item", "message");
push_material_field(&mut data, "role", message.role.as_api_str());
push_material_field(&mut data, "content", &message.content);
}
ProviderConversationItem::ResponseItem(value) => {
push_material_field(&mut data, "item", "response_item");
push_material_field(&mut data, "value", &canonical_json(value));
}
ProviderConversationItem::ToolResult(result) => {
push_material_field(&mut data, "item", "tool_result");
push_material_field(&mut data, "call_id", &result.call_id);
push_material_field(&mut data, "tool_name", &result.tool_name);
push_material_field(&mut data, "success", &result.success.to_string());
push_material_field(&mut data, "output", &result.output);
}
ProviderConversationItem::LegacyReplayNote {
event_type,
content,
} => {
push_material_field(&mut data, "item", "legacy_replay_note");
push_material_field(&mut data, "event_type", event_type);
push_material_field(&mut data, "content", content);
}
}
}
data
}
fn push_material_field(data: &mut String, key: &str, value: &str) {
data.push_str(key);
data.push('=');
data.push_str(&value.len().to_string());
data.push(':');
data.push_str(value);
data.push('\n');
}