Bir discord ai botu, kullanıcıların sunucudaki mesajlarına yapay zekâ destekli, akıcı yanıtlar verebilen bir bottur. Bu yazıda discord.js ile gelen mesajları yakalayıp Anthropic'in Claude API'sine gönderen, gelen yanıtı kanala basan tam çalışan bir bot kuracağız. Komut tabanlı klasik botların aksine, burada amaç doğal dilde sohbet edebilen, bağlamı hatırlayan bir asistan inşa etmek.
Discord AI botu için neye ihtiyacın var?
Başlamadan önce birkaç temel parçayı hazırla:
- Node.js 18+ — discord.js v14 ve resmi Anthropic SDK'sı modern Node sürümleri ister.
- Bir Discord uygulaması ve bot token'ı —
Discord Developer Portalüzerinden uygulama oluştur, bota dönüştür ve token'ı kopyala. - Bir Anthropic API anahtarı —
console.anthropic.comüzerinden alınır ve.envdosyasında saklanır. - Message Content Intent — bot mesaj içeriğini okuyabilmesi için Developer Portal'da bu ayrıcalıklı intent'i açman gerekir.
Token ve API anahtarını asla kaynak koduna gömme; her ikisini de ortam değişkeni olarak tut. Anahtar sızarsa kötüye kullanım faturası sana çıkar.
Projeyi kurma ve bağımlılıklar
Boş bir klasörde projeyi başlat ve gerekli paketleri kur:
mkdir discord-ai-bot && cd discord-ai-bot
npm init -y
npm install discord.js @anthropic-ai/sdk dotenv
package.json içine "type": "module" ekleyerek ES modül söz dizimini (import) kullanabilirsin. Ardından kök dizine bir .env dosyası oluştur:
DISCORD_TOKEN=senin_discord_bot_tokenin
ANTHROPIC_API_KEY=senin_anthropic_anahtarin
SDK, ANTHROPIC_API_KEY ortam değişkenini otomatik okur, bu yüzden istemciyi oluştururken anahtarı elle vermene gerek yok.
Claude API ile mesajlaşma: temel kod
Asıl iş Claude'un Messages API'sinde gerçekleşir: bir messages dizisi (rol ve içerik) ile bir model seçer, yanıt olarak içerik bloklarından oluşan bir mesaj alırsın. Aşağıdaki index.js, bota etiket atıldığında (mention) Claude'a sorar ve cevabı geri yazar:
import 'dotenv/config';
import { Client, GatewayIntentBits, Events } from 'discord.js';
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic(); // anahtar ortamdan okunur
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
const SYSTEM_PROMPT =
'Sen yardımsever bir Discord topluluk asistanısın. Kısa, net ve Türkçe yanıt ver.';
client.once(Events.ClientReady, (c) => {
console.log(`Giriş yapıldı: ${c.user.tag}`);
});
client.on(Events.MessageCreate, async (message) => {
if (message.author.bot) return;
if (!message.mentions.has(client.user)) return;
const prompt = message.content.replace(/<@!?\d+>/g, '').trim();
if (!prompt) return;
await message.channel.sendTyping();
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
system: SYSTEM_PROMPT,
messages: [{ role: 'user', content: prompt }],
});
const reply = response.content
.filter((block) => block.type === 'text')
.map((block) => block.text)
.join('');
await message.reply(reply.slice(0, 2000));
});
client.login(process.env.DISCORD_TOKEN);
Birkaç ayrıntıya dikkat: Claude'un yanıtı response.content içinde bir blok dizisidir; metni almak için text tipindeki blokları filtreleyip birleştiriyoruz. Discord mesaj sınırı 2000 karakter olduğu için cevabı kestik. system alanı ise botun kişiliğini ve dilini belirleyen sistem komutudur.
Sohbet belleği ve bağlam yönetimi
Yukarıdaki bot her mesajı sıfırdan ele alır; önceki konuşmayı hatırlamaz. Gerçek bir sohbet için, kanal başına son mesajları saklayıp her istekte geçmişi geri göndermelisin. Claude API durumsuzdur (stateless): bağlamı sen taşırsın.
const history = new Map();
// MessageCreate içinde:
const channelId = message.channelId;
const messages = history.get(channelId) ?? [];
messages.push({ role: 'user', content: prompt });
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
system: SYSTEM_PROMPT,
messages,
});
const reply = response.content
.filter((block) => block.type === 'text')
.map((block) => block.text)
.join('');
messages.push({ role: 'assistant', content: reply });
// Bağlamı son 10 mesajla sınırla (token ve maliyet kontrolü)
history.set(channelId, messages.slice(-10));
Burada önemli kural: mesajlar user ve assistant rolleriyle sırayla ilerler ve ilk mesaj her zaman user olmalıdır. Geçmişi sınırsız büyütürsen hem token maliyeti artar hem de bağlam penceresini doldurursun; bu yüzden son N mesajla kırpmak iyi bir pratiktir. Uzun süreli kalıcılık istersen bu diziyi bir veritabanında (örneğin SQLite) saklayabilirsin.
Maliyet, hız ve güvenlik ipuçları
- Hata yönetimi: API çağrısını
try/catchiçine al; ağ hatası veya hız limiti (rate limit) durumunda kullanıcıya nazik bir mesaj dön ve hatayı logla. - Cooldown: Kullanıcı başına basit bir bekleme süresi ekleyerek hem spam'i hem de gereksiz API maliyetini engelle.
- Model seçimi: Yoğun ve hız-hassas iş yükleri için Sonnet ailesi dengeli bir tercihtir; daha karmaşık görevler için Opus, basit ve hızlı yanıtlar için Haiku düşünülebilir.
- max_tokens: Yanıtı kısa tutmak için makul bir üst sınır belirle — uzun yanıt hem maliyetli hem de Discord sınırını aşabilir.
- Sistem komutu: Botun rolünü, sınırlarını ve tonunu
systemalanında net tanımla; bu, model davranışını yönlendirmenin en etkili yoludur.
Bu parçaları birleştirdiğinde, sunucuna doğal dilde konuşabilen, bağlamı hatırlayan ve maliyeti kontrol altında tutulan sağlam bir asistan kazanırsın.
Sık Sorulan Sorular
Botum mesajları okuyamıyor, neden?
Büyük olasılıkla Message Content Intent kapalıdır. Developer Portal'da botun ayarlarından bu ayrıcalıklı intent'i aç ve kodda GatewayIntentBits.MessageContent intent'ini eklediğinden emin ol.
Hangi Claude modelini kullanmalıyım?
Sohbet botları için claude-sonnet-4-6 gibi güncel bir model hız ve kalite arasında iyi bir denge sunar. İhtiyaca göre daha güçlü veya daha hızlı bir modele geçebilirsin; model kimliğini istekteki model alanında değiştirmen yeterli.
API anahtarımı nasıl güvende tutarım?
Anahtarı .env dosyasında tut, .gitignore'a ekle ve asla depoya gönderme. Anahtar yanlışlıkla sızarsa, konsoldan hemen iptal edip yenisini oluştur.
Discord topluluğun için AI destekli bir bot mu istiyorsun? İster sıfırdan kurulum, ister mevcut botuna Claude entegrasyonu olsun, birlikte planlayalım. Benimle iletişime geç ve projeni hayata geçirelim.