///|
/// 序列化记忆库为 JSON
///
/// 将全部记忆导出为 JSON 数组,可用于持久化存储或跨会话传输。
///
/// # Example
/// ```mbt check
/// test {
/// let gv = @ghostvalley.new_engine()
/// gv.add_memory("测试记忆", is_simulation=false)
/// let json = gv.save_memory()
/// assert_true(json.stringify().contains("测试记忆"))
/// }
/// ```
pub fn GhostValleyEngine::save_memory(self : GhostValleyEngine) -> Json {
let arr : Array[Json] = []
for m in self.memory_bank {
arr.push(@json.to_json(m))
}
Json::array(arr)
}
///|
/// 从 JSON 加载记忆库
///
/// 解析 JSON 数组,替换当前记忆库。
/// 无效数据将被跳过,不中断加载。
pub fn GhostValleyEngine::load_memory(
self : GhostValleyEngine,
data : Json,
) -> Unit {
match data {
Json::Array(items) => {
self.memory_bank.clear()
for item in items {
match item {
Json::Object(obj) => {
let content_opt = match obj.get("content") {
Some(Json::String(s)) => Some(s)
_ => None
}
let score_opt = match obj.get("value_score") {
Some(Json::Number(n, ..)) => Some(n)
_ => None
}
let sim_opt = match obj.get("is_simulation") {
Some(Json::True) => Some(true)
Some(Json::False) => Some(false)
_ => None
}
let core_opt = match obj.get("is_core_memory") {
Some(Json::True) => Some(true)
Some(Json::False) => Some(false)
_ => None
}
match (content_opt, score_opt, sim_opt, core_opt) {
(Some(c), Some(s), Some(sim), Some(core)) =>
self.memory_bank.push(AiMemory::{
content: c,
value_score: s,
is_simulation: sim,
is_core_memory: core,
})
_ => ()
}
}
_ => ()
}
}
}
_ => ()
}
}
///|
/// 序列化记忆库为 JSON 字符串
///
/// 便捷方法,等价于 `save_memory().stringify()`。
pub fn GhostValleyEngine::save_memory_string(
self : GhostValleyEngine,
) -> String {
self.save_memory().stringify()
}
///|
/// 从 JSON 字符串加载记忆库
///
/// 便捷方法,解析 JSON 字符串后调用 `load_memory`。
/// 解析失败时不做任何操作。
pub fn GhostValleyEngine::load_memory_string(
self : GhostValleyEngine,
json_str : String,
) -> Unit {
try {
let data = @json.parse(json_str)
self.load_memory(data)
} catch {
_ => ()
}
}