一个运行在 iOS 和 Apple Watch 上的原生 AI 客户端。支持 OpenAI、Anthropic Claude、Google Gemini 等多个模型提供商,内置 MCP 工具调用、本地 RAG 记忆、世界书、每日脉冲、Siri 快捷指令与双端同步。
English | 繁體中文 | 日本語 | Русский
![]() |
![]() |
在学校的日子挺无聊的,平时又总会冒出很多想问 AI 的问题。当时我嫌 App Store 上的 AI 应用要么贵得离谱,要么功能太残废(尤其是手表端),索性就自己动手搓了一个。
从最初那个只有 1,800 行代码、API Key 还要硬编码的简陋版本,到现在 547 个 Swift 源文件、145,284 行 Swift 代码(按 cloc . --timeout=0 统计,仅计算 Swift,不把 VitePress 文档站依赖算进来)的工程,它确实已经长大了不少。虽然名字叫 “ETOS LLM Studio” 听着有点唬人,但它本质上还是我拿来探索大模型应用边界的试验场。
现在它已经不只是一个手表端 App 了:我把 iOS 端也一点点补成了完整版本,方便在手机上管理模型、工具、记忆、世界书和每日脉冲;两端数据还能通过内置同步引擎自动互通。
因为我平时主要还是用 Mac 和 Watch,iPhone 端偶尔会有一些还在继续打磨的边角,不过我会继续慢慢补齐。
- 双端原生体验:iOS 和 Apple Watch 原生适配,两端界面风格统一,但会针对不同屏幕尺寸分别优化交互。
- 会话管理增强:支持会话全文检索、命中上下文预览、消息序号定位、文件夹分类、嵌套移动、批量操作与单会话跨端发送。
- 多模型支持:原生适配 OpenAI、Anthropic(Claude)和 Google(Gemini)等接口格式,支持在 App 内动态管理提供商与模型。
- 高级请求配置:支持自定义请求头、参数表达式、结构化请求控制、键值对 Payload 编辑、原始 JSON 请求体与请求预览,方便折腾兼容接口和特殊模型。
- 多模态与图像生成:支持发送语音、图片与文件附件;图片可走独立 OCR 通道,文件附件会在发送前文本化,也支持 AI 图像生成。
- 会话导入导出:支持导入 ETOS、Cherry Studio、RikkaHub、Kelivo、ChatGPT conversations 等第三方会话,并可导出 PDF / Markdown / TXT。
- 语音输入(STT):接入系统
SFSpeechRecognizer流式识别,录音面板支持实时转写并可直接回填输入框。 - 语音朗读(TTS):支持系统 TTS、云端 TTS 与自动回退,可单独选择 TTS 模型和朗读参数。
- 并发会话请求:不同会话可以保持独立请求状态,支持会话级取消、后台完成通知与通知跳转回对应聊天。
- 显示系统可定制:支持自定义字体(含 WOFF / WOFF2)、字号比例、字体样式槽位优先级、气泡/文字颜色配置、聊天配色 Profile、按时间自动切换配色与无气泡 UI。
- 字体回退策略:支持整段/单字粒度的字体回退范围配置,提升中英混排与符号场景的稳定性。
- 思考与工具时间线:支持滚动思考预览、思考耗时、异步思考摘要、工具调用连线时间线、错误重试续跑与多版本回复切换。
- Markdown 与代码块增强:支持代码高亮、复制反馈、折叠切换、iOS 代码块预览、Mermaid 渲染、SwiftMath 数学公式与引用块竖线样式。
- watchOS 图片阅读:Markdown 图片和生成图片预览支持数码表冠缩放与拖拽查看,小屏也能认真看图。
- 工具中心 + 拓展工具:统一管理 MCP / Shortcuts / 本地工具三类能力,支持聊天工具开关、审批策略、会话级启用、分类收纳与快速调试。
- Agent Skills:支持技能全链路接入、工具中心统一开关管理,并可在 iOS 从本地文件导入、在 watchOS 通过 URL 下载导入。
- 结构化问答工具(ask_user_input):支持单题逐步作答、单选/多选互斥规则、自定义输入与返回上题。
- 拓展工具能力补齐:内置系统时间、SQLite 数据库增删改查、网页卡片展示与反馈工单自动提交工具。
- 沙盒文件系统工具:支持搜索、分块读取、差异查看、局部编辑、移动 / 复制 / 删除等文件操作。
- MCP 工具调用:支持远程 Model Context Protocol,包含完整 MCP 客户端、Streamable HTTP / SSE 传输、重连、超时、握手治理、元数据刷新、资源/模板/提示词读取与能力协商。
- Siri 快捷指令:集成 Shortcuts 框架,支持通过快捷指令调用 AI 能力、自定义工具并通过 URL Scheme 路由。
- 应用内文件管理:内置可浏览目录的文件管理器,支持直接查看与管理应用沙盒文件。
- 本地 RAG(记忆):Embedding 可调用云端 API,但向量数据库完全本地运行(SQLite);支持文本分块、嵌入进度可视化、记忆编辑与主动检索工具。
- GRDB 关系化持久化:核心数据持久化从 JSON 迁移到 GRDB + SQLite,覆盖会话、配置、MCP、世界书、记忆、反馈、快捷指令、用量统计与全局提示词等模块。
- 世界书(Worldbook):类似 SillyTavern 的 Lorebook 系统,支持角色背景设定管理、条件触发、会话绑定隔离发送、system 注入与 URL 导入。
- 广泛格式兼容:兼容 PNG naidata、JSON 顶层数组与
character_book等常见世界书格式。 - 请求日志与测速分析:内置独立请求日志、Payload 详情、细分 Token 汇总,并提供流式响应速度统计与详情图表。
- 用量统计:记录文本请求、模型排行、Token 与缓存 Token,提供 iOS / watchOS 双端统计页、绿色热力图、缓存命中率与跨端同步。
- 高级渲染:内置 Markdown 渲染器,支持代码高亮、表格和 LaTeX 数学公式。
- 每日脉冲(Daily Pulse):每天生成一组主动情报卡片,把“你今天可能值得看什么”先整理出来。
- Pulse 任务机制:卡片可以直接转成待跟进任务,这些未完成项会跨天保留,并参与下一次 Pulse 生成。
- 反馈历史学习:点赞、降权、隐藏、保存等反馈会沉淀成长期偏好信号,持续影响后续结果。
- 晨间提醒与继续聊:支持定时提醒、通知快捷动作、保存为会话和继续聊天,iOS 与 watchOS 两端都能接上这条链路。
- 跨端同步:内置 iOS ↔ watchOS 同步引擎,提供商配置、会话、世界书、工具配置、每日脉冲、用量统计、全局提示词等数据可自动互通,并支持 Manifest/Delta 差异同步主链路。
- 同步与备份:支持 ETOS 数据包导出/导入、手表端全量导入、CloudKit 传输、启动备份、损坏自愈,以及通过自定义地址直接 POST 上传导出包。
- 应用内反馈助手:支持反馈分类、环境信息采集、Git 提交哈希、PoW 提交链路、工单评论对话以及双端同步。
- 网络代理能力:支持全局/提供商级 HTTP(S)/SOCKS 代理(含鉴权)。
- 通知与反馈中心增强:支持工单评论对话、开发者标记展示、状态自动刷新与高优先级本地通知跳转。
- 局域网调试:内置局域网调试客户端,并提供 Go 版调试服务与内置 Web 控制台,可在浏览器管理应用内文件、会话数据与 OpenAI 请求捕获。
- 文档站:新增 VitePress 文档站,覆盖安装、首聊、提供商配置、界面导览、模块说明、设计文档和使用建议。
- 本地化:支持英语、简体中文、繁体中文(香港)、日语、俄语、法语、西班牙语、阿拉伯语共 8 种语言,并可在 App 内切换语言。
说实话,我最开始是想做免费软件的。 但 Apple Developer Program 每年 $99 的费用,对我一个学生来说确实有点吃力。
后来有位投资人帮我垫付了这笔钱,代价是我需要通过软件收费来偿还这笔投资(而且还要分成给他)。所以 App Store 版本象征性地收了一点费用,这就当是大家众筹帮我还债,顺便买个“不用每七天重签一次”的便利服务。
但是,开源是我的底线。
所以现在的规则很简单:
- 想省事/支持我:App Store 见,感谢你的“可乐钱”。
- 想折腾/白嫖:代码就在这儿,GPLv3 协议。如果你有 Mac 和 Xcode,完全可以自己编译安装,功能上没有任何区别。
- 想体验最新版本:可以加入 TestFlight 👉 https://testflight.apple.com/join/d4PgF4CK
技术本该共享,我不希望因为几十块钱的门槛,挡住了同样对代码感兴趣的你。
- 语言: Swift 6
- UI: SwiftUI
- 架构: MVVM + Protocol Oriented Programming
- 数据: GRDB + SQLite(会话 / 配置 / MCP / 世界书 / 记忆 / 用量统计等核心持久化与本地向量数据库), JSON(导入导出与兼容格式)
- 网络与传输: URLSession(API 请求), Streamable HTTP / SSE(MCP 传输), WatchConnectivity / CloudKit(跨端与云传输), WebSocket / HTTP Polling(局域网调试)
- AI 协议: Model Context Protocol (MCP), OpenAI Chat / Responses, Anthropic Messages, Gemini API
- 系统能力: Siri Shortcuts, WatchConnectivity, CloudKit, UserNotifications, BackgroundTasks(iOS), Speech / AVFoundation
- 文档站: VitePress / Teek(仅文档站使用;README 中的代码规模不统计其依赖)
- 依赖管理: Swift Package Manager(当前显式依赖
GRDB.swift、swift-markdown-ui、SwiftMath、ZIPFoundation,并包含其传递依赖networkimage、swift-cmark)
项目采用双层结构:平台无关的 Shared 框架 + 各平台独立的视图层。最近一轮重构已经把原先几个超大 Swift 文件拆成按职责分组的目录;当前最大 Swift 文件约 766 行,Shared / iOS / watchOS / 测试代码都更容易局部维护。
Shared/Shared/ ← 平台无关业务逻辑(240 个 Swift 源文件)
├── AppTool/ ← 本地工具、ask_user_input、SQLite 与沙盒文件工具
├── Attachments/ ← 文件附件文本抽取
├── Chat/ ← 聊天模型、消息版本、导出、渲染状态
│ └── Service/ ← ChatService 请求编排、响应解析、重试、工具、记忆与世界书注入
├── ConfigLoader/ ← Provider 配置、SQLite 存储、背景与一次性下载状态
├── Core/ ← 核心模型、JSONValue、请求体控制与共享基础设施
├── DailyPulse/ ← 每日脉冲生成、筛选、投递、反馈与任务数据
├── Feedback/ ← 应用内反馈助手、环境采集、DTO 与本地存储
├── Font/ ← 自定义字体库、字体路由与回退范围
├── LocalDebugServer/ ← 局域网调试客户端、Web 控制台、文件命令与请求捕获
├── MCP/ ← MCP 客户端、服务器存储、JSON-RPC、Streamable HTTP / SSE 传输
├── Memory/ + SimilaritySearch/ ← 本地 RAG、嵌入、分块、SQLite 向量检索
├── Persistence/ ← GRDB 主库/辅助库、迁移、启动备份、媒体与文件存储
├── Providers/ ← Provider 模型、代理配置与 OpenAI / Anthropic / Gemini 适配器
├── Shortcuts/ ← Siri Shortcuts、URL Router、导入与执行中继
├── Storage/ ← 沙盒文件浏览、存储统计、缓存清理
├── Sync/ ← WatchConnectivity / CloudKit / Manifest / Delta / ETOS 包与第三方导入
├── System/ ← 全局提示词、通知、公告、日志、语音识别、OCR
├── TTS/ ← 系统 / 云端朗读、队列播放、配置与预设
├── UsageAnalytics/ ← 用量事件、统计仪表盘与缓存命中率
└── Worldbook/ ← 世界书模型、导入导出、SQLite 存储与触发引擎
ETOS LLM Studio/ETOS LLM Studio iOS App/ ← iOS 视图层(120 个 Swift 源文件)
ETOS LLM Studio/ETOS LLM Studio Watch App/ ← watchOS 视图层(99 个 Swift 源文件)
Shared/SharedTests/ ← Shared 层测试(86 个 Swift 源文件)
数据流:View → ChatViewModel → ChatService.shared → Provider Adapter → LLM API,会话、工具、记忆、世界书、用量统计与同步数据经由 Shared 层服务和 GRDB/SQLite 存储统一治理。
如果你决定自己动手:
- Clone 项目:
git clone https://github.com/Eric-Terminal/ETOS-LLM-Studio.git
- 环境要求:
- Xcode 26.0+
- watchOS 26.0+ SDK
- (如果对不上你可以自己改一改兼容性)
- 打开项目:
打开
ETOS LLM Studio.xcworkspace(注意是 workspace 不是 xcodeproj)。 首次打开会自动解析并拉取 Swift Package 依赖。 - 运行:
选择
ETOS LLM Studio Watch App或ETOS LLM Studio iOS AppTarget,连上设备(或模拟器),Command + R 即可。 - 配置:
启动后,去设置里添加你的 API Key。推荐使用"局域网调试"功能,直接把做好的 JSON 配置文件推送到
Documents/Providers/目录下(真的有人会想在 Apple Watch 上面戳 API Key 进去吗)。
- 开发者: Eric Terminal
- Email: ericterminal@gmail.com
- GitHub: Eric-Terminal
本次 README 修订于 2026 年 5 月 5 日(参考 16d70fcc..0b42e817 提交范围)。项目更新频率比较高,如果你发现 README 跟不上代码,欢迎直接翻提交记录。

