Skip to content

Releases: EchoPing07/Buddy-2API-Go

v0.1.4

Choose a tag to compare

@EchoPing07 EchoPing07 released this 20 Aug 17:14
fix: 修复官方余额「已用额度」恒为 0(周期级数据优先 + Precise 回退)

上游 get-user-resource 对 CodeBuddy 免费/裂变包按月周期计费:账户级
CapacityUsed 恒为 0,真实已用额度落在周期级 CycleCapacityUsed。旧实现
仅提取账户级,导致前端「已用」一栏恒显 0、进度条恒满,无法反映真实用量。

主要变更
- admin: processResources 分别提取账户级与周期级容量字段,存在周期数据
  (CycleCapacityRemain 或 CycleCapacityUsed > 0)时 capacity_* 展示值
  优先取周期级,否则回退账户级,与 references/wicm84266964 effective_remain
  语义一致;周期总量缺失回退账户总量
- admin: 新增 numField helper,按 Precise → 非Precise 顺序取首个有值字段
  (nil/空串/解析失败回退,"0" 不回退),修复上游只返回非 Precise 字段或
  Precise 为空串时数值恒为 0 的健壮性缺陷
- admin: resourceAccount 新增 CycleUsed/CycleSize 字段供前端细分展示
- admin: 新增 TestProcessResourcesCyclePreferred(周期优先 3 场景)、
  TestProcessResourcesCapacityFallback(Precise 回退 4 场景)、
  TestNumField(容错 8 场景)回归测试
- admin: 修复测试日志 days_left 用 %v 打印 *int 指针地址的问题,
  新增共享 daysLeftStr helper
- admin: 新增 env 门控的实时集成测试 TestLiveResources(默认 skip,
  BUDDY2API_LIVE=1 启用,用真实令牌对照上游响应与加工结果)

影响范围
- 仅 internal/admin 余额加工逻辑与测试,不涉及数据库 schema、API 形状
  (capacity_* 字段名不变,仅值变准)、前端、指纹头、上游请求与鉴权路径
- 真实令牌实测验证:体验版包已用额度从恒显 0 修正为实时周期值(实测
  204→310 credits,随使用增长),裂变包未用保持 0

v0.1.3

Choose a tag to compare

@EchoPing07 EchoPing07 released this 20 Aug 16:17
fix: 修复 chat 流式被 10 分钟总超时强制截断,改为响应头超时并可配置

目的:
上游 chat client 此前用 http.Client.Timeout=10min 作为「全周期总超时」,
而该超时会覆盖到读完整个响应 Body——SSE 流式(含 reasoning 长思考)持续
十几分钟时即被强制截断,严重影响体验。

主要变更:
- upstream/client.go: long client 去掉总超时,改用 Transport 的
  ResponseHeaderTimeout(仅管「上游多久不开始响应即判死」);一旦进入
  流式阶段逐字节读取不再受本端总超时约束,客户端断开由请求 context 兜底。
  Transport 基于 DefaultTransport.Clone(),保留默认连接/TLS/HTTP2 行为。
- config/config.go: 新增 chat_timeout_seconds 配置字段(默认 60),
  走完整 env 覆盖 / Normalize / Update env 保护链路。
- main.go: upstream.New 传入 ChatTimeoutSeconds。
- .env.example / README.md: 登记 BUDDY2API_CHAT_TIMEOUT_SECONDS。

影响范围:
- 仅影响 chat 上游请求路径;billing / OAuth / config 等短交互(short
  client 30s)不变。
- 该值为「构建时一次性」配置(写入 Transport 后固定),未纳入 admin
  settings,改后需重启生效。
- docs/DEVELOPMENT.md 同步更新但该目录被 .gitignore 忽略,不入库。

v0.1.2

Choose a tag to compare

@EchoPing07 EchoPing07 released this 20 Aug 11:10
fix: 修复官方余额到期时间无法获取(回退 DeductionEndTime/CycleEndTime)

上游 get-user-resource 对免费/裂变包 ExpiredTime 常返回空字符串,
真正到期信息落在 DeductionEndTime(毫秒时间戳)或 CycleEndTime(日期串)。
旧实现仅读 ExpiredTime,导致额度包 expire_time 全空、days_left 为 null,
前端「到期」一栏恒显示「—」,7d/30d 临期标注与按到期排序随之失效。

主要变更
- admin: processResources 到期时间解析改用新函数 resolveExpireTime,
  按 ExpiredTime → DeductionEndTime → CycleEndTime 顺序回退选取首个有效
  值(与 references/wicm84266964-Buddy2api 契约一致),跳过空串/0/
  9999-99-99 哨兵;数字 ms 时间戳格式化为本地可读串,字符串字段原样返回
- admin: 新增 admin_test.go 覆盖三种回退路径(ExpiredTime 空→Deduction、
  ExpiredTime 有值优先用、仅 CycleEndTime)及优先级不被覆盖

影响范围
- 仅 internal/admin 到期时间解析逻辑,不影响其它字段、数据库 schema、
  API 形状与前端(quotaExpire 原本即优先显示 expire_time,后端给对即正常)
- 不涉及配置格式与鉴权路径变更

v0.1.1

Choose a tag to compare

@EchoPing07 EchoPing07 released this 20 Aug 05:22
fix: 修复并发安全缺陷并优化鉴权热路径性能

修复 review 发现的崩溃、并发阻塞与计费/日志准确性问题,
并将 Docker 默认监听调整为 0.0.0.0 以便局域网访问。

并发安全与崩溃防护
- upstream/billing: EnsureValid 与 Get 之间可能因并发登出返回 nil,
  补 nil 判断,消除空指针解引用 panic
- auth/TokenStore: 互斥锁改读写锁 + 独立刷新锁,刷新 HTTP 移出 token
  锁外执行,单飞靠「进入后重检 + 落盘前指针校验」,避免刷新期间阻塞
  所有 Get(原实现刷新全程持锁,高并发下全站卡顿最长 30s)

鉴权热路径性能
- apikey/Manager: 内存缓存全量 key(变更后 reload),去掉每请求
  SELECT 全表;RecordUsage 改异步队列,去掉 defer 同步 UPDATE;
  比对去掉 break,使总耗时与命中位置无关

计费与日志准确性
- proxy/aggregate: 工具停转重试改为累计 token(首轮 + 重试),
  不再覆盖首轮 usage 导致漏计费
- proxy/passthroughSSE: 写失败/客户端断开统一在循环出口记录
  ErrorMsg,修复「写失败型断开」日志误判为成功

错误处理与加固
- proxy/Chat: 上游非 200 不再原样透传错误体,改为解析 {code,msg}
  生成 OpenAI 风格错误,避免非 JSON/HTML 当 JSON 返回
- store: GetCache/SetCache 表名加白名单,防拼接 SQL 注入
- main: HTTP 服务异常退出改走统一关闭路径,显式关闭 DB 后再退出,
  避免跳过资源释放
- admin: 资源列表排序由 O(n²) 冒泡改 sort.Slice

部署文档
- docker-compose/README: Docker 默认监听 0.0.0.0:10082(局域网可访问),
  同步更新文档说明,公网部署需放反代加 TLS

影响范围
- 鉴权与刷新热路径的并发稳定性与吞吐提升
- 请求计费与日志更准确
- 上游错误响应规范化
- Docker 部署默认对局域网开放
- 不涉及配置格式与 API 兼容性变更

v0.1.0

Choose a tag to compare

@EchoPing07 EchoPing07 released this 19 Aug 20:23
feat: 发布准备 — README/License/Release 流水线、凭证导入导出、内嵌 Alpine.js、Docker 时区