{"id":24,"date":"2026-05-01T13:28:35","date_gmt":"2026-05-01T05:28:35","guid":{"rendered":"http:\/\/blog.lmxdg.sbs:40000\/?p=24"},"modified":"2026-05-01T13:28:35","modified_gmt":"2026-05-01T05:28:35","slug":"%e5%9c%a8%e7%ba%bfglm-5%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"http:\/\/blog.lmxdg.sbs:40000\/?p=24","title":{"rendered":"\u5728\u7ebfglm-5\u4f7f\u7528"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>mountain GLM-5 \u00b7 \u7d2b<\/title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Microsoft YaHei', sans-serif;\n        }\n        \n        body {\n            background: linear-gradient(145deg, #f0e6ff 0%, #e0d0ff 100%);\n            color: #4a2f6b;\n            min-height: 100vh;\n            display: flex;\n            flex-direction: column;\n        }\n        \n        .header {\n            background-color: rgba(240, 230, 255, 0.92);\n            backdrop-filter: blur(6px);\n            padding: 0.8rem 1.2rem;\n            border-bottom: 3px solid #b794f4;\n            box-shadow: 0 4px 20px rgba(150, 100, 220, 0.2);\n        }\n        \n        .logo-container {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            max-width: 900px;\n            margin: 0 auto;\n            width: 100%;\n            flex-wrap: wrap;\n            gap: 0.8rem;\n        }\n        \n        .logo-section {\n            display: flex;\n            align-items: center;\n            gap: 1rem;\n        }\n        \n        .logo-img {\n            width: 50px;\n            height: 50px;\n            border-radius: 16px;\n            background: linear-gradient(145deg, #c7abff 0%, #9f7aff 100%);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            border: 3px solid #8b5cf6;\n            overflow: hidden;\n            box-shadow: 0 4px 12px rgba(120, 70, 200, 0.4);\n        }\n        \n        .logo-img img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n            border-radius: 13px;\n        }\n        \n        .logo-text {\n            display: flex;\n            flex-direction: column;\n        }\n        \n        .header h1 {\n            font-size: 1.8rem;\n            font-weight: 800;\n            color: #6b3fa0;\n            text-shadow: 0 2px 8px rgba(140, 90, 210, 0.3);\n            letter-spacing: 0.5px;\n        }\n        \n        .tagline {\n            font-size: 0.8rem;\n            color: #6b4b8c;\n            margin-top: 0.2rem;\n            font-style: italic;\n        }\n        \n        .api-status {\n            display: flex;\n            align-items: center;\n            gap: 0.6rem;\n            font-size: 0.85rem;\n            background: #f0e8ff;\n            padding: 0.4rem 0.9rem;\n            border-radius: 30px;\n            border: 1px solid #b794f4;\n            color: #5a3d82;\n            font-weight: 500;\n        }\n        \n        .status-dot {\n            width: 10px;\n            height: 10px;\n            border-radius: 50%;\n            animation: pulse 1.5s infinite;\n            background: linear-gradient(145deg, #8b5cf6, #b794f4);\n            box-shadow: 0 0 10px #8b5cf6;\n        }\n        \n        @keyframes pulse {\n            0%, 100% { opacity: 1; box-shadow: 0 0 10px #8b5cf6; }\n            50% { opacity: 0.7; box-shadow: 0 0 18px #b794f4; }\n        }\n\n        .model-selector {\n            margin-left: 0.8rem;\n            padding: 0.3rem 0.8rem;\n            background: white;\n            border: 1px solid #b794f4;\n            border-radius: 20px;\n            color: #6b3fa0;\n            font-size: 0.8rem;\n            cursor: pointer;\n            outline: none;\n            transition: all 0.3s;\n        }\n\n        .model-selector:hover {\n            background: #f5edff;\n            border-color: #8b5cf6;\n        }\n        \n        .chat-container {\n            flex: 1;\n            padding: 1.5rem;\n            overflow-y: auto;\n            max-width: 900px;\n            margin: 0 auto;\n            width: 100%;\n        }\n        \n        .message {\n            margin-bottom: 1.5rem;\n            max-width: 85%;\n            animation: fadeIn 0.4s ease-out;\n        }\n        \n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(15px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n        \n        .user-message {\n            margin-left: auto;\n        }\n        \n        .message-content {\n            padding: 1rem 1.3rem;\n            border-radius: 24px 24px 8px 24px;\n            line-height: 1.6;\n            word-wrap: break-word;\n            font-size: 1rem;\n            box-shadow: 0 6px 16px rgba(130, 80, 190, 0.15);\n        }\n        \n        .user-message .message-content {\n            background: linear-gradient(145deg, #b794f4, #8b5cf6);\n            color: white;\n            border: 1px solid #7c4dff;\n            border-bottom-right-radius: 5px;\n        }\n        \n        .ai-message .message-content {\n            background: #ffffff;\n            color: #4a2f6b;\n            border: 1px solid #d6bcfc;\n            border-bottom-left-radius: 5px;\n            box-shadow: 0 6px 16px rgba(140, 90, 210, 0.1);\n        }\n        \n        .message-sender {\n            font-size: 0.8rem;\n            color: #6b4b8c;\n            margin-bottom: 0.4rem;\n            display: flex;\n            align-items: center;\n            gap: 0.6rem;\n            font-weight: 600;\n        }\n        \n        .ai-logo-container {\n            display: flex;\n            align-items: center;\n            gap: 0.3rem;\n        }\n        \n        .ai-logo-img {\n            width: 18px;\n            height: 18px;\n            border-radius: 6px;\n            overflow: hidden;\n            background: #d6bcfc;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n        \n        .ai-logo-img img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n        }\n        \n        .input-container {\n            background: rgba(240, 230, 255, 0.95);\n            backdrop-filter: blur(4px);\n            padding: 1.2rem 1.5rem;\n            border-top: 3px solid #b794f4;\n            box-shadow: 0 -4px 20px rgba(140, 90, 210, 0.15);\n        }\n        \n        .input-area {\n            max-width: 900px;\n            margin: 0 auto;\n            display: flex;\n            gap: 0.8rem;\n        }\n        \n        textarea {\n            flex: 1;\n            background: #ffffff;\n            border: 2px solid #d6bcfc;\n            border-radius: 30px;\n            color: #4a2f6b;\n            padding: 1rem 1.4rem;\n            font-size: 1rem;\n            resize: none;\n            max-height: 120px;\n            outline: none;\n            transition: all 0.3s;\n            box-shadow: inset 0 2px 5px rgba(140, 90, 210, 0.1);\n        }\n        \n        textarea:focus {\n            border-color: #8b5cf6;\n            box-shadow: 0 0 0 4px rgba(120, 70, 200, 0.2), inset 0 1px 3px #f0e6ff;\n            background: #ffffff;\n        }\n        \n        textarea::placeholder {\n            color: #a88fc8;\n            font-style: italic;\n        }\n        \n        .send-button {\n            background: linear-gradient(145deg, #b794f4, #8b5cf6);\n            color: white;\n            border: none;\n            border-radius: 40px;\n            width: 58px;\n            height: 58px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            cursor: pointer;\n            transition: all 0.3s;\n            font-size: 1.5rem;\n            box-shadow: 0 6px 14px #b794f4;\n            border: 1px solid #7c4dff;\n        }\n        \n        .send-button:hover {\n            background: linear-gradient(145deg, #8b5cf6, #7c4dff);\n            transform: translateY(-3px) scale(1.03);\n            box-shadow: 0 10px 20px #8b5cf6;\n        }\n        \n        .send-button:disabled {\n            background: #c7b0e6;\n            border-color: #a887cf;\n            color: #f0e6ff;\n            cursor: not-allowed;\n            transform: none;\n            box-shadow: none;\n        }\n        \n        .typing-indicator {\n            display: flex;\n            align-items: center;\n            gap: 0.4rem;\n            padding: 1rem 1.4rem;\n            background: #ffffff;\n            border-radius: 30px 30px 30px 8px;\n            width: fit-content;\n            margin-bottom: 1.5rem;\n            border: 1px solid #d6bcfc;\n            box-shadow: 0 4px 12px #f0e6ff;\n        }\n        \n        .typing-dot {\n            width: 9px;\n            height: 9px;\n            border-radius: 50%;\n            background: linear-gradient(145deg, #8b5cf6, #b794f4);\n            animation: typing 1.2s infinite ease-in-out;\n            box-shadow: 0 0 8px #b794f4;\n        }\n        \n        .typing-dot:nth-child(2) { animation-delay: 0.2s; }\n        .typing-dot:nth-child(3) { animation-delay: 0.4s; }\n        \n        @keyframes typing {\n            0%, 100% { transform: translateY(0); }\n            50% { transform: translateY(-8px) scale(1.2); }\n        }\n        \n        .error-message {\n            background: #f0e6ff;\n            color: #6b3fa0;\n            padding: 1rem 1.2rem;\n            border-radius: 30px;\n            margin-bottom: 1.5rem;\n            border-left: 5px solid #b794f4;\n            font-size: 0.95rem;\n            border: 1px solid #d6bcfc;\n            box-shadow: 0 4px 12px rgba(140, 90, 210, 0.15);\n        }\n        \n        .footer {\n            text-align: center;\n            padding: 1rem;\n            color: #6b4b8c;\n            font-size: 0.85rem;\n            border-top: 1px solid #d6bcfc;\n            background: rgba(240, 230, 255, 0.8);\n            backdrop-filter: blur(2px);\n        }\n        \n        .footer-content {\n            max-width: 900px;\n            margin: 0 auto;\n            display: flex;\n            justify-content: center;\n            gap: 2rem;\n            flex-wrap: wrap;\n        }\n        \n        .contact-link {\n            color: #6b3fa0;\n            text-decoration: none;\n            transition: all 0.3s;\n            border-bottom: 1px dotted #b794f4;\n        }\n        \n        .contact-link:hover {\n            color: #4a2a7a;\n            border-bottom: 1px solid #8b5cf6;\n        }\n        \n        .typing-text {\n            border-right: 3px solid #8b5cf6;\n            animation: blink 0.85s infinite;\n            padding-right: 3px;\n        }\n        \n        @keyframes blink {\n            0%, 100% { border-color: transparent; }\n            50% { border-color: #8b5cf6; }\n        }\n        \n        .message-content code {\n            background: #f0e6ff;\n            padding: 0.2rem 0.5rem;\n            border-radius: 8px;\n            font-family: 'Courier New', monospace;\n            font-size: 0.9em;\n            color: #6b3fa0;\n            border: 1px solid #d6bcfc;\n        }\n        \n        .message-content pre {\n            background: #f5edff;\n            padding: 1rem;\n            border-radius: 20px;\n            overflow-x: auto;\n            margin: 0.6rem 0;\n            border: 1px solid #e0d0ff;\n            color: #4a2f6b;\n        }\n        \n        @media (max-width: 768px) {\n            .logo-container {\n                flex-direction: column;\n                align-items: start;\n            }\n            \n            .message {\n                max-width: 95%;\n            }\n            \n            .input-area {\n                flex-direction: column;\n            }\n            \n            .send-button {\n                width: 100%;\n                height: 52px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"header\">\n        <div class=\"logo-container\">\n            <div class=\"logo-section\">\n                <div class=\"logo-img\">\n                    <img decoding=\"async\" src=\"https:\/\/mountainai.nekoweb.org\/IMG_1282.jpeg\" alt=\"mountain\" onerror=\"this.style.display='none'; this.parentElement.innerHTML='<span style=\\\"color:#6b3fa0;font-weight:bold;font-size:26px;\\\">\ud83d\udd2e<\/span>&#8216;;&#8221;>\n                <\/div>\n                <div class=\"logo-text\">\n                    <h1>mountain GLM-5<\/h1>\n                    <div class=\"tagline\">Pro\/zai-org\/GLM-5 \u00b7 \u7d2b<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"api-status\">\n                <div class=\"status-dot\"><\/div>\n                <span>GLM-5 ready<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <div class=\"chat-container\" id=\"chatContainer\"><\/div>\n    \n    <div class=\"input-container\">\n        <div class=\"input-area\">\n            <textarea \n                id=\"messageInput\" \n                placeholder=\"type your message... (Shift+Enter for new line)\" \n                rows=\"1\"\n                oninput=\"autoResize(this)\"\n                onkeydown=\"handleKeydown(event)\"\n            ><\/textarea>\n            <button class=\"send-button\" id=\"sendButton\" onclick=\"sendMessage()\">\u27a4<\/button>\n        <\/div>\n    <\/div>\n    \n    <div class=\"footer\">\n        <div class=\"footer-content\">\n            <span>\u00a9 mountain GLM-5 \u00b7 Pro\/zai-org<\/span>\n            <a href=\"mailto:mountain0708@outlook.com\" class=\"contact-link\">mountain0708@outlook.com<\/a>\n        <\/div>\n    <\/div>\n\n    <script>\n        (function() {\n            const API_CONFIG = {\n                url: \"https:\/\/api.siliconflow.cn\/v1\/chat\/completions\",\n                key: \"sk-mqsldpfwrxxittkqbspwgegnceczgtwzeeoydvnfbepksbzq\"\n            };\n            \n            const chatContainer = document.getElementById('chatContainer');\n            const messageInput = document.getElementById('messageInput');\n            const sendButton = document.getElementById('sendButton');\n            \n            let chatHistory = [\n                {\n                    role: \"system\",\n                    content: \"You are mountain GLM-5 assistant, based on Pro\/zai-org\/GLM-5 model. Provide professional, friendly answers in Chinese. Keep responses clear and helpful.\"\n                }\n            ];\n            \n            window.autoResize = function(textarea) {\n                textarea.style.height = 'auto';\n                textarea.style.height = Math.min(textarea.scrollHeight, 120) + 'px';\n            };\n            \n            window.handleKeydown = function(event) {\n                if (event.key === 'Enter' && !event.shiftKey) {\n                    event.preventDefault();\n                    sendMessage();\n                }\n            };\n            \n            function formatMessageContent(text) {\n                if (!text) return '';\n                let escaped = text.replace(\/&\/g, '&amp;')\n                                  .replace(\/<\/g, '&lt;')\n                                  .replace(\/>\/g, '&gt;')\n                                  .replace(\/\"\/g, '&quot;')\n                                  .replace(\/'\/g, '&#039;');\n                \n                escaped = escaped.replace(\/```(\\w+)?\\n([\\s\\S]*?)```\/g, \n                    (match, lang, code) => {\n                        const language = lang || 'text';\n                        return `<pre><code class=\"language-${language}\">${code.trim()}<\/code><\/pre>`;\n                    });\n                \n                escaped = escaped.replace(\/`([^`]+)`\/g, '<code>$1<\/code>');\n                escaped = escaped.replace(\/\\n\/g, '<br>');\n                return escaped;\n            }\n            \n            function displayMessage(sender, content, isTyping = false) {\n                const messageDiv = document.createElement('div');\n                messageDiv.className = `message ${sender}-message`;\n                \n                const senderDiv = document.createElement('div');\n                senderDiv.className = 'message-sender';\n                \n                if (sender === 'user') {\n                    senderDiv.innerHTML = '\ud83d\udc64 you';\n                } else {\n                    senderDiv.innerHTML = `\n                        <div class=\"ai-logo-container\">\n                            <div class=\"ai-logo-img\">\n                                <img decoding=\"async\" src=\"https:\/\/mountainai.nekoweb.org\/IMG_1282.jpeg\" alt=\"glm5\" onerror=\"this.style.display='none'; this.parentElement.innerHTML='<span style=\\\"color:#6b3fa0;\\\">\ud83d\udd2e<\/span>';\">\n                            <\/div>\n                            <span>mountain GLM-5<\/span>\n                        <\/div>\n                    `;\n                }\n                \n                const contentDiv = document.createElement('div');\n                contentDiv.className = 'message-content';\n                \n                if (isTyping) {\n                    contentDiv.classList.add('typing-text');\n                    contentDiv.id = 'typingText';\n                }\n                \n                contentDiv.innerHTML = formatMessageContent(content);\n                \n                messageDiv.appendChild(senderDiv);\n                messageDiv.appendChild(contentDiv);\n                chatContainer.appendChild(messageDiv);\n                \n                chatContainer.scrollTop = chatContainer.scrollHeight;\n                \n                return { messageDiv, contentDiv };\n            }\n            \n            async function typeWriter(element, fullText, speed = 15) {\n                if (fullText.includes('<pre>') || fullText.includes('<code>')) {\n                    element.innerHTML = formatMessageContent(fullText);\n                    return;\n                }\n                \n                if (fullText.length < 80) {\n                    element.innerHTML = '';\n                    let i = 0;\n                    return new Promise(resolve => {\n                        const interval = setInterval(() => {\n                            if (i < fullText.length) {\n                                let char = fullText.charAt(i);\n                                if (char === '<') char = '&lt;';\n                                else if (char === '>') char = '&gt;';\n                                else if (char === '&') char = '&amp;';\n                                element.innerHTML += char;\n                                i++;\n                                chatContainer.scrollTop = chatContainer.scrollHeight;\n                            } else {\n                                clearInterval(interval);\n                                resolve();\n                            }\n                        }, speed);\n                    });\n                } else {\n                    element.innerHTML = formatMessageContent(fullText);\n                    return;\n                }\n            }\n            \n            function showTypingIndicator() {\n                const indicatorDiv = document.createElement('div');\n                indicatorDiv.className = 'typing-indicator';\n                indicatorDiv.id = 'typingIndicator';\n                \n                const textSpan = document.createElement('span');\n                textSpan.textContent = 'glm thinking';\n                textSpan.style.marginRight = '10px';\n                textSpan.style.color = '#6b4b8c';\n                textSpan.style.fontSize = '0.9rem';\n                indicatorDiv.appendChild(textSpan);\n                \n                for (let i = 0; i < 3; i++) {\n                    const dot = document.createElement('div');\n                    dot.className = 'typing-dot';\n                    indicatorDiv.appendChild(dot);\n                }\n                \n                chatContainer.appendChild(indicatorDiv);\n                chatContainer.scrollTop = chatContainer.scrollHeight;\n                return indicatorDiv;\n            }\n            \n            function displayError(msg) {\n                const errorDiv = document.createElement('div');\n                errorDiv.className = 'error-message';\n                errorDiv.innerHTML = `<strong>\u26a0\ufe0f<\/strong> \u00b7 ${msg}`;\n                chatContainer.appendChild(errorDiv);\n                chatContainer.scrollTop = chatContainer.scrollHeight;\n            }\n            \n            window.sendMessage = async function sendMessage() {\n                const userText = messageInput.value.trim();\n                if (!userText) return;\n                \n                messageInput.disabled = true;\n                sendButton.disabled = true;\n                \n                displayMessage('user', userText);\n                chatHistory.push({ role: \"user\", content: userText });\n                \n                messageInput.value = '';\n                window.autoResize(messageInput);\n                \n                const typingIndicator = showTypingIndicator();\n                \n                const requestBody = {\n                    model: \"Pro\/zai-org\/GLM-5\",\n                    messages: chatHistory.slice(-20),\n                    max_tokens: 2048,\n                    temperature: 0.7,\n                    top_p: 0.9,\n                    stream: false\n                };\n                \n                try {\n                    const response = await fetch(API_CONFIG.url, {\n                        method: 'POST',\n                        headers: {\n                            'Authorization': `Bearer ${API_CONFIG.key}`,\n                            'Content-Type': 'application\/json',\n                            'Accept': 'application\/json'\n                        },\n                        body: JSON.stringify(requestBody)\n                    });\n                    \n                    if (!response.ok) {\n                        let errorDetail = `HTTP ${response.status}`;\n                        try {\n                            const errData = await response.json();\n                            errorDetail = errData.error?.message || JSON.stringify(errData);\n                        } catch (e) {}\n                        throw new Error(errorDetail);\n                    }\n                    \n                    const data = await response.json();\n                    typingIndicator.remove();\n                    \n                    if (!data.choices?.[0]?.message?.content) {\n                        throw new Error('invalid API response format');\n                    }\n                    \n                    const aiContent = data.choices[0].message.content;\n                    \n                    const { contentDiv } = displayMessage('ai', '', true);\n                    await typeWriter(contentDiv, aiContent, 12);\n                    contentDiv.classList.remove('typing-text');\n                    \n                    chatHistory.push({ role: \"assistant\", content: aiContent });\n                    \n                    if (chatHistory.length > 25) {\n                        chatHistory = [chatHistory[0], ...chatHistory.slice(-20)];\n                    }\n                    \n                } catch (error) {\n                    typingIndicator.remove();\n                    console.error('API Error:', error);\n                    displayError(error.message || 'connection failed');\n                } finally {\n                    messageInput.disabled = false;\n                    sendButton.disabled = false;\n                    messageInput.focus();\n                }\n            };\n            \n            messageInput.focus();\n        })();\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>mountain GLM-5 \u00b7 \u7d2b<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-24","post","type-post","status-publish","format-standard","hentry","category-uncategorized","entry"],"_links":{"self":[{"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=\/wp\/v2\/posts\/24","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=24"}],"version-history":[{"count":1,"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=\/wp\/v2\/posts\/24\/revisions"}],"predecessor-version":[{"id":25,"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=\/wp\/v2\/posts\/24\/revisions\/25"}],"wp:attachment":[{"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=24"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=24"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.lmxdg.sbs:40000\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=24"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}