λΉμ μ ν΅μ°°μ AIμ λ κ°λ₯Ό λ¬μμ£Όλ 컨ν μΈ κΈ°ν ννΈλ
κ°μΈ μ νλ²(μ 보/μ§μν)κ° λ νΌλ°μ€ ꡬ쑰μ μμ μ κ΄μ μ μμ΄ μ΄¬μ κ°λ₯ν 2-Column λλ³Έμ λΉ λ₯΄κ² λ§λλ μΉ μ ν리μΌμ΄μ μ λλ€.
ν΅μ¬ μ±κ³΅ μ§ν: μ μμκ° λ¨μΆ (κΈ°νβμ΄μ: 30λΆ β 10λΆ)
- π― λ νΌλ°μ€ ꡬ쑰 + λ΄ κ΄μ κ²°ν©: κ²μ¦λ ꡬ쑰μ λλ§μ μ½ν μΈ λ₯Ό λ΄μ λ μ°½μ± ν보
- π μΈμ¬μ΄νΈ μΉ΄λ μμ€ν : μ±κ³΅ ν¨ν΄μ μΉ΄λλ‘ μΆμΆν΄ μ νμ μΌλ‘ μ μ©
- π 2-Column μ€ν¬λ¦½νΈ: Visual(νλ©΄/μλ§) + Audio(λ΄λ μ΄μ ) νμμΌλ‘ μ¦μ 촬μ κ°λ₯
- π LLM Provider κ΅μ²΄ κ°λ₯: OpenAI/Anthropic μμ μ ν
- π€ μ¦μ Export: Markdown λ€μ΄λ‘λ + ν΄λ¦½λ³΄λ 볡μ¬
./setup.shμ€μΉ ν:
server/.envνμΌμ API ν€ μ λ ₯- ν°λ―Έλ 1:
cd server && npm run start:dev - ν°λ―Έλ 2:
cd web && npm run dev - λΈλΌμ°μ :
http://localhost:5173
1. λ°±μλ μ€μ
cd server
npm install
cp .env.example .env
# .env νμΌμ OPENAI_API_KEY, ANTHROPIC_API_KEY μ
λ ₯
npx prisma generate
npx prisma migrate dev --name init
npm run start:dev # http://localhost:30002. νλ‘ νΈμλ μ€μ
cd web
npm install
npm run dev # http://localhost:5173contentsInsightAi/
βββ server/ # NestJS λ°±μλ
β βββ src/
β β βββ prisma/ # DB μ°κ²° (SQLite)
β β βββ llm/ # LLM Provider (OpenAI/Anthropic)
β β βββ project/ # νλ‘μ νΈ CRUD
β β βββ generate/ # λΆμ/λλ³Έ μμ± λ‘μ§
β β βββ metrics/ # μ±κ³Ό μΈ‘μ
β βββ prisma/schema.prisma
β βββ public/ # Vue λΉλ κ²°κ³Όλ¬Ό (λ°°ν¬ μ)
β
βββ web/ # Vue 3 νλ‘ νΈμλ
β βββ src/
β β βββ views/ # ProjectList, Workspace
β β βββ api/ # API ν΄λΌμ΄μΈνΈ
β β βββ router/
β βββ dist/ # λΉλ μ°μΆλ¬Ό
β
βββ setup.sh # μλ μ€μΉ μ€ν¬λ¦½νΈ
βββ DEVELOPMENT.md # κ°λ°μμ© κ°μ΄λ
βββ FEATURES.md # PM/κΈ°νμμ© κΈ°λ₯ λͺ
μΈ
βββ README.md
- νλ‘μ νΈ μμ±/μ΄κΈ°/μμ
- μ΅κ·Ό μμ μ μ λ ¬
- μμ± νμ νμ
- μ λ ₯: λ νΌλ°μ€ ν μ€νΈ + λ΄ λ©λͺ¨
- μΆλ ₯: ꡬ쑰(Hook/Body/Turn/Conclusion) + μΈμ¬μ΄νΈ μΉ΄λ(5~10κ°)
- νμ©: μΉ΄λ μ ν/ν΄μ λ‘ λλ³Έμ λ°μ
- μ€μ : ν€μ€λ§€λ(3μ’ ) / ννΉ μ€νμΌ(3μ’ ) / λͺ©ν κΈΈμ΄(3/6/10λΆ)
- μΆλ ₯: μ λͺ© ν보(5κ°) + μΈλ€μΌ 컨μ (3κ°) + 2-Column μ€ν¬λ¦½νΈ
- νμ: Visual(νλ©΄/μλ§) | Audio(λ΄λ μ΄μ )
- μ€ν¬λ¦½νΈ ν μ ν β "λ μ§§κ² / λ μκ·Ήμ μΌλ‘ / μ λ¨Έ μΆκ°"
- μμ κ²°κ³Ό νμΈ ν μ μ©/μ·¨μ
- Markdown λ€μ΄λ‘λ: 2-Column ν νμ μ μ§
- ν΄λ¦½λ³΄λ 볡μ¬: μ¦μ λ€λ₯Έ λκ΅¬λ‘ μ΄λ κ°λ₯
- NestJS (TypeScript)
- Prisma + SQLite (β Postgres μ ν κ°λ₯)
- OpenAI API (GPT-4o-mini)
- Anthropic API (Claude-3.5-Sonnet)
- Vue 3 (Composition API)
- Vite (λΉλ λꡬ)
- Axios (HTTP ν΄λΌμ΄μΈνΈ)
- Vue Router (λΌμ°ν )
- λ¨μΌ λ°°ν¬: NestJSκ° Vue λΉλ κ²°κ³Όλ¬Ό μλΉ (μ΄κΈ°)
- λΆλ¦¬ κ°λ₯: API κ²½κ³ λͺ νν μ€κ³ (λμ€μ νλ‘ νΈ/λ°± λΆλ¦¬ λ°°ν¬ μ©μ΄)
- λΆμ μμ± μκ° (
generationTimeMs) - λλ³Έ μμ± μκ°
- μ¬μμ± νμ
- ν ν° μ¬μ©λ (
tokensUsed)
# νλ‘μ νΈλ³ λ©νΈλ¦
GET /api/metrics/project/:id
# μ 체 λ©νΈλ¦
GET /api/metrics/summary# 1. Vue λΉλ β server/public/λ‘ λ³΅μ¬
cd web
npm run build:deploy
# 2. NestJS λΉλ λ° μ€ν
cd ../server
npm run build
npm run start:prodβ http://localhost:3000 (API + μΉ λͺ¨λ μλΉ)
PORT=3000
NODE_ENV=production
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
DATABASE_URL="file:./prod.db" # λλ Postgres URL- NestJS + Vue λ¨μΌ λ°°ν¬ κ΅¬μ‘°
- SQLite + Prisma λ°μ΄ν° λͺ¨λΈ
- OpenAI/Anthropic LLM Provider
- λΆμ API (μΈμ¬μ΄νΈ μΉ΄λ)
- λλ³Έ μμ± API (2-Column)
- 3λΆν Workspace UI
- 리ν°μΉ κΈ°λ₯
- Markdown Export
- μ±κ³Ό μΈ‘μ λ‘κΉ
- μμ± νμ€ν 리/λ²μ λΉκ΅
- ν리μ νμ§ κ³ λν (ν둬ννΈ νλ)
- PDF Export
- Progressive disclosure UX
- μ λ ₯ κ°μ΄λ (κΈμμ/νμ§)
- μ νλΈ URL μλ μλ§ μΆμΆ (μ μ± /리μ€ν¬ κ²ν ν)
- μΈλ€μΌ μ΄λ―Έμ§ μμ± (DALL-E/Midjourney μ°λ)
- μ±λλ³ λ§μΆ€ν RAG (μ¬μ©μ μ±λ νμ΅)
- μΌμΈ λ³ν (κΈ΄ μμ β 1λΆ μΌμΈ λλ³Έ)
- νμ κΈ°λ₯ (곡μ /μ½λ©νΈ)
- DEVELOPMENT.md: κ°λ°μμ© μμΈ κ°μ΄λ (DB μ€ν€λ§, API, νμ₯ λ°©λ²)
- FEATURES.md: PM/κΈ°νμμ© κΈ°λ₯ λͺ μΈ (νλ©΄λ³ κΈ°λ₯, νμ₯ ν¬μΈνΈ)
μ΄ νλ‘μ νΈλ MVP λ¨κ³μ λλ€. νΌλλ°±/μ΄μ/PR νμν©λλ€!
MIT
- νλΌμ΄λ²μ: μ¬μ©μ μ λ ₯ ν μ€νΈλ μμ± λͺ©μ μΌλ‘λ§ μ¬μ© (LLM λͺ¨λΈ νμ΅ X)
- μ μκΆ: λ νΌλ°μ€λ ꡬ쑰/μ κ° μ°Έκ³ μ©, λ¬Έμ₯ 볡μ μ§μ (ν둬ννΈμ λͺ μ)
λ¬Έμ: μ΄μ ν λλ PRλ‘ μ°λ½ μ£ΌμΈμ.