SillyTavern自动连接LLM API和AllTalkTTS API

自动连接LLM API和AllTalkTTS API

目前為 2025-03-21 提交的版本,檢視 最新版本

// ==UserScript==
// @name         SillyTavern自动连接LLM API和AllTalkTTS API
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  自动连接LLM API和AllTalkTTS API
// @match        http://127.0.0.1:8000/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 配置中心
    const CONFIG = {
        buttons: [
            {
                selector: '#api_button_textgenerationwebui',
                name: 'API连接',
                status: {
                    element: '.online_status_indicator',
                    successCondition: el => el.classList.contains('success')
                }
            },
            {
                selector: '#tts_refresh',
                name: 'TTS刷新',
                status: {
                    element: '.at-settings-option.status-option #status_info',
                    successCondition: el => el.innerText.trim() === 'Ready'
                }
            }
        ],
        timing: {
            interval: 3000,     // 检测间隔(ms)
            retryLimit: 15     // 最大尝试次数
        }
    };

    // 创建增强状态面板
    const statusPanel = createStatusPanel();
    let isRunning = true;

    // 状态面板模板
    function createStatusPanel() {
        const panel = document.createElement('div');
        panel.style = `
            position: fixed;
            top: 20px;
            right: 20px;
            background: rgba(0,0,0,0.85);
            color: white;
            padding: 15px;
            border-radius: 8px;
            z-index: 99999;
            font-family: Arial;
            min-width: 220px;
            backdrop-filter: blur(5px);
        `;
        panel.innerHTML = `
            <h3 style="margin:0 0 12px;color:#4CAF50;font-size:16px;">连接状态监控</h3>
            <div id="statusContent" style="line-height:1.6;font-size:14px;"></div>
        `;
        document.body.appendChild(panel);
        return panel;
    }

    // 状态检测器
    function checkConnectionStatus(buttonConfig) {
        const statusElement = document.querySelector(buttonConfig.status.element);
        if (!statusElement) return false;
        return buttonConfig.status.successCondition(statusElement);
    }

    // 增强点击方法
    async function performEnhancedClick(selector) {
        const btn = document.querySelector(selector);
        if (!btn) return false;

        ['mousedown', 'mouseup', 'click'].forEach(eventType => {
            btn.dispatchEvent(new MouseEvent(eventType, {
                bubbles: true,
                view: window
            }));
        });

        await new Promise(resolve => setTimeout(resolve, 1000));
        return true;
    }

    // 更新状态显示
    function updateStatusDisplay(attempts) {
        const statusContent = statusPanel.querySelector('#statusContent');
        let html = CONFIG.buttons.map(btn => {
            const isConnected = checkConnectionStatus(btn);
            return `
                <div style="margin-bottom:8px;">
                    <span style="color:${isConnected ? '#4CAF50' : '#ff4444'}">${isConnected ? '✓' : '✗'}</span>
                    ${btn.name}:
                    <span style="color:${isConnected ? '#4CAF50' : '#ff4444'}">
                        ${isConnected ? '已连接' : '未连接'}
                    </span>
                </div>
            `;
        }).join('');

        html += `
            <div style="border-top:1px solid #333;padding-top:8px;margin-top:8px;">
                尝试次数:${attempts}/${CONFIG.timing.retryLimit}<br>
                下次检测:${new Date(Date.now() + CONFIG.timing.interval).toLocaleTimeString()}
            </div>
        `;
        statusContent.innerHTML = html;
    }

    // 主控制器
    async function controlLoop() {
        let attempts = 0;
        const timer = setInterval(async () => {
            if (!isRunning) return;

            attempts++;
            let allConnected = true;

            for (const btn of CONFIG.buttons) {
                const clicked = await performEnhancedClick(btn.selector);
                if (!checkConnectionStatus(btn)) allConnected = false;
                if (!clicked) console.warn(`找不到按钮:${btn.name}`);
            }

            updateStatusDisplay(attempts);

            if (allConnected || attempts >= CONFIG.timing.retryLimit) {
                clearInterval(timer);
                isRunning = false;
                statusPanel.innerHTML += `
                    <div style="color:#${allConnected ? '4CAF50' : 'ff4444'};margin-top:10px;">
                        ${allConnected ? '所有连接已成功!' : '达到最大尝试次数'}
                    </div>
                `;
                // 添加3秒后移除面板逻辑
                if (allConnected) {
                    setTimeout(() => {
                        statusPanel.remove(); // 完全移除面板元素
                    }, 3000);
                }
            }
        }, CONFIG.timing.interval);
    }

    // 启动系统
    window.addEventListener('load', () => {
        setTimeout(controlLoop, 2000); // 等待页面初始化
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址