{"id":34605890,"url":"https://github.com/roseforljh/everytalk","last_synced_at":"2026-05-18T02:13:49.099Z","repository":{"id":293716577,"uuid":"976418363","full_name":"roseforljh/EveryTalk","owner":"roseforljh","description":"君子爱财，取之有道","archived":false,"fork":false,"pushed_at":"2026-05-17T14:53:14.000Z","size":28511,"stargazers_count":162,"open_issues_count":2,"forks_count":20,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-17T16:51:46.080Z","etag":null,"topics":["android","html","jetpack-compose","kotlin"],"latest_commit_sha":null,"homepage":"https://www.everytalk.cc","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roseforljh.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-02T04:36:07.000Z","updated_at":"2026-05-17T14:53:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"b9bed00f-f298-4dc5-85ad-d9378b0e96b8","html_url":"https://github.com/roseforljh/EveryTalk","commit_stats":null,"previous_names":["roseforljh/kuntalkwithai","roseforljh/everytalk"],"tags_count":125,"template":false,"template_full_name":null,"purl":"pkg:github/roseforljh/EveryTalk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roseforljh%2FEveryTalk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roseforljh%2FEveryTalk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roseforljh%2FEveryTalk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roseforljh%2FEveryTalk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roseforljh","download_url":"https://codeload.github.com/roseforljh/EveryTalk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roseforljh%2FEveryTalk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33162452,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"online","status_checked_at":"2026-05-18T02:00:06.436Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","html","jetpack-compose","kotlin"],"created_at":"2025-12-24T13:45:09.243Z","updated_at":"2026-05-18T02:13:49.092Z","avatar_url":"https://github.com/roseforljh.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EveryTalk - 新一代智能对话平台\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"app1/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp\" alt=\"EveryTalk Logo\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e🚀 极致流畅 · 🎨 高度定制 · 🔒 隐私至上 · 🌐 全能多模态\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e一款革命性的 Android AI 对话客户端，集成前沿技术栈，支持任意大模型接入。\u003cbr/\u003e从文本对话到图像生成，从语音交互到实时联网，打造您的专属 AI 助手。\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/roseforljh/EveryTalk/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/roseforljh/EveryTalk?style=for-the-badge\u0026label=release\" alt=\"GitHub release (latest by date)\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/roseforljh/EveryTalk/blob/main/LICENSE.md\"\u003e\u003cimg src=\"https://img.shields.io/github/license/roseforljh/EveryTalk?style=for-the-badge\" alt=\"GitHub\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/roseforljh/EveryTalk/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/roseforljh/EveryTalk?style=for-the-badge\" alt=\"GitHub stars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://t.me/+EKxpszVkOBc1MGJl\"\u003e\u003cimg src=\"https://img.shields.io/badge/Telegram-Join%20Group-blue?style=for-the-badge\u0026logo=telegram\" alt=\"Telegram Group\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## 项目状态\n\n- **项目定位**: 面向 Android 的原生 AI 对话客户端，聚焦多模型接入、流式交互、多模态能力与本地化使用体验。\n- **当前平台**: Android 8.1 及以上，推荐 Android 10+；开发环境建议使用 Android Studio + JDK 17。\n- **能力范围**: 当前 README 所述能力覆盖文本对话、视觉理解、图像生成、语音交互、数学公式渲染、原生联网搜索与 OpenClaw 扩展接入。\n- **接入方式**: 支持直连兼容 API，也支持通过可选后端做请求代理、图像生成与附加能力扩展。\n- **使用门槛**: 首次使用至少需要一套可用的模型 API 地址、模型名称与对应密钥；部分高级能力依赖上游模型或后端支持。\n\n## 适合 / 不适合\n\n### 适合\n\n- 想在 Android 设备上统一接入多种大模型的个人用户\n- 需要流式响应、多模态输入、图像生成、语音交互的重度 AI 使用者\n- 希望基于 Kotlin + Jetpack Compose 学习原生 AI 应用实现的开发者\n- 需要通过 OpenClaw / Bridge 方案扩展远程能力的进阶用户\n\n### 不适合\n\n- 期望开箱即用、无需任何 API 配置即可直接使用的用户\n- 只关注单一模型官方体验，不需要多模型切换与自定义配置的用户\n- 需要 iOS、Web 或桌面端原生客户端的场景\n- 希望所有联网、语音、图像等能力都在纯离线环境下可用的场景\n\n## 使用前须知\n\n- 本项目当前主交付形态是 **Android 原生客户端**，核心工程位于 `app1/`。\n- 应用支持 **无后端直连模式**，但并不是所有模型都具备一致能力；例如联网搜索只对支持原生搜索的模型生效。\n- 图像生成、语音链路、后端代理、OpenClaw 等能力，是否可用取决于你接入的服务端或上游模型是否支持。\n- README 中的“支持”表示项目已经提供对应接入链路或消费能力，不等于任意模型在任意配置下都默认可用。\n- 仓库中同时包含 Android 客户端与可选后端相关代码，初次阅读时建议优先从 `README.md`、`docs/openclaw-integration.md` 和 `docs/plans/` 进入。\n\n## 文档入口\n\n- **项目总览**: 当前 `README.md`，用于了解定位、能力范围、接入方式与常见问题。\n- **OpenClaw 专题**: [`docs/openclaw-integration.md`](docs/openclaw-integration.md)，说明 EveryTalk -\u003e Bridge -\u003e Gateway 的接入链路与部署方式。\n- **方案沉淀**: `docs/plans/`，包含部分功能设计与演进方案，可用于理解历史决策与结构调整方向。\n- **Claude / Agent 相关文档**: `CLAUDE.md` 与 `AGENTS.md`，适合需要在本仓库内继续开发或协作的维护者。\n\n---\n\n## 目录\n\n- [🧭 项目状态](#项目状态)\n- [📌 适合--不适合](#适合--不适合)\n- [⚠️ 使用前须知](#使用前须知)\n- [📚 文档入口](#文档入口)\n- [🌟 核心特性](#-核心特性)\n- [🚀 快速开始](#-快速开始)\n- [👨‍💻 开发者指南](#-开发者指南)\n- [🛠️ 技术架构](#️-技术架构)\n- [📁 项目结构](#-项目结构)\n- [🔌 通信协议详解](#-通信协议详解)\n- [📚 技术实现文档](#-技术实现文档)\n- [🦞 OpenClaw 接入指南](#-openclaw-接入指南)\n- [🤝 贡献代码](#-贡献代码)\n- [❓ 常见问题](#-常见问题)\n- [📄 开源协议](#-开源协议)\n\n---\n\n## 🌟 核心特性\n\n### 🎯 智能对话系统\n- **🤖 全模型兼容**: 无缝接入 OpenAI、Google Gemini、Anthropic Claude、本地 Ollama 等任意兼容 API\n- **⚡ 极速流式响应**: 毫秒级流式输出，打字机效果丝般顺滑，当前采用直通式流式输出控制，接收到增量后直接累积并回传 UI\n- **🧠 推理过程可视化**: 支持 o1/o3 等推理模型的思考过程实时展示，让 AI 决策透明化\n- **🌐 深度联网搜索**:\n  - **Gemini**: 支持原生 Google Search 工具\n  - **Qwen**: 支持模型原生联网搜索\n- **🐍 代码解释器 (Code Execution)**:\n  - **Gemini**: 自动识别需要计算或数据处理的场景，在沙箱环境中运行 Python 代码并展示结果\n- **🔄 智能降级机制**: 遇到 Cloudflare 拦截自动切换直连模式，确保服务永不中断\n- **📐 数学公式渲染**: 支持 LaTeX 数学公式（$...$内联、$$...$$块级），离线渲染，深浅色主题自适应\n\n### 🎨 多模态交互\n- **🖼️ 视觉理解 (Vision)**:\n  - **图片识别**: 支持 GPT-4o, Gemini 1.5 Pro, Claude 3.5 Sonnet 等主流视觉模型\n  - **文档解析**: 智能识别 PDF、Word、Excel 等文档内容，直接与文档对话\n- **🎭 AI 图像生成**: 集成 DALL·E、Gemini Imagen 等主流图像生成模型\n- **🎙️ 实时语音对话 (Live Voice)**:\n  - **OpenAI**: 支持标准 TTS/STT 组合\n  - **Gemini**: 原生多模态音频流输入输出（低延迟）\n  - **Azure/Aliyun**: 接入云端高拟真语音合成服务\n- **🎨 图像编辑增强**: 支持图文混合编辑，智能图片压缩与优化\n\n### ⚙️ 高级定制\n- **🎛️ 深度参数控制**: Temperature、Top-P、Max Tokens 等参数精细调节\n- **📝 系统提示词管理**: 为不同场景创建专属 AI 人格\n- **🔧 多配置快速切换**: 保存多套 API 配置，一键切换不同模型\n- **🎨 图像比例预设**: 支持 1:1、16:9、9:16 等多种图像生成比例\n- **💾 会话历史管理**: 完整的对话历史记录与搜索功能\n- **☁️ 自动更新推送**: 每次发布新版本，自动通过 Telegram 频道推送通知\n\n### 🛡️ 安全与性能\n- **🔒 本地数据存储**: 所有配置和聊天记录仅存储在本地，零数据上传\n- **🔐 请求签名验证**: 内置 HMAC-SHA256 签名机制，防止中间人攻击\n- **⚡ 智能性能优化**:\n  - 流式输出控制器：直通式累积并回传 UI，支持长文本流式展示\n  - 智能滚动管理：用户手动滚动时自动暂停自动跟随\n- **🔄 容错与重试**: 多后端 URL 自动回退，确保服务高可用\n\n### 🎨 现代化 UI/UX\n- **🌓 完美深色模式**: 精心设计的浅色/深色主题，护眼舒适\n- **📱 Material Design 3**: 基于 Jetpack Compose 构建，遵循最新设计规范\n- **✨ 流畅动画效果**: Crossfade 过渡、平滑滚动、触觉反馈\n- **🎯 直观交互设计**: 侧边栏快速切换、长按操作菜单、智能输入建议\n\n---\n\n## 🚀 快速开始\n\n### 1. 下载安装\n\n1.  前往项目的 [**Releases**](https://github.com/roseforljh/EveryTalk/releases/latest) 页面。\n2.  下载最新版本的 `app-release.apk` 文件。\n3.  在您的安卓设备上允许\"安装未知来源的应用\",然后点击 APK 文件进行安装。\n\n### 1.1 自动发版与 Telegram 通知\n\n项目已配置完整的 CI/CD 流程（见 [.github/workflows/build-artifacts.yml](.github/workflows/build-artifacts.yml)）：\n\n1. **自动发版**：\n   - 合并 Release PR 后，自动构建 Release APK 和 AAB。\n   - 自动上传构建产物到 GitHub Releases。\n\n2. **Telegram 通知**：\n   - 构建完成后，机器人会自动向配置的 Telegram 频道发送新版本通知。\n   - 通知包含：版本号、更新日志链接、下载地址。\n\n3. **配置方法**：\n   - 在仓库 Settings → Secrets 中配置 `TELEGRAM_TOKEN` (Bot Token) 和 `TELEGRAM_TO` (频道 ID/用户名)。\n   - 配置 Android 签名密钥 (可选) 以生成正式签名的 APK。\n\n### 2. 配置模型\n\n首次启动应用后,您需要配置连接 AI 模型的 API。\n\n1.  从主屏幕左侧边缘向右滑动,或点击左上角的菜单按钮,打开侧边栏。\n2.  点击下方的 **\"添加一套新配置\"** 来创建您的专属连接。\n3.  在配置页面,填写您的服务信息:\n    - **配置名称**: 一个容易识别的名字 (例如: \"我的本地模型\")。\n    - **API 地址**: 您的 AI 服务 API 端点。\n    - **API 密钥**: 访问服务所需的密钥 (如果不需要,可以留空)。\n    - **模型名称**: 您想要使用的具体模型 ID (例如: `gpt-4`, `llama3-70b-8192`)。\n    - **系统提示词**: (可选)用于设定 AI 的角色和行为。\n4.  点击\"保存\",您的新配置就会出现在侧边栏列表中。\n\n\u003e **提示**: 应用支持无后端直连模式。当前联网搜索仅对支持原生搜索的模型生效（如 Gemini、Qwen）。\n\n### 3. 开始对话\n\n1.  在侧边栏选择您想使用的配置。\n2.  返回主聊天界面,在底部的输入框中输入您的问题。\n3.  点击右侧的发送按钮,或点击 \"+\" 号上传图片进行多模态对话。\n4.  您还可以通过输入框上方的开关来启用 **联网搜索**（仅 Gemini、Qwen 等支持原生搜索的模型可用）或查看 **思考过程**。\n\n## 👨‍💻 开发者指南\n\n### 从源码构建\n\n如果您想自行修改代码或体验最新功能,可以从源码构建应用:\n\n1.  克隆本仓库:\n    ```bash\n    git clone https://github.com/roseforljh/EveryTalk.git\n    cd EveryTalk\n    ```\n2.  使用 Android Studio 打开 `app1` 目录。\n3.  等待 Gradle 同步和构建完成。\n4.  连接您的安卓设备或使用模拟器,点击 \"Run 'app'\"。\n\n### 开发者配置\n\n应用支持通过构建参数注入一个\"后端代理 URL 列表\",用于容灾或并发请求:\n\n复制 `app1/local.properties.example` 为 `app1/local.properties`,并按需填写:\n\n```properties\n# 生产环境后端代理 URL (多个用逗号分隔)\nBACKEND_URLS_RELEASE=\"http://prod1.example.com/chat,http://prod2.example.com/chat\"\n\n# 开发环境后端代理 URL\nBACKEND_URLS_DEBUG=\"http://127.0.0.1:8000/chat\"\n```\n\n- 构建脚本会将该配置注入到 `BuildConfig.BACKEND_URLS` 中。\n- 默认使用串行模式(逐个尝试 URL),可在 `app/build.gradle.kts` 中开启并发模式。\n- 推荐将 URL 指向后端的聊天路由(如 `/chat`),图像生成路由会自动适配。\n\n---\n\n## 🛠️ 技术架构\n\n### 前端技术栈\n```\n┌─────────────────────────────────────────┐\n│         Jetpack Compose UI              │\n│  Material Design 3 · 响应式布局         │\n└─────────────────────────────────────────┘\n              ↓\n┌─────────────────────────────────────────┐\n│      Kotlin Coroutines \u0026 Flow           │\n│  异步处理 · 流式数据 · 状态管理         │\n└─────────────────────────────────────────┘\n              ↓\n┌─────────────────────────────────────────┐\n│         Ktor Client 网络层              │\n│  SSE 流式解析 · 多后端容错 · 直连降级   │\n└─────────────────────────────────────────┘\n              ↓\n┌─────────────────────────────────────────┐\n│      本地数据持久化层                    │\n│  SharedPreferences · 文件管理           │\n└─────────────────────────────────────────┘\n```\n\n### 核心组件\n- **[`ApiClient.kt`](app1/app/src/main/java/com/android/everytalk/data/network/ApiClient.kt)**: 统一网络请求客户端，支持流式 SSE 解析、多后端容错、Cloudflare 拦截自动降级\n- **[`StreamingOutputController.kt`](app1/app/src/main/java/com/android/everytalk/util/streaming/StreamingOutputController.kt)**: 直通式流式输出控制器，接收增量后直接累积并回传 UI\n- **[`GeminiDirectClient.kt`](app1/app/src/main/java/com/android/everytalk/data/network/GeminiDirectClient.kt)** / **[`OpenAIDirectClient.kt`](app1/app/src/main/java/com/android/everytalk/data/network/OpenAIDirectClient.kt)**: 直连客户端，支持无后端模式\n- **[`VoiceChatSession.kt`](app1/app/src/main/java/com/android/everytalk/data/network/VoiceChatSession.kt)**: 语音对话会话管理，STT → Chat → TTS 完整链路\n- **[`ImageCompressionPreferences.kt`](app1/app/src/main/java/com/android/everytalk/config/ImageCompressionPreferences.kt)**: 智能图片压缩配置管理\n\n### 系统要求\n| 组件 | 要求 |\n|------|------|\n| **最低 Android 版本** | Android 8.1 (API 27) |\n| **推荐 Android 版本** | Android 10+ (API 29+) |\n| **开发 IDE** | Android Studio Koala+ |\n| **JDK 版本** | JDK 17+ |\n| **后端服务** | 可选，支持无后端直连模式 |\n\n### 后端服务（可选）\n- **开源后端**: [backdAiTalk](https://github.com/roseforljh/backdAiTalk)\n- **功能**: 请求代理、图像生成、速率限制\n- **部署**: 支持 Docker 一键部署，可配置多实例负载均衡\n\n## 📁 项目结构\n\n```\nEveryTalk/\n├── app1/                                    # 📱 Android 客户端\n│   ├── app/\n│   │   ├── src/main/java/com/android/everytalk/\n│   │   │   ├── config/                      # ⚙️ 配置管理\n│   │   │   │   ├── BackendConfig.kt         # 后端 URL 配置\n│   │   │   │   └── ImageCompressionPreferences.kt  # 图片压缩配置\n│   │   │   ├── data/                        # 📊 数据层\n│   │   │   │   ├── network/                 # 🌐 网络请求\n│   │   │   │   │   ├── ApiClient.kt         # 统一 API 客户端\n│   │   │   │   │   ├── GeminiDirectClient.kt    # Gemini 直连\n│   │   │   │   │   ├── OpenAIDirectClient.kt    # OpenAI 直连\n│   │   │   │   │   ├── VoiceChatSession.kt      # 语音对话\n│   │   │   │   │   └── AppStreamEvent.kt        # 流式事件定义\n│   │   │   │   └── DataClass/               # 数据模型\n│   │   │   ├── statecontroller/             # 🎮 状态管理\n│   │   │   │   ├── AppViewModel.kt          # 主视图模型\n│   │   │   │   ├── facade/                  # 🌉 UI 状态门面 (原 statecontroller.ui)\n│   │   │   │   ├── StreamingBuffer.kt       # 流式缓冲\n│   │   │   │   └── ViewModelStateHolder.kt  # 状态持有者\n│   │   │   ├── ui/                          # 🎨 UI 层\n│   │   │   │   ├── screens/                 # 页面组件\n│   │   │   │   │   ├── MainScreen/          # 主聊天界面\n│   │   │   │   │   ├── ImageGeneration/     # 图像生成界面\n│   │   │   │   │   └── settings/            # 设置界面\n│   │   │   │   └── components/              # 通用组件\n│   │   │   └── util/                        # 🔧 工具类\n│   │   │       ├── StreamingOutputController.kt  # 流式输出控制\n│   │   │       ├── ImprovedContentDeduplicator.kt # 内容去重\n│   │   │       ├── RequestSignatureUtil.kt       # 请求签名\n│   │   │       └── ScrollController.kt           # 滚动控制\n│   │   └── build.gradle.kts                 # 构建配置\n│   └── local.properties.example             # 配置示例\n├── ET-Backend-code/                         # 🖥️ 后端服务（可选）\n│   ├── eztalk_proxy/                        # Python FastAPI 服务\n│   │   ├── api/                             # API 路由\n│   │   ├── services/                        # 业务逻辑\n│   │   └── docs/                            # 接口文档\n│   └── Dockerfile                           # Docker 部署\n└── README.md                                # 📖 项目文档\n```\n\n## 🔌 通信协议详解\n\n### 流式聊天接口\n\n**端点**: `POST /chat`\n\n**请求格式**: `multipart/form-data`\n```\n├── chat_request_json: ChatRequest (JSON)\n│   ├── model: string\n│   ├── messages: Array\u003cMessage\u003e\n│   ├── useWebSearch: boolean\n│   ├── showReasoning: boolean\n│   └── generationConfig: {...}\n└── uploaded_documents: File[] (可选)\n```\n\n**响应格式**: Server-Sent Events (SSE)\n```\ndata: {\"type\":\"content\",\"text\":\"Hello\",\"output_type\":null,\"block_type\":null}\n\ndata: {\"type\":\"reasoning\",\"text\":\"Let me think...\"}\n\ndata: {\"type\":\"web_search_results\",\"results\":[...]}\n\ndata: {\"type\":\"finish\",\"reason\":\"stop\"}\n\ndata: [DONE]\n```\n\n**事件类型**:\n- `content`: 流式文本内容\n- `content_final`: 最终完整内容\n- `reasoning`: 推理过程（o1/o3 模型）\n- `reasoning_finish`: 推理结束\n- `web_search_status`: 搜索状态更新\n- `web_search_results`: 搜索结果\n- `tool_call`: 工具调用\n- `error`: 错误信息\n- `finish`: 流结束\n\n### 图像生成接口\n\n**端点**: `POST /v1/images/generations`\n\n**请求格式**: `application/json`\n```json\n{\n  \"model\": \"dall-e-3\",\n  \"prompt\": \"A beautiful sunset\",\n  \"image_size\": \"1024x1024\",\n  \"batch_size\": 1,\n  \"apiAddress\": \"https://api.openai.com\",\n  \"apiKey\": \"sk-...\",\n  \"forceDataUri\": true\n}\n```\n\n**响应格式**:\n```json\n{\n  \"images\": [\n    {\n      \"url\": \"data:image/png;base64,...\"\n    }\n  ]\n}\n```\n\n### 直连模式\n\n当后端不可用时，客户端自动切换到直连模式：\n\n**Gemini 直连**:\n- 端点: `https://generativelanguage.googleapis.com/v1beta/models/{model}:streamGenerateContent`\n- 支持: 流式对话、多模态输入、联网搜索\n\n**OpenAI 直连**:\n- 端点: `https://api.openai.com/v1/chat/completions`\n- 支持: 流式对话、多模态输入、推理模式；Qwen 等支持原生搜索的兼容模型可启用联网搜索\n\n### 安全机制\n\n**请求签名**: 所有请求使用 HMAC-SHA256 签名\n```\nX-Signature: HMAC-SHA256(secret, method + path + timestamp + body)\nX-Timestamp: Unix timestamp\n```\n\n**数据加密**:\n- 本地数据使用 AES-256 加密存储\n- 网络传输强制 HTTPS\n- 支持自定义 SSL 证书固定\n\n---\n\n## 📚 技术实现文档\n\nEveryTalk 不仅是一个应用，更是一个学习现代 Android AI 开发的实战案例。我们整理了核心功能的技术实现文档，供开发者参考：\n\n| 主题 | 说明 | 链接 |\n|------|------|------|\n| **OpenClaw 接入** | 说明如何通过 EveryTalk + VPS Bridge + OpenClaw Gateway 的方式远程控制龙虾，包含一键安装命令、ET 端填写方式与 Cloudflare Worker 入口。 | [👉 查看文档](docs/openclaw-integration.md) |\n\n---\n\n## 🦞 OpenClaw 接入指南\n\n如果你希望通过 EveryTalk 在任意时间、任意地点远程控制部署在 VPS 上的龙虾，请查看：\n\n- [OpenClaw 接入指南](docs/openclaw-integration.md)\n\n当前推荐的最终安装方式是：\n\n```bash\ncurl -fsSL https://claw.everytalk.cc | bash\n```\n\n文档中已经包含：\n- 远程单文件安装脚本方案\n- ET 端应填写的地址与 Key\n- Cloudflare Worker 短链接入口\n- Bridge 与 Gateway 的职责边界\n\n---\n\n## 🤝 贡献代码\n\n我们非常欢迎社区的贡献!无论是报告 Bug、提出功能建议,还是提交代码,都是对项目的巨大支持。\n\n1.  **Fork** 本仓库。\n2.  创建您的特性分支 (`git checkout -b feature/AmazingFeature`)。\n3.  提交您的修改 (`git commit -m 'Add some AmazingFeature'`)。\n4.  推送至您的分支 (`git push origin feature/AmazingFeature`)。\n5.  **创建 Pull Request**。\n\n请确保遵循 Kotlin 官方编码规范,并为您的代码添加必要的注释和测试！\n\n---\n\n## ❓ 常见问题\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ1: 为什么无法连接到本地模型服务？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 请检查以下几点：\n1. 确保手机与电脑在同一局域网\n2. 使用电脑的局域网 IP（如 `192.168.1.100`），而非 `localhost` 或 `127.0.0.1`\n3. 检查防火墙是否允许相应端口\n4. 确认后端服务已正常启动\n5. 尝试在浏览器中访问 API 地址测试连通性\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ2: 联网搜索是如何实现的？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 当前仅保留模型原生搜索能力：\n1. **Gemini**：通过原生 `google_search` 工具执行联网搜索\n2. **Qwen**：通过上游接口的原生搜索参数启用联网搜索\n\n其他模型不会再走“客户端先搜索、再把结果注入上下文”的旧方案。搜索结果仍会以引用卡片形式展示，点击可查看来源链接。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ3: 支持哪些 AI 模型？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 支持所有兼容 OpenAI API 格式的模型：\n- **商业模型**: OpenAI GPT-4/o1, Google Gemini, Anthropic Claude, 智谱 GLM 等\n- **开源模型**: 通过 Ollama、LM Studio、vLLM 等部署的 Llama、Qwen、DeepSeek 等\n- **图像模型**: DALL·E 3, Gemini Imagen, Stable Diffusion 等\n\n只需填入对应的 API 地址和密钥即可使用。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ4: 如何配置后端代理？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 后端代理是可选的，配置步骤：\n1. 克隆后端仓库: `git clone https://github.com/roseforljh/backdAiTalk.git`\n2. 配置环境变量（参考 `.env.example`）\n3. 使用 Docker 部署: `docker-compose up -d`\n4. 在应用的 `local.properties` 中填入后端 URL\n\n**无后端模式**：应用支持直连 Gemini 和 OpenAI；联网搜索仅在支持原生搜索的模型上可用。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ5: 应用是否收集用户数据？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** **绝对不会！** \n- ✅ 所有配置和聊天记录仅存储在本地设备\n- ✅ API 请求直接发送到您配置的服务端点\n- ✅ 不包含任何数据统计或追踪代码\n- ✅ 完全开源，代码可审计\n- ✅ 无需注册账号，无需联网激活\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ6: 如何更新应用？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 两种更新方式：\n1. **应用内更新**：设置 → 关于 → 检查更新\n2. **手动更新**：访问 [Releases](https://github.com/roseforljh/EveryTalk/releases) 页面下载最新 APK，直接覆盖安装\n\n应用会自动保留您的所有配置和聊天记录。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ7: 遇到 Cloudflare 拦截怎么办？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 应用内置智能降级机制：\n1. 自动检测 Cloudflare 拦截\n2. 无缝切换到直连模式（Gemini/OpenAI）\n3. 保持对话连续性，用户无感知\n\n如果直连也失败，建议：\n- 更换 API 地址（使用反代或镜像站）\n- 配置自己的后端服务\n- 检查网络环境（VPN/代理设置）\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ8: 如何报告 Bug 或提出建议？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 欢迎通过以下方式反馈：\n1. [GitHub Issues](https://github.com/roseforljh/EveryTalk/issues)：提交 Bug 报告或功能建议\n2. 加入我们的 [Telegram 交流群](https://t.me/+EKxpszVkOBc1MGJl) 直接反馈\n3. 提供以下信息有助于快速定位问题：\n   - 设备型号和 Android 版本\n   - 应用版本号\n   - 详细的复现步骤\n   - 日志文件（设置 → 导出日志）\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ9: 语音对话功能如何使用？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 语音对话需要后端支持：\n1. 确保后端已配置 STT/TTS 服务\n2. 在聊天界面长按麦克风按钮开始录音\n3. 松开按钮自动识别并获取 AI 回复\n4. 支持多种音色选择（在设置中配置）\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ10: 如何优化图片上传速度？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 应用内置智能图片压缩：\n1. 进入设置 → 图片压缩配置\n2. 选择压缩模式：\n   - **自动选择**：根据用途自动优化\n   - **高质量**：最小压缩，保留细节\n   - **平衡**：默认模式，兼顾质量与速度\n   - **快速**：最大压缩，适合网络较慢时\n   - **自定义**：手动设置分辨率和质量\n3. 建议使用\"平衡\"或\"快速\"模式以提升上传速度\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ11: 如何在对话中使用数学公式？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 应用支持 LaTeX 数学公式渲染：\n\n**内联公式**（行内显示）：\n```\n这是一个内联公式 $E = mc^2$，它会在文本中显示。\n```\n\n**块级公式**（独立行显示）：\n```\n这是一个块级公式：\n\n$$\n\\int_{-\\infty}^{\\infty} e^{-x^2} dx = \\sqrt{\\pi}\n$$\n```\n\n**支持的语法**：\n- 基础运算：`$a + b$`, `$x^2$`, `$\\frac{a}{b}$`\n- 希腊字母：`$\\alpha$`, `$\\beta$`, `$\\gamma$`\n- 积分微分：`$\\int$`, `$\\sum$`, `$\\frac{d}{dx}$`\n- 矩阵：`$\\begin{matrix} a \u0026 b \\\\ c \u0026 d \\end{matrix}$`\n\n**特性**：\n- ✅ 离线渲染，无需网络\n- ✅ 深浅色主题自动适配\n- ✅ 流式渲染安全点检测（未闭合时缓冲，避免闪烁）\n- ✅ 与代码块、表格等其他格式兼容\n\n**示例对话**：\n```\n用户: 请解释二次方程公式\nAI: 二次方程 $ax^2 + bx + c = 0$ 的求根公式为：\n\n$$\nx = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}\n$$\n\n其中 $\\Delta = b^2 - 4ac$ 称为判别式。\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ12: AI流式输出结束后列表为什么会跳动？\u003c/b\u003e\u003c/summary\u003e\n\n**A:** 这是由于流式渲染切换导致的高度突变问题，已在最新版本中修复：\n\n**问题原因**：\n- 流式期间使用单一 `MarkdownRenderer`（紧凑布局）\n- 完成后切换为分段渲染（`CodeBlock` + `TableRenderer`，包含工具条与更大padding）\n- LazyColumn 项高度突变导致可视区域\"向上跳\"\n\n**修复方案**：\n1. **等高占位策略**：流式期间为含代码块/表格的消息添加与完成态一致的占位高度\n2. **单次切换策略**：等待解析完成后一次性替换，避免中间态回退\n\n**详细说明**：参见 [STREAMING_JUMP_FIX.md](STREAMING_JUMP_FIX.md)\n\n**配置开关**（在 `PerformanceConfig.kt` 中）：\n```kotlin\nENABLE_STREAMING_HEIGHT_PLACEHOLDER = true  // 启用等高占位\nENABLE_SINGLE_SWAP_RENDERING = true         // 启用单次切换\n```\n\n如需回退到旧逻辑，将上述开关设为 `false` 即可。\n\u003c/details\u003e\n\n---\n\n## 📄 开源协议\n\n本项目采用 [MIT License](LICENSE.md) 开源协议。\n\n这意味着您可以自由使用、修改和分发本软件,无论是商业还是非商业用途,但需要保留原始的版权和许可声明。\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e如果这个项目对您有帮助,请给我们一个 ⭐ Star!\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Made with ❤️ by the EveryTalk Team\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froseforljh%2Feverytalk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froseforljh%2Feverytalk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froseforljh%2Feverytalk/lists"}