Vì sao không gọi AI trực tiếp từ trình duyệt
Dịch vụ AI (OpenAI, Anthropic và khác) cần API key – mã bí mật xác định bạn và dùng để tính phí. Và đây là vấn đề:
Mọi thứ bạn đặt vào JavaScript trong trình duyệt đều có thể bị đọc (F12 → mã nguồn). Nếu khóa ở đó, ai cũng có thể gọi AI bằng tiền của bạn.
Bạn đã biết giải pháp từ Bậc thầy: server riêng. Khóa ở trên server, trình duyệt chỉ nói với server của bạn:
Browser → your server (the key is here!) → AI service
Browser ← your server ← AI service
Xem thử: endpoint /zeptat-se
Chúng ta xây trên server Express từ Bậc thầy. Lưu khóa trong tệp .env (tệp này không bao giờ lên GitHub – thêm vào .gitignore!):
AI_KLIC=sk-your-secret-key-here
Và server có endpoint mới:
require('dotenv').config();
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.static('public'));
app.post('/zeptat-se', async (req, res) => {
const { otazka } = req.body;
const odpoved = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.AI_KLIC}`,
},
body: JSON.stringify({
model: 'gpt-4o-mini',
messages: [
{ role: 'system', content: 'You are a friendly helper. Answer briefly in English.' },
{ role: 'user', content: otazka },
],
}),
});
const data = await odpoved.json();
res.json({ text: data.choices[0].message.content });
});
app.listen(3000, () => console.log('Server running at http://localhost:3000'));
Điều mới ở đây:
fetchcũng có thể gửi dữ liệu:method: 'POST'vàbody.headersvớiAuthorization– nơi trình bày khóa.role: 'system'– đó là prompt từ bài trước! Nó định nghĩa AI hành xử thế nào.process.env.AI_KLIC– khóa đọc từ.env, không viết trong code.
Lấy khóa ở đâu? Dịch vụ AI cấp API key sau khi đăng ký – và thường trả phí (rẻ, chỉ vài cent mỗi câu trả lời). Việc này dành cho phụ huynh: nhờ họ tạo khóa và nạp ít credit (vài đô là đủ). Không có khóa, vẫn test được bằng response giả – xem “Đến lượt bạn” bên dưới.
Đến lượt bạn 💪
- Thêm dòng
.envvào.gitignore– kiểm tra bằng lệnhgit status(tệp.envkhông được hiện). - Tạo endpoint
/zeptat-setheo ví dụ. - Chưa có khóa? Không sao – chỉ trả response test tạm thời và sang bài tiếp theo:
app.post('/zeptat-se', (req, res) => {
res.json({ text: `Test answer to: "${req.body.otazka}"` });
});
- Thử endpoint từ trình duyệt (console F12):
const r = await fetch('/zeptat-se', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ otazka: 'Hi, who are you?' }),
});
console.log(await r.json());
Kiểm tra: Server phản hồi POST /zeptat-se (câu trả lời test hoặc AI thật), và khóa bí mật không có trong code hay GitHub.
Những điều cần nhớ
- Khóa bí mật thuộc về server trong
.env, không bao giờ trong trình duyệt hay Git. fetchcó thể POST – gửi dữ liệu trongbody, khóa trongheaders.- System prompt định hình tính cách trợ lý AI của bạn.
© 2026 Ing. Martin Polak / AlgoRhino · Điều khoản sử dụng nội dung