AI File Sorter Headless 无界面集成完全指南:CLI 参数、状态 JSON 与并发锁一次讲清
AI 应用大模型本地部署桌面应用【免费下载链接】ai-file-sorterCross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes.项目地址https://gitcode.com/gh_mirrors/ai/ai-file-sorter点击查看免费下载AI File Sorter是一款跨平台、内容感知的智能文件整理工具。本文完整解析它的Headless 无界面集成契约逐条拆解CLI 命令行参数、机器可读的状态 JSON字段以及防止多任务互相踩踏的运行时并发锁帮你在资源管理器扩展或自动化脚本里安全地无人值守调用它。如果你只想把它当 GUI 应用用那 Headless 模式你可能用不上。但一旦要把它接进 Windows 资源管理器右键、CI 流水线、或你自己的批处理脚本这套无界面契约就是稳定接口——你不需要点开任何窗口只需要解析一段 JSON。 什么是 Headless 无界面模式普通用户双击图标看到的是主窗口、分类对话框、审查确认面板。而Headless无界面模式走的是另一条中立于 UI的入口它不加载任何对话框只负责解析命令行参数抢占一把共享的运行时锁执行与 GUI 完全相同的分析工作流把每一步进度以JSON的形式打印到stdout并可选地写入一个状态文件。 对集成者最重要的认知把stdout/ 状态文件里的 JSON 当作契约stderr只当诊断日志。这一条在官方契约文档里被反复强调。Headless 模式和 GUI 模式共用同一套分析引擎所以你在 GUI 里看到的整理前后效果命令行里也能 1:1 复现。 快速开始一条命令跑通下面这条命令会对一个文件夹做分类 重命名把状态写到status.json并强制走审查流程只出计划、不真正移动文件aifilesorter --headless \ --operation categorize-and-rename \ --path /home/user/Downloads \ --status-file /tmp/aifs/status.json \ --job-id demo-001 \ --review-only跑完后你不会看到任何窗口但status.json里会记录每一步状态stdout也会同步打印。想先看它打算怎么动我的文件用--review-only就对了。 CLI 参数速查表完整用法--headless-help也能打印Usage: aifilesorter --headless --operation categorize|rename|categorize-and-rename \ --path file-or-folder [--path file-or-folder ...] \ [--status-file json-file] [--job-id id] \ [--review-file json-file] [--review-only|--auto-apply] \ [--include-subdirectories|--no-include-subdirectories] \ [--settings-overrides-file json-file] aifilesorter --headless-apply --review-file json-file \ [--status-file json-file] [--job-id id]参数作用备注--headless进入无界面分析模式核心开关--headless-apply直接应用一份已保存的审查计划不重新跑分析--headless-help打印用法说明立即退出--operationcategorize/rename/categorize-and-rename见下节--path目标文件或文件夹可重复出现多次--status-file把状态 JSON 额外写到此文件stdout始终会有--job-id任务标识缺省自动生成--review-file审查计划 JSON 路径供--headless-apply使用--review-only只出审查计划不改文件与--auto-apply二选一--auto-apply跳过审查直接应用谨慎使用--include-subdirectories扫描子文件夹默认关闭--no-include-subdirectories显式排除子文件夹--settings-overrides-file注入一次性的设置覆盖JSON不写回用户配置参数值既可以用--key value也可以写成--keyvalue的内联形式两种都能被识别。三种操作模式categorize分类并按设置把文件移动到分类文件夹。rename只应用重命名建议不移动文件。categorize-and-rename把上面两种合并成一份可审查的计划。支持的目标范围当前契约只接受两种形状一个文件夹目标或位于同一个父文件夹里的多个文件。跨文件夹的搜索结果式聚合暂不支持属于后续版本。传错形状会返回退出码4不支持。 审查与应用默认先看后动AI File Sorter 的哲学是用户完全掌控每一次变更。Headless 模式继承了这一点默认不是静默改写而是能出审查计划的工作流--review-only强制只准备审查不动任何文件--auto-apply明确选择直接应用适合你完全信任结果的自动化场景都不传时跟随应用里保存的设置。一旦进入审查流程程序会把计划写成一个审查计划文件JSON并在状态里告诉你它的路径reviewFile。等你或你的脚本/界面确认无误后再用一条命令把这份计划原样应用下去aifilesorter --headless-apply \ --review-file /tmp/aifs/status.review.json \ --status-file /tmp/aifs/status.json--headless-apply不重新分析只回放已批准的计划——这让人在环中human-in-the-loop的审批流变得既安全又可审计。 状态 JSON 完整字段每次状态更新running/completed/failed/ …都会输出一个 JSON 对象。核心字段如下{ schemaVersion: 1, status: running, operation: categorize-and-rename, jobId: headless-1234-1700000000000, message: Headless command accepted and runtime lock acquired., error: , updatedAtUtc: 2026-03-11T17:43:22.123, runtime: { gpuBackend: cuda, llamaDevice: cuda, ggmlDisableCuda: 0 }, paths: [/home/user/Downloads], lock: { owner: headless, pid: 1234, jobId: headless-1234-1700000000000, startedAtUtc: 2026-03-11T17:43:22.123, description: Headless categorize-and-rename } }字段速读字段含义schemaVersion状态结构版本当前恒为1status稳定状态值见下表operation本次操作categorize等jobId任务标识可用于关联日志message/error人类可读的状态 / 错误描述updatedAtUtc本次更新的时间戳ISO 8601runtimeGPU 后端等运行环境信息来自环境变量存在才出现paths你传入的目标路径列表lock当前持有锁的元数据见并发锁一节进入审查 / 应用阶段后的额外字段当流程推进到审查或应用时状态里会追加一份变更明细供你直接渲染进度条或清单{ status: review_required, entryCount: 3, entries: [ { source: /home/user/Downloads/photo1.jpg, destination: /home/user/Downloads/Images/20260311_090909.jpg, fileName: photo1.jpg, destinationName: 20260311_090909.jpg, category: Images, subcategory: , renameOnly: false, moved: false, renamed: false, skipped: false } ], movedCount: 0, renamedCount: 0, skippedCount: 0, review: { entryCount: 3, requiresApproval: true, entries: [ … ] }, apply: { movedCount: 0, renamedCount: 0, skippedCount: 0, undoPlanSaved: false }, reviewRequired: true, reviewFile: /tmp/aifs/status.review.json }注意running阶段的更新里也可能夹带部分审查预览条目让你在任务还没跑完时就能先展示已出的中间结果。 稳定状态值 与 退出码status值什么时候出现running任务接受、正在分析review_required已生成审查计划等待批准completed全部成功完成failed通用失败cancelled被停止标记取消blocked被锁占用 / 缺 LLM 等前置条件挡住进程退出码则用于脚本判断退出码常量含义0Success成功1Failure执行失败 / 被取消2Usage参数错误、用法不对3Busy运行时锁被占用无法执行4Unsupported目标形状不被支持两个高频的blocked场景值得单独记一下① 锁被占用另一个任务正在跑退出码3{ status: blocked, message: Another analysis job is already running., lock: { owner: explorerWorker, jobId: explorer-job } }② 还没有选 LLM需要先去选模型退出码1——状态里会带上机器可读的该做什么提示{ status: blocked, message: AI File Sorter needs an LLM selection before this Explorer job can run. …, actionRequired: select_llm, actionLabel: Select LLM }看到actionRequired: select_llm时你的界面就知道该弹出选择 LLM入口了。 并发锁AnalysisRuntimeLock这是整篇里最容易被低估、也最关键的一节。GUI、资源管理器 Worker、Headless 三种入口共享同一把锁保证同一时刻只有一个分析/变更任务在动 LLM、缓存和文件。锁由两个文件构成都放在配置目录 /runtime下锁文件analysis-runtime.lock由操作系统的QLockFile机制持有真正的互斥主体元数据旁挂文件analysis-runtime.lock.json记录谁在锁着供界面展示与过期锁恢复。元数据长这样{ owner: headless, pid: 1234, jobId: headless-1234-1700000000000, startedAtUtc: 2026-03-11T17:43:22.123, description: Headless categorize }其中owner的取值有gui/explorerWorker/headless三种方便你一眼看出现在被谁占着。过期锁自动恢复如果持有锁的进程已经死了通过pid探活 主机名比对判断下次try_acquire会主动清掉死锁并重试避免一次崩溃就把整个运行时锁死。⚠️ 给集成者的忠告不要假设能安全地对同一运行时并发跑多个分析/变更任务。撞上锁就拿到退出码3status: blocked正确姿势是排队或稍后重试而不是绕过锁。锁的实现见 AnalysisRuntimeLock.cpp头文件里的Lease用 RAII 保证拿到就释放、异常也释放见 AnalysisRuntimeLock.hpp。 如何中途停止任务如果任务在--status-file指定了状态文件那么在状态文件旁创建一个同名的.stop标记文件即可请求停止。程序每 250ms 轮询一次这个标记一旦发现就请求工作流停止最终状态变为cancelled。# 假设状态文件是 /tmp/aifs/status.json touch /tmp/aifs/status.json.stop # 发出停止信号这让长任务可中断在无人值守场景下也成了可能。⚙️ 一次性设置覆盖不改用户配置Headless 调用方经常想这次用点不一样的行为但不想污染用户已保存的设置。--settings-overrides-file就是干这个的传入一个 JSON它只对当前这一次运行生效运行结束即丢弃绝不写回配置。字段都是可选的——不写的保持原样写了的就覆盖本次运行。常用字段示例{ useSubcategories: true, includeSubdirectories: true, allowedCategories: [Images, Documents, Software], categoryLanguage: en }完整可覆盖的字段清单分类/子分类、白名单、图片/文档按内容分析、是否仅重命名、语言等见 HeadlessSettingsOverrides.hpp。这一机制是集成专属行为的推荐方式官方配置文档也特别点名见配置与环境。️ 典型集成场景场景 A资源管理器右键一键整理先--headless --review-only生成计划 → 把entries渲染成确认框 → 用户点头后--headless-apply应用。全程无人值守且每一步都可审计。场景 BCI / 定时批处理加--auto-apply直接应用用退出码0/1/2/3/4决定脚本是重试、告警还是跳过。缺 LLM 时读到actionRequired后发出请配置 LLM的工单即可。场景 C防冲突的并发调度用status.lock.owner和退出码3判断是否有人在跑把多个来源的任务天然串行化不需要自己再造锁。 相关文件与源码索引想深入源码时按下面这些入口读最快契约总览docs/headless-runtime-contract.md命令解析与执行HeadlessAnalysisCommand.cppExitCode定义见 HeadlessAnalysisCommand.hpp状态 JSON 生成HeadlessStatusJson.cpp运行时锁AnalysisRuntimeLock.cpp设置覆盖字段HeadlessSettingsOverrides.hppHeadless 入口分发main.cpp一句话总结Headless 模式 一条 CLI 命令 一份状态 JSON 一把共享锁。把它当稳定接口来用——stdout/状态文件是契约、--review-only保证先看后动、退出码3提示你排队——你就能在资源管理器扩展或自动化脚本里安全、可审计地把 AI File Sorter 的能力接进自己的产品。赞分享AI 应用大模型本地部署桌面应用【免费下载链接】ai-file-sorterCross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes.项目地址https://gitcode.com/gh_mirrors/ai/ai-file-sorter点击查看免费下载相关推荐AI File Sorter 架构全景图面向新手理解 UI、工作流与 Headless 集成的完整分层设计AI File Sorter 架构全景图面向新手理解 UI、工作流与 Headless 集成的完整分层设计 AI File Sorter 是一款跨平台的 AIAI 应用大模型本地部署桌面应用本地模型 vs 远程 APIAI File Sorter 该选哪种方案一文讲清本地模型 vs 远程 APIAI File Sorter 该选哪种方案一文讲清 AI File Sorter 是一款跨平台的 AI 文件整理桌面工具能根据AI 应用大模型本地部署桌面应用10 分钟跑通 DLSS Swapper为指定游戏切换与回退 DLSS 版本10 分钟跑通 DLSS Swapper为指定游戏切换与回退 DLSS 版本 你卡在DLSS 版本动不了的那一刻 你刚装完一款支持 DLSS 的游戏进设桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考