JavaTavern:本地 Android 角色聊天的实现与面试追问
JavaTavern:本地 Android 角色聊天
JavaTavern 是一个原生 Java Android 应用。角色卡、聊天、审计记录与消息图片存放在应用私有目录;连接远程模型时,请求中的提示词、上下文与用户选择的图片会发送给配置的服务商。它不是离线大模型产品。
当前能展示的主链路
- 从 JSON 或 PNG 读取 SillyTavern 风格角色卡,解析角色字段与世界书条目,并写入本地 SQLite。
- 单聊由
ChatActivity协调 UI,ChatViewModel持有流式会话状态,OpenAiCompatibleClient处理兼容接口与 SSE 增量。 - 消息分页、搜索、编辑及本地指令经仓储层访问 SQLite;会话清空需要用户确认,并留下审计记录。
- API Key 使用 Android Keystore 保护。这个机制不能替远程模型服务商提供隐私保证。
角色卡导入需要特别关注字段保真:解析器支持 description、personality、scenario、mes_example、备用开场白和卡片提示词;导入选项与 PNG 包装路径曾丢失部分字段,源码已修复,仍应在设备上用真实卡回归。聊天监听器也修复了三处 isHostActive() 自递归;本地单元测试通过,设备交互仍需验证。
贴项目的追问
为什么网络回调不直接修改 View? 回调与 Activity 生命周期不同步。用 ViewModel 保存会话状态、Activity 观察快照,页面重建时再渲染;还需检查已完成快照重放是否造成重复气泡。
取消生成后,怎样避免残留占位消息? 区分瞬时 UI 行和已落库消息,检查停止、异常、旋转三条路径的清理与最终写入时机;现场用断网和旋转操作验证。
角色卡导入要测什么? 同一张卡分别走 JSON 与 PNG;核对人设、开场白、示例对话、世界书及头像是否保留,并测重复导入、损坏元数据和超大文件。
本地 Agent 能做什么? 当前是本地规则与工具卡流程,写操作需要确认及审计;不要把它表述为可自主规划并执行多步任务的通用 Agent。
还有哪些证据缺口? 需要真机或模拟器验证搜索跳转、/clear 确认、流式过程中与完成后旋转、SQLite 升级及真实角色卡导入;没有 Macrobenchmark 或设备性能结论。
JavaTavern:本地 Android 角色聊天的实现与面试追问
https://whyalwaysme.lol/projects/javatavern/