Skip to content

Commit fd76294

Browse files
committed
Remove deprecated Gemini image models and tidy related code
1 parent b7237e1 commit fd76294

13 files changed

Lines changed: 68 additions & 71 deletions

File tree

backend/internal/domain/constants.go

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,10 @@ var DefaultAntigravityModelMapping = map[string]string{
103103
"claude-haiku-4-5": "claude-sonnet-4-6",
104104
"claude-haiku-4-5-20251001": "claude-sonnet-4-6",
105105
// Gemini 2.5 白名单
106-
"gemini-2.5-flash": "gemini-2.5-flash",
107-
"gemini-2.5-flash-image": "gemini-2.5-flash-image",
108-
"gemini-2.5-flash-image-preview": "gemini-2.5-flash-image",
109-
"gemini-2.5-flash-lite": "gemini-2.5-flash-lite",
110-
"gemini-2.5-flash-thinking": "gemini-2.5-flash-thinking",
111-
"gemini-2.5-pro": "gemini-2.5-pro",
106+
"gemini-2.5-flash": "gemini-2.5-flash",
107+
"gemini-2.5-flash-lite": "gemini-2.5-flash-lite",
108+
"gemini-2.5-flash-thinking": "gemini-2.5-flash-thinking",
109+
"gemini-2.5-pro": "gemini-2.5-pro",
112110
// Gemini 3 白名单
113111
"gemini-3-flash": "gemini-3-flash",
114112
"gemini-3-pro-high": "gemini-3-pro-high",
@@ -121,13 +119,6 @@ var DefaultAntigravityModelMapping = map[string]string{
121119
"gemini-3.1-pro-low": "gemini-3.1-pro-low",
122120
// Gemini 3.1 preview 映射
123121
"gemini-3.1-pro-preview": "gemini-3.1-pro-high",
124-
// Gemini 3.1 image 白名单
125-
"gemini-3.1-flash-image": "gemini-3.1-flash-image",
126-
// Gemini 3.1 image preview 映射
127-
"gemini-3.1-flash-image-preview": "gemini-3.1-flash-image",
128-
// Gemini 3 image 兼容映射(向 3.1 image 迁移)
129-
"gemini-3-pro-image": "gemini-3.1-flash-image",
130-
"gemini-3-pro-image-preview": "gemini-3.1-flash-image",
131122
// 其他官方模型
132123
"gpt-oss-120b-medium": "gpt-oss-120b-medium",
133124
"tab_flash_lite_preview": "tab_flash_lite_preview",

backend/internal/pkg/gemini/models.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ func DefaultModels() []Model {
2020
return []Model{
2121
{Name: "models/gemini-2.0-flash", SupportedGenerationMethods: methods},
2222
{Name: "models/gemini-2.5-flash", SupportedGenerationMethods: methods},
23-
{Name: "models/gemini-2.5-flash-image", SupportedGenerationMethods: methods},
2423
{Name: "models/gemini-2.5-pro", SupportedGenerationMethods: methods},
2524
{Name: "models/gemini-3-flash-preview", SupportedGenerationMethods: methods},
2625
{Name: "models/gemini-3-pro-preview", SupportedGenerationMethods: methods},
2726
{Name: "models/gemini-3.1-pro-preview", SupportedGenerationMethods: methods},
2827
{Name: "models/gemini-3.1-pro-preview-customtools", SupportedGenerationMethods: methods},
29-
{Name: "models/gemini-3.1-flash-image", SupportedGenerationMethods: methods},
3028
}
3129
}
3230

backend/internal/pkg/geminicli/models.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ type Model struct {
1313
var DefaultModels = []Model{
1414
{ID: "gemini-2.0-flash", Type: "model", DisplayName: "Gemini 2.0 Flash", CreatedAt: ""},
1515
{ID: "gemini-2.5-flash", Type: "model", DisplayName: "Gemini 2.5 Flash", CreatedAt: ""},
16-
{ID: "gemini-2.5-flash-image", Type: "model", DisplayName: "Gemini 2.5 Flash Image", CreatedAt: ""},
1716
{ID: "gemini-2.5-pro", Type: "model", DisplayName: "Gemini 2.5 Pro", CreatedAt: ""},
1817
{ID: "gemini-3-flash-preview", Type: "model", DisplayName: "Gemini 3 Flash Preview", CreatedAt: ""},
1918
{ID: "gemini-3-pro-preview", Type: "model", DisplayName: "Gemini 3 Pro Preview", CreatedAt: ""},
2019
{ID: "gemini-3.1-pro-preview", Type: "model", DisplayName: "Gemini 3.1 Pro Preview", CreatedAt: ""},
21-
{ID: "gemini-3.1-flash-image", Type: "model", DisplayName: "Gemini 3.1 Flash Image", CreatedAt: ""},
2220
}
2321

2422
// DefaultTestModel is the default model to preselect in test flows.

backend/internal/repository/account_share_policy_repo.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,8 @@ func accountSharePolicyWhere(filters service.AccountSharePolicyFilters) (string,
218218
args := make([]any, 0, 3)
219219
add := func(condition string, arg any) {
220220
args = append(args, arg)
221-
where.WriteString(" AND ")
222-
where.WriteString(fmt.Sprintf(condition, len(args)))
221+
_, _ = where.WriteString(" AND ")
222+
_, _ = where.WriteString(fmt.Sprintf(condition, len(args)))
223223
}
224224
if scopeType := strings.TrimSpace(filters.ScopeType); scopeType != "" {
225225
add("scope_type = $%d", scopeType)

backend/internal/repository/subsite_repo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (r *subsiteRepository) List(ctx context.Context, params pagination.Paginati
124124
if err != nil {
125125
return nil, nil, fmt.Errorf("list subsites: %w", err)
126126
}
127-
defer rows.Close()
127+
defer func() { _ = rows.Close() }()
128128
items := make([]service.Subsite, 0)
129129
for rows.Next() {
130130
subsite, err := scanSubsite(rows)
@@ -459,7 +459,7 @@ func (r *accountLeaseRepository) ListActiveAccountIDsBySubsite(ctx context.Conte
459459
if err != nil {
460460
return nil, fmt.Errorf("list active lease account ids: %w", err)
461461
}
462-
defer rows.Close()
462+
defer func() { _ = rows.Close() }()
463463

464464
accountIDs := make([]int64, 0)
465465
for rows.Next() {
@@ -644,7 +644,7 @@ func (r *accountLeaseRepository) list(ctx context.Context, query string, args ..
644644
if err != nil {
645645
return nil, fmt.Errorf("list account leases: %w", err)
646646
}
647-
defer rows.Close()
647+
defer func() { _ = rows.Close() }()
648648
leases := make([]service.AccountLease, 0)
649649
for rows.Next() {
650650
lease, err := scanAccountLease(rows)

backend/internal/service/account_service_delete_test.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,20 @@ import (
1919
// 用于隔离测试 AccountService.Delete 方法,避免依赖真实数据库。
2020
//
2121
// 设计说明:
22+
// - account/getErr: 模拟 GetByID 返回的账号和错误
2223
// - exists: 模拟 ExistsByID 返回的存在性结果
2324
// - existsErr: 模拟 ExistsByID 返回的错误
2425
// - deleteErr: 模拟 Delete 返回的错误
26+
// - getIDs/existsIDs: 记录查询调用的账号 ID,用于断言验证
2527
// - deletedIDs: 记录被调用删除的账号 ID,用于断言验证
2628
type accountRepoStub struct {
29+
account *Account
30+
getErr error
2731
exists bool // ExistsByID 的返回值
2832
existsErr error // ExistsByID 的错误返回值
2933
deleteErr error // Delete 的错误返回值
34+
getIDs []int64 // 记录已查询的账号 ID 列表
35+
existsIDs []int64 // 记录已检查存在性的账号 ID 列表
3036
deletedIDs []int64 // 记录已删除的账号 ID 列表
3137
}
3238

@@ -37,16 +43,18 @@ func (s *accountRepoStub) Create(ctx context.Context, account *Account) error {
3743
}
3844

3945
func (s *accountRepoStub) GetByID(ctx context.Context, id int64) (*Account, error) {
40-
panic("unexpected GetByID call")
46+
s.getIDs = append(s.getIDs, id)
47+
return s.account, s.getErr
4148
}
4249

4350
func (s *accountRepoStub) GetByIDs(ctx context.Context, ids []int64) ([]*Account, error) {
4451
panic("unexpected GetByIDs call")
4552
}
4653

4754
// ExistsByID 返回预设的存在性检查结果。
48-
// 这是 Delete 方法调用的第一个仓储方法,用于验证账号是否存在
55+
// Delete 方法会在 GetByID 失败时使用它作为兼容性兜底
4956
func (s *accountRepoStub) ExistsByID(ctx context.Context, id int64) (bool, error) {
57+
s.existsIDs = append(s.existsIDs, id)
5058
return s.exists, s.existsErr
5159
}
5260

@@ -209,7 +217,7 @@ func (s *accountRepoStub) ResetQuotaUsed(ctx context.Context, id int64) error {
209217

210218
// TestAccountService_Delete_NotFound 测试删除不存在的账号时返回正确的错误。
211219
// 预期行为:
212-
// - ExistsByID 返回 false(账号不存在)
220+
// - GetByID 返回 nil(账号不存在)
213221
// - 返回 ErrAccountNotFound 错误
214222
// - Delete 方法不被调用(deletedIDs 为空)
215223
func TestAccountService_Delete_NotFound(t *testing.T) {
@@ -218,21 +226,29 @@ func TestAccountService_Delete_NotFound(t *testing.T) {
218226

219227
err := svc.Delete(context.Background(), 55)
220228
require.ErrorIs(t, err, ErrAccountNotFound)
229+
require.Equal(t, []int64{55}, repo.getIDs)
230+
require.Empty(t, repo.existsIDs)
221231
require.Empty(t, repo.deletedIDs) // 验证删除操作未被调用
222232
}
223233

224234
// TestAccountService_Delete_CheckError 测试存在性检查失败时的错误处理。
225235
// 预期行为:
236+
// - GetByID 返回错误
226237
// - ExistsByID 返回数据库错误
227238
// - 返回包含 "check account" 的错误信息
228239
// - Delete 方法不被调用
229240
func TestAccountService_Delete_CheckError(t *testing.T) {
230-
repo := &accountRepoStub{existsErr: errors.New("db down")}
241+
repo := &accountRepoStub{
242+
getErr: errors.New("get failed"),
243+
existsErr: errors.New("db down"),
244+
}
231245
svc := &AccountService{accountRepo: repo}
232246

233247
err := svc.Delete(context.Background(), 55)
234248
require.Error(t, err)
235249
require.ErrorContains(t, err, "check account") // 验证错误信息包含上下文
250+
require.Equal(t, []int64{55}, repo.getIDs)
251+
require.Equal(t, []int64{55}, repo.existsIDs)
236252
require.Empty(t, repo.deletedIDs)
237253
}
238254

@@ -244,6 +260,7 @@ func TestAccountService_Delete_CheckError(t *testing.T) {
244260
// - deletedIDs 记录了尝试删除的 ID
245261
func TestAccountService_Delete_DeleteError(t *testing.T) {
246262
repo := &accountRepoStub{
263+
account: &Account{ID: 55},
247264
exists: true,
248265
deleteErr: errors.New("delete failed"),
249266
}
@@ -252,6 +269,8 @@ func TestAccountService_Delete_DeleteError(t *testing.T) {
252269
err := svc.Delete(context.Background(), 55)
253270
require.Error(t, err)
254271
require.ErrorContains(t, err, "delete account")
272+
require.Equal(t, []int64{55}, repo.getIDs)
273+
require.Empty(t, repo.existsIDs)
255274
require.Equal(t, []int64{55}, repo.deletedIDs) // 验证删除操作被调用
256275
}
257276

@@ -262,10 +281,12 @@ func TestAccountService_Delete_DeleteError(t *testing.T) {
262281
// - 返回 nil 错误
263282
// - deletedIDs 记录了被删除的 ID
264283
func TestAccountService_Delete_Success(t *testing.T) {
265-
repo := &accountRepoStub{exists: true}
284+
repo := &accountRepoStub{account: &Account{ID: 55}}
266285
svc := &AccountService{accountRepo: repo}
267286

268287
err := svc.Delete(context.Background(), 55)
269288
require.NoError(t, err)
289+
require.Equal(t, []int64{55}, repo.getIDs)
290+
require.Empty(t, repo.existsIDs)
270291
require.Equal(t, []int64{55}, repo.deletedIDs) // 验证正确的 ID 被删除
271292
}

backend/internal/service/account_test_service.go

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ type TestEvent struct {
5151

5252
const (
5353
defaultGeminiTextTestPrompt = "hi"
54-
defaultGeminiImageTestPrompt = "Generate a cute orange cat astronaut sticker on a clean pastel background."
5554
defaultOpenAIImageTestPrompt = "Generate a cute orange cat astronaut sticker on a clean pastel background."
5655
openAITestMaxOutputTokens = 16
5756
)
@@ -1030,34 +1029,9 @@ func (s *AccountTestService) buildCodeAssistRequest(ctx context.Context, accessT
10301029
return req, nil
10311030
}
10321031

1033-
// createGeminiTestPayload creates a minimal test payload for Gemini API.
1034-
// Image models use the image-generation path so the frontend can preview the returned image.
1032+
// createGeminiTestPayload creates a minimal text-only test payload for Gemini API.
10351033
func createGeminiTestPayload(modelID string, prompt string) []byte {
1036-
if isImageGenerationModel(modelID) {
1037-
imagePrompt := strings.TrimSpace(prompt)
1038-
if imagePrompt == "" {
1039-
imagePrompt = defaultGeminiImageTestPrompt
1040-
}
1041-
1042-
payload := map[string]any{
1043-
"contents": []map[string]any{
1044-
{
1045-
"role": "user",
1046-
"parts": []map[string]any{
1047-
{"text": imagePrompt},
1048-
},
1049-
},
1050-
},
1051-
"generationConfig": map[string]any{
1052-
"responseModalities": []string{"TEXT", "IMAGE"},
1053-
"imageConfig": map[string]any{
1054-
"aspectRatio": "1:1",
1055-
},
1056-
},
1057-
}
1058-
bytes, _ := json.Marshal(payload)
1059-
return bytes
1060-
}
1034+
_ = modelID
10611035

10621036
textPrompt := strings.TrimSpace(prompt)
10631037
if textPrompt == "" {

backend/internal/service/auth_oauth_email_flow.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func normalizeOAuthSignupSource(signupSource string) string {
1818
switch signupSource {
1919
case "", "email":
2020
return "email"
21-
case "linuxdo", "wechat", "oidc", "github", "google":
21+
case "linuxdo", "wechat", "oidc":
2222
return signupSource
2323
default:
2424
return "email"

backend/internal/service/billing_service.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,12 @@ func (s *BillingService) initFallbackPricing() {
247247
CacheReadPricePerToken: 7.5e-8,
248248
SupportsCacheBreakdown: false,
249249
}
250+
s.fallbackPrices["gpt-5.4-nano"] = &ModelPricing{
251+
InputPricePerToken: 2e-7,
252+
OutputPricePerToken: 1.25e-6,
253+
CacheReadPricePerToken: 2e-8,
254+
SupportsCacheBreakdown: false,
255+
}
250256
// OpenAI GPT-5.2(本地兜底)
251257
s.fallbackPrices["gpt-5.2"] = &ModelPricing{
252258
InputPricePerToken: 1.75e-6,
@@ -314,6 +320,8 @@ func (s *BillingService) getFallbackPricing(model string) *ModelPricing {
314320
switch normalized {
315321
case "gpt-5.5":
316322
return s.fallbackPrices["gpt-5.5"]
323+
case "gpt-5.4-nano":
324+
return s.fallbackPrices["gpt-5.4-nano"]
317325
case "gpt-5.4-mini":
318326
return s.fallbackPrices["gpt-5.4-mini"]
319327
case "gpt-5.4":

backend/internal/subsite/agent/proxy.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (s *Server) proxyAuthorizedRequest(c *gin.Context, authorization *service.A
7676
if err != nil {
7777
return nil, fmt.Errorf("call upstream: %w", err)
7878
}
79-
defer resp.Body.Close()
79+
defer func() { _ = resp.Body.Close() }()
8080

8181
responseBody, wroteResponse, metrics, err := streamOrBufferResponse(c, resp)
8282
if err != nil {
@@ -148,7 +148,7 @@ func (s *Server) proxyOpenAIChatCompletionsViaResponses(c *gin.Context, authoriz
148148
if err != nil {
149149
return nil, fmt.Errorf("call upstream: %w", err)
150150
}
151-
defer resp.Body.Close()
151+
defer func() { _ = resp.Body.Close() }()
152152

153153
responseBody, wroteResponse, metrics, err := streamOrBufferResponse(c, resp)
154154
if err != nil {
@@ -1240,7 +1240,7 @@ func convertResponsesSSEToChatCompletionsSSE(body []byte, originalModel string)
12401240
if err != nil {
12411241
return nil, fmt.Errorf("marshal chat chunk: %w", err)
12421242
}
1243-
out.WriteString(sse)
1243+
_, _ = out.WriteString(sse)
12441244
}
12451245
}
12461246
if err := scanner.Err(); err != nil {
@@ -1251,8 +1251,8 @@ func convertResponsesSSEToChatCompletionsSSE(body []byte, originalModel string)
12511251
if err != nil {
12521252
return nil, fmt.Errorf("finalize chat chunk: %w", err)
12531253
}
1254-
out.WriteString(sse)
1254+
_, _ = out.WriteString(sse)
12551255
}
1256-
out.WriteString("data: [DONE]\n\n")
1256+
_, _ = out.WriteString("data: [DONE]\n\n")
12571257
return out.Bytes(), nil
12581258
}

0 commit comments

Comments
 (0)