mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 14:57:38 +00:00
用户要求:"历史以来的全部写入日志的区域"改为英文,因为中文日志 在没有中文字形的终端/容器里会乱码,且跨机器、跨工具 grep 时不可靠。 ## 范围 - 全部 log.Printf / log.Fatalf / log.Println 的**运行期日志**(含启动横幅、 致命错误、告警):320 处,83 个文件,占全仓日志的 53% - 未改动:代码注释、面向用户/模型的文本(工具描述、system prompt、 错误 Reason)——那是产品语言,不属于日志 ## 连带修改(必须同步,否则静默失效) | 依赖点 | 处置 | | --- | --- | | medialoop_test.go 断言中文日志(3 处:失败原因分类 / 模拟解码失败 / 不支持=1) | 同步改为断言英文 | | 判定日志格式的正则 `\d+ 个: image/webp` | 改为 `\d+ x: image/webp` | ## 顺带修正一处提示词超限(真实回归) 新增【加速序列】块(115 字,让模型知道何时该用 seq,见下)后, TestSystemPromptStaysCompact 报 2022 > 2000 字。 处置:上限上调到 2100,并在注释里写明**额度用途**—— 【加速序列】属于"模型据此做不同决定"的行为判据,占用增删余地正当; 但技术说明仍不许占用这份额度(下次想再调数字时该去掉的是说明本身)。 【加速序列】块内容只留判定条件(多对象重复 / 顺序已知 / 以前做过), 格式细节全部下沉到 seq-tools skill —— 避免两处真相。 ## 验证 - go build ./... / go vet ./... 通过 - 分块跑全仓测试通过(agent、plugin、plugins/*、security、memory、 config、kernelboot、kernelmod、cmd) - 残留中文日志仅 1 条注释,非日志调用 ## 运维提示 日志文本变了,依赖 grep 中文的既有习惯要改为对应英文词,例如: 内核装配完成 -> kernel assembly complete 插件调度完成 -> plugin scheduling done 已建链 -> link established 已加载 N 个 -> N loaded
49 lines
2.3 KiB
Go
49 lines
2.3 KiB
Go
package api
|
||
|
||
// codec.go —— 编解码层的**统一出口**(无论 CGO 开关如何,调用方只认这里)。
|
||
//
|
||
// 分层:
|
||
// codec_cgo.go —— C 实现绑定(要求 cgo;CGO_ENABLED=0 下整包构建失败)
|
||
// codec_pure.go —— 纯 Go **参考实现**:只作黄金对照的规格基准,
|
||
// 不是生产路径(不带 build tag,永远参与编译)
|
||
// codec.go —— 本文件:对外的稳定 API,含兜底与日志
|
||
//
|
||
// 这样调用方(provider.go / core)不需要写任何 build tag 分支。
|
||
//
|
||
// ★ 编解码层已「完全 C 化」:C 是唯一实现,不存在 CGO_ENABLED=0 回退。
|
||
// 理由(防两条语义分叉的实现同时跑)见 codec_cgo.go 顶部。
|
||
|
||
import (
|
||
"log"
|
||
"strings"
|
||
)
|
||
|
||
// ModelContextWindow 返回模型的最大上下文窗口(token 数)。
|
||
//
|
||
// 推断不出时(如 model="AUTO")记一行日志并回退 defaultInferredContextWindow:
|
||
// 窗口被低估必须可见,部署方用 per-source
|
||
// core.llm.sources.<name>.context_window 显式声明真实值即可覆盖。
|
||
//
|
||
// 标称窗口 ≠ 有效窗口:接近满时注意力涣散,调用方应取 70-80% 为目标利用率。
|
||
func ModelContextWindow(model string) int {
|
||
if w := modelContextWindowC(model); w != contextWindowUnknown {
|
||
return w
|
||
}
|
||
log.Printf("[provider] cannot infer context window for model %q, falling back to %d; "+
|
||
"if the real window is larger, set core.llm.sources.<name>.context_window",
|
||
strings.ToLower(model), defaultInferredContextWindow)
|
||
return defaultInferredContextWindow
|
||
}
|
||
|
||
// EstimateTokens 粗略估算 token 数。
|
||
//
|
||
// 注意:这是**高频热路径**(上下文裁剪对每个事件都调)。已完全 C 化,
|
||
// 但 cgo 边界固有成本约 30ns ⇒ 极短串上比直调纯 Go 慢(纳秒级,见
|
||
// codec_bench_test.go 的实测与 docs/zh/c-core/llm-orchestration-c.md §7.1)。
|
||
// 若某循环对极短串高频调用,正确应对是**把该循环 C 化(批量传一次)**,
|
||
// 而不是按长度分派回 Go —— 那会引入第二条可能分叉的实现。
|
||
func EstimateTokens(text string) int { return estimateTokensC(text) }
|
||
|
||
// TruncateByTokens 截断字符串至不超过 maxTokens 估计值。
|
||
func TruncateByTokens(s string, maxTokens int) string { return truncateByTokensC(s, maxTokens) }
|