docs(comments): 注释中文化 · internal/runtime/model + internal/services/backthink(54 文件,纯替换)
- 只翻注释/文档字符串:`go/scanner` 剥注释后按 token 序列+literal 逐 token 比对,**54/54 文件 SAME**;
改动文件总行数与 HEAD 漂移 = 0(严格 1:1,无合并/拆行)
- 裁决编号与 design 节号逐字保留(03.4.1/03.4.2/03.4.3/14.4.1/14.4.5/07.4.2-4、design/04 §3.1/§3.2 等);
`chat_template_kwargs` / `enable_thinking` / `reasoning_effort` / `thinking:{type}` 字段名与形状说明未动
- 存疑译法(已登记):`persona` 在叙事语境用「角色」、标识符语境保留 `persona`(仓库既有模块本身混用);
`rung`→「级」;`provider` 存在「提供商/提供者」两种落笔(可按需一键统一)
- 复核:build/vet 绿 + 两包测试绿;gofmt 干净;残留英文注释 0 条
- 既有存量(未修,只报告):`model/anthropic_test.go` 612 行 >500;`applyAnthropicEvent` 115 行 >80
This commit is contained in:
1 parent
f5cf117482
commit
3dc1232bc2
54 files changed
+1923
-1923
No files matched your search
@@ -9,83 +9,83 @@ import (
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/config"
|
||||
)
|
||||
|
||||
// Defaults applied by normalize when a Config field is left at its zero value.
|
||||
// They are compile-time constants so no magic number appears in the run path.
|
||||
// normalize 在 Config 字段留为零值时套用的默认值。
|
||||
// 它们是编译期常量,因此运行路径里不出现魔法数字。
|
||||
const (
|
||||
// defaultIntervalSec is the heartbeat period in seconds when unused
|
||||
// (15 minutes: the autonomous reflection is deliberately low-frequency).
|
||||
// defaultIntervalSec 是未使用时的心跳周期秒数
|
||||
// (15 分钟:自主反思刻意保持低频)。
|
||||
defaultIntervalSec = 900
|
||||
// defaultQuietStartHour and defaultQuietEndHour bound the do-not-disturb
|
||||
// window in local clock hours (00:00-07:00 vs 23:00-07:00: the window may
|
||||
// wrap midnight; two equal non-zero hours disable it).
|
||||
// defaultQuietStartHour 与 defaultQuietEndHour 以本地钟点约束免打扰
|
||||
// 窗口(00:00-07:00 对 23:00-07:00:窗口可以
|
||||
// 跨午夜;两个相等的非零钟点会禁用该窗口)。
|
||||
defaultQuietStartHour = 23
|
||||
defaultQuietEndHour = 7
|
||||
// defaultPushLimit caps proactive pushes within defaultPushWindow to honor
|
||||
// the anti-spam rule of design/11 §6 (QQ wind control, iLink window). The
|
||||
// default drops to 1 so the owner is interrupted at most once per hour.
|
||||
// defaultPushLimit 限制 defaultPushWindow 内的主动推送次数,以遵守
|
||||
// design/11 §6 的反骚扰规则(QQ 风控、iLink 窗口)。
|
||||
// 默认降到 1,因此主人每小时最多被打扰一次。
|
||||
defaultPushLimit = 1
|
||||
defaultPushWindow = 60 * time.Minute
|
||||
// defaultPushCooldown is the quiet gap after a successful proactive push,
|
||||
// so a successful delivery is not immediately repeated.
|
||||
// defaultPushCooldown 是一次成功主动推送之后的安静间隔,
|
||||
// 以免一次成功投递被立即重复。
|
||||
defaultPushCooldown = 30 * time.Minute
|
||||
// defaultRecentChatCooldown is the gap after the owner's last message within
|
||||
// which an autonomous push is held, so a fresh conversation is not interrupted.
|
||||
// defaultRecentChatCooldown 是主人最后一条消息之后的间隔,
|
||||
// 在此期间自主推送被扣住,以免打断刚开始的对话。
|
||||
defaultRecentChatCooldown = 10 * time.Minute
|
||||
// defaultKindWindow bounds how often any single push flavor (问候/提醒/分享/
|
||||
// 关心) may repeat, so the same style cannot spam within it.
|
||||
// defaultKindWindow 限制任何一种推送风格(问候/提醒/分享/
|
||||
// 关心)的重复频率,使同一风格无法在窗口内刷屏。
|
||||
defaultKindWindow = 2 * time.Hour
|
||||
// defaultThinkTimeout bounds a single unattended thought so it can never
|
||||
// wedge a worker goroutine.
|
||||
// defaultThinkTimeout 约束单次无人值守思考,因此它绝不会
|
||||
// 卡住 worker goroutine。
|
||||
defaultThinkTimeout = 30 * time.Second
|
||||
// defaultSessionID scopes a think when the caller supplies none. It is the
|
||||
// loop.Run durability key, deliberately distinct from history.MainSessionID so
|
||||
// an autonomous think never collides with the live main session's checkpoint
|
||||
// store (channelbridge saves/resumes under the main id). The think still sees
|
||||
// the main conversation: LoopThinker reads history.MainSessionID for context and
|
||||
// runs under loop.OwnerEnv (design/20 §2).
|
||||
// defaultSessionID 在调用方未提供时限定一次思考的作用域。它是
|
||||
// loop.Run 的持久化键,刻意与 history.MainSessionID 不同,
|
||||
// 这样自主思考绝不会与活跃主会话的检查点
|
||||
// 存储冲突(channelbridge 在主 id 下保存/恢复)。该次思考仍能看到
|
||||
// 主对话:LoopThinker 读 history.MainSessionID 取上下文,
|
||||
// 并在 loop.OwnerEnv 下运行(design/20 §2)。
|
||||
defaultSessionID = "sess-backthink"
|
||||
)
|
||||
|
||||
// DefaultSessionID is the exported loop.Run session key for an autonomous think. It is
|
||||
// exposed so the flow-viz publisher (cmd/cyrene) can also publish the backthink flow
|
||||
// graph, which the backthink page and the web-chat flow page both render.
|
||||
// DefaultSessionID 是自主思考所用的、对外暴露的 loop.Run 会话键。它
|
||||
// 之所以暴露,是为了让流程可视化发布器(cmd/cyrene)也能发布 backthink
|
||||
// 流程图,供 backthink 页与 Web 聊天流程页共同渲染。
|
||||
const DefaultSessionID = "sess-backthink"
|
||||
|
||||
// Config carries the autonomous-think tuning knobs. Zero values pick safe
|
||||
// defaults via normalize, so a partially filled Config is still usable.
|
||||
// Config 携带自主思考的调优旋钮。零值会经 normalize
|
||||
// 选取安全默认值,因此半填的 Config 仍可用。
|
||||
type Config struct {
|
||||
// Interval is the heartbeat period. When zero it is derived from
|
||||
// IntervalSec (or its default).
|
||||
// Interval 是心跳周期。为零时由
|
||||
// IntervalSec(或其默认值)推导。
|
||||
Interval time.Duration
|
||||
// IntervalSec is the heartbeat period in seconds, mapped from
|
||||
// config.BackgroundConfig.IntervalSec. Ignored when Interval is set.
|
||||
// IntervalSec 是心跳周期秒数,映射自
|
||||
// config.BackgroundConfig.IntervalSec。设置了 Interval 时忽略。
|
||||
IntervalSec int
|
||||
// QuietStartHour and QuietEndHour bound the do-not-disturb window in local
|
||||
// clock hours. Equal non-zero hours disable the window.
|
||||
// QuietStartHour 与 QuietEndHour 以本地钟点约束免打扰窗口。
|
||||
// 两个相等的非零钟点会禁用该窗口。
|
||||
QuietStartHour int
|
||||
QuietEndHour int
|
||||
// PushLimit bounds proactive pushes within PushWindow. Zero uses the default.
|
||||
// Non-positive PushWindow or PushLimit disables the limit.
|
||||
// PushLimit 限制 PushWindow 内的主动推送次数。为零用默认值。
|
||||
// 非正的 PushWindow 或 PushLimit 会禁用该限制。
|
||||
PushLimit int
|
||||
// PushWindow is the sliding window over which PushLimit is enforced.
|
||||
// PushWindow 是执行 PushLimit 的滑动窗口。
|
||||
PushWindow time.Duration
|
||||
// PushCooldown is the quiet gap after a successful proactive push before
|
||||
// another is allowed. Zero uses the default.
|
||||
// PushCooldown 是一次成功主动推送之后、允许下一次之前的
|
||||
// 安静间隔。为零用默认值。
|
||||
PushCooldown time.Duration
|
||||
// RecentChatCooldown is the gap after the owner's last message within which an
|
||||
// autonomous push is held. Zero uses the default.
|
||||
// RecentChatCooldown 是主人最后一条消息之后的间隔,在此期间
|
||||
// 自主推送被扣住。为零用默认值。
|
||||
RecentChatCooldown time.Duration
|
||||
// KindWindow bounds how often any single push flavor may repeat. Zero uses the
|
||||
// default.
|
||||
// KindWindow 限制任何一种推送风格可重复的频率。为零用
|
||||
// 默认值。
|
||||
KindWindow time.Duration
|
||||
// ThinkTimeout bounds a single thinking pass. Zero uses the default.
|
||||
// ThinkTimeout 约束单轮思考。为零用默认值。
|
||||
ThinkTimeout time.Duration
|
||||
}
|
||||
|
||||
// ConfigFromBackground maps a config.BackgroundConfig (the source of the heartbeat
|
||||
// interval, the shared quiet-hours window and the proactive-push frequency knobs)
|
||||
// into a backthink.Config, leaving anything the env does not expose at its
|
||||
// defaults for normalize to fill in.
|
||||
// ConfigFromBackground 把 config.BackgroundConfig(心跳周期、
|
||||
// 共享安静时段窗口与主动推送频次旋钮的来源)
|
||||
// 映射成 backthink.Config,env 未暴露的项保持其
|
||||
// 默认值,交给 normalize 填。
|
||||
func ConfigFromBackground(bg config.BackgroundConfig) Config {
|
||||
return Config{
|
||||
IntervalSec: bg.IntervalSec,
|
||||
@@ -99,7 +99,7 @@ func ConfigFromBackground(bg config.BackgroundConfig) Config {
|
||||
}
|
||||
}
|
||||
|
||||
// normalize fills a Config's zero fields with safe defaults.
|
||||
// normalize 用安全默认值填充 Config 的零值字段。
|
||||
func normalize(cfg Config) Config {
|
||||
if cfg.IntervalSec <= 0 {
|
||||
cfg.IntervalSec = defaultIntervalSec
|
||||
@@ -132,13 +132,13 @@ func normalize(cfg Config) Config {
|
||||
return cfg
|
||||
}
|
||||
|
||||
// quietHoursLabel renders the do-not-disturb window for logs.
|
||||
// quietHoursLabel 为日志渲染免打扰窗口。
|
||||
func quietHoursLabel(start, end int) string {
|
||||
return fmt.Sprintf("%02d:00-%02d:00", start, end)
|
||||
}
|
||||
|
||||
// baseLog returns l when non-nil, otherwise a discard logger, so New always has a
|
||||
// safe logger to tag.
|
||||
// baseLog 在 l 非 nil 时返回 l,否则返回丢弃式日志器,好让 New 总是有
|
||||
// 一个可标记的安全日志器。
|
||||
func baseLog(l *slog.Logger) *slog.Logger {
|
||||
if l != nil {
|
||||
return l
|
||||
|
||||
Reference in new issue
Block a user