aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Discord-Bots

Discord-KI-Bot: Chat-Integration mit der Claude-API

Ein Discord-KI-Bot ist ein Bot, der Nachrichten auf deinem Server mit flüssigen, KI-gestützten Antworten beantwortet. In dieser Anleitung bauen wir einen voll funktionsfähigen Bot, der eingehende Nachrichten mit discord.js erfasst, sie an die Claude-API von Anthropic sendet und die Antwort zurück in den Kanal schreibt. Anders als klassische, befehlsgesteuerte Bots ist das Ziel hier ein Assistent, der in natürlicher Sprache spricht und sich den Kontext merkt.

Was du für einen Discord-KI-Bot brauchst

Bereite vor dem Start ein paar grundlegende Dinge vor:

  • Node.js 18+ — discord.js v14 und das offizielle Anthropic-SDK erfordern eine moderne Node-Version.
  • Eine Discord-Anwendung und ein Bot-Token — erstelle im Discord Developer Portal eine Anwendung, wandle sie in einen Bot um und kopiere das Token.
  • Einen Anthropic-API-Schlüssel — über console.anthropic.com bezogen und in einer .env-Datei gespeichert.
  • Den Message Content Intent — du musst diesen privilegierten Intent im Developer Portal aktivieren, damit der Bot Nachrichteninhalte lesen kann.

Schreibe Token und API-Schlüssel niemals fest in deinen Quellcode; halte beides als Umgebungsvariablen. Wenn der Schlüssel durchsickert, landet die Missbrauchsrechnung bei dir.

Projekt und Abhängigkeiten einrichten

Initialisiere das Projekt in einem leeren Ordner und installiere die benötigten Pakete:

mkdir discord-ai-bot && cd discord-ai-bot
npm init -y
npm install discord.js @anthropic-ai/sdk dotenv

Füge "type": "module" zu deiner package.json hinzu, um die ES-Modul-Syntax (import) verwenden zu können. Erstelle dann eine .env-Datei im Stammverzeichnis:

DISCORD_TOKEN=dein_discord_bot_token
ANTHROPIC_API_KEY=dein_anthropic_schluessel

Das SDK liest die Umgebungsvariable ANTHROPIC_API_KEY automatisch aus, du musst den Schlüssel beim Erstellen des Clients also nicht von Hand übergeben.

Mit der Claude-API kommunizieren: der Kerncode

Die eigentliche Arbeit passiert in Claudes Messages-API: Du wählst ein Modell und übergibst ein messages-Array (Rolle und Inhalt) und erhältst eine Nachricht zurück, die aus Inhaltsblöcken besteht. Die folgende index.js fragt Claude, sobald der Bot erwähnt (mention) wird, und schreibt die Antwort zurück:

import 'dotenv/config';
import { Client, GatewayIntentBits, Events } from 'discord.js';
import Anthropic from '@anthropic-ai/sdk';

const anthropic = new Anthropic(); // Schluessel wird aus der Umgebung gelesen

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
});

const SYSTEM_PROMPT =
  'Du bist ein hilfsbereiter Discord-Community-Assistent. Antworte kurz und klar.';

client.once(Events.ClientReady, (c) => {
  console.log(`Angemeldet als ${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);

Ein paar Details, auf die du achten solltest: Claudes Antwort liegt in response.content als Array von Blöcken vor; um den Text zu erhalten, filtern wir die Blöcke vom Typ text und fügen sie zusammen. Wir kürzen die Antwort, weil das Nachrichtenlimit von Discord bei 2000 Zeichen liegt. Das Feld system ist der System-Prompt, der die Persönlichkeit und Sprache des Bots festlegt.

Gesprächsgedächtnis und Kontextverwaltung

Der obige Bot behandelt jede Nachricht von Grund auf neu; er erinnert sich nicht an das vorherige Gespräch. Für einen echten Chat speicherst du die jüngsten Nachrichten pro Kanal und sendest den Verlauf bei jeder Anfrage zurück. Die Claude-API ist zustandslos (stateless): Du trägst den Kontext.

const history = new Map();

// innerhalb von MessageCreate:
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 });
// Kontext auf die letzten 10 Nachrichten begrenzen (Token- und Kostenkontrolle)
history.set(channelId, messages.slice(-10));

Eine wichtige Regel hier: Nachrichten wechseln zwischen den Rollen user und assistant, und die erste Nachricht muss immer user sein. Wenn du den Verlauf unbegrenzt wachsen lässt, steigen die Token-Kosten und du füllst das Kontextfenster; auf die letzten N Nachrichten zu kürzen ist daher eine gute Praxis. Für langfristige Persistenz speicherst du dieses Array in einer Datenbank (zum Beispiel SQLite).

Tipps zu Kosten, Geschwindigkeit und Sicherheit

  • Fehlerbehandlung: umschließe den API-Aufruf mit einem try/catch; gib bei einem Netzwerkfehler oder einem Rate Limit eine höfliche Nachricht an den Nutzer zurück und protokolliere den Fehler.
  • Cooldown: füge eine einfache Wartezeit pro Nutzer hinzu, um sowohl Spam als auch unnötige API-Kosten zu unterbinden.
  • Modellwahl: für umfangreiche, geschwindigkeitssensible Arbeitslasten ist die Sonnet-Familie eine ausgewogene Wahl; ziehe Opus für komplexere Aufgaben und Haiku für einfache, schnelle Antworten in Betracht.
  • max_tokens: setze eine vernünftige Obergrenze, um Antworten kurz zu halten — eine lange Antwort ist teuer und kann das Limit von Discord überschreiten.
  • System-Prompt: definiere Rolle, Grenzen und Ton des Bots klar im Feld system; das ist der wirksamste Weg, das Verhalten des Modells zu steuern.

Setzt du diese Teile zusammen, hast du einen soliden Assistenten, der in natürlicher Sprache spricht, sich den Kontext merkt und die Kosten unter Kontrolle hält.

Häufige Fragen

Mein Bot kann keine Nachrichten lesen — warum?

Höchstwahrscheinlich ist der Message Content Intent deaktiviert. Aktiviere diesen privilegierten Intent in den Bot-Einstellungen im Developer Portal und stelle sicher, dass du den Intent GatewayIntentBits.MessageContent in deinem Code hinzugefügt hast.

Welches Claude-Modell soll ich verwenden?

Für Chatbots bietet ein aktuelles Modell wie claude-sonnet-4-6 eine gute Balance zwischen Geschwindigkeit und Qualität. Du kannst bei Bedarf zu einem leistungsstärkeren oder schnelleren Modell wechseln; ändere einfach die Modell-ID im Feld model der Anfrage.

Wie halte ich meinen API-Schlüssel sicher?

Halte den Schlüssel in einer .env-Datei, füge sie zu .gitignore hinzu und pushe sie niemals in dein Repo. Wenn der Schlüssel versehentlich durchsickert, widerrufe ihn sofort über die Konsole und erstelle einen neuen.

Möchtest du einen KI-gestützten Bot für deine Discord-Community? Ob Aufbau von Grund auf oder das Hinzufügen von Claude zu deinem bestehenden Bot — lass es uns gemeinsam planen. Nimm Kontakt mit mir auf und lass uns dein Projekt verwirklichen.

Bu kategorideki tüm yazılar →

Devamı için