EasyAI - iOS AI 聊天應(yīng)用
一個(gè)面向長(zhǎng)期迭代的 iOS AI 聊天基礎(chǔ)工程,不只跑通接口,更關(guān)注完整體驗(yàn)與可維護(hù)性:體驗(yàn)順滑、功能閉環(huán)、結(jié)構(gòu)清晰。
項(xiàng)目地址:https://github.com/qw9685/easyAI
?? Demo
[(image-c4301c-1770778301808)]
chat.gif

history.gif

set.gif
why?
很多示例要么只有文本對(duì)話,要么沒(méi)有真正的流式體驗(yàn),要么缺少會(huì)話歷史與持久化。
EasyAI 的目標(biāo)是:打開(kāi)就能用、聊起來(lái)舒服、后續(xù)還能持續(xù)加功能。
特點(diǎn)?
1)多模型:一個(gè)入口接入主流大模型
- 基于 OpenRouter 獲取模型列表并發(fā)起對(duì)話請(qǐng)求
- 支持搜索/篩選/收藏模型
- 支持查看上下文長(zhǎng)度、價(jià)格等關(guān)鍵信息,減少“盲選”
2)真流式輸出:邊生成邊顯示
- 支持 SSE 流式響應(yīng)(非本地偽流式)
- 回復(fù)實(shí)時(shí)增長(zhǎng),體驗(yàn)更接近 ChatGPT/Claude 類(lèi)產(chǎn)品
- 支持可選本地打字機(jī)顯示,可在設(shè)置中開(kāi)關(guān)與調(diào)速
3)智能路由 + 自動(dòng)降級(jí):更穩(wěn)的對(duì)話鏈路
- 路由模式支持手動(dòng)/智能,智能模式可按任務(wù)意圖與預(yù)算偏好選擇模型
- 請(qǐng)求失敗時(shí)支持自動(dòng) fallback 重試(可配置重試次數(shù)、預(yù)算策略、錯(cuò)誤類(lèi)型)
- 支持原生 fallback 深度配置,多模態(tài)場(chǎng)景會(huì)優(yōu)先選擇支持圖片輸入的模型
4)支持圖片:多模態(tài)輸入鏈路打通
- 相冊(cè)多選圖片(最多 5 張)
- 發(fā)送前可預(yù)覽/刪除
- 聊天內(nèi)支持多圖橫向展示
5)Markdown 渲染更像聊天產(chǎn)品
- 代碼塊/引用/列表/鏈接/圖片/HTML/數(shù)學(xué)公式等富文本展示
- 代碼塊支持一鍵復(fù)制
- 代碼塊支持系統(tǒng)分享導(dǎo)出
6)Prompt 模板 + 語(yǔ)音輸入:提效輸入側(cè)
- 輸入欄內(nèi)置 Prompt 模板(會(huì)議紀(jì)要、翻譯、代碼講解、Bug 修復(fù)等)
- 模板可一鍵注入輸入框,并聯(lián)動(dòng)推薦模型
- 支持語(yǔ)音輸入(STT)實(shí)時(shí)轉(zhuǎn)寫(xiě)
7)對(duì)話歷史 + 本地持久化:從演示到可用
- 支持多會(huì)話列表、重命名、置頂、刪除、搜索
- 消息與會(huì)話本地保存,冷啟動(dòng)可恢復(fù)
8)產(chǎn)品級(jí)交互:停止生成 + 狀態(tài)一致
- 生成中支持一鍵停止(發(fā)送按鈕切換為停止)
- 停止后保留已顯示文本、結(jié)束 loading 并顯示時(shí)間
- 若停止時(shí)尚未輸出正文,顯示“已停止 + 時(shí)間”(僅 UI 提示,不寫(xiě)入持久化歷史)
9)TTS 語(yǔ)音朗讀增強(qiáng):可配置 + 不錯(cuò)亂
- 助手回復(fù)自動(dòng)朗讀(流式/非流式)
- 流式按句子結(jié)束切段串行播放,避免亂序
- 播放前清洗文本(過(guò)濾 Emoji、Markdown、URL 等)
- 聊天頁(yè)支持靜音/恢復(fù)(mute,不是 stop)
- 支持配置音色/語(yǔ)速/音高
10)可觀測(cè)性與調(diào)試能力
- 消息級(jí)狀態(tài)欄展示 Token/耗時(shí)/成本估算
- 可顯示運(yùn)行狀態(tài)(路由命中、fallback 重試、錯(cuò)誤分類(lèi))
- 模型頁(yè)提供最近對(duì)話統(tǒng)計(jì)、智能路由效果統(tǒng)計(jì)、Provider 統(tǒng)計(jì)
- 支持 phase 日志(turnId/itemId)用于排查流式與持久化問(wèn)題
設(shè)置項(xiàng)(App 內(nèi)可調(diào))
- API Key(Keychain 存儲(chǔ))
- 假數(shù)據(jù)模式(無(wú) Key 也可聯(lián)調(diào) UI)
- 流式響應(yīng)開(kāi)關(guān)
- 打字機(jī)開(kāi)關(guān)與速度/刷新率
- 自動(dòng)降級(jí)開(kāi)關(guān)、重試次數(shù)、原生 fallback 深度、Fallback 預(yù)算策略
- 錯(cuò)誤類(lèi)型重試開(kāi)關(guān)(限流/超時(shí)/服務(wù)不可用/網(wǎng)絡(luò))
- 路由模式(手動(dòng)/智能)與預(yù)算偏好(免費(fèi)優(yōu)先/性價(jià)比/質(zhì)量?jī)?yōu)先)
- 上下文策略(全部/僅文本/僅當(dāng)前輪)
- 最大 Token 數(shù)
- 語(yǔ)音朗讀設(shè)置(音色/語(yǔ)速/音高、靜音狀態(tài))
- 主題主色調(diào)
- phase 日志開(kāi)關(guān)
技術(shù)棧與結(jié)構(gòu)
- iOS 15+ / Swift 5.9+ / Xcode 15+
- SwiftUI + UIKit 混合實(shí)現(xiàn)
- Networking:普通請(qǐng)求 + SSE 流式
- Persistence:本地?cái)?shù)據(jù)庫(kù)持久化(WCDB)
- 依賴:
WCDBSwift、RxSwift、RxDataSources、SnapKit、Kingfisher、Markdown - 目錄結(jié)構(gòu):
easyAI/
├── App/ # 應(yīng)用入口/啟動(dòng)
├── Modules/ # 業(yè)務(wù)模塊(Chat/Conversations/Models/Settings/HistoryConversations)
└── Shared/ # 共享層(Config/Networking/Persistence/Repositories/Security/UI/Models)
注意事項(xiàng)
- 調(diào)用 OpenRouter 可能產(chǎn)生費(fèi)用,建議先使用免費(fèi)模型測(cè)試
- 請(qǐng)關(guān)注 OpenRouter 配額與速率限制
- 請(qǐng)勿將 API Key 提交到公開(kāi)倉(cāng)庫(kù)
- 語(yǔ)音輸入依賴系統(tǒng)語(yǔ)音識(shí)別與麥克風(fēng)權(quán)限,模擬器不支持錄音,需真機(jī)測(cè)試
后續(xù)開(kāi)發(fā)
暫無(wú)。
當(dāng)前版本已覆蓋聊天產(chǎn)品常見(jiàn)關(guān)鍵鏈路,可直接作為長(zhǎng)期迭代基礎(chǔ)工程繼續(xù)擴(kuò)展(語(yǔ)音、文件、工具調(diào)用、導(dǎo)出等)。
許可證
MIT License
致謝
- OpenRouter - 統(tǒng)一 AI 模型 API 接入
- SwiftUI / UIKit - Apple 原生 UI 框架