How to Integrate GLM-5 with Node.js & React (Build an AI Chat App Step-by-Step)

Introduction
Integrating advanced AI capabilities into web applications is no longer just a trend—it's a requirement for modern software development. Whether you are building a customer support agent, a coding assistant, or a creative writing tool, the ability to integrate GLM-5 with Node.js and React can significantly elevate your project.
In this GLM-5 API tutorial, we will bypass the theory and dive straight into the code. You will learn how to architect a secure backend, manage API requests, and build a responsive frontend that feels distinctively premium. By the end, you'll have a working template to build an AI chatbot using React and Node.js that you can expand for any use case.
What is GLM-5 and Why Should Developers Care?
GLM-5 is a state-of-the-art foundation model designed for complex reasoning and agentic workflows. Unlike generic models, GLM-5 capabilities are optimized for developers who need reliability and depth.
Key Features for Developers:
- Massive Context Window: With support for up to 200k tokens, you can feed it entire documentation sets or large codebases without fragmentation.
- Agentic Reasoning: It excels at multi-step tasks, making it ideal for autonomous agents that need to plan and execute actions.
- Structured Output: Native support for JSON ensures that your Node.js AI integration remains clean and predictable, without needing complex regex parsing.
Prerequisites
To follow this guide effectively, ensure you have:
- Node.js (v18+): Required for our backend runtime.
- Basic React Knowledge: We will use Hooks and functional components.
- GLM-5 API Key: Sign up at the official developer portal to get your credentials.
Phase 1: Building the Node.js API Backend
Directly calling AI APIs from the frontend exposes your secret keys to the public. To prevent this, we will build a lightweight Node.js backend for AI apps that acts as a secure proxy.
1. Project Initialization
Create a directory and initialize your project:
mkdir glm5-chat-server
cd glm5-chat-server
npm init -y
npm install express cors dotenv axios
2. Secure Server Implementation
Create a file named server.js. We'll implement robust error handling and input validation
right from the start.
/**
* GLM-5 Integration Backend
* Technologies: Express, Node.js, Axios
*/
const express = require('express');
const cors = require('cors');
const axios = require('axios');
require('dotenv').config();
const app = express();
const PORT = process.env.PORT || 5000;
// Middleware
app.use(cors()); // Allow cross-origin requests from React
app.use(express.json()); // Parse incoming JSON payloads
// Health Check Endpoint
app.get('/health', (req, res) => res.status(200).json({ status: 'OK' }));
// Main Chat Generation Route
app.post('/api/generate', async (req, res) => {
const { prompt } = req.body;
// Input Validation
if (!prompt || typeof prompt !== 'string' || prompt.trim().length === 0) {
return res.status(400).json({
error: 'Invalid Request',
message: 'A non-empty prompt string is required.'
});
}
try {
console.log('Sending request to GLM-5...');
// Call GLM-5 API
// Note: Update URL based on specific provider documentation
const response = await axios.post('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
model: "glm-4", // Use specific model version available
messages: [
{ role: "user", content: prompt }
],
temperature: 0.7,
top_p: 0.9
}, {
headers: {
'Authorization': `Bearer ${process.env.GLM_API_KEY}`,
'Content-Type': 'application/json'
}
});
// Extract the actual message content
const aiMessage = response.data.choices?.[0]?.message?.content || "No response generated.";
res.status(200).json({
success: true,
data: aiMessage
});
} catch (error) {
console.error('GLM-5 API Error:', error.response?.data || error.message);
// Smart Error Handling
const statusCode = error.response?.status || 500;
const errorMessage = error.response?.data?.error?.message || 'Internal Server Error';
res.status(statusCode).json({
success: false,
error: errorMessage
});
}
});
app.listen(PORT, () => {
console.log(`Server running secure on http://localhost:${PORT}`);
});
Code Explanation: This isn't just a "Hello World" example. We added input validation to reject empty requests before they hit the API, saving you money. We also implemented a structured error response, making it easier for the React frontend to understand what went wrong.
Phase 2: Creating the React Frontend
Now, let's build the interface. Our goal is a clean, React chat UI component that handles loading states and displays messages clearly.
1. Setup React
npx create-react-app glm5-client
cd glm5-client
npm install axios
2. The Chat Interface Logic
Replace src/App.js with this enhanced component. It handles the complete lifecycle: user
input, loading indication, API call, and response rendering.
import React, { useState, useRef, useEffect } from 'react';
import axios from 'axios';
import './App.css';
const App = () => {
const [messages, setMessages] = useState([
{ role: 'system', content: 'Welcome! How can I help you today?' }
]);
const [input, setInput] = useState('');
const [isLoading, setIsLoading] = useState(false);
const messagesEndRef = useRef(null);
// Auto-scroll to bottom when new messages arrive
useEffect(() => {
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
}, [messages]);
const handleSend = async () => {
if (!input.trim() || isLoading) return;
const userMessage = { role: 'user', content: input };
setMessages(prev => [...prev, userMessage]);
setInput('');
setIsLoading(true);
try {
// Function to connect React frontend to AI API
const response = await axios.post('http://localhost:5000/api/generate', {
prompt: input
});
if (response.data.success) {
const botMessage = {
role: 'assistant',
content: response.data.data
};
setMessages(prev => [...prev, botMessage]);
}
} catch (error) {
const errorMsg = {
role: 'error',
content: error.response?.data?.error || "Failed to connect to the server."
};
setMessages(prev => [...prev, errorMsg]);
} finally {
setIsLoading(false);
}
};
return (
<div className="chat-container">
<header className="chat-header">
<h1>GLM-5 AI Assistant</h1>
</header>
<div className="messages-window">
{messages.map((msg, idx) => (
<div key={idx} className={`message-bubble ${msg.role}`}>
<p>{msg.content}</p>
</div>
))}
{isLoading && <div className="loading-indicator">AI is thinking...</div>}
<div ref={messagesEndRef} />
</div>
<div className="input-area">
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && handleSend()}
placeholder="Ask something complex..."
disabled={isLoading}
/>
<button onClick={handleSend} disabled={isLoading}>
{isLoading ? 'Sending...' : 'Send'}
</button>
</div>
</div>
);
};
export default App;
Phase 3: Adding Professional Styles
A great AI tool needs a great interface. Add this CSS to src/App.css to give your app a
polished look using a modern color palette.
/* App.css */
.chat-container {
max-width: 800px;
margin: 2rem auto;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
background: #ffffff;
display: flex;
flex-direction: column;
height: 80vh;
font-family: 'Inter', sans-serif;
}
.chat-header {
padding: 20px;
border-bottom: 1px solid #eee;
background: #f8f9fa;
border-radius: 12px 12px 0 0;
}
.messages-window {
flex: 1;
overflow-y: auto;
padding: 20px;
background: #fafafa;
}
.message-bubble {
max-width: 75%;
margin-bottom: 15px;
padding: 12px 16px;
border-radius: 12px;
line-height: 1.5;
font-size: 0.95rem;
}
.message-bubble.user {
background: #007bff;
color: white;
margin-left: auto;
border-bottom-right-radius: 2px;
}
.message-bubble.assistant {
background: #e9ecef;
color: #333;
align-self: flex-start;
border-bottom-left-radius: 2px;
}
.message-bubble.error {
background: #ffe3e3;
color: #c92a2a;
border: 1px solid #ffc9c9;
}
.input-area {
padding: 20px;
border-top: 1px solid #eee;
display: flex;
gap: 10px;
background: #fff;
border-radius: 0 0 12px 12px;
}
input {
flex: 1;
padding: 12px;
border: 1px solid #ddd;
border-radius: 8px;
font-size: 1rem;
outline: none;
transition: border-color 0.2s;
}
input:focus {
border-color: #007bff;
}
button {
padding: 0 25px;
background: #007bff;
color: white;
border: none;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
}
button:hover:not(:disabled) {
background: #0056b3;
}
button:disabled {
background: #aac9eb;
cursor: not-allowed;
}
Taking Context Further: Meaningful Enhancements
You now have a functional full stack AI chatbot tutorial project. However, production applications often require more. Here are two critical upgrades to consider:
1. Persisting Chat History
Currently, the chat resets on refresh. GLM-5 is powerful because of its context window. To leverage this,
you should store the messages array in a database (like MongoDB) and send the full
conversation history with every new request. This allows the AI to "remember" previous questions.
2. Streaming Responses
Waiting for a long answer can be frustrating. Implementing Server-Sent Events (SSE) allows you to stream the text token by token, creating that magical "typing" effect users love. This significantly improves the perceived performance of your GLM-5 JavaScript integration.
Deployment Strategy
To go live, split your application:
- Frontend: Deploy your React app to Vercel or Netlify. These platforms are optimized for static sites and SPAs.
- Backend: Deploy your Node.js server to a platform like Render, Railway, or Heroku that supports long-running processes.
Remember to set your `GLM_API_KEY` in the environment variables of your hosting provider, never in your code repository.
Conclusion
We have successfully navigated how to integrate GLM-5 with Node.js and React. By separating your concerns into a secure backend and a responsive frontend, you’ve built a foundation that is secure, scalable, and ready for real users.
The world of Node.js AI integration is moving fast. With this architecture, you are well-positioned to swap models, add complex agents, or integrate other tools without rewriting your entire application. Now, go build something amazing.