Close protocol compatibility review gaps

Review feedback found narrow compatibility regressions in the web-search shim, Responses tool detection, service tier accounting, and update-center Docker candidate actions. The fix keeps synthetic search routed through the dedicated search model, preserves Responses text compatibility, distinguishes absent service_tier from filtered service_tier, and evaluates recent Docker tags per candidate.

Constraint: Review fixes must stay on dev first, then flow into the main-based release PR branch.

Rejected: Leave Responses web_search simulation on the request model | it has the same search-route selection risk as Anthropic simulation.

Confidence: high

Scope-risk: narrow

Tested: npx vitest run --root . src/server/proxy-core/responsesPreflight.test.ts src/server/proxy-core/serviceTierPolicy.test.ts src/server/routes/proxy/chat.stream.test.ts src/web/pages/settings/UpdateCenterSection.test.tsx

Tested: npm run typecheck:server

Tested: npm run typecheck:web

Tested: npm run repo:drift-check

Co-authored-by: OmX <omx@oh-my-codex.dev>
This commit is contained in:
cita-777
2026-05-08 10:42:49 +08:00
parent 2491a9af5a
commit 8309ac073a
9 changed files with 163 additions and 19 deletions
@@ -4749,6 +4749,7 @@ describe('chat proxy stream behavior', () => {
expect(response.statusCode, response.body).toBe(200);
expect(fetchMock).toHaveBeenCalledTimes(1);
expect(selectChannelMock).toHaveBeenCalledWith('__search', expect.anything());
const [targetUrl, options] = fetchMock.mock.calls[0] as [string, any];
expect(targetUrl).toBe('https://upstream.example.com/v1/search');
expect(JSON.parse(options.body)).toMatchObject({
@@ -4816,6 +4817,7 @@ describe('chat proxy stream behavior', () => {
expect(response.statusCode, response.body).toBe(200);
expect(fetchMock).toHaveBeenCalledTimes(1);
expect(selectChannelMock).toHaveBeenCalledWith('__search', expect.anything());
const [targetUrl, options] = fetchMock.mock.calls[0] as [string, any];
expect(targetUrl).toBe('https://upstream.example.com/v1/search');
expect(JSON.parse(options.body)).toMatchObject({
@@ -4825,6 +4827,7 @@ describe('chat proxy stream behavior', () => {
const body = response.json();
expect(body.object).toBe('response');
expect(body.output_text).toContain('Metapi Responses');
expect(body.output?.[0]).toMatchObject({
type: 'web_search_call',
status: 'completed',