Repository navigation
OpenCode DMXAPI v2.0.4
OpenCode DMXAPI 配置工具 v2.0.4
一键配置 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)
🐛 修复
-
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
📥 下载
| 平台 | 架构 | 文件 |
|---|---|---|
| Windows | x64 | opencode-dmxapi-v2.0.4-windows-amd64.exe |
| Linux | x64 | opencode-dmxapi-v2.0.4-linux-amd64 |
| Linux | ARM64 | opencode-dmxapi-v2.0.4-linux-arm64 |
| macOS | Intel | opencode-dmxapi-v2.0.4-darwin-amd64 |
| macOS | Apple Silicon | opencode-dmxapi-v2.0.4-darwin-arm64 |
🛠️ 安装说明
Windows
.\opencode-dmxapi-v2.0.4-windows-amd64.exeLinux
chmod +x opencode-dmxapi-v2.0.4-linux-amd64
./opencode-dmxapi-v2.0.4-linux-amd64macOS
chmod +x opencode-dmxapi-v2.0.4-darwin-arm64
./opencode-dmxapi-v2.0.4-darwin-arm64