test: isolate embedded runner provider policy tests

This commit is contained in:
Peter Steinberger
2026-04-09 04:00:05 +01:00
parent 719f06510c
commit d838fb518d
3 changed files with 63 additions and 5 deletions

View File

@@ -1,6 +1,7 @@
import type { Model } from "@mariozechner/pi-ai";
import { describe, expect, it, vi } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { createPiAiStreamSimpleMock } from "../../../test/helpers/agents/pi-ai-stream-simple-mock.js";
import { __testing as extraParamsTesting } from "./extra-params.js";
import { runExtraParamsCase } from "./extra-params.test-support.js";
vi.mock("@mariozechner/pi-ai", async () =>
@@ -9,6 +10,17 @@ vi.mock("@mariozechner/pi-ai", async () =>
),
);
beforeEach(() => {
extraParamsTesting.setProviderRuntimeDepsForTest({
prepareProviderExtraParams: (params) => params.context.extraParams,
wrapProviderStreamFn: () => undefined,
});
});
afterEach(() => {
extraParamsTesting.resetProviderRuntimeDepsForTest();
});
describe("extra-params: Google thinking payload compatibility", () => {
it("strips negative thinking budgets and fills Gemini 3.1 thinkingLevel", () => {
const payload = runExtraParamsCase({

View File

@@ -1,5 +1,5 @@
import type { Model, SimpleStreamOptions } from "@mariozechner/pi-ai";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { createPiAiStreamSimpleMock } from "../../../test/helpers/agents/pi-ai-stream-simple-mock.js";
import type { OpenClawConfig } from "../../config/config.js";
@@ -10,6 +10,7 @@ vi.mock("@mariozechner/pi-ai", async () =>
);
let runExtraParamsCase: typeof import("./extra-params.test-support.js").runExtraParamsCase;
let extraParamsTesting: typeof import("./extra-params.js").__testing;
type ToolStreamCase = {
applyProvider: string;
@@ -32,9 +33,41 @@ function runToolStreamCase(params: ToolStreamCase) {
describe("extra-params: provider tool_stream support", () => {
beforeEach(async () => {
vi.resetModules();
vi.doUnmock("../../plugins/provider-runtime.js");
({ __testing: extraParamsTesting } = await import("./extra-params.js"));
({ runExtraParamsCase } = await import("./extra-params.test-support.js"));
extraParamsTesting.setProviderRuntimeDepsForTest({
prepareProviderExtraParams: (params) => {
const extraParams = { ...params.context.extraParams };
if (
(params.provider === "zai" || params.provider === "xai") &&
extraParams.tool_stream !== false
) {
extraParams.tool_stream = true;
}
return extraParams;
},
wrapProviderStreamFn: (params) => {
const extraParams = params.context.extraParams ?? {};
if (extraParams.tool_stream !== true) {
return undefined;
}
const inner = params.context.streamFn;
return (model, context, options) =>
inner?.(model, context, {
...options,
onPayload(payload, payloadModel) {
if (payload && typeof payload === "object") {
(payload as Record<string, unknown>).tool_stream = true;
}
options?.onPayload?.(payload, payloadModel);
},
}) as ReturnType<NonNullable<typeof inner>>;
},
});
});
afterEach(() => {
extraParamsTesting.resetProviderRuntimeDepsForTest();
});
it("injects tool_stream=true for zai provider by default", () => {

View File

@@ -1,4 +1,4 @@
import { describe, it } from "vitest";
import { describe, it, vi } from "vitest";
import {
buildForwardCompatTemplate,
expectResolvedForwardCompatFallbackWithRegistryResult,
@@ -6,6 +6,19 @@ import {
import { resolveModelWithRegistry } from "./model.js";
import { createProviderRuntimeTestMock } from "./model.provider-runtime.test-support.js";
vi.mock("../../plugins/provider-runtime.js", () => ({
applyProviderResolvedModelCompatWithPlugins: () => undefined,
applyProviderResolvedTransportWithPlugin: () => undefined,
buildProviderUnknownModelHintWithPlugin: () => undefined,
clearProviderRuntimeHookCache: () => undefined,
normalizeProviderResolvedModelWithPlugin: () => undefined,
normalizeProviderTransportWithPlugin: () => undefined,
prepareProviderDynamicModel: async () => undefined,
resolveProviderBuiltInModelSuppression: () => undefined,
runProviderDynamicModel: () => undefined,
shouldPreferProviderRuntimeResolvedModel: () => false,
}));
const ANTHROPIC_OPUS_TEMPLATE = buildForwardCompatTemplate({
id: "claude-opus-4-5",
name: "Claude Opus 4.5",