Files
openclaw/extensions/moonshot/index.test.ts
Peter Steinberger 99dfb8291f fix(providers): preserve Kimi MiMo reasoning replay (#82170)
* fix(providers): preserve Kimi MiMo reasoning replay

* chore: rerun provider replay ci
2026-05-15 15:44:34 +01:00

74 lines
2.4 KiB
TypeScript

import fs from "node:fs";
import type { Context, Model } from "@earendil-works/pi-ai";
import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime";
import { createCapturedThinkingConfigStream } from "openclaw/plugin-sdk/provider-test-contracts";
import { describe, expect, it } from "vitest";
import plugin from "./index.js";
import { createKimiWebSearchProvider } from "./src/kimi-web-search-provider.js";
type MoonshotManifest = {
providerAuthEnvVars?: Record<string, string[]>;
};
function readManifest(): MoonshotManifest {
return JSON.parse(
fs.readFileSync(new URL("./openclaw.plugin.json", import.meta.url), "utf8"),
) as MoonshotManifest;
}
describe("moonshot provider plugin", () => {
it("mirrors Kimi web-search env credentials in manifest metadata", () => {
const manifestEnvVars = readManifest().providerAuthEnvVars?.moonshot ?? [];
expect([...manifestEnvVars].toSorted()).toStrictEqual(
[...createKimiWebSearchProvider().envVars].toSorted(),
);
});
it("owns replay policy for OpenAI-compatible Moonshot transports without mangling native Kimi tool_call IDs", async () => {
const provider = await registerSingleProviderPlugin(plugin);
const policy = provider.buildReplayPolicy?.({
provider: "moonshot",
modelApi: "openai-completions",
modelId: "kimi-k2.6",
} as never);
expect(policy).toEqual({
applyAssistantFirstOrderingFix: true,
validateGeminiTurns: true,
validateAnthropicTurns: true,
});
expect(policy).not.toHaveProperty("dropReasoningFromHistory");
expect(policy).not.toHaveProperty("sanitizeToolCallIds");
expect(policy).not.toHaveProperty("toolCallIdMode");
});
it("wires moonshot-thinking stream hooks", async () => {
const provider = await registerSingleProviderPlugin(plugin);
const capturedStream = createCapturedThinkingConfigStream();
const wrapped = provider.wrapStreamFn?.({
provider: "moonshot",
modelId: "kimi-k2.6",
thinkingLevel: "off",
streamFn: capturedStream.streamFn,
} as never);
void wrapped?.(
{
api: "openai-completions",
provider: "moonshot",
id: "kimi-k2.6",
} as Model<"openai-completions">,
{ messages: [] } as Context,
{},
);
expect(capturedStream.getCapturedPayload()).toEqual({
config: { thinkingConfig: { thinkingBudget: -1 } },
thinking: { type: "disabled" },
});
});
});