Relay Pulse is a desktop monitoring tool for OpenAI-compatible relay endpoints.
Relay Pulse 是一个用于监控 OpenAI 兼容中转接口的桌面工具。
It lets you save multiple relay configurations, run one-off or scheduled health checks, watch recent latency and availability, back up configuration to a private GitHub Gist, and apply a saved relay directly to local Codex CLI or OpenCode configuration files.
它支持保存多个中转配置,执行手动或定时健康检查,查看最近延迟与可用性,将配置备份到私有 GitHub Gist,并把已保存的中转配置直接应用到本地 Codex CLI 或 OpenCode 配置文件。
Main desktop view for relay management, monitoring controls, endpoint status, and recent events.
用于展示中转配置管理、巡检控制、接口状态与最近事件的桌面主界面。
Compact always-available floating window for quick status visibility on the desktop.
用于在桌面上快速查看运行状态的轻量浮窗。
Codex CLI configurationCodex CLIOpenCode configuration with auto-generated rp- providersOpenCode,并自动生成 rp- providerMonitorHero: global stats, interval setting, start/stop scheduled monitoring, manual run triggerMonitorHero:全局统计、间隔设置、启动/停止自动巡检、手动触发巡检ApiConfigPanel: create and edit relay definitions, plus Gist backup settingsApiConfigPanel:创建和编辑中转配置,以及 Gist 备份设置RelayPanel: endpoint cards, per-model filtering, copy shortcuts, test/edit/delete actions, config apply menuRelayPanel:接口卡片、按模型筛选、复制快捷操作、测试/编辑/删除操作、配置应用菜单EventPanel: recent operation and check logEventPanel:最近操作和巡检日志@ai-sdk/openai-compatibleelectron-builder. |- electron/ | |- main.js # Electron app bootstrap / Electron 启动入口 | |- preload.js # Safe renderer <-> main bridge / 安全桥接层 | \- main/ | |- configTargets.js # Apply relay to Codex/OpenCode configs / 应用配置到 Codex/OpenCode | |- constants.js # Shared runtime defaults / 共享默认值 | |- data.js # Persistence and validation / 持久化与校验 | |- gist.js # GitHub Gist backup/restore / Gist 备份与恢复 | |- ipc.js # IPC registration / IPC 注册 | |- relayCheck.js # Health check runner and scheduler / 巡检执行与调度 | |- store.js # Persisted/runtime state and events / 持久状态与运行态事件 | \- lib/ | |- errors.js | |- providerFetch.js # Response normalization / 中转响应兼容处理 | |- secrets.js # Local secret encryption helpers / 本地密钥加密工具 | \- text.js |- src/ | |- App.jsx | |- app/useMonitorApp.js # Main renderer state/actions hook / 前端主状态与动作逻辑 | |- components/ | \- lib/ |- dist/ # Vite production output / 前端构建产物 |- release/ # Packaged installers / 打包产物 \- package.json
Install dependencies:
安装依赖:
npm install
Start in development mode:
开发模式启动:
npm run dev
This starts:
这会启动:
http://127.0.0.1:5173http://127.0.0.1:5173Start the desktop app from an existing production build:
使用现有构建产物启动桌面应用:
npm start
Build the renderer bundle:
构建前端产物:
npm run build
Package installers:
打包安装程序:
npm run dist:win npm run dist:mac
Each saved endpoint is tested by sending a minimal health-check request through @ai-sdk/openai-compatible.
每个已保存接口都会通过 @ai-sdk/openai-compatible 发送一个最小化健康检查请求。
Behavior includes:
核心行为包括:
OKOKThe fetch layer in electron/main/lib/providerFetch.js also normalizes some non-standard relay behaviors, including:
electron/main/lib/providerFetch.js 中的 fetch 兼容层还会处理一些不标准的中转返回行为,包括:
This makes Relay Pulse more forgiving when checking imperfect OpenAI-compatible gateways.
这让 Relay Pulse 在巡检兼容性不完全标准的 OpenAI 中转时更稳健。
Each API entry contains:
每个 API 配置项包含:
名称: required, English-only name名称:必填,仅允许英文名称官网地址: optional website URL官网地址:可选,官网 URL账号: optional account/user name账号:可选,账号或用户名密码: optional password密码:可选,密码接口地址: required relay base URL接口地址:必填,中转 Base URLAPI 密钥: required API keyAPI 密钥:必填,API Key模型: required model id, for example gpt-5.4模型:必填,模型 ID,例如 gpt-5.4超时时间(秒): request timeout per endpoint超时时间(秒):每个接口的请求超时API names must use English characters only.
API 名称必须使用英文字符,不允许中文。
Allowed characters:
允许的字符:
A-Z / a-z0-9._-Examples:
示例:
hk-relay-1openai proxy香港中转Relay Pulse stores its local state in:
Relay Pulse 会把本地状态存到:
~/relay-pulse.json
Stored data includes:
保存的数据包括:
Secrets are encrypted before being written to disk by electron/main/lib/secrets.js.
敏感字段在写入磁盘前会由 electron/main/lib/secrets.js 加密。
This is useful for keeping the JSON file from containing raw plaintext values, but it is still application-level local encryption with a built-in key in the app source. Treat it as convenience protection, not as hardened credential vault security.
这样可以避免 JSON 文件直接以明文保存敏感信息,但它本质上仍然是应用层的本地加密,且密钥内置在源码中。它更适合作为“降低明文暴露”的便利保护,而不是高强度凭据保险箱。
Relay Pulse can sync configuration to a private GitHub Gist.
Relay Pulse 支持把配置同步到私有 GitHub Gist。
relay-pulse-config.jsonrelay-pulse-config.json 的文件Two restore modes are supported:
支持两种恢复模式:
overwrite: replace local APIs and interval with the Gist versionoverwrite:用 Gist 内容覆盖本地 API 和巡检间隔merge: merge imported APIs into the current local listmerge:把导入 API 合并到当前本地列表Merge matching uses:
合并匹配规则:
id, if present on both sidesidbaseURL + modelbaseURL + modelEach relay card has a ... action menu next to the API name.
每张接口卡片在 API 名称右侧都有一个 ... 操作菜单。
It supports:
支持:
应用到 Codex-Cli 配置应用到 OpenCode 配置Relay Pulse updates:
Relay Pulse 会更新:
~/.codex/config.toml~/.codex/auth.jsonBehavior:
行为如下:
model_provider = "relaypulse"model_provider = "relaypulse"model to the saved API modelmodel 设置为当前 API 的模型[model_providers.relaypulse][model_providers.relaypulse]base_urlbase_urlOPENAI_API_KEY into auth.jsonOPENAI_API_KEY 写入 auth.jsonRelay Pulse updates:
Relay Pulse 会更新:
~/.config/opencode/opencode.jsonBehavior:
行为如下:
rp-<api-name>rp-<api-name> 形式的 provider keyname to include the rp- prefixname 带 rp- 前缀apiKey and baseURLapiKey 和 baseURLmodel to rp-<api-name>/<model>model 更新为 rp-<api-name>/<model>Example generated provider:
生成的 provider 示例:
{
"provider": {
"rp-jly": {
"models": {
"gpt-5.4": {
"name": "GPT-5.4",
"options": {
"store": false
},
"variants": {
"high": {},
"low": {},
"medium": {},
"xhigh": {}
}
}
},
"name": "rp-jly",
"npm": "@ai-sdk/openai-compatible",
"options": {
"apiKey": "sk-...",
"baseURL": "https://example.com/v1"
}
}
}
}
The renderer only talks to Electron through window.monitorApi, exposed by electron/preload.js.
前端渲染层只通过 electron/preload.js 暴露的 window.monitorApi 与 Electron 主进程通信。
Available bridge methods include:
当前桥接方法包括:
getBootstrapsaveApideleteApistartstoptestApitestNowclearHistorysyncGistrestoreGistopenExternalapplyApiConfigIf you change preload.js, restart the Electron process. A normal Vite hot reload is not enough to refresh preload APIs in the current window.
如果修改了 preload.js,需要重启 Electron 进程;仅靠 Vite 页面热更新不足以刷新当前窗口里的 preload API。
dist/: Vite renderer assetsdist/:Vite 前端构建产物release/: packaged installers and unpacked application output from electron-builderrelease/:electron-builder 生成的安装包和解包产物base: './' so the renderer can be loaded from local packaged filesbase: './',便于打包后从本地文件加载127.0.0.1:5173127.0.0.1:5173npm run dev or npm startnpm run dev 或 npm start 启动应用手动巡检一次 or start scheduled monitoring手动巡检一次,或启动自动巡检同步到 Gist同步到 Gist从 Gist 恢复从 Gist 恢复... button next to the API name... 按钮The Electron preload bridge is stale.
这是因为 Electron 的 preload 桥接还是旧版本。
Fix:
解决方式:
Refreshing only the renderer page is not enough after changing preload APIs.
修改 preload API 后,只刷新前端页面是不够的。
You likely entered a website homepage instead of an OpenAI-compatible API prefix.
你大概率填成了站点首页,而不是 OpenAI 兼容 API 前缀。
Use something like:
正确示例:
https://your-relay.example.com/v1
not:
不要写成:
https://your-relay.example.com/
Check:
请检查:
relay-pulse-config.jsonrelay-pulse-config.jsonFrom package.json:
package.json 中可用命令:
npm run dev: start Vite + Electron in development modenpm run dev:同时启动 Vite 和 Electron 开发模式npm run dev:renderer: start the Vite dev server onlynpm run dev:renderer:仅启动 Vite 前端开发服务器npm run dev:electron: wait for Vite and launch Electronnpm run dev:electron:等待 Vite 后启动 Electronnpm start: launch Electron using built assetsnpm start:使用已构建产物启动 Electronnpm run build: build the renderernpm run build:构建前端产物npm run dist:win: package Windows NSIS installernpm run dist:win:打包 Windows NSIS 安装程序npm run dist:mac: package macOS DMGnpm run dist:mac:打包 macOS DMGNo license file is currently included in this repository.
当前仓库中还没有附带许可证文件。