VolcengineVolcengine ADK

前端

VeADK 提供两种前端:VeADK Web 用于本地快速调试,VeADK Frontend 是可定制的生产级 React 应用。

VeADK Web

veadk web 启动一个继承自 Google ADK Web 的可视化调试界面,零前端代码即可在浏览器中与智能体对话、查看执行过程,适合本地开发与排查。用法见快速开始 · 本地可视化调试

VeADK Frontend

VeADK 自带一个 React 前端,用于渲染智能体经由 Google ADK API Server 流式返回的 A2UI(智能体驱动 UI)。它与 veadk frontend 启动的是同一个服务进程,因此无需单独部署后端

功能一览

  • 对话:与智能体多轮对话,渲染流式返回的 A2UI 卡片,并展示思考过程、工具调用、Token 与用时。
  • 多模态消息:上传图片、TXT/Markdown、PDF 与视频;用户附件和模型返回的媒体均支持预览与历史回放。 对话中的图片默认以紧凑尺寸展示,点击后可全屏缩放预览。
  • 技能与子 Agent 调用:在输入框输入 / 选择挂载技能,输入 @ 将本轮交给可选的子 Agent。
  • 新会话模式:保留 Agent 对话模式;临时会话会在 AgentKit Sandbox 中启动 Codex Agent;Skill 创建模式会在两个独立的 AgentKit CodeEnv Session 中使用固定模型做真实 A/B 生成,完成后可对比、下载 ZIP 或添加到 AgentKit。
  • Agent 选择器:左上角切换 agent;长列表在视口内独立滚动,悬停可查看该 agent 的模型与挂载的工具。
  • 历史会话:自动保存、按时间排序,可重新打开或删除。
  • Sandbox 智能体:创建 Codex、OpenClaw 或 Hermes 时默认勾选“是否持久化”, 使用对应的快照版 Tool;取消勾选会创建 8 小时临时 Session,并显示黄色清空提示。 Codex 通过标准 Codex App Server 进行多轮对话,实时展示公开思考摘要、命令、 文件修改、MCP 调用和最终回复;侧栏会列出 Codex 历史会话,并支持切换和删除。 退出只会断开当前连接,云端 Session 会保留到用户明确删除或到期。
  • 智能搜索:「会话」源在当前 agent 的历史消息中做全文检索;「网页」源调用该 agent 挂载的联网搜索工具实时检索(使用服务端环境变量里的凭据)。
  • 消息反馈回流:连接云端 AgentKit Runtime 时,回答下方的赞/踩按钮会将 当前问题、回答和反馈状态写入 AgentKit 评测集。每个 Agent 自动维护 {agent_name}_good_case{agent_name}_bad_case 两个评测集,切换或取消反馈会 幂等更新对应样本。如果标准名称已被云端占用但不可见,Studio 会改用带稳定短后缀的 备用名称并在后续反馈中复用;Runtime 不支持 Session 状态更新时,浏览器会保留兼容性缓存。
  • 添加 AgentKit 智能体:填入访问地址 + API Key,按 ADK 协议接入远程 agent,接入后出现在选择器中。
  • 自定义 Agent 工作台:系统提示词支持所见即所得的 Markdown 编辑与标题、列表等快捷输入;本地技能可直接拖入文件夹或 ZIP,格式会自动识别, 也可按地域和项目浏览账号下的 AgentKit Skill Space 及其中的技能。 完成配置后可在同页调试。调试初始化、 会话或对话失败时会展示经过凭据脱敏的具体错误和 Runner 日志, 并支持展开与复制。部署页左侧展示 Agent 拓扑,悬停可核对节点信息与配置, 也可导出配置、下载源码或在弹窗中浏览和编辑代码;右侧集中设置发布区域、 消息渠道、网络、环境变量后部署到 AgentKit。新建 Runtime 时,Studio 默认根据 Root Agent 名称确定性规范化 Runtime 名称,不会追加随机后缀。名称必须为 4–64 位, 仅支持字母、数字、连字符(-)和下划线(_);首次部署前可以单独修改,更新 现有 Runtime 时名称不可修改。全局标题栏提供跨页面部署任务列表,展示 Runtime 名称、地域与进度;运行中的任务可取消并清理资源,失败任务可重试。远程 Agent 的 拓扑和 Trace 会通过所选 Runtime 的数据面获取。 自定义创建中的“远程 Agent”仅可作为子 Agent,通过 AgentKit 智能体中心 ID、 召回数量、地域和 OpenAPI 地址配置。名称、描述和能力由中心返回的 Agent Card 提供;生成的内部代理会在每轮请求中动态发现和挂载匹配的远程 Agent。
  • 在自定义 Agent 的内置工具中选择「代码执行」会生成 run_code 工具,并在工具列表 下方要求填写 AGENTKIT_TOOL_ID(代码执行沙箱 Tool ID),同时可填写 AGENTKIT_TOOL_REGION(默认 cn-beijing)。两个值都会用于本地调试和部署运行时; 代码、语言和超时由 Agent 按工具函数签名在运行时传入,tool_context 由 ADK 自动注入。
  • Tracing 观测:查看本次会话的调用火焰图。
  • 登录:支持 SSO(VeIdentity / GitHub / Google / 任意 OIDC)或本地用户名。

知识库、记忆库、工具和 Tracing 等组件只要求填写无法自动获取的参数。Studio 服务端已有的火山引擎凭证会自动传给本地调试进程和部署后的 AgentKit Runtime, VeADK 会据此获取 Ark、Embedding、图像、视频、语音、VeSearch 和 APMPlus 的 API Key,挂载组件时无需重复填写。

“灵光一现”需要 Studio 服务端配置 VOLCENGINE_ACCESS_KEYVOLCENGINE_SECRET_KEYMODEL_AGENT_API_KEYMODEL_AGENT_NAME。 火山引擎凭证、模型凭证以及带授权信息的 Sandbox Endpoint 始终保留在服务端, 不会返回浏览器。 临时沙箱状态保存在 Studio 进程内;部署时应使用单个服务进程,或配置会话亲和, 确保同一浏览器的创建、对话和退出请求到达同一个实例。

在部署页打开或关闭飞书渠道时,Studio 会重新生成项目,确保 app.pyextensions 依赖和运行时环境变量在部署前保持一致。

运行

先构建前端,再用一条命令同时提供 UI 与智能体 API:

# 1. 构建前端
cd frontend && npm install && npm run build

# 2. 在仓库根目录,单进程提供 UI + 智能体 API
veadk frontend --agents-dir examples
# 打开 http://127.0.0.1:8000

开发模式(热更新)

开发模式下只提供 API(并为 Vite 开发服务器开启 CORS),前端由 Vite 单独以热更新方式运行:

veadk frontend --dev --agents-dir examples   # 仅 API,为 vite 放行 CORS
cd frontend && npm run dev                    # http://localhost:5173(代理 API)

veadk frontend 命令

选项默认值说明
--agents-dir智能体应用目录,每个子目录暴露一个 root_agent
--frontend-dir./frontend 的构建产物已构建 React UI(npm run build 输出)所在目录。
--host127.0.0.1监听地址。
--port8000监听端口。
--dev关闭开发模式:仅提供 API,并放行来自 Vite 开发服务器(http://localhost:5173)的 CORS。
--oauth2-user-pool / --oauth2-user-pool-clientVeIdentity 用户池 / 客户端名称。设置后启用 SSO。
--oauth2-user-pool-uid / --oauth2-user-pool-client-uid环境变量 OAUTH2_USER_POOL_ID / OAUTH2_USER_POOL_CLIENT_IDUID 代替名称指定用户池 / 客户端。
--oauth2-provider / --oauth2-provider-labelveidentity登录按钮的 provider 标识与显示文案。
--oauth2-redirect-urihttp://{host}:{port}/oauth2/callbackOAuth2 回调地址(环境变量 OAUTH2_REDIRECT_URI)。部署到公网 / runtime 时需设置。
第三方 / 自定义 provider见下文通过环境变量接入 GitHub / Google / 任意 OIDC,详见「认证」一节。

非开发模式下,若未找到已构建的前端目录,命令会报错提示先执行 npm run build(或改用 --dev 配合 Vite 开发服务器)。

多模态附件与存储

输入框支持 PNG、JPEG、WebP、GIF、TXT、Markdown、PDF、MP4、WebM 和 QuickTime。默认单文件上限为 20 MB。浏览器使用二进制表单上传,不会把附件转成 base64 写入会话。

媒体本体与 ADK Session 分开保存:

  • 本地模式默认写入 /tmp/veadk-media/apps/.../sessions/.../media/<media-id>/,其中 content 是文件本体,metadata.json 是文件名、MIME、大小和哈希等元数据。
  • TOS 模式默认写入 veadk-media/users/<encoded-username>/apps/<app>/sessions/<session>/media/<media-id>/ 下的同名两个对象。用户名位于最外层租户 prefix,不同用户的数据相互隔离;username、app 和 session 路径段都会进行 URL 编码。
  • Session Event 只保存 Google GenAI FileData 稳定引用,例如 veadk-media://apps/.../media/<media-id>;重新打开历史会话时再通过媒体 API 读取本体。

调用模型前,TXT/Markdown 会解码为 Part.text,图片和视频会从当前存储读取并转换为 Part.inline_data,PDF 则自动渲染为逐页 PNG 图片。PDF 渲染运行时包含在 VeADK 默认依赖中,不需要额外安装或配置 Agent callback。模型返回的 inline_data 会先落到 媒体存储,再在 Event 持久化和 SSE 输出前改写为稳定引用。TOS 的 15 分钟签名 URL 只用于浏览器下载/预览,不作为模型的 FileData URI。

选择云端 Agent Runtime 时,上传、预览和删除仍由 Studio 自身的 /web/media 接口处理,不会转发到 Runtime。Studio 仅在代理 /run_sse 时读取稳定引用,将内容转换为 远端模型可直接消费的 Part;原始 veadkMedia 元数据会保留,因此历史消息仍按原文件类型 和名称加载。这个流程同时支持默认 /tmp 与 TOS,无需远端 Runtime 挂载媒体 HTTP 路由。

环境变量默认值说明
VEADK_MEDIA_STORAGElocal选择 localtos
VEADK_MEDIA_LOCAL_DIR/tmp/veadk-media本地媒体根目录。
VEADK_MEDIA_MAX_FILE_BYTES20971520单个上传文件或模型输出的字节上限。
VEADK_MEDIA_TOS_PREFIXveadk-mediaTOS 对象 Key 前缀。
DATABASE_TOS_BUCKETTOS Bucket。
DATABASE_TOS_REGION / DATABASE_TOS_ENDPOINT按云环境推导TOS Region 与 Endpoint。
VOLCENGINE_ACCESS_KEY / VOLCENGINE_SECRET_KEYTOS 访问凭据。
VOLCENGINE_SESSION_TOKEN可选的临时凭据 Token。

移除尚未发送的附件会立即删除对应对象;删除 Session 会清理该 Session 下的全部媒体。本地模式无需额外配置,但 /tmp 可能随进程或宿主机回收而被清理;需要持久保存附件时应使用 TOS。启用 TOS 的最小配置如下:

export VEADK_MEDIA_STORAGE=tos
export DATABASE_TOS_BUCKET=<bucket>
export DATABASE_TOS_REGION=cn-beijing
export VOLCENGINE_ACCESS_KEY=<access-key>
export VOLCENGINE_SECRET_KEY=<secret-key>
veadk frontend --agents-dir examples

使用技能与子 Agent

在输入框中输入 / 可搜索当前 Agent 挂载的技能,输入 @ 可搜索其 Agent 树中允许转移的后代节点。使用上下方向键移动,按 Enter 或 Tab 选择,按 Escape 关闭菜单。选中项会变成可移除的 chip,不会作为普通文本留在消息中。

选中子 Agent 后,/ 菜单会改为展示目标 Agent 自己挂载的技能。切换或移除目标时会清空原有技能,避免把技能发送给没有挂载它的 Agent。tasksingle_turn 工作流节点仍会显示在拓扑中,但不能通过 @ 选择。

前端不会从消息字符串中猜测调用意图,而是发送结构化的 veadkInvocation metadata。后端插件据此要求 ADK 调用技能工具,或沿 Agent 树逐级调用 transfer_to_agent,直到到达目标节点。同一份 metadata 也会写入首个 Google GenAI Part,因此重新加载历史会话后仍能恢复 /skill@agent chip。

技能中心

Studio developer 和 admin 可在技能中心创建或优化 Skill。每个候选方案都会在共享 Dev Sandbox Tool 上创建独立的 DevEnv Session,持续显示公开活动,并在完成后校验 生成文件。通过校验的结果可预览、下载或发布到 AgentKit;模型凭据只保存在 Tool 中,不会返回浏览器。

本地 Studio 从 SANDBOX_DEV 读取 DevEnv Tool ID:

export SANDBOX_DEV=<dev-env-tool-id>
veadk studio --agents-dir examples

每个任务的 DevEnv Session 最长保留 1 小时。离开仍在运行的任务时,Studio 会停止并 释放对应 Session;任务状态保存在 Sandbox 中,因此前端实例切换后仍可继续轮询。

云上部署未指定 Tool ID 时会自动创建 Dev Sandbox,也可通过 --sandbox-dev-tool-id 使用已有 Tool:

veadk studio deploy \
  --vefaas-app-name <app-name>

未指定 --user-pool-id--allowed-client-id 时,部署命令会在用户选择的 --region 中自动创建或复用同名用户池和 Client,并在完成后回显它们的 ID。 也可以继续通过这两个参数使用已有资源。

部署凭据支持通过 --volcengine-access-key / --volcengine-secret-key 显式传入,也支持当前进程的 VOLCENGINE_ACCESS_KEY / VOLCENGINE_SECRET_KEY 环境变量。两者均未提供时,会读取 ~/.volc/credentials 中的 [default] 配置。

自定义 Studio 品牌

使用 --site-title 设置不超过 6 个字符的系统名称,使用 --site-logo 指定本地图片或 HTTP(S) 图片地址。Logo 会同时用于 侧边栏、登录页和浏览器 favicon,系统名称也会作为浏览器页面标题。 不传 --site-title 时保留默认名称 AgentKit Studio;6 字符限制只适用于自定义名称。

veadk studio --site-title 火山助手 --site-logo ./logo.png
veadk studio --site-title 火山助手 --site-logo https://example.com/logo.webp

支持 PNG、JPEG、GIF、WebP、AVIF 和 ICO,图片最大 5 MB;也可以通过 VEADK_SITE_TITLEVEADK_SITE_LOGO 环境变量配置。云上部署使用相同 参数,网络图片会在部署时下载,并与本地图片一样打包进 VeFaaS, 不依赖原始图片地址:

veadk studio deploy \
  --user-pool-id <pool-id> \
  --allowed-client-id <client-id> \
  --vefaas-app-name <app-name> \
  --region cn-beijing \
  --project default \
  --site-title 火山助手 \
  --site-logo ./logo.png

--region 指定 Studio 部署地域,默认为 cn-beijing,也支持 cn-shanghai。部署时会先查询部署地域,再跨地域查询北京、上海的 Identity 用户池;跨地域命中时会显示 warning 并继续。--project 指定 VeFaaS 函数 所属项目,默认为 default

环境镜像构建

Studio 的“环境”页面会把环境配置、Dockerfile、构建版本、日志元数据和镜像地址保存到 私有 TOS。创建或保存环境后,Studio 使用 CodePipeline 构建镜像,并推送到 Container Registry。首次构建默认自动创建或复用托管的 Workspace、Pipeline 和镜像仓库。 火山引擎构建会使用阿里云 PyPI 镜像、华为云 Python 源码镜像和 npmmirror 的 Playwright 浏览器镜像;BytePlus 构建使用对应的官方源。跨版本 Python 组合使用固定 补丁版本的源码构建,不依赖 GitHub 托管的二进制。 使用账号级默认 TOS 桶时,CR 会复用 agentkit-cli-<account-id> 实例,并在其中创建 runtime-environments/base-images 仓库。

也可以在部署 Studio 时通过 Flag 指定已有资源,两项可以独立使用:

veadk studio deploy \
  --vefaas-app-name <app-name> \
  --environment-cp-workspace <workspace-id-or-name> \
  --environment-cr-repository <registry/namespace/repository>

这些配置不从用户环境变量读取。部署后的“系统信息”页面会显示最终使用的 CodePipeline 和 Container Registry 名称、来源及控制台链接。

更新已部署的 Studio 时,在 VeADK 源码目录执行:

veadk studio update --vefaas-app-name <app-name>

该命令重新构建本地前端并更新已有 VeFaaS Function 的代码,然后发布原 Application。未指定 --region--project 时,会在北京、上海以及所有可见 项目中查找;若同名 Application 不唯一,命令会列出候选项并要求缩小范围。 更新不会改变 Application/Function ID、访问 URL、SSO、IAM、网关或已有环境 变量。--site-title--site-logo 仅在显式传入时覆盖,省略时保留云上品牌 设置。可用 --path 指定源码目录,默认为当前目录;本地需安装 Node.js 与 npm。 Sandbox Tool ID 参数也只在显式传入时更新对应环境变量,包括 --sandbox-chat-codex-tool-id--sandbox-chat-openclaw-tool-id--sandbox-chat-hermes-tool-id、对应的三个 --sandbox-chat-*-snapshot-tool-id--sandbox-dev-tool-id。部署时未指定会自动创建三组普通/快照 Sandbox Tool; 快照版 Tool 名称以 _snapshot 结尾。更新时未传的 Tool ID 保留云上已有值, 缺失的快照版 Tool 会自动补齐。

Studio 一键更新

Studio 固定从维护在北京地域的 veadk-studio TOS 发布源读取新版本,客户部署 地域无需额外配置。管理员可以直接在导航栏更新 Studio:

veadk studio deploy \
  --user-pool-id <pool-id> \
  --allowed-client-id <client-id> \
  --vefaas-app-name <app-name>

Studio 每 3 分钟读取一次 latest.json,展示新版本的 changelog 和 Git SHA。 管理员确认后,完整 Bundle 会同时替换 Python 后端和前端资源,再发布原 Application;访问 URL、SSO Client 和服务端 Secret 保持不变。

.github/workflows/publish-studio-release.yaml 不再随源码更新自动运行。每次发版需在 main 分支手动运行 Publish Studio Release,并填写面向用户的 changelog。GitHub checkout 准确 SHA、构建前端并校验固定的离线 wheel,再通过与任务绑定的短期 TOS URL 上传预处理源码。API Key 保护的 VeFaaS Release Server 消费并删除这个私有对象, 构建和发布不可变 Bundle 与 Manifest,更新有数量上限的 releases.json,最后覆盖 latest.json。GitHub Secrets 只需 STUDIO_RELEASE_SERVER_URLSTUDIO_RELEASE_SERVER_API_KEY,不保存 TOS AK/SK。

Release Server 的运行代码和部署资产统一位于 frontend/service/studio_release_server/,不随 veadk Python 包发布。修改该目录后, 在仓库根目录执行以下命令更新现有 VeFaaS Function:

frontend/service/studio_release_server/deploy.sh

脚本复用既有 Serverless 网关、检查 /healthz、轮换 API Key,并更新仓库中的 STUDIO_RELEASE_SERVER_URLSTUDIO_RELEASE_SERVER_API_KEY Secrets。执行前需 配置 VOLCENGINE_ACCESS_KEYVOLCENGINE_SECRET_KEY,并确保 GitHub CLI 已登录。

部署注册回调地址时会保留 VeIdentity 登录页,并为该客户端开启跳过授权确认, 避免用户登录后再次确认授权。

Studio 角色与 Runtime 权限

部署时唯一的角色参数是 --super-admin,指定用户池内已有用户的邮箱或 UID:

veadk studio deploy \
  --user-pool-id <pool-id> \
  --allowed-client-id <client-id> \
  --vefaas-app-name <app-name> \
  --super-admin "owner@example.com"

首次部署不指定超级管理员时,所有登录用户默认都是管理员,包括后续新增用户;指定后, 其余用户默认是普通用户。默认角色和用户角色都存储在 Identity 中,后续部署和更新保留 已保存的角色,不会重新套用初始化配置

只有超级管理员可见并可使用“用户管理”,可查询当前用户池的用户、修改角色。 超级管理员拥有管理员的全部权限,初始超级管理员不能在 Studio 内降级。 已有部署没有超级管理员时,可运行 veadk studio update --vefaas-app-name <app-name> --super-admin <email-or-uid> 设置首位超级管理员,其他人的角色保持不变

功能super adminadmindeveloper普通用户
用户管理允许不允许不允许不允许
添加、调试和部署 Agent允许允许允许不允许
查看和连接 Runtime全部全部仅自己创建的仅自己创建的
管理或删除 Runtime全部 Studio 管理的全部 Studio 管理的仅自己创建的不允许

新版 Studio 在每次已认证的后端请求中读取 Identity 用户组,角色修改后刷新页面即可 看到变化。账号区域显示对应角色徽标

云上页面更新会把旧环境变量 VEADK_STUDIO_ADMINSVEADK_STUDIO_DEVELOPERS 中的账号逐一匹配到 Identity,保留原角色,成功后清空旧角色变量。名单中的账号必须 唯一匹配;匹配失败或权限不足时停止迁移并保留旧配置。旧名单为空时保留“全部为管理员”; 有名单时,其余人仍是普通用户。不会自动将旧管理员升级成超级管理员

旧更新器不包含迁移逻辑时,由新版首次启动完成迁移并清理 Function 配置。 已发布 Revision 的环境快照可能仍保留原值,但 Identity 初始化完成后不会再次覆盖角色。 旧部署需要 Identity 用户组读写权限;可先补齐权限,或使用新版 CLI 更新,由 CLI 更新 Studio 托管的 IAM 策略。火山引擎和 BytePlus 遵循同样规则

本地未配置 Identity 用户池时,仍兼容 veadk studio --admin ... --developer ...deploy 已移除这两个参数

管理 Agent 页面默认展示北京区域的 Runtime,也可以切换到上海。 新会话发送首条消息后会立即进入对话页面;服务端会话创建期间,会话 ID 显示为 “初始化中”。

Runtime 归属由服务端在创建时记录,不使用浏览器提交的作者字段做授权。升级前创建 的 Runtime 会兼容 veadk:author 归属标签;同时缺少 veadk:ownerveadk:author 归属标签的历史 Runtime 仅管理员和超级管理员可见。

本地用户名保存在浏览器中,可以被用户修改或冒充,只适合本地开发和功能验证。 生产环境必须使用 OAuth 或 gateway 认证,让服务端从已验证的身份中判断角色和 Runtime 归属。

veadk studio deploy 的 IAM 权限

部署命令会先检查 ServerlessApplicationRole。如果该 Role 不存在,终端会显示 黄色提示并自动创建 Role,同时创建或复用自定义策略 vefaas_full_access,然后 绑定以下策略(作用域均为 Global):

  • CloudMonitorReadOnlyAccess
  • vefaas_full_access
  • VPCFullAccess
  • TLSFullAccess
  • APIGFullAccess
  • ECSFullAccess
  • VeFaaSFullAccess
  • STSAssumeRoleAccess

该检查不受 --iam-role 影响;部署使用的 AK/SK 需要具备查询、创建 IAM Role/策略以及绑定策略的权限。

未传入 --iam-role 时,部署命令会创建或复用 VeADKFrontendServiceRole,并确保该 Role 绑定以下火山引擎系统策略:

  • ArkReadOnlyAccess
  • TLSReadOnlyAccess
  • APMPlusServerReadOnlyAccess
  • VikingdbReadOnlyAccess
  • ESCloudReadOnlyAccess
  • LLMShieldProtectSdkAccess
  • TorchlightApiFullAccess
  • Mem0ReadOnlyAccess
  • IDReadOnlyAccess

Role 同时保留 VeADKFrontendPolicy 自定义策略中的 AgentKit 权限。传入 --iam-role 时,命令直接使用指定 Role,不修改其策略。

认证(SSO 与本地用户名)

会话与记忆按 ADK 的 user_id 隔离,该 user_id 来自登录用户。

SSO(VeIdentity OAuth2) —— 传入用户池 / 客户端后启用。前端会展示登录页并跳转到 VeIdentity,登录后用 /oauth2/userinfo 返回的 sub 作为 user_id

veadk frontend --agents-dir examples \
  --oauth2-user-pool <name> --oauth2-user-pool-client <name>
# 或用 UID(读环境变量 OAUTH2_USER_POOL_ID / OAUTH2_USER_POOL_CLIENT_ID):
# --oauth2-user-pool-uid <id> --oauth2-user-pool-client-uid <id>

需要进程能拿到火山引擎凭证(AK/SK)。中间件保护 API、放行 SPA 外壳与 GET /web/auth-config,因此应用能加载并展示自己的登录页(而不是被直接重定向到 IdP)。登录按钮的文案/图标由配置驱动(--oauth2-provider / --oauth2-provider-label)。

连接使用 custom_jwt 鉴权的 AgentKit Runtime 时,服务端代理会转发当前会话中已经验证的 OAuth access token。前端所用 token 的 issuer 必须匹配 Runtime 的 discovery URL,并且 client ID 必须包含在 Runtime 的 allowed_clients 中。

第三方 / 自定义 OAuth2(环境变量) —— 不依赖 VeIdentity 用户池时,只要设置 OAUTH2_CLIENT_ID(及密钥),即可接入 GitHub、Google 或任意 OAuth2/OIDC 登录。端点来源按以下顺序确定:内置预设(OAUTH2_PROVIDER=github / google)→ OIDC 自动发现(设置 OAUTH2_ISSUER)→ 显式端点(OAUTH2_AUTHORIZE_URL 等)。

环境变量说明
OAUTH2_PROVIDERprovider 标识:githubgoogle 或自定义名。决定登录按钮文案与内置预设。
OAUTH2_CLIENT_ID / OAUTH2_CLIENT_SECRETOAuth2 客户端凭据。设置 OAUTH2_CLIENT_ID 即启用通用 provider。
OAUTH2_ISSUEROIDC issuer 基址,端点自动发现(如 https://accounts.google.com)。
OAUTH2_AUTHORIZE_URL / OAUTH2_TOKEN_URL / OAUTH2_USERINFO_URL显式端点(用于非 OIDC provider)。
OAUTH2_SCOPE覆盖请求的 scope。
OAUTH2_PROVIDER_LABEL覆盖登录按钮文案。
OAUTH2_REDIRECT_URI回调地址。部署到公网 / runtime 时设为公网回调,并在 OAuth 应用中登记同一地址;本地默认 http://{host}:{port}/oauth2/callback

GitHub(预设,仅需 id/secret):

export OAUTH2_PROVIDER=github
export OAUTH2_CLIENT_ID=<github-oauth-client-id>
export OAUTH2_CLIENT_SECRET=<github-oauth-client-secret>
export OAUTH2_REDIRECT_URI=http://127.0.0.1:8000/oauth2/callback
veadk frontend --agents-dir examples

Google 同理,把 OAUTH2_PROVIDER 换成 google;Keycloak / Auth0 / Okta 等任意 OIDC 则设 OAUTH2_ISSUER + 客户端凭据即可。完整示例见仓库 examples/front_with_sso/

部署到 runtime / 公网时,OAuth 回调必须指向外部可访问的地址:把 OAUTH2_REDIRECT_URI 设为公网回调 URL,并在 OAuth 应用里登记同一地址。Cookie 的 Secure 标志会根据该地址是否为 HTTPS 自动开启。

SSO 引导语固定为“登录以继续使用”,不追加系统名称;登录页底部使用 “火山引擎 AgentKit 提供企业级 Agent 解决方案”品牌文案。

无 SSO(本地用户名) —— 不传上述参数时,登录页会让用户输入一个用户名(字母 + 数字,≤16 位),保存在本地并作为 user_id

登录态会被缓存:SSO 走 veadk_session Cookie,本地模式走 localStorage。会话本身在发送第一条消息或上传第一个附件时才创建(而非打开页面时)。退出登录为本地登出(清除会话并回到登录页)。

Agent 命名规则

Studio 会按照 Google ADK 的规则校验根 Agent 与所有嵌套 Agent 的名称:名称须以 英文字母或下划线开头,后续只能包含英文字母、数字和下划线;不能使用保留名 user,并且在整个 Agent 结构中必须唯一。

工作原理

adk/client.ts 调用 /list-apps,创建会话,并通过 /run_sse 进行流式接收。

veadk.multimodal 校验上传,统一管理本地/TOS 存储,在模型调用前解析媒体引用,并在历史持久化前保存模型返回的媒体。

veadk.cli.frontend_invocation 暴露 Agent 挂载的技能,并把结构化的 /skill@agent 选择转换为 ADK 技能工具与 Agent 转移指令。

a2ui/extract.tssend_a2ui_json_to_client 工具的响应(validated_a2ui_json)中提取 A2UI 消息。

a2ui/Surface.tsxcreateSurface / updateComponents / updateDataModel 应用到 surface 状态中,并渲染根组件。

a2ui/registry.ts 将每个组件名映射到一个 React 渲染器;每个渲染器位于 a2ui/components/<Name>/ 目录下并自行注册。

添加企业自定义组件

一个自定义组件由两个“对半”组成,它们共享同一个 catalog id。后端部分见 A2UI;前端部分如下。

前端部分 —— 新建一个目录即可自动注册(无需修改任何中心文件):

RevenueChart.tsx
index.ts
src/a2ui/components/RevenueChart/index.ts
import { register } from "../../registry";
import { RevenueChart } from "./RevenueChart";
register("RevenueChart", RevenueChart);
src/a2ui/components/RevenueChart/RevenueChart.tsx
import type { ComponentRendererProps } from "../../registry";

export function RevenueChart({ node, ctx }: ComponentRendererProps) {
  const series = ctx.resolve(node.series as any);
  return <div className="corp-chart">{/* 渲染 series */}</div>;
}

components/index.ts 通过 import.meta.glob 导入每个 */index.ts,因此新目录会被自动拾取。

未注册渲染器的未知组件会回退到可折叠的 JSON 视图,因此目录与渲染器不匹配也不会导致界面崩溃。

沙箱版本更新

管理员可在「系统信息 → 沙箱信息」检查沙箱版本。Studio 按云厂商和沙箱实际区域 查询发布镜像,展示当前版本和目标版本;存在差异时可点击对应沙箱的更新按钮。 Volcengine 和 BytePlus 使用各自的凭据及接口,镜像目录不会跨厂商、区域复用。

Codex 和 DeepSeek Harness 共用 Tool 时,两处同步显示更新状态,只需更新一次。 快照版使用对应的 Tool 单独检查。Codex 缺失的模型环境变量仍会从原 CODEX_* 配置补齐。更新完成表示 Tool 已就绪且镜像匹配目标版本,不代表已有 Session 或 历史快照已切换镜像。版本查询失败可点击「检查更新」重试。

本页导航