Repository navigation
feat(webui): QQ 式聊天页,打字和语音通话都是和机器人本人私聊 - #1231
Merged
Merged
Conversation
SuInk
force-pushed
the
claude/voice-call-admin-chat
branch
from
October 27, 2026 16:23
8c8a2ba to
60d1506
Compare
管理对话原来是问答工具的排版,输入框下面挂着机器人和模型两个下拉框,语音通话又是顶栏里单独一页。用户希望它像真的聊天软件:对面是谁、在不在输入一眼能看到,打电话就在对话里点,选机器人和模型这类不常动的东西收进设置。 - 标题栏显示对面的头像和名字,处理中显示「正在输入…」;消息改成左右气泡,对面带头像,等待时是打字气泡。 - 输入栏改成一行:加号、胶囊输入框(随内容长高)、发送。机器人和模型选择挪到「⋯ → 聊天设置」。 - 标题栏加电话按钮,全屏通话界面照手机通话做:头像、时长、实时字幕,静音、对讲、打字、挂断。 - 对讲和静音在本地控制上行,通话中随时切换,不用重连;麦克风和 AudioContext 在点电话时就发起。 - 去掉顶栏的独立通话页入口和 /call 路由。
管理对话里的「管理助手」替主人干活,不带机器人的人设和记忆;电话打给的却是机器人本人。两者放在一个窗口里,同一个头像会有两种性格、两份记忆。所以拆开:新做一个聊天页,打字和打电话都走主人私聊,管理对话恢复原样。 - 后端:通话和聊天页共用「主人私聊」(web_chat.go):ownerChatEvent 造事件,replyAsOwner 走回复流程,回复在发送最后一步交给页面。新增 GET/POST /api/assistant/chat,读私聊记录、流式收回复。 - event.webChat 统一跳过输入状态、草稿流、合并转发、tts 工具和私聊准入;voiceCall 只管通话特有的口语提示和保留句号。 - 前端:侧栏「日常 → 聊天」,左边机器人列表(头像、最后一条消息),右边私聊气泡、时间分隔、打字气泡、失败重发,右上角电话按钮。手机上先列表后聊天。 - 管理对话恢复成 main 的样子;顶栏的管理对话按钮再点一下回到打开前的那页。
整行涂成主题色太扎眼,改成和微信、QQ 桌面版一样的浅灰底,文字颜色不变。
登录 WebUI 的人就是主人,不该因为机器人没填主人账号、或者 Telegram 主人填的是 @用户名就聊不了。另外聊天页原来要等她回完才能发下一句,和 QQ 不一样。 - 主人账号:填了就用它,和平台私聊是同一段记录;Telegram @用户名用记下的数字 ID,还没有就拿用户名当账号;没填主人时用 webui-owner,OwnerIDForEvent 只对服务端造的 webChat 事件把它认成主人,平台消息冒用不了。 - 聊天页每句单独发出,按机器人计数等回复中的句数,「正在输入…」和打字气泡跟着它;失败的句子随时能重发。
SuInk
force-pushed
the
claude/voice-call-admin-chat
branch
from
October 27, 2026 17:02
8adda18 to
5cd4442
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
新增 QQ 式「聊天」页:左边是带头像的机器人列表,右边是和选中那台的私聊,打字和打电话都是跟机器人本人(人设、记忆)聊,平台上的私聊记录也在里面。语音通话从顶栏的独立测试页挪到聊天页右上角,点开是照手机通话做的全屏界面。管理对话保持原样,只是顶栏按钮再点一下能关掉。
Why
用户希望和机器人聊天、打电话「像 QQ 一样」:有好友列表、有头像、选机器人就能聊。上一版 #1211「feat(voice): 实时语音通话通道与网页测试页」只有一个顶栏通话测试页,打字没有入口。
一开始试过把电话塞进「管理对话」,但管理对话里是替主人干活的管理助手(有执行权限、用管理模型、不带人设和记忆),电话打给的却是机器人本人:同一个头像两种性格、两份记忆。所以拆开:新做聊天页,管理对话不动。
改了什么
后端(
model/assistant/web_chat.go、webui/web_chat.go)ownerChatEvent造一条主人发来的私聊,replyAsOwner走现有回复流程,回复在发送最后一步交给页面(deliverToWebChat),不发到平台。GET /api/assistant/chat?profile=:能不能聊 + 最近 200 条私聊记录(平台私聊、聊天页、通话都在里面)。POST /api/assistant/chat:发一句话,NDJSON 流式返回每条回复,15 秒心跳,done结束或带错误。event.webChat统一跳过输入状态、Telegram 草稿流、合并转发、tts工具和私聊准入;原来的voiceCall只管通话特有的口语化提示和保留句号。通话代码改用共用入口,行为不变。前端
ChatView.vue):机器人列表带头像和最后一条消息,选中只淡淡衬底色;私聊气泡左右分开、带头像,五分钟以上插时间分隔,等回复时是打字气泡,副标题「对方正在输入…」,发送失败可点重发;右上角电话按钮。手机上先列表后聊天,返回键回列表。VoiceCallScreen.vue:全屏通话界面(头像、时长、实时字幕、轻点打断、静音 / 对讲 / 打字 / 挂断)。对讲和静音在本地控制上行,通话中随时切换不用重连;AudioContext 和麦克风授权在点电话时就发起。挂断后聊天页刷新记录。CallView.vue和/call路由。docs/voice-call.md加了聊天页和接口说明。用户影响
webui-owner单独一段,同样按主人对待(只认服务端造的聊天事件,平台消息冒用不了)。/call地址不再存在。验证
go test -race(model/assistant、webui、model/voicecall、internal/safego)和TZ=UTC go test ./...全过;新增web_chat_test.go,覆盖回复不发平台、不带通话提示、记录可读、没填主人 / Telegram 用户名 / QQ 官方 openid 都按主人对待且平台冒用不了、图片过滤、登录要求。vue-tsc、单测 289 项(新增时间分隔、流式分帧)、生产构建、check-public-repo.sh通过。