๋ฌ๋ ์คํฐ๋ ์ปค๋ฎค๋ํฐ๋ฅผ ์ํ AI ์ฑ๋ด ์๋น์ค์ ๋๋ค.
dalestudy-chatbot/
โโโ frontend/ # React + TypeScript + Vite
โโโ backend/ # Cloudflare Worker (API + ํ๋ก ํธ์๋ ์ ์ ํ์ผ ์๋น)
โโโ data/ # JSON ๋ฐ์ดํฐ ํ์ผ
โโโ PLAN.md # ํ๋ก์ ํธ ๊ณํ์
โโโ README.md # ์ด ํ์ผ
- Node.js 22+
- AI Gateway ํ ํฐ (
backend/.dev.vars์AI_GATEWAY_TOKEN=...)
cd backend
npm install
npm run devwrangler dev๊ฐ ํ๋ก ํธ์๋๋ฅผ ๋น๋ํ ๋ค http://localhost:8787 ์์ API์ ํ๋ฉด์ ํจ๊ป ์๋นํฉ๋๋ค.
cd frontend
npm install
npm run devhttp://localhost:3000 ์์ ์คํ๋๊ณ , /api ์์ฒญ์ 8787 ํฌํธ์ Worker๋ก ํ๋ก์๋ฉ๋๋ค.
src/components/ChatInterface.tsx- ๋ฉ์ธ ์ฑํ ์ธํฐํ์ด์คsrc/components/MessageList.tsx- ๋ฉ์์ง ๋ฆฌ์คํธ ์ปดํฌ๋ํธsrc/components/ChatInput.tsx- ๋ฉ์์ง ์ ๋ ฅ ์ปดํฌ๋ํธsrc/api/index.ts- API ํธ์ถ ํจ์๋คsrc/types/index.ts- TypeScript ํ์ ์ ์
src/index.ts- Worker ์ง์ ์ (/health,/api/chat,/api/search)src/chat.ts- ์ฑํ ์ฒ๋ฆฌ (์ง๋ฌธ ๋ถ๋ฅ โ ๊ฒ์ โ ๋ต๋ณ ์์ฑ)src/services/llmService.ts- AI Gateway ๊ฒฝ์ OpenAI ํธ์ถsrc/services/searchService.ts- Fuse.js ๊ฒ์ ์๋น์คsrc/utils/dataLoader.ts- JSON ๋ฐ์ดํฐ ๋ก๋src/types/index.ts- TypeScript ํ์ ์ ์
data/study-projects.json- ์คํฐ๋ ํ๋ก์ ํธ ๋ฐ FAQ ๋ฐ์ดํฐ
npm run dev # ๋ก์ปฌ Worker ์คํ (wrangler dev)
npm run deploy # Cloudflare์ ๋ฐฐํฌ (wrangler deploy)
npm run typecheck # ํ์
์ฒดํฌ
npm run lint # ESLint ์คํnpm run dev # ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run build # ํ๋ก๋์
๋น๋
npm run preview # ๋น๋๋ ํ์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
npm run lint # ESLint ์คํ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ AI ์๋ต์ ๋ฐํํฉ๋๋ค.
Request:
{
"message": "๋ฌ๋ ์คํฐ๋์ ์ด๋ป๊ฒ ์ฐธ์ฌํ๋์?"
}Response:
{
"message": "์น์ฌ์ดํธ์์ ๊ด์ฌ ์๋ ์คํฐ๋๋ฅผ ์ ํํ๊ณ ...",
"sources": [...]
}ํค์๋๋ก ์คํฐ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
Request:
GET /api/search?q=React ์คํฐ๋
Response:
{
"query": "React ์คํฐ๋",
"category": "study",
"results": [...]
}chat.dalestudy.com์ Cloudflare dalestudy ๊ณ์ ์ Worker chat์ผ๋ก ๋ฐฐํฌ๋ฉ๋๋ค. main์ pushํ๋ฉด GitHub Actions๊ฐ ํ๋ก ํธ์๋ ๋น๋์ ํจ๊ป ๋ฐฐํฌํฉ๋๋ค. OpenAI ํธ์ถ์ AI Gateway๋ฅผ ๊ฑฐ์น๋ฉฐ, Worker secret AI_GATEWAY_TOKEN์ ๊ฐ์ ์ด๋ฆ์ org secret์์ ๋ฐฐํฌํ ๋ ๋ฃ์ต๋๋ค.
MIT License