掘金 人工智能 05月31日 11:03
扣子智能体websdk集成多会话模式
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了扣子智能体WebSDK的集成方案,强调了使用JWT认证替代默认PAT以增强安全性和满足生产环境需求。文章详细介绍了服务端和前端的集成步骤,包括服务端如何通过OAuth认证获取访问令牌,以及前端如何使用VUE.js集成SDK。此外,还总结了集成WebSDK在提升开发效率、增强用户体验、促进业务创新和推动AI技术普及等方面的关键优势。通过快速集成、灵活定制、智能交互和多模态支持,企业可以轻松将AI技术应用于各种业务场景,实现业务增长。

🔑 **安全升级**:默认PAT集成存在安全隐患,推荐使用JWT认证,通过服务端集成OAuth认证来增强安全性,并满足实际生产环境对会话隔离的需求。

⚙️ **服务端集成**:详细介绍了服务端集成的步骤,包括使用Maven构建项目,修改源代码以处理OAuth回调并获取访问令牌,以及如何将代码适配到Spring Boot框架。

📱 **前端集成**:提供了前端VUE.js的示例代码,展示了如何初始化CozeWebSDK,配置botId、认证信息、用户信息和UI界面,以及如何设置聊天机器人的标题、上传功能和回调函数。

🚀 **四大优势**:总结了集成扣子智能体WebSDK的四大优势,包括提升开发效率与灵活性、增强用户体验与互动性、促进业务创新与增长,以及推动AI技术的普及与应用。

扣子智能体websdk集成默认PAT是不安全的,官方也推荐使用JWT认证,就涉及到服务端集成OAUTH认证。另一个是默认PAT集成,每个人打开同一个session对话,并不满足实际生产环境需求。

配置

First, 云端创建一个 OAuth应用 [服务类应用],如下:

具体进一步的操作是

服务端集成

在服务端代码我们一版maven构建机制,修改如下源代码,示例代码在这儿,基于javalin, 同样也可改造为基于SpringBoot框架

"/token",ctx -> {// 处理OAuth回调并获取访问令牌try {OAuthToken tokenResp = oauthClient.getAccessToken(UUID.randomUUID().toString());ctx.sessionAttribute(genTokenSessionKey(), tokenResp);Map<String, String> model = new HashMap<>();model.put("token_type", tokenResp.getTokenType());model.put("access_token", tokenResp.getAccessToken());model.put("refresh_token", "");model.put("expires_in",String.format("%d (%s)",tokenResp.getExpiresIn(),timestampToDateTime(tokenResp.getExpiresIn())));if ("XMLHttpRequest".equals(ctx.req.getHeader("X-Requested-With"))) {ctx.json(model);return;}String html = formatHtml(readFromResources("websites/callback.html"), model);ctx.contentType("text/html");ctx.result(html);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("Authorization failed: " + e.getMessage());}})

Spring版本适配jar文件运行

/** * OAuth 2.0 认证令牌服务实现类 * 提供与 Coze 平台集成的 JWT 令牌管理功能 * 处理认证流程中的配置加载、临时文件创建、会话管理和令牌刷新等核心操作 */@Service@Slf4jpublic class OAuthTokenServiceImpl implements OAuthTokenService {    // 配置文件相关常量    private static final String configFilePath = "coze_oauth_config.json";    public static final String XMLHTTP_REQUEST = "XMLHttpRequest"; // AJAX 请求标识头    public static final String X_REQUESTED_WITH = "X-Requested-With"; // 请求来源标识    public static final String AUTH_TOKEN = "auth_token"; // 会话中存储的 token 键名    public static final String D_S = "%d (%s)"; // 过期时间格式字符串    private static final String CONFIG_PATH = "classpath:coze_oauth_config.json"; // 配置文件路径    private static final String TEMP_FILE_PREFIX = "coze_oauth_config_"; // 临时文件前缀    private static final String TEMP_FILE_SUFFIX = ".json"; // 临时文件后缀    // 依赖注入资源加载器    @Autowired    private ResourceLoader resourceLoader;    // 私有字段    private JWTOAuthClient jwtoAuthClient; // JWT 认证客户端实例    private File tempConfigFile; // 用于存放配置的临时文件    /**     * 初始化方法,在 bean 构造完成后执行     * 根据环境选择直接使用配置文件或创建临时文件来加载认证配置     * @throws Exception 如果初始化失败     */    @PostConstruct    public void init() throws Exception {        Resource resource = resourceLoader.getResource(CONFIG_PATH);        // 开发环境直接使用文件路径        if (resource.isFile()) {            jwtoAuthClient = JWTOAuthClient.loadFromConfig(                    new LoadAuthConfig(resource.getFile().getAbsolutePath())            );            return;        }        // 生产环境创建临时文件        createTempFile(resource);        jwtoAuthClient = JWTOAuthClient.loadFromConfig(                new LoadAuthConfig(tempConfigFile.getAbsolutePath())        );    }    /**     * 创建临时文件并复制配置内容到其中     * 用于生产环境下非文件形式的资源配置处理     * @param resource 资源对象     * @throws IOException 如果文件操作失败     */    private void createTempFile(Resource resource) throws IOException {        // 创建临时文件        tempConfigFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX);        tempConfigFile.deleteOnExit();        // 复制资源到临时文件        try (InputStream is = resource.getInputStream();             FileOutputStream fos = new FileOutputStream(tempConfigFile)) {            byte[] buffer = new byte[1024];            int len;            while ((len = is.read(buffer)) > 0) {                fos.write(buffer, 0, len);            }        }    }    /**     * 清理资源,在 bean 销毁前执行     * 删除创建的临时配置文件,防止残留     */    @PreDestroy    public void destroy() {        if (tempConfigFile != null && tempConfigFile.exists()) {            boolean deleted = tempConfigFile.delete();            log.info("临时配置文件{}删除{}", tempConfigFile.getAbsolutePath(), deleted ? "成功" : "失败");        }    }    /**     * 获取 Coze 平台的 OAuth JWT 令牌     * 包括将 token 存储到会话以及构建响应模型等操作     * @return 包含认证信息的模型对象     */    @Override    public OAuthTokenModel getCozeOauthJwtToken() {        OAuthToken tokenResp = getOAuthToken();        // 获取当前会话并存储 token        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();        HttpSession session = attr.getRequest().getSession();        session.setAttribute(genTokenSessionKey(), tokenResp);        String expiresInfo = String.format(D_S, tokenResp.getExpiresIn(), timestampToDateTime(tokenResp.getExpiresIn()));        OAuthTokenModel oAuthTokenModel = new OAuthTokenModel                (tokenResp.getAccessToken(), tokenResp.getRefreshToken()                        , tokenResp.getTokenType(), expiresInfo);        // 判断是否是 AJAX 请求        if (XMLHTTP_REQUEST.equals(attr.getRequest().getHeader(X_REQUESTED_WITH))) {            return oAuthTokenModel;        }        // 非 AJAX 请求也可以返回 model 或重定向等        return oAuthTokenModel;    }    /**     * 实际获取访问令牌的方法     * 调用底层 SDK 获取新的令牌响应     * @return 获取到的 OAuth 令牌响应对象     */    private OAuthToken getOAuthToken() {        OAuthToken tokenResp = jwtoAuthClient.getAccessToken(UUID.randomUUID().toString());        return tokenResp;    }    /**     * 生成用于在会话中存储 token 的键名     * @return token 的会话键名     */    private String genTokenSessionKey() {        return AUTH_TOKEN;    }    /**     * 将 Unix 时间戳转换为可读的日期时间字符串     * @param timestampInSeconds 时间戳(秒)     * @return ISO8601 格式的日期时间字符串     */    private String timestampToDateTime(long timestampInSeconds) {        return Instant.ofEpochSecond(timestampInSeconds).toString();    }}

前端集成

前端VUE.js的示例代码

      const cozeWebSDK = new CozeWebSDK.WebChatClient({        config: {          //修改为您的botId          botId: import.meta.env.VITE_BOT_ID,        },        auth: {          type: 'token',          token: tokenValue,          onRefreshToken: () => tokenValue        },        userInfo: {          id: "12344",          url: "//",          nickname: "Guest",        },        ui:{          base:{            layout:"pc",            lang:"zh-CN",            zIndex:100          },           header:{            isShow:false,            isNeedClose:true,          },          asstBtn: {            isNeed: true,          },          footer: {            isShow: true,            expressionText: 'Powered by Megadotnet',            linkvars: {              name: {                text: 'A',                link: 'https://www.test1.com'              },              name1: {                text: 'B',                link: 'https://www.test2.com'              }            }          }        },        chatBot: {          title: "Kids' Playmate | Snowy",          uploadable: true,          width: 800,          el: undefined,          onHide: () => {},          onShow: () => {},        },      });    });

官网webSDK
www.coze.cn/open/docs/d…

鉴权
www.coze.cn/open/docs/d…

会话隔离
www.coze.cn/open/docs/d…

结论

一、提升开发效率与灵活性

    快速集成与部署

      扣子智能体WebSDK提供了丰富的API和组件,使得开发者能够快速将智能体功能集成到现有的Web应用或系统中,无需从零开始构建复杂的AI功能。通过简单的代码调用,即可实现智能体的部署和运行,大大缩短了开发周期。

    灵活定制与扩展

      SDK支持根据具体需求进行定制和扩展,开发者可以灵活调整智能体的功能、界面和交互方式,以适应不同的业务场景。这种灵活性使得扣子智能体能够广泛应用于各种领域,如客服、教育、娱乐等。
二、增强用户体验与互动性

    智能交互与个性化服务

      通过集成扣子智能体WebSDK,Web应用或系统能够具备智能交互能力,为用户提供更加便捷、高效的服务。智能体可以根据用户的输入和需求,提供个性化的回答和建议,提升用户体验和满意度。

    多模态交互支持

      SDK支持语音、文本、图像等多种输入方式,使得用户可以通过多种渠道与智能体进行交互。这种多模态交互方式不仅丰富了用户体验,还提高了交互的便捷性和自然性。
三、促进业务创新与增长

    拓展业务场景与应用范围

      扣子智能体WebSDK的集成实践使得企业能够轻松将AI技术应用于新的业务场景中,如智能客服、智能推荐、智能分析等。这些新的应用场景不仅拓展了企业的业务范围,还为企业带来了新的增长点。

    提升业务效率与竞争力

      通过智能体的自动化处理和智能决策能力,企业可以显著提高业务处理效率和质量。同时,智能体还能够为企业提供数据分析和洞察支持,帮助企业更好地了解市场需求和用户行为,从而制定更加精准的市场策略。
四、推动AI技术的普及与应用

    降低AI技术门槛

      扣子智能体WebSDK的集成实践降低了AI技术的应用门槛,使得更多的开发者和企业能够轻松接入和使用AI技术。这有助于推动AI技术的普及和应用,促进整个行业的创新和发展。

    促进AI生态系统的建设

      通过提供开放、易用的SDK工具,扣子智能体促进了AI生态系统的建设和发展。更多的开发者和企业可以参与到AI技术的研发和应用中来,共同推动AI技术的进步和应用场景的拓展。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

扣子智能体 WebSDK JWT认证 OAuth AI集成
相关文章