🚀 极致流畅 · 🎨 高度定制 · 🔒 隐私至上 · 🌐 全能多模态
一款革命性的 Android AI 对话客户端,集成前沿技术栈,支持任意大模型接入。
从文本对话到图像生成,从语音交互到实时联网,打造您的专属 AI 助手。
- 🌟 核心特性
- 📱 应用截图
- 🚀 快速开始
- 👨💻 开发者指南
- 🛠️ 技术架构
- 📁 项目结构
- 🔌 通信协议详解
- 📚 技术实现文档
- 🦞 OpenClaw 接入指南
- 🤝 贡献代码
- ❓ 常见问题
- 📄 开源协议
- 🤖 全模型兼容: 无缝接入 OpenAI、Google Gemini、Anthropic Claude、本地 Ollama 等任意兼容 API
- ⚡ 极速流式响应: 毫秒级流式输出,打字机效果丝般顺滑,配备智能去重与内容缓冲机制
- 🧠 推理过程可视化: 支持 o1/o3 等推理模型的思考过程实时展示,让 AI 决策透明化
- 🌐 深度联网搜索:
- Google/OpenAI: 支持标准的 Web Search 插件
- Qwen: 深度集成通义千问联网搜索能力,支持新闻/学术多模式切换
- 🐍 代码解释器 (Code Execution):
- Gemini: 自动识别需要计算或数据处理的场景,在沙箱环境中运行 Python 代码并展示结果
- 🔄 智能降级机制: 遇到 Cloudflare 拦截自动切换直连模式,确保服务永不中断
- 📐 数学公式渲染: 支持 LaTeX 数学公式($...$内联、$$...$$块级),离线渲染,深浅色主题自适应
- 🖼️ 视觉理解 (Vision):
- 图片识别: 支持 GPT-4o, Gemini 1.5 Pro, Claude 3.5 Sonnet 等主流视觉模型
- 文档解析: 智能识别 PDF、Word、Excel 等文档内容,直接与文档对话
- 🎭 AI 图像生成: 集成 DALL·E、Gemini Imagen 等主流图像生成模型
- 🎙️ 实时语音对话 (Live Voice):
- OpenAI: 支持标准 TTS/STT 组合
- Gemini: 原生多模态音频流输入输出(低延迟)
- Azure/Aliyun: 接入云端高拟真语音合成服务
- 🎨 图像编辑增强: 支持图文混合编辑,智能图片压缩与优化
- 🎛️ 深度参数控制: Temperature、Top-P、Max Tokens 等参数精细调节
- 📝 系统提示词管理: 为不同场景创建专属 AI 人格
- 🔧 多配置快速切换: 保存多套 API 配置,一键切换不同模型
- 🎨 图像比例预设: 支持 1:1、16:9、9:16 等多种图像生成比例
- 💾 会话历史管理: 完整的对话历史记录与搜索功能
- ☁️ 自动更新推送: 每次发布新版本,自动通过 Telegram 频道推送通知
- 🔒 本地数据存储: 所有配置和聊天记录仅存储在本地,零数据上传
- 🔐 请求签名验证: 内置 HMAC-SHA256 签名机制,防止中间人攻击
- ⚡ 智能性能优化:
- 流式输出控制器:防止内存溢出,支持 500KB+ 长文本
- 内容去重机制:基于 SHA-256 + LRU 缓存,避免重复渲染
- 智能滚动管理:用户手动滚动时自动暂停自动跟随
- 🔄 容错与重试: 多后端 URL 自动回退,确保服务高可用
- 🌓 完美深色模式: 精心设计的浅色/深色主题,护眼舒适
- 📱 Material Design 3: 基于 Jetpack Compose 构建,遵循最新设计规范
- ✨ 流畅动画效果: Crossfade 过渡、平滑滚动、触觉反馈
- 🎯 直观交互设计: 侧边栏快速切换、长按操作菜单、智能输入建议
| 主聊天界面 | 侧边栏/模型切换 | 设置界面 |
|---|---|---|
![]() |
![]() |
![]() |
| 图像生成界面 | 关于 |
|---|---|
![]() |
![]() |
- 前往项目的 Releases 页面。
- 下载最新版本的
app-release.apk文件。 - 在您的安卓设备上允许"安装未知来源的应用",然后点击 APK 文件进行安装。
项目已配置完整的 CI/CD 流程(见 .github/workflows/build-artifacts.yml):
-
自动发版:
- 合并 Release PR 后,自动构建 Release APK 和 AAB。
- 自动上传构建产物到 GitHub Releases。
-
Telegram 通知:
- 构建完成后,机器人会自动向配置的 Telegram 频道发送新版本通知。
- 通知包含:版本号、更新日志链接、下载地址。
-
配置方法:
- 在仓库 Settings → Secrets 中配置
TELEGRAM_TOKEN(Bot Token) 和TELEGRAM_TO(频道 ID/用户名)。 - 配置 Android 签名密钥 (可选) 以生成正式签名的 APK。
- 在仓库 Settings → Secrets 中配置
首次启动应用后,您需要配置连接 AI 模型的 API。
- 从主屏幕左侧边缘向右滑动,或点击左上角的菜单按钮,打开侧边栏。
- 点击下方的 "添加一套新配置" 来创建您的专属连接。
- 在配置页面,填写您的服务信息:
- 配置名称: 一个容易识别的名字 (例如: "我的本地模型")。
- API 地址: 您的 AI 服务 API 端点。
- API 密钥: 访问服务所需的密钥 (如果不需要,可以留空)。
- 模型名称: 您想要使用的具体模型 ID (例如:
gpt-4,llama3-70b-8192)。 - 系统提示词: (可选)用于设定 AI 的角色和行为。
- 点击"保存",您的新配置就会出现在侧边栏列表中。
提示: 应用支持无后端直连模式(Gemini/OpenAI),也可配置后端代理以使用联网搜索等高级功能。
- 在侧边栏选择您想使用的配置。
- 返回主聊天界面,在底部的输入框中输入您的问题。
- 点击右侧的发送按钮,或点击 "+" 号上传图片进行多模态对话。
- 您还可以通过输入框上方的开关来启用 联网搜索 或查看 思考过程。
如果您想自行修改代码或体验最新功能,可以从源码构建应用:
- 克隆本仓库:
git clone https://github.com/roseforljh/EveryTalk.git cd EveryTalk - 使用 Android Studio 打开
app1目录。 - 等待 Gradle 同步和构建完成。
- 连接您的安卓设备或使用模拟器,点击 "Run 'app'"。
应用支持通过构建参数注入一个"后端代理 URL 列表",用于容灾或并发请求:
复制 app1/local.properties.example 为 app1/local.properties,并按需填写:
# 生产环境后端代理 URL (多个用逗号分隔)
BACKEND_URLS_RELEASE="http://prod1.example.com/chat,http://prod2.example.com/chat"
# 开发环境后端代理 URL
BACKEND_URLS_DEBUG="http://127.0.0.1:8000/chat"- 构建脚本会将该配置注入到
BuildConfig.BACKEND_URLS中。 - 默认使用串行模式(逐个尝试 URL),可在
app/build.gradle.kts中开启并发模式。 - 推荐将 URL 指向后端的聊天路由(如
/chat),图像生成路由会自动适配。
┌─────────────────────────────────────────┐
│ Jetpack Compose UI │
│ Material Design 3 · 响应式布局 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Kotlin Coroutines & Flow │
│ 异步处理 · 流式数据 · 状态管理 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Ktor Client 网络层 │
│ SSE 流式解析 · 多后端容错 · 直连降级 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 本地数据持久化层 │
│ SharedPreferences · 文件管理 │
└─────────────────────────────────────────┘
ApiClient.kt: 统一网络请求客户端,支持流式 SSE 解析、多后端容错、Cloudflare 拦截自动降级StreamingOutputController.kt: 流式输出控制器,实现打字机效果与内容去重GeminiDirectClient.kt/OpenAIDirectClient.kt: 直连客户端,支持无后端模式VoiceChatSession.kt: 语音对话会话管理,STT → Chat → TTS 完整链路ImageCompressionPreferences.kt: 智能图片压缩配置管理
| 组件 | 要求 |
|---|---|
| 最低 Android 版本 | Android 8.1 (API 27) |
| 推荐 Android 版本 | Android 10+ (API 29+) |
| 开发 IDE | Android Studio Koala+ |
| JDK 版本 | JDK 17+ |
| 后端服务 | 可选,支持无后端直连模式 |
- 开源后端: backdAiTalk
- 功能: 请求代理、联网搜索、图像生成、速率限制
- 部署: 支持 Docker 一键部署,可配置多实例负载均衡
EveryTalk/
├── app1/ # 📱 Android 客户端
│ ├── app/
│ │ ├── src/main/java/com/android/everytalk/
│ │ │ ├── config/ # ⚙️ 配置管理
│ │ │ │ ├── BackendConfig.kt # 后端 URL 配置
│ │ │ │ └── ImageCompressionPreferences.kt # 图片压缩配置
│ │ │ ├── data/ # 📊 数据层
│ │ │ │ ├── network/ # 🌐 网络请求
│ │ │ │ │ ├── ApiClient.kt # 统一 API 客户端
│ │ │ │ │ ├── GeminiDirectClient.kt # Gemini 直连
│ │ │ │ │ ├── OpenAIDirectClient.kt # OpenAI 直连
│ │ │ │ │ ├── VoiceChatSession.kt # 语音对话
│ │ │ │ │ └── AppStreamEvent.kt # 流式事件定义
│ │ │ │ └── DataClass/ # 数据模型
│ │ │ ├── statecontroller/ # 🎮 状态管理
│ │ │ │ ├── AppViewModel.kt # 主视图模型
│ │ │ │ ├── facade/ # 🌉 UI 状态门面 (原 statecontroller.ui)
│ │ │ │ ├── StreamingBuffer.kt # 流式缓冲
│ │ │ │ └── ViewModelStateHolder.kt # 状态持有者
│ │ │ ├── ui/ # 🎨 UI 层
│ │ │ │ ├── screens/ # 页面组件
│ │ │ │ │ ├── MainScreen/ # 主聊天界面
│ │ │ │ │ ├── ImageGeneration/ # 图像生成界面
│ │ │ │ │ └── settings/ # 设置界面
│ │ │ │ └── components/ # 通用组件
│ │ │ └── util/ # 🔧 工具类
│ │ │ ├── StreamingOutputController.kt # 流式输出控制
│ │ │ ├── ImprovedContentDeduplicator.kt # 内容去重
│ │ │ ├── RequestSignatureUtil.kt # 请求签名
│ │ │ └── ScrollController.kt # 滚动控制
│ │ └── build.gradle.kts # 构建配置
│ └── local.properties.example # 配置示例
├── ET-Backend-code/ # 🖥️ 后端服务(可选)
│ ├── eztalk_proxy/ # Python FastAPI 服务
│ │ ├── api/ # API 路由
│ │ ├── services/ # 业务逻辑
│ │ └── docs/ # 接口文档
│ └── Dockerfile # Docker 部署
└── README.md # 📖 项目文档
端点: POST /chat
请求格式: multipart/form-data
├── chat_request_json: ChatRequest (JSON)
│ ├── model: string
│ ├── messages: Array<Message>
│ ├── useWebSearch: boolean
│ ├── showReasoning: boolean
│ └── generationConfig: {...}
└── uploaded_documents: File[] (可选)
响应格式: Server-Sent Events (SSE)
data: {"type":"content","text":"Hello","output_type":null,"block_type":null}
data: {"type":"reasoning","text":"Let me think..."}
data: {"type":"web_search_results","results":[...]}
data: {"type":"finish","reason":"stop"}
data: [DONE]
事件类型:
content: 流式文本内容content_final: 最终完整内容reasoning: 推理过程(o1/o3 模型)reasoning_finish: 推理结束web_search_status: 搜索状态更新web_search_results: 搜索结果tool_call: 工具调用error: 错误信息finish: 流结束
端点: POST /v1/images/generations
请求格式: application/json
{
"model": "dall-e-3",
"prompt": "A beautiful sunset",
"image_size": "1024x1024",
"batch_size": 1,
"apiAddress": "https://api.openai.com",
"apiKey": "sk-...",
"forceDataUri": true
}响应格式:
{
"images": [
{
"url": "data:image/png;base64,..."
}
]
}当后端不可用时,客户端自动切换到直连模式:
Gemini 直连:
- 端点:
https://generativelanguage.googleapis.com/v1beta/models/{model}:streamGenerateContent - 支持: 流式对话、多模态输入、联网搜索
OpenAI 直连:
- 端点:
https://api.openai.com/v1/chat/completions - 支持: 流式对话、多模态输入、推理模式
请求签名: 所有请求使用 HMAC-SHA256 签名
X-Signature: HMAC-SHA256(secret, method + path + timestamp + body)
X-Timestamp: Unix timestamp
数据加密:
- 本地数据使用 AES-256 加密存储
- 网络传输强制 HTTPS
- 支持自定义 SSL 证书固定
EveryTalk 不仅是一个应用,更是一个学习现代 Android AI 开发的实战案例。我们整理了核心功能的技术实现文档,供开发者参考:
| 主题 | 说明 | 链接 |
|---|---|---|
| Gemini 代码执行 | 深度解析 Gemini 原生 Code Execution 工具的实现原理,包括触发逻辑、请求构建、结果解析等。 | 👉 查看文档 |
| Gemini 联网搜索 | 详解 Gemini 原生 Google Search 工具的集成方案,涵盖智能触发、流式引用解析等。 | 👉 查看文档 |
| 滚动性能优化 | 分享我们在长列表滚动回滚(Scrolling Rollback)问题上的排查思路与优化方案,包含流式渲染稳定性与 Compose 性能优化。 | 👉 查看文档 |
| OpenClaw 接入 | 说明如何通过 EveryTalk + VPS Bridge + OpenClaw Gateway 的方式远程控制龙虾,包含一键安装命令、ET 端填写方式与 Cloudflare Worker 入口。 | 👉 查看文档 |
如果你希望通过 EveryTalk 在任意时间、任意地点远程控制部署在 VPS 上的龙虾,请查看:
当前推荐的最终安装方式是:
curl -fsSL https://claw.everytalk.cc | bash文档中已经包含:
- 远程单文件安装脚本方案
- ET 端应填写的地址与 Key
- Cloudflare Worker 短链接入口
- Bridge 与 Gateway 的职责边界
我们非常欢迎社区的贡献!无论是报告 Bug、提出功能建议,还是提交代码,都是对项目的巨大支持。
- Fork 本仓库。
- 创建您的特性分支 (
git checkout -b feature/AmazingFeature)。 - 提交您的修改 (
git commit -m 'Add some AmazingFeature')。 - 推送至您的分支 (
git push origin feature/AmazingFeature)。 - 创建 Pull Request。
请确保遵循 Kotlin 官方编码规范,并为您的代码添加必要的注释和测试!
Q1: 为什么无法连接到本地模型服务?
A: 请检查以下几点:
- 确保手机与电脑在同一局域网
- 使用电脑的局域网 IP(如
192.168.1.100),而非localhost或127.0.0.1 - 检查防火墙是否允许相应端口
- 确认后端服务已正常启动
- 尝试在浏览器中访问 API 地址测试连通性
Q2: 联网搜索是如何实现的?
A: 联网搜索有两种实现方式:
- 后端代理模式:后端调用搜索引擎 API,整合结果后注入到 AI 上下文
- 直连模式:客户端直接调用搜索 API(需在
customExtraBody中配置搜索端点)
搜索结果会以引用卡片形式展示,点击可查看来源链接。
Q3: 支持哪些 AI 模型?
A: 支持所有兼容 OpenAI API 格式的模型:
- 商业模型: OpenAI GPT-4/o1, Google Gemini, Anthropic Claude, 智谱 GLM 等
- 开源模型: 通过 Ollama、LM Studio、vLLM 等部署的 Llama、Qwen、DeepSeek 等
- 图像模型: DALL·E 3, Gemini Imagen, Stable Diffusion 等
只需填入对应的 API 地址和密钥即可使用。
Q4: 如何配置后端代理?
A: 后端代理是可选的,配置步骤:
- 克隆后端仓库:
git clone https://github.com/roseforljh/backdAiTalk.git - 配置环境变量(参考
.env.example) - 使用 Docker 部署:
docker-compose up -d - 在应用的
local.properties中填入后端 URL
无后端模式:应用支持直连 Gemini 和 OpenAI,无需后端即可使用基础功能。
Q5: 应用是否收集用户数据?
A: 绝对不会!
- ✅ 所有配置和聊天记录仅存储在本地设备
- ✅ API 请求直接发送到您配置的服务端点
- ✅ 不包含任何数据统计或追踪代码
- ✅ 完全开源,代码可审计
- ✅ 无需注册账号,无需联网激活
Q7: 遇到 Cloudflare 拦截怎么办?
A: 应用内置智能降级机制:
- 自动检测 Cloudflare 拦截
- 无缝切换到直连模式(Gemini/OpenAI)
- 保持对话连续性,用户无感知
如果直连也失败,建议:
- 更换 API 地址(使用反代或镜像站)
- 配置自己的后端服务
- 检查网络环境(VPN/代理设置)
Q8: 如何报告 Bug 或提出建议?
A: 欢迎通过以下方式反馈:
- GitHub Issues:提交 Bug 报告或功能建议
- 加入我们的 Telegram 交流群 直接反馈
- 提供以下信息有助于快速定位问题:
- 设备型号和 Android 版本
- 应用版本号
- 详细的复现步骤
- 日志文件(设置 → 导出日志)
Q9: 语音对话功能如何使用?
A: 语音对话需要后端支持:
- 确保后端已配置 STT/TTS 服务
- 在聊天界面长按麦克风按钮开始录音
- 松开按钮自动识别并获取 AI 回复
- 支持多种音色选择(在设置中配置)
Q10: 如何优化图片上传速度?
A: 应用内置智能图片压缩:
- 进入设置 → 图片压缩配置
- 选择压缩模式:
- 自动选择:根据用途自动优化
- 高质量:最小压缩,保留细节
- 平衡:默认模式,兼顾质量与速度
- 快速:最大压缩,适合网络较慢时
- 自定义:手动设置分辨率和质量
- 建议使用"平衡"或"快速"模式以提升上传速度
Q11: 如何在对话中使用数学公式?
A: 应用支持 LaTeX 数学公式渲染:
内联公式(行内显示):
这是一个内联公式 $E = mc^2$,它会在文本中显示。
块级公式(独立行显示):
这是一个块级公式:
$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$
支持的语法:
- 基础运算:
$a + b$,$x^2$,$\frac{a}{b}$ - 希腊字母:
$\alpha$,$\beta$,$\gamma$ - 积分微分:
$\int$,$\sum$,$\frac{d}{dx}$ - 矩阵:
$\begin{matrix} a & b \\ c & d \end{matrix}$
特性:
- ✅ 离线渲染,无需网络
- ✅ 深浅色主题自动适配
- ✅ 流式渲染安全点检测(未闭合时缓冲,避免闪烁)
- ✅ 与代码块、表格等其他格式兼容
示例对话:
用户: 请解释二次方程公式
AI: 二次方程 $ax^2 + bx + c = 0$ 的求根公式为:
$$
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$
其中 $\Delta = b^2 - 4ac$ 称为判别式。
Q12: AI流式输出结束后列表为什么会跳动?
A: 这是由于流式渲染切换导致的高度突变问题,已在最新版本中修复:
问题原因:
- 流式期间使用单一
MarkdownRenderer(紧凑布局) - 完成后切换为分段渲染(
CodeBlock+TableRenderer,包含工具条与更大padding) - LazyColumn 项高度突变导致可视区域"向上跳"
修复方案:
- 等高占位策略:流式期间为含代码块/表格的消息添加与完成态一致的占位高度
- 单次切换策略:等待解析完成后一次性替换,避免中间态回退
详细说明:参见 STREAMING_JUMP_FIX.md
配置开关(在 PerformanceConfig.kt 中):
ENABLE_STREAMING_HEIGHT_PLACEHOLDER = true // 启用等高占位
ENABLE_SINGLE_SWAP_RENDERING = true // 启用单次切换如需回退到旧逻辑,将上述开关设为 false 即可。
本项目采用 MIT License 开源协议。
这意味着您可以自由使用、修改和分发本软件,无论是商业还是非商业用途,但需要保留原始的版权和许可声明。
如果这个项目对您有帮助,请给我们一个 ⭐ Star!
Made with ❤️ by the EveryTalk Team





