{"_id":"@dagehaoshuang/open-jarvis","_rev":"3-d42f41b30e2a0a49ac98a2f047887670","name":"@dagehaoshuang/open-jarvis","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@dagehaoshuang/open-jarvis","version":"0.1.0","_id":"@dagehaoshuang/open-jarvis@0.1.0","maintainers":[{"name":"dagehaoshuang","email":"693963124@qq.com"}],"bin":{"jarvis":"dist/src/cli/jarvis.js","jarvisd":"dist/src/gateway/jarvisd.js"},"dist":{"shasum":"76e3d08b59e597c94b53eaf38c376f9c6d5b6ebe","tarball":"https://registry.npmjs.org/@dagehaoshuang/open-jarvis/-/open-jarvis-0.1.0.tgz","fileCount":944,"integrity":"sha512-5orfqsY5AevgsC94afw6jIBCmWYf9yZ5K8QUYKaMYcqaXsKAPVuovhpEbK2dYg6/DxWOPum2dFXJBLht6h0B8Q==","signatures":[{"sig":"MEQCIFbFItEK3ih3rf/223NiWFj7TFKAzzdeBL9Ll/YcxCLkAiAP85o2zDLS/+pW86zDEb7yc2u3pTnjLKj2IFlnh3OW3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3185332},"main":"./dist/src/core/index.js","pnpm":{"overrides":{"sherpa-onnx-win-x64":"1.12.40","sherpa-onnx-win-ia32":"1.12.40","sherpa-onnx-linux-x64":"1.12.40","sherpa-onnx-darwin-x64":"1.12.40","sherpa-onnx-linux-arm64":"1.12.40","sherpa-onnx-darwin-arm64":"1.12.40"}},"type":"module","types":"./dist/src/core/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/src/core/index.d.ts","import":"./dist/src/core/index.js"},"./plugin":{"types":"./dist/src/core/plugins/index.d.ts","import":"./dist/src/core/plugins/index.js"}},"gitHead":"fbc6ccf005dc1526c12432ae7240e3f25baa4eae","scripts":{"prod":"pnpm build:web && JARVIS_ENV=production JARVIS_SERVE_WEB=./web/dist tsx src/gateway/jarvisd.ts","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist node_modules .vitest-cache *.tsbuildinfo","dev:web":"cd web && pnpm dev","release":"node desktop/electron/publish-update.mjs","test:web":"cd web && pnpm test","build:web":"cd web && pnpm build","dev:serve":"pnpm prepare:wake && JARVIS_DEV=1 WAKE_ASSETS_DIR=desktop/electron/.cache/wakeword-dev tsx watch src/gateway/jarvisd.ts","postbuild":"node -e \"require('fs').cpSync('assets','dist/assets',{recursive:true})\"","typecheck":"tsc --noEmit","test:watch":"vitest","release:dry":"node desktop/electron/publish-update.mjs --dry-run","prepare:wake":"node desktop/electron/wake-assets.mjs --out desktop/electron/.cache/wakeword-dev --cache desktop/electron/.cache/wakeword","prepublishOnly":"pnpm build:web && pnpm build"},"_npmUser":{"name":"dagehaoshuang","email":"693963124@qq.com"},"_npmVersion":"10.9.2","description":"TypeScript model-agnostic agent harness","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.21.0","zod":"^4.4.3","hono":"^4.12.18","pino":"^10.3.1","yaml":"^2.8.4","jsdom":"^29.1.1","sharp":"^0.33.5","croner":"^10.0.1","chokidar":"^5.0.0","turndown":"^7.2.4","commander":"^14.0.3","ipaddr.js":"^2.4.0","tree-kill":"^1.2.2","jsonrepair":"^3.14.0","tinyglobby":"^0.2.16","pino-pretty":"^13.1.3","@hono/node-ws":"^1.3.1","better-sqlite3":"^12.9.0","@vscode/ripgrep":"^1.18.0","@napi-rs/keyring":"^1.3.0","sherpa-onnx-node":"1.12.40","@hono/node-server":"^2.0.1","@mozilla/readability":"^0.6.0","rotating-file-stream":"^3.2.9","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.19.2","vitest":"^2.1.8","esbuild":"^0.28.0","@types/ws":"^8.18.1","typescript":"^5.6.3","@types/node":"^22.10.0","eventsource":"^4.1.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6","@playwright/test":"^1.60.0","@vitest/coverage-v8":"^2.1.8","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/server-everything":"^2026.1.26"},"_npmOperationalInternal":{"tmp":"tmp/open-jarvis_0.1.0_1786406330645_0.0014292606891284088","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dagehaoshuang/open-jarvis","version":"0.1.1","_id":"@dagehaoshuang/open-jarvis@0.1.1","maintainers":[{"name":"dagehaoshuang","email":"693963124@qq.com"}],"bin":{"jarvis":"dist/src/cli/jarvis.js","jarvisd":"dist/src/gateway/jarvisd.js"},"dist":{"shasum":"a6426802152cfe21cc1803d6091999355846c463","tarball":"https://registry.npmjs.org/@dagehaoshuang/open-jarvis/-/open-jarvis-0.1.1.tgz","fileCount":944,"integrity":"sha512-v/RdidBk+BJFdEIHLU99N3o8e1LBYYDyQvY+EpgHXPo/x9qQo9Au2FQypPYWQe7pnr/Jz3m6aDhor4/ydIxTpw==","signatures":[{"sig":"MEQCICyyl7hb8pnx7dE3fv6K54GvU/KJfqGswcn14vFH2DQoAiA/ykeF7pZ9axYGHVCTDs7htMRwgyFdi7QEP1YrtQP6GA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3186203},"main":"./dist/src/core/index.js","pnpm":{"overrides":{"sherpa-onnx-win-x64":"1.12.40","sherpa-onnx-win-ia32":"1.12.40","sherpa-onnx-linux-x64":"1.12.40","sherpa-onnx-darwin-x64":"1.12.40","sherpa-onnx-linux-arm64":"1.12.40","sherpa-onnx-darwin-arm64":"1.12.40"}},"type":"module","types":"./dist/src/core/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/src/core/index.d.ts","import":"./dist/src/core/index.js"},"./plugin":{"types":"./dist/src/core/plugins/index.d.ts","import":"./dist/src/core/plugins/index.js"}},"gitHead":"39679523714a6bcd8413aa1a73962736743683d4","scripts":{"prod":"pnpm build:web && JARVIS_ENV=production JARVIS_SERVE_WEB=./web/dist tsx src/gateway/jarvisd.ts","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist node_modules .vitest-cache *.tsbuildinfo","dev:web":"cd web && pnpm dev","release":"node desktop/electron/publish-update.mjs","test:web":"cd web && pnpm test","build:web":"cd web && pnpm build","dev:serve":"pnpm prepare:wake && JARVIS_DEV=1 WAKE_ASSETS_DIR=desktop/electron/.cache/wakeword-dev tsx watch src/gateway/jarvisd.ts","postbuild":"node -e \"require('fs').cpSync('assets','dist/assets',{recursive:true})\"","typecheck":"tsc --noEmit","test:watch":"vitest","release:dry":"node desktop/electron/publish-update.mjs --dry-run","prepare:wake":"node desktop/electron/wake-assets.mjs --out desktop/electron/.cache/wakeword-dev --cache desktop/electron/.cache/wakeword","prepublishOnly":"pnpm build:web && pnpm build"},"_npmUser":{"name":"dagehaoshuang","email":"693963124@qq.com"},"_npmVersion":"10.9.2","description":"TypeScript model-agnostic agent harness","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.21.0","zod":"^4.4.3","hono":"^4.12.18","pino":"^10.3.1","yaml":"^2.8.4","jsdom":"^29.1.1","sharp":"^0.33.5","croner":"^10.0.1","chokidar":"^5.0.0","turndown":"^7.2.4","commander":"^14.0.3","ipaddr.js":"^2.4.0","tree-kill":"^1.2.2","jsonrepair":"^3.14.0","tinyglobby":"^0.2.16","pino-pretty":"^13.1.3","@hono/node-ws":"^1.3.1","better-sqlite3":"^12.9.0","@vscode/ripgrep":"^1.18.0","@napi-rs/keyring":"^1.3.0","sherpa-onnx-node":"1.12.40","@hono/node-server":"^2.0.1","@mozilla/readability":"^0.6.0","rotating-file-stream":"^3.2.9","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.19.2","vitest":"^2.1.8","esbuild":"^0.28.0","@types/ws":"^8.18.1","typescript":"^5.6.3","@types/node":"^22.10.0","eventsource":"^4.1.0","@types/jsdom":"^28.0.1","@types/turndown":"^5.0.6","@playwright/test":"^1.60.0","@vitest/coverage-v8":"^2.1.8","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/server-everything":"^2026.1.26"},"_npmOperationalInternal":{"tmp":"tmp/open-jarvis_0.1.1_1786419175261_0.40097342303448413","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dagehaoshuang/open-jarvis","version":"0.2.0","description":"TypeScript model-agnostic agent harness","type":"module","publishConfig":{"access":"public"},"engines":{"node":">=22"},"packageManager":"pnpm@9.15.0","pnpm":{"overrides":{"sherpa-onnx-darwin-arm64":"1.12.40","sherpa-onnx-darwin-x64":"1.12.40","sherpa-onnx-win-x64":"1.12.40","sherpa-onnx-win-ia32":"1.12.40","sherpa-onnx-linux-x64":"1.12.40","sherpa-onnx-linux-arm64":"1.12.40"}},"bin":{"jarvis":"dist/src/cli/jarvis.js","jarvisd":"dist/src/gateway/jarvisd.js"},"main":"./dist/src/core/index.js","types":"./dist/src/core/index.d.ts","exports":{".":{"types":"./dist/src/core/index.d.ts","import":"./dist/src/core/index.js"},"./plugin":{"types":"./dist/src/core/plugins/index.d.ts","import":"./dist/src/core/plugins/index.js"}},"scripts":{"typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","build":"tsc -p tsconfig.build.json","postbuild":"node -e \"require('fs').cpSync('assets','dist/assets',{recursive:true})\"","prepublishOnly":"pnpm build:web && pnpm build","prepare:wake":"node desktop/electron/wake-assets.mjs --out desktop/electron/.cache/wakeword-dev --cache desktop/electron/.cache/wakeword","dev:serve":"pnpm prepare:wake && JARVIS_DEV=1 WAKE_ASSETS_DIR=desktop/electron/.cache/wakeword-dev tsx watch src/gateway/jarvisd.ts","dev:web":"cd web && pnpm dev","build:web":"cd web && pnpm build","test:web":"cd web && pnpm test","prod":"pnpm build:web && JARVIS_ENV=production JARVIS_SERVE_WEB=./web/dist tsx src/gateway/jarvisd.ts","release":"node desktop/electron/publish-update.mjs","release:dry":"node desktop/electron/publish-update.mjs --dry-run","clean":"rm -rf dist node_modules .vitest-cache *.tsbuildinfo"},"dependencies":{"@hono/node-server":"^2.0.1","@hono/node-ws":"^1.3.1","@modelcontextprotocol/sdk":"^1.25.2","@mozilla/readability":"^0.6.0","@napi-rs/keyring":"^1.3.0","@vscode/ripgrep":"^1.18.0","better-sqlite3":"^12.9.0","chokidar":"^5.0.0","commander":"^14.0.3","croner":"^10.0.1","hono":"^4.12.18","ipaddr.js":"^2.4.0","jsdom":"^29.1.1","jsonrepair":"^3.14.0","pino":"^10.3.1","pino-pretty":"^13.1.3","rotating-file-stream":"^3.2.9","sharp":"^0.33.5","sherpa-onnx-node":"1.12.40","tinyglobby":"^0.2.16","tree-kill":"^1.2.2","turndown":"^7.2.4","ws":"^8.21.0","yaml":"^2.8.4","zod":"^4.4.3"},"devDependencies":{"@modelcontextprotocol/server-everything":"^2026.1.26","@playwright/test":"^1.60.0","@types/better-sqlite3":"^7.6.13","@types/jsdom":"^28.0.1","@types/node":"^22.10.0","@types/turndown":"^5.0.6","@types/ws":"^8.18.1","@vitest/coverage-v8":"^2.1.8","esbuild":"^0.28.0","eventsource":"^4.1.0","tsx":"^4.19.2","typescript":"^5.6.3","vitest":"^2.1.8"},"_id":"@dagehaoshuang/open-jarvis@0.2.0","gitHead":"d8aa32c1b1dbf7beb165770d27648dd775f17bb1","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-Qf/i+Uhws2OxrEeCFKskFM8wVqEgPKYaA5RoCR3HzgEVoDv66o3ZBZFCis4Q/ZPVE5HJ7nhBtVmhNFTDffNRrA==","shasum":"b8ebb524d4fe2f1ac2bb88bf4e7e10b46b846d11","tarball":"https://registry.npmjs.org/@dagehaoshuang/open-jarvis/-/open-jarvis-0.2.0.tgz","fileCount":944,"unpackedSize":3186203,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGsORIMVbjnQObVwNJZODpLH0DcGnm9ldL5U4eMsbkaFAiBzbxKCRb9rSJaEBPG4ayjJNNjzSgEgMCpzlor3Br5uig=="}]},"_npmUser":{"name":"dagehaoshuang","email":"693963124@qq.com"},"directories":{},"maintainers":[{"name":"dagehaoshuang","email":"693963124@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/open-jarvis_0.2.0_1786420037418_0.7365075952816269"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-10T23:58:50.438Z","modified":"2026-08-11T03:47:17.744Z","0.1.0":"2026-08-10T23:58:50.820Z","0.1.1":"2026-08-11T03:32:55.480Z","0.2.0":"2026-08-11T03:47:17.611Z"},"description":"TypeScript model-agnostic agent harness","maintainers":[{"name":"dagehaoshuang","email":"693963124@qq.com"}],"readme":"<div align=\"center\">\n <img src=\"assets/logo/256-white.png\" alt=\"OpenJarvis\" width=\"160\" />\n <h1>OpenJarvis</h1>\n <p>贾维斯 · 一个能看、能听、能说、能动手干活的开源 AI 助手</p>\n</div>\n\n---\n\nOpenJarvis 让任何大模型（DeepSeek / 通义千问 / GPT / Claude 等）变成一个真正能替你办事的助手：它能读写你的文件、执行命令、上网查资料、看图片、记住你、还能开口说话、听你唤醒。你换模型只改一行配置，不喜欢的能力可以随时关掉。\n\n一句话：**装上就能用，换个模型也照样跑。**\n\n---\n\n## ✨ 特色功能\n\n### 🎙️ 语音在场感 —— 喊一声「嗨贾维斯」就来\n- **中文唤醒词**：本地离线识别「嗨贾维斯」，不用点按钮、不用联网就能叫醒它\n- **实时语音**：直接开口说话，实时转写，说完自动理解并回应，全程不用碰按钮\n- **开口回话**：结果用语音念给你听，语速 / 语气会随内容变化\n- **随时打断**：它在说话时你开口，它会立刻停下来听你说（像跟真人对话一样自然）\n\n### 🧑‍🎤 情绪化的虚拟形象\n- 桌面上有一个可拖动的**光环助手**，会随着\"待机 / 听你说 / 思考 / 回话\"切换状态\n- 正在演进为**会做表情的 3D 真人形象**：说话时同步做出对应情绪的动作，而不只是一个球\n- 形象皮肤可由 AI 自己生成（AI 写好界面代码即时渲染）\n\n### 🎨 会\"现场画界面\"的助手（Canvas 画布）\n- 让它做一个仪表盘 / 数据看板 / 小工具，它能**直接画出可交互的界面**，而不只是给你一段文字\n- 界面能随实时数据自动更新\n- **自我修复**：AI 生成的界面万一出错，系统会自动把错误反馈给它、让它改好，不用你操心\n\n### 🔄 模型随便换，能力随便拆\n- 想换成更便宜 / 更强的模型？改一行配置即可，不用重写任何东西\n- 只想要个\"纯上网查资料\"的助手？把其它能力关掉照样跑\n- 一套底座，装出不同用途的助手（编码 / 研究 / 客服 / 运维……）\n\n---\n\n## 🧰 它能帮你做什么\n\n| 能力 | 说明 |\n|---|---|\n| 📂 **动手干活** | 读写文件、执行命令、搜索代码、批量编辑 —— 像一个能操作电脑的助手 |\n| 🌐 **上网研究** | 网页搜索 + 抓取正文，自动查资料、做调研 |\n| 👁️ **看懂图片** | 上传截图 / 照片，它能理解并描述内容 |\n| 🗣️ **语音对话** | 唤醒、说话输入、语音回话、可打断（见上方特色） |\n| 🧠 **长期记忆** | 跨对话记住你的偏好和事实，下次不用重复交代 |\n| 🧑‍🤝‍🧑 **分身干活** | 复杂任务能派\"子助手\"并行处理，也能丢后台跑不占用对话 |\n| ⏰ **定时任务** | 设定\"每天 / 某时刻\"自动执行，无人值守 |\n| 🔌 **接入外部工具** | 通过 MCP 标准接入数据库、GitHub、文件系统等海量现成工具 |\n| 📚 **学新本领（技能）** | 用一份说明文档就能教会它一项新技能，还能让它自己创建技能 |\n| 🔐 **密钥安全托管** | 需要 API key 时安全地向你索取、妥善保管，不泄漏到对话里 |\n| ✅ **危险操作先问你** | 删文件、执行命令等敏感动作会先弹窗让你确认（可调松紧档位） |\n| 🎨 **界面美化** | 15 套配色主题、深浅色、字号缩放、质感切换 |\n\n---\n\n## 🖥️ 在哪用\n\n- **网页控制台** —— 浏览器里完整的对话界面：消息流、工具执行过程、图片预览、审批弹窗、设置面板、用量统计\n- **桌面应用**（macOS / Windows）—— 双击即用，内嵌服务、托盘图标、首次启动向导\n- **命令行 / 第三方接入** —— 一切能力都通过标准 HTTP 接口开放，方便脚本和其它程序调用\n\n---\n\n## 🚀 如何使用 —— 一键装、一键起、免繁琐配置\n\n**只需填一个主模型的 API Key，剩下全交给 AI 自己搞定。** 不用手写配置文件、不用逐项调参数 —— 装好、启动、填个 key，就能对话。\n\n需 Node ≥ 22。\n\n```bash\nnpm install -g open-jarvis   # ① 一键安装\njarvis                       # ② 一键启动：自动起服务 + 开浏览器\n```\n\n启动后浏览器里的向导只问你**一件事**：填入主模型的 API Key（如 DeepSeek / 通义千问 / 任意 OpenAI 兼容服务）。填完即可开始用。\n\n**其余的都不用你操心**：想加密钥、切模型、换主题、开关某个能力，直接**用嘴 / 打字告诉贾维斯**，它会自己改好配置 —— 你不需要知道配置文件长什么样。\n\n常用命令：\n\n```bash\njarvis status     # 看在不在跑 / 端口 / URL\njarvis stop       # 停掉后台服务\njarvis autostart on   # 开机自动在后台运行\n```\n\n`jarvis` 是个轻量看门狗：后台拉起服务，崩溃自动重拉、改配置自动重启（终端可以随手关）。\n\n> **已知限制**：安装时 `@vscode/ripgrep` 会从 GitHub 下载二进制，内网 / 防火墙环境可能失败。\n\n### 桌面应用（macOS / Windows）\n\n更省心的方式：下载 macOS `.dmg` / `.app` 或 Windows NSIS 安装包，双击即用——服务已\n内嵌，带托盘图标和首次启动向导，无需命令行。Windows 安装包及部分系统原生能力仍需\n按平台矩阵完成真机验收；详见\n[`平台兼容性`](docs/00-overview/08-platform-compatibility.md)。\n\n---\n\n## ⭐ 官方推荐配置（可选，让贾维斯更全能）\n\n上面只填了主模型 key，就能对话了。想让贾维斯**能看、能搜、能听、能说**，按下面这套**官方推荐配置**，对贾维斯说一句「帮我配 XX」即可——它会自己查文档、收密钥、写配置、测通，你不用碰配置文件：\n\n| 能力 | 推荐方案 | 模型 | 大概价格 |\n|---|---|---|---|\n| 主力模型 | 国内 DeepSeek / 国外 OpenAI | `deepseek-v4-flash` / `gpt-5.6-luna` | DeepSeek：输入 ¥1 / 输出 ¥2；GPT-5.6 Luna：输入 $0.2 / 输出 $1.2 每百万 token |\n| 联网搜索 | 国内博查 Bocha / 国外 Tavily | — | 博查免费；Tavily 每月 1000 次免费，超出按量计费 |\n| 视觉（看图 / OCR） | 通义千问 | `qwen3.5-plus` 或 `qwen3.7-plus` | 3.5：¥0.8；3.7：输入 ¥2 / 输出 ¥8 每百万 token |\n| 语音识别（ASR） | 阿里云百炼 DashScope | `fun-asr-realtime`（16 方言 + 30 语言） | 0.00022 元 / 秒 |\n| 语音合成（TTS） | MiniMax 海螺 | `speech-2.8-hd` | 按字符计费 |\n\n- **主力模型**：对话 / 思考 / 干活的大脑。国内推荐 DeepSeek `V4 Flash`——**便宜**（输入 ¥1 / 输出 ¥2 每百万 token），而且 **V4 Flash 本身质量已经很好**，日常对话和干活都够用；国外推荐 OpenAI `GPT-5.6 Luna`——现在**也很便宜**（输入 $0.2 / 输出 $1.2 每百万 token），生态成熟、Agent 能力强\n- **联网搜索**：不靠可能过时的记忆答题，能查最新资料 / 价格 / 文档。国内推荐**博查**（免费），国外推荐 **Tavily**（专为 AI 设计、结果干净，每月 1000 次免费）\n- **视觉**：上传截图 / 照片，它能看懂内容、做 OCR\n- **语音识别**：直接开口说话，实时转写、说完自动回应。推荐阿里 DashScope 是因为**准确率高**（支持 16 种方言 + 30 种语言，噪声 / 远场场景也稳），而且**便宜**（约 0.013 元/分钟）。也可选本地免费 SenseVoice，隐私优先\n- **语音合成**：回话用云端高音质音色。推荐 MiniMax 海螺是因为**音色非常好**、**语气丰富自然**——支持 20+ 种语言（中 / 英 / 日 / 韩 / 西 / 法 / 德 / 粤语…），能带开心 / 难过 / 耳语等情绪，还能插入笑声 / 停顿，甚至克隆你自己的声音。国内外都推荐\n\n> 都是**按需选配**，不配也能正常用（语音回话有系统音兜底，图片上传需视觉才看得懂）。\n\n> **全本地 / 离线也没问题。** 主模型、TTS、ASR 都有本地方案（如 Ollama 本地模型、SenseVoice 本地识别、macOS 系统 TTS）——隐私、离线、免费，全部本地部署完全可行。只是**性能会下降很多**：本地 ASR 在算力 / 内存不足时识别延迟高、噪声环境更吃力，**连续长段输入时性能下降明显、会卡**；本地主模型相对云端下降更多（设备参数量级决定能力上限）。TTS 反而比较特殊——Mac 本地**自带系统语音，其实还行**，只是**没有情绪、音色不丰富**（云端 MiniMax 才有语气 / 方言 / 克隆声音）。设备强、重隐私可全本地；追求体验建议云端为主、本地为辅。\n\n---\n\n## 📖 想了解更多 / 技术文档\n\n想看架构设计、内核原理、插件开发、接口协议等技术细节，请进 **[`docs/`](docs/README.md)** 目录：\n\n| 你想…… | 去看 |\n|---|---|\n| 了解「什么是 harness、和框架有何不同」 | [`docs/00-overview/01-positioning.md`](docs/00-overview/01-positioning.md) |\n| 了解整体架构（核 / 壳 / 插件分层） | [`docs/00-overview/02-architecture.md`](docs/00-overview/02-architecture.md) |\n| 安装 / 配置 / 模型与角色 / 排错 | [`docs/user-guide/`](docs/user-guide/README.md) |\n| 用 HTTP 接口做第三方集成 | [`docs/user-guide/07-http-api.md`](docs/user-guide/07-http-api.md) |\n| 内核每个模块怎么设计的 | [`docs/10-kernel/`](docs/10-kernel/) |\n| 有哪些内置插件、怎么写自己的 | [`docs/20-plugins/`](docs/20-plugins/00-plugin-system.md) |\n| 完整文档索引 | [`docs/README.md`](docs/README.md) |\n\n## 🤝 合作与期望\n\n**欢迎 AR / VR 公司一起聊聊合作。** 贾维斯\"能看、能听、能说、能动手、有情绪化形象\"的形态，和 AR / VR 的沉浸式交互是天然契合的 —— 一个随身在场、听得懂、看得见、开口就答的助手，正是这类设备最需要的入口。有想法的团队欢迎来谈。\n\n**也希望模型厂商能针对「看、说、画」这类场景做针对性训练。** 我们在实际代码里已经做了大量兜底与自愈方案（渲染出错自动反馈让模型改好、绑定异常检测、错误采集回喂等），但这些终究是工程侧的补救。如果模型在这些多模态、边生成边渲染、语音实时交互的场景上被直接训练过，体验会从\"能用\"跃升到\"好用\"。\n\n## 授权协议\n\n本项目采用 **[Apache License 2.0](LICENSE)**。使用、修改、分发请保留版权声明与 [`NOTICE`](NOTICE) 文件。\n\n「OpenJarvis / 贾维斯」品牌名与 logo 归项目方所有。\n","readmeFilename":"README.md"}