cyhhao
|
31f817d189
|
fix: add newline separation for Claude Code system prompt
|
2026-01-29 01:28:43 +08:00 |
|
shaw
|
9abda1bc59
|
feat(tls): 新增 TLS 指纹模拟功能
|
2026-01-18 20:08:40 +08:00 |
|
IanShaw
|
afcfbb458d
|
fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化 (#212)
* fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化
## 后端改动
### 1. Google One 强制使用内置 Gemini CLI OAuth Client
**问题**:
- Google One 之前允许使用自定义 OAuth client,导致认证流程不稳定
- 与 Code Assist 的行为不一致
**解决方案**:
- 修改 `gemini_oauth_service.go`: Google One 现在与 Code Assist 一样强制使用内置 client (L122-135)
- 更新 `gemini_oauth_client.go`: ExchangeCode 和 RefreshToken 方法支持强制内置 client (L31-44, L77-86)
- 简化 `geminicli/oauth.go`: Google One scope 选择逻辑 (L187-190)
- 标记 `geminicli/constants.go`: DefaultGoogleOneScopes 为 DEPRECATED (L30-33)
- 更新测试用例以反映新行为
**OAuth 类型对比**:
| OAuth类型 | Client来源 | Scopes | Redirect URI |
|-----------|-----------|--------|-----------------|
| code_assist | 内置 Gemini CLI | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
| google_one | 内置 Gemini CLI (新) | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
| ai_studio | 必须自定义 | DefaultAIStudioScopes | http://localhost:1455/auth/callback |
### 2. Google One 自动获取 project_id
**问题**:
- Google One 个人账号测试模型时返回 403/404 错误
- 原因:cloudaicompanion API 需要 project_id,但个人账号无需手动创建 GCP 项目
**解决方案**:
- 修改 `gemini_oauth_service.go`: OAuth 流程中自动调用 fetchProjectID
- Google 通过 LoadCodeAssist API 自动分配 project_id
- 与 Gemini CLI 行为保持一致
- 后端根据 project_id 自动选择正确的 API 端点
**影响**:
- Google One 账号现在可以正常使用(需要重新授权)
- Code Assist 和 AI Studio 账号不受影响
### 3. 修复 Gemini 测试账号无内容输出问题
**问题**:
- 测试 Gemini 账号时只显示"测试成功",没有显示 AI 响应内容
- 原因:processGeminiStream 在检查到 finishReason 时立即返回,跳过了内容提取
**解决方案**:
- 修改 `account_test_service.go`: 调整逻辑顺序,先提取内容再检查是否完成
- 确保最后一个 chunk 的内容也能被正确显示
**影响**:
- 所有 Gemini 账号类型(API Key、OAuth)的测试现在都会显示完整响应内容
- 用户可以看到流式输出效果
## 前端改动
### 1. 修复图标宽度压缩问题
**问题**:
- 账户类型选择按钮中的图标在某些情况下会被压缩变形
**解决方案**:
- 修改 `CreateAccountModal.vue`: 为所有平台图标容器添加 `shrink-0` 类
- 确保 Anthropic、OpenAI、Gemini、Antigravity 图标保持固定 8×8 尺寸 (32px × 32px)
### 2. 优化重新授权界面
**问题**:
- 重新授权时显示三个可点击的授权类型选择按钮,可能导致用户误切换到不兼容的授权方式
**解决方案**:
- 修改 `ReAuthAccountModal.vue` (admin 和普通用户版本):
- 将可点击的授权类型选择按钮改为只读信息展示框
- 根据账号的 `credentials.oauth_type` 动态显示对应图标和文本
- 删除 `geminiAIStudioOAuthEnabled` 状态和 `handleSelectGeminiOAuthType` 方法
- 防止用户误操作
## 测试验证
- ✅ 所有后端单元测试通过
- ✅ OAuth client 选择逻辑正确
- ✅ Google One 和 Code Assist 行为一致
- ✅ 测试账号显示完整响应内容
- ✅ UI 图标显示正常
- ✅ 重新授权界面只读展示正确
* fix(lint): 修复 golangci-lint 错误信息格式问题
- 将错误信息改为小写开头以符合 Go 代码规范
- 修复 ST1005: error strings should not be capitalized
|
2026-01-08 23:47:29 +08:00 |
|
yangjianbo
|
048ed061c2
|
fix(安全): 关闭白名单时保留最小校验与默认白名单
实现 allow_insecure_http 并在关闭校验时执行最小格式验证
- 关闭 allowlist 时要求 URL 可解析且 scheme 合规
- 响应头过滤关闭时使用默认白名单策略
- 更新相关文档、示例与测试覆盖
|
2026-01-05 14:41:08 +08:00 |
|
yangjianbo
|
794a9f969b
|
feat(安全): 添加安全开关并完善测试流程
实现安全开关默认关闭与响应头透传逻辑
- URL 校验与响应头过滤支持开关并覆盖流式路径
- 非流式 Content-Type 透传/默认值按配置生效
- 接入 go test、golangci-lint 与前端 lint/typecheck
- 补充相关测试与配置/文档说明
|
2026-01-05 13:54:43 +08:00 |
|
yangjianbo
|
7dddd06583
|
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
|
2026-01-04 21:06:12 +08:00 |
|
yangjianbo
|
25a0d49af9
|
chore(合并): 同步主分支变更并解决冲突
- 合并 wire/httpclient/http_upstream/proxy_probe 冲突并保留校验逻辑
- 引入 proxyutil 及测试,完善代理配置
- 更新 goreleaser/workflow 与前端细节调整
测试: go test ./...
|
2026-01-04 20:29:39 +08:00 |
|
IanShaw027
|
a4953785d9
|
fix(lint): 修复所有 Go 命名规范问题
- 全局替换 ApiKey → APIKey(类型、字段、方法、变量)
- 修复所有 initialism 命名(API, SMTP, HTML, URL 等)
- 添加所有缺失的包注释
- 修复导出符号的注释格式
主要修改:
- ApiKey → APIKey(所有出现的地方)
- ApiKeyID → APIKeyID
- ApiKeyIDs → APIKeyIDs
- TestSmtpConnection → TestSMTPConnection
- HtmlURL → HTMLURL
- 添加 20+ 个包注释
- 修复 10+ 个导出符号注释格式
验证结果:
- ✓ golangci-lint: 0 issues
- ✓ 单元测试: 通过
- ✓ 集成测试: 通过
|
2026-01-04 19:28:20 +08:00 |
|
shaw
|
a527559526
|
fix(test): 修复claude、openai oauth账号test刷新token的bug
|
2026-01-04 17:29:34 +08:00 |
|
yangjianbo
|
bd4bf00856
|
feat(安全): 强化安全策略与配置校验
- 增加 CORS/CSP/安全响应头与代理信任配置
- 引入 URL 白名单与私网开关,校验上游与价格源
- 改善 API Key 处理与网关错误返回
- 管理端设置隐藏敏感字段并优化前端提示
- 增加计费熔断与相关配置示例
测试: go test ./...
|
2026-01-02 17:40:57 +08:00 |
|
shaw
|
81213f2324
|
refactor(service): 统一时间戳解析,支持多种格式
新增 Account.GetCredentialAsTime 方法,统一处理凭证中的时间戳字段,
兼容 RFC3339 字符串、Unix 时间戳字符串和数字类型。
- 重构 Claude/Gemini/Antigravity TokenRefresher.NeedsRefresh
- 移除重复的 parseExpiresAt/parseAntigravityExpiresAt 函数
- 简化 GetOpenAITokenExpiresAt 实现
- 新增 RFC3339 格式单元测试用例
|
2025-12-31 16:25:45 +08:00 |
|
yangjianbo
|
679b21a86c
|
Merge branch 'main' into test
冲突解决:
- wire_gen.go: 合并 antigravityGatewayService 和 ProvideConcurrencyCache
- user_repo_integration_test.go: 保留 NotFound 测试
- antigravity_gateway_service.go: 适配 httpUpstream.Do 新签名
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2025-12-31 14:17:18 +08:00 |
|
yangjianbo
|
d1c9889609
|
perf(网关): 实现上游账号连接池隔离
新增隔离策略与连接池缓存回收
连接池大小跟随账号并发并处理代理切换
同步配置默认值与示例并补充测试
|
2025-12-31 11:43:58 +08:00 |
|
song
|
aa4631640a
|
Merge branch 'main' into fix/antigravity_auth_3
|
2025-12-31 00:36:43 +08:00 |
|
shaw
|
1ecef269f7
|
fix: 去除openai-apkey账户请求路径多余的v1
|
2025-12-30 23:07:25 +08:00 |
|
song
|
5844ea7e6e
|
fix(Antigravity): 修复账号测试连接认证错误
- 新增 AntigravityGatewayService.TestConnection 方法,支持 Claude/Gemini 双协议测试
- AccountTestService 改用 AntigravityGatewayService 进行测试连接
- GetAvailableModels 为 Antigravity 账号返回 Claude + Gemini 模型列表
|
2025-12-30 22:42:00 +08:00 |
|
IanShaw027
|
2714be99a9
|
feat(test): 添加 Gemini 双响应格式支持
添加对两种 Gemini 响应格式的支持:
- AI Studio: `{"candidates": [...]}`
- Gemini CLI: `{"response": {"candidates": [...]}}`
通过 unwrap 逻辑自动检测并适配两种格式,确保账号测试功能
对所有 Gemini 账号类型都能正常工作。
合并 PR #43 的剩余功能到 PR #37
|
2025-12-26 22:31:12 +08:00 |
|
IanShaw027
|
9db52838b5
|
fix(backend): 适配重构后的架构修复 Gemini OAuth 集成
## 主要修改
1. **移除 model 包引用**
- 删除所有 `internal/model` 包的 import
- 使用 service 包中的类型定义(Account, Platform常量等)
2. **修复类型转换**
- JSONB → map[string]any
- 添加 mergeJSONB 辅助函数
- 添加 Account.IsGemini() 方法
3. **更新中间件调用**
- GetUserFromContext → GetAuthSubjectFromContext
- 适配新的并发控制签名(传递 ID 和 Concurrency 而不是完整对象)
4. **修复 handler 层**
- 更新 gemini_v1beta_handler.go
- 修正 billing 检查和 usage 记录
## 影响范围
- backend/internal/service/gemini_*.go
- backend/internal/service/account_test_service.go
- backend/internal/service/crs_sync_service.go
- backend/internal/handler/gemini_v1beta_handler.go
- backend/internal/handler/gateway_handler.go
- backend/internal/handler/admin/account_handler.go
|
2025-12-26 22:07:55 +08:00 |
|
IanShaw027
|
bfcd9501c2
|
merge: 合并 upstream/main 解决 PR #37 冲突
- 删除 backend/internal/model/account.go 符合重构方向
- 合并最新的项目结构重构
- 包含 SSE 格式解析修复
- 更新依赖和配置文件
|
2025-12-26 21:56:08 +08:00 |
|
shaw
|
2d89f36687
|
Merge PR #42: fix(sse): 修复非标准 SSE 格式解析问题
|
2025-12-26 21:31:34 +08:00 |
|
ianshaw
|
16eec4eb41
|
fix(sse): 修复非标准 SSE 格式解析问题
部分上游 API 返回的 SSE 格式不符合标准规范:
- 标准格式: `data: {...}`(冒号后有空格)
- 非标准格式: `data:{...}`(冒号后无空格)
使用预编译正则 `^data:\s*` 统一处理两种格式。
|
2025-12-26 03:49:55 -08:00 |
|
Forest
|
e5a77853b0
|
refactor: 调整项目结构为单向依赖
|
2025-12-26 16:45:40 +08:00 |
|
ianshaw
|
efa470efc7
|
fix(backend): 修复 golangci-lint 报告的问题
- gofmt: 修复代码格式问题
- errcheck: 处理 WriteString 和 Close 返回值
- staticcheck: 错误信息改为小写开头
- staticcheck: 移除无效的 nil 检查
- staticcheck: 使用 append 替换循环
- staticcheck: 使用无条件的 TrimPrefix
- ineffassign: 移除无效赋值
- unused: 移除未使用的 geminiOAuthService 字段
- 重新生成 wire_gen.go
|
2025-12-26 00:11:03 -08:00 |
|
ianshaw
|
b2d71da2a2
|
feat(backend): 实现 Gemini AI Studio OAuth 和消息兼容服务
- gemini_oauth_service.go: 新增 AI Studio OAuth 类型支持
- gemini_token_provider.go: Token 提供器增强
- gemini_messages_compat_service.go: 支持 AI Studio 端点
- account_test_service.go: Gemini 账户可用性检测
- gateway_service.go: 网关服务适配
- openai_gateway_service.go: OpenAI 兼容层调整
|
2025-12-26 00:11:03 -08:00 |
|
Forest
|
f51ad2e126
|
refactor: 删除 ports 目录
|
2025-12-25 17:15:01 +08:00 |
|
IanShaw
|
60f6ed6bf6
|
feat: CRS 同步增强 - 自动刷新 OAuth token 和修复测试配置 (#27)
* fix(service): 修复 OpenAI Responses API 测试负载配置
- 所有账号类型统一添加 instructions 字段(不再仅限 OAuth)
- Responses API 要求所有请求必须包含 instructions 参数
* feat(crs-sync): CRS 同步时自动刷新 OAuth token 并保留完整 extra 字段
**核心功能**:
- CRSSyncService 注入 OAuth 服务依赖(Anthropic + OpenAI)
- 账号创建/更新后自动刷新 OAuth token,确保可用性
- 完整保留 CRS extra 字段,避免数据丢失
**Extra 字段增强**:
- 保留 CRS 所有原始 extra 字段
- 新增同步元数据: crs_account_id, crs_kind, crs_synced_at
- Claude 账号: 从 credentials 提取 org_uuid/account_uuid 到 extra
- OpenAI 账号: 映射 crs_email -> email
**Token 刷新逻辑**:
- 新增 refreshOAuthToken() 方法处理 Anthropic/OpenAI 平台
- 保留原有 credentials 字段,仅更新 token 相关字段
- 刷新失败静默处理,不中断同步流程
**依赖注入**:
- wire_gen.go: CRSSyncService 新增 oAuthService/openaiOAuthService
* style(crs-sync): 使用 switch 替代 if-else 修复 golangci-lint 警告
- 将 refreshOAuthToken 中的 if-else 改为 switch 语句
- 符合 staticcheck 规范
- 添加 default 分支处理未知平台
|
2025-12-25 14:45:17 +08:00 |
|
Forest
|
836c4dda2b
|
refactor: 重命名 go module
|
2025-12-24 21:07:21 +08:00 |
|
shaw
|
6c469b42ed
|
feat: 新增支持codex转发
|
2025-12-22 22:58:31 +08:00 |
|
Forest
|
1e1f3c0c74
|
ci(backend): 添加 gofmt 配置
|
2025-12-20 16:19:40 +08:00 |
|
NepetaLemon
|
c6b3de1199
|
ci(backend): 添加 github actions (#10)
## 变更内容
### CI/CD
- 添加 GitHub Actions 工作流(test + golangci-lint)
- 添加 golangci-lint 配置,启用 errcheck/govet/staticcheck/unused/depguard
- 通过 depguard 强制 service 层不能直接导入 repository
### 错误处理修复
- 修复 CSV 写入、SSE 流式输出、随机数生成等未处理的错误
- GenerateRedeemCode() 现在返回 error
### 资源泄露修复
- 统一使用 defer func() { _ = xxx.Close() }() 模式
### 代码清理
- 移除未使用的常量
- 简化 nil map 检查
- 统一代码格式
|
2025-12-20 02:29:52 -05:00 |
|
Forest
|
cceada7dae
|
refactor(backend): service http ports
|
2025-12-20 11:57:02 +08:00 |
|
Forest
|
e99b344b2b
|
refactor(backend): 引入端口接口模式
|
2025-12-19 21:26:19 +08:00 |
|
shaw
|
ee86dbca9d
|
feat(account): 账号测试支持选择模型
- 新增 GET /api/v1/admin/accounts/:id/models 接口获取账号可用模型
- 账号测试弹窗新增模型选择下拉框
- 测试时支持传入 model_id 参数,不传则默认使用 Sonnet
- API Key 账号支持根据 model_mapping 映射测试模型
- 将模型常量提取到 claude 包统一管理
|
2025-12-19 16:00:09 +08:00 |
|
shaw
|
1ed93a5fd0
|
refactor: 提取 Claude 客户端常量到独立包
- 新增 internal/pkg/claude 包统一管理 Claude Code 相关常量
- 统一账号测试逻辑,所有账号类型使用相同的 Claude Code 风格请求
- 网关服务使用常量包替换硬编码的 beta header 字符串
|
2025-12-19 15:22:52 +08:00 |
|
Forest
|
236908c03d
|
refactor(backend): 拆分 Wire ProviderSet
|
2025-12-19 00:03:29 +08:00 |
|
shaw
|
642842c29e
|
First commit
|
2025-12-18 13:50:39 +08:00 |
|