import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import type { ProviderRuntimeModel } from "../../../plugins/provider-runtime-model.types.js"; import type {
PluginHookBeforeAgentStartResult,
PluginHookBeforeModelResolveAttachment,
PluginHookBeforeModelResolveEvent,
} from "../../../plugins/types.js"; import {
CONTEXT_WINDOW_HARD_MIN_TOKENS,
CONTEXT_WINDOW_WARN_BELOW_TOKENS,
evaluateContextWindowGuard,
formatContextWindowBlockMessage,
formatContextWindowWarningMessage,
resolveContextWindowInfo,
type ContextWindowInfo,
} from "../../context-window-guard.js"; import { DEFAULT_CONTEXT_TOKENS } from "../../defaults.js"; import { FailoverError } from "../../failover-error.js"; import { log } from "../logger.js"; import { readPiModelContextTokens } from "../model-context-tokens.js";
export async function resolveHookModelSelection(params: {
prompt: string;
attachments?: PluginHookBeforeModelResolveAttachment[];
provider: string;
modelId: string;
hookRunner?: HookRunnerLike | null;
hookContext: HookContext;
}) {
let provider = params.provider;
let modelId = params.modelId;
let modelResolveOverride: { providerOverride?: string; modelOverride?: string } | undefined;
let legacyBeforeAgentStartResult: PluginHookBeforeAgentStartResult | undefined; const hookRunner = params.hookRunner;
// Run before_model_resolve hooks early so plugins can override the // provider/model before resolveModel(). // // Legacy compatibility: before_agent_start is also checked for override // fields if present. New hook takes precedence when both are set. if (hookRunner?.hasHooks("before_model_resolve")) { try { const event: PluginHookBeforeModelResolveEvent = params.attachments
? { prompt: params.prompt, attachments: params.attachments }
: { prompt: params.prompt };
modelResolveOverride = await hookRunner.runBeforeModelResolve(event, params.hookContext);
} catch (hookErr) {
log.warn(`before_model_resolve hook failed: ${String(hookErr)}`);
}
}
if (modelResolveOverride?.providerOverride) {
provider = modelResolveOverride.providerOverride;
log.info(`[hooks] provider overridden to ${provider}`);
} if (modelResolveOverride?.modelOverride) {
modelId = modelResolveOverride.modelOverride;
log.info(`[hooks] model overridden to ${modelId}`);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.