Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 48 additions & 4 deletions lib/byteseek/memory.kv
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
// remember(key, value) —— 写一条记忆到 /byteseek/memory/<key>。
// recall(query) —— 记忆检查:扫描 /byteseek/memory/ 子树,自动滤出与 query 相关的关键树路径,
// 返回多行 "key = value",供 mainbrain 注入 LLM 上下文。
// classify(msg) —— 用 LLM 把消息归入一个简短类别。
// classify(msg) —— 用 LLM 把消息归入一个简短类别;类别名与消息语言相同(lang 判定,默认中文)。
// lang(msg) —— 判消息文字类型(假名 / 谚文 / 汉字 / 拉丁),默认中文。
// ensure_category(cat) —— 若类别不存在,则在 /byteseek/memory/cat/<cat> 新建。
// 匹配规则:query 与 key 互相包含,或 query 与 value 互相包含(子串匹配,大小写敏感)。
lib byteseek {
Expand Down Expand Up @@ -45,13 +46,56 @@ lib byteseek {
}
}

// lang(msg) —— 判消息的文字类型:假名 > 谚文 > 汉字 > 拉丁,都不命中则默认中文。
rwfunc lang(msg:[]char/utf32) -> (lg:[]char/utf32) {
han = 0
kana = 0
hangul = 0
latin = 0
string·len(msg) -> n
i = 0
while (i < n) {
string·char(msg, i) -> ch
string·ord(ch) -> c
if (c >= 12352) { if (c <= 12543) { kana = 1 } } // 平/片假名
if (c >= 19968) { if (c <= 40959) { han = 1 } } // 汉字
if (c >= 44032) { if (c <= 55215) { hangul = 1 } } // 谚文
if (c >= 65) { if (c <= 90) { latin = 1 } } // A-Z
if (c >= 97) { if (c <= 122) { latin = 1 } } // a-z
i + 1 -> i
}
"中文" -> lg
if (latin == 1) { "English" -> lg }
if (han == 1) { "中文" -> lg }
if (hangul == 1) { "한국어" -> lg }
if (kana == 1) { "日本語" -> lg }
}

rwfunc fallback_cat(lg:[]char/utf32) -> (cat:[]char/utf32) {
"未分类" -> cat
if (lg == "English") { "uncategorized" -> cat }
if (lg == "日本語") { "未分類" -> cat }
if (lg == "한국어") { "미분류" -> cat }
}

rwfunc classify(msg:[]char/utf32) -> (cat:[]char/utf32) {
"请把下面这条用户消息归入一个简短中文类别(2-6字,如:编程、文件、shell、数学、闲聊)。只输出类别名本身,不要任何空格、换行、标点或解释。\n\n消息:" + msg -> user
llm·raw("你是消息分类器。只输出一个简短中文类别名。", user) -> cat
byteseek/memory·lang(msg) -> lg
"你是消息分类器,只输出一个简短类别名。" -> sys
"把下面这条用户消息归入一个简短类别(2-6 字或 1-3 个词),类别名必须用" + lg + "书写。只输出类别名本身,不要空格、换行、标点或解释。\n\n消息:" + msg -> user
llm·raw(sys, user) -> cat
string·find(cat, "error") -> e
if (e == 0) {
"未分类" -> cat
byteseek/memory·fallback_cat(lg) -> cat
return
}
byteseek/memory·lang(cat) -> got
if (got == lg) { return }
// 语言不符就再要一次,仍不符则用同语言的兜底类别名
"类别名必须用" + lg + "书写,不要用别的语言。只输出类别名本身:\n\n消息:" + msg -> retry
llm·raw(sys, retry) -> cat
byteseek/memory·lang(cat) -> got
if (got == lg) { return }
byteseek/memory·fallback_cat(lg) -> cat
}

rwfunc ensure_category(cat:[]char/utf32) -> () {
Expand Down
Loading