Skip to content

Releases: nyoungo/dsfree2api

v0.6.6

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:49

变更

  • 去掉站点额度冷却:配额耗尽后不再对站点做 10 分钟冷却/候选重排,仅保留访客身份(gid)立即轮换 + 当前站点重试 + 站点内全败后跨站切换
  • 去掉每日重置检测:配额哨兵不再记录 quota reset observed(余额轮询与低额告警不变)
  • 版本号升至 0.6.6

dsfree2api v0.6.5

Choose a tag to compare

@nyoungo nyoungo released this 09 Oct 01:48

更新内容

工具调用 DSML 方言兼容(解析 / 截断 / 续写)

模型退回 DeepSeek 原生 DSML 标记(<||DSML|| calls> / invoke / parameter)输出工具调用时,解析层此前完全认不出,整段标记连同被截断的正文当普通文本透传,客户端收不到 tool_calls:

  • 新增 internal/openai/dsml.go:正则归一化 1-4 个全/半角竖线的 DSML 标签(calls 转 tool_calls),复用既有 tagged 解析路径;<|DSML|> 半角单竖线变体同样识别
  • DSML 解析优先于 JSON 候选路径,参数内容里形如 [{"name": ...}] 的片段(正被写入的文件数据)不会被抢成假调用;调用名不在请求 tools 清单内时按普通文本返回,避免散文引用被误判
  • 截断兜底:DSML 输出常缺全部闭合标签,invoke 缺闭标签时 body 取到末尾,parameter 缺闭标签时值取到下一个同名开标签或末尾
  • 续写兼容:ToolCallTruncated 识别被截断的 DSML 标记并触发续写;续写指令按 DSML 特化(按原格式补齐闭合标签,参数内容换行按原样输出、不套 JSON 转义)
  • 流式路径不变:DSML 不走增量下发,收尾 Finalize 整体重发(与既有散文路径一致)
  • prompt 指令层保留 JSON 禁令:JSON 仍是保证完整送达的主路径

测试

  • 新增 dsml_test.go 12 个用例:双全角完整/截断样本、单竖线变体、裸 invoke、散文保留、参数内容不被 JSON 抢、未知工具名拒绝、围栏内不解析、归一化映射、截断判定、续写指令、跨轮拼接(含真实换行不被转义)
  • gofmt / go vet / go test -count=1 全绿

版本号提升到 0.6.5。

CI 会附上 linux-amd64 与 windows-amd64 二进制及其 sha256。

dsfree2api v0.6.4

Choose a tag to compare

@nyoungo nyoungo released this 08 Oct 16:53

更新内容

额度耗尽即时重置

  • 站点当日额度耗尽(sse quota exhausted)时,命中错误当场轮换访客身份(dsgt_gid),不再等退避、也不依赖 auto_refresh;后续路由与下一次请求立刻用新身份
  • 复用既有的 RotateGuest 实现,只换访客 cookie,不额外发起挑战求解
  • 新增 de / es / fr 三站额度文案识别(guthaben/aufgebraucht、agotado、épuisé/consomm、以及英文 quota/exhausted),三站返回内容不同也能正确归类
  • quota_notice 信封(type=quota_notice / notice 对象)在通用 error 门之前判定,没有 error 字段的额度通知不再被当成静默 delta 吞掉
  • cache message 失败与非 2xx 响应体按同样规则归类:额度问题会触发轮换与跨站 failover,而不是被当成普通错误

OpenAI 兼容层

  • 工具调用解析重写:XML、DSML 未加引号键、fence 内跳过、参数外溢等形状都能解析,并按请求携带的 tools 过滤工具名
  • 新增 GET /v1/responses/{id} 与 previous_response_id 有界状态缓存(进程内、TTL、store=false 不写入)
  • /v1/chat/completions 支持 Idempotency-Key 幂等回放(1 MiB 上限、24h TTL、并发去重)
  • 模型别名与 default_model 降级;错误体统一输出 param / code

控制台

  • 登录改用 bcrypt 校验(已配置的 bcrypt 值直接使用,明文先 SHA-256 再哈希,避开 72 字节上限)
  • 同一客户端 5 次失败登录锁定 5 分钟,返回 429 并带 Retry-After

其他

  • 补 e2e 修复场景与 docs/compat-audit.md 兼容性审计
  • 版本号提升到 0.6.4

CI 会附上 linux-amd64 与 windows-amd64 二进制及其 sha256。

dsfree2api v0.6.3

Choose a tag to compare

@nyoungo nyoungo released this 08 Oct 09:42

更新内容

  • 工具调用指令显式禁止 DSML/XML 标记方言(<|DSML|> calls> / invoke / parameter):模型改用 DeepSeek 原生 DSML 输出工具调用时,网关的流式、解析、续写三层都只认 JSON,DSML 回复既不会被转成 tool_calls 也不触发续写,整段标记连同被截断的正文会当普通文本透传给客户端;现在在注入的 TOOL INSTRUCTIONS 中明令只接受 JSON 格式
  • 三个接口(/v1/chat/completions、/v1/messages、/v1/responses)共用 BuildPrompt 注入点,一处改动同时生效
  • 新增红绿回归测试 TestToolsPromptForbidsDSML

验证

  • gofmt / go vet / go test -count=1 / go test -race -count=1 全部通过
  • 本地已构建 0.6.3 二进制并重启服务验证 -version 输出

dsfree2api v0.6.2

Choose a tag to compare

@github-actions github-actions released this 08 Oct 07:19

更新内容

  • 控制台 Turnstile 页重组:三种 Token 获取方式收进「Token 获取方式」一张卡分段切换,Sitekey / Action 归入方式 1 字段区(全局兜底),「Cookie 池预热」与「Cookie 池」合并,求解恒开启、不再提供关闭开关
  • 控制台代理线路页重组:顶部「基础线路 / 代理池」页签分组,页签跨重渲染保留;原「代理池 · Xray 核心」拆为「代理池 · 基础」与「Xray 核心」两张卡,「降级策略」更名「限流与故障切换」
  • Chat 接口拒绝 n>1(此前静默丢弃多余 choice),返回 400 结构化错误
  • Responses 接口透传 text.format(json_schema / json_object),Chat / Messages / Responses 三种接口协议对齐
  • TLS 指纹统一升级 Chrome_150,与默认 UA 匹配
  • 指标落盘失败不再静默:Save() 返回错误并记录日志,临时文件写失败会清理
  • GET /api/config 脱敏 admin.password 与 turnstile.api_key(控制台从不展示,不再随轮询下发);PUT 配置改为先校验后替换、失败回滚,坏 payload 不会留下半应用状态
  • set_limits / set_turnstile 改为指针部分更新:缺字段保持现状,不会把并发闸门、限流或求解开关按零值清掉
  • 请求体读取统一 64MB 上限;配置写盘改为原子替换 + 0600 权限
  • 进程退出清理统一挂 defer:日志落盘、指标落盘与 xray 子进程回收覆盖所有退出路径(含启动失败),杜绝孤儿 xray
  • 代码审查修复批次补齐 14 个回归测试文件,race 下全绿

验证

  • gofmt / go vet / go test -count=1 / go test -race -count=1 全部通过
  • 控制台两页改版已随 embed 二进制构建,本地运行确认新结构下发

dsfree2api v0.6.1

Choose a tag to compare

@github-actions github-actions released this 07 Oct 17:08

升级内容

  • 带工具的请求不再整体缓冲:tool_calls 参数按 OpenAI Chat / Anthropic Messages / Responses 三种接口协议增量下发,长任务实时逐段输出,不再等到全部生成完才一次性返回
  • 修复普通流式回复末尾重复发送全文的问题
  • 支持模型先写一段说明、再输出工具 JSON 的回复格式(解析、续写、增量提取三处同步放开前缀限制)
  • 流式发送与最终解析统一使用同一套转义规则:非法转义自动加倍反斜杠、控制字符统一转义,客户端拼接结果始终是合法 JSON
  • 对齐后如仍出现差异,日志会记录首个差异点上下文,便于定位
  • 新增 drip 计时探针(由环境变量开启)与多项增量提取、前缀解析的单元测试

验证

  • go vet 与 go test 全量通过
  • 实测三种接口的流式输出、先说明后工具的回复、截断续写拼接(流式与非流式)全部通过

dsfree2api v0.6.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 15:21

升级内容

  • 额度按访客身份重置:站点的每日免费额度绑定在匿名访客标识上(这就是新开隐私窗口额度会回满的原因)。现在请求撞到额度时会自动轮换访客身份,1 秒内拿到新身份的满额配额继续服务,不再触发十几秒的 Turnstile 重新求解;恢复成功后自动解除该站点的临时降级。
  • 额度查询接口接入:内置站点余额查询(/wp-json/dsgt/v1/balance),返回当日额度的已用 / 剩余 / 上限与重置周期,无需任何额外凭据。
  • 管理台新增两个按钮:站点卡片上新增「额度」(查询当前已用与剩余)和「重置」(换发新访客身份、额度即刻回满并回显结果)。
  • 恢复后自动记录余额:每次额度自愈成功都会异步探测并在日志中输出 site balance remaining=…,便于观察消耗节奏。
  • 日志增强:额度撞墙、身份轮换、额度恢复、冷却解除各自有明确日志,重复错误仍自动降噪。

对应提交:08464a2 753b495 4cc4504

dsfree2api v0.5.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 14:43

升级内容

  • 截断处强制补全:工具调用 JSON 被上游单回复输出上限截断时,先按 continue_rounds 自动多轮续写拼接;仍不闭合的,会在截断点就近选取锚点、自动补齐括号与引号,返回「写到哪算哪」的部分工具调用,由客户端下一轮接着写,整段回复不再作废。
  • 解析多级修复:自动丢弃 JSON 尾部多余内容、修复被截断的字符串转义与裸引号;修复后仍非法才判定失败。
  • 额度站点降级与日志去重:检测到站点当日额度用尽后,同款模型的请求优先走其他站点,该站点临时降级 10 分钟,不再每轮重复撞额度;重复错误 30 秒内只记一次、其余降为 DEBUG,日志不再刷屏。
  • 两阶段恢复:额度类错误先做轻量刷新重试,仍失败才触发完整验证流程,减少不必要的等待。
  • 缓存拒绝快速切换:上游以「消息为空」为由拒绝(实际内容非空)时不再空转刷新,直接切换到镜像站点继续服务。
  • 日志语义修正:只有真实的故障切换才记录跨站切换日志;冷却状态只在状态迁移时记录一次。
  • 默认续写轮数提升至 20:continue_rounds 可在配置中调整,0 = 不续写、截断直接补全返回。
  • 文档与配置示例同步更新,新增多项回归测试。

对应提交:9758822 403ab48 f30049b

dsfree2api v0.4.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 12:39

Full Changelog: v0.3.0...v0.4.0

v0.3.0

Choose a tag to compare

@nyoungo nyoungo released this 07 Oct 09:49

v0.3.0