JavaTavern:本地 Android 角色聊天的实现与面试追问

JavaTavern:本地 Android 角色聊天

源码与使用说明 · 项目总览

JavaTavern 是一个原生 Java Android 应用。角色卡、聊天、审计记录与消息图片存放在应用私有目录;连接远程模型时,请求中的提示词、上下文与用户选择的图片会发送给配置的服务商。它不是离线大模型产品。

当前能展示的主链路

  1. 从 JSON 或 PNG 读取 SillyTavern 风格角色卡,解析角色字段与世界书条目,并写入本地 SQLite。
  2. 单聊由 ChatActivity 协调 UI,ChatViewModel 持有流式会话状态,OpenAiCompatibleClient 处理兼容接口与 SSE 增量。
  3. 消息分页、搜索、编辑及本地指令经仓储层访问 SQLite;会话清空需要用户确认,并留下审计记录。
  4. 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/
作者
Cassiur
发布于
2026年9月29日
许可协议