@sophonsai/agent-embed-vue
@sophonsai/agent-embed-vue
应用接入
传入服务地址 endpoint 和 Agent 的应用接入 token;可选 baseUrl 默认是 /e/v1/embed。
最终 iframe 地址是 endpoint + baseUrl + '/' + encodeURIComponent(token)。
<AgentEmbed endpoint="https://agent.example.com" token="应用接入Token" style="height:600px" />
不再接收完整 url、旧 initConfig、Agent ID 或平台用户凭证。
threadId、外观配置、实例命令和事件回调继续支持。
安装
# npm
npm install @sophonsai/agent-embed-vue vue@^3.3
# pnpm
pnpm add @sophonsai/agent-embed-vue vue@^3.3
# yarn
yarn add @sophonsai/agent-embed-vue vue@^3.3
# bun
bun add @sophonsai/agent-embed-vue vue@^3.3
快速开始
<script setup lang="ts">
import { reactive, shallowRef } from 'vue'
import {
AgentEmbed,
type AgentAppearance,
type AgentEmbedInstance,
type AgentEmbedTheme,
} from '@sophonsai/agent-embed-vue'
const endpoint = 'https://agent.example.com'
const token = '应用接入Token'
const appearance = reactive<AgentAppearance>({
theme: { preset: 'glacier-blue' },
fontSize: 16,
header: {
historyButton: true,
newConversationButton: true,
themeSettingButton: false,
},
})
const agent = shallowRef<AgentEmbedInstance | null>(null)
const handleThemeChange = (theme: AgentEmbedTheme) => {
appearance.theme = theme
}
const handleFontSizeChange = (fontSize: number) => {
appearance.fontSize = fontSize
}
</script>
<template>
<div class="page">
<AgentEmbed
class="agent-embed"
:endpoint="endpoint"
:token="token"
:appearance="appearance"
@theme-change="handleThemeChange"
@font-size-change="handleFontSizeChange"
@init-error="({ code, message }) => console.error('初始化失败', code, message)"
@settled="(result) => console.log('会话结束', result)"
@ready="(instance) => (agent = instance)"
/>
<button :disabled="!agent" @click="agent?.sendMessage({ text: '你好' })">发送消息</button>
</div>
</template>
<style scoped>
.page {
height: 640px;
}
.agent-embed {
min-height: 480px;
}
</style>
组件 Props
| Prop | 类型 | 必填 | 说明 |
|---|---|---|---|
endpoint |
string |
是 | 服务地址 |
token |
string |
是 | Agent 应用接入凭证 |
baseUrl |
string |
否 | 嵌入路径,默认 /e/v1/embed |
threadId |
string |
否 | 初始会话 ID |
runtime_variables |
AgentRuntimeVariables |
否 | 新会话绑定的运行时变量,值必须为 JSON |
appearance |
AgentAppearance |
否 | 主题、字号和头部按钮配置 |
组件事件
组件使用标准 Vue 事件,不接受 onXxx 回调 Props。
| 事件 | 参数 | 说明 |
|---|---|---|
@ready |
instance |
面板初始化完成 |
@theme-change |
theme |
面板内部主题变化 |
@font-size-change |
fontSize |
面板内部字号变化 |
@init-error |
failure |
初始化失败 |
全部运行事件见“会话事件”章节。
初始化配置
<AgentEmbed
endpoint="https://agent.example.com"
token="应用接入Token"
base-url="/e/v1/embed"
thread-id="可选初始会话ID"
/>
baseUrl 可以省略。接入配置只在挂载时读取;需要切换服务、token 或会话时,修改组件 key 重新挂载。
appearance 会随外观配置更新。
外观与受控状态
const appearance = reactive<AgentAppearance>({
theme: { preset: 'studio-white' },
fontSize: 16,
header: {
historyButton: true,
newConversationButton: true,
themeSettingButton: true,
},
})
header.themeSettingButton 默认值为 false,只有显式设置为 true 时才显示主题设置按钮。
可用主题:
可以使用 AgentEmbedThemePreset 枚举式常量设置主题:
import { AgentEmbedThemePreset } from '@sophonsai/agent-embed-vue'
const appearance = {
theme: { preset: AgentEmbedThemePreset.GlacierBlue },
}
| 主题名 | preset | 类型 |
|---|---|---|
| 曜石紫 | obsidian-violet |
深色主题 |
| 石墨青 | graphite-cyan |
深色主题 |
| 午夜靛 | midnight-indigo |
深色主题 |
| 深海蓝 | deep-ocean |
深色主题 |
| 森野绿 | forest-emerald |
深色主题 |
| 影棚白 | studio-white |
浅色主题 |
| 珍珠紫 | pearl-violet |
浅色主题 |
| 冰川蓝 | glacier-blue |
浅色主题 |
| 暖杏色 | warm-cream |
浅色主题 |
| 薰衣草 | lavender-mist |
浅色主题 |
Vue 3 适配器会分别监听:
appearance.theme,深度监听;appearance.fontSize;appearance.header,深度监听。
因此下面的修改会自动同步到面板:
appearance.theme = { preset: 'warm-cream' }
appearance.fontSize = 18
appearance.header!.themeSettingButton = false
当主题或字号作为受控状态传入时,应在 @theme-change / @font-size-change 中更新响应式状态,否则外部状态仍会保留旧值。
将 theme、fontSize 或 header 改为 undefined 会撤销对应的宿主控制,让面板恢复内部默认值。
获取和使用实例
面板初始化完成后,ready 事件会返回 AgentEmbedInstance。在此之前,获取不到 AgentEmbedInstance 实例对象,无法操作面板执行行为。
推荐使用 shallowRef 保存实例:
const agent = shallowRef<AgentEmbedInstance | null>(null)
const handleReady = (instance: AgentEmbedInstance) => {
agent.value = instance
instance.focusInput()
}
AgentEmbedInstance 方法:
| 方法 | 说明 |
|---|---|
sendMessage({ text }) |
立即提交消息;生成期间调用会使用 steer 行为 |
addInputQuery({ text, context? }) |
写入输入框和可选上下文,不立即提交 |
abortResponse() |
终止当前回复 |
openHistoryPanel() |
打开历史会话面板 |
openThemeSettingsPanel() |
打开主题设置面板 |
newConversation() |
新建会话 |
focusInput() |
聚焦输入框 |
scrollToBottom() |
滚动到底部 |
agent.value?.addInputQuery({
text: '请解释这段内容',
context: selectedText.value,
})
agent.value?.focusInput()
组件卸载时会销毁 client,之前保存的 instance 随之失效。父组件应在切换实例时同步清理引用。
错误处理
<AgentEmbed :endpoint="endpoint" :token="token" @init-error="handleInitError" />
初始化失败码:
missing_token:缺少 token;invalid_token:token 无效或过期;forbidden:无访问权限;request_failed:鉴权请求失败。
智能体加载失败码:
not_found:未找到智能体;forbidden:无权访问智能体;request_failed:智能体请求失败。
失败对象还包含可读的 message。上述失败发生时不会触发 ready。
会话事件
<AgentEmbed
:endpoint="endpoint"
:token="token"
@session-context-ready="handleContextReady"
@tool-call-failed="handleToolFailed"
@settled="handleSettled"
/>
全部运行事件如下:
| 事件 | 参数 | 说明 |
|---|---|---|
@concurrent-send |
无 | 回复生成期间再次发送消息 |
@event |
AgentServerEvent |
接收原始服务端事件 |
@session-context-ready |
AgentSessionContext |
会话上下文可用,包含 threadId 和 turnId |
@tool-call-created |
AgentToolCallCreatedEvent, AgentSessionEventContext |
创建一个工具调用 |
@tool-approval-requested |
AgentToolApprovalRequestedEvent, AgentSessionEventContext |
一组工具调用需要确认 |
@tool-call-started |
AgentToolCallStartedEvent, AgentSessionEventContext |
工具调用开始 |
@tool-call-progress-updated |
AgentToolCallProgressUpdatedEvent, AgentSessionEventContext |
工具调用进度更新 |
@tool-call-backgrounded |
AgentToolCallBackgroundedEvent, AgentSessionEventContext |
工具调用转为后台执行 |
@tool-call-succeeded |
AgentToolCallSucceededEvent, AgentSessionEventContext |
工具调用成功 |
@tool-call-failed |
AgentToolCallFailedEvent, AgentSessionEventContext |
工具调用失败 |
@tool-call-cancelled |
AgentToolCallCancelledEvent, AgentSessionEventContext |
工具调用取消 |
@client-action-request |
AgentClientActionRequestEvent, AgentSessionEventContext |
智能体请求宿主执行客户端动作 |
@user-feedback-consumed |
AgentUserFeedbackConsumedEvent, AgentSessionEventContext |
用户反馈已被处理 |
@user-steer-consumed |
AgentUserSteerConsumedEvent, AgentSessionEventContext |
用户 steer 指令已被处理 |
@user-steer-cancelled |
AgentUserSteerCancelledEvent, AgentSessionRunEventContext |
用户 steer 指令已取消 |
@user-input-submitted |
AgentUserInputSubmittedEvent, AgentSessionEventContext |
用户输入已提交 |
@session-turn-started |
AgentSessionTurnStartedEvent, AgentSessionEventContext |
Turn 开始执行 |
@session-turn-succeeded |
AgentSessionTurnSucceededEvent, AgentSessionEventContext |
Turn 执行成功 |
@session-turn-failed |
AgentSessionTurnFailedEvent, AgentSessionEventContext |
Turn 执行失败 |
@session-turn-cancelled |
AgentSessionTurnCancelledEvent, AgentSessionEventContext |
Turn 已取消 |
@session-run-started |
AgentSessionRunStartedEvent, AgentSessionRunEventContext |
Run 已开始 |
@session-run-idled |
AgentSessionRunIdledEvent, AgentSessionRunEventContext |
Run 已空闲 |
@session-run-ended |
AgentSessionRunEndedEvent, AgentSessionRunEventContext |
Run 已结束 |
@system-message-consumed |
AgentSystemMessageConsumedEvent, AgentSessionEventContext |
系统消息已被处理 |
@success |
AgentSessionSuccess |
本轮会话成功结束 |
@error |
AgentSessionFailure |
本轮会话失败 |
@cancelled |
AgentSessionCancelled |
本轮会话取消 |
@settled |
AgentSessionSettlement |
本轮会话以任意状态结束 |
事件 payload、会话上下文和工具调用类型均由本包重导出。
布局说明
组件根节点默认样式为:
width: 100%;
height: 100%;
min-height: 0;
父容器需要设置明确高度:
<template>
<main class="agent-page">
<AgentEmbed :endpoint="endpoint" :token="token" />
</main>
</template>
<style>
.agent-page {
height: calc(100vh - 64px);
}
</style>
模板中传入的 class 和 style 会作用于根元素。
运行时变量
runtime_variables 是可选的 JSON 对象,名称须与智能体声明的运行时变量一致。仅创建新会话时发送,已有会话沿用已绑定的变量;同一面板新建会话时复用初始化值。参数在初始化时生成快照,改变值需要重建面板。数据通过 iframe 消息传递,不写入接入 URL。
<AgentEmbed :endpoint="endpoint" :token="token" :runtime_variables="{ customer_id: 'customer-1' }" />
初始化错误使用 onInitError(Vue: @init-error),包含 code 和 message,同次初始化只触发一次。失败时 whenReady() reject,聊天运行错误继续通过 onError(Vue: @error)报告。
Related Packages
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.1.0 | >=3.3 |
Pre-releases (1)
| Version | Released | License |
|---|---|---|
| 0.0.0-stage |