use handlebars::Handlebars; use serde_json::Value; use crate::error::{AiError, AiResult}; /// Prompt 模板渲染引擎 pub struct PromptRenderer { registry: Handlebars<'static>, } impl PromptRenderer { pub fn new() -> Self { let mut registry = Handlebars::new(); registry.set_strict_mode(true); Self { registry } } /// 渲染 Prompt 模板 — 使用 Handlebars {{variable}} 语法 /// JSON 序列化注入,不做字符串拼接,防止 Prompt 注入 pub fn render(&self, template: &str, data: &Value) -> AiResult { self.registry .render_template(template, data) .map_err(|e| AiError::TemplateError(format!("模板渲染失败: {e}"))) } }