fix(plugin-sdk): share anthropic replay hook constants

This commit is contained in:
Vincent Koc
2026-04-14 16:37:29 +01:00
parent 4c15f1310b
commit e5c38290a6
5 changed files with 38 additions and 12 deletions

View File

@@ -1,7 +1,7 @@
import type { StreamFn } from "@mariozechner/pi-agent-core";
import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry";
import {
buildProviderReplayFamilyHooks,
ANTHROPIC_BY_MODEL_REPLAY_HOOKS,
normalizeProviderId,
} from "openclaw/plugin-sdk/provider-model-shared";
import {
@@ -74,9 +74,7 @@ export function registerAmazonBedrockPlugin(api: OpenClawPluginApi): void {
/ValidationException.*(?:exceeds? the (?:maximum|max) (?:number of )?(?:input )?tokens)/i,
/ModelStreamErrorException.*(?:Input is too long|too many input tokens)/i,
] as const;
const anthropicByModelReplayHooks = buildProviderReplayFamilyHooks({
family: "anthropic-by-model",
});
const anthropicByModelReplayHooks = ANTHROPIC_BY_MODEL_REPLAY_HOOKS;
const pluginConfig = (api.pluginConfig ?? {}) as AmazonBedrockPluginConfig;
const guardrail = pluginConfig.guardrail;

View File

@@ -1,5 +1,5 @@
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { buildProviderReplayFamilyHooks } from "openclaw/plugin-sdk/provider-model-shared";
import { NATIVE_ANTHROPIC_REPLAY_HOOKS } from "openclaw/plugin-sdk/provider-model-shared";
import {
mergeImplicitAnthropicVertexProvider,
resolveAnthropicVertexConfigApiKey,
@@ -7,9 +7,6 @@ import {
} from "./api.js";
const PROVIDER_ID = "anthropic-vertex";
const NATIVE_ANTHROPIC_REPLAY_HOOKS = buildProviderReplayFamilyHooks({
family: "native-anthropic-by-model",
});
export default definePluginEntry({
id: PROVIDER_ID,

View File

@@ -1,8 +1,6 @@
import { buildProviderReplayFamilyHooks } from "openclaw/plugin-sdk/provider-model-shared";
import { NATIVE_ANTHROPIC_REPLAY_HOOKS } from "openclaw/plugin-sdk/provider-model-shared";
const { buildReplayPolicy } = buildProviderReplayFamilyHooks({
family: "native-anthropic-by-model",
});
const { buildReplayPolicy } = NATIVE_ANTHROPIC_REPLAY_HOOKS;
if (!buildReplayPolicy) {
throw new Error("Expected native Anthropic replay hooks to expose buildReplayPolicy.");

View File

@@ -1,6 +1,8 @@
import { describe, expect, it } from "vitest";
import {
ANTHROPIC_BY_MODEL_REPLAY_HOOKS,
buildProviderReplayFamilyHooks,
NATIVE_ANTHROPIC_REPLAY_HOOKS,
OPENAI_COMPATIBLE_REPLAY_HOOKS,
PASSTHROUGH_GEMINI_REPLAY_HOOKS,
} from "./provider-model-shared.js";
@@ -204,5 +206,28 @@ describe("buildProviderReplayFamilyHooks", () => {
includeCamelCase: true,
},
});
expect(
ANTHROPIC_BY_MODEL_REPLAY_HOOKS.buildReplayPolicy?.({
provider: "amazon-bedrock",
modelApi: "bedrock-converse-stream",
modelId: "claude-sonnet-4-6",
} as never),
).toMatchObject({
validateAnthropicTurns: true,
repairToolUseResultPairing: true,
});
expect(
NATIVE_ANTHROPIC_REPLAY_HOOKS.buildReplayPolicy?.({
provider: "anthropic",
modelApi: "anthropic-messages",
modelId: "claude-sonnet-4-6",
} as never),
).toMatchObject({
preserveNativeAnthropicToolUseIds: true,
preserveSignatures: true,
validateAnthropicTurns: true,
});
});
});

View File

@@ -165,6 +165,14 @@ export const OPENAI_COMPATIBLE_REPLAY_HOOKS = buildProviderReplayFamilyHooks({
family: "openai-compatible",
});
export const ANTHROPIC_BY_MODEL_REPLAY_HOOKS = buildProviderReplayFamilyHooks({
family: "anthropic-by-model",
});
export const NATIVE_ANTHROPIC_REPLAY_HOOKS = buildProviderReplayFamilyHooks({
family: "native-anthropic-by-model",
});
export const PASSTHROUGH_GEMINI_REPLAY_HOOKS = buildProviderReplayFamilyHooks({
family: "passthrough-gemini",
});