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

推荐订阅源

月光博客
月光博客
Cyberwarzone
Cyberwarzone
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
T
Troy Hunt's Blog
Help Net Security
Help Net Security
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
M
MIT News - Artificial intelligence
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
T
Threatpost
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
I
InfoQ
H
Hacker News: Front Page
D
Docker
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
博客园 - 【当耐特】
T
Tor Project blog
U
Unit 42
H
Heimdal Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy & Cybersecurity Law Blog
PCI Perspectives
PCI Perspectives
美团技术团队
O
OpenAI News
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MyScale Blog
MyScale Blog

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 test: trim doctor command hotspots · openclaw/openclaw@c66f16a test: isolate agent auth and spawn hotspots · openclaw/openclaw@9285935 test: stabilize MCP startup disposal race · openclaw/openclaw@dd9d2eb test: merge browser contract server suites · openclaw/openclaw@5817a76 test: narrow ollama provider discovery setup · openclaw/openclaw@a0d9598 build: declare qa-lab aimock runtime dependency · openclaw/openclaw@24431e5 test: speed up safe-bins exec harness · openclaw/openclaw@ee856ab test: preserve tool helpers in embedded runner mocks · openclaw/openclaw@acd86a0 refactor: move memory embeddings into provider plugins · openclaw/openclaw@77e6e4c test: reuse system-run temp fixtures · openclaw/openclaw@7e9ff0f test: trim hotspot wait overhead · openclaw/openclaw@12a59b0 Check: avoid duplicate boundary prep · openclaw/openclaw@baf11b8 test: reduce hotspot fixture overhead · openclaw/openclaw@3a59edd feat(ui): overhaul settings and slash command UX (#67819) thanks @Bun… · openclaw/openclaw@2cfb660 QA Matrix: exit cleanly on failure · openclaw/openclaw@42805d2 QA Matrix: isolate scenario coverage · openclaw/openclaw@7e659e1 Matrix: refresh crypto bootstrap state · openclaw/openclaw@94081d8 QA Lab: add provider registry · openclaw/openclaw@bb7e982 Matrix: add plugin changelog · openclaw/openclaw@4acab55 test: trim more hotspot overhead · openclaw/openclaw@f485311 test: trim remaining hotspot tests · openclaw/openclaw@6ba8626 test: narrow hotspot mocks · openclaw/openclaw@dbc8179 test: isolate gemini embedding request helpers · openclaw/openclaw@cd330f5 test: trim memory and mcp hotspots · openclaw/openclaw@fd48dfa test: slim provider registry mocks · openclaw/openclaw@2e08c77 test: harden Parallels update smoke · openclaw/openclaw@1a98090 feat: default Anthropic to Opus 4.7 · openclaw/openclaw@628b454 fix: harden node-host shell payload mutability checks · openclaw/openclaw@75c551e fix: land node-host approval binding for native binaries (#66731) (th… · openclaw/openclaw@29919bb CI: add daily schedule to CodeQL workflow (#67645) · openclaw/openclaw@69d25f5 fix(gateway): capture config hash after plugin auto-enable to prevent… · openclaw/openclaw@8c11210 fix: repair sanitized replay tool results before send (#67620) (thank… · openclaw/openclaw@c3c7a99 fix: restrict HTML timeout short-circuit to transient statuses · openclaw/openclaw@de129a6 fix: keep TUI watchdog bound to active run (#67401) (thanks @xantorres) · openclaw/openclaw@3525273 Gateway/skills: dedupe skills prefix-match + drop dead fallback on log · openclaw/openclaw@d7f489f Extensions/lmstudio: back off inference preload after consecutive fai… · openclaw/openclaw@b555214 TUI/streaming: add watchdog that resets the activity indicator after … · openclaw/openclaw@f44ab20 Agents/tool-loop: enable unknown-tool stream guard by default · openclaw/openclaw@36ed367 Gateway/skills: invalidate session skills snapshot on config write · openclaw/openclaw@b23d59a fix: classify HTML provider error pages correctly (#67642) (thanks @s… · openclaw/openclaw@e588e90 fix(skills): remove unused model-usage import (#67641) · openclaw/openclaw@55f05df docs(changelog): credit codex fix superseded PRs · openclaw/openclaw@e485f24 fix(openai-codex): normalize stale transport metadata in resolution a… · openclaw/openclaw@90801ba CI: pin Docker-related GitHub Actions (#67632) · openclaw/openclaw@f697b01 Android: modernize WebView and discovery API usage (#67627) · openclaw/openclaw@44a6e50 fix(deps): bump hono to 4.12.14 and @hono/node-server to 1.19.14 (GHS… · openclaw/openclaw@fbccc18 fix(deps): bump dompurify to 3.4.0 (#67614) · openclaw/openclaw@2c2dc00 CI: add explicit permissions to all workflow jobs (fixes code-scannin… · openclaw/openclaw@01b7516 fix: register bundled TTS providers and route overrides correctly (#6… · openclaw/openclaw@6ea3cdd fix: align host tilde paths with OS home (#62804) (thanks @stainlu) · openclaw/openclaw@ecfaf64 fix: flush creds queue before reconnect socket open (#67464) (thanks … · openclaw/openclaw@405c63f fix: strip standalone <function> tool call tags from visible text (#6… · openclaw/openclaw@78df859 fix(agents): preserve cli session metadata before transcript persist … · openclaw/openclaw@898fd04 docs(changelog): move cli transcript entry · openclaw/openclaw@c1817c6 fix(agents): normalize cli transcript api field · openclaw/openclaw@3a3fae0 docs(changelog): note cli transcript persistence · openclaw/openclaw@6c343f1 fix(agents): persist cli transcript turns · openclaw/openclaw@b8ef507 fix(msteams): harden security-sensitive flows (#65841) · openclaw/openclaw@c56b56e [Dashboard] Fix exec approval modal overflow for long command content… · openclaw/openclaw@053c5b0 Docs: remove QA changelog entry · openclaw/openclaw@7fd5771 QA: fix private runtime source loading (#67428) · openclaw/openclaw@d5933af docs(gateway): correct protocol.md schema path, hello-ok example, aut… · openclaw/openclaw@489404d CI: pin Node 22 runners to 22.18.0 · openclaw/openclaw@4ffa621 models.authStatus: normalize provider ids + tighten env-backed escape… · openclaw/openclaw@f2fdb9d Update CHANGELOG.md · openclaw/openclaw@7694a92 test(parallels): clean up npm update guard jobs · openclaw/openclaw@045ea7b Plugins: prefer scanDir override paths · openclaw/openclaw@b2974da fix(dreaming): default storage.mode to "separate" so phase blocks sto… · openclaw/openclaw@8c392f0 fix(memory-core): skip dreaming transcript ingestion via session stor… · openclaw/openclaw@a1b01f0 fix: dedupe replayed exec.finished node events (#67281) · openclaw/openclaw@5dcf526
test: tighten provider stream assertions · openclaw/openclaw@4837930
steipete · 2026-05-11 · via Recent Commits to openclaw:main

@@ -38,6 +38,29 @@ function requireStreamFn(streamFn: StreamFn | null | undefined) {

3838

return streamFn;

3939

}

404041+

function requireRecord(value: unknown, label: string): Record<string, unknown> {

42+

expect(value).toBeTypeOf("object");

43+

expect(value).not.toBeNull();

44+

if (!value || typeof value !== "object" || Array.isArray(value)) {

45+

throw new Error(`expected ${label} to be an object`);

46+

}

47+

return value as Record<string, unknown>;

48+

}

49+50+

function requirePayload(payload: Record<string, unknown> | undefined): Record<string, unknown> {

51+

expect(payload).toBeDefined();

52+

if (!payload) {

53+

throw new Error("expected captured payload");

54+

}

55+

return payload;

56+

}

57+58+

function expectDefaultThinkingBudget(payload: Record<string, unknown>) {

59+

const config = requireRecord(payload.config, "payload.config");

60+

const thinkingConfig = requireRecord(config.thinkingConfig, "payload.config.thinkingConfig");

61+

expect(thinkingConfig.thinkingBudget).toBe(-1);

62+

}

63+4164

describe("composeProviderStreamWrappers", () => {

4265

it("re-exports the shared wrapper composer", () => {

4366

expect(composeProviderStreamWrappers).toBe(composeProviderStreamWrappersShared);

@@ -113,12 +136,13 @@ describe("buildProviderStreamFamilyHooks", () => {

113136

{} as never,

114137

{},

115138

);

116-

expect(capturedPayload).toMatchObject({

117-

config: { thinkingConfig: { thinkingLevel: "HIGH" } },

118-

});

119-

const googleThinkingConfig = (

120-

(capturedPayload as Record<string, unknown>).config as Record<string, unknown>

121-

).thinkingConfig as Record<string, unknown>;

139+

const googlePayload = requirePayload(capturedPayload);

140+

const googleConfig = requireRecord(googlePayload.config, "google payload config");

141+

const googleThinkingConfig = requireRecord(

142+

googleConfig.thinkingConfig,

143+

"google thinking config",

144+

);

145+

expect(googleThinkingConfig.thinkingLevel).toBe("HIGH");

122146

expect(googleThinkingConfig).not.toHaveProperty("thinkingBudget");

123147124148

const minimaxHooks = MINIMAX_FAST_MODE_STREAM_HOOKS;

@@ -147,10 +171,11 @@ describe("buildProviderStreamFamilyHooks", () => {

147171

modelId: "openai/gpt-5.4",

148172

} as never),

149173

)({ provider: "kilocode", id: "openai/gpt-5.4" } as never, {} as never, {});

150-

expect(capturedPayload).toMatchObject({

151-

config: { thinkingConfig: { thinkingBudget: -1 } },

152-

reasoning: { effort: "high" },

153-

});

174+

const kilocodeOpenAiPayload = requirePayload(capturedPayload);

175+

expectDefaultThinkingBudget(kilocodeOpenAiPayload);

176+

expect(requireRecord(kilocodeOpenAiPayload.reasoning, "kilocode reasoning").effort).toBe(

177+

"high",

178+

);

154179155180

void requireStreamFn(

156181

requireWrapStreamFn(kilocodeHooks.wrapStreamFn)({

@@ -159,10 +184,9 @@ describe("buildProviderStreamFamilyHooks", () => {

159184

modelId: "kilo/auto",

160185

} as never),

161186

)({ provider: "kilocode", id: "kilo/auto" } as never, {} as never, {});

162-

expect(capturedPayload).toMatchObject({

163-

config: { thinkingConfig: { thinkingBudget: -1 } },

164-

});

165-

expect(capturedPayload).not.toHaveProperty("reasoning");

187+

const kilocodeAutoPayload = requirePayload(capturedPayload);

188+

expectDefaultThinkingBudget(kilocodeAutoPayload);

189+

expect(kilocodeAutoPayload).not.toHaveProperty("reasoning");

166190167191

const moonshotHooks = MOONSHOT_THINKING_STREAM_HOOKS;

168192

const moonshotStream = requireStreamFn(

@@ -172,10 +196,11 @@ describe("buildProviderStreamFamilyHooks", () => {

172196

} as never),

173197

);

174198

await moonshotStream({ api: "openai-completions", id: "kimi-k2.5" } as never, {} as never, {});

175-

expect(capturedPayload).toMatchObject({

176-

config: { thinkingConfig: { thinkingBudget: -1 } },

177-

thinking: { type: "disabled" },

178-

});

199+

const moonshotDisabledPayload = requirePayload(capturedPayload);

200+

expectDefaultThinkingBudget(moonshotDisabledPayload);

201+

expect(requireRecord(moonshotDisabledPayload.thinking, "moonshot thinking").type).toBe(

202+

"disabled",

203+

);

179204180205

const moonshotKeepStream = requireStreamFn(

181206

requireWrapStreamFn(moonshotHooks.wrapStreamFn)({

@@ -189,34 +214,47 @@ describe("buildProviderStreamFamilyHooks", () => {

189214

{} as never,

190215

{},

191216

);

192-

expect(capturedPayload).toMatchObject({

193-

config: { thinkingConfig: { thinkingBudget: -1 } },

194-

thinking: { type: "enabled", keep: "all" },

195-

});

217+

const moonshotKeepPayload = requirePayload(capturedPayload);

218+

expectDefaultThinkingBudget(moonshotKeepPayload);

219+

const moonshotKeepThinking = requireRecord(

220+

moonshotKeepPayload.thinking,

221+

"moonshot keep thinking",

222+

);

223+

expect(moonshotKeepThinking.type).toBe("enabled");

224+

expect(moonshotKeepThinking.keep).toBe("all");

196225197226

await moonshotKeepStream(

198227

{ api: "openai-completions", id: "kimi-k2.5" } as never,

199228

{} as never,

200229

{},

201230

);

202-

expect(capturedPayload).toMatchObject({

203-

config: { thinkingConfig: { thinkingBudget: -1 } },

204-

thinking: { type: "enabled" },

205-

});

206-

expect((capturedPayload?.thinking as Record<string, unknown>) ?? {}).not.toHaveProperty("keep");

231+

const moonshotStrippedPayload = requirePayload(capturedPayload);

232+

expectDefaultThinkingBudget(moonshotStrippedPayload);

233+

const moonshotStrippedThinking = requireRecord(

234+

moonshotStrippedPayload.thinking,

235+

"moonshot stripped thinking",

236+

);

237+

expect(moonshotStrippedThinking.type).toBe("enabled");

238+

expect(moonshotStrippedThinking).not.toHaveProperty("keep");

207239208240

payloadSeed = { tool_choice: { type: "tool", name: "read" } };

209241

await moonshotKeepStream(

210242

{ api: "openai-completions", id: "kimi-k2.6" } as never,

211243

{} as never,

212244

{},

213245

);

214-

expect(capturedPayload).toMatchObject({

215-

config: { thinkingConfig: { thinkingBudget: -1 } },

216-

tool_choice: { type: "tool", name: "read" },

217-

thinking: { type: "disabled" },

246+

const moonshotToolChoicePayload = requirePayload(capturedPayload);

247+

expectDefaultThinkingBudget(moonshotToolChoicePayload);

248+

expect(requireRecord(moonshotToolChoicePayload.tool_choice, "tool choice")).toEqual({

249+

type: "tool",

250+

name: "read",

218251

});

219-

expect((capturedPayload?.thinking as Record<string, unknown>) ?? {}).not.toHaveProperty("keep");

252+

const moonshotToolChoiceThinking = requireRecord(

253+

moonshotToolChoicePayload.thinking,

254+

"moonshot tool-choice thinking",

255+

);

256+

expect(moonshotToolChoiceThinking.type).toBe("disabled");

257+

expect(moonshotToolChoiceThinking).not.toHaveProperty("keep");

220258221259

const openAiHooks = OPENAI_RESPONSES_STREAM_HOOKS;

222260

void requireStreamFn(

@@ -236,10 +274,9 @@ describe("buildProviderStreamFamilyHooks", () => {

236274

{} as never,

237275

{},

238276

);

239-

expect(capturedPayload).toMatchObject({

240-

config: { thinkingConfig: { thinkingBudget: -1 } },

241-

service_tier: "flex",

242-

});

277+

const openAiPayload = requirePayload(capturedPayload);

278+

expectDefaultThinkingBudget(openAiPayload);

279+

expect(openAiPayload.service_tier).toBe("flex");

243280

expect(capturedHeaders).toEqual({

244281

"User-Agent": `openclaw/${VERSION}`,

245282

originator: "openclaw",

@@ -254,10 +291,11 @@ describe("buildProviderStreamFamilyHooks", () => {

254291

modelId: "openai/gpt-5.4",

255292

} as never),

256293

)({ provider: "openrouter", id: "openai/gpt-5.4" } as never, {} as never, {});

257-

expect(capturedPayload).toMatchObject({

258-

config: { thinkingConfig: { thinkingBudget: -1 } },

259-

reasoning: { effort: "high" },

260-

});

294+

const openRouterOpenAiPayload = requirePayload(capturedPayload);

295+

expectDefaultThinkingBudget(openRouterOpenAiPayload);

296+

expect(requireRecord(openRouterOpenAiPayload.reasoning, "openrouter reasoning").effort).toBe(

297+

"high",

298+

);

261299262300

void requireStreamFn(

263301

requireWrapStreamFn(openRouterHooks.wrapStreamFn)({

@@ -266,10 +304,9 @@ describe("buildProviderStreamFamilyHooks", () => {

266304

modelId: "x-ai/grok-3",

267305

} as never),

268306

)({ provider: "openrouter", id: "x-ai/grok-3" } as never, {} as never, {});

269-

expect(capturedPayload).toMatchObject({

270-

config: { thinkingConfig: { thinkingBudget: -1 } },

271-

});

272-

expect(capturedPayload).not.toHaveProperty("reasoning");

307+

const openRouterGrokPayload = requirePayload(capturedPayload);

308+

expectDefaultThinkingBudget(openRouterGrokPayload);

309+

expect(openRouterGrokPayload).not.toHaveProperty("reasoning");

273310274311

const toolStreamHooks = TOOL_STREAM_DEFAULT_ON_HOOKS;

275312

const toolStreamDefault = requireStreamFn(

@@ -279,10 +316,9 @@ describe("buildProviderStreamFamilyHooks", () => {

279316

} as never),

280317

);

281318

await toolStreamDefault({ id: "glm-4.7" } as never, {} as never, {});

282-

expect(capturedPayload).toMatchObject({

283-

config: { thinkingConfig: { thinkingBudget: -1 } },

284-

tool_stream: true,

285-

});

319+

const toolStreamDefaultPayload = requirePayload(capturedPayload);

320+

expectDefaultThinkingBudget(toolStreamDefaultPayload);

321+

expect(toolStreamDefaultPayload.tool_stream).toBe(true);

286322287323

const toolStreamDisabled = requireStreamFn(

288324

requireWrapStreamFn(toolStreamHooks.wrapStreamFn)({

@@ -291,10 +327,9 @@ describe("buildProviderStreamFamilyHooks", () => {

291327

} as never),

292328

);

293329

await toolStreamDisabled({ id: "glm-4.7" } as never, {} as never, {});

294-

expect(capturedPayload).toMatchObject({

295-

config: { thinkingConfig: { thinkingBudget: -1 } },

296-

});

297-

expect(capturedPayload).not.toHaveProperty("tool_stream");

330+

const toolStreamDisabledPayload = requirePayload(capturedPayload);

331+

expectDefaultThinkingBudget(toolStreamDisabledPayload);

332+

expect(toolStreamDisabledPayload).not.toHaveProperty("tool_stream");

298333

});

299334300335

it("exposes canonical stream hook constants for reused families", () => {