Chat SDK 테스트 (작성중)
7/8/2026
Vercel의 Chat SDK를 이용한 디코 봇 개발
Chat SDK를 이용해 아루 컨셉의 AI 디코 봇을 만든 경험을 공유합니다.
사용 스택
Chat SDK- 이번에 사용한 봇 개발AI SDK- AI 응답용, 마찬가지로 Vercel에서 개발, 추후 따로 소개 예정Hono- 봇 호스트Postgres- Chat SDK의 여러 어댑터 중 사용하던 Postgres 연결Open Webui- 로컬 모델 설정
주요 코드
프로젝트 구조
│ .env│ .gitignore│ dockerfile│ drizzle.config.ts│ package-lock.json│ package.json│ README.md│ tsconfig.json│├───drizzle│ │ 0000_wise_hitman.sql│ │ relations.ts│ │ schema.ts│ ││ └───meta│ 0000_snapshot.json│ _journal.json│└───src │ index.tsx │ ├───components │ Home.tsx │ ├───lib │ agent.ts │ bot.tsx │ db.ts │ tools.ts │ └───routes ai.ts discord.ts mcp.ts test.ts user.ts봇 세팅
export const bot = new Chat({ userName: "아루", adapters: { discord: createDiscordAdapter(), // slack: createSlackAdapter(), // 다양한 어댑터를 제공하기에 여러 채널 봇을 동시 개발 가능 }, state: createPostgresState({ url: process.env.DATABASE_URL_BLISS }), fallbackStreamingPlaceholderText: "(완벽한 계획을 구상 중...)"});봇 초기화 용 API 전체 코드
import { Hono } from "hono";import { bot } from "../lib/bot.js";
const discord = new Hono()
discord.post('/webhooks', async (c) => { const handler = bot.webhooks['discord'] return handler(c.req.raw)})
discord.get('/gateway', async (c) => { await bot.initialize(); const discord = bot.getAdapter('discord');
if (!discord) { return c.json({ message: 'Discord 어댑터 설정이 되어 있지 않아! 다시 확인해줘!' }, 404); }
const baseUrl = process.env.SITE_URL || 'http://localhost:3000'; const webhookUrl = `${baseUrl}/v1/discord/webhooks`; const durationMs = 60 * 60 * 1000;
// ⚡️ 포인트: await를 제거하거나, 최소한의 검증만 하고 백그라운드로 실행! // Node 환경이므로 굳이 waitUntil 구조를 복잡하게 가져갈 필요 없이 // 그냥 비동기 함수로 실행하고 catch만 잘 해주면 돼. discord.startGatewayListener( { waitUntil: (task) => { task.catch(err => console.error('⚠️ 게이트웨이 작업 중 에러 발생:', err)); }, }, durationMs, undefined, webhookUrl, ).catch(err => console.error('❌ 게이트웨이 시작 실패:', err));
// 유저에게는 즉시 "시작했다!"고 알려주는 게 훨씬 친화적이지! return c.json({ message: '후후, 게이트웨이 연결을 시작했어! 잠시만 기다려줘, 선생님!', status: 'starting' });});
export default discord