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

推荐订阅源

S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园 - 【当耐特】
月光博客
月光博客
Vercel News
Vercel News
D
Docker
I
InfoQ
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
有赞技术团队
有赞技术团队
雷峰网
雷峰网
博客园 - 聂微东
小众软件
小众软件
Y
Y Combinator Blog
腾讯CDC
L
LangChain Blog
The GitHub Blog
The GitHub Blog
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
T
The Blog of Author Tim Ferriss

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
fix(qa-lab): differentiate mock provider plans · openclaw...
vincentkoc · 2026-05-17 · via Recent Commits to openclaw:main

@@ -79,6 +79,14 @@ function outputItem(payload: unknown, index = 0) {

7979

return requireRecord(output[index], `response output ${index}`);

8080

}

818182+

function outputToolArgs(payload: unknown, index = 0) {

83+

const item = outputItem(payload, index);

84+

if (typeof item.arguments !== "string") {

85+

throw new Error("Expected response output arguments");

86+

}

87+

return requireRecord(JSON.parse(item.arguments) as unknown, "response output arguments");

88+

}

89+8290

function outputContentItem(payload: unknown, outputIndex = 0, contentIndex = 0) {

8391

const content = requireArray(outputItem(payload, outputIndex).content, "response output content");

8492

return requireRecord(content[contentIndex], `response content ${contentIndex}`);

@@ -3017,7 +3025,7 @@ describe("qa mock openai server", () => {

30173025

| { name: string; input: Record<string, unknown> }

30183026

| undefined;

30193027

expect(toolUseBlock?.name).toBe("read");

3020-

expect(toolUseBlock?.input).toEqual({ path: "repo/qa/scenarios/index.md" });

3028+

expect(toolUseBlock?.input).toEqual({ path: "repo/docs/help/testing.md" });

3021302930223030

const debugResponse = await fetch(`${server.baseUrl}/debug/last-request`);

30233031

expect(debugResponse.status).toBe(200);

@@ -3275,7 +3283,7 @@ describe("qa mock openai server", () => {

32753283

expect(body).toContain("event: content_block_start");

32763284

expect(body).toContain('"type":"tool_use"');

32773285

expect(body).toContain('"name":"read"');

3278-

expect(body).toContain("repo/qa/scenarios/index.md");

3286+

expect(body).toContain("repo/docs/help/testing.md");

32793287

expect(body).toContain("event: message_delta");

32803288

expect(body).toContain("event: message_stop");

32813289

});

@@ -3739,6 +3747,77 @@ describe("resolveProviderVariant", () => {

37393747

});

3740374837413749

describe("qa mock openai server provider variant tagging", () => {

3750+

it("pins provider-specific plans for parity scenarios", async () => {

3751+

const sourcePrompt =

3752+

"Read the seeded docs and source plan, then report grouped into Worked, Failed, Blocked, and Follow-up.";

3753+

const handoffPrompt =

3754+

"Delegate one bounded QA task to a subagent. Wait for the subagent to finish.";

3755+

const fanoutPrompt =

3756+

"Subagent fanout synthesis check: delegate two bounded subagents sequentially, then report both results together.";

3757+3758+

const openaiSourceServer = await startMockServer();

3759+

const openaiSource = await expectResponsesJson(openaiSourceServer, {

3760+

model: "openai/gpt-5.5",

3761+

stream: false,

3762+

input: [makeUserInput(sourcePrompt)],

3763+

});

3764+

expect(outputToolArgs(openaiSource)).toEqual({ path: "repo/qa/scenarios/index.md" });

3765+3766+

const anthropicSourceServer = await startMockServer();

3767+

const anthropicSource = await expectResponsesJson(anthropicSourceServer, {

3768+

model: "anthropic/claude-opus-4-7",

3769+

stream: false,

3770+

input: [makeUserInput(sourcePrompt)],

3771+

});

3772+

expect(outputToolArgs(anthropicSource)).toEqual({ path: "repo/docs/help/testing.md" });

3773+3774+

const openaiHandoffServer = await startMockServer();

3775+

const openaiHandoff = await expectResponsesJson(openaiHandoffServer, {

3776+

model: "gpt-5.5",

3777+

stream: false,

3778+

input: [makeUserInput(handoffPrompt)],

3779+

});

3780+

expect(outputToolArgs(openaiHandoff)).toMatchObject({

3781+

label: "qa-sidecar",

3782+

task: "Inspect the QA workspace and return one concise protocol note.",

3783+

});

3784+3785+

const anthropicHandoffServer = await startMockServer();

3786+

const anthropicHandoff = await expectResponsesJson(anthropicHandoffServer, {

3787+

model: "claude-opus-4-7",

3788+

stream: false,

3789+

input: [makeUserInput(handoffPrompt)],

3790+

});

3791+

expect(outputToolArgs(anthropicHandoff)).toMatchObject({

3792+

label: "qa-sidecar",

3793+

task: "Inspect the QA docs fixture and return one concise protocol note.",

3794+

});

3795+3796+

const openaiFanoutServer = await startMockServer();

3797+

const openaiFanout = await expectResponsesJson(openaiFanoutServer, {

3798+

model: "openai/gpt-5.5",

3799+

stream: false,

3800+

tools: [SESSIONS_SPAWN_TOOL],

3801+

input: [makeUserInput(fanoutPrompt)],

3802+

});

3803+

expect(outputToolArgs(openaiFanout)).toMatchObject({

3804+

label: "qa-fanout-alpha",

3805+

task: "Fanout worker alpha: inspect the QA workspace and finish with exactly ALPHA-OK.",

3806+

});

3807+3808+

const anthropicFanoutServer = await startMockServer();

3809+

const anthropicFanout = await expectResponsesJson(anthropicFanoutServer, {

3810+

model: "anthropic/claude-opus-4-7",

3811+

stream: false,

3812+

tools: [SESSIONS_SPAWN_TOOL],

3813+

input: [makeUserInput(fanoutPrompt)],

3814+

});

3815+

expect(outputToolArgs(anthropicFanout)).toMatchObject({

3816+

label: "qa-fanout-alpha",

3817+

task: "Fanout worker alpha: inspect the QA docs fixture and finish with exactly ALPHA-OK.",

3818+

});

3819+

});

3820+37423821

it("records providerVariant on /debug/last-request for openai requests", async () => {

37433822

const server = await startQaMockOpenAiServer({

37443823

host: "127.0.0.1",