ellm-proxy 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +29 -11
  2. package/bin/ellm-proxy.js +2 -63
  3. package/dist/cli.js +35780 -0
  4. package/dist/server.js +16723 -6451
  5. package/dist/web-ui/assets/{DashboardView-BCwrFrE2.js → DashboardView-3c_i_3VF.js} +1 -1
  6. package/dist/web-ui/assets/LayoutView-BhN1f8wo.js +1 -0
  7. package/dist/web-ui/assets/LayoutView-CNd_MJt2.css +1 -0
  8. package/dist/web-ui/assets/{LoginView-Dp7NmXtf.js → LoginView-J23vsMu2.js} +1 -1
  9. package/dist/web-ui/assets/{LogsView-Dyy_zkgg.js → LogsView-2h2Y0XE8.js} +1 -1
  10. package/dist/web-ui/assets/ProcessView-Bn8Ph7rh.css +1 -0
  11. package/dist/web-ui/assets/ProcessView-Bs2k6aAf.js +1 -0
  12. package/dist/web-ui/assets/{ProvidersView-CYFs76wJ.js → ProvidersView-bE1Hv9D-.js} +1 -1
  13. package/dist/web-ui/assets/SettingsView-BmLmC-_v.js +1 -0
  14. package/dist/web-ui/assets/SettingsView-Ceyj-ZDZ.css +1 -0
  15. package/dist/web-ui/assets/{SetupView-DX6S_KpK.js → SetupView-Cgj7ubNz.js} +1 -1
  16. package/dist/web-ui/assets/{config-CRWaUFQc.js → config-nvSp8hHp.js} +1 -1
  17. package/dist/web-ui/assets/{index-X5PdkJlA.js → index-sPrBBnf5.js} +2 -2
  18. package/dist/web-ui/assets/{providers-H_9x778D.js → providers-di7L8jy_.js} +1 -1
  19. package/dist/web-ui/assets/useManagerApi-qPjxfB0X.js +1 -0
  20. package/dist/web-ui/assets/useToast-D76qyWZg.js +1 -0
  21. package/dist/web-ui/config.js +3 -6
  22. package/dist/web-ui/index.html +1 -1
  23. package/docs/DESIGN.md +43 -14
  24. package/package.json +2 -17
  25. package/bin/commands/autostart.js +0 -37
  26. package/bin/commands/config.js +0 -8
  27. package/bin/commands/credentials.js +0 -100
  28. package/bin/commands/pm2.js +0 -28
  29. package/bin/commands/service.js +0 -107
  30. package/dist/web-ui/assets/LayoutView-BUA8-IzK.css +0 -1
  31. package/dist/web-ui/assets/LayoutView-BePJfgia.js +0 -1
  32. package/dist/web-ui/assets/ProcessView-CpPpMtFg.js +0 -1
  33. package/dist/web-ui/assets/ProcessView-DK0TvDpR.css +0 -1
  34. package/dist/web-ui/assets/SettingsView-BkwyoOUb.css +0 -1
  35. package/dist/web-ui/assets/SettingsView-mPcaVAD2.js +0 -1
  36. package/dist/web-ui/assets/useManagerApi-C1_COxKg.js +0 -1
  37. package/dist/web-ui/assets/useToast-MtbkGJiM.js +0 -1
  38. package/manager/api/harness/backup.js +0 -20
  39. package/manager/api/harness/claude-code.js +0 -54
  40. package/manager/api/harness/codex.js +0 -123
  41. package/manager/api/harness/dsh.js +0 -175
  42. package/manager/api/harness/index.js +0 -118
  43. package/manager/api/service-settings.js +0 -98
  44. package/manager/api/service.js +0 -147
  45. package/manager/index.js +0 -182
  46. package/utils/autostart.js +0 -219
  47. package/utils/interpreter.js +0 -14
  48. package/utils/paths.js +0 -45
  49. package/utils/pm2.js +0 -130
  50. package/utils/port.js +0 -35
  51. package/utils/service.js +0 -205
  52. package/utils/ui.js +0 -59
  53. package/utils/updater.js +0 -233
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # ellm-proxy
2
2
 
3
- 自研 LLM 网关(行为基准 litellm 1.100.0),pm2 后台守护一键启停(跨平台)。主服务(`ellm-proxy`)单进程提供网关与管理台 API;管理服务(`ellm-proxy-manager`,端口 = 主端口 + 1)托管管理界面 web-ui 并反代 `/api/*` 到主服务,主服务停止时仍可远程拉起。
3
+ 自研 LLM 网关(行为基准 litellm 1.100.0),单进程后台常驻一键启停(跨平台,内置进程管理,无 pm2)。单端口提供全部能力:网关、管理台 API 与管理界面同端口(默认 29770)。
4
4
 
5
5
  > 需求决策与架构设计详见 [docs/DESIGN.md](docs/DESIGN.md)。
6
6
 
7
7
  - `/v1/*` — LLM 网关端点(OpenAI / Anthropic 协议互转,多供应商路由、压缩、鉴权)
8
- - `/api/*` — 管理台 API(登录鉴权、配置热更新、用量/日志;主服务全局 CORS,供独立部署的 web-ui 跨源调用)
9
- - `http://127.0.0.1:<主端口+1>/` — 管理界面(manager 托管 web-ui,同源反代 `/api/*`)
8
+ - `/api/*` — 管理台 API(登录鉴权、配置热更新、用量/日志)
9
+ - `http://127.0.0.1:<port>/` — 管理界面(服务进程托管 web-ui,同端口;远程访问靠登录保护)
10
10
 
11
11
  ## 安装
12
12
 
@@ -20,17 +20,28 @@ npm i -g ellm-proxy
20
20
 
21
21
  ```bash
22
22
  ellm-proxy -h # 查看帮助
23
- ellm-proxy start # pm2 后台守护启动(崩溃自动重启;首次自动创建配置)
23
+ ellm-proxy start # 后台常驻启动(首次自动创建配置)
24
24
  ellm-proxy stop # 停止服务
25
25
  ellm-proxy restart # 重启(先 stop 后 start,保证最新参数生效,选项同 start)
26
- ellm-proxy autostart on # Windows 开机自启(注册登录触发的计划任务)
26
+ ellm-proxy(无参数) # 已运行则显示服务信息,否则启动
27
+ ellm-proxy autostart on # 开机自启(登录时触发,免管理员权限)
27
28
  ellm-proxy autostart off # 关闭开机自启
28
29
  ellm-proxy config # 显示配置文件路径
30
+ ellm-proxy master-key # 查看/设置网关主密钥(--random / --clear)
31
+ ellm-proxy account # 查看/设置管理台登录账号(--reset)
29
32
  ```
30
33
 
31
- `start/stop/restart` 基于包内自带的 pm2(局部安装,进程名 `ellm-proxy`):服务由 pm2 守护常驻,关闭终端不影响运行,崩溃自动重启(封顶 10 次,防端口占用无限循环),日志写 `<appDir>/logs/`。服务要求的 Node ≥22.13 由 CLI 解析(当前 node 满足则直接用,否则经 get-node 自动下载一次并缓存),终端默认 node 版本无关。start/stop 成功后自动 `pm2 dump`,可随时用 `pm2 resurrect` 恢复。Windows、Linux、macOS 均可用;运行状态用 `pm2 ls` 查看。
34
+ **进程管理(内置,跨平台)**:CLI 启动时以 detached 方式拉起服务进程并写运行记录 `~/.ellm-proxy/run.json`,探活以「端口 HTTP 可达」为准。服务进程自持崩溃自愈(未捕获异常自动孵化后继进程接管端口,1 分钟窗口封顶 10 次,防端口占用无限循环),日志写 `<appDir>/logs/`。服务要求的 Node ≥22.13 由 CLI 解析(当前 node 满足则直接用,否则经 get-node 自动下载一次并缓存)。Windows、Linux、macOS 均可用;运行状态直接运行 `ellm-proxy`(无参数)查看。
32
35
 
33
- **开机自启(跨平台)**:`ellm-proxy autostart on` 注册登录触发的自启项(内容为 `pm2 resurrect`),三平台均无需管理员权限——Windows 写启动文件夹 `.cmd`、macOS 写 LaunchAgent(`launchctl load`)、Linux 写 systemd user unit(`systemctl --user enable`,WSL/无 systemd 环境会报错提示);`autostart off` 移除。
36
+ **热重启**:管理台「进程管理」页的重启按钮(或配置变更)触发 self-respawn——服务先孵化新进程接管端口再退出,停机 1~2 秒。
37
+
38
+ **开机自启(跨平台)**:`ellm-proxy autostart on` 注册登录触发的自启项(内容为直接启动服务,含运行参数 env 快照),三平台均无需管理员权限——Windows 写启动文件夹 `.cmd`、macOS 写 LaunchAgent(`launchctl load`)、Linux 写 systemd user unit(`systemctl --user enable`,WSL/无 systemd 环境会报错提示);`autostart off` 移除。旧版(≤0.0.7,pm2 resurrect 内容)自启项会在下次 start 时自动迁移重写,旧版 pm2 托管的进程与守护也会被自动清理。
39
+
40
+ ## 自动更新(可选开启)
41
+
42
+ - **手动更新**:管理台「设置 → 服务与更新」检查并一键更新——服务先回响应再自重启,新进程启动时执行 `npm i -g` 安装并自动换新代码生效(双跳),安装失败自动回滚旧版本继续服务。
43
+ - **自动更新**:看门狗每小时检查 npm 源(默认 npmjs,`ELLM_UPDATE_REGISTRY` 可覆盖),发现新版本自动走同一链路;开关存配置文件顶层 `autoUpdate`。
44
+ - 源码/本地构建运行时更新域自动关闭(仅 npm 全局安装的包支持)。
34
45
 
35
46
  ## 运行时布局(默认 `~/.ellm-proxy/`,均可被环境变量覆盖)
36
47
 
@@ -39,21 +50,28 @@ ellm-proxy config # 显示配置文件路径
39
50
  | 配置文件 | `~/.ellm-proxy/ellm.config.json` | `ELLM_CONFIG`(或 `start --config <path>`) |
40
51
  | 数据目录(sqlite 日志/缓存) | `~/.ellm-proxy/data/` | `ELLM_DATA_DIR`(或 `start --data-dir <path>`) |
41
52
  | 应用目录(配置/数据基准) | `~/.ellm-proxy/` | `ELLM_APP_DIR`(CLI 按 `--working-dir` 自动注入) |
42
- | web-ui 静态资源 | 包内 `dist/web-ui/`(manager 托管) | `ELLM_WEBUI_DIR`(可选覆盖;manager 按自身位置自动推导) |
53
+ | web-ui 静态资源 | 包内 `dist/web-ui/`(服务进程托管) | `ELLM_WEBUI_DIR`(可选覆盖) |
43
54
  | 运行日志 | `~/.ellm-proxy/logs/` | `start --working-dir <path>`(见 `ellm-proxy -h`) |
55
+ | 运行记录 | `~/.ellm-proxy/run.json` | 随 `ELLM_APP_DIR` |
44
56
 
45
57
  所有路径均支持相对路径(按当前工作目录展开)与绝对路径。服务端自身不加载任何 `.env` 文件;`ELLM_MASTER_KEY` 等环境变量直接在会话中导出即可。
46
58
 
47
59
  首次执行 `ellm-proxy start` 会自动创建示例配置,之后两种方式修改:
48
60
 
49
61
  1. 直接编辑配置文件;
50
- 2. 启动服务后访问管理界面 `http://127.0.0.1:<主端口+1>/` 在线修改(实时热更新)。
62
+ 2. 启动服务后访问管理界面 `http://127.0.0.1:29770/` 在线修改(实时热更新)。
63
+
64
+ 其他环境变量:`ELLM_PORT`(服务监听端口,或 `start --port`)、`HOST`(监听地址)、`ELLM_MASTER_KEY`(网关主密钥,低于配置文件 `masterKey` 字段)。启动时端口若被占用会自动顺延到下一个空闲端口(仅本次运行生效,不改配置文件),顺延结果会打印在启动摘要中。
65
+
66
+ ## 从 0.0.7 及更早版本升级
51
67
 
52
- 其他环境变量:`ELLM_PORT`(网关监听端口,或 `start --port`;管理服务固定 `ELLM_PORT + 1`,可用 `ELLM_MANAGER_PORT` 覆盖)、`HOST`(监听地址)、`ELLM_MASTER_KEY`(网关主密钥,低于配置文件 `masterKey` 字段)。启动时端口若被占用会自动顺延到下一个空闲端口(仅本次运行生效,不改配置文件),顺延结果会打印在启动摘要中。
68
+ 1. `npm i -g ellm-proxy@latest`(或等自动更新);
69
+ 2. 直接 `ellm-proxy start`——旧版 pm2 托管的进程与守护会被自动清理,pm2 自启项自动迁移为直启模式;
70
+ 3. 管理台地址从 `http://127.0.0.1:29771/` 变更为 `http://127.0.0.1:29770/`(单端口化,29771 退役)。
53
71
 
54
72
  ## 本地开发(仓库内)
55
73
 
56
- 本包是 `ellm` monorepo 的发布载体:发布版 `dist/server.js` 由 `scripts/build-server.mjs` `backend` 源码直接构建(esbuild 插件在构建期把路径模块替换为 `release/runtime-dir.ts` 包模式实现,backend 源码保持单模式零分支),`web-ui` 产物由 `pnpm build:web` 生成后拷入 `dist/web-ui/`(manager 托管):
74
+ 本包是 `ellm` monorepo 的发布载体:发布版 `dist/server.js` 与 `dist/cli.js` 由 `scripts/build-server.mjs` / `build-cli.mjs` `server`(原 backend)源码直接构建(esbuild 全量内联,含管理域与 CLI),`web-ui` 产物由 `pnpm build:web` 生成后拷入 `dist/web-ui/`(服务进程托管):
57
75
 
58
76
  ```bash
59
77
  pnpm pack:proxy # 构建 web-ui → 构建发布版 + 聚合 → npm pack 生成 tgz
package/bin/ellm-proxy.js CHANGED
@@ -1,64 +1,3 @@
1
1
  #!/usr/bin/env node
2
- // ellm-proxy CLI 入口(bin,cac 框架):仅做命令装配,实现在 commands/(命令)与 utils/(共享工具)。
3
- //
4
- // 命令:(无参数 = 默认启动)start / stop / restart / pm2 <args...> / autostart on|off / config /
5
- // master-key / account / -h / --version(选项详见 -h)
6
- //
7
- // 运行时布局(默认 ~/.ellm-proxy/,均可被选项/环境变量覆盖):
8
- // 配置: --config > ELLM_CONFIG 环境变量 > ~/.ellm-proxy/ellm.config.json(首次自动创建)
9
- // 数据: ELLM_DATA_DIR 环境变量 > ~/.ellm-proxy/data
10
- // 日志: <appDir>/logs/ellm-out.log · ellm-err.log(主服务)+ manager-out.log · manager-err.log(管理服务)
11
- //
12
- // 进程管理(跨平台,pm2 JS API 封装见 utils/pm2.js,编排核心见 utils/service.js):
13
- // start 会一并托管两个进程——主服务 dist/server.js(name=ellm-proxy)与管理服务 manager/index.js
14
- // (name=ellm-proxy-manager,启停/重启主服务 + Claude Code/Codex 代理开关)。
15
- // 崩溃自动重启、日志落盘、dump/resurrect(开机自启一并恢复)。服务要求的 Node >=22.13.0 通过
16
- // interpreter 保证(utils/interpreter.js),pm2 daemon 的 node 版本无关紧要。
17
- // start/stop 成功后自动 pm2 dump,供开机自启 resurrect 恢复。`ellm-proxy pm2 <args>` 可透传
18
- // 任意 pm2 子命令(list/logs/monit/...,用包内局部 pm2,无需自装全局)。
19
- //
20
- // 开机自启(commands/autostart.js,跨平台):登录时触发、无需管理员——Windows 写启动文件夹
21
- // .cmd(shell:startup)、macOS 写 LaunchAgent plist(launchctl load)、Linux 写 systemd user
22
- // unit(systemctl --user enable);内容一致 = pm2 resurrect 恢复最后一次 dump。
23
-
24
- import { cac } from "cac";
25
- import { pkg } from "../utils/paths.js";
26
- import { error as uiError } from "../utils/ui.js";
27
- import * as serviceCmd from "./commands/service.js";
28
- import * as autostartCmd from "./commands/autostart.js";
29
- import * as configCmd from "./commands/config.js";
30
- import * as credentialsCmd from "./commands/credentials.js";
31
- import * as pm2Cmd from "./commands/pm2.js";
32
-
33
- const cli = cac("ellm-proxy");
34
-
35
- /** 统一错误出口:命令实现抛错 → 打印中文错误信息并以退出码 1 结束 */
36
- async function run(action) {
37
- try {
38
- await action();
39
- } catch (err) {
40
- console.error();
41
- uiError(`错误:${err?.message ?? err}`);
42
- process.exit(1);
43
- }
44
- }
45
-
46
- serviceCmd.register(cli, run);
47
- autostartCmd.register(cli, run);
48
- configCmd.register(cli);
49
- credentialsCmd.register(cli, run);
50
- pm2Cmd.register(cli, run);
51
-
52
- // pm2 透传:在 cac 解析前拦截 `ellm-proxy pm2 <...args>`,pm2 的 -- 选项原样可达(cac 会吞掉未知 -- 选项)
53
- if (process.argv[2] === "pm2") {
54
- run(() => pm2Cmd.doPassthrough(process.argv.slice(3)));
55
- } else {
56
- // 默认命令(无参数):启动服务,已运行则显示服务信息(选项同 start)
57
- serviceCmd
58
- .withStartOptions(cli.command("", "启动服务(已运行则显示服务信息,选项同 start)"))
59
- .action((opts) => run(() => serviceCmd.doStartOrInfo(opts)));
60
-
61
- cli.help();
62
- cli.version(pkg.version);
63
- cli.parse();
64
- }
2
+ // ellm-proxy CLI shim:实现由构建产物 dist/cli.js 承载(backend/src/cli 源码打包)。
3
+ import "../dist/cli.js";