在线客服弹窗

# 在线客服弹窗

# 预览效果图

预览效果图

# 配置文件

# 弹窗配置文件代码

chat-config.js

// 在线客服弹窗组件的配置文件
const ChatConfig = {
    serviceUrl: "http://192.168.1.119/chat",
    icon:{
        fullIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLW1heGltaXplIj48cGF0aCBkPSJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzbTE4IDBWNWEyIDIgMCAwIDAtMi0yaC0zbTAgMThoM2EyIDIgMCAwIDAgMi0ydi0zTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLz48L3N2Zz4=',
        miniIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLW1pbmltaXplIj48cGF0aCBkPSJNOCAzdjNhMiAyIDAgMCAxLTIgMkgzbTE4IDBoLTNhMiAyIDAgMCAxLTItMlYzbTAgMTh2LTNhMiAyIDAgMCAxIDItMmgzTTMgMTZoM2EyIDIgMCAwIDEgMiAydjMiLz48L3N2Zz4=',
        chatIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXR3aXRjaCI+PHBhdGggZD0iTTIxIDJIM3YxNmg1djRsNC00aDVsNC00VjJ6bS0xMCA5VjdtNSA0VjciLz48L3N2Zz4=',
        closeIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXgtY2lyY2xlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIvPjxsaW5lIHgxPSIxNSIgeTE9IjkiIHgyPSI5IiB5Mj0iMTUiLz48bGluZSB4MT0iOSIgeTE9IjkiIHgyPSIxNSIgeTI9IjE1Ii8+PC9zdmc+',
        fixedIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWNvbHVtbnMiPjxwYXRoIGQ9Ik0xMiAzaDdhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC03bTAtMThINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoN20wLTE4djE4Ii8+PC9zdmc+'
    },

    chatConfig:{
        parentOrigin: window.location.origin, // 当前页面origin
        userId: localStorage.getItem('chat-user-id') ||  new Date().getTime(),
        sessionId: localStorage.getItem('chat-user-id') ||  new Date().getTime(),
        avatar:'https://gw.alicdn.com/imgextra/i2/O1CN01fPEB9P1ylYWgaDuVR_!!6000000006619-0-tps-132-132.jpg',
        userAvatar: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAOVBMVEUAAABRUVFQUFBRUVFRUVFRUVFQUFBRUVFQUFBQUFBQUFBRUVFRUVFRUVFQUFBRUVFQUFBQUFBRUVFoxAENAAAAEnRSTlMAwBDw0IAgcEBgUOCgsDCQn48lJo3TAAACp0lEQVRYw7VXWZatIAyUeRBw2P9iXwvSQQqH99H5uecqKVKVGMJ0Z9yryOb9x2YWlefTf1na5N6Z3NJXb27mfWiz4V/clWhc2I81cEK9QrjqLpXV9aG2i6wQ7tFds9PbcCR2YjB97+/L9tGOX9tYgvB3/lvZ4UHtVCLcxm/XDG+eNTI5yHX0Kmby+rVEZGZ5s3/4kucwjGEh/1fLCEun/9DfGrWuytghwiUXWqC/3gQVoEYE0T5jh34gd2vuqsOhJGvqNwOCpmSgWhItKD/+GdD0iCooFY/dQDVz7FnrXdV4SL3iok81ClzVklirJoBr/cqOtsvf9pUEhWCgstzeczIoJPtdM0N4EThNDGnWoBKkkJc6wUrTwDOdgjtgIKbOKG8treUEuvYfdYoCtBYIVNafmwyRYa7r1h5Wg6rZLPJaslQKV+93ADsKqzI3jUmYwPBpyp8wg+f2HiDBI3YQnj8DWBBLZpTPABrTNQDgtLQxDbAA8JaF7wDyoZAQQEAhTqEUJ6IuE4goahqhHeiBBB65Miik2qIUlq2YsJBiLWVsqRowwzQqZT9QTMP5GSskfkx6pFjomqLDk486yVx+UIU9EVk8eaiTLGUzpEfMFPVkaGnUVLHuHDEgpbGpYgPijnUHSR4VmePY1msorEnBep7LvhUxm1g1HCxVMVvJlzmsL3x66tseyUkj1k/JkV9YxW5iptZNx7uL5O05jv/tazre6Siau4EGTdMcPtNBRRSLSfc4i0tayVrsCh3s9GI21EA1tICdEv1k/FyMHQvHz4ehWg0/wJV/COBuKA7fhm0tyR8QPo/75I867Mw+pIDtyB+vPGsav04rXHlAoC+XLv7KsWBsXv9u7Te69v3RxRODRSNi75YWCd7LWNqn639gMruy8HD9/wfsyUv+zkirqgAAAABJRU5ErkJggg==',
        defaultAgent:'sonaAgent',
        agent:{
            sonaAgent:{   
                agentId: 'sonaAgent',
                agentName:'诺言',
                systemMessage: ['专属智能助理诺言,为您服务!','Hi,我是你的专属智能助理诺言,有问题请随时找我哦~'], // 默认系统对话
                apiRunLink: '/chat-api/v1/agents/sonaAgent/runs',  // 智能体对话接口
                apiClearLink: '/chat-api/v1/agents/sonaAgent/sessions/6', // 清除对话历史接口
            }
        },
    },
    
    // 按钮配置
    buttonConfig: {
        direction: ['left','bottom'],// 方位
        position: ["20px","20px"], // 距离
        size: ['50px','50px'], // 按钮大小 (像素)
        background: "#2ecc71", // 按钮背景颜色
        borderRadius:'50%',
        hoverBackground:"#2ecc71",
        hoverEffect: true, // 是否启用悬停效果
    },
    
    // 窗口配置
    windowConfig: {
        width: 400, // 窗口宽度 (像素)
        height: 650, // 窗口高度 (像素)
        title: "智能助理", // 弹窗标题
        titleColor: "white", // 标题颜色
        titleBackground: "#3498db", // 标题栏背景颜色
    },

    // 居中弹窗配置
    centerPopupConfig: {
        width: "40%", // 居中弹窗宽度
        height: "50%", // 居中弹窗高度
        overlayColor: "rgba(0, 0, 0, 0.5)", // 遮罩层颜色
    },
    
    // 其他功能配置
    otherConfig: {
        autoOpen: false, // 页面加载后自动打开窗口
        outsideClickClose: false, // 点击弹窗外区域关闭窗口
    }
};

# 弹窗代码

chat-dialog.js

// chat-dialog.js
function initChat(initConfig) {
    // 加载配置 - 假设配置对象已存在于全局作用域
    const config = initConfig || {
        serviceUrl: "/chat",
        windowConfig:{},
        chatConfig:{},
        icon:{}
    };
    const UserId = localStorage.getItem('chat-user-id') ||  new Date().getTime()
    const chatConfig = {
        parentOrigin: window.location.origin, // 当前页面origin
        userId: UserId,
        sessionId: UserId,
        avatar:'https://gw.alicdn.com/imgextra/i2/O1CN01fPEB9P1ylYWgaDuVR_!!6000000006619-0-tps-132-132.jpg',
        userAvatar:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAOVBMVEUAAABRUVFQUFBRUVFRUVFRUVFQUFBRUVFQUFBQUFBQUFBRUVFRUVFRUVFQUFBRUVFQUFBQUFBRUVFoxAENAAAAEnRSTlMAwBDw0IAgcEBgUOCgsDCQn48lJo3TAAACp0lEQVRYw7VXWZatIAyUeRBw2P9iXwvSQQqH99H5uecqKVKVGMJ0Z9yryOb9x2YWlefTf1na5N6Z3NJXb27mfWiz4V/clWhc2I81cEK9QrjqLpXV9aG2i6wQ7tFds9PbcCR2YjB97+/L9tGOX9tYgvB3/lvZ4UHtVCLcxm/XDG+eNTI5yHX0Kmby+rVEZGZ5s3/4kucwjGEh/1fLCEun/9DfGrWuytghwiUXWqC/3gQVoEYE0T5jh34gd2vuqsOhJGvqNwOCpmSgWhItKD/+GdD0iCooFY/dQDVz7FnrXdV4SL3iok81ClzVklirJoBr/cqOtsvf9pUEhWCgstzeczIoJPtdM0N4EThNDGnWoBKkkJc6wUrTwDOdgjtgIKbOKG8treUEuvYfdYoCtBYIVNafmwyRYa7r1h5Wg6rZLPJaslQKV+93ADsKqzI3jUmYwPBpyp8wg+f2HiDBI3YQnj8DWBBLZpTPABrTNQDgtLQxDbAA8JaF7wDyoZAQQEAhTqEUJ6IuE4goahqhHeiBBB65Miik2qIUlq2YsJBiLWVsqRowwzQqZT9QTMP5GSskfkx6pFjomqLDk486yVx+UIU9EVk8eaiTLGUzpEfMFPVkaGnUVLHuHDEgpbGpYgPijnUHSR4VmePY1msorEnBep7LvhUxm1g1HCxVMVvJlzmsL3x66tseyUkj1k/JkV9YxW5iptZNx7uL5O05jv/tazre6Siau4EGTdMcPtNBRRSLSfc4i0tayVrsCh3s9GI21EA1tICdEv1k/FyMHQvHz4ehWg0/wJV/COBuKA7fhm0tyR8QPo/75I867Mw+pIDtyB+vPGsav04rXHlAoC+XLv7KsWBsXv9u7Te69v3RxRODRSNi75YWCd7LWNqn639gMruy8HD9/wfsyUv+zkirqgAAAABJRU5ErkJggg==',
        defaultAgent:'sonaAgent',
        agent:{
            sonaAgent:{   
                agentId: 'sonaAgent',
                agentName:'诺言',
                systemMessage: ['专属智能助理诺言,为您服务!','Hi,我是你的专属智能助理诺言,有问题请随时找我哦~'],
                apiRunLink: 'http://192.168.1.119:86/chat-api/v1/agents/sonaAgent/runs',
                apiClearLink: 'http://192.168.1.119:86/chat-api/v1/agents/sonaAgent/sessions/6',
            },
        },
        ...config.chatConfig
    }
    if(window.ChatAgentId){
        config.chatConfig.defaultAgent = window.ChatAgentId
        chatConfig.defaultAgent = window.ChatAgentId
    }

    const configIcon = {
        fullIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLW1heGltaXplIj48cGF0aCBkPSJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzbTE4IDBWNWEyIDIgMCAwIDAtMi0yaC0zbTAgMThoM2EyIDIgMCAwIDAgMi0ydi0zTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLz48L3N2Zz4=',
        miniIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLW1pbmltaXplIj48cGF0aCBkPSJNOCAzdjNhMiAyIDAgMCAxLTIgMkgzbTE4IDBoLTNhMiAyIDAgMCAxLTItMlYzbTAgMTh2LTNhMiAyIDAgMCAxIDItMmgzTTMgMTZoM2EyIDIgMCAwIDEgMiAydjMiLz48L3N2Zz4=',
        chatIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXR3aXRjaCI+PHBhdGggZD0iTTIxIDJIM3YxNmg1djRsNC00aDVsNC00VjJ6bS0xMCA5VjdtNSA0VjciLz48L3N2Zz4=',
        closeIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXgtY2lyY2xlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIvPjxsaW5lIHgxPSIxNSIgeTE9IjkiIHgyPSI5IiB5Mj0iMTUiLz48bGluZSB4MT0iOSIgeTE9IjkiIHgyPSIxNSIgeTI9IjE1Ii8+PC9zdmc+',
        fixedIcon:'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWNvbHVtbnMiPjxwYXRoIGQ9Ik0xMiAzaDdhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC03bTAtMThINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoN20wLTE4djE4Ii8+PC9zdmc+',
        ...config.icon
    }

    // 合并配置
    const centerPopupConfig = {
        width:config.centerPopupConfig?.width || "40%", // 居中弹窗宽度
        height:config.centerPopupConfig?.height || "50%", // 居中弹窗高度
        overlayColor:config.centerPopupConfig?.overlayColor || "rgba(0, 0, 0, 0.5)", // 遮罩层颜色
    };
    
    // 合并默认配置和自定义配置(简化版)
    const buttonConfig = {
        direction: ['right','bottom'],
        position: ["20px","20px"], // 底部和右侧距离
        size: 50,
        background:  "#2ecc71",
        hoverBackground:"#2ecc71",
        iconColor:  "white",
        iconSize: 30,
        borderRadius:'50%',
        hoverEffect: true,
        shadow: "0 4px 20px rgba(46, 204, 113, 0.4)",
        ...config.buttonConfig
    };
    
    const windowConfig = {
        width: config.windowConfig?.width || 400,
        height: config.windowConfig?.height || 650,
        title: config.windowConfig?.title || "智能助理",
        titleColor: config.windowConfig?.titleColor || "white",
        titleBackground: config.windowConfig?.titleBackground || "#3498db",
        borderRadius:"7px",
        shadow: "0 8px 30px rgba(0, 0, 0, 0.2)",
        closeButtonColor: "white",
        ...config.windowConfig
    };
    
    const animationConfig = {
        duration: config.animationConfig?.duration || 300,
        easing: config.animationConfig?.easing || "ease",
        buttonTransform: config.animationConfig?.buttonTransform !== false,
    };
    
    const otherConfig = {
        saveConfig: config.otherConfig?.saveConfig || false,
        autoOpen: config.otherConfig?.autoOpen || false,
        outsideClickClose: config.otherConfig?.outsideClickClose !== false,
    };
    
    // 创建样式元素
    const style = document.createElement('style');
    style.textContent = `
        .chat-dialog-container {
            position: fixed;
            ${buttonConfig.direction[0]}: ${buttonConfig.position[0]};
            ${buttonConfig.direction[1]}: ${buttonConfig.position[1]};
            z-index: 9999;
        }

        .chat-dialog-container * {
            padding:0;
            margin:0;
            box-sizing: border-box;
            font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
        }
        
        .chat-dialog-container.fixed-window {
            width: ${windowConfig.width}px;
            height: 100% !important;
            ${buttonConfig.direction[0]}:0;
            ${buttonConfig.direction[1]}: 0;
        }
        
        .chat-dialog-container.fixed-window .chat-dialog-window.active {
            height:100% !important;
        }

        .chat-dialog-container .df {
            display: flex;
        }

        .chat-dialog-container .df-ac {
            align: center;
        }

        .chat-dialog-container .df-jcsb {
            justify-content: space-between;
        }

        .chat-dialog-header-btn {
            height:28px;
            overflow:hidden;
        }

        .chat-dialog-container .chat-dialog-btn {
            background: none;
            border: none;
            color: white;
            cursor: pointer;
            margin-right: 10px;
            font-size: 24px;
            height:28px;
            line-height: 28px;
            width: 28px;
            padding: 2px;
            box-sizing: border-box;
        }
        
        .chat-dialog-container .chat-dialog-button {
            width: ${buttonConfig.size[0]};
            height: ${buttonConfig.size[1]};
            border-radius: ${buttonConfig.borderRadius};
            background: ${buttonConfig.background};
            box-shadow: ${buttonConfig.shadow};
            overflow: hidden;
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center;
            transition: all ${animationConfig.duration}ms ${animationConfig.easing};
            position: absolute;
            ${buttonConfig.direction[0]}: 0;
            bottom: 0;
            z-index: 10;
        }
        .chat-dialog-container.fixed-window .chat-dialog-button {
            ${buttonConfig.direction[0]}: ${buttonConfig.position[0]};
            ${buttonConfig.direction[1]}: ${buttonConfig.position[1]};
        }
        
        .chat-dialog-container .chat-dialog-button:hover {
            background: ${buttonConfig.hoverBackground};
            transform: ${buttonConfig.hoverEffect ? 'scale(1.05)' : 'none'};
            box-shadow: ${buttonConfig.hoverEffect ? buttonConfig.shadow.replace(')', ', 0.5)').replace('rgba', 'rgba').replace('0.4', '0.5') : buttonConfig.shadow};
        }
        
        .chat-dialog-container .chat-dialog-button .chat-icon {
            font-size: ${buttonConfig.iconSize}px;
            color: ${buttonConfig.iconColor};
            display: block;
            width: 85%;
            height: 85%;
        }
        
        .chat-dialog-container .chat-dialog-button .close-icon {
            display: none;
            font-size: ${buttonConfig.iconSize * 0.8}px;
            color: ${buttonConfig.iconColor};
            font-weight: bold;
        }
        
        .chat-dialog-container .chat-dialog-window {
            width: 0;
            height: 0;
            opacity: 0;
            overflow: hidden;
            border-radius: ${windowConfig.borderRadius};
            box-shadow: ${windowConfig.shadow};
            position: relative;
            // transition: all ${animationConfig.duration}ms ${animationConfig.easing};
            transform: translateY(20px) scale(0.9);
            background: white;
        }
        
        .chat-dialog-container .chat-dialog-window.active {
            width: ${windowConfig.width}px;
            height: ${windowConfig.height}px;
            opacity: 1;
            transform: translateY(0) scale(1);
        }
        
        .chat-dialog-container .chat-dialog-header {
            background: ${windowConfig.titleBackground};
            color: ${windowConfig.titleColor};
            padding: 10px;
            display: flex;
            justify-content: space-between;
            align-items: center;
            border-radius: ${windowConfig.borderRadius} ${windowConfig.borderRadius} 0 0;
        }
        
        .chat-dialog-container .chat-dialog-header h3 {
            font-weight: 500;
            font-size: 1.2rem;
        }
        
        .chat-dialog-container .chat-dialog-header .chat-dialog-btn:hover {
            background: rgba(255, 255, 255, 0.2);
        }
        
        .chat-dialog-container .chat-iframe-container {
            width: 100%;
            height: calc(100% - 50px);
        }
        
        .chat-dialog-container .chat-iframe {
            width: 100%;
            height: 100%;
            border: none;
            border-radius: 0 0 ${windowConfig.borderRadius} ${windowConfig.borderRadius};
        }

        /* 全屏样式 */
        .chat-dialog-fullscreen { position: fixed !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; z-index: 10000 !important; border-radius: 0 !important; }
        
        /* 居中弹窗样式 */
        .center-popup-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: ${centerPopupConfig.overlayColor || 'rgba(0, 0, 0, 0.5)'}; z-index: 10000; display: none; }
        .center-popup-container { 
            position: fixed; 
            ${buttonConfig.direction[1] == 'left' ? 'right' : 'left' }: 50%; 
            top: 50%; 
            transform: translate(-50%, -50%); 
            width: ${centerPopupConfig.width || '80%'}; 
            height: ${centerPopupConfig.height || '80%'}; 
            background: white; 
            border-radius: 10px; 
            z-index: 10001; 
            display: none; 
            box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); 
        }
        .center-popup-container.full-window {
            left: ${buttonConfig.direction[0] == 'left' ? windowConfig.width : 0 }px;
            top: 0px;
            width: calc(100% - ${windowConfig.width}px) !important;
            height: 100vh !important;
            margin: 0;
            transform: translate(0px, 0px);
        }
        .center-popup-header {
            display: flex;
            align-items: center;
            justify-content: flex-end;
            height:35px;
            gap:10px;
            padding-right:10px;
            background-color:${windowConfig.titleBackground};
            color:${windowConfig.titleColor};
        }
        .center-popup-header-full {
            font-size: 20px;
            border: none;
            color: #333;
            cursor: pointer;
            width: 24px;
            height: 24px;
            padding: 0px;
            background-color:transparent;
        }
        .center-popup-header-close {
            font-size: 20px;
            border: none;
            color: #333;
            cursor: pointer;
            width: 24px;
            height: 24px;
            padding: 0px;
            background-color:transparent;
        }
        .center-popup-iframe { width: 100%; height: calc(100% - 35px); border: none; border-radius: 10px; }
    `;
    document.head.appendChild(style);
    
    // 创建组件HTML结构
    const container = document.createElement('div');
    container.className = 'chat-dialog-container';
    
    const button = document.createElement('div');
    button.className = 'chat-dialog-button';
    button.id = 'chatWidgetButton';
    
    const chatIcon = document.createElement('img');
    chatIcon.className = 'chat-icon';
    chatIcon.src = configIcon.chatIcon;
    button.appendChild(chatIcon);
    
    const windowEl = document.createElement('div');
    windowEl.className = 'chat-dialog-window';
    windowEl.id = 'chatWidgetWindow';
    
    const header = document.createElement('div');
    header.className = 'chat-dialog-header';
    
    const title = document.createElement('h3');
    title.textContent = windowConfig.title;
    header.appendChild(title);
    
    const controls = document.createElement('div');
    controls.className = 'df df-ac df-jcsb chat-dialog-header-btn'

    // 添加吸附按钮
    const fixedScreenBtn = document.createElement('img');
    fixedScreenBtn.className = 'chat-dialog-btn'
    fixedScreenBtn.src = configIcon.fixedIcon
    controls.appendChild(fixedScreenBtn);

    // 添加全屏按钮
    const fullscreenBtn = document.createElement('img');
    fullscreenBtn.className = 'fullscreen-btn chat-dialog-btn';
    fullscreenBtn.src = configIcon.fullIcon;
    controls.appendChild(fullscreenBtn);
    
    // 添加关闭聊天框按钮
    const closeChatBtn = document.createElement('img');
    closeChatBtn.className = 'chat-dialog-btn';
    closeChatBtn.src = configIcon.closeIcon;
    controls.appendChild(closeChatBtn);
    header.appendChild(controls);
    
    // 设置聊天内容区
    const iframeContainer = document.createElement('div');
    iframeContainer.className = 'chat-iframe-container';
    
    const iframe = document.createElement('iframe');
    iframe.className = 'chat-iframe';
    iframe.id = 'chatWidgetIframe';
    iframe.title = windowConfig.title;

    iframeContainer.appendChild(iframe);
    windowEl.appendChild(header);
    windowEl.appendChild(iframeContainer);
    
    container.appendChild(button);
    container.appendChild(windowEl);
    document.body.appendChild(container);
    
    // 创建居中弹窗组件
    const overlay = document.createElement('div');
    overlay.className = 'center-popup-overlay';
    
    const popupContainer = document.createElement('div');
    popupContainer.className = 'center-popup-container';

    const popupHeader = document.createElement('div')
    popupHeader.className = 'center-popup-header'
    
    // 添加吸附按钮
    // const popupHeaerFull = document.createElement('img')
    // popupHeaerFull.className = 'center-popup-header-full'
    // popupHeaerFull.src = configIcon.fullIcon;
    // popupHeader.appendChild(popupHeaerFull)
    
    // 添加关闭中间弹窗按钮 
    const popupCloseBtn = document.createElement('img');
    popupCloseBtn.className = 'center-popup-header-close';
    popupCloseBtn.src = configIcon.closeIcon;
    
    const popupIframe = document.createElement('iframe');
    popupIframe.className = 'center-popup-iframe';
    
    popupHeader.appendChild(popupCloseBtn)
    popupContainer.appendChild(popupHeader);
    popupContainer.appendChild(popupIframe);
    document.body.appendChild(overlay);
    document.body.appendChild(popupContainer);

    // 组件状态
    let isOpen = false;
    let isFullscreen = false;
    let dialogFlag = false
    let popupFixed = false

    // 显示居中弹窗
    function openDialog(url) {
        popupIframe.src = url;
        if(dialogFlag){
            popupIframe.reload(true)
        }
        // overlay.style.display = 'block';
        popupContainer.style.display = 'block';
        dialogFlag = true
    };
    
    // 关闭居中弹窗
    function closeDialog() {
        dialogFlag = false
        overlay.style.display = 'none';
        popupContainer.style.display = 'none';
        popupFull = false
        popupIframe.src = '';
    }
    
    overlay.addEventListener('click', closeDialog);
    popupCloseBtn.addEventListener('click', closeDialog);

    function fixedScreenFn(opt={}){
        const {beforeFixed} = opt
        let currentFixed = popupFixed
        if(beforeFixed){
            currentFixed = !beforeFixed
        }
        if (!currentFixed) {
            // 进入
            popupContainer.classList.add('full-window');
            container.classList.add('fixed-window');
            // popupIframe.reload(true)
            popupFixed = true;
        } else {
            // 退出
            popupContainer.classList.remove('full-window');
            container.classList.remove('fixed-window');
            popupFixed = false;
        }
    }
    // 吸附模式
    fixedScreenBtn.addEventListener('click',()=> fixedScreenFn());

    // 全屏功能
    controls.querySelector('.fullscreen-btn').addEventListener('click', function() {
        if (!isFullscreen) {
            // 进入全屏
            windowEl.classList.add('chat-dialog-fullscreen');
            fullscreenBtn.src = configIcon.miniIcon;
            isFullscreen = true;
        } else {
            // 退出全屏
            windowEl.classList.remove('chat-dialog-fullscreen');
            fullscreenBtn.src = configIcon.fullIcon;
            isFullscreen = false;
        }
    });
    

    let userId = localStorage.getItem('chat-user-id') ||  new Date().getTime()
    // 传递配置参数
    function getUserSessionInfo(data = {}){
        const parentOrigin = window.location.origin
        const defaultConfig = {
            parentOrigin:data.parentOrigin || parentOrigin,
            userId:data.userId || userId,
            sessionId:data.userId || userId,
            ...data
        }
        return defaultConfig
    }
    
    // 打开聊天窗口
    function openChatWindow() {
        console.log('config.serviceUrl',config.serviceUrl);
        // 第一次打开时加载iframe
        // if (!iframe.src) {
            iframe.src = config.serviceUrl;
        // }
        iframe.onload = () => {
            // 向 iframe 发送消息
            const data = getUserSessionInfo(chatConfig)
            localStorage.setItem('chat-user-id',data.userId)
            const url = config.serviceUrl.indexOf('http') == 0 ?config.serviceUrl : window.location.origin+config.serviceUrl
            iframe.contentWindow.postMessage(
                {
                type: "INIT_CONFIG", // 消息类型(自定义)
                data,   // 传递的数据
                },
                url // 目标 iframe 的 origin(必须匹配!)
            );
        };
        if(popupFixed){
            fixedScreenFn({beforeFixed:popupFixed})
        }
        windowEl.classList.add('active');
        isOpen = true;
        
        if (animationConfig.buttonTransform) {
            button.style.transform = 'scale(0)';
            
            setTimeout(() => {
                chatIcon.style.display = 'none';
                // container.style.display = 'none';
                button.style.display = 'none'
                button.style.transform = 'scale(1)';
                button.style.background = '#e74c3c';
            }, animationConfig.duration / 2);
        } else {
            chatIcon.style.display = 'none';
            button.style.background = '#e74c3c';
            button.style.display = 'none'
            // container.style.display = 'block';
        }
    }
    
    // 关闭聊天窗口
    function closeChatWindow() {
        windowEl.classList.remove('active');
        isOpen = false;

        container.classList.remove('fixed-window');
        if (animationConfig.buttonTransform) {
            button.style.transform = 'scale(0)';
            
            setTimeout(() => {
                chatIcon.style.display = 'block';
                button.style.transform = 'scale(1)';
                button.style.display = 'flex'
                button.style.background = buttonConfig.background;
            }, animationConfig.duration / 2);
        } else {
            chatIcon.style.display = 'block';
            button.style.display = 'flex'
            button.style.background = buttonConfig.background;
        }
    }
    
    // 切换聊天窗口状态
    function toggleChatWindow() {
        if (isOpen) {
            closeChatWindow();
        } else {
            openChatWindow();
        }
    }
    
    // 绑定事件
    button.addEventListener('click', toggleChatWindow);
    closeChatBtn.addEventListener('click', toggleChatWindow);
    
    // 外部点击关闭
    if (otherConfig.outsideClickClose) {
        document.addEventListener('click', (e) => {
            const isInside = container.contains(e.target);
            if (!isInside && isOpen) {
                closeChatWindow();
            }
        });
    }
    
    // 自动打开窗口
    if (otherConfig.autoOpen) {
        setTimeout(openChatWindow, 1000);
    }

    const handleMessage = (event) => {
        // 根据消息类型执行不同操作
        switch (event.data.type) {
          case 'openDialog':
            openDialog(event.data.data);
            break;
          case 'changeAgent':
            chatConfig.defaultAgent = event.data.data
            window.ChatAgentId = event.data.data
            break;
        }
    };
    window.addEventListener('message', handleMessage);
    
    // 使组件功能可以外部调用(可选)
    window.Chat = {
        open: openChatWindow,
        close: closeChatWindow,
        toggle: toggleChatWindow,
        openDialog,
        closeDialog,
        initUserSessionInfo:getUserSessionInfo
    };
};

# 预览

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>在线客服组件演示</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
      }

      body {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        color: #333;
        min-height: 100vh;
        padding: 20px;
      }

      .container {
        max-width: 1600px;
        margin: 40px auto;
        padding: 30px;
        background: rgba(255, 255, 255, 0.9);
        border-radius: 15px;
        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
      }

      h1 {
        text-align: center;
        margin-bottom: 20px;
        color: #2c3e50;
        font-size: 2.5rem;
      }

      .content {
        display: flex;
        align-items: flex-start;
        justify-content: space-between;
        gap: 30px;
        width: 100%;
      }

      .config-area,
      .info-area {
        padding: 25px;
        background: white;
        border-radius: 10px;
        box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
      }

      .config-area h2,
      .info-area h2 {
        color: #3498db;
        margin-bottom: 20px;
        padding-bottom: 10px;
        border-bottom: 2px solid #ecf0f1;
      }

      .feature-list {
        margin-left: 20px;
      }

      .feature-list li {
        margin-bottom: 10px;
        line-height: 1.6;
      }

      .feature-list li:before {
        content: "✓";
        color: #2ecc71;
        font-weight: bold;
        margin-right: 8px;
      }

      .code-block {
        background: #2c3e50;
        color: #ecf0f1;
        padding: 20px;
        border-radius: 8px;
        font-family: monospace;
        overflow-x: auto;
        margin: 20px 0;
        line-height: 1.5;
        font-size: 15px;
        width: 100%;
      }

      .code-block .comment {
        color: #7f8c8d;
      }

      .code-block .keyword {
        color: #3498db;
      }

      .code-block .string {
        color: #2ecc71;
      }

      .code-block .number {
        color: #f1c40f;
      }

      pre {
        width: 100%;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <h1>在线客服弹窗组件演示</h1>

      <div class="content">
        <div class="config-area" style="width: calc(100% - 400px);">
          <h2>配置说明</h2>

          <p>创建配置文件 <code>chatConfig.js</code></p>

          <div class="code-block">
            <pre>
              {
                // 在线客服链接
                serviceUrl: "/chat",
            
                icon:{
                    fullIcon:'全屏显示图标',
                    miniIcon:'取消全屏显示图标',
                    chatIcon:'聊天图标',
                    closeIcon:'关闭图标',
                    fixedIcon:'吸顶图标'
                },
            
                chatConfig:{
                    parentOrigin: window.location.origin, // 当前页面origin
                    userId: localStorage.getItem('chat-user-id') ||  new Date().getTime(),
                    sessionId: localStorage.getItem('chat-user-id') ||  new Date().getTime(),
                    avatar:'系统图标',
                    userAvatar: '用户头像图标',
                    defaultAgent:'sonaAgent', // 默认对话智能体
                    agent:{
                      sonaAgent:{   
                          agentId: 'sonaAgent',
                          agentName:'诺言',
                          systemMessage: ['专属智能助理诺言,为您服务!','Hi,我是你的专属智能助理诺言,有问题请随时找我哦~'], // 默认系统对话
                          apiRunLink: '/chat-api/v1/agents/sonaAgent/runs',  // 智能体对话接口
                          apiClearLink: '/chat-api/v1/agents/sonaAgent/sessions/6', // 清除对话历史接口
                      }
                    }
                },
                
                // 按钮配置
                buttonConfig: {
                    direction: ['left','bottom'],// 方位 
                    position: ["20px","20px"], // 距离
                    size: 50, // 按钮大小 (像素)
                    borderRadius:'50%',
                    hoverEffect: true, // 是否启用悬停效果
                    background:'#2ecc71', // 聊天按钮背景颜色
                    shadow:'0 4px 20px rgba(46, 204, 113, 0.4)', // 聊天背景阴影
                },
                
                // 窗口配置
                windowConfig: {
                    width: 400, // 窗口宽度 (像素)
                    height: 650, // 窗口高度 (像素)
                    title: "智能助理", // 弹窗标题
                    titleColor: "white", // 标题颜色
                    titleBackground: "#3498db", // 标题栏背景颜色
                },
            
                // 居中弹窗配置
                centerPopupConfig: {
                    width: "40%", // 居中弹窗宽度
                    height: "50%", // 居中弹窗高度
                    overlayColor: "rgba(0, 0, 0, 0.5)", // 遮罩层颜色
                },
                
                // 其他功能配置
                otherConfig: {
                    autoOpen: false, // 页面加载后自动打开窗口
                    outsideClickClose: false, // 点击弹窗外区域关闭窗口
                }
            }
            </pre>
          </div>

          <p>在HTML中引入:</p>

          <div class="code-block">
            &lt;script src=<span class="string">"chatConfig.js"</span
            >&gt;&lt;/script&gt;<br />
            &lt;script src=<span class="string">"chat.js"</span
            >&gt;&lt;/script&gt;<br />
          </div>
        </div>

        <div class="info-area" style="width:400px">
          <h2>功能特点</h2>
          <ul class="feature-list">
            <li>高度可配置:按钮位置、颜色、大小、图标等</li>
            <li>弹窗大小和外观可完全自定义</li>
            <li>平滑的打开/关闭动画效果</li>
            <li>响应式设计,适配移动设备</li>
            <li>点击窗口外区域自动关闭</li>
            <li>无依赖、轻量级的原生JavaScript实现</li>
            <li>支持自动打开功能</li>
          </ul>

          <h2>API方法</h2>
          <ul class="feature-list">
            <li><code>Chat.open()</code> - 打开客服窗口</li>
            <li><code>Chat.close()</code> - 关闭客服窗口</li>
            <li><code>Chat.toggle()</code> - 切换客服窗口状态</li>
            <li><code>Chat.openDialog(url)</code> - 打开居中弹窗</li>
            <li><code>Chat.closeDialog()</code> - 关闭居中弹窗</li>
            <li><code>Chat.initUserSessionInfo(config)</code> - 设置聊天初始化配置</li>
          </ul>

          <div class="code-block">
            <span class="comment">// 在配置文件中设置自动打开</span><br />
            otherConfig: {<br />
            &nbsp;&nbsp;autoOpen: <span class="keyword">true</span><br />
            }<br /><br />

            <span class="comment">// 或者在需要时手动打开</span><br />
            &lt;button onclick=<span class="string">"Chat.open()"</span
            >&gt;打开客服&lt;/button&gt;
          </div>
        </div>
      </div>
    </div>

    <!-- 引入配置文件 -->
    <script src="./js/chatConfig.js"></script>
    <!-- <script src="./js/chat.min.js"></script> -->
    <script src="./js/chat.js"></script>
    <script>
      window.onload = function() {
        // initChat(chatConfig);
        initChat({
          // 在线客服链接
          serviceUrl: "/chat",

          icon: {
            fullIcon: 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLW1heGltaXplIj48cGF0aCBkPSJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzbTE4IDBWNWEyIDIgMCAwIDAtMi0yaC0zbTAgMThoM2EyIDIgMCAwIDAgMi0ydi0zTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLz48L3N2Zz4=',
            miniIcon: 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLW1pbmltaXplIj48cGF0aCBkPSJNOCAzdjNhMiAyIDAgMCAxLTIgMkgzbTE4IDBoLTNhMiAyIDAgMCAxLTItMlYzbTAgMTh2LTNhMiAyIDAgMCAxIDItMmgzTTMgMTZoM2EyIDIgMCAwIDEgMiAydjMiLz48L3N2Zz4=',
            chatIcon: 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXR3aXRjaCI+PHBhdGggZD0iTTIxIDJIM3YxNmg1djRsNC00aDVsNC00VjJ6bS0xMCA5VjdtNSA0VjciLz48L3N2Zz4=',
            // chatIcon: 'https://wimg.588ku.com/gif320/25/05/08/c12c6d3a092505c70a0c564a6f5c3315.gif',
            closeIcon: 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXgtY2lyY2xlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIvPjxsaW5lIHgxPSIxNSIgeTE9IjkiIHgyPSI5IiB5Mj0iMTUiLz48bGluZSB4MT0iOSIgeTE9IjkiIHgyPSIxNSIgeTI9IjE1Ii8+PC9zdmc+',
            fixedIcon: 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWNvbHVtbnMiPjxwYXRoIGQ9Ik0xMiAzaDdhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC03bTAtMThINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoN20wLTE4djE4Ii8+PC9zdmc+'
          },

          chatConfig: {
            parentOrigin: window.location.origin, // 当前页面origin
            userId: localStorage.getItem('chat-user-id') || new Date().getTime(),
            sessionId: localStorage.getItem('chat-user-id') || new Date().getTime(),
            avatar: 'https://gw.alicdn.com/imgextra/i2/O1CN01fPEB9P1ylYWgaDuVR_!!6000000006619-0-tps-132-132.jpg',
            userAvatar: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAOVBMVEUAAABRUVFQUFBRUVFRUVFRUVFQUFBRUVFQUFBQUFBQUFBRUVFRUVFRUVFQUFBRUVFQUFBQUFBRUVFoxAENAAAAEnRSTlMAwBDw0IAgcEBgUOCgsDCQn48lJo3TAAACp0lEQVRYw7VXWZatIAyUeRBw2P9iXwvSQQqH99H5uecqKVKVGMJ0Z9yryOb9x2YWlefTf1na5N6Z3NJXb27mfWiz4V/clWhc2I81cEK9QrjqLpXV9aG2i6wQ7tFds9PbcCR2YjB97+/L9tGOX9tYgvB3/lvZ4UHtVCLcxm/XDG+eNTI5yHX0Kmby+rVEZGZ5s3/4kucwjGEh/1fLCEun/9DfGrWuytghwiUXWqC/3gQVoEYE0T5jh34gd2vuqsOhJGvqNwOCpmSgWhItKD/+GdD0iCooFY/dQDVz7FnrXdV4SL3iok81ClzVklirJoBr/cqOtsvf9pUEhWCgstzeczIoJPtdM0N4EThNDGnWoBKkkJc6wUrTwDOdgjtgIKbOKG8treUEuvYfdYoCtBYIVNafmwyRYa7r1h5Wg6rZLPJaslQKV+93ADsKqzI3jUmYwPBpyp8wg+f2HiDBI3YQnj8DWBBLZpTPABrTNQDgtLQxDbAA8JaF7wDyoZAQQEAhTqEUJ6IuE4goahqhHeiBBB65Miik2qIUlq2YsJBiLWVsqRowwzQqZT9QTMP5GSskfkx6pFjomqLDk486yVx+UIU9EVk8eaiTLGUzpEfMFPVkaGnUVLHuHDEgpbGpYgPijnUHSR4VmePY1msorEnBep7LvhUxm1g1HCxVMVvJlzmsL3x66tseyUkj1k/JkV9YxW5iptZNx7uL5O05jv/tazre6Siau4EGTdMcPtNBRRSLSfc4i0tayVrsCh3s9GI21EA1tICdEv1k/FyMHQvHz4ehWg0/wJV/COBuKA7fhm0tyR8QPo/75I867Mw+pIDtyB+vPGsav04rXHlAoC+XLv7KsWBsXv9u7Te69v3RxRODRSNi75YWCd7LWNqn639gMruy8HD9/wfsyUv+zkirqgAAAABJRU5ErkJggg==',
            defaultAgent: 'sonaAgent',
            agent: {
              sonaAgent: {
                agentId: 'sonaAgent',
                agentName: '诺言智能体',
                systemMessage: ['专属智能助理诺言,为您服务!', 'Hi,我是你的专属智能助理诺言,有问题请随时找我哦~'], // 默认系统对话
                apiRunLink: '/chat-api/v1/agents/sonaAgent/runs',  // 智能体对话接口
                apiClearLink: '/chat-api/v1/agents/sonaAgent/sessions/'+localStorage.getItem('chat-user-id') || new Date().getTime(), // 清除对话历史接口
              },
              commAgent: {
                agentId: 'commAgent',
                agentName: '通用智能体',
                systemMessage: ['通用智能体,为您服务!', 'Hi,我是通用智能体,有问题请随时找我哦~'],
                apiRunLink: '/chat-api/v1/agents/commAgent/runs',
                apiClearLink: '/chat-api/v1/agents/commAgent/sessions/'+localStorage.getItem('chat-user-id') || new Date().getTime(),
              },
      
            },
          },

          // 按钮配置
          buttonConfig: {
            direction: ['right', 'bottom'],// 方位
            position: ["49%", "20px"], // 距离
            size: ['500px','500px'], // 按钮大小 (像素)
            background: "transparent", // 按钮背景颜色
            hoverBackground:"transparent", // 按钮滑动背景颜色
            shadow:'none',
            borderRadius: '50%',
            hoverEffect: true, // 是否启用悬停效果
          },

          // 窗口配置
          windowConfig: {
            width: 400, // 窗口宽度 (像素)
            height: 650, // 窗口高度 (像素)
            title: "智能助理", // 弹窗标题
            titleColor: "white", // 标题颜色
            titleBackground: "#3498db", // 标题栏背景颜色
          },

          // 居中弹窗配置
          centerPopupConfig: {
            width: "40%", // 居中弹窗宽度
            height: "50%", // 居中弹窗高度
            overlayColor: "rgba(0, 0, 0, 0.5)", // 遮罩层颜色
          },

          // 其他功能配置
          otherConfig: {
            autoOpen: false, // 页面加载后自动打开窗口
            outsideClickClose: false, // 点击弹窗外区域关闭窗口
          }
        });
      };
    </script>
  </body>
</html>