logo
1
0
WeChat Login

/Release/v2.0.6

OpenCode DMXAPI v2.0.6
OverviewDeployMetadata

OpenCode DMXAPI 配置工具 v2.0.6

一键配置 OpenCode 使用 DMXAPI 服务的跨平台工具。


♻️ 重构

  • 用 charmbracelet/huh 替代手写终端控制代码
  • 删除 6 个平台相关的 menu*.go 文件(手写 termios/raw mode)
    - 重写 collector.go:Select/Input 基于 huh,内置验证和密码模式
    - display.go:PrintStep 改为 [N/M] 格式
    - main.go:删除 collectWithRetry,简化流程(huh Validate 内置重试)
    - 彻底解决 macOS 方向键失效问题
  • 修复 URL 规范化、Google model URL 编码,删除 3 个死代码函数
  • reader.go: 用 NormalizeBaseURL() 替换手写的 /v1 后缀截断逻辑
    - test.go: Google API URL 中对 model 名做 url.PathEscape,防止含 / 的模型名破坏 URL 路径
    - display.go: 删除死代码 PrintSystemInfo()
    - reader.go: 删除死代码 HasExistingConfig()
    - path.go: 删除死代码 GetOS()
    - main.go: 摘要输出改用 config.NormalizeBaseURL() 替代 strings.TrimSuffix(url, "/v1")

✨ 新功能

  • 补全 4 种 provider 的联通性测试接口
  • Google Gemini: 使用 /v1beta/models/:generateContent,key 通过 URL 参数传递
    - OpenAI Responses: 使用 /v1/responses,input 字段,检查 HTTP 200
    - ProviderAnthropic / ProviderOpenAI: 保持原有逻辑不变
    - TestConnection 改用 switch 分支处理 4 种 provider
  • 启动时检测 opencode 是否已安装
    在显示欢迎横幅后、进入配置流程前,检测 PATH 中是否存在 opencode 可执行文件,
    并尝试获取版本号。未安装时提示用户访问 https://opencode.ai 并退出。
  • 配置模式改为上下键交互选择菜单
  • Windows 下实现真正的上下键交互菜单
    用 syscall 调用 Windows API(kernel32.dll)替代原有的数字输入 fallback:
    - GetStdHandle / GetConsoleMode / SetConsoleMode 设置原始输入模式
    (去掉 ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT)
    - 同时对 stdout 开启 ENABLE_VIRTUAL_TERMINAL_PROCESSING(Windows 10+)
    - ReadConsoleInputW 读取 KEY_EVENT,捕获 VK_UP/VK_DOWN/VK_RETURN/Ctrl+C
    - ANSI 渲染逻辑与 menu_unix.go 保持一致;若 VT 开启失败则降级到 selectMenuFallback
  • 用 ASCII Art block 字符替换 PrintBanner 图标
  • 新增 DMXAPI 六字 block 字符 ASCII Art(██ 风格)
    - 新增 Version 常量(v1.0.0),方便后续统一修改
    - 副标题显示工具名 + slogan,第二行动态获取 runtime.GOOS/GOARCH
    - ASCII Art 及标题使用青色/蓝色 ANSI 颜色
  • 检测到现有配置时先展示当前配置信息
  • PrintExistingConfigInfo 标题改为'检测到现有 DMXAPI 配置'
    - 模型列表用逗号分隔替代 %v 格式
    - 在配置模式选择菜单前展示配置信息
    - 删除 runModelOnlyConfiguration 中重复的展示
    - PrintConfigModeHeader 去掉重复的'检测到现有配置'前缀
  • 添加检查更新功能(GitHub Releases API)
  • 新增 internal/ui/updater.go:异步 HTTP 检测最新 GitHub Release
    - display.go 新增 PrintUpdateNotice 打印新版本提示
    - main.go 在 PrintBanner 后启动异步检查,CheckOpencode 完成后非阻塞展示结果
  • 检查更新改用 CNB API(替换 GitHub API)
  • Darwin→macos 重命名,README/YML 安装说明详细化,版本 v2.0.5
  • 构建产物文件名 darwin-{amd64,arm64} → macos-{amd64,arm64}(.cnb.yml & release.yml)
    - macOS 安装说明拆分 Intel/Apple Silicon,各加 xattr 隔离属性移除命令
    - Linux 安装说明补充 ARM64 说明
    - README.md 新增"系统要求"章节、按平台展开"快速开始"、新增"常见问题"章节
    - 版本号 2.0.4 → 2.0.5

🐛 修复

  • Claude 模型使用 /v1/messages 接口测试联通性
    调用 config.ClassifyModel 区分 provider 类型,claude 模型走
    Anthropic Messages API(/v1/messages,含 max_tokens 字段),
    其余模型保持原有 /v1/chat/completions 逻辑不变。

  • 全面代码审查和多平台兼容性修复

  • api/test.go: Google Gemini 测试加 Authorization: Bearer 头(修复
    认证缺失 bug),URL 改用 /v1/models/ 与 opencode 配置一致
    - api/test.go: OpenAI Responses API 测试增加响应体解析和 output
    非空验证,与其他 provider 行为一致
    - api/test.go: GeminiResponse.Candidates 改为具名结构体 GeminiCandidate
    - api/test.go: 新增 OpenAIResponsesResponse 响应结构体
    - menu_term_darwin.go / menu_term_linux.go: VMIN=1,VTIME=0 改为
    VMIN=0,VTIME=1(100ms 超时),修复孤立 ESC 按键导致菜单阻塞问题
    - menu_unix.go: 处理 VTIME 超时返回 n=0 的情况
    - validator.go: 移除从未被调用的 ValidateInput 函数
    - collector.go: 移除因 ValidateInput 删除而孤立的 UserInput 类型

  • 修复终端阻塞、URL重复拼接和配置文件权限三个高优先级bug

  • menu_term_darwin.go: VMIN=0/VTIME=1 超时模式,避免单独按ESC时read永久阻塞
    - config.go: 使用 TrimSuffix 防止 URL 已含 /v1 时重复拼接为 /v1/v1
    - writer.go: 配置文件和备份文件权限从 0644 改为 0600,防止 API Key 泄露

  • 修复URL双重拼接、API响应大小限制、配置合并等7个问题

  • H1/H2: NewTester和配置摘要中规范化URL,避免/v1双重拼接
    - M1: opencode --version 使用 exec.CommandContext 加 10 秒超时
    - M2: API 响应读取使用 io.LimitReader 限制最大 1MB
    - M3: WriteAuth 写入前先备份现有认证文件
    - M4: 配置合并使用 map[string]interface{} 保留未知 JSON 字段
    - M5: 统一使用包级别共享 stdinReader 避免 bufio.Reader 冲突

  • Gemini API URL 路径从 v1 改为 v1beta
    v1beta 端点支持更多 Gemini 模型和最新功能,与 opencode 配置保持一致。

  • Google provider baseURL 使用 /v1beta 而非 /v1
    @ai-sdk/google SDK 默认 baseURL 为 /v1beta,拼接请求时直接追加
    /models/{model}:generateContent,不会自动添加版本前缀。
    将 ProviderGoogle 的 baseURL 从 /v1 改为 /v1beta 以匹配 SDK 预期。

  • BaseURL 规范化支持 /v1beta 等版本后缀
    新增 NormalizeBaseURL 函数,使用正则统一去除 URL 末尾的版本路径后缀
    (/v1、/v1beta、/v1beta1 等),再根据 provider 类型拼接正确的版本路径,
    避免用户传入带版本后缀的 URL 时产生双重拼接问题。

  • 重新设计CLI界面风格并修复macOS终端方向键失效

  • 消除bufio.Reader与raw mode的stdin争抢,修复macOS方向键

  • 移除包级别 stdinReader 避免启动时即缓冲 os.Stdin 数据
    - collector.go 各函数改为局部创建 bufio.Reader
    - selectMenuImpl 进入 raw mode 后先 drainStdin() 清除残留数据
    - makeTerminalRaw 设置后读回 termios 验证 VMIN/VTIME 正确性

  • 修复 7 个多平台兼容性问题
    问题1 - display.go: 新增 supportsUnicode() 检测(Windows 检查代码页65001),
    symbol() 函数为旧版 CMD 提供 ASCII 降级映射(✓→[OK] ✗→[X] 等),
    PrintBanner 在不支持 Unicode 时使用纯 ASCII 横幅

        问题2 - display.go: supportsColor() 新增 COLORTERM、Git Bash/MSYS2(MSYSTEM)、
          xterm/cygwin TERM 前缀检测,完整覆盖 Windows PowerShell 及常见终端
    
        问题3 - display_windows.go: 首次调用 supportsColor() 时通过 SetConsoleMode
          主动启用 ENABLE_VIRTUAL_TERMINAL_PROCESSING(Windows 10+),
          display_nonwindows.go 提供空操作存根;sync.Once 缓存检测结果
    
        问题4 - collector.go: 各 huh 调用增加 isTTYError() 判断,失败时 fallback
          到 bufio 文本输入(fallbackInput)和数字选择(fallbackSelect)
    
        问题5 - collector.go: 使用 mattn/go-isatty 在调用 huh 前检测 TTY,
          非 TTY 环境(管道/脚本)直接走 fallback 分支
    
        问题6 - path.go: 确认 opencode 在 Windows 上同样使用 ~/.config/opencode/
          路径(XDG 约定),保持现状并补充注释说明
    
        问题7 - path.go + writer.go: 将 Windows 权限警告移至 EnsureDir,
          sync.Once 保证全程只输出一次,移除 writer.go 中的重复输出
    

🔧 杂项

  • 版本号更新至 v2.0.4
  • Bump version to 2.0.6

📥 下载

平台架构文件
Windowsx64opencode-dmxapi-v2.0.6-windows-amd64.exe
Linuxx64opencode-dmxapi-v2.0.6-linux-amd64
LinuxARM64opencode-dmxapi-v2.0.6-linux-arm64
macOSIntelopencode-dmxapi-v2.0.6-macos-amd64
macOSApple Siliconopencode-dmxapi-v2.0.6-macos-arm64

🛠️ 安装说明

Windows

# 下载后直接运行
.\opencode-dmxapi-v2.0.6-windows-amd64.exe

Linux (x64)

chmod +x opencode-dmxapi-v2.0.6-linux-amd64
./opencode-dmxapi-v2.0.6-linux-amd64

Linux (ARM64)

chmod +x opencode-dmxapi-v2.0.6-linux-arm64
./opencode-dmxapi-v2.0.6-linux-arm64

macOS (Intel)

chmod +x opencode-dmxapi-v2.0.6-macos-amd64
# 移除隔离属性(首次运行需要)
xattr -dr com.apple.quarantine opencode-dmxapi-v2.0.6-macos-amd64
./opencode-dmxapi-v2.0.6-macos-amd64

macOS (Apple Silicon)

chmod +x opencode-dmxapi-v2.0.6-macos-arm64
# 移除隔离属性(首次运行需要)
xattr -dr com.apple.quarantine opencode-dmxapi-v2.0.6-macos-arm64
./opencode-dmxapi-v2.0.6-macos-arm64

🔗 相关链接

Attachment
2026-03-10 11:17:07
2026-03-10 11:17:07