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

+46 -1
View File
@@ -2,7 +2,7 @@
import * as React from "react";
import { CpuIcon, KeyboardIcon, RadioTowerIcon, SearchIcon, ShieldAlertIcon } from "lucide-react";
import { CpuIcon, FlaskConicalIcon, KeyboardIcon, RadioTowerIcon, SearchIcon, ShieldAlertIcon } from "lucide-react";
import { toast } from "sonner";
import { Button } from "@/components/ui/button";
@@ -41,6 +41,8 @@ export default function SystemSettingsPage() {
// 操作约束注入范围(默认都开)。
const [injectPlanner, setInjectPlanner] = React.useState(true);
const [injectWorker, setInjectWorker] = React.useState(true);
// 实验功能:noa 上下文压缩(默认关)。
const [noaCompaction, setNoaCompaction] = React.useState(false);
// 纯前端偏好:不走 /api/settings,直接读写 localStorage。
const sendMode = useChatSendMode();
@@ -57,6 +59,7 @@ export default function SystemSettingsPage() {
setWorkers(String(s.workers ?? 3));
setInjectPlanner(s.constraints_inject_planner !== false);
setInjectWorker(s.constraints_inject_worker !== false);
setNoaCompaction(!!s.noa_compaction);
}, []);
const saveWorkers = () => {
@@ -146,6 +149,20 @@ export default function SystemSettingsPage() {
.catch(() => setInjectWorker(!v)); // revert on failure
};
const toggleNoaCompaction = (v: boolean) => {
setNoaCompaction(v); // optimistic
api
.setSettings({ noa_compaction: v })
.then((s) => {
apply(s);
toast.success(v ? "已开启 noa 上下文压缩(对之后启动的运行生效)" : "已关闭 noa 上下文压缩(恢复内置压缩)");
})
.catch((e) => {
setNoaCompaction(!v); // revert on failure
toast.error(`保存失败:${(e as Error).message}`);
});
};
// Persist a web-search patch (enable and/or backend). Optimistic with refetch.
const saveWebSearch = (patch: Partial<Settings>) => {
setSaving(true);
@@ -387,6 +404,34 @@ export default function SystemSettingsPage() {
</CardContent>
</Card>
<Card className="mb-4 break-inside-avoid md:mb-6">
<CardHeader>
<CardTitle className="flex items-center gap-2 text-base">
<FlaskConicalIcon className="size-4" />
实验功能
</CardTitle>
<CardDescription>
尚在验证中的机制,默认关闭。可能改变 Agent 行为或影响稳定性,请在了解影响后启用。
<br />
<b>noa 上下文压缩</b>:由模型主动压缩长对话历史(norma v0.4.0)。开启后平台接入的四类 Agent(
<b>规划者 / 执行者 / 主 Agent / 对话</b>)改用 noa 接管上下文,取代内置压缩,
压缩原文会归档到任务工作目录下便于回溯。切换即时生效(对之后启动的运行生效),无需重建 Agent;
关闭后立即恢复内置压缩。
</CardDescription>
</CardHeader>
<CardContent className="flex items-center justify-between gap-4">
<Label htmlFor="noa-compaction" className="text-sm font-normal text-muted-foreground">
noa 上下文压缩{noaCompaction ? " · 已开启" : " · 已关闭"}
</Label>
<Switch
id="noa-compaction"
checked={noaCompaction}
disabled={!loaded}
onCheckedChange={toggleNoaCompaction}
/>
</CardContent>
</Card>
<Card className="mb-4 break-inside-avoid md:mb-6">
<CardHeader>
<CardTitle className="flex items-center gap-2 text-base">
+1
View File
@@ -3326,6 +3326,7 @@ export const settings: Settings = {
workers: 3,
llm_pool_enabled: true,
llm_pool_bind_fallback: false,
noa_compaction: false,
};
// ── LLM 轮询(故障转移)──────────────────────────────────────────────────────
+4
View File
@@ -913,6 +913,10 @@ export interface Settings {
// 操作约束注入范围(默认都开):把任务的 allow/deny 约束拼进对应 agent 的系统提示。
constraints_inject_planner?: boolean;
constraints_inject_worker?: boolean;
// 实验功能:noa 模型驱动上下文压缩(默认关)。开启后平台接入的四类 agent(planner/
// worker/主 agent/对话)由 noa 接管上下文压缩,取代内置 compaction;每 run 读一次,对
// 之后启动的 run 生效。
noa_compaction?: boolean;
}
// ---- LLM config ----