디스코드 봇 만들기#9AI(Claude·ChatGPT API) 연동하기! (파이썬 예제)
목차8개 항목
안녕하세요! Mojangcam입니다 😎
지난 #8에서는 임베드(Embed)로 봇의 메시지를 예쁘게 꾸미는 방법을 배웠죠. 이번 편에서는 드디어 많은 분들이 기다리셨을 기능, 봇에 AI를 연동해볼게요! /ai 질문 이렇게 입력하면 Claude나 ChatGPT가 대답해주는 봇을 만듭니다.
서버 멤버들이 자유롭게 AI에게 질문하거나, 서버 규칙 안내·번역·코드 질문 답변 같은 걸 봇 하나로 처리할 수 있어서 활용도가 정말 높아요.

※ 위 이미지는 실제 실행 화면이 아니에요. 아직 API 크레딧을 충전하지 않아 실제 호출 결과 대신 임시로 만든 예시 이미지를 첨부했습니다. 실제 실행 스크린샷은 크레딧 충전 후 교체할게요!
⚠️ 시작 전 한 가지: AI API는 봇이나 라이브러리와 달리 사용량만큼 소액 과금되는 유료 서비스예요. 다만 개인 서버용 봇 수준이면 가벼운 모델 기준 한 달에 몇백 원 수준으로 부담이 적은 편입니다.
📌 준비물
- Python 3.8 이상
- discord.py 2.x
- anthropic 라이브러리 (Claude API용) 또는 openai 라이브러리 (ChatGPT용)
- API 키: Claude는 platform.claude.com에서, ChatGPT는 platform.openai.com에서 발급 (소액 크레딧 충전 필요)
pip install -U discord.py anthropic python-dotenv이번 글은 Claude API 기준으로 진행하고, 마지막에 ChatGPT(OpenAI) 버전도 보여드릴게요.
📌 1단계 - API 키를 .env로 안전하게 보관하기
봇 토큰도 그렇지만, AI API 키는 유료 과금이 연결된 키라 유출되면 진짜 큰일나요. 반드시 .env 파일로 분리합시다.
# .env
DISCORD_TOKEN=봇토큰
ANTHROPIC_API_KEY=sk-ant-...📌 2단계 - /ai 명령어로 Claude 호출하기
import discord
from discord import app_commands
from anthropic import AsyncAnthropic
ai = AsyncAnthropic() # ANTHROPIC_API_KEY 환경변수 자동 인식
@tree.command(name="ai", description="AI에게 질문하기")
async def ai_command(interaction: discord.Interaction, 질문: str):
await interaction.response.defer() # ⭐ 핵심! 아래 설명 참고
result = await ai.messages.create(
model="claude-haiku-4-5",
max_tokens=1000,
system="당신은 디스코드 서버의 친절한 도우미입니다. 간결하게 답하세요.",
messages=[{"role": "user", "content": 질문}],
)
answer = result.content[0].text
await interaction.followup.send(answer[:2000])하나씩 뜯어볼게요 💡
- AsyncAnthropic : discord.py는 비동기(async)로 동작하므로 반드시 비동기 클라이언트를 써야 해요. 그냥
Anthropic()을 쓰면 AI가 답하는 동안 봇 전체가 멈춥니다! - defer() : 디스코드는 슬래시 명령어에 3초 안에 응답하지 않으면 실패 처리해요. AI 응답은 보통 3초를 넘기 때문에 "생각 중..." 상태로 미루는 defer가 필수예요
- model : 예제는 빠르고 저렴한 claude-haiku-4-5를 썼어요. 더 똑똑한 답이 필요하면 claude-sonnet-5로 바꾸면 됩니다 (요금은 올라가요)
- system : 봇의 성격·역할을 정하는 부분. 서버 컨셉에 맞게 마음껏 바꿔보세요
- [:2000] : 디스코드 메시지는 최대 2,000자라 잘라서 보내야 에러가 안 나요
📌 3단계 - 대화 기억하게 만들기 (선택)
위 코드는 매번 새 대화라 직전 질문을 기억하지 못해요. 채널별로 최근 대화 10개를 기억하게 해볼게요.
from collections import defaultdict
history = defaultdict(list) # 채널 ID별 대화 기록
async def ask_ai(channel_id: int, 질문: str) -> str:
history[channel_id].append({"role": "user", "content": 질문})
result = await ai.messages.create(
model="claude-haiku-4-5",
max_tokens=1000,
system="당신은 디스코드 서버의 친절한 도우미입니다.",
messages=history[channel_id][-10:], # 최근 10개만 전달
)
answer = result.content[0].text
history[channel_id].append({"role": "assistant", "content": answer})
return answer하나씩 뜯어볼게요 💡
- history[channel_id][-10:] : 대화 전체를 다 보내면 토큰 요금이 계속 늘어나요. 최근 10개로 자르는 게 요금 절약 포인트!
- assistant 역할 저장 : AI의 답변도 기록에 넣어야 "아까 말한 거 말이야" 같은 이어지는 대화가 됩니다
📌 전체 코드 (복붙 OK)
# discord.py 2.x / anthropic 최신 / Python 3.8+
import os
import discord
from discord import app_commands
from collections import defaultdict
from anthropic import AsyncAnthropic
from dotenv import load_dotenv
load_dotenv()
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
ai = AsyncAnthropic()
history = defaultdict(list)
@client.event
async def on_ready():
await tree.sync()
print(f"{client.user} 로그인 완료!")
@tree.command(name="ai", description="AI에게 질문하기")
async def ai_command(interaction: discord.Interaction, 질문: str):
await interaction.response.defer()
try:
history[interaction.channel_id].append({"role": "user", "content": 질문})
result = await ai.messages.create(
model="claude-haiku-4-5",
max_tokens=1000,
system="당신은 디스코드 서버의 친절한 도우미입니다. 간결하게 답하세요.",
messages=history[interaction.channel_id][-10:],
)
answer = result.content[0].text
history[interaction.channel_id].append({"role": "assistant", "content": answer})
await interaction.followup.send(answer[:2000])
except Exception as e:
await interaction.followup.send(f"⚠️ 오류가 났어요: {e}")
client.run(os.getenv("DISCORD_TOKEN"))💡 ChatGPT(OpenAI)로 하고 싶다면? 호출 부분만 이렇게 바꾸면 돼요 (pip install openai, 환경변수 OPENAI_API_KEY).
from openai import AsyncOpenAI
ai = AsyncOpenAI()
result = await ai.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "system", "content": "친절한 도우미입니다."},
{"role": "user", "content": 질문}],
)
answer = result.choices[0].message.contentOpenAI는 system 메시지도 messages 안에 넣는다는 점만 다르고 구조는 거의 같아요.
📌 실행 결과
봇을 실행하고 서버에서 /ai 파이썬이 뭐야? 라고 입력하면, 잠시 "생각 중..." 표시가 떴다가 AI의 답변이 채널에 올라옵니다. 같은 채널에서 이어서 질문하면 앞 대화를 기억하고 답해요!

※ 이 대화 이미지 역시 API 비용 문제로 임시 제작한 예시 이미지입니다. (실제 실행 화면 아님)
📌 자주 나는 에러
- 404 Not Found 또는 Unknown interaction — 원인: 3초 안에 응답하지 않고 바로
response.send_message를 호출한 경우. 해결: 반드시defer()먼저 →followup.send()로 답장하세요 - authentication_error (401) — 원인: API 키 오타·누락·만료. 해결:
.env의 키를 다시 확인하고, 콘솔에서 크레딧 잔액도 확인하세요 - HTTPException: Must be 2000 or fewer in length — 원인: AI 답변이 2,000자를 넘음. 해결: 예제처럼
[:2000]으로 자르거나, 길면 여러 메시지로 나눠 보내세요 - rate_limit_error (429) — 원인: 짧은 시간에 요청이 몰림. 해결: 명령어에 쿨다운을 걸어주면 좋아요 — 쿨다운 구현은 다음 편에서 다룹니다!
📌 마무리
오늘은 봇에 Claude·ChatGPT API를 연동해서 진짜 "AI 봇"을 만들어봤어요. defer로 3초 제한을 피하고, 채널별 대화 기억까지 넣으면 사용 감이 확 살아납니다. 다음 편에서는 AI 명령어 남용을 막는 쿨다운과 권한 관리를 다뤄볼게요. 기대해주세요 🙌
📚 디스코드 봇 만들기 시리즈
- #1 ~ #4 기초 편
- #5 버튼(Button) 상호작용
- #6 드롭다운(Select Menu)
- #7 모달(Modal)로 입력 받기
- #8 임베드(Embed) 이미지·필드 꾸미기
- #9 AI(Claude·ChatGPT API) 연동하기 ← 지금 이 글!
- 번외: 24시간 무료 호스팅 총정리
연재 · 32편 중 9번째
디스코드 봇 만들기
- #1디스코드 봇 만들기 - Slash Command 완전 정복!
- #2Slash Command에 옵션(Arguments) 추가하기!
- #3Slash Command에 서브 커맨드(Subcommand) 넣기!
- #4Slash Command로 임베드 전송하기!
- #5버튼(Button) 상호작용 구현하기!
- #6드롭다운(Select Menu) 메뉴 구현하기!
- #7모달(Modal)로 입력 받기 구현하기 (파이썬 예제)
- #8임베드(Embed) 이미지·필드로 꾸미기 (파이썬 예제)
- #9AI(Claude·ChatGPT API) 연동하기! (파이썬 예제)지금 읽는 글
- #10다국어(i18n) 지원하기! (파이썬 예제)
- #11플라스크(Flask)로 웹 대시보드 만들기! (파이썬 예제)
- #12명령어 쿨다운(Cooldown)·권한(Permission) 관리하기! (파이썬 예제)
- #13역할·채널 자동화로 서버 관리하기! (파이썬 예제)
- #14데이터 저장하기! JSON vs SQLite (파이썬 예제)
- #15슬래시 명령어 그룹(Group)으로 명령어 정리하기! (파이썬 예제)
- #16리마인더·알림 기능 만들기! 봇이 먼저 말 걸게 하기 (파이썬 예제)
- #17RAG로 문서 기반 답변봇 만들기! 우리 서버 전용 FAQ 봇 (파이썬 예제)
- #18투표(Poll) 기능 만들기! 다수결로 정하는 서버 규칙 (파이썬 예제)
- #19Cog로 코드 쪼개기! 1000줄 봇도 안 더러워지는 구조 (파이썬 예제)
- #20자동 환영 메시지·온보딩 만들기! 규칙 동의 버튼으로 자동 역할 부여 (파이썬 예제)
- #21키워드 자동응답·금지어 필터 만들기! 경고 누적으로 자동 제재까지 (파이썬 예제)
- #22슬래시 명령어 자동완성(Autocomplete) 만들기! 금지어를 골라서 추가·삭제 (파이썬 예제)
- #23aiosqlite로 비동기 DB 제대로 설계하기! JSON 탈출 (파이썬 예제)
- #24채널 난독화(Channel Obfuscation) 대응하기! 11/16부터 안 보이는 채널이 생겨요 (파이썬 예제)
- #25봇이 죽지 않게! 에러 핸들링·로깅 체계 잡기 (파이썬 예제)
- #26티켓(Ticket) 문의 시스템 만들기! 버튼 하나로 1:1 상담 채널 자동 생성 (파이썬 예제)
- #27티켓 담당자 배정·우선순위 만들기! 스태프가 여러 명이어도 안 꼬이게 (파이썬 예제)
- #28레벨·경험치(XP) 시스템 만들기! 채팅할수록 레벨업, 랭킹판까지 (파이썬 예제)
- #29화폐·상점(Economy) 시스템 만들기! 코인 벌어서 아이템 사기 (파이썬 예제)
- #30투표·설문(Poll) 봇 만들기! 네이티브 투표 + 버튼으로 실시간 집계까지 (파이썬 예제) 🗳️
- #32서버 로그·감사(Audit Log) 채널 만들기! 메시지 삭제·수정·입퇴장·추방까지 자동 기록 (파이썬 예제) 🕵️
- #33임시 음성방 확장, 파티방 만들기! 방장 위임·강퇴·초대 전용(비공개) 방 + 전용 채팅방 자동 생성 (파이썬 예제) 🎉
