@djangocfg/widget-assistant

中文文档
0.3.24发布于 2026/11/09MITTypeScriptES Module近 30 天下载 5568

@djangocfg/widget-chat上方的站点助手:SSE线和会话层,持续主机,对接列,浮动按钮和工作表,拼写,帮助和17个内置地块

中文使用文档
文档目录11 节
  1. 文档
  2. 文件夹( 每个任务一个)
  3. 值得了解的行为
  4. 电线( 0.2)
  5. 会议(0.3)
  6. 语音(0.3.3)
  7. 附录
  8. 从外面问,码头和锁上的房间
  9. 测试
  10. 从0.1(讲电影框的主持人)
  11. 从0.2(一线, clear() (中文(简体) )

@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数字 :

框架字段
runversion, (中文(简体) ), thread_id, (中文(简体) ), message_id, (中文(简体) ), client_id, (中文(简体) ), seq
statusphase数字 : thinking | searching | answering
text_deltadelta
reasoning_deltadelta (可选图层:模型的思维,由部件本身的理性块所绘制)
reasoning_endelapsed_ms?, (中文(简体) ), tokens? (可选:封存思想;否则下个文本、有效载荷或 done 已经)
ui_payloadkind, (中文(简体) ), data: 主机通过 dataRenderers[kind]; 列出在 payloadKinds 并报告给 onUnknownPayload
donetokens_in, (中文(简体) ), tokens_out, (中文(简体) ), cost_usd, (中文(简体) ), finish_reason, (中文(简体) ), replayed?
errorcode (单位:千美元)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,没有媒体查询,也没有第二个表面.
  • 拥有自己的外壳或运输工具的宿主 (呼唤投票自己的路线): AssistantFrame heading, (中文(简体) ), help, (中文(简体) ), tablet, (中文(简体) ), windowBottom, (中文(简体) ), stageMin, (中文(简体) ), className, (中文(简体) ), fill· ; AssistantChat store, (中文(简体) ), 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。保留手写会话栏的主机可以删除.

版本与发布记录

@djangocfg/widget-assistant 共发布 29 个版本,首次发布于 2026/10/25;过去 12 个月发布了 29 个版本。

版本发布日期距今
0.3.24latest2026/11/092 天前
0.3.232026/11/092 天前
0.3.222026/11/093 天前
0.3.212026/11/083 天前
0.3.202026/11/083 天前
0.3.192026/11/084 天前

关于 @djangocfg/widget-assistant 的常见问题

@djangocfg/widget-assistant 是什么?

@djangocfg/widget-chat上方的站点助手:SSE线和会话层,持续主机,对接列,浮动按钮和工作表,拼写,帮助和17个内置地块

如何安装 @djangocfg/widget-assistant?

在项目目录运行 npm install @djangocfg/widget-assistant,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^19.0.0)、lucide-react(^1.68.0)、@djangocfg/api(^2.1.644)、@djangocfg/i18n(^2.1.644)、@djangocfg/ui-core(^2.1.644)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@djangocfg/widget-assistant 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@djangocfg/widget-assistant 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@djangocfg/widget-assistant 可以商用吗?

@djangocfg/widget-assistant 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@djangocfg/widget-assistant 的下载量有多少?

根据 npm 官方下载统计,@djangocfg/widget-assistant 在 2026/10/13 – 2026/11/11 这 30 天内被下载 5,568 次,日均约 186 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@djangocfg/widget-assistant 还在维护吗?

最新版本 0.3.24 发布于 2026/11/09(2 天前);至今共发布 29 个版本,其中过去 12 个月发布了 29 个;首次发布于 2026/10/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。