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

推荐订阅源

博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Y
Y Combinator Blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
J
Java Code Geeks
美团技术团队
Google DeepMind News
Google DeepMind News
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
T
The Blog of Author Tim Ferriss

Recent Commits to openclaw:main

fix(build): normalize cache paths on Windows (#85437) fix(update): detect nested macOS gateway ancestry (#85391) · openclaw/openclaw@adc6adc fix(docker): seed offline prune store in runtime stage · openclaw/openclaw@faf2a6c fix(ci): stabilize npm shrinkwrap metadata · openclaw/openclaw@21bedd3 fix(codex): route node exec through OpenClaw tools · openclaw/openclaw@5cc0dbc test(installer): track portable node root helper · openclaw/openclaw@9364b21 fix(ui): sync talk transcript translations fix(ui): localize talk transcript labels · openclaw/openclaw@8fc48af fix(release): stabilize config restart QA · openclaw/openclaw@cc91ff0 fix(installer): extract portable Node directly test(qa-lab): report scenario pack coverage · openclaw/openclaw@dcd98bf fix(plugins): drop stale tlon tool contract · openclaw/openclaw@d70dc4b fix(installer): prefer tar for portable Node extraction · openclaw/openclaw@a54a881 fix(codex): deliver native subagent completions feat: add context-engine host capability requirements (#84994) · openclaw/openclaw@cff5244 fix(release): keep shrinkwrap pinned to pnpm lock · openclaw/openclaw@9d24fde fix: surface plan updates as status notices · openclaw/openclaw@dc04503 test(google): narrow web search fake timers · openclaw/openclaw@fe7d13c fix(installer): extract portable Node with ZipFile · openclaw/openclaw@ffa6cd8 fix(gateway): defer provider auth prewarm after startup (#85369) · openclaw/openclaw@69255f8 fix(talk): stabilize realtime voice consults · openclaw/openclaw@683ad75 test(qa): tolerate slow gateway rpc startup · openclaw/openclaw@29118a0 chore(diagnostics): refresh plugin sdk baseline · openclaw/openclaw@ab684f5 fix(diagnostics): surface async queue drops fix(diagnostics): bound diagnostic buffers · openclaw/openclaw@bdcaac0 fix(installer): copy portable Node into place · openclaw/openclaw@c21ca88 fix(cli): recover replaced device approvals (#85342) · openclaw/openclaw@6ea907c test(release): align prerelease validation · openclaw/openclaw@0def3e2 fix(installer): install portable Node directory atomically · openclaw/openclaw@2890b1a fix(runtime-llm): avoid duplicate provider prefix in allowlist diagno… · openclaw/openclaw@937a756 fix(gateway): include openclaw bin in service PATH (#84475) · openclaw/openclaw@66d1d13 fix(gateway): handle concurrent launchd bootstrap restart race (#84722) · openclaw/openclaw@ba86716 feat: support pi and opencode autoreview engines · openclaw/openclaw@31a189d ci(package): gate acceptance on package integrity · openclaw/openclaw@5275929 ci(release): bypass pnpm for tsdown package build · openclaw/openclaw@fea89cd test(release): align prerelease validation baselines · openclaw/openclaw@04ebdc6 ci(release): harden docker package build · openclaw/openclaw@7b1fbe1 fix(codex): skip native web search transcript mirroring (#85346) · openclaw/openclaw@c3531fc fix(gateway): harden launchd reload handoff race recovery (#84641) · openclaw/openclaw@fc7a531 fix: honor per-model provider transport overrides (#80488) fix(skills): type watcher mock calls in dedupe regression tests · openclaw/openclaw@bb73f0a fix(skills): dedupe shared-directory watchers across agent workspaces… · openclaw/openclaw@3e94290 fix(skills): document watcher edge cases, add teardown/rebuild tests,… · openclaw/openclaw@19ff77e fix(infra): allow macos browser open over ssh env (#85340) · openclaw/openclaw@47d66fe fix(update): preserve package service state during cutover (#83026) · openclaw/openclaw@a15797a fix(gateway): broadcast agent-run error payloads (#85355) · openclaw/openclaw@07e61fc test(e2e): avoid synthetic channel config in plugin smoke fix(cli): suppress systemd hints for live gateway (#85336) · openclaw/openclaw@a00c583 fix(cli): honor agent for model auth logout (#85326) · openclaw/openclaw@fc47c1f fix(gateway): eager-load lifecycle runtime to survive in-place upgrad… · openclaw/openclaw@4a91385 fix(doctor): point codex asset warning at migrate plan (#85324) fix(update): harden managed handoff cwd (#83875) · openclaw/openclaw@1bafc23 docs(release): prepare 2026.5.21 notes ci(crabbox): harden docker hydration refactor(crabbox): parse provider list from binary help instead of ha… test(plugins): keep rpc source walk on source call gateway test(plugins): add kitchen sink rpc docker lane · openclaw/openclaw@6f6da5f test(plugins): run kitchen sink rpc lane without tsx test(qa-lab): add bus tool trace scenario · openclaw/openclaw@2b39613 fix(cron): classify network retry errors (#85344) fix(installer): bootstrap portable Windows Node · openclaw/openclaw@3551e98 fix(ui): move chat session search into picker (#85303) · openclaw/openclaw@1fdc73a fix: honor shrinkwrap when bundling plugin deps fix: opt codex out of bundled runtime deps · openclaw/openclaw@fcecbd8 fix: include plugin shrinkwraps in dependency reports · openclaw/openclaw@82f69a2 fix: make bundled plugin packages portable test: update shrinkwrap packaging expectations · openclaw/openclaw@a1b05aa fix: publish explicit plugin bundled dependencies · openclaw/openclaw@976da39 chore: refresh shrinkwrap for Testbox npm · openclaw/openclaw@b2dc449 fix: cover plugin package locks in dependency review · openclaw/openclaw@bfa5b39 fix: opt acpx out of bundled runtime deps · openclaw/openclaw@9914e25 chore: refresh shrinkwrap metadata chore: harden npm shrinkwrap release path fix: keep bundled plugin peers nested · openclaw/openclaw@86faf65 chore: add shrinkwrap to plugin npm packages · openclaw/openclaw@b6c8807 feat: bundle plugin npm dependencies · openclaw/openclaw@de022bb fix: honor overrides in npm shrinkwrap generation · openclaw/openclaw@0d28040 test: refresh shrinkwrap after rebase · openclaw/openclaw@8b0537c fix: limit subagent bootstrap defaults · openclaw/openclaw@56308a7 feat: update autoreview engine coverage · openclaw/openclaw@ab1fedb fix(messages): strip unsupported citation markers (#85204) (thanks @n… · openclaw/openclaw@0a95e53 test(qa-lab): report live transport coverage lanes · openclaw/openclaw@fda0baf fix(gateway): close child ACP sessions on parent reset/delete · openclaw/openclaw@136c927 fix: preserve Google Gemini 3 cron thinking (#85300) docs(skills): exclude SDK boundary bug sweeps · openclaw/openclaw@85e468d feat(plugin-sdk): add generic channel poll sender (#85299) · openclaw/openclaw@c9a0f03 fix(agents): preserve OpenAI reasoning token usage · openclaw/openclaw@0ddf51c test(e2e): harden plugin smoke cleanup fix(plugins): resolve native plugin sdk aliases (#85298) · openclaw/openclaw@6b1c868 fix(update): keep service logs out of json output · openclaw/openclaw@03f61cd fix(agent): retry transient gateway handshake closes · openclaw/openclaw@ff79299 fix(codex): keep interrupted turns visible-answer eligible (#84494) · openclaw/openclaw@8523e09 test(agents): narrow bundle mcp e2e setup · openclaw/openclaw@6bd430e test: add mocked Control UI E2E tests and playwright for local verifi… fix: land code-mode structured worker errors (#83444) (thanks @Kaspre) · openclaw/openclaw@70dd315 fix(code-mode): return structured worker error codes · openclaw/openclaw@edab653 fix: preserve route-bound direct thread events · openclaw/openclaw@0d8c9ca fix: route direct thread event wakes to main DMs · openclaw/openclaw@0acfb7b test: align exec event routing proof (#83743) (thanks @Kaspre) · openclaw/openclaw@7b48956 fix: break plugin metadata snapshot cycle · openclaw/openclaw@4ee8a2a
fix(opencode-go): strip Kimi reasoning replay fields (#85377) · openclaw/openclaw@d22bcfc
steipete · 2026-05-23 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -54,6 +54,7 @@ Docs: https://docs.openclaw.ai

5454

- Gateway chat: broadcast returned agent-run error payloads after an agent starts so ACP/WebChat clients receive terminal idle-timeout errors. Fixes #84945.

5555

- Dashboard/CLI: allow macOS browser launching through `open` even when SSH environment variables are present, while preserving Linux SSH no-display protection. Fixes #67088. Thanks @theglove44.

5656

- Codex app-server: keep native web search observations out of mirrored chat transcripts while preserving tool progress telemetry. Fixes #85109. Thanks @ugitmebaby.

57+

- OpenCode Go: strip unsupported Kimi reasoning replay fields before provider requests so repeated `kimi-k2.6` turns do not fail schema validation. Fixes #83812. Thanks @Sleeck.

5758

- Agents/OpenAI: preserve structured provider error code, type, and redacted body metadata on boundary-aware transport failures.

5859

- Doctor/Codex: point native Codex asset warnings at the canonical `openclaw migrate plan codex` preview command. Fixes #84948. Thanks @markoa.

5960

- CLI/models: make `capability model auth logout --agent` remove auth profiles from the selected non-default agent store. Fixes #85092. Thanks @islandpreneur007.

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,60 @@

1+

import { describe, expect, it } from "vitest";

2+

import { stripOpencodeGoKimiReasoningPayload } from "./reasoning-sanitizer.js";

3+
4+

describe("OpenCode Go Kimi reasoning payload sanitizer", () => {

5+

it("strips unsupported replay reasoning fields from messages and input", () => {

6+

const payload = {

7+

model: "kimi-k2.6",

8+

reasoning_effort: "high",

9+

reasoning: { effort: "high" },

10+

reasoningEffort: "high",

11+

messages: [

12+

{

13+

role: "assistant",

14+

content: [

15+

{ type: "text", text: "done" },

16+

{ type: "thinking", reasoning_details: [{ text: "private thought" }] },

17+

{ type: "redacted_thinking", data: "opaque" },

18+

],

19+

reasoning_details: [{ text: "private thought" }],

20+

reasoning_content: "private thought",

21+

reasoning_text: "private thought",

22+

},

23+

],

24+

input: [

25+

{

26+

role: "assistant",

27+

content: "done",

28+

reasoning_details: [{ text: "private thought" }],

29+

},

30+

{ type: "reasoning", summary: [] },

31+

{

32+

role: "assistant",

33+

content: [{ type: "thinking", reasoning_details: [{ text: "private thought" }] }],

34+

},

35+

],

36+

};

37+
38+

stripOpencodeGoKimiReasoningPayload(payload);

39+
40+

expect(payload).toEqual({

41+

model: "kimi-k2.6",

42+

messages: [

43+

{

44+

role: "assistant",

45+

content: [{ type: "text", text: "done" }],

46+

},

47+

],

48+

input: [

49+

{

50+

role: "assistant",

51+

content: "done",

52+

},

53+

{

54+

role: "assistant",

55+

content: [{ type: "text", text: "[assistant reasoning omitted]" }],

56+

},

57+

],

58+

});

59+

});

60+

});

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,71 @@

1+

const REASONING_REPLAY_FIELDS = [

2+

"reasoning_details",

3+

"reasoning_content",

4+

"reasoning",

5+

"reasoning_text",

6+

] as const;

7+
8+

const OMITTED_ASSISTANT_REASONING_TEXT = "[assistant reasoning omitted]";

9+
10+

function isReasoningReplayPart(value: unknown): boolean {

11+

if (!value || typeof value !== "object") {

12+

return false;

13+

}

14+

const type = (value as { type?: unknown }).type;

15+

return type === "thinking" || type === "redacted_thinking" || type === "reasoning";

16+

}

17+
18+

function stripReasoningReplayFields(value: unknown): void {

19+

if (!value || typeof value !== "object") {

20+

return;

21+

}

22+
23+

const record = value as Record<string, unknown>;

24+

for (const field of REASONING_REPLAY_FIELDS) {

25+

delete record[field];

26+

}

27+
28+

const content = record.content;

29+

if (Array.isArray(content)) {

30+

const nextContent = [];

31+

for (const part of content) {

32+

if (isReasoningReplayPart(part)) {

33+

continue;

34+

}

35+

stripReasoningReplayFields(part);

36+

nextContent.push(part);

37+

}

38+

record.content =

39+

nextContent.length > 0

40+

? nextContent

41+

: [{ type: "text", text: OMITTED_ASSISTANT_REASONING_TEXT }];

42+

}

43+

}

44+
45+

function stripReasoningReplayFieldsFromList(value: unknown): unknown {

46+

if (!Array.isArray(value)) {

47+

return value;

48+

}

49+

const nextItems = [];

50+
51+

for (const item of value) {

52+

if (isReasoningReplayPart(item)) {

53+

continue;

54+

}

55+

stripReasoningReplayFields(item);

56+

nextItems.push(item);

57+

}

58+

return nextItems;

59+

}

60+
61+

export function stripOpencodeGoKimiReasoningPayload(payloadObj: Record<string, unknown>): void {

62+

stripReasoningReplayFields(payloadObj);

63+

delete payloadObj.reasoning_effort;

64+

delete payloadObj.reasoningEffort;

65+

if ("messages" in payloadObj) {

66+

payloadObj.messages = stripReasoningReplayFieldsFromList(payloadObj.messages);

67+

}

68+

if ("input" in payloadObj) {

69+

payloadObj.input = stripReasoningReplayFieldsFromList(payloadObj.input);

70+

}

71+

}

Original file line numberDiff line numberDiff line change

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

44

streamWithPayloadPatch,

55

} from "openclaw/plugin-sdk/provider-stream-shared";

66

import { isOpencodeGoKimiNoReasoningModelId } from "./provider-catalog.js";

7+

import { stripOpencodeGoKimiReasoningPayload } from "./reasoning-sanitizer.js";

78
89

function isOpencodeGoDeepSeekV4ModelId(modelId: unknown): boolean {

910

return modelId === "deepseek-v4-flash" || modelId === "deepseek-v4-pro";

@@ -22,9 +23,7 @@ export function createOpencodeGoDeepSeekV4Wrapper(

2223

}

2324
2425

function stripReasoningParams(payloadObj: Record<string, unknown>): void {

25-

delete payloadObj.reasoning;

26-

delete payloadObj.reasoning_effort;

27-

delete payloadObj.reasoningEffort;

26+

stripOpencodeGoKimiReasoningPayload(payloadObj);

2827

}

2928
3029

export function createOpencodeGoKimiNoReasoningWrapper(