EasyAI - iOS AI 聊天应用
一个面向长期迭代的 iOS AI 聊天基础工程,不只跑通接口,更关注完整体验与可维护性:体验顺滑、功能闭环、结构清晰。
项目地址:https://github.com/qw9685/easyAI
🎬 Demo
[(image-c4301c-1770778301808)]
chat.gif

history.gif

set.gif
why?
很多示例要么只有文本对话,要么没有真正的流式体验,要么缺少会话历史与持久化。
EasyAI 的目标是:打开就能用、聊起来舒服、后续还能持续加功能。
特点?
1)多模型:一个入口接入主流大模型
- 基于 OpenRouter 获取模型列表并发起对话请求
- 支持搜索/筛选/收藏模型
- 支持查看上下文长度、价格等关键信息,减少“盲选”
2)真流式输出:边生成边显示
- 支持 SSE 流式响应(非本地伪流式)
- 回复实时增长,体验更接近 ChatGPT/Claude 类产品
- 支持可选本地打字机显示,可在设置中开关与调速
3)智能路由 + 自动降级:更稳的对话链路
- 路由模式支持手动/智能,智能模式可按任务意图与预算偏好选择模型
- 请求失败时支持自动 fallback 重试(可配置重试次数、预算策略、错误类型)
- 支持原生 fallback 深度配置,多模态场景会优先选择支持图片输入的模型
4)支持图片:多模态输入链路打通
- 相册多选图片(最多 5 张)
- 发送前可预览/删除
- 聊天内支持多图横向展示
5)Markdown 渲染更像聊天产品
- 代码块/引用/列表/链接/图片/HTML/数学公式等富文本展示
- 代码块支持一键复制
- 代码块支持系统分享导出
6)Prompt 模板 + 语音输入:提效输入侧
- 输入栏内置 Prompt 模板(会议纪要、翻译、代码讲解、Bug 修复等)
- 模板可一键注入输入框,并联动推荐模型
- 支持语音输入(STT)实时转写
7)对话历史 + 本地持久化:从演示到可用
- 支持多会话列表、重命名、置顶、删除、搜索
- 消息与会话本地保存,冷启动可恢复
8)产品级交互:停止生成 + 状态一致
- 生成中支持一键停止(发送按钮切换为停止)
- 停止后保留已显示文本、结束 loading 并显示时间
- 若停止时尚未输出正文,显示“已停止 + 时间”(仅 UI 提示,不写入持久化历史)
9)TTS 语音朗读增强:可配置 + 不错乱
- 助手回复自动朗读(流式/非流式)
- 流式按句子结束切段串行播放,避免乱序
- 播放前清洗文本(过滤 Emoji、Markdown、URL 等)
- 聊天页支持静音/恢复(mute,不是 stop)
- 支持配置音色/语速/音高
10)可观测性与调试能力
- 消息级状态栏展示 Token/耗时/成本估算
- 可显示运行状态(路由命中、fallback 重试、错误分类)
- 模型页提供最近对话统计、智能路由效果统计、Provider 统计
- 支持 phase 日志(turnId/itemId)用于排查流式与持久化问题
设置项(App 内可调)
- API Key(Keychain 存储)
- 假数据模式(无 Key 也可联调 UI)
- 流式响应开关
- 打字机开关与速度/刷新率
- 自动降级开关、重试次数、原生 fallback 深度、Fallback 预算策略
- 错误类型重试开关(限流/超时/服务不可用/网络)
- 路由模式(手动/智能)与预算偏好(免费优先/性价比/质量优先)
- 上下文策略(全部/仅文本/仅当前轮)
- 最大 Token 数
- 语音朗读设置(音色/语速/音高、静音状态)
- 主题主色调
- phase 日志开关
技术栈与结构
- iOS 15+ / Swift 5.9+ / Xcode 15+
- SwiftUI + UIKit 混合实现
- Networking:普通请求 + SSE 流式
- Persistence:本地数据库持久化(WCDB)
- 依赖:
WCDBSwift、RxSwift、RxDataSources、SnapKit、Kingfisher、Markdown - 目录结构:
easyAI/
├── App/ # 应用入口/启动
├── Modules/ # 业务模块(Chat/Conversations/Models/Settings/HistoryConversations)
└── Shared/ # 共享层(Config/Networking/Persistence/Repositories/Security/UI/Models)
注意事项
- 调用 OpenRouter 可能产生费用,建议先使用免费模型测试
- 请关注 OpenRouter 配额与速率限制
- 请勿将 API Key 提交到公开仓库
- 语音输入依赖系统语音识别与麦克风权限,模拟器不支持录音,需真机测试
后续开发
暂无。
当前版本已覆盖聊天产品常见关键链路,可直接作为长期迭代基础工程继续扩展(语音、文件、工具调用、导出等)。
许可证
MIT License
致谢
- OpenRouter - 统一 AI 模型 API 接入
- SwiftUI / UIKit - Apple 原生 UI 框架