Wesley Liddick
53b4bbe736
Merge pull request #7349 from wucm667/fix/issue-7348-preserve-client-version
...
fix(settings): preserve client version on invalid user agent
2026-09-20 14:06:48 +08:00
Wesley Liddick
8bb48622a3
Merge pull request #7362 from wucm667/fix/issue-7358-preserve-account-errors
...
fix(accounts): preserve refresh errors during usage queries
2026-09-20 14:06:36 +08:00
Wesley Liddick
f28adb6ddb
Merge pull request #7387 from Brisbanehuang/codex/upstream-content-audit-typesafe
...
feat: 内容审计接入 TypeSafe AI,支持双引擎切换与独立配置
2026-09-20 13:47:14 +08:00
Wesley Liddick
19794bc46a
Merge pull request #7397 from Wei-Shaw/feat/hostservice-account-metadata
...
feat(pluginapi): HostService 账号目录返回结构化只读元数据
2026-09-20 11:39:15 +08:00
shaw
29eead917f
feat(pluginapi): HostService 账号目录返回结构化只读元数据
...
纯宿主侧改动,向后兼容。
- 契约(pkg/pluginapi/v1/plugin.proto,已重新生成):ListAccounts 增补
repeated AccountInfo accounts(保留 account_ids 向后兼容),新增 metadata_json
只读快照字段。HostServiceAPIVersion 1→2(InitHostServices 运行时协商,加法式,
旧调用方忽略新字段即可)。
- 权限边界:可见范围由清单能力经 pluginCapabilityAccountScopeGrants 推导,
ListAccounts 与 ResolveOutboundIdentity 均以该范围为权威边界。
- metadata_json 采用 denylist:剥离 Credentials 与含反向引用的关联对象
Groups/AccountGroups(避免 encoding/json 循环引用),其余字段自动透传,
数据模型新增非机密字段无需改宿主。
测试:范围/元数据/无凭据泄漏用例、denylist 反射护栏 + 循环引用安全断言、纵深过滤用例;
build/vet/gofmt、-tags unit 与 -race 全绿。
2026-09-20 11:26:19 +08:00
zhuzhihaocool-bit
fabdfb8a5b
fix(frontend): ensure Codex base URLs include /v1
2026-09-20 11:07:29 +08:00
Achord Chan
1411b7eb7e
fix(gateway): recognize Baseten reasoning budget errors
2026-09-20 11:02:06 +08:00
Brisbanehuang
1bfe0d3728
fix: sync draft audit key status and threshold defaults
2026-09-19 20:52:31 -04:00
Brisbanehuang
783a0a9830
feat(content-audit): add independent TypeSafe engine profiles
2026-09-19 20:52:31 -04:00
chihao.ou
cd2a4357c2
fix(groups): reject negative custom rates before adding
2026-09-19 19:43:39 +08:00
chihao.ou
f3a2dcabba
fix(users): ignore superseded balance history requests
2026-09-19 19:43:23 +08:00
chihao.ou
7bf3d0b585
fix(search): wait for committed IME input before searching
2026-09-19 19:43:08 +08:00
chihao.ou
cb2bb6084c
fix(users): wait for group configuration before enabling save
2026-09-19 19:42:12 +08:00
chihao.ou
00591cbe9a
fix(settings): allow retrying failed initial admin settings loads
2026-09-19 19:41:56 +08:00
chihao.ou
ba26e543f9
fix(accounts): retry default mappings after a failed fetch
2026-09-19 19:26:59 +08:00
feeeei
f6eeed3d5a
ui(users): 禁用/启用用户后原地更新该行
...
管理端用户列表点「禁用/启用」后会重新拉取整个列表:表格先换成骨架屏,
再重新请求用户列表与用量、属性、平台限额三份附属数据,滚动位置随之丢失,
连续处理多个用户时每点一次都像整页刷新。
- 请求成功后按 id 找到当前列表中的那一行,只回写 status 与 updated_at;
更新接口的响应不含 current_concurrency、subscriptions 等列表专属字段,
不能整行替换
- 更新返回时若有列表请求在途,该请求可能读到更新前的状态,此时重新拉取列表
- 按状态筛选时,被切换的行留在原地并显示新状态,可当场撤回误操作;
总数在下次刷新前不变
- 新增三条用例:原地更新且不重载列表、请求失败时该行不变、并发列表请求时回退为重载
2026-09-19 18:14:27 +08:00
chihao.ou
3b0bb60ea3
fix(groups): require integer RPM overrides before adding
2026-09-19 17:56:42 +08:00
chihao.ou
26c09b7de6
fix(users): persist cleared custom attribute hints
2026-09-19 17:56:21 +08:00
chihao.ou
4d5a4ab0e5
fix(monitor): ignore stale template picker responses
2026-09-19 17:56:04 +08:00
chihao.ou
50f79e11fc
fix(users): show errors when group replacement fails
2026-09-19 17:54:43 +08:00
chihao.ou
6b09c74e35
fix(users): keep numeric custom attribute values as strings
2026-09-19 17:54:19 +08:00
wucm667
b252821c59
fix(accounts): preserve refresh errors during usage queries
2026-09-19 17:22:39 +08:00
wucm667
68aa26477f
feat(simple): make startup default group creation optional
2026-09-19 16:47:17 +08:00
Long Li and Cursor
7e530c9d4e
fix(openai): alias DeepSeek Responses input_image with url
...
Codex sends images as input_image.image_url. DeepSeek's live /responses
decoder requires a url field and returns 422 missing field url, including
on openai-platform accounts whose base_url host is api.deepseek.com.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-19 14:55:02 +09:00
github-actions[bot]
1a9d49e16f
chore: sync VERSION to 0.2.7 [skip ci]
2026-09-19 04:29:03 +00:00
Wesley Liddick
aea725f2ea
Merge pull request #7247 from Qiaogun/codex/seedance-native-api
...
feat: 支持 Seedance / Ark 原生视频任务 API
v0.2.7
2026-09-19 12:11:17 +08:00
Wesley Liddick
74431ffad8
Merge pull request #7258 from HuntercodeT/fix/antigravity-gemini-bare-model-thinking-variant
...
fix(antigravity): Gemini 原生请求的裸模型名按 thinkingConfig 解析到 -low/-medium/-high 变体
2026-09-19 12:01:22 +08:00
Wesley Liddick
0c9e83b59c
Merge pull request #7278 from HuntercodeT/fix/antigravity-gemini-sse-comment-keepalive
...
fix(antigravity): Gemini 原生流对 go-genai / python-genai 客户端不发 SSE 注释心跳
2026-09-19 12:00:18 +08:00
Wesley Liddick
09f88865e0
Merge pull request #7294 from feeeei/feat/model-plaza-icon
...
ui(header): 手机竖屏顶栏保留模型广场图标入口
2026-09-19 11:59:46 +08:00
Wesley Liddick
1b45d21328
Merge pull request #7340 from ye4241/fix/kimi-cn-quota-403-rate-limit-pause
...
fix(ratelimit): CN coding-plan 账号配额耗尽的 403 按限流暂停调度,而非永久禁用
2026-09-19 11:59:21 +08:00
Wesley Liddick
d5cea617a5
Merge pull request #7345 from laoxiechuzheng/fix/anthropic-root-union-schema
...
fix(apicompat): 摊平 Responses→Anthropic 工具 schema 顶层联合,修复 Codex 内置工具导致的 400
2026-09-19 11:59:00 +08:00
Wesley Liddick
4275047d16
Merge pull request #7313 from baryon/contrib/deepseek-chat-reasoning-content
...
fix(openai): pass DeepSeek thinking-mode reasoning_content on chat fallback
2026-09-19 11:57:55 +08:00
Wesley Liddick
4dbcdce43c
Merge pull request #7351 from Wei-Shaw/feat/plugin-host-services-status-bridge
...
feat(plugin): generic host services + read-only status bridge channel
2026-09-19 11:57:41 +08:00
shaw
6477143533
test(plugin): check type assertions to satisfy errcheck lint
2026-09-19 11:47:14 +08:00
shaw
c63bd14a02
feat(plugin): generic host services + read-only status bridge channel
...
Extend the local plugin system's host<->plugin contract with generic,
capability-neutral facilities, so transport plugins can be built on top
without embedding plugin-specific logic in the host.
Host services (plugin dials a broker-provided HostService gRPC):
- per-plugin namespaced KV store (key/value size and TTL bounded)
- account directory: ListAccounts + ResolveOutboundIdentity, restricted to
the accounts a plugin's declared capability already covers
- InitHostServices lifecycle hook; plugins that don't implement it run
unchanged and are simply offered no host services
Read-only runtime status channel:
- HealthResponse gains an opaque, plugin-defined status_json produced
passively (no config apply, no upstream call, no side effects)
- GET /admin/plugins/:id/status (ungated) and the plugin.status UI-bridge
verb map to Health, so a status UI can poll live state without a step-up
prompt or a "test" side effect
- config.test no longer force-shows a host success toast; the plugin UI owns
result presentation, so plugins that read status do not spam toasts
Document the UI-bridge verb taxonomy (read vs mutate/test gating) and the
status contract under pkg/pluginapi.
2026-09-19 11:25:56 +08:00
wucm667
2d37088bd9
fix(settings): preserve client version on invalid user agent
2026-09-19 10:36:51 +08:00
laoxiechuzheng
a8a1a3a958
fix(apicompat): flatten root union tool schemas for Anthropic
...
Codex 会把 codex_app 等内置工具的 parameters 根节点声明成对象分支的 oneOf/anyOf,Anthropic 拒绝工具 input_schema 顶层的 oneOf/anyOf/allOf,导致 /v1/responses -> /v1/messages 直接 400。
Responses->Anthropic 转换时摊平顶层联合:属性取各分支并集,同名属性用嵌套联合保留两侧约束,required 在 oneOf/anyOf 下取分支交集、allOf 下取并集;嵌套联合保持不变。
2026-09-19 07:34:21 +08:00
Rain
4ccdead2a2
fix(proxies): skip inactive fallback targets
2026-09-19 00:51:01 +08:00
Rain
f7280213f7
fix(proxies): skip expiry writes from stale snapshots
2026-09-19 00:51:01 +08:00
ye4241 and Claude Opus 4.8
db8692d679
fix(ratelimit): pause CN coding-plan accounts on quota-exhausted 403
...
Kimi reports Coding Plan window exhaustion (5h/weekly) as a 403 with
error.type=access_terminated_error instead of 429. It fell into the
generic handleOpenAI403 escalation, so three 403s within 180 minutes
permanently disabled accounts that recover by themselves at the window
reset.
Detect the quota-exhausted 403 for CN coding-plan accounts and cool it
down exactly like the 429 path: SetRateLimited until the earliest future
window reset from the quota snapshot, falling back to a short
temp-unschedulable window when the snapshot is missing. Non-coding-plan
accounts keep the generic 403 escalation since the rolling-window
recovery mechanism does not apply to them.
Also extract cooldownCNProviderToQuotaSnapshotReset and
setCNProviderTempUnschedulable so the 429 (OpenCodeGo / Coding Plan)
and 403 branches stop carrying three copies of the same sequence.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-09-19 00:00:57 +08:00
superman2003
37238c0985
fix(openai): honor error.status when classifying in-stream failures
...
OpenAI 兼容上游(含二级中转)常把流内 error / response.failed 事件的状态码写在
error.status 上,而不是 OpenAI 使用的 error.status_code。SSE 路径只读
status_code,于是这些上游的 401/403/429/529 全部被降级成通用 502:认证失败不
再判定为凭据故障、429 不再标记限流与配额窗口、error 帧丢掉 401/429/529 的
failover 快路径,运维日志也记成 502。WS 路径的 openAIWSPayloadTransientStatus
早已同时读这两种拼写,SSE 路径一直没跟上。
把状态码路径集合抽成共享常量,让 SSE 路径与 WS 路径对齐。5xx 仍按通用上游故障
处理,不改动既有的账号状态语义。
2026-09-18 23:51:08 +08:00
chihao.ou
7b282c4f1d
fix(announcements): ignore superseded fetch results
2026-09-18 16:39:25 +08:00
chihao.ou
d054ee9af3
fix(ccswitch): trim trailing slashes before Antigravity path
2026-09-18 16:38:58 +08:00
chihao.ou
9612a70c77
fix(proxies): label newly expired proxies correctly
2026-09-18 16:38:29 +08:00
chihao.ou
24f4736f64
fix(upload): cancel superseded image reads
2026-09-18 16:37:56 +08:00
chihao.ou
9d5c8d961c
fix(dialog): keep body locked while another dialog is open
2026-09-18 16:37:03 +08:00
wucm667
7b4de8b6ae
fix(moderation): prevent reminder tags from bypassing keyword checks
2026-09-18 14:54:18 +08:00
Long Li and Cursor
bcc73f8d40
fix(openai): pass DeepSeek thinking-mode reasoning_content on chat fallback
...
Codex histories often replay encrypted-only reasoning items. After a
Responses→Chat Completions fallback, a cache miss left assistant
messages without reasoning_content and DeepSeek rejected the turn
with 400. Fill empty assistant fields with a single-space placeholder
for DeepSeek hosts, including openai-platform accounts whose base_url
points at api.deepseek.com. Existing plaintext and cache hits are
left unchanged.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-18 15:42:22 +09:00
Yoga Sakti
4805f069e4
fix(scheduler): keep account RPM config in the scheduler projection
...
`filterSchedulerExtra` 的白名单没有 `base_rpm` / `rpm_strategy` /
`rpm_sticky_buffer`,写进 `sched:meta:<id>` 的精简投影因此丢掉整套 RPM 配置。
候选过滤走 `ListSchedulableAccounts`,缓存命中时读的正是这份投影:
`isAccountSchedulableForRPM` 拿到的账号上 `GetBaseRPM()` 返回 0,`baseRPM <= 0`
直接放行,已配置限流的账号在选号阶段被当作未开启 RPM,单个自然分钟内被超额调度。
缓存未命中时回退数据库读到完整 extra,所以现象是间歇性的。
选中的账号随后由 `hydrateSelectedAccount` 从 `sched:acc:<id>` 重新水合,
RPM 计数与用户消息队列限速读的是完整账号,不受影响;缺的只是选号阶段这道门。
修法沿用投影里既有的处理方式(见 `openai_passthrough` 一组注释):把判定依赖的
键补进白名单,而不是在判定侧另开一条读取完整账号的路径。
回归测试覆盖序列化往返后的三个键:`tiered` 子用例证明缓冲被裁掉时红区会被误判成
黄区,`sticky_exempt` 子用例证明策略被裁掉时会退回三区判定。
Refs #7225
2026-09-18 13:37:58 +07:00
HuntercodeT
cfd2fc779b
fix(codex-models): 非 GPT 模型的 Codex 提示词模板去掉 GPT 身份声明,避免 Antigravity 429
...
模型目录对所有模型都用 openai.CodexBaseInstructionsForModel 填 instructions_template,
gemini / claude 等因此下发 "You are Codex, a coding agent based on GPT-5."。Codex 把它作为
instructions 发出,Antigravity 对「Codex 提示词 + GPT-5 身份」返回 429 RESOURCE_EXHAUSTED,
并让账号进入限流冷却。
OpenAI GPT 模型保持原模板;其他模型族(含 gpt-oss)去掉 "based on GPT-N" /
"You are GPT-N" 身份声明,提示词其余部分不变。
Refs #7307
2026-09-18 14:21:21 +08:00