ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Jan MLX 插件的 Tauri 权限体系:默认权限集、命令清单与 macOS 本地推理的权限边界

Jan MLX 插件的 Tauri 权限体系:默认权限集、命令清单与 macOS 本地推理的权限边界 Jan MLX 插件的 Tauri 权限体系默认权限集、命令清单与 macOS 本地推理的权限边界【免费下载链接】janJan is an open source alternative to ChatGPT that runs 100% offline on your computer.项目地址: https://gitcode.com/GitHub_Trending/ja/jan本文以 Jan 项目中 MLX 插件的权限参考文档为核心系统讲解tauri-plugin-mlx的默认权限集Default Permission Set构成、八组 allow/deny 权限标识符与底层命令的一一映射以及权限声明如何与 capabilities 配置、Rust 命令实现和前端 JS 封装协同工作。读完本文你将能准确理解 Jan 在 Apple SiliconmacOS平台上管理 MLX 模型子进程时的权限边界并知道如何按需要为插件收紧或放宽特定命令的调用权限。插件与权限模型概述MLX 插件是 Jan 中负责在 macOS 上启动、查询和回收mlx-server子进程的 Tauri 插件。从 lib.rs 可以看到插件通过Builder::new(mlx)注册名称即为mlx因此前端调用命令时的 invoke 标识统一为plugin:mlx|命令名例如 guest-js/index.ts 中的plugin:mlx|load_mlx_model。Tauri 的权限机制要求每个命令默认不可调用必须通过 capability 文件显式授予。权限参考文档 reference.md 定义了该插件的Default Permission一个名为mlx:default的权限集将插件全部 8 个命令打包为一个授权单元。默认权限集mlx:default 包含什么参考文档的 Default Permission 一节声明默认权限集 Default permissions for the MLX plugin 包含以下 8 个权限标识符allow-cleanup-mlx-processesallow-load-mlx-modelallow-unload-mlx-modelallow-is-mlx-process-runningallow-get-mlx-random-portallow-find-mlx-session-by-modelallow-get-mlx-loaded-modelsallow-get-mlx-all-sessions这与插件根目录下的 default.toml 完全一致[default] description Default permissions for the MLX plugin permissions [ allow-cleanup-mlx-processes, allow-load-mlx-model, allow-unload-mlx-model, allow-is-mlx-process-running, allow-get-mlx-random-port, allow-find-mlx-session-by-model, allow-get-mlx-loaded-models, allow-get-mlx-all-sessions, ]而在 capabilities/mlx.json 中Jan 的授权配置为{ identifier: mlx, description: MLX plugin permissions (Apple Silicon / macOS only), windows: [main], platforms: [macOS], permissions: [mlx:default] }这段配置说明了三件事mlx:default权限集仅授予main窗口仅在macOS平台生效与 MLX 运行在 Apple Silicon 的约束一致粒度是整组授予即一次授权即解锁全部 8 个命令。权限表全解析16 个标识符与 8 个命令的映射参考文档的 Permission Table 以 allow/deny 成对形式列出了 16 个标识符。每个命令对应一个allow-*与一个deny-*标识符描述均为 Enables/Denies the 命令 command without any pre-configured scope启用/禁用该命令且不携带任何预配置 scope。完整映射如下权限标识符前缀mlx:对应命令命令功能源码实现allow/deny-cleanup-mlx-processescleanup_mlx_processes批量终止所有 MLX 服务进程cleanup.rsallow/deny-find-mlx-session-by-modelfind_mlx_session_by_model按 model_id 查找会话process.rsallow/deny-get-mlx-all-sessionsget_mlx_all_sessions获取全部活跃会话process.rsallow/deny-get-mlx-loaded-modelsget_mlx_loaded_models获取已加载模型 ID 列表process.rsallow/deny-get-mlx-random-portget_mlx_random_port获取未被占用的随机端口process.rsallow/deny-is-mlx-process-runningis_mlx_process_running检查指定 PID 进程是否存活process.rsallow/deny-load-mlx-modelload_mlx_model启动一个 MLX 服务子进程并等待就绪commands.rsallow/deny-unload-mlx-modelunload_mlx_model优雅终止指定 PID 的子进程commands.rs这 8 个标识符的定义由 Tauri 代码生成工具写入permissions/autogenerated/commands/目录下的 TOML 文件文件头部标注 Automatically generated - DO NOT EDIT!。以 load_mlx_model.toml 为例[[permission]] identifier allow-load-mlx-model description Enables the load_mlx_model command without any pre-configured scope. commands.allow [load_mlx_model] [[permission]] identifier deny-load-mlx-model description Denies the load_mlx_model command without any pre-configured scope. commands.deny [load_mlx_model]其中commands.allow/commands.deny就是 Tauri 权限机制的核心字段它把逻辑上的权限标识符绑定到真实的后端命令白名单/黑名单上。由于所有命令都不涉及文件路径或资源范围参考文档才统一说明 without any pre-configured scope——这些权限只有允许/拒绝两态不存在路径 scope 之类的细化维度。八个命令的行为细节理解了权限 → 命令的映射后下面结合源码逐组说明每个命令的实际行为这决定了你在 capability 中授予它们时实际放开了什么能力。load_mlx_model进程生命周期管理的入口load_mlx_model是最核心的写操作权限。其 Tauri 命令包装器commands.rs先从 Tauri 的resource_dir定位捆绑的二进制resources/bin/mlx-server再委托给与 AppHandle 解耦的核心实现load_mlx_model_impl。核心流程包括参数校验二进制路径不存在返回BINARY_NOT_FOUND模型文件不存在返回MODEL_FILE_NOT_FOUND见 error.rs 的错误码枚举命令行组装传入--model、--port、--model-id当config.ctx_size 0时追加--ctx-size当环境变量中存在MLX_API_KEY时追加--api-keycommands.rs就绪探测并发读取子进程 stdout/stderr匹配 http server listening、server is listening、server started、ready to accept 等日志关键字判定服务就绪超时回收在timeout秒内未就绪则kill子进程并返回MODEL_LOAD_TIMED_OUTdetails中附带超时时长与 stderr 内容会话登记成功就绪后以 PID 为键将MlxBackendSession{child, info}写入共享会话表MlxStatestate.rsSessionInfo记录pid、port、model_id、model_path、is_embedding、api_key。unload_mlx_model 与 cleanup_mlx_processes优雅终止的两档粒度unload_mlx_modelcommands.rs按 PID 从会话表中移除指定进程在 Unix/macOS 上先发送 SIGTERM等待 5 秒后未退出再升级 SIGKILLprocess.rs 的graceful_terminate_process若 PID 不存在也返回成功行为幂等cleanup_mlx_processescleanup.rs则是全量版本遍历会话表逐个 SIGTERM等待窗口缩短为 2 秒超时后 SIGKILL。它通常用于应用退出前的进程回收。从源码结构看两个命令共享同一套信号终止逻辑差异仅在作用范围与超时时长。会话查询类命令只读能力is_mlx_process_running基于sysinfo检查 PID 是否存活若进程已死会顺带从会话表中清理该条目process.rs——这是一个查询兼垃圾回收的副作用get_mlx_random_port收集会话表中已占用的端口交给jan_utils::generate_random_port生成不冲突的随机端口process.rs保证多模型并发加载时端口互不碰撞find_mlx_session_by_model按model_id精确匹配返回OptionSessionInfo前端可用它判断模型是否已加载以复用已有会话get_mlx_loaded_models/get_mlx_all_sessions分别返回所有已加载 model_id 列表和完整的SessionInfo数组含端口、模型路径、api_key是前端模型管理界面的数据来源。前端 JS 封装层插件在 guest-js/index.ts 中导出了与 8 个后端命令一一对应的 7 个 TypeScript 函数cleanup_mlx_processes未在此文件导出直接由应用层按需调用export async function loadMlxModel( modelId: string, modelPath: string, port: number, cfg: MlxConfig, envs: Recordstring, string, isEmbedding: boolean false, timeout: number 600 ): PromiseSessionInfo { const config normalizeMlxConfig(cfg) return await invoke(plugin:mlx|load_mlx_model, { modelId, modelPath, port, config, envs, isEmbedding, timeout, }) }注意normalizeMlxConfig会把非法ctx_size兜底为 0即不传--ctx-sizetimeout默认 600 秒。这些函数内部的每次invoke都会经过 Tauri 的 IPC 权限网关如果当前 capability 没有授予对应命令的 allow 权限调用会在前端直接失败根本不会到达 Rust 侧。权限配置实践如何按需收紧理解了默认权限集的打包方式后可以归纳 Jan 当前对 MLX 插件的授权策略与可选的收紧方式现状整组授权mlx.json 授予mlx:default等效于对 main 窗口一次性放开全部 8 个命令。由于平台限定为 macOS非 Mac 环境下该 capability 不生效权限本身不会造成跨平台风险按需裁剪可推断的扩展方式Tauri 允许在 capability 的permissions数组中改用细粒度标识符例如只授予mlx:allow-get-mlx-loaded-models与mlx:allow-find-mlx-session-by-model两个只读查询权限同时不授予allow-load-mlx-model即可实现只能查看、不能加载模型的受限窗口反过来对某个非 main 窗口声明mlx:deny-load-mlx-model也能显式拒绝该命令错误模型作为纵深防线即便权限放行Rust 侧仍会进行二进制路径、模型文件存在性、加载超时、内存不足stderr 中出现 out of memory 等关键字会映射为OutOfMemory错误码见 error.rs等运行时校验。权限控制能不能调错误模型控制调了之后会发生什么两层机制相互独立。小结tauri-plugin-mlx的权限参考文档虽由代码生成工具产出但它精确刻画了 Jan 对 macOS 本地推理进程的管理面mlx:default默认权限集将加载、卸载、存活检查、随机端口、会话查询、批量清理八类命令打包授权每个命令都有 allow/deny 成对标识符且无 scope 维度而 capabilities/mlx.json 中的windows/platforms约束进一步把授权范围收敛到 macOS 主窗口。对于需要在 Jan 之上做二次开发或审计权限边界的开发者这条reference.md → default.toml → autogenerated/commands/*.toml → capability JSON → Rust 命令实现的链路就是完整的溯源路径。【免费下载链接】janJan is an open source alternative to ChatGPT that runs 100% offline on your computer.项目地址: https://gitcode.com/GitHub_Trending/ja/jan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表