mirobody 二进制、一个共享库(libmirobody)、一个 Python wheel、一个 Android .so,以及一个 iOS 静态库 / xcframework。本页讲如何逐个构建。
Mirobody 是一个从源码构建的原生二进制:运行
./build.sh(Windows 用 build.cmd),或使用 Docker。独立二进制(桌面 / 服务器)
- Linux / WSL / macOS
- Windows (MSVC + vcpkg)
1. 克隆
2. 安装原生依赖
这里 vcpkg 仅用于 Windows —— Linux 和 macOS 用系统包管理器,CMake 的find_package 会直接找到这些库。下面是核心依赖(始终需要)。桌面默认后端是 PostgreSQL,所以也装上 libpq。- Debian / Ubuntu / WSL
- Fedora / RHEL
- macOS (Homebrew)
3. 构建
clean 以任意顺序传入:pg / postgresql、legacy / pg_legacy、mysql、sqlite、duckdb、ck / clickhouse(省略即用 POSTGRESQL 默认)。每个后端构建到各自的 build[_<backend>] 目录,因此多个可以共存。或者直接调用 CMake:运行
config.example.yml 复制成 config.yml 并设置一个 LLM 密钥 —— 参见 快速开始 和 配置。服务器在 HTTP_HOST:HTTP_PORT(默认 0.0.0.0:8080)上提供 HTTP + WebSocket(以及从 res/htdoc 提供的 Web 客户端)。
Docker
仓库自带一个多阶段Dockerfile:阶段 1 从 Ubuntu 系统包集合编译出 mirobody 可执行文件;阶段 2 是一个精简的运行时镜像,只带二进制所链接的共享库。
config.example.yml 烘焙成优先级最低的默认层;真实设置来自挂载的 config.yml 或环境变量。细节见 Docker 部署。
其他构建产物
同一棵源码树除了独立二进制外,还能构建多个可嵌入的工件。共享库(libmirobody)—— Java / Go / C# / Node / Rust
共享库(libmirobody)—— Java / Go / C# / Node / Rust
构建 C-ABI 共享库(C API 声明在
mirobody.dll / libmirobody.so / .dylib),任何带 C FFI 的语言都能加载:src/mirobody.h(mirobody_start / mirobody_stop / mirobody_chat / …)。Go、C#、Node、Rust、Java 的可运行绑定位于 bindings/ 下。Python wheel —— 从源码构建(非 PyPI)
Python wheel —— 从源码构建(非 PyPI)
mirobody._mirobody 是一个 CPython 扩展(一个包装 mirobody::Server 的 pybind11 模块),由 scikit-build-core 打包成 .whl —— 你从源码构建它:python/README.md。Android —— 经 JNI 的 libmirobody.so
Android —— 经 JNI 的 libmirobody.so
android/ 下的 Android 工程通过 externalNativeBuild 拉取同一份 CMakeLists.txt,把 mirobody 目标构建为共享库(libmirobody.so),由宿主应用经 JNI 加载。原生依赖来自 android/prebuilt/<ABI>/ 下的预构建 sysroot(目前为 arm64-v8a)。iOS —— libmirobody.a / mirobody.xcframework
iOS —— libmirobody.a / mirobody.xcframework
iOS 目标构建 用
libmirobody.a,暴露 src/mirobody.h 中的 C API;Swift/Objective-C 宿主链接它并调用 mirobody_start / mirobody_stop。原生依赖来自 ios/prebuilt/<sdk>-<arch>/ 下的预构建 sysroot。xcodebuild -create-xcframework 把设备 + 模拟器切片打包成 xcframework。只构建 arm64 切片。桌面(Electron)与 Qt 客户端
桌面(Electron)与 Qt 客户端
electron/ 经 koffi FFI 在进程内嵌入 libmirobody,并使用自包含的 SQLite 后端(无需外部数据库)—— 先构建共享库和 Web 客户端,再 cd electron && npm install && npm start。qt/ 是一个原生 Qt Quick(QML)客户端,它是纯 HTTP/SSE API 客户端(不嵌入内核),与任意运行中的 mirobody 后端通信。两者都在仓库 README 中有说明。可选的文档格式库
不装这些内核也能正常构建;对应格式只会在运行时报告”未构建”。用 CMake 标志启用它们:| 功能 | CMake 标志 | 说明 |
|---|---|---|
.xlsx 读取 | (自动探测) | 经 xlnt。Linux/macOS 上未打包 —— 从源码构建;Windows 上经 vcpkg 必需。 |
| PDF 文本 + 栅格化 | -DMIROBODY_ENABLE_PDF=ON | 经 PDFium —— 下载一个预构建的 no-V8 版本,并把 -DCMAKE_PREFIX_PATH 指向它。 |
| 扫描版 PDF 的 OCR | -DMIROBODY_ENABLE_OCR=ON | 经 Tesseract(隐含 PDF);apt install tesseract-ocr libtesseract-dev libleptonica-dev tesseract-ocr-eng。 |
旧版 .xls | -DMIROBODY_ENABLE_XLS=ON | 经 libxls —— 无包,自行 vendor。 |
数据库后端
二进制里只会链接一个 SQL 后端,在构建期经-DMIROBODY_DATABASE_BACKEND=(或 build.sh 的 token)选定。SQL schema 位于 res/sql/ 下。
| 后端取值 | 默认用于 | build.sh token |
|---|---|---|
POSTGRESQL | 桌面 / 服务器 | pg / postgresql (默认) |
SQLITE | 移动端 / 自包含 | sqlite |
POSTGRESQL_LEGACY | — | legacy / pg_legacy |
MYSQL | — | mysql |
DUCKDB | — | duckdb |
CLICKHOUSE | —(目前为占位实现) | ck / clickhouse |
仓库结构
Agent 和 MCP 工具在编译期自注册:把一个
.cpp 丢进 res/agents/ 或 res/mcp_tools/ 再重新构建即可 —— 它们是编译进程序的,而非从运行时插件目录加载。验证安装
故障排查
libwebsockets 太旧 / websocket_client.cpp 编译失败
libwebsockets 太旧 / websocket_client.cpp 编译失败
代码需要 libwebsockets ≥ 4.1。Ubuntu 24.04 自带 4.3;更老的发行版(以及 Debian bookworm)可能太旧 —— 安装一个更新的构建,或用 Docker 镜像(它基于 Ubuntu 24.04)。
find_package 找不到某个依赖
find_package 找不到某个依赖
重新核对上面对应平台的依赖列表。如果某个库装在非标准前缀下,用
-DCMAKE_PREFIX_PATH=<install-root> 把 CMake 指向它。端口冲突
端口冲突
修改
config.yml 里的 HTTP_PORT(默认 8080),然后重启。数据库连接失败
数据库连接失败
桌面构建链接的是 PostgreSQL —— 设置
config.yml 里的 PG_* 键,或用 ./build.sh sqlite 重新构建,得到一个无需外部数据库的自包含 SQLite 后端。下一步
配置
在
config.yml 里配置 Provider、数据库、存储和鉴权快速开始
从克隆到运行二进制的最短路径
架构
理解 Mirobody 如何工作
开发
搭建带测试的开发构建