























@@ -0,0 +1,165 @@
1+import { describe, expect, it } from "vitest";
2+import type { OpenClawConfig } from "../config/config.js";
3+import { filterLocalModelLeanTools, isLocalModelLeanEnabled } from "./local-model-lean.js";
4+import type { AnyAgentTool } from "./pi-tools.types.js";
5+6+function tools(names: string[]): AnyAgentTool[] {
7+return names.map((name) => ({ name })) as AnyAgentTool[];
8+}
9+10+describe("local model lean tool filtering", () => {
11+it("filters heavyweight tools for one configured agent", () => {
12+const cfg: OpenClawConfig = {
13+agents: {
14+list: [
15+{
16+id: "gemma",
17+experimental: {
18+localModelLean: true,
19+},
20+},
21+],
22+},
23+};
24+25+expect(isLocalModelLeanEnabled({ config: cfg, agentId: "gemma" })).toBe(true);
26+expect(
27+filterLocalModelLeanTools({
28+tools: tools(["read", "browser", "cron", "message", "exec"]),
29+config: cfg,
30+agentId: "gemma",
31+}).map((tool) => tool.name),
32+).toEqual(["read", "exec"]);
33+});
34+35+it("lets an agent opt out of an inherited global lean setting", () => {
36+const cfg: OpenClawConfig = {
37+agents: {
38+defaults: {
39+experimental: {
40+localModelLean: true,
41+},
42+},
43+list: [
44+{
45+id: "main",
46+experimental: {
47+localModelLean: false,
48+},
49+},
50+],
51+},
52+};
53+54+expect(isLocalModelLeanEnabled({ config: cfg, agentId: "main" })).toBe(false);
55+expect(
56+filterLocalModelLeanTools({
57+tools: tools(["read", "browser", "cron", "message", "exec"]),
58+config: cfg,
59+agentId: "main",
60+}).map((tool) => tool.name),
61+).toEqual(["read", "browser", "cron", "message", "exec"]);
62+});
63+64+it("inherits global lean mode when an agent experimental block omits the flag", () => {
65+const cfg: OpenClawConfig = {
66+agents: {
67+defaults: {
68+experimental: {
69+localModelLean: true,
70+},
71+},
72+list: [
73+{
74+id: "main",
75+experimental: {},
76+},
77+],
78+},
79+};
80+81+expect(isLocalModelLeanEnabled({ config: cfg, agentId: "main" })).toBe(true);
82+expect(
83+filterLocalModelLeanTools({
84+tools: tools(["read", "browser", "cron", "message", "exec"]),
85+config: cfg,
86+agentId: "main",
87+}).map((tool) => tool.name),
88+).toEqual(["read", "exec"]);
89+});
90+91+it("keeps global lean mode for an agent id without an agent entry", () => {
92+const cfg: OpenClawConfig = {
93+agents: {
94+defaults: {
95+experimental: {
96+localModelLean: true,
97+},
98+},
99+},
100+};
101+102+expect(isLocalModelLeanEnabled({ config: cfg, agentId: "ad-hoc" })).toBe(true);
103+expect(
104+filterLocalModelLeanTools({
105+tools: tools(["read", "browser", "cron", "message", "exec"]),
106+config: cfg,
107+agentId: "ad-hoc",
108+}).map((tool) => tool.name),
109+).toEqual(["read", "exec"]);
110+});
111+112+it("uses the configured default agent when no agent id is explicit", () => {
113+const cfg: OpenClawConfig = {
114+agents: {
115+list: [
116+{
117+id: "gemma",
118+default: true,
119+experimental: {
120+localModelLean: true,
121+},
122+},
123+],
124+},
125+};
126+127+expect(isLocalModelLeanEnabled({ config: cfg })).toBe(true);
128+expect(
129+filterLocalModelLeanTools({
130+tools: tools(["read", "browser", "cron", "message", "exec"]),
131+config: cfg,
132+}).map((tool) => tool.name),
133+).toEqual(["read", "exec"]);
134+});
135+136+it("uses the agent from an agent session key", () => {
137+const cfg: OpenClawConfig = {
138+agents: {
139+list: [
140+{
141+id: "main",
142+experimental: {
143+localModelLean: false,
144+},
145+},
146+{
147+id: "gemma",
148+experimental: {
149+localModelLean: true,
150+},
151+},
152+],
153+},
154+};
155+156+expect(isLocalModelLeanEnabled({ config: cfg, sessionKey: "agent:gemma:main" })).toBe(true);
157+expect(
158+filterLocalModelLeanTools({
159+tools: tools(["read", "browser", "cron", "message", "exec"]),
160+config: cfg,
161+sessionKey: "agent:gemma:main",
162+}).map((tool) => tool.name),
163+).toEqual(["read", "exec"]);
164+});
165+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。