Repository navigation
Releases: zhuweiyou/oc2api
Releases · zhuweiyou/oc2api
Release list
v3.0.0
v2.9.0
v2.8.0
v2.7.0
feat: 客户端工具统一使用上游别名,双向映射名称
上游还会校验 edit 等其它内置工具,只改 read/shell 仍会拒绝完整客户端工具集。
所有客户端工具统一改用 oc2api_ 前缀别名,参数 schema、调用 ID 与工具结果保持不变;
tool_choice 与历史 tool_calls / function_call / function 结果消息同步改名,响应层还原原名。
跨帧名字先等到能确定映射再发出,参数增量不缓冲;保留工具被调用或名字不完整时按错误
结束,不下发客户端可执行的原名。DEBUG 日志补充工具名与别名映射,不记录用户消息正文。
同步升级版本号到 2.7.0。
v2.6.0
v2.5.0
fix: 按上游算法生成 Zen 免费层 session ID
上游 1.19.0 将 x-opencode-session 从形状校验改为算法校验:
首 12 位必须是 descending() 的 ~(timestamp * 0x1000 + counter) 高 48 位,
旧的 26 位随机 hex 一律被判为 FreeTierError 403。
- 新增 sessionId(),按 packages/schema/src/identifier.ts 的算法生成
- getSession() 改用新生成器
- session 校验断言更新为新格式 ses_ + 12 位 hex + 14 位 base62(30 字符)
v2.4.0
v2.3.0
【新增】
- 流式工具调用稳定 index 归一:上游常不下发
index(实测 10 轮中 12/36 帧缺失),现按 choice 独立维护映射,保证同一调用 index 稳定、不同调用不串线。已线上验证:一次请求返回两个并行调用,index 正确为 0/1。 response.test.js:新增 51 个用例,覆盖完成判定、工具索引、SSE 分块边界、背压、尾段 usage。zen.test.js:新增 11 个用例,覆盖门禁条件、字段透传、危险键名、session 生命周期。- 请求门面校验:
model非空字符串、messages非空数组,不合法直接 400 且不请求上游。 - 危险键名过滤:
__proto__/constructor/prototype不转发给上游。 - 有界缓冲与超时分层:建连 60s、首帧 30s、空闲 120s、尾段 1s;无内容帧缓冲上限恒定,异常刷屏时内存保持 O(1)。
- 多 choice 按 choice 独立判定:修「一个 choice 先 finish 吞掉其余 choice」。
【修复】
- 修正正文被篡改:main 会剥离正文里的
<think>标签和thinking词句。实测 main 下"I am thinking about it"被截成"I am";本分支正文原样保留。 - 修正多行
data:帧丢内容:实测 main 解析为空串,本分支正确得到内容。 - 修正截断伪装成成功:main 流式无条件补
[DONE],断流也会被当作正常完成。 - 修正网络中断裸抛异常:main 遇 socket 错误直接抛未捕获异常,现归一为响应层错误。
- 修正
finish_reason归一:带工具调用却标stop时归一为tool_calls(对齐 opencode 官方)。 - 修正
reasoningEffort别名:恢复 camelCase → snake_case 规范化。 - 修正模型列表超时被误吞:超时不再伪装成其他错误。
【删除】
tests/node/thinking.test.js(301 行,10 个用例):随「正文剥离 think 标签」功能一并移除。相关保留语义(reasoning 归一、reasoning_effort透传)已迁入response.test.js/zen.test.js。- 正文 think 标签剥离逻辑:
stripThinkBlocks/createOpenAIStreamNormalizer等导出移除,正文不再被解析。 x-opencode-project: global请求头:已实测无影响(真实请求 200)。
【变更】
- 门禁工具 5 个 → 2 个:
bash/edit/glob/grep/read精简为bash/read(已验证最小集,真实联调通过)。 - UA:去掉
ai-sdk/provider-utils/... runtime/bun/...后缀,仅保留opencode/1.18.31。 - 建连超时 5 分钟 → 60 秒。
- 请求构造改为整体透传:main 只挑 8 个字段显式转发。
- 异常响应状态码变化:截断、畸形 JSON 从
200变为429(见下方附注)。 .gitignore:忽略.vercel(本地项目关联)和.env*(环境变量,防密钥泄露)。
v2.2.0
重构:app.js 按功能域拆分 + Express Router 路由级鉴权
server/app.js960 行 → 36 行:按功能域拆为平级文件——handler.js(端点编排)、zen.js(上游客户端)、openai.js(响应转换)、middleware.js(中间件)、shared.js(共用工具)、config.js(配置)、log.js(日志)- 路由改用
express.Router:.get()/.post()声明,废除handleRequest手写 if/else 分发 - 鉴权改为路由级中间件
requireAuth:只挂受保护路由(models / chat),/、/health、/ip免鉴权,删除handleOpenAI中的重复鉴权 - 未知路径行为变更:未注册路径统一返回 404(不再先鉴权返回 401),已用新测试固化
- CORS 改用
cors库:显式配置GET, POST, OPTIONS、固定请求头列表、X-Request-Id暴露、OPTIONS → 204,与原行为一致 - 移除 Node↔Fetch 适配层:删
isWebRequest/nodeRequestToFetchRequest/sendNodeResponse/handler导出,处理器直读原始 body、直写res(SSE 管道带背压处理,无 body 大小限制) - 配置集中到顶层
config对象:version/apiKey/debug/port启动时从环境初始化,运行期可覆盖(测试直接改config.apiKey) - 修复日志 bug:
DEBUG="false"字符串是真值导致日志误开,改为启动时=== "true"归一成布尔 - 入口简化:删除
isMainModule判断,startServer收进app.js,index.js变纯启动脚本(npm start/ Docker CMD 不变) - 版本号取自
package.json:import ... with { type: "json" }(Node 24 实测通过),发版只需npm version,无需改代码 - 测试:改为直接 import 目标方法(不再经 app 导出
__test),新增 404 语义 / 尾斜杠 / 公开路由免鉴权 3 个测试 - 文档:README 架构小节更新并移至文末