feeeei
57b7dbdc85
feat(affiliate): 提取记录支持登记线下提现
...
管理员在站外给邀请人打款后,系统里原本无法扣减对应的返利额度,用户仍可把
这部分额度转入余额。现在可在「邀请返利 → 提取记录」点「登记线下提现」,
从该用户的可提取返利额度中扣除已打款金额:
- POST /api/v1/admin/affiliates/users/:user_id/withdraw,请求体只含 amount,
金额按 8 位小数舍入后校验
- 先解冻已到期的冻结额度,再以 aff_quota >= amount 为条件原子扣减,写入
action=withdraw 的流水并带额度快照;额度不足返回 AFFILIATE_QUOTA_INSUFFICIENT
- 不新增字段与迁移:线下提现复用已有 action 列区分,操作人由管理端审计日志记录
- 提取记录同时列出转入余额与线下提现,新增「类型」列
- 弹窗选择用户后展示可提取额度,支持一键填入全部;从未产生返利的用户按 0 处理
返利记录改为 LEFT JOIN 订单与被邀请人,兑换码、管理员充值来源的返利也会出现
在明细中,接口里订单相关字段与被邀请人 ID 可为 null。
2026-09-17 23:42:02 +08:00
HuntercodeT
f79b8bf96c
fix(antigravity): Gemini 原生流对 go-genai / python-genai 客户端不发 SSE 注释心跳
...
Antigravity 账号的 Gemini 原生流式路径在上游空闲超过 gateway.stream_keepalive_interval
(默认 10s)时会向下游写 ":\n\n" 作为心跳。SSE 规范允许注释行,但 Google 官方 SDK 里
go-genai 与 python-genai 都不会忽略它:
- go-genai(Antigravity CLI 在用)api_client.go iterateResponseStream 对任何非 data: 前缀的
事件直接返回 "iterateResponseStream: invalid stream chunk: :",整个流中断;
- python-genai _api_client.py 把非 data: 行当作错误 JSON 拼接后 json.loads,同样抛错。
Google 官方 API 从不下发注释行,这两个 SDK 从未处理过这种输入。js-genai 用规范的
event-stream 解析器,不受影响。
现在按下游 User-Agent / X-Goog-Api-Client 识别这两类 SDK(形如
google-genai-sdk/1.71.0 gl-go/go1.28 …、google-genai-sdk/x gl-python/3.12),命中时该路径
不再发注释心跳;其他客户端(curl、js-genai、Gemini CLI)行为不变。
生产复现:Antigravity CLI 1.2.5 经网关(sub2api 0.2.5)跑长思考请求,上游首个 chunk 超过 10s
时客户端报 "agent executor error: … iterateResponseStream: invalid stream chunk: :"。
2026-09-17 19:41:55 +08:00
cyh
e74c690ac4
fix(openai): keep transport heartbeats outside semantic output
2026-09-17 19:15:09 +08:00
Wesley Liddick
efe9aab1e4
Merge pull request #7246 from laoxiechuzheng/fix/deepseek-native-responses-tool-output-media
...
fix(deepseek): lift Responses tool output images
2026-09-17 17:02:43 +08:00
zoutao
0952ce3410
fix(apicompat): include streamed arguments in function_call_arguments.done
...
Gemini/Antigravity delivers tool arguments as one complete object, so this
converter synthesizes the Responses tool-call stream itself and therefore owns
its self-consistency. The done event was built without Arguments, leaving it ""
while the preceding delta carried the entire JSON. Clients that reconcile the
done payload against the accumulated deltas (OpenAI Responses SDK); Qoder's
reconcileToolCall) reject that mismatch as inconsistent_tool_call and abort the
turn non-retryably, so every tool call through the gateway failed.
Emit state.CurrentArgs, which closeCurrentResponsesItem already uses for the
item, restoring sum(deltas) == done.arguments == item.arguments.
Regression test asserts the delta sum equals the done payload and fails closed
when Arguments is dropped.
2026-09-17 16:54:44 +08:00
Cai
d099c06945
fix: resolve Seedance lint and gRPC security checks
2026-09-17 17:51:03 +09:00
Wesley Liddick
aeab57b9b2
Merge pull request #7256 from zhudaguaneren/fix/antigravity-attribution-429
...
fix(antigravity): 过滤 Claude attribution 元数据,修复特定请求的 429
2026-09-17 16:44:09 +08:00
Wesley Liddick
18328aed05
Merge pull request #7212 from wucm667/feat/issue-7203-redemption-pagination
...
feat(redeem): paginate user redemption history
2026-09-17 16:43:06 +08:00
Wesley Liddick
48a86ec926
Merge pull request #7224 from HypoxanthineOvO/codex/upstream-chat-role-compat
...
fix(gateway): normalize developer roles for strict native Chat upstreams
2026-09-17 16:42:31 +08:00
Wesley Liddick
b4e560824a
Merge pull request #7177 from xO-ox-ai/codex/fix-openai-response-binding-context
...
fix(openai): 客户端断开后仍持久化 Responses 续聊绑定
2026-09-17 16:42:12 +08:00
Wesley Liddick
9efc167482
Merge pull request #7195 from bitnom/fix/refresh-paused-oauth-accounts
...
fix(account): keep refreshing OAuth tokens for paused accounts
2026-09-17 16:41:54 +08:00
Wesley Liddick
5050471822
Merge pull request #7239 from Liu8Can/fix/register-promo-code-flicker
...
fix: prevent promo code field flash on registration
2026-09-17 16:41:35 +08:00
Wesley Liddick
c84a3d50a3
Merge pull request #7215 from xz-dev/fix/manifest-double-parse
...
fix(openai): parse Codex models manifest envelope once
2026-09-17 16:41:12 +08:00
Wesley Liddick
cd1834e0a9
Merge pull request #7262 from ouchihao/codex/bug-refund-balance-warning
...
fix(payment): base refund balance warnings on the requested amount
2026-09-17 16:41:00 +08:00
Wesley Liddick
0932e8ce0a
Merge pull request #7266 from ouchihao/codex/bug-subscription-loading-reset
...
fix(subscriptions): reset loading when clearing state
2026-09-17 16:40:44 +08:00
Wesley Liddick
ffa43607e5
Merge pull request #7236 from ouchihao/codex/bug-payment-amount-input
...
fix(payment): restore accepted text after invalid amount input
2026-09-17 16:40:33 +08:00
Wesley Liddick
57e9f6a4b8
Merge pull request #7238 from ouchihao/codex/bug-model-tag-tab-navigation
...
fix(channels): allow tabbing out of an empty model input
2026-09-17 16:40:23 +08:00
Wesley Liddick
71c0eb5126
Merge pull request #7184 from ouchihao/codex/bug-totp-error-messages
...
fix(totp): display normalized API error messages
2026-09-17 16:40:07 +08:00
Wesley Liddick
10fd1ada28
Merge pull request #7182 from ouchihao/codex/bug-orders-filter-page
...
fix(payment): reset the order page when changing status
2026-09-17 16:39:53 +08:00
Wesley Liddick
53fd5f8351
Merge pull request #7183 from ouchihao/codex/bug-proxy-test-dedup
...
fix(proxies): reuse in-flight test guards during batch testing
2026-09-17 16:39:34 +08:00
Wesley Liddick
55bde0857f
Merge pull request #7185 from ouchihao/codex/bug-announcement-read-results
...
fix(announcements): preserve successful bulk read results
2026-09-17 16:39:16 +08:00
Wesley Liddick
5f75e0d2a7
Merge pull request #7186 from ouchihao/codex/bug-clipboard-fallback-error
...
fix(clipboard): report errors thrown by the copy fallback
2026-09-17 16:38:55 +08:00
Wesley Liddick
efd86c63e6
Merge pull request #7235 from ouchihao/codex/bug-totp-setup-input-sync
...
fix(auth): keep TOTP setup digits in sync with state
2026-09-17 16:38:37 +08:00
Wesley Liddick
ea68c0e82c
Merge pull request #7263 from ouchihao/codex/bug-dialog-title-ids
...
fix(ui): keep dialog title IDs unique across instances
2026-09-17 16:38:16 +08:00
Wesley Liddick
40e7ce7fbf
Merge pull request #7265 from ouchihao/codex/bug-payment-config-await
...
fix(payment): await in-flight configuration requests
2026-09-17 16:37:54 +08:00
Wesley Liddick
d52ab27def
Merge pull request #7173 from HuntercodeT/fix/gemini-native-mixed-model-listing
...
fix(gemini): discover Antigravity mappings in native model lists
2026-09-17 16:37:38 +08:00
Wesley Liddick
7e4164c1cf
Merge pull request #7207 from HuntercodeT/fix/group-usage-summary-seq-scan
...
fix: 分组用量汇总不再全表扫 usage_logs(48.7s → 34ms)
2026-09-17 16:37:21 +08:00
Wesley Liddick
44831bb854
Merge pull request #7261 from HuntercodeT/chore/bump-grpc-1.83.2
...
chore(deps): 升级 google.golang.org/grpc 到 v1.83.2,修复 govulncheck 报告的 GO-2026-6443 / GO-2026-6348
2026-09-17 16:36:57 +08:00
Wesley Liddick
131893e449
Merge pull request #7237 from ouchihao/codex/bug-platform-quota-negative
...
fix(admin): reject negative platform quota limits before saving
2026-09-17 16:36:34 +08:00
Wesley Liddick
4daabc3d84
Merge pull request #7234 from ouchihao/codex/bug-pagination-jump-number
...
fix(pagination): handle numeric jump input
2026-09-17 16:36:23 +08:00
laoxiechuzheng
acc05620cb
fix(deepseek): keep parallel Responses tool outputs contiguous
2026-09-17 15:45:56 +08:00
chihao.ou
406be7c518
fix(subscriptions): reset loading when clearing state
2026-09-17 14:59:43 +08:00
chihao.ou
b51f0759d4
fix(payment): await in-flight configuration requests
2026-09-17 14:58:46 +08:00
chihao.ou
be313735dc
fix(ui): keep dialog title IDs unique across instances
2026-09-17 14:56:58 +08:00
chihao.ou
017e9e98d1
fix(payment): base refund balance warnings on the requested amount
2026-09-17 14:56:33 +08:00
HuntercodeT
611c30f04f
chore(deps): 升级 google.golang.org/grpc 到 v1.83.2 修复 govulncheck 报告的两条公告
...
Security Scan / backend-security 自 2026-09-16 起在所有 PR 上失败,govulncheck 对
google.golang.org/grpc v1.82.1 报:
- GO-2026-6443 Server panic via missing authority or Host headers(修复于 v1.83.2)
- GO-2026-6348 Heap Memory Exhaustion via HTTP/2 DATA Frame Fragmentation(修复于 v1.83.1)
调用链在 pkg/pluginapi/v1/runtime.go 与 internal/service/plugin_runtime.go。
go get google.golang.org/grpc@v1.83 .2 && go mod tidy。最小版本选择连带抬升了
golang.org/x/{crypto,mod,net,sync,term,sys,text,tools}、genproto/googleapis/rpc 与
go.opentelemetry.io/otel* 的间接依赖,均为补丁级别。
2026-09-17 14:33:48 +08:00
zhudaguaneren
be4a4990ff
fix(antigravity): strip Claude attribution metadata from system prompts
2026-09-17 11:57:53 +08:00
Cai
aba34524f1
feat: support native Seedance Ark video task API
2026-09-17 04:14:14 +09:00
laoxiechuzheng
881ab1b0c6
fix(deepseek): lift Responses tool output images
...
DeepSeek native Responses rejects Codex view_image results when function_call_output.output contains input_image parts. Move media into a following user message and keep the tool output as a string so call_id pairing remains valid.
2026-09-17 01:22:22 +08:00
DanielSong
fe36f4a914
fix: prevent promo code field flash on registration
2026-09-16 18:34:52 +08:00
chihao.ou
f8e5a0d94f
fix(channels): allow tabbing out of an empty model input
2026-09-16 18:19:41 +08:00
chihao.ou
0838e0e610
fix(admin): reject negative platform quota limits before saving
2026-09-16 18:17:29 +08:00
chihao.ou
98321a054e
fix(payment): restore accepted text after invalid amount input
2026-09-16 18:17:14 +08:00
chihao.ou
ee9ac3e45f
fix(auth): keep TOTP setup digits in sync with state
2026-09-16 18:15:28 +08:00
chihao.ou
1a32b91eb2
fix(pagination): handle numeric jump input
2026-09-16 18:15:12 +08:00
HypoxanthineOvO
18bfa4bf20
fix(gateway): normalize developer roles for strict Chat upstreams
2026-09-16 16:11:43 +08:00
Xiangzhe
31f3003ff5
fix(openai): preserve manifest key validation
2026-09-16 06:15:31 +00:00
Xiangzhe
2f16e0984e
fix(openai): avoid duplicate manifest parsing
2026-09-16 06:15:25 +00:00
wucm667
a9ed218989
feat(redeem): paginate user redemption history
2026-09-16 13:19:15 +08:00
HuntercodeT
18d483c2a1
fix: 分组用量汇总不再全表扫 usage_logs
...
GET /api/v1/admin/groups/usage-summary 在有一定数据量的库上会退化成
usage_logs 全表扫。根因是 getAllGroupUsageSummaryFromRollups 里,tail CTE
的 created_at 下界 state.tail_start 由同一条 SQL 的 state CTE 算出、再用
CROSS JOIN 交给 tail:这个值对 planner 来说要到运行期才知道,既进不了
index cond,也估不准选择性,于是只能顺序扫全表再逐行过滤。
生产实测(1721 万行 usage_logs / PostgreSQL 17):
Nested Loop (actual time=28161..48334 rows=34788)
Join Filter: (ul.created_at >= state_1.tail_start)
Rows Removed by Join Filter: 17178082
-> Seq Scan on usage_logs (actual time=0.030..47567 rows=17212870)
Buffers: shared hit=12863 read=951875
Execution Time: 48720 ms
改成先读一次水位行、在 Go 侧算出 tail_start / closed_before / retained
日期,再把它们当查询参数传进来。同一套数据上:
Index Scan using idx_usage_logs_created_at on usage_logs
Index Cond: (created_at >= $7)
Execution Time: 34 ms
水位有效性的判定(恰好一行、时区名与配置一致、水位不在未来)和无效时
退化成从 epoch 全量重算的行为,与原先 SQL 里 state_values / CASE WHEN
valid 的分支逐条对应,结果口径不变。
另外读取水位的语句不加锁,不参与 #6976 那条 FOR UPDATE / FOR KEY SHARE
的阻塞链。
2026-09-16 10:11:18 +08:00