Files
openclaw/src/plugins/provider-thinking.ts
2026-04-21 07:02:43 +01:00

95 lines
2.9 KiB
TypeScript

import { normalizeProviderId } from "../agents/provider-id.js";
import type {
ProviderDefaultThinkingPolicyContext,
ProviderThinkingPolicyContext,
} from "./provider-thinking.types.js";
type ThinkingProviderPlugin = {
id: string;
aliases?: string[];
isBinaryThinking?: (ctx: ProviderThinkingPolicyContext) => boolean | undefined;
supportsAdaptiveThinking?: (ctx: ProviderThinkingPolicyContext) => boolean | undefined;
supportsMaxThinking?: (ctx: ProviderThinkingPolicyContext) => boolean | undefined;
supportsXHighThinking?: (ctx: ProviderThinkingPolicyContext) => boolean | undefined;
resolveDefaultThinkingLevel?: (
ctx: ProviderDefaultThinkingPolicyContext,
) =>
| "off"
| "minimal"
| "low"
| "medium"
| "high"
| "xhigh"
| "adaptive"
| "max"
| null
| undefined;
};
const PLUGIN_REGISTRY_STATE = Symbol.for("openclaw.pluginRegistryState");
type ThinkingRegistryState = {
activeRegistry?: {
providers?: Array<{
provider: ThinkingProviderPlugin;
}>;
} | null;
};
function matchesProviderId(provider: ThinkingProviderPlugin, providerId: string): boolean {
const normalized = normalizeProviderId(providerId);
if (!normalized) {
return false;
}
if (normalizeProviderId(provider.id) === normalized) {
return true;
}
return (provider.aliases ?? []).some((alias) => normalizeProviderId(alias) === normalized);
}
function resolveActiveThinkingProvider(providerId: string): ThinkingProviderPlugin | undefined {
const state = (
globalThis as typeof globalThis & { [PLUGIN_REGISTRY_STATE]?: ThinkingRegistryState }
)[PLUGIN_REGISTRY_STATE];
return state?.activeRegistry?.providers?.find((entry) => {
return matchesProviderId(entry.provider, providerId);
})?.provider;
}
type ThinkingHookParams<TContext> = {
provider: string;
context: TContext;
};
export function resolveProviderBinaryThinking(
params: ThinkingHookParams<ProviderThinkingPolicyContext>,
) {
return resolveActiveThinkingProvider(params.provider)?.isBinaryThinking?.(params.context);
}
export function resolveProviderXHighThinking(
params: ThinkingHookParams<ProviderThinkingPolicyContext>,
) {
return resolveActiveThinkingProvider(params.provider)?.supportsXHighThinking?.(params.context);
}
export function resolveProviderAdaptiveThinking(
params: ThinkingHookParams<ProviderThinkingPolicyContext>,
) {
return resolveActiveThinkingProvider(params.provider)?.supportsAdaptiveThinking?.(params.context);
}
export function resolveProviderMaxThinking(
params: ThinkingHookParams<ProviderThinkingPolicyContext>,
) {
return resolveActiveThinkingProvider(params.provider)?.supportsMaxThinking?.(params.context);
}
export function resolveProviderDefaultThinkingLevel(
params: ThinkingHookParams<ProviderDefaultThinkingPolicyContext>,
) {
return resolveActiveThinkingProvider(params.provider)?.resolveDefaultThinkingLevel?.(
params.context,
);
}