mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-11 05:44:33 +00:00
refactor(agent): dedupe harness and command workflows
This commit is contained in:
@@ -1,8 +1,18 @@
|
||||
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
||||
import type { SessionManager } from "@mariozechner/pi-coding-agent";
|
||||
import { vi } from "vitest";
|
||||
import { expect, vi } from "vitest";
|
||||
import * as helpers from "./pi-embedded-helpers.js";
|
||||
|
||||
export type SessionEntry = { type: string; customType: string; data: unknown };
|
||||
export type SanitizeSessionHistoryFn = (params: {
|
||||
messages: AgentMessage[];
|
||||
modelApi: string;
|
||||
provider: string;
|
||||
sessionManager: SessionManager;
|
||||
sessionId: string;
|
||||
modelId?: string;
|
||||
}) => Promise<AgentMessage[]>;
|
||||
export const TEST_SESSION_ID = "test-session";
|
||||
|
||||
export function makeModelSnapshotEntry(data: {
|
||||
timestamp?: number;
|
||||
@@ -31,6 +41,25 @@ export function makeInMemorySessionManager(entries: SessionEntry[]): SessionMana
|
||||
} as unknown as SessionManager;
|
||||
}
|
||||
|
||||
export function makeMockSessionManager(): SessionManager {
|
||||
return {
|
||||
getEntries: vi.fn().mockReturnValue([]),
|
||||
appendCustomEntry: vi.fn(),
|
||||
} as unknown as SessionManager;
|
||||
}
|
||||
|
||||
export function makeSimpleUserMessages(): AgentMessage[] {
|
||||
const messages = [{ role: "user", content: "hello" }];
|
||||
return messages as unknown as AgentMessage[];
|
||||
}
|
||||
|
||||
export async function loadSanitizeSessionHistoryWithCleanMocks(): Promise<SanitizeSessionHistoryFn> {
|
||||
vi.resetAllMocks();
|
||||
vi.mocked(helpers.sanitizeSessionMessagesImages).mockImplementation(async (msgs) => msgs);
|
||||
const mod = await import("./pi-embedded-runner/google.js");
|
||||
return mod.sanitizeSessionHistory;
|
||||
}
|
||||
|
||||
export function makeReasoningAssistantMessages(opts?: {
|
||||
thinkingSignature?: "object" | "json";
|
||||
}): AgentMessage[] {
|
||||
@@ -56,3 +85,69 @@ export function makeReasoningAssistantMessages(opts?: {
|
||||
|
||||
return messages as unknown as AgentMessage[];
|
||||
}
|
||||
|
||||
export async function sanitizeWithOpenAIResponses(params: {
|
||||
sanitizeSessionHistory: SanitizeSessionHistoryFn;
|
||||
messages: AgentMessage[];
|
||||
sessionManager: SessionManager;
|
||||
modelId?: string;
|
||||
}) {
|
||||
return await params.sanitizeSessionHistory({
|
||||
messages: params.messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: params.sessionManager,
|
||||
modelId: params.modelId,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
}
|
||||
|
||||
export function expectOpenAIResponsesStrictSanitizeCall(
|
||||
sanitizeSessionMessagesImagesMock: unknown,
|
||||
messages: AgentMessage[],
|
||||
) {
|
||||
expect(sanitizeSessionMessagesImagesMock).toHaveBeenCalledWith(
|
||||
messages,
|
||||
"session:history",
|
||||
expect.objectContaining({
|
||||
sanitizeMode: "images-only",
|
||||
sanitizeToolCallIds: true,
|
||||
toolCallIdMode: "strict",
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
export async function expectGoogleModelApiFullSanitizeCall(params: {
|
||||
sanitizeSessionHistory: SanitizeSessionHistoryFn;
|
||||
messages: AgentMessage[];
|
||||
sessionManager: SessionManager;
|
||||
}) {
|
||||
vi.mocked(helpers.isGoogleModelApi).mockReturnValue(true);
|
||||
await params.sanitizeSessionHistory({
|
||||
messages: params.messages,
|
||||
modelApi: "google-generative-ai",
|
||||
provider: "google-vertex",
|
||||
sessionManager: params.sessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
expect(helpers.sanitizeSessionMessagesImages).toHaveBeenCalledWith(
|
||||
params.messages,
|
||||
"session:history",
|
||||
expect.objectContaining({ sanitizeMode: "full", sanitizeToolCallIds: true }),
|
||||
);
|
||||
}
|
||||
|
||||
export function makeSnapshotChangedOpenAIReasoningScenario() {
|
||||
const sessionEntries = [
|
||||
makeModelSnapshotEntry({
|
||||
provider: "anthropic",
|
||||
modelApi: "anthropic-messages",
|
||||
modelId: "claude-3-7",
|
||||
}),
|
||||
];
|
||||
return {
|
||||
sessionManager: makeInMemorySessionManager(sessionEntries),
|
||||
messages: makeReasoningAssistantMessages({ thinkingSignature: "object" }),
|
||||
modelId: "gpt-5.2-codex",
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user