@sophonsai/agent-embed-vue2
@sophonsai/agent-embed-vue2
应用接入
传入服务地址 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-vue2 vue@^2.7
# pnpm
pnpm add @sophonsai/agent-embed-vue2 vue@^2.7
# yarn
yarn add @sophonsai/agent-embed-vue2 vue@^2.7
# bun
bun add @sophonsai/agent-embed-vue2 vue@^2.7
快速开始
<template>
<div class="page">
<AgentEmbed
class="agent-embed"
:endpoint="endpoint"
:token="token"
:appearance="appearance"
@theme-change="handleThemeChange"
@font-size-change="handleFontSizeChange"
@init-error="handleInitError"
@settled="handleSettled"
@ready="handleReady"
/>
<button :disabled="!agent" @click="sendHello">发送消息</button>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import {
AgentEmbed,
type AgentAppearance,
type AgentEmbedInstance,
type AgentEmbedTheme,
} from '@sophonsai/agent-embed-vue2'
export default Vue.extend({
components: { AgentEmbed },
data() {
return {
endpoint: 'https://agent.example.com',
token: '应用接入Token',
appearance: {
theme: { preset: 'glacier-blue' },
fontSize: 16,
header: {
historyButton: true,
newConversationButton: true,
themeSettingButton: false,
},
} as AgentAppearance,
agent: null as AgentEmbedInstance | null,
}
},
methods: {
handleReady(instance: AgentEmbedInstance) {
this.agent = instance
},
handleThemeChange(theme: AgentEmbedTheme) {
this.appearance.theme = theme
},
handleFontSizeChange(fontSize: number) {
this.appearance.fontSize = fontSize
},
handleInitError({ code, message }: { code: string; message: string }) {
console.error('初始化失败', code, message)
},
handleSettled(result: unknown) {
console.log('会话结束', result)
},
sendHello() {
this.agent?.sendMessage({ text: '你好' })
},
},
})
</script>
<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: 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-vue2'
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 2 适配器会深度监听整个 appearance 对象。修改主题、字号或任意头部按钮后,会同步更新面板:
this.appearance.theme = { preset: 'warm-cream' }
this.appearance.fontSize = 18
this.appearance.header!.themeSettingButton = false
当主题或字号作为受控值传入时,应在 @theme-change / @font-size-change 中同步修改 appearance,否则宿主状态仍保留旧值。
将 theme、fontSize 或 header 改为 undefined 会撤销对应的宿主控制,让面板使用内部默认值。
获取和使用实例
面板初始化完成后,ready 事件会返回 AgentEmbedInstance。在此之前,获取不到 AgentEmbedInstance 实例对象,无法操作面板执行行为。
ready 事件返回的 AgentEmbedInstance 提供:
| 方法 | 说明 |
|---|---|
sendMessage({ text }) |
立即提交消息;回复生成中调用会使用 steer 行为 |
addInputQuery({ text, context? }) |
写入输入框和可选上下文,不立即提交 |
abortResponse() |
终止当前回复 |
openHistoryPanel() |
打开历史面板 |
openThemeSettingsPanel() |
打开主题设置面板 |
newConversation() |
新建会话 |
focusInput() |
聚焦输入框 |
scrollToBottom() |
滚动到底部 |
this.agent?.addInputQuery({
text: '请分析选中内容',
context: selectedText,
})
this.agent?.focusInput()
组件执行 beforeDestroy 后会销毁 client,已保存的 instance 也会失效。建议父组件同步清空 instance 引用。
错误处理
初始化失败码:
missing_token:缺少 token;invalid_token:token 无效或过期;forbidden:无访问权限;request_failed:鉴权请求失败。
智能体加载失败码:
not_found:未找到智能体;forbidden:无权访问智能体;request_failed:智能体请求失败。
失败对象同时包含可读的 message。初始化失败不会触发 ready。
会话事件
<AgentEmbed
:endpoint="endpoint"
:token="token"
@session-context-ready="({ threadId }) => console.log(threadId)"
@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。父级应设置明确高度:
.agent-embed-container {
height: calc(100vh - 64px);
}
模板中的 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
Advanced and highly reusable Mobile UI Components built on Vue2 & You can define...
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.1.0 | >=2.7 <3 |
Pre-releases (1)
| Version | Released | License |
|---|---|---|
| 0.0.0-stage |