






















@@ -13,6 +13,7 @@ import {
1313buildModelAliasIndex,
1414resolveDefaultModelForAgent,
1515resolveModelRefFromString,
16+type ModelAliasIndex,
1617} from "../../agents/model-selection.js";
1718import {
1819isToolAllowedByPolicies,
@@ -340,6 +341,127 @@ const createShouldEmitVerboseProgress = (params: {
340341};
341342};
342343344+type HarnessSourceVisibleRepliesDefault = "automatic" | "message_tool";
345+346+type HarnessDefaultCandidate = {
347+provider: string;
348+model?: string;
349+};
350+351+function resolveHarnessDefaultChannel(params: {
352+ctx: FinalizedMsgContext;
353+entry?: SessionEntry;
354+}): string | undefined {
355+const originatingChannel =
356+typeof params.ctx.OriginatingChannel === "string" ? params.ctx.OriginatingChannel : undefined;
357+358+return (
359+params.entry?.channel ??
360+params.entry?.origin?.provider ??
361+originatingChannel ??
362+params.ctx.Provider ??
363+params.ctx.Surface
364+);
365+}
366+367+function resolveHarnessDefaultParentSessionKey(params: {
368+ctx: FinalizedMsgContext;
369+entry?: SessionEntry;
370+}): string | undefined {
371+return (
372+params.entry?.parentSessionKey ??
373+params.ctx.ModelParentSessionKey ??
374+params.ctx.ParentSessionKey
375+);
376+}
377+378+function resolveTurnModelOverride(
379+replyOptions: DispatchFromConfigParams["replyOptions"],
380+): string | undefined {
381+const modelOverride = normalizeOptionalString(replyOptions?.modelOverride);
382+if (modelOverride) {
383+return modelOverride;
384+}
385+if (replyOptions?.isHeartbeat !== true) {
386+return undefined;
387+}
388+return normalizeOptionalString(replyOptions.heartbeatModelOverride);
389+}
390+391+function resolveChannelModelCandidate(params: {
392+aliasIndex: ModelAliasIndex;
393+cfg: OpenClawConfig;
394+ctx: FinalizedMsgContext;
395+defaultProvider: string;
396+entry?: SessionEntry;
397+parentSessionKey?: string;
398+}): HarnessDefaultCandidate | undefined {
399+if (!params.cfg.channels?.modelByChannel) {
400+return undefined;
401+}
402+403+const channel = resolveHarnessDefaultChannel({
404+ctx: params.ctx,
405+entry: params.entry,
406+});
407+const channelModelOverride = resolveChannelModelOverride({
408+cfg: params.cfg,
409+ channel,
410+groupId: params.entry?.groupId,
411+groupChatType: params.entry?.chatType ?? params.ctx.ChatType,
412+groupChannel: params.entry?.groupChannel ?? params.ctx.GroupChannel,
413+groupSubject: params.entry?.subject ?? params.ctx.GroupSubject,
414+parentSessionKey: params.parentSessionKey,
415+});
416+if (!channelModelOverride) {
417+return undefined;
418+}
419+420+return resolveModelRefFromString({
421+raw: channelModelOverride.model,
422+defaultProvider: params.defaultProvider,
423+aliasIndex: params.aliasIndex,
424+})?.ref;
425+}
426+427+function resolveStoredModelCandidate(params: {
428+defaultProvider: string;
429+entry?: SessionEntry;
430+parentSessionKey?: string;
431+sessionKey?: string;
432+sessionStore?: Record<string, SessionEntry>;
433+}): HarnessDefaultCandidate | undefined {
434+const storedModelRef = resolveStoredModelOverride({
435+sessionEntry: params.entry,
436+sessionStore: params.sessionStore,
437+sessionKey: params.sessionKey,
438+parentSessionKey: params.parentSessionKey,
439+defaultProvider: params.defaultProvider,
440+});
441+if (!storedModelRef) {
442+return undefined;
443+}
444+return {
445+provider: storedModelRef.provider ?? params.defaultProvider,
446+model: storedModelRef.model,
447+};
448+}
449+450+function resolveModelOverrideCandidate(params: {
451+aliasIndex: ModelAliasIndex;
452+defaultProvider: string;
453+modelOverride?: string;
454+}): HarnessDefaultCandidate | undefined {
455+if (!params.modelOverride) {
456+return undefined;
457+}
458+return resolveModelRefFromString({
459+raw: params.modelOverride,
460+defaultProvider: params.defaultProvider,
461+aliasIndex: params.aliasIndex,
462+})?.ref;
463+}
464+343465const resolveHarnessSourceVisibleRepliesDefault = (params: {
344466cfg: OpenClawConfig;
345467ctx: FinalizedMsgContext;
@@ -348,7 +470,7 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {
348470sessionKey?: string;
349471sessionStore?: Record<string, SessionEntry>;
350472turnModelOverride?: string;
351-}): "automatic" | "message_tool" | undefined => {
473+}): HarnessSourceVisibleRepliesDefault | undefined => {
352474if (isNativeCommandTurn(resolveCommandTurnContext(params.ctx))) {
353475return undefined;
354476}
@@ -361,57 +483,27 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {
361483cfg: params.cfg,
362484defaultProvider: defaultModelRef.provider,
363485});
364-const channelModelOverride = params.cfg.channels?.modelByChannel
365- ? resolveChannelModelOverride({
366-cfg: params.cfg,
367-channel:
368-params.entry?.channel ??
369-params.entry?.origin?.provider ??
370-(typeof params.ctx.OriginatingChannel === "string"
371- ? params.ctx.OriginatingChannel
372- : undefined) ??
373-params.ctx.Provider ??
374-params.ctx.Surface,
375-groupId: params.entry?.groupId,
376-groupChatType: params.entry?.chatType ?? params.ctx.ChatType,
377-groupChannel: params.entry?.groupChannel ?? params.ctx.GroupChannel,
378-groupSubject: params.entry?.subject ?? params.ctx.GroupSubject,
379-parentSessionKey:
380-params.entry?.parentSessionKey ??
381-params.ctx.ModelParentSessionKey ??
382-params.ctx.ParentSessionKey,
383-})
384- : null;
385-const channelModelRef = channelModelOverride
386- ? resolveModelRefFromString({
387-raw: channelModelOverride.model,
388-defaultProvider: defaultModelRef.provider,
389- aliasIndex,
390-})?.ref
391- : undefined;
392-const storedModelRef = resolveStoredModelOverride({
393-sessionEntry: params.entry,
394-sessionStore: params.sessionStore,
486+const parentSessionKey = resolveHarnessDefaultParentSessionKey(params);
487+const channelModelCandidate = resolveChannelModelCandidate({
488+ aliasIndex,
489+cfg: params.cfg,
490+ctx: params.ctx,
491+defaultProvider: defaultModelRef.provider,
492+entry: params.entry,
493+ parentSessionKey,
494+});
495+const storedModelCandidate = resolveStoredModelCandidate({
496+defaultProvider: defaultModelRef.provider,
497+entry: params.entry,
498+ parentSessionKey,
395499sessionKey: params.sessionKey,
396-parentSessionKey:
397- params.entry?.parentSessionKey ??
398- params.ctx.ModelParentSessionKey ??
399- params.ctx.ParentSessionKey,
500+sessionStore: params.sessionStore,
501+});
502+const turnModelCandidate = resolveModelOverrideCandidate({
503+aliasIndex,
400504defaultProvider: defaultModelRef.provider,
505+modelOverride: params.turnModelOverride,
401506});
402-const storedModelCandidate = storedModelRef
403- ? {
404-provider: storedModelRef.provider ?? defaultModelRef.provider,
405-model: storedModelRef.model,
406-}
407- : undefined;
408-const turnModelRef = params.turnModelOverride
409- ? resolveModelRefFromString({
410-raw: params.turnModelOverride,
411-defaultProvider: defaultModelRef.provider,
412- aliasIndex,
413-})?.ref
414- : undefined;
415507const resolveCandidateDefault = (candidate: { provider: string; model?: string }) => {
416508const agentHarnessRuntimeOverride = resolveSessionRuntimeOverrideForProvider({
417509provider: candidate.provider,
@@ -427,9 +519,10 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {
427519});
428520return harness.deliveryDefaults?.sourceVisibleReplies;
429521};
430-const selectedModelRef = turnModelRef ?? storedModelCandidate ?? channelModelRef;
431-if (selectedModelRef) {
432-return resolveCandidateDefault(selectedModelRef);
522+const selectedModelCandidate =
523+turnModelCandidate ?? storedModelCandidate ?? channelModelCandidate;
524+if (selectedModelCandidate) {
525+return resolveCandidateDefault(selectedModelCandidate);
433526}
434527const sourceProvider = normalizeOptionalString(
435528params.entry?.origin?.provider ?? params.ctx.Provider ?? params.ctx.Surface,
@@ -854,11 +947,7 @@ export async function dispatchReplyFromConfig(
854947 sessionAgentId,
855948sessionKey: acpDispatchSessionKey,
856949sessionStore: sessionStoreEntry.store,
857-turnModelOverride:
858-normalizeOptionalString(params.replyOptions?.modelOverride) ??
859-(params.replyOptions?.isHeartbeat === true
860- ? normalizeOptionalString(params.replyOptions.heartbeatModelOverride)
861- : undefined),
950+turnModelOverride: resolveTurnModelOverride(params.replyOptions),
862951})
863952 : undefined;
864953const effectiveVisibleReplies = configuredVisibleReplies ?? harnessDefaultVisibleReplies;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。