2026-02-12 07:42:24 +08:00
|
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
|
import { resolveTranscriptPolicy } from "./transcript-policy.js";
|
|
|
|
|
|
|
|
|
|
describe("resolveTranscriptPolicy", () => {
|
|
|
|
|
it("enables sanitizeToolCallIds for Anthropic provider", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "anthropic",
|
|
|
|
|
modelId: "claude-opus-4-5",
|
|
|
|
|
modelApi: "anthropic-messages",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.sanitizeToolCallIds).toBe(true);
|
|
|
|
|
expect(policy.toolCallIdMode).toBe("strict");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("enables sanitizeToolCallIds for Google provider", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "google",
|
|
|
|
|
modelId: "gemini-2.0-flash",
|
|
|
|
|
modelApi: "google-generative-ai",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.sanitizeToolCallIds).toBe(true);
|
2026-02-22 12:22:38 +01:00
|
|
|
expect(policy.sanitizeThoughtSignatures).toEqual({
|
|
|
|
|
allowBase64Only: true,
|
|
|
|
|
includeCamelCase: true,
|
|
|
|
|
});
|
2026-02-12 07:42:24 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("enables sanitizeToolCallIds for Mistral provider", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "mistral",
|
|
|
|
|
modelId: "mistral-large-latest",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.sanitizeToolCallIds).toBe(true);
|
|
|
|
|
expect(policy.toolCallIdMode).toBe("strict9");
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-15 22:45:01 -08:00
|
|
|
it("disables sanitizeToolCallIds for OpenAI provider", () => {
|
2026-02-12 07:42:24 +08:00
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "openai",
|
|
|
|
|
modelId: "gpt-4o",
|
|
|
|
|
modelApi: "openai",
|
|
|
|
|
});
|
2026-02-15 22:45:01 -08:00
|
|
|
expect(policy.sanitizeToolCallIds).toBe(false);
|
|
|
|
|
expect(policy.toolCallIdMode).toBeUndefined();
|
2026-02-12 07:42:24 +08:00
|
|
|
});
|
2026-02-23 06:08:38 +01:00
|
|
|
|
2026-03-02 11:08:20 -07:00
|
|
|
it("enables strict tool call id sanitization for openai-completions APIs", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "openai",
|
|
|
|
|
modelId: "gpt-5.2",
|
|
|
|
|
modelApi: "openai-completions",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.sanitizeToolCallIds).toBe(true);
|
|
|
|
|
expect(policy.toolCallIdMode).toBe("strict");
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-23 06:08:38 +01:00
|
|
|
it("enables user-turn merge for strict OpenAI-compatible providers", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "moonshot",
|
|
|
|
|
modelId: "kimi-k2.5",
|
|
|
|
|
modelApi: "openai-completions",
|
|
|
|
|
});
|
2026-03-07 23:41:27 +00:00
|
|
|
expect(policy.applyGoogleTurnOrdering).toBe(true);
|
|
|
|
|
expect(policy.validateGeminiTurns).toBe(true);
|
2026-02-23 06:08:38 +01:00
|
|
|
expect(policy.validateAnthropicTurns).toBe(true);
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-24 00:49:03 +08:00
|
|
|
it("enables Anthropic-compatible policies for Bedrock provider", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "amazon-bedrock",
|
|
|
|
|
modelId: "us.anthropic.claude-opus-4-6-v1",
|
|
|
|
|
modelApi: "bedrock-converse-stream",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.repairToolUseResultPairing).toBe(true);
|
|
|
|
|
expect(policy.validateAnthropicTurns).toBe(true);
|
|
|
|
|
expect(policy.allowSyntheticToolResults).toBe(true);
|
|
|
|
|
expect(policy.sanitizeToolCallIds).toBe(true);
|
|
|
|
|
expect(policy.sanitizeMode).toBe("full");
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-06 03:55:06 +08:00
|
|
|
it("preserves thinking signatures for Anthropic provider (#32526)", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "anthropic",
|
|
|
|
|
modelId: "claude-opus-4-5",
|
|
|
|
|
modelApi: "anthropic-messages",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.preserveSignatures).toBe(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("preserves thinking signatures for Bedrock Anthropic (#32526)", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "amazon-bedrock",
|
|
|
|
|
modelId: "us.anthropic.claude-opus-4-6-v1",
|
|
|
|
|
modelApi: "bedrock-converse-stream",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.preserveSignatures).toBe(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("does not preserve signatures for Google provider (#32526)", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "google",
|
|
|
|
|
modelId: "gemini-2.0-flash",
|
|
|
|
|
modelApi: "google-generative-ai",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.preserveSignatures).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("does not preserve signatures for OpenAI provider (#32526)", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "openai",
|
|
|
|
|
modelId: "gpt-4o",
|
|
|
|
|
modelApi: "openai",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.preserveSignatures).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("does not preserve signatures for Mistral provider (#32526)", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "mistral",
|
|
|
|
|
modelId: "mistral-large-latest",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.preserveSignatures).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-07 23:41:27 +00:00
|
|
|
it("enables turn-ordering and assistant-merge for strict OpenAI-compatible providers (#38962)", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "vllm",
|
|
|
|
|
modelId: "gemma-3-27b",
|
|
|
|
|
modelApi: "openai-completions",
|
|
|
|
|
});
|
|
|
|
|
expect(policy.applyGoogleTurnOrdering).toBe(true);
|
|
|
|
|
expect(policy.validateGeminiTurns).toBe(true);
|
|
|
|
|
expect(policy.validateAnthropicTurns).toBe(true);
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-23 06:08:38 +01:00
|
|
|
it("keeps OpenRouter on its existing turn-validation path", () => {
|
|
|
|
|
const policy = resolveTranscriptPolicy({
|
|
|
|
|
provider: "openrouter",
|
|
|
|
|
modelId: "openai/gpt-4.1",
|
|
|
|
|
modelApi: "openai-completions",
|
|
|
|
|
});
|
2026-03-07 23:41:27 +00:00
|
|
|
expect(policy.applyGoogleTurnOrdering).toBe(false);
|
|
|
|
|
expect(policy.validateGeminiTurns).toBe(false);
|
2026-02-23 06:08:38 +01:00
|
|
|
expect(policy.validateAnthropicTurns).toBe(false);
|
|
|
|
|
});
|
2026-02-12 07:42:24 +08:00
|
|
|
});
|