Merge branch 'feat/noa-experimental':noa 实验性上下文压缩

This commit is contained in:
Autumn-27 committed 2026-09-15 12:09:24 -04:00
commit 95bcd4ef9c
13 files changed
+181 -6

No files matched your search

+17
View File
@@ -428,6 +428,7 @@ func (s *Server) buildPlannerWorker(pinID *int64, gProv llm.Provider, gCfg agent
wk.SetConstraintInject(s.constraintInjectWorker) // 操作约束注入 worker(可配置,默认开;每轮读)
wk.SetNonStreaming(nonStreamingResolver(wCfg)) // 该 profile 选非流式时走 Provider.Complete
wk.SetMaxTokens(maxTokensResolver(wCfg)) // 单次回复输出上限(0 = 不发)
wk.SetNoaEnabled(s.m.NoaCompactionEnabled) // 实验功能:noa 上下文压缩(每 run 读)
pProv, pCfg := s.providerForAgent("planner", pinID, gProv, gCfg)
pl := agent.NewPlanner(pProv, pCfg.Model, s.m.dir, tx, pCfg.CompactionWindow(), s.agentMaxTurns("planner"))
pl.SetFindingRecorder(s.evidenceStore())
@@ -438,6 +439,7 @@ func (s *Server) buildPlannerWorker(pinID *int64, gProv llm.Provider, gCfg agent
pl.SetConstraintInject(s.constraintInjectPlanner) // 操作约束注入 planner(可配置,默认开;每轮读)
pl.SetNonStreaming(nonStreamingResolver(pCfg)) // 该 profile 选非流式时走 Provider.Complete
pl.SetMaxTokens(maxTokensResolver(pCfg)) // 单次回复输出上限(0 = 不发)
pl.SetNoaEnabled(s.m.NoaCompactionEnabled) // 实验功能:noa 上下文压缩(每 run 读)
// cold-digest §7: background cold-node compaction, on the planner's provider/
// model (§4 uses the running agent's model). Uses Complete (non-streaming) for
// the one-shot body summarization.
@@ -509,6 +511,7 @@ func (s *Server) applyLLM(cfg agent.Config) error {
s.mainAgent.SetSteerWork(s.engine.SteerWork) // steer_work:人对运行中 work 实时纠偏
s.mainAgent.SetNonStreaming(nonStreamingResolver(mCfg))
s.mainAgent.SetMaxTokens(maxTokensResolver(mCfg))
s.mainAgent.SetNoaEnabled(s.m.NoaCompactionEnabled) // 实验功能:noa 上下文压缩(每 run 读)
// chat agent serves MANY custom agents by key → it holds the GLOBAL opts
// (backend/key) and gates Enabled per-conversation-agent at Chat time. 对话始终用激活配置。
s.chatAgent = agent.NewChatAgent(prov, cfg.Model, s.m.dir, tx, win) // chat page runner
@@ -517,6 +520,7 @@ func (s *Server) applyLLM(cfg agent.Config) error {
s.chatAgent.SetGuard(s.chatGuard())
s.chatAgent.SetNonStreaming(nonStreamingResolver(cfg))
s.chatAgent.SetMaxTokens(maxTokensResolver(cfg))
s.chatAgent.SetNoaEnabled(s.m.NoaCompactionEnabled) // 实验功能:noa 上下文压缩(每 run 读)
s.llmProv = prov
s.llmCfg = cfg
s.llmOn = true
@@ -700,6 +704,7 @@ func (s *Server) chatAgentForProfile(id int64) *agent.ChatAgent {
ca.SetGuard(s.chatGuard())
ca.SetNonStreaming(nonStreamingResolver(cfg))
ca.SetMaxTokens(maxTokensResolver(cfg))
ca.SetNoaEnabled(s.m.NoaCompactionEnabled) // 实验功能:noa 上下文压缩(每 run 读)
s.profMu.Lock()
if ex := s.profChatAgents[id]; ex != nil { // lost the race → keep the winner
ca = ex
@@ -3212,6 +3217,9 @@ func (s *Server) settingsPayload() map[string]any {
// 操作约束注入范围(默认都开):把本任务的 allow/deny 约束拼进对应 agent 的系统提示。
"constraints_inject_planner": s.constraintInjectPlanner(),
"constraints_inject_worker": s.constraintInjectWorker(),
// 实验功能:noa 模型驱动上下文压缩(默认关)。开启后平台接入的四类 agent 由 noa
// 接管上下文压缩,取代内置 compaction;每 run 读一次,对之后启动的 run 生效。
"noa_compaction": s.m.NoaCompactionEnabled(),
}
}
@@ -3257,6 +3265,8 @@ func (s *Server) putSettings(w http.ResponseWriter, r *http.Request) {
// 操作约束注入范围开关(默认都开);即时生效(planner/worker 每轮读),无需重建 agent。
ConstraintsInjectPlanner *bool `json:"constraints_inject_planner"`
ConstraintsInjectWorker *bool `json:"constraints_inject_worker"`
// 实验功能:noa 上下文压缩开关(默认关);每 run 读,对之后启动的 run 生效,无需重建 agent。
NoaCompaction *bool `json:"noa_compaction"`
}
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
writeErr(w, 400, err.Error())
@@ -3274,6 +3284,13 @@ func (s *Server) putSettings(w http.ResponseWriter, r *http.Request) {
return
}
}
if req.NoaCompaction != nil {
// 每 run 读的解析器,切换即时对之后启动的 run 生效,无需 applyLLM 重建。
if err := s.m.SetNoaCompaction(*req.NoaCompaction); err != nil {
writeErr(w, 500, err.Error())
return
}
}
if req.Workers != nil {
if err := s.m.SetWorkers(*req.Workers); err != nil {
writeErr(w, 400, err.Error())