+ {consolidationSteps[item.details.step || ""] || + item.details.step || + "未知步骤"} +
++ 本轮上限:{item.details.max_calls ?? "未记录"} 次 · 已用: + {item.details.calls_used ?? "未记录"} 次 +
++ 停止原因: + {item.reason ? consolidationReason(item.reason) : "未记录"} +
+diff --git a/README.md b/README.md
index e19047b2..53eff0b6 100644
--- a/README.md
+++ b/README.md
@@ -147,7 +147,7 @@ docker start iris
| `PUT /settings/models/{chat\|embedding}` | 保存模型;api_key 省略保留,空字符串清除,enabled=false 停用 |
| `POST /settings/models/{chat\|embedding}/test` | 空 JSON 测已保存配置,模型 JSON 测草稿 |
| `POST /settings/models/{chat\|embedding}/retry` | 对暂时不可用/账户问题请求重试 |
-| `PATCH /settings/limits` | daily_token_limit(null 不限)、learning_concurrency、learning_image_limit、native_image_learning、media_retention_days(默认 7,整数 1—36500) |
+| `PATCH /settings/limits` | daily_token_limit(null 不限)、learning_concurrency、learning_image_limit、native_image_learning、media_retention_days(默认 7,整数 1—36500);所有字段省略即保留现值,daily_token_limit 显式 null 才表示不限;操作记录只包含实际提交的字段 |
## 中文试用与管理界面
diff --git a/frontend/src/Access.test.tsx b/frontend/src/Access.test.tsx
index 38b5dcb3..5ff9cc7f 100644
--- a/frontend/src/Access.test.tsx
+++ b/frontend/src/Access.test.tsx
@@ -160,6 +160,8 @@ test.each(["high", "medium"])(
await user.click(screen.getByRole("button", { name: "测试对话模型连接" }));
expect(await screen.findByText(/密钥无效.*12/)).toBeInTheDocument();
await user.click(screen.getByRole("button", { name: "保存对话模型" }));
+ await user.clear(screen.getByLabelText("学习并发"));
+ await user.type(screen.getByLabelText("学习并发"), "3");
await user.click(screen.getByRole("button", { name: "保存用量与学习" }));
const saved = calls.find(
(c) =>
diff --git a/frontend/src/ConsolidationReport.tsx b/frontend/src/ConsolidationReport.tsx
index e8d79877..f5e6fdfc 100644
--- a/frontend/src/ConsolidationReport.tsx
+++ b/frontend/src/ConsolidationReport.tsx
@@ -9,6 +9,8 @@ import { Badge, Pagination, RoleTime, seconds } from "./ui";
import { PersonaChecks } from "./PersonaDetails";
import { personaDegrees } from "./persona-labels";
import {
+ consolidationBudgets,
+ consolidationSteps,
consolidationReason,
consolidationSwitches,
suggestionKinds,
@@ -334,6 +336,80 @@ function PersonSummaryReport({ data }: { data: MaintenanceReport }) {
);
}
+function StepBudgetReport({ data }: { data: MaintenanceReport }) {
+ const budgets = data.items.filter(
+ (item) => item.outcome === "model_step_budget",
+ );
+ const trimmed = data.items.filter(
+ (item) => item.outcome === "backlog_trimmed",
+ );
+ const expiry = data.question_expiry;
+ return (
+ <>
+ {(data.consolidation || budgets.length > 0) && (
+
+ 每一步独立计数,包含重试和修正;上限沿用本次运行接受时的设置。未到期、关闭或没有任务的步骤可能没有记录。
+ 本次未记录步骤用量。
+ 本轮上限:{item.details.max_calls ?? "未记录"} 次 · 已用:
+ {item.details.calls_used ?? "未记录"} 次
+
+ 停止原因:
+ {item.reason ? consolidationReason(item.reason) : "未记录"}
+
+ 配对积压修剪:{item.details.count ?? "未记录"} 项 ·
+ 待处理配对上限:{item.details.limit ?? "未记录"} 项
+
+ 仅修剪待处理配对,不改变记忆;相关记忆发生变化后可重新规划。
+ 到期自动结束的询问:{expiry.count} 条
+ 仅学习产生且超过保留天数仍未结束的询问;宿主或管理员创建的询问和普通目标不受影响。
+ 各步骤模型调用上限与用量
+
+ {consolidationSteps[item.details.step || ""] ||
+ item.details.step ||
+ "未知步骤"}
+
+ 配对积压修剪
+ {trimmed.map((item) => (
+ 询问到期结束
+
{calls.unknown_usage_calls ?? 0}{" "} - 次调用用量未知;用量为已知合计,包含实际重试、persona + 次调用用量未知;用量为四步骤已知合计,包含实际重试、入口画像、persona 及人物摘要调用。
> )}- 模型调用次数预算: - {data.consolidation.settings.max_calls ?? "未记录"} -
+ {consolidationBudgets.map(([key, label]) => ( ++ {label}:{data.consolidation?.settings[key] ?? "未记录"} +
+ ))} {consolidationSwitches.map(([key, label]) => ({label}: @@ -387,6 +464,7 @@ export function ConsolidationReportSections({
整理不中断接收和学习。修改只影响之后接受的新运行,已接受的运行与续跑沿用其设置快照。
-