From 51de58b37f662a758dfee4f9cc5aa08c79b88ece Mon Sep 17 00:00:00 2001 From: xiaopixiu2019 Date: Sat, 11 Jul 2026 15:39:32 +0800 Subject: [PATCH 01/23] fix: normalize GPT-5.6 alias in OpenAI OAuth account tests --- .../internal/service/account_test_service.go | 9 ++++-- .../account_test_service_openai_test.go | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/backend/internal/service/account_test_service.go b/backend/internal/service/account_test_service.go index b9dae84057..651501ca87 100644 --- a/backend/internal/service/account_test_service.go +++ b/backend/internal/service/account_test_service.go @@ -582,8 +582,13 @@ func (s *AccountTestService) testOpenAIAccountConnection(c *gin.Context, account c.Writer.Header().Set("X-Accel-Buffering", "no") c.Writer.Flush() - // Create OpenAI Responses API payload - payload := createOpenAITestPayload(testModelID, isOAuth) + // Create OpenAI Responses API payload. OAuth accounts use ChatGPT Codex + // upstream and must apply the same model normalization as real forwarding. + upstreamTestModelID := testModelID + if isOAuth { + upstreamTestModelID = normalizeOpenAIModelForUpstream(credentialAccount, testModelID) + } + payload := createOpenAITestPayload(upstreamTestModelID, isOAuth) payloadBytes, _ := json.Marshal(payload) // Send test_start event diff --git a/backend/internal/service/account_test_service_openai_test.go b/backend/internal/service/account_test_service_openai_test.go index af28085123..083d882ea7 100644 --- a/backend/internal/service/account_test_service_openai_test.go +++ b/backend/internal/service/account_test_service_openai_test.go @@ -137,6 +137,34 @@ func TestAccountTestService_OpenAISuccessPersistsSnapshotFromHeaders(t *testing. require.Contains(t, recorder.Body.String(), "test_complete") } +func TestAccountTestService_OpenAIOAuthTestNormalizesGPT56Alias(t *testing.T) { + gin.SetMode(gin.TestMode) + ctx, _ := newTestContext() + + resp := newJSONResponse(http.StatusOK, "") + resp.Body = io.NopCloser(strings.NewReader(`data: {"type":"response.completed"} + +`)) + + upstream := &queuedHTTPUpstream{responses: []*http.Response{resp}} + svc := &AccountTestService{httpUpstream: upstream} + account := &Account{ + ID: 90, + Platform: PlatformOpenAI, + Type: AccountTypeOAuth, + Concurrency: 1, + Credentials: map[string]any{"access_token": "test-token"}, + } + + err := svc.testOpenAIAccountConnection(ctx, account, "gpt-5.6", "", "") + require.NoError(t, err) + require.Len(t, upstream.requests, 1) + + body, err := io.ReadAll(upstream.requests[0].Body) + require.NoError(t, err) + require.Equal(t, "gpt-5.6-sol", gjson.GetBytes(body, "model").String()) +} + func TestAccountTestService_OpenAIShadowUsesParentCredentialsAndShadowModel(t *testing.T) { gin.SetMode(gin.TestMode) ctx, recorder := newTestContext() From 94a22b62f7b963b6b671e3fc292ad0af609e6143 Mon Sep 17 00:00:00 2001 From: iMouseWu Date: Sat, 11 Jul 2026 17:13:19 +0800 Subject: [PATCH 02/23] =?UTF-8?q?fix(frontend):=20=E5=B0=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=87=8F=E5=85=B3=E9=97=AD=20DataTable=20=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E5=8C=96=E5=B9=B6=E6=8C=89=E8=A1=8C=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=A1=8C=E9=AB=98,=E6=B6=88=E9=99=A4?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=97=E8=A1=A8=E6=BB=9A=E5=8A=A8=E6=8A=96?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 账号列表(可变行高)在 @tanstack/vue-virtual 始终开启虚拟化下,估算行高(72) 远小于真实行高(~157),滚动时每行首次测量触发滚动补偿,表现为"一跳一跳"。 - DataTable 新增 virtualizeThreshold(默认 100):行数不超过阈值时全量渲染, 彻底绕开虚拟器的估算/测量/补偿链路;超过才虚拟化,保留大列表性能 - DataTable 补 getItemKey(与模板 :key 一致的行主键):itemSizeCache 由 index 键 改为行主键,排序/筛选/跨阈值来回都复用正确的已测行高,连带修复 >阈值 档 排序即抖的既存问题 - 虚拟/全量两模式统一为 renderRows,共用同一套行与单元格;measure ref 仅虚拟模式绑定 - useSwipeSelect:全量渲染(虚拟窗口为空)时改用真实 DOM 行按坐标二分定位, 修复关闭虚拟化后滑动多选点错行的隐患;定位逻辑提取为可测的导出函数 - AccountsView:estimate-row-height 72→156 对齐真实行高;virtualize-threshold=50, 常用分页档全量渲染无抖动,pageSize=100 仍虚拟化以约束每行 AccountUsageCell 的首屏请求扇出 - 新增/强化测试:DataTable 虚拟化决策与 getItemKey、useSwipeSelect DOM 兜底定位 经三方评审会(Claude + Codex + 作者)两轮讨论达成共识后落地。 Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/src/components/common/DataTable.vue | 53 ++++++++++--- .../common/__tests__/DataTable.spec.ts | 59 +++++++++++++++ .../__tests__/useSwipeSelect.spec.ts | 74 +++++++++++++++++++ frontend/src/composables/useSwipeSelect.ts | 42 +++++++++++ frontend/src/views/admin/AccountsView.vue | 3 +- 5 files changed, 218 insertions(+), 13 deletions(-) create mode 100644 frontend/src/composables/__tests__/useSwipeSelect.spec.ts diff --git a/frontend/src/components/common/DataTable.vue b/frontend/src/components/common/DataTable.vue index d5fe57145f..e3821c3620 100644 --- a/frontend/src/components/common/DataTable.vue +++ b/frontend/src/components/common/DataTable.vue @@ -154,7 +154,7 @@ - +