惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
罗磊的独立博客
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
B
Blog RSS Feed

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
refactor(messages): clarify Codex source delivery default...
steipete · 2026-05-18 · via Recent Commits to openclaw:main

@@ -13,6 +13,7 @@ import {

1313

buildModelAliasIndex,

1414

resolveDefaultModelForAgent,

1515

resolveModelRefFromString,

16+

type ModelAliasIndex,

1617

} from "../../agents/model-selection.js";

1718

import {

1819

isToolAllowedByPolicies,

@@ -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+343465

const resolveHarnessSourceVisibleRepliesDefault = (params: {

344466

cfg: OpenClawConfig;

345467

ctx: FinalizedMsgContext;

@@ -348,7 +470,7 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {

348470

sessionKey?: string;

349471

sessionStore?: Record<string, SessionEntry>;

350472

turnModelOverride?: string;

351-

}): "automatic" | "message_tool" | undefined => {

473+

}): HarnessSourceVisibleRepliesDefault | undefined => {

352474

if (isNativeCommandTurn(resolveCommandTurnContext(params.ctx))) {

353475

return undefined;

354476

}

@@ -361,57 +483,27 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {

361483

cfg: params.cfg,

362484

defaultProvider: 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,

395499

sessionKey: 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,

400504

defaultProvider: 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;

415507

const resolveCandidateDefault = (candidate: { provider: string; model?: string }) => {

416508

const agentHarnessRuntimeOverride = resolveSessionRuntimeOverrideForProvider({

417509

provider: candidate.provider,

@@ -427,9 +519,10 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {

427519

});

428520

return 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

}

434527

const sourceProvider = normalizeOptionalString(

435528

params.entry?.origin?.provider ?? params.ctx.Provider ?? params.ctx.Surface,

@@ -854,11 +947,7 @@ export async function dispatchReplyFromConfig(

854947

sessionAgentId,

855948

sessionKey: acpDispatchSessionKey,

856949

sessionStore: 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;

864953

const effectiveVisibleReplies = configuredVisibleReplies ?? harnessDefaultVisibleReplies;