mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 07:47:39 +00:00
refactor(plugins): split before-agent hooks by model and prompt phases
This commit is contained in:
75
src/plugins/hooks.phase-hooks.test.ts
Normal file
75
src/plugins/hooks.phase-hooks.test.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { beforeEach, describe, expect, it } from "vitest";
|
||||
import type {
|
||||
PluginHookBeforeModelResolveResult,
|
||||
PluginHookBeforePromptBuildResult,
|
||||
TypedPluginHookRegistration,
|
||||
} from "./types.js";
|
||||
import { createHookRunner } from "./hooks.js";
|
||||
import { createEmptyPluginRegistry, type PluginRegistry } from "./registry.js";
|
||||
|
||||
function addTypedHook(
|
||||
registry: PluginRegistry,
|
||||
hookName: "before_model_resolve" | "before_prompt_build",
|
||||
pluginId: string,
|
||||
handler: () =>
|
||||
| PluginHookBeforeModelResolveResult
|
||||
| PluginHookBeforePromptBuildResult
|
||||
| Promise<PluginHookBeforeModelResolveResult | PluginHookBeforePromptBuildResult>,
|
||||
priority?: number,
|
||||
) {
|
||||
registry.typedHooks.push({
|
||||
pluginId,
|
||||
hookName,
|
||||
handler,
|
||||
priority,
|
||||
source: "test",
|
||||
} as TypedPluginHookRegistration);
|
||||
}
|
||||
|
||||
describe("phase hooks merger", () => {
|
||||
let registry: PluginRegistry;
|
||||
|
||||
beforeEach(() => {
|
||||
registry = createEmptyPluginRegistry();
|
||||
});
|
||||
|
||||
it("before_model_resolve keeps higher-priority override values", async () => {
|
||||
addTypedHook(registry, "before_model_resolve", "low", () => ({ modelOverride: "gpt-4o" }), 1);
|
||||
addTypedHook(
|
||||
registry,
|
||||
"before_model_resolve",
|
||||
"high",
|
||||
() => ({ modelOverride: "llama3.3:8b", providerOverride: "ollama" }),
|
||||
10,
|
||||
);
|
||||
|
||||
const runner = createHookRunner(registry);
|
||||
const result = await runner.runBeforeModelResolve({ prompt: "test" }, {});
|
||||
|
||||
expect(result?.modelOverride).toBe("llama3.3:8b");
|
||||
expect(result?.providerOverride).toBe("ollama");
|
||||
});
|
||||
|
||||
it("before_prompt_build concatenates prependContext and preserves systemPrompt precedence", async () => {
|
||||
addTypedHook(
|
||||
registry,
|
||||
"before_prompt_build",
|
||||
"high",
|
||||
() => ({ prependContext: "context A", systemPrompt: "system A" }),
|
||||
10,
|
||||
);
|
||||
addTypedHook(
|
||||
registry,
|
||||
"before_prompt_build",
|
||||
"low",
|
||||
() => ({ prependContext: "context B" }),
|
||||
1,
|
||||
);
|
||||
|
||||
const runner = createHookRunner(registry);
|
||||
const result = await runner.runBeforePromptBuild({ prompt: "test", messages: [] }, {});
|
||||
|
||||
expect(result?.prependContext).toBe("context A\n\ncontext B");
|
||||
expect(result?.systemPrompt).toBe("system A");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user