组件参考
`<praxis-agent>` 与 React 组件的全部选项、方法和事件。
<praxis-agent> 是一个 Web Component,把智能体对话界面嵌入你的页面。本页列出它的选项、方法和事件,以及对应的 React 组件。
选项
通过 setOptions 传入。首次调用必须包含 api.url、api.getToken 和 agent.name,缺任何一项会抛出 TypeError。
| 选项 | 类型 | 说明 |
|---|---|---|
api.url | string | 接口地址,必填。初始化后不能更改,否则抛出 TypeError;换后端请新建元素。 |
api.getToken | (current: string | null) => Promise<string> | 必填。返回嵌入令牌。current 是当前令牌,首次为 null;令牌到期前会再次调用。 |
agent.name | string | 必填。显示的智能体名称。 |
agent.avatar | string | 头像地址。 |
layout | "inline" | "sidebar" | "popup" | "modal" | 默认 inline。 |
launcher | 见下表 | 默认:inline 为 none,其余布局为 bubble。 |
header | 见下表 | 顶栏内容。 |
history.enabled | boolean | 默认开启。设为 false 后隐藏历史会话入口,showHistory() 不再生效。 |
width | number | sidebar 布局的宽度,单位 CSS 像素,默认 400。 |
theme | 见下表 | 外观。 |
startScreen | 见下表 | 空会话时的开场。 |
composer.placeholder | string | 输入框占位文字,默认「发送消息」。 |
composer.attachments.enabled | boolean | 默认开启。设为 false 后不能选择、粘贴或拖入文件。 |
disclaimer | string | 对话区的免责声明。 |
footer | string | 对话区底部的文字。 |
autoScroll | boolean | 控制新内容到达时是否自动滚动。 |
locale | "zh" | "en" | 界面语言。未指定时先取宿主页面的 lang,再取浏览器语言;zh 开头的语言标签使用中文,其余使用英文,无语言信息时使用英文。 |
launcher
| 字段 | 类型 | 说明 |
|---|---|---|
type | "none" | "bubble" | "mascot" | 必填。 |
image | string | 图片地址。 |
position | "bottom-right" | "bottom-left" | 启动按钮位置。 |
label | string | 按钮文字。 |
header
| 字段 | 类型 | 说明 |
|---|---|---|
title | string | 标题。 |
subtitle | string | 副标题。 |
icon | string | 受支持的 Lucide 图标名,或图片地址。 |
actions | { id: string; icon: string; label: string }[] | 自定义顶栏按钮。点击时触发 praxis.header.action,detail 为 { id }。 |
theme
| 字段 | 类型 | 说明 |
|---|---|---|
colorScheme | "light" | "dark" | "system" | system 跟随浏览器的深浅色设置。 |
accent | string | 主色。必须是不透明的明确 CSS 颜色;含 var()、currentcolor 等不被接受,会抛出 TypeError。前景色按对比度自动选择。 |
surface | string | 背景色,限制同 accent。 |
grayscale | "neutral" | "warm" | "cool" | 灰阶色板。 |
radius | "none" | "sm" | "md" | "lg" | "full" | 圆角,分别对应 0、4、10、18、9999 像素。 |
density | "compact" | "normal" | "spacious" | 间距,基础单位分别为 3、4、5 像素。 |
fontFamily | string | 字体族。空字符串或含 ; { } < > 会抛出 TypeError。 |
fontSize | number | 基础字号,单位像素,必须为正的有限数,否则抛出 RangeError。 |
未设置 accent 时使用默认绿色(浅色 #167A43,深色 #30a46c)。
startScreen
| 字段 | 类型 | 说明 |
|---|---|---|
greeting | string | 问候语。 |
prompts | { label: string; prompt: string }[] | 推荐问题。最多显示前 4 个;点击后立即发送 prompt。 |
更新选项
setOptions(partial) 把传入的字段合并进当前配置:嵌套对象逐层合并,数组整体替换,显式传 undefined 会重置该字段。api.url 不能改。
方法
在元素上直接调用。
| 方法 | 说明 |
|---|---|
setOptions(partial) | 初始化或更新选项。 |
sendUserMessage(text) | 以用户身份发送一条消息,返回 Promise,值为 "accepted"、"rejected" 或 "unknown"。文本为空或超长、有待处理的审批、历史仍在加载、输入框不可用时返回 rejected。 |
setComposerValue(text) | 替换输入框中的草稿。 |
focusComposer() | 聚焦输入框。历史面板打开时不生效。 |
setThreadId(id) | 切换到指定会话;传 null 回到空会话。同时关闭历史面板,会话变化时触发 praxis.thread.change。 |
showHistory() / hideHistory() | 打开或关闭历史面板。 |
open() / close() / toggle() | 展开或收起面板。inline 布局下没有效果。 |
事件
事件都是冒泡、可穿过 Shadow DOM 的 CustomEvent。
| 事件 | detail | 何时触发 |
|---|---|---|
praxis.ready | 无 | 界面已挂载。不代表网络认证已成功。 |
praxis.error | KitError 或 { message: string } | 传输失败时为 KitError(含 code、status、retryable、message);会话加载或发送失败时为 { message }。错误码见限制与错误。 |
praxis.thread.change | { threadId: string | null } | 当前会话变化,包括首条消息创建出新会话。 |
praxis.response.start | 无 | 智能体开始回复。 |
praxis.response.end | 无 | 回复结束。 |
praxis.open / praxis.close | 无 | 面板展开或收起。 |
praxis.history.open / praxis.history.close | 无 | 历史面板打开或关闭。 |
praxis.header.action | { id: string } | 点击了 header.actions 中的按钮。 |
const agent = document.querySelector("praxis-agent");
agent.addEventListener("praxis.thread.change", event => {
console.log(event.detail.threadId);
});React
React 组件来自 @deepractice-ai/praxis-kit-react,需要 React 18 或 19。
import { PraxisAgent, usePraxisAgent } from "@deepractice-ai/praxis-kit-react";
export function Chat({ options, getToken }) {
const { ref, control } = usePraxisAgent();
return (
<PraxisAgent
ref={ref}
options={options}
getToken={getToken}
layout="popup"
launcher="bubble"
onReady={() => control.open()}
/>
);
}属性
| 属性 | 类型 | 说明 |
|---|---|---|
getToken | (current: string | null) => Promise<string> | 必填。作用同 api.getToken。 |
options | 与上文选项相同,但去掉 api.getToken | 提供 api.url 和 agent.name 后才会初始化。不传则渲染一个未配置的元素。 |
layout | 同 layout 选项 | 优先于 options.layout。 |
launcher | "none" | "bubble" | "mascot" | 优先于 options.launcher.type,其余启动按钮字段保留。 |
className、style | 作用于宿主元素。 | |
onReady、onError、onThreadChange、onResponseStart、onResponseEnd、onOpen、onClose、onHistoryOpen、onHistoryClose、onHeaderAction | 回调,参数为原始 CustomEvent | 对应上表事件,detail 相同。 |
layout 和 launcher 请通过属性或 options 设置,不要写成 HTML 属性。更新 options 时请保持嵌套对象引用稳定(例如 useMemo),否则每次渲染都会触发更新。
控制句柄
ref 暴露的句柄包含 sendUserMessage、setThreadId、setComposerValue、showHistory、hideHistory、focusComposer、open、close、toggle,参数与上文方法一致。在 onReady 之前,以及组件卸载之后调用,会同步抛出 Error("PraxisAgent is not ready. Wait for onReady before calling control methods."),调用不会排队。
usePraxisAgent() 返回稳定的 { ref, control }:把 ref 传给组件,在组件外用 control 调用方法。
前端工具与页面上下文
usePraxisTool、usePraxisReadable、PraxisProvider 和 onClientTool、onToolChange、onLog 见前端工具与页面上下文。
iframe 加载器
加载器负责令牌请求和跨窗口通信。属性与接入示例见嵌入方式。加载后可用 window.PraxisKit.get("ABC123") 取得句柄(换成智能体短号),调用 open()、close()、toggle();远程组件方法返回 Promise。前端工具通过句柄的 onClientTool(handler) 注册。