16 KiB
Note
本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。
English · 原始项目 · 上游 README
原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。
MCA - MuYu Chat Agent
Android 本地优先 AI 工作区:本地 GGUF 聊天、用户自行配置的云端 API、模型管理,以及由用户控制的图像生成引擎。
MCA 是一款面向希望直接掌控模型、推理后端与云端 API 连接用户的 Android 原生、本地优先 AI 工作区。
项目当前聚焦于:
- 通过
llama.cpp进行本地 GGUF 聊天推理。 - 基于 OpenAI 兼容协议与 Anthropic Messages 协议的云端聊天引擎。
- 用户可配置的网页搜索,附带来源卡片与按轮次上下文注入。
- 本地与云端图像生成引擎管理。
- 面向 ModelScope 的模型发现与可断点续传下载。
- 基于 Compose 的移动端 UI,涵盖聊天、模型管理、图像生成、智能体诊断、设置与本地 API 工具。
MCA 不包含模型权重或 API 密钥。用户需自备本地模型、云端端点及服务商凭证。
截图
来自 Android 应用的真机截图:
| 聊天 | 工作区 | 图像 | 模型推荐 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
上方轻量 GIF 由真机截图生成。更高画质的 MP4 见 docs/assets/demo/mca-demo.mp4。
状态
本仓库是一个活跃的 Android 应用工作区。聊天与模型管理界面已可用,而本地图像生成仍处于实验阶段,需按设备与模型包分别测试。
当前发布状态:
- Alpha 版 APK 通过 GitHub Releases.
- 首个公开发布目标为
arm64-v8aAndroid 设备。 - 本地聊天是主要且稳定的本地路径。
- 用户在设置中配置搜索服务商后即可使用网页搜索。MCA 支持 SearxNG、Brave Search、Tavily、Jina Search 及自定义 JSON 搜索端点的手动、智能自动(smart-auto)与始终开启三种触发模式。
- 本地图像生成处于实验阶段,需要完整的模型包。请勿将手机端图像生成视为已保证稳定的特性。
功能特性
- 本地聊天:原生
llama.cpp桥接、流式生成、停止支持、 token 速度标签、推理内容过滤,以及本地基准测试支持。 - 云端聊天:用户自行配置的 OpenAI 兼容或 Anthropic Messages 端点,API 密钥在本地加密存储。
- 智能网页搜索:用户可配置 SearxNG、Brave Search、Tavily、Jina
Search 或自定义 JSON 搜索服务商。MCA 可识别 URL、检测显式搜索意图、扩展时效性或文档类查询、
对来源排序/去重、将结果摘要仅注入当前轮次,并在助手回复下方展示来源卡片。触发模式包括手动、
智能自动与始终开启;设置页面保留近期本地搜索诊断信息,涵盖触发原因、闭环验证证据、服务商错误、
部分扩展查询警告、扩展后的查询、来源数量、延迟、
可点击的来源 URL、服务商标签、来源摘要片段,以及基于可用来源、可读内容长度、独立主机
与安全拦截计算的本地来源质量评分。启用网页搜索后,即使尚未配置搜索 API,
也可直接读取 URL;关键词搜索仍需要 SearxNG、Brave、Tavily、Jina 或
自定义 JSON 端点。自定义 JSON 端点可使用诸如
/search?q={query}&limit={max_results}的 URL 模板, 或常见的q/query/max_results参数。服务商端点可自托管,但默认可读页面抓取与 直接 URL 读取会出于安全考虑拦截 localhost、私有局域网、链路本地及保留地址。选择带密钥的 Jina Search 时, MCA 可在公开页面的直接可读内容过弱时回退到 Jina Reader,同时保持相同的私有网络防护。MCA 并发读取多个 直接 URL、扩展搜索查询与抓取的页面正文,以在移动网络下保持实时搜索响应。关键词搜索成功结果会在短时窗口内使用 内存本地缓存,避免重复调用同一服务商;直接 URL 读取不缓存,API 密钥也绝不会存入缓存条目。设置中的搜索测试 使用表单中当前填写的字段,用户可在保存前验证端点。 闭环自测会记录 MCA 是否生成了服务商结果、提示词上下文、来源卡片数据、质量评分及本地 诊断信息。设置中还提供无密钥的公开 JSON 自检填充项,用户可在输入自有服务商前验证集成路径。MCA 在应用中将该来源标记为公开 JSON 自检源,因其仅为协议检查、覆盖范围有限,并非通用网页搜索引擎;生产环境应依赖可信或自托管的搜索服务。自定义 JSON 端点可返回顶层数组、包含results、items、data、hits或organic_results的对象,或data.results与response.items等嵌套变体。它接受常见的 URL/标题字段,如url、link、href、html_url、story_url、canonical_url、displayLink、formattedUrl、source.url、title、full_name、story_title以及source.title,以及摘要/正文字段,如summary、excerpt与pageContent。智能查询扩展产生多次搜索时, MCA 会保留成功的来源,即使某次扩展查询失败。 Tavily 与 Jina 使用Authorization: Bearer <key>;Brave 使用X-Subscription-Token,并同时支持 Web Search 端点与 LLM Context 端点,用于 AI grounding/RAG 风格摘要片段。公开 SearxNG 实例常会限流或禁用 JSON 响应,因此建议使用自托管或明确批准的端点以获得可靠搜索。 Brave 与 Tavily 官方 API 根 URL 会在预检与请求执行期间被接受并规范化为各自的 搜索路径。 - 图像页面:MCA 图像工作区,支持本地/云端引擎切换、 提示词编辑器、生成状态、模板卡片与图像库。
- 本地图像引擎:
stable-diffusion.cpp桥接,带进度/取消 钩子与感知模型包的模型注册。 - 模型中心:本地/导入模型、ModelScope 推荐、可断点续传 下载、文件分类与引擎分组。
- 助手与角色卡:多个本地助手,含系统提示词、
默认模型偏好、生成参数、记忆/搜索开关,以及
JSON 角色卡导入/导出。MCA 导出自身的
mca.assistant.card模式, 并可导入常见嵌套角色卡data字段为可用的 系统提示词。 - 智能体诊断:本地设备画像、模型推荐、 基于基准测试的调优,以及可解释的参数方案。
- 本地 API:面向可信同设备与
同局域网客户端的 OpenAI 兼容本地服务器,包括
/v1/models、/v1/chat/completions、JSON 回复与 SSE 流式传输。
安装
从 GitHub Releases. 下载最新 alpha 版 APK。Android 可能会要求你允许通过浏览器或文件管理器安装。
APK 不包含模型权重或云端凭据。安装后请:
- 添加本地 GGUF 聊天模型,或配置云端聊天引擎。
- 如需云端或本地图像生成,请配置图像引擎。
- 如需实时搜索,请在设置中配置网页搜索。你可以使用自托管 SearxNG 端点、Brave Search、Tavily、Jina Search,或兼容的自定义 JSON 端点;测试当前表单值后,再选择手动、智能自动或始终开启触发模式。Brave 可使用
/res/v1/web/search进行常规搜索,或使用/res/v1/llm/context获取面向 grounding 的摘要片段;Brave/Tavily 官方根 URL 会自动填入常规搜索路径。直接页面读取会拒绝 localhost、局域网、链路本地和保留地址,除非开发版显式启用私有网络抓取。完整配置、触发模式、来源卡片与故障排除指南见 docs/WEB_SEARCH.md。 快速来源指南:需要最快 API 密钥配置时选 Tavily 或 Brave;最看重隐私与控制时选自托管 SearxNG;页面正文提取需要帮助时选 Jina;自行运营搜索网关时选自定义 JSON。 - 启用网络或本地 API 工作流前,请先查看 docs/PERMISSIONS.md。
- 选择本地图像包或云端提供商协议前,请先查看 docs/MODEL_COMPATIBILITY.md。
Release APK 由项目维护者签名。Debug APK 不面向公众安装。
维护者可选的实时网页搜索冒烟测试:
$env:MCA_LIVE_WEB_SEARCH_TEST='true'
.\gradlew :app:testDebugUnitTest --tests com.muyuchat.mca.WebSearchProviderTest.liveDirectUrlSmokeReadsRealWebPageWhenEnabled
$env:MCA_LIVE_SEARXNG_ENDPOINT='https://your-searxng.example'
.\gradlew :app:testDebugUnitTest --tests com.muyuchat.mca.WebSearchProviderTest.liveSearxngSmokeUsesConfiguredEndpointWhenProvided
$env:MCA_LIVE_BRAVE_API_KEY='<key>'
.\gradlew :app:testDebugUnitTest --tests com.muyuchat.mca.WebSearchProviderTest.liveBraveSmokeUsesConfiguredKeyWhenProvided
$env:MCA_LIVE_TAVILY_API_KEY='<key>'
.\gradlew :app:testDebugUnitTest --tests com.muyuchat.mca.WebSearchProviderTest.liveTavilySmokeUsesConfiguredKeyWhenProvided
$env:MCA_LIVE_JINA_API_KEY='<key>'
.\gradlew :app:testDebugUnitTest --tests com.muyuchat.mca.WebSearchProviderTest.liveJinaSmokeUsesConfiguredKeyWhenProvided
$env:MCA_LIVE_CUSTOM_JSON_ENDPOINT='https://hn.algolia.com/api/v1/search'
.\gradlew :app:testDebugUnitTest --tests com.muyuchat.mca.WebSearchProviderTest.liveCustomJsonClosedLoopBuildsPromptSourcesAndDiagnosticsWhenProvided
仓库结构
:app- Android 应用、导航、ViewModel、云端/本地提供商。:core:native-llama.cpp本地聊天的 C++/JNI 桥接。:core:sd-native-stable-diffusion.cpp本地图像生成的 C++/JNI 桥接。:core:engine- 单活跃生成推理服务。:core:modelstore- GGUF 导入、清单、SHA-256、托管模型存储。:core:download- ModelScope 解析、文件列表与可恢复下载。:core:telemetry- 运行时指标、SoC 检测与 JSONL 日志。:core:deviceprofile- 设备能力与热特性分析。:core:tuning- 参数方案生成。:core:benchmark- 简短本地基准测试运行器。:core:advisor- 本地推荐引擎与 agent 日志。:api:local- AIDL 服务与回环 REST 服务器骨架。:feature:chat- 聊天与图像生成 UI。:feature:agent- agent 诊断 UI。:feature:modelhub- 模型管理 UI。:feature:settings- 运行时、日志与本地 API UI。
构建要求
- Android Studio 或命令行 Gradle。
- JDK 17。
- Android SDK,包含:
- 与
compileSdk匹配的 Android 平台。 - Android 构建工具。
- Gradle 配置的 CMake 3.31.6 或兼容版本。
- 与
gradle/libs.versions.toml匹配的 Android NDK。
- 与
创建本地 local.properties 文件,或设置 ANDROID_HOME:
sdk.dir=/path/to/android-sdk
local.properties 已被 Git 忽略。
克隆
本仓库使用子模块管理原生推理后端:
git clone --recurse-submodules <repo-url>
cd mym
若克隆时未包含子模块:
git submodule update --init --recursive
构建
PowerShell:
$env:JAVA_HOME='<path-to-jdk-17>'
$env:ANDROID_HOME='<path-to-android-sdk>'
.\gradlew.bat :app:assembleDebug
Bash:
export JAVA_HOME=/path/to/jdk-17
export ANDROID_HOME=/path/to/android-sdk
./gradlew :app:assembleDebug
Debug APK 生成于:
app/build/outputs/apk/debug/
原生后端
本地聊天
core/native 构建 libmca_native.so。存在 third_party/llama.cpp 时,该模块会链接 llama.cpp Android CPU 后端。项目在 llama.cpp 暂时不可用的开发构建中保留桩(stub)回退。
本地图像生成
core/sd-native 针对 third_party/stable-diffusion.cpp 构建 libmca_sd_native.so。MCA 将其 Android 专用补丁存放在:
third_party/patches/stable-diffusion.cpp-mca-android.patch
Gradle 会在原生 CMake 构建前按需应用此补丁。
本地图像生成对模型包敏感。部分较新的图像模型需要在同一引擎目录中包含扩散模型以及 VAE/AE 与文本编码器/LLM 组件。该能力目前处于实验阶段,在推广为稳定功能前应在每台目标设备上验证。
模型与 API 兼容性
当前兼容性矩阵(涵盖本地 GGUF 聊天、OpenAI 兼容聊天、Anthropic Messages、OpenAI Images、DashScope Image、自定义图像路径与实验性本地图像包)见 docs/MODEL_COMPATIBILITY.md。
本地 API
MCA 可通过 OpenAI 兼容 API 向受信任客户端暴露当前已加载的本地聊天模型。
当你希望其他应用、浏览器、桌面客户端或本地工具与手机上运行的模型对话时,可使用此功能。
推荐客户端设置:
| Field | Value |
|---|---|
| Protocol | OpenAI-compatible |
| Same-device Base URL | http://127.0.0.1:11435/v1 |
| Same-LAN Base URL | http://<phone-lan-ip>:11435/v1 |
| API key | 在 MCA 设置 -> 本地 API 中生成 |
| Model | 从 /v1/models 选择,或手动输入返回的模型 id |
支持的路径:
GET /healthGET /v1/modelsPOST /v1/chat/completionsGET /(内置网页聊天页)
/v1/chat/completions 支持标准 JSON 响应,stream=true 支持 Server-Sent Events(SSE)。同局域网访问需启用应用内“开放端口”开关,且仅应在受信任网络中使用。
隐私
- 本地聊天与本地图像生成在设备上运行。
- 云端聊天与云端图像生成会将提示词发送至用户配置的提供商端点。
- 云端 API 密钥在本地存储,并由 Android Keystore 加密保护。
- 本仓库不包含 API 密钥、模型权重或私人用户数据。
更多详情见 PRIVACY.md 与 docs/PERMISSIONS.md。
路线图
- v0.1 alpha:本地聊天、云端聊天、云端图像引擎、图像工作区、模型管理、面向 ModelScope 的下载与发布打包。
- v0.2 alpha:智能网页搜索、来源卡片、角色卡助手、本地 API 兼容性修复、网页搜索诊断与发布级兼容性文档。
- v0.3:稳定本地图像包、改进设备兼容性报告,并优化图像生成进度/取消行为。
MCA 有意不捆绑模型权重。模型推荐与下载来源必须遵守各上游模型的许可证。
第三方代码
本仓库通过子模块(submodule)引用上游原生项目:
llama.cpp- MIT License.stable-diffusion.cpp- MIT License.
贡献
MCA 仍处于早期阶段,更新频繁。在提交 issue 或 pull request 之前,请先阅读 CONTRIBUTING.md。
许可证
MCA 采用 MIT License 许可证。详见 LICENSE。










