import type { ModelSelection } from "@t3tools/contracts";import { getModelSelectionBooleanOptionValue, getModelSelectionStringOptionValue, getProviderOptionDescriptors, resolvePromptInjectedEffort,} from "@t3tools/shared/model"; import { BUNDLED_CLAUDE_MODEL_CATALOG, getClaudeCatalogModelCapabilities, isClaudeCatalogUltracodeEffort, normalizeClaudeCatalogEffort, resolveClaudeCatalogApiModelId, resolveClaudeCatalogEffort, type ClaudeModelCatalog,} from "./provider/ClaudeModelCatalog.ts"; export interface CompiledClaudeModelSelection { readonly apiModelId: string; readonly effort: string | undefined; readonly promptEffort: string | undefined; readonly settings: Readonly<Record<string, boolean>>; readonly queryIdentity: string;} /** Compile every Claude model option at the provider boundary. */export function compileClaudeModelSelection( selection: ModelSelection, catalog: ClaudeModelCatalog = BUNDLED_CLAUDE_MODEL_CATALOG,): CompiledClaudeModelSelection { const capabilities = getClaudeCatalogModelCapabilities(catalog, selection.model); const descriptors = getProviderOptionDescriptors({ caps: capabilities }); const supportsBoolean = (id: string) => descriptors.some((descriptor) => descriptor.type === "boolean" && descriptor.id === id); const rawEffort = getModelSelectionStringOptionValue(selection, "effort"); const resolvedEffort = resolveClaudeCatalogEffort(catalog, selection.model, rawEffort); const effort = normalizeClaudeCatalogEffort(catalog, resolvedEffort, selection.model); const fastMode = supportsBoolean("fastMode") ? getModelSelectionBooleanOptionValue(selection, "fastMode") : undefined; const thinking = supportsBoolean("thinking") ? getModelSelectionBooleanOptionValue(selection, "thinking") : undefined; const settings = { ...(typeof thinking === "boolean" ? { alwaysThinkingEnabled: thinking } : {}), ...(typeof fastMode === "boolean" ? { fastMode } : {}), ...(isClaudeCatalogUltracodeEffort(resolvedEffort) ? { ultracode: true } : {}), }; const apiModelId = resolveClaudeCatalogApiModelId(catalog, selection); const promptEffort = resolvePromptInjectedEffort(capabilities, rawEffort) ?? undefined; return { apiModelId, effort, promptEffort, settings, queryIdentity: JSON.stringify({ apiModelId, effort: effort ?? null, settings }), };}
import type { ModelSelection } from "@t3tools/contracts";
import {
getModelSelectionBooleanOptionValue,
getModelSelectionStringOptionValue,
getProviderOptionDescriptors,
resolvePromptInjectedEffort,
} from "@t3tools/shared/model";
import {
BUNDLED_CLAUDE_MODEL_CATALOG,
getClaudeCatalogModelCapabilities,
isClaudeCatalogUltracodeEffort,
normalizeClaudeCatalogEffort,
resolveClaudeCatalogApiModelId,
resolveClaudeCatalogEffort,
type ClaudeModelCatalog,
} from "./provider/ClaudeModelCatalog.ts";
export interface CompiledClaudeModelSelection {
readonly apiModelId: string;
readonly effort: string | undefined;
readonly promptEffort: string | undefined;
readonly settings: Readonly<Record<string, boolean>>;
readonly queryIdentity: string;
}
/** Compile every Claude model option at the provider boundary. */
export function compileClaudeModelSelection(
selection: ModelSelection,
catalog: ClaudeModelCatalog = BUNDLED_CLAUDE_MODEL_CATALOG,
): CompiledClaudeModelSelection {
const capabilities = getClaudeCatalogModelCapabilities(catalog, selection.model);
const descriptors = getProviderOptionDescriptors({ caps: capabilities });
const supportsBoolean = (id: string) =>
descriptors.some((descriptor) => descriptor.type === "boolean" && descriptor.id === id);
const rawEffort = getModelSelectionStringOptionValue(selection, "effort");
const resolvedEffort = resolveClaudeCatalogEffort(catalog, selection.model, rawEffort);
const effort = normalizeClaudeCatalogEffort(catalog, resolvedEffort, selection.model);
const fastMode = supportsBoolean("fastMode")
? getModelSelectionBooleanOptionValue(selection, "fastMode")
: undefined;
const thinking = supportsBoolean("thinking")
? getModelSelectionBooleanOptionValue(selection, "thinking")
: undefined;
const settings = {
...(typeof thinking === "boolean" ? { alwaysThinkingEnabled: thinking } : {}),
...(typeof fastMode === "boolean" ? { fastMode } : {}),
...(isClaudeCatalogUltracodeEffort(resolvedEffort) ? { ultracode: true } : {}),
};
const apiModelId = resolveClaudeCatalogApiModelId(catalog, selection);
const promptEffort = resolvePromptInjectedEffort(capabilities, rawEffort) ?? undefined;
return {
apiModelId,
effort,
promptEffort,
settings,
queryIdentity: JSON.stringify({ apiModelId, effort: effort ?? null, settings }),
};
}