@djangocfg/widget-assistant(英语:
一个站点的助理聊天:SSE线和会话,恒定主机,对接列,浮动按钮和电话表,上方 @djangocfg/widget-chat。 。 。 .
它对一个网站一无所知src/boundary.test.ts 执行它,所以一个宿主的通行证是很少的 a 一种语言(来自框架的地语提供者)、适配器、建议及其自己的部件渲染器. 仅源:主机转接 (DEFAULT_TRANSPILE_PACKAGES)和进口 @djangocfg/widget-assistant/styles 一次 一次吗.
<AssistantChat adapter={adapter} suggestions={suggestions} dataRenderers={renderers} />
文档
更长的页面居住 @docs/ (仅存储,不在npm包中):架构,有线合约,Python服务器半个,连接了一个新项目,定制,故障排除. 服务器半个不在 django-cfg 的配置中: 每个产品在代理平面上自己写(@docs/server.md) (中文(简体) ).
文件夹( 每个任务一个)
| 文件夹 | 任务 |
|---|---|
wire/ | hTTP 和 SSE 合同:框架、 解析器、 运输、 存储的对话 |
stream/ | 一次谈话:适配器、会话钩、失传后调和、故事的脚本传输 |
composer/ | 部件的作曲所缺少的,装入其中(ComposerBehaviour:口音键,护身符,高度,帮助列表 |
messages/ | 信件周围的行: 复制页脚, 重接/ 已安装行 |
shell/ | 聊天所在位置: 列框、 码头/ 工作表、 有提示的浮动按钮、 锁定视图、 打开/ 宽度状态 |
i18n/ | 17种语言捆绑在一起locales/, (中文(简体) ), useAssistantCopy();语言来自 @djangocfg/i18n提供商, 部件的复制件也接踵而至 |
styles/ | 部件样式表条目、布局、编曲和按钮运动 |
Host.tsx (以 ./host为许多表面保留一个挂载聊天; AssistantChat.tsx 组成部件.
值得了解的行为
- 口语密钥.
⌘D编号 :Ctrl+D开始和停止( e)formatHotkey为系统绘制正确的一个). 在发音时, Enter 停止并发送, Escape 停止并保存文本, 从任何地方。 每站会用麦克风打开等场停止变化(450 mss of quiet,最多2.5 s):引擎会报告出词迟到,部件会收起并放下. 引擎是我们的composer/wholeTranscript.ts:它重建了浏览器在每个事件结果中的全部记录稿,并在浏览器结束运行时重新启动自己,因为部件对单独结果的缝合只保留了后一字. - 战地. 虽然它只长出高度, 按下作曲家周围的空条会将字段聚焦(仅键盘设备).
- 盖. 在键盘设备上打开面板将焦点放入字段;在发送到字段返回后,或者当发送结束一个口令(Enter后开始下一个口令)时,向麦克风返回. 从不打电话.
- 浮动按钮. 跳入,在一瞬间后显示一个消息风格的提示(
hint道具;文本默认为被捆绑了的一环),然后每隔如此多的时间会有一个环. 没有严密的控制;由主机决定显示的频率. - 帮助. 一发
?在面板头(AssistantHelp,由框架和码头显示)打开弹出式中键列表;隐藏在触摸设备上. - 时间. UTC在线上,阅读区和屏幕上的地方. 消息下的时间和复制行出现于徘徊;最新消息保持其视线,但当其答案仍在流出而从未为一空行.
电线( 0.2)
一个词汇, data: {json with type}\n\n,仅在 wire/frames.ts数字 :
| 框架 | 字段 |
|---|---|
run | version, (中文(简体) ), thread_id, (中文(简体) ), message_id, (中文(简体) ), client_id, (中文(简体) ), seq |
status | phase数字 : thinking | searching | answering |
text_delta | delta |
reasoning_delta | delta (可选图层:模型的思维,由部件本身的理性块所绘制) |
reasoning_end | elapsed_ms?, (中文(简体) ), tokens? (可选:封存思想;否则下个文本、有效载荷或 done 已经) |
ui_payload | kind, (中文(简体) ), data: 主机通过 dataRenderers[kind]; 列出在 payloadKinds 并报告给 onUnknownPayload |
done | tokens_in, (中文(简体) ), tokens_out, (中文(简体) ), cost_usd, (中文(简体) ), finish_reason, (中文(简体) ), replayed? |
error | code (单位:千美元)unavailable | timeout | failed, (中文(简体) ), message, (中文(简体) ), retryable |
一个未知 type 被忽略. wire/fixtures/events.json 每个帧中有一个并被安装在服务器侧: 漂移在任一侧都失败测试 。 公众聊天不能前进 tool_call 编号 : tool_result。 。 。 .
createTransport 带 streamUrl (路径,或发送的函数,对于路径中的线性id), buildBody, (中文(简体) ), headers, (中文(简体) ), streamFetch, (中文(简体) ), getToken (签署)或 visitorToken (匿名,以 x-visitor-token) (中文(简体) ). 奥米 api 从 useSession 对于匿名主机:没有获取到任何东西,房间开始为空. context 是主机定义的纯记录;软件包从未读取过. examples/KbAssistant.tsx 是一个知识库主机,带有 citations 有效载荷 测试舱的参考文献.
会议(0.3)
会话是服务器上的一条线程 . useSession({ transport, api, storage, getContext }) 一次显示一个并给主机 startNew(), (中文(简体) ), switchTo(id), (中文(简体) ), sessions 编号 : refreshSessions() 财务报告和审定财务报表 busy (一转是流:起动或切换等,停止结束).
api: ThreadApi是三次调用主机地图到它的终点:list(signal)(首先是最新活动),create()(单位:千美元)POST threads/,总是一行)和load(id, signal)(掷出)ThreadNotFoundError在404年: 陌生人的或清洗的会话.- 装入已记住的会话( E)
storage: { read, write },主机会选择密钥;读写不能扔出)显示,否则是最新的,否则是空白页. 在第一次发送时创建会话, 绝不装入;记录稿当时没有被重播,所以现场信息存活. createTransport({ streamUrl: ({ threadId }) => … })在路径中为会话设置位置;SendInput.threadId这是什么threadFor已经返回.- 历史是 屏幕本身,从对话(Messages, Notes)上画出,而不是随列表而增长的下拉:今天/昨天/每月一个标题,从七个聊天中取出搜索字段,打开聊天标记,点击打开后返回. 挂载
<AssistantHistory session={session} />旁边AssistantPortal(内部)AssistantHostProvider打开它从任何控制useAssistantHistory().setOpen(true)· ;<SessionsMenu session={session} />是现成的对头按钮(新聊天、历史 / 回聊天) 。 一个拥有自己的"..."菜单(UI Core)的主机MenuBuilder,作为SessionsMenu是因为children或进入actions)将"新聊天"保留在那里,并将聊天列表替换为"历史"一行调用setOpen(true)。聊天会挂在屏幕下,所以运行会不停地流出。 语出:newChat, (中文(简体) ),sessions, (中文(简体) ),sessionsEmpty, (中文(简体) ),sessionsSearch, (中文(简体) ),sessionsNoMatch, (中文(简体) ),sessionsBack;标题来自Intl。 。 。 . <AssistantChat draftRoom={session.thread.session ?? 'new'} />将每期未同意的草稿保存在自己的身份证下.- 没有删除和没有
clear():"清"是"新谈". 保留是服务器的工作. - 无
api(匿名东道主);startNew()只是空出房间.
语音(0.3.3)
麦克风菜单总是提供一种口语化语言:访客可以说出任何语言,无论主机UI怎么说. 没有 speech 由助理负责 useSpeechLanguage 从 @djangocfg/ui-core/lib/speech-language (上一次选中, 由此设备上的每一个聊天和标签共享 ) cfg.chat.speech_language; 否则浏览器语言拼写中的第一个支持, 页面语言只打破平局; 其它的英语)并 feed createWholeTranscriptSpeech。东道主 speech={{ value, onChange }} 仍然可以覆盖它(控制模式). 采取器列出基础部件的"Web Speech"目录(61种语言,有方言,可搜索),该目录覆盖了全部17个捆绑的地块(英语:zh 是普通话, no bokmål);没有免费的"其他BCP-47"字段. 触摸装置会隐藏取取器和麦克风(它们有自己的键盘口令). 一个显示没有采取器的主机运行一个更老版本:升级到0.3.3或更晚.
信件声音( 发送、 回答开始、 回答完成、 错误) 来源 widget-chat 且默认的; messageSounds={false} 让他们安静, messageSounds={{ volume, urls }} 调谐它们.
Dictation start/stop tones被捆绑(Web Audio,没有文件). sounds={false} 让他们安静下来; sounds={{ play(kind) }} 替换它们.
附录
<AssistantChat attachments={{ upload, kinds, maxFileSize, maxFiles }} /> 添加纸张剪贴,放放和图像粘贴( 默认: 图像/ audio/ text/ document, 10 MB, 5 文件) 。 这些类型是聊天的,从此包再导出. upload 是主机的; 默认线体增益 attachments 仅当文件被附上时。 细节 : @djangocfg/widget-chat @docs/attachments.md。 。 。 .
从外面问,码头和锁上的房间
askAssistant(text)在页面上放出其它处打出的一个快键(一个英雄搜索,一个"讨论这个"按钮)入作曲家,并在作曲家被挂起并允许发送后发送. 一个插槽:在作曲家存在前两次询问保留了最后一个.<AssistantHeaderActions><ChatMenu session={session} /></AssistantHeaderActions>,在旁边AssistantPortal,发布头控件;AssistantFrame财务报告和审定财务报表ChatDock在文件之间没有线条显示( 明确)actions(原始内容存档于2018-03-25). prop wins.AssistantFrame财务报告和审定财务报表ChatDock带actions(标题控制,如“...”菜单):它们坐在一个面板标题的相近处(ChatPanelHeader从widget-chat,由宽柱,平板侧面板和电话平板等同绘制),由薄分取出;每个按钮有ui-core工具提示.ChatDock是平板电脑上的侧面板,基件包的ChatSheet在电话。 密钥列表( E)AssistantHelp)被隐藏在触摸设备上.- 一条放置规则,在框架.
<AssistantFrame docked={open} />: 从 1280 px 开始,聊天是页面旁边的一列; 范围更窄, 框架本身作为右下方的浮动窗口( tablet; 没有背景, 不是模式)或全屏幕平面( 电话) 打开. 一个主机不能ChatDock,没有媒体查询,也没有第二个表面. - 拥有自己的外壳或运输工具的宿主 (呼唤投票自己的路线):
AssistantFrameheading, (中文(简体) ),help, (中文(简体) ),tablet, (中文(简体) ),windowBottom, (中文(简体) ),stageMin, (中文(简体) ),className, (中文(简体) ),fill· ;AssistantChatstore, (中文(简体) ),capabilities, (中文(简体) ),renderers, (中文(简体) ),footer, (中文(简体) ),composer, (中文(简体) ),readOnly; 条目@djangocfg/widget-assistant/shell离开图中的SSE层。 全部可选;见@docs/interface.md。 。 。 . - 一个签名的视图,在框架.
<AssistantFrame requireAuth lock={...} />(另见ChatDock:一个签名的读者得到聊天,一个读者客户端仍在识别中得到一个空的躯体,其他人得到一个大图标,一个理由和一个 签名 按钮,以列全高(无惰性作曲)为中心。 签名以保存当前页面并前往 django-cfg 认证路由(useAuth从@djangocfg/api/auth(a) 同伴依赖;lock(单位:千美元)AssistantLockOptions数字 :title, (中文(简体) ),body, (中文(简体) ),signInLabel, (中文(简体) ),icon, (中文(简体) ),onSignIn, (中文(简体) ),content)修改单词或替换块. 又导出 :AssistantAuthGate, (中文(简体) ),useAssistantAccess, (中文(简体) ),useSignIn。主机没有锁定的包装. AssistantLocked(光景;它的)composerLabel财务报告和审定财务报表onComposerClick)是大门所画出的东西;它只在表面直接使用,没有django-cfg auth.
测试
pnpm --filter @djangocfg/widget-assistant check test:电线、电流和边界测试,以及 tsc --noEmit。 。 。 .
从0.1(讲电影框的主持人)
0.2 断线. 在主机服务器中: run 携带 thread_id 财务报告和审定财务报表 message_id (无) run_id, (中文(简体) ), user_message_id, (中文(简体) ), assistant_message_id(三); status.phase 实值 thinking|searching|answering (单位:千美元)reading 财务报告和审定财务报表 choosing - 失踪; done 没有信件 id; 卡片有效载荷是 ui_payload {kind: 'film_cards', data} 和以前一样,但软件包不再验证它,所以注册它: dataRenderers={{ film_cards: … }} 财务报告和审定财务报表 payloadKinds={['film_cards']}。存储的信息有 parts: [{kind, data}] 替换 widgets: [{kind, ids, caption}]。 。 。 . ChatContext 确是明白的记录 title 财务报告和审定财务报表 browse 类型是主机定义. createTransport 仍然打开 /apix/chat/v1/stream 否时 streamUrl ; 仅为匿名主机保留默认值; 带有会话集的登录主机 streamUrl。字典丢失 statusReading 财务报告和审定财务报表 statusChoosing 和收益 statusAnswering; 捆绑 lockedBody 财务报告和审定财务报表 hint 不再谈论电影.
从0.2(一线, clear()(中文(简体) )
0.3 替换单行径 ThreadApi { load, clear } 与 ThreadApi { list, create, load(id, signal) } (单位:千美元)useSession 选择 storage),删除 Session.clear (使用时 startNew),交换词典密钥 clear, (中文(简体) ), clearConfirm, (中文(简体) ), clearYes 页:1 newChat, (中文(简体) ), sessions, (中文(简体) ), sessionsEmpty添加 ThreadNotFoundError,则 not_found 拒绝代码, SendInput.threadId, (中文(简体) ), AdapterDeps.threadFor 编号 : onActive, (中文(简体) ), AssistantChat.draftRoom, (中文(简体) ), SessionsMenu, (中文(简体) ), useAssistantLocale 财务报告和审定财务报表 relativeTime。保留手写会话栏的主机可以删除.