扣子智能体websdk集成多会话模式

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

配置

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

303094dbbd2b2117a05c8d5f1e3915a6

具体进一步的操作是

11318ea88f38b5b2bfc7e5124eece671

服务端集成

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

java 复制代码
"/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文件运行

java 复制代码
/**
 * OAuth 2.0 认证令牌服务实现类
 * 提供与 Coze 平台集成的 JWT 令牌管理功能
 * 处理认证流程中的配置加载、临时文件创建、会话管理和令牌刷新等核心操作
 */
@Service
@Slf4j
public 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的示例代码

javascript 复制代码
      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...

结论

一、提升开发效率与灵活性
  1. 快速集成与部署

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

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

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

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

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

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

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

    • 通过提供开放、易用的SDK工具,扣子智能体促进了AI生态系统的建设和发展。
    • 更多的开发者和企业可以参与到AI技术的研发和应用中来,共同推动AI技术的进步和应用场景的拓展。
相关推荐
乱世刀疤2 小时前
腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务
ai编程
Lilith的AI学习日记2 小时前
n8n 中文系列教程_25.在n8n中调用外部Python库
开发语言·人工智能·python·机器学习·chatgpt·ai编程·n8n
猫头虎2 小时前
DeepSeek‑R1-0528 重磅升级:蚂蚁百宝箱免费、无限量调用
aigc·ai编程·智能体·deepseek·deepseekr1‑0528·蚂蚁百宝箱·deepseek0528
扑克中的黑桃A3 小时前
阿里云-通义灵码:测试与实例展示
ai编程
极客小俊8 小时前
我还是老老实实地用Cursor AI~编程从此不再繁琐,一键生成代码,效率提升千倍!
ai编程
caoxiaoye9 小时前
一句话开发Chrome摸鱼插件
chrome·ai编程·腾讯云ai代码助手·codebuddy
fish_study_csdn11 小时前
PyCharm接入DeepSeek,实现高效AI编程
python·pycharm·ai编程
用户2128419285911 小时前
突破资源限制:轻量级AI模型部署
ai编程
CodeAgent11 小时前
【MCP 开篇】在 VS Code 上导入MCP
ai编程·mcp
极客密码1 天前
DeepSeek-R1-0528,官方的端午节特别献礼
前端·ai编程·deepseek