From 80aec45c0b5d3e2a7e20182af818bdaa898283fa Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Mon, 14 Sep 2026 15:50:48 +0800 Subject: [PATCH] =?UTF-8?q?memory:=20=E6=96=B0=E5=A2=9E=20lang()=20?= =?UTF-8?q?=E6=96=87=E5=AD=97=E7=B1=BB=E5=9E=8B=E5=88=A4=E5=AE=9A=EF=BC=9B?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=8C=89=E6=B6=88=E6=81=AF=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - memory·lang(msg):判消息文字类型(假名 > 谚文 > 汉字 > 拉丁, 都不命中则默认中文) - classify 注释同步:类别名与消息语言相同 - 其余为跟进 kvlang 新规则:kv·* → kvspace·*、/tmp/esc·* → /tmp/esc/*、 map 字面量补显式 langtype(noenv / a) Co-Authored-By: Claude Code --- lib/byteseek/memory.kv | 52 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/lib/byteseek/memory.kv b/lib/byteseek/memory.kv index b657f53..77c046b 100644 --- a/lib/byteseek/memory.kv +++ b/lib/byteseek/memory.kv @@ -2,7 +2,8 @@ // remember(key, value) —— 写一条记忆到 /byteseek/memory/。 // recall(query) —— 记忆检查:扫描 /byteseek/memory/ 子树,自动滤出与 query 相关的关键树路径, // 返回多行 "key = value",供 mainbrain 注入 LLM 上下文。 -// classify(msg) —— 用 LLM 把消息归入一个简短类别。 +// classify(msg) —— 用 LLM 把消息归入一个简短类别;类别名与消息语言相同(lang 判定,默认中文)。 +// lang(msg) —— 判消息文字类型(假名 / 谚文 / 汉字 / 拉丁),默认中文。 // ensure_category(cat) —— 若类别不存在,则在 /byteseek/memory/cat/ 新建。 // 匹配规则:query 与 key 互相包含,或 query 与 value 互相包含(子串匹配,大小写敏感)。 lib byteseek { @@ -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) -> () {