Files
openclaw/src/auto-reply/thinking.ts
2026-03-16 01:49:41 -07:00

124 lines
3.5 KiB
TypeScript

import {
formatThinkingLevels as formatThinkingLevelsFallback,
isBinaryThinkingProvider as isBinaryThinkingProviderFallback,
listThinkingLevelLabels as listThinkingLevelLabelsFallback,
listThinkingLevels as listThinkingLevelsFallback,
normalizeProviderId,
resolveThinkingDefaultForModel as resolveThinkingDefaultForModelFallback,
} from "./thinking.shared.js";
export {
formatXHighModelHint,
normalizeElevatedLevel,
normalizeFastMode,
normalizeNoticeLevel,
normalizeReasoningLevel,
normalizeThinkLevel,
normalizeUsageDisplay,
normalizeVerboseLevel,
resolveResponseUsageMode,
resolveElevatedMode,
} from "./thinking.shared.js";
export type {
ElevatedLevel,
ElevatedMode,
NoticeLevel,
ReasoningLevel,
ThinkLevel,
ThinkingCatalogEntry,
UsageDisplayLevel,
VerboseLevel,
} from "./thinking.shared.js";
import {
resolveProviderBinaryThinking,
resolveProviderDefaultThinkingLevel,
resolveProviderXHighThinking,
} from "../plugins/provider-runtime.js";
export function isBinaryThinkingProvider(provider?: string | null, model?: string | null): boolean {
const normalizedProvider = normalizeProviderId(provider);
if (!normalizedProvider) {
return false;
}
const pluginDecision = resolveProviderBinaryThinking({
provider: normalizedProvider,
context: {
provider: normalizedProvider,
modelId: model?.trim() ?? "",
},
});
if (typeof pluginDecision === "boolean") {
return pluginDecision;
}
return isBinaryThinkingProviderFallback(provider, model);
}
export function supportsXHighThinking(provider?: string | null, model?: string | null): boolean {
const modelKey = model?.trim().toLowerCase();
if (!modelKey) {
return false;
}
const providerKey = normalizeProviderId(provider);
if (providerKey) {
const pluginDecision = resolveProviderXHighThinking({
provider: providerKey,
context: {
provider: providerKey,
modelId: modelKey,
},
});
if (typeof pluginDecision === "boolean") {
return pluginDecision;
}
}
return false;
}
export function listThinkingLevels(provider?: string | null, model?: string | null): ThinkLevel[] {
const levels = listThinkingLevelsFallback(provider, model);
if (supportsXHighThinking(provider, model)) {
levels.splice(levels.length - 1, 0, "xhigh");
}
return levels;
}
export function listThinkingLevelLabels(provider?: string | null, model?: string | null): string[] {
if (isBinaryThinkingProvider(provider, model)) {
return ["off", "on"];
}
return listThinkingLevelLabelsFallback(provider, model);
}
export function formatThinkingLevels(
provider?: string | null,
model?: string | null,
separator = ", ",
): string {
return supportsXHighThinking(provider, model)
? listThinkingLevelLabels(provider, model).join(separator)
: formatThinkingLevelsFallback(provider, model, separator);
}
export function resolveThinkingDefaultForModel(params: {
provider: string;
model: string;
catalog?: ThinkingCatalogEntry[];
}): ThinkLevel {
const normalizedProvider = normalizeProviderId(params.provider);
const candidate = params.catalog?.find(
(entry) => entry.provider === params.provider && entry.id === params.model,
);
const pluginDecision = resolveProviderDefaultThinkingLevel({
provider: normalizedProvider,
context: {
provider: normalizedProvider,
modelId: params.model,
reasoning: candidate?.reasoning,
},
});
if (pluginDecision) {
return pluginDecision;
}
return resolveThinkingDefaultForModelFallback(params);
}