Slack κΈ°λ° AI λ―Έν μ΄μμ€ν΄νΈ. λ―Έν μ μ (Before) Β· μ€(During) Β· ν(After) μ λ¨κ³λ₯Ό μλνν©λλ€.
Before Agent β During Agent β After Agent
μ
체/μΈλ¬Ό 리μμΉ νΈλμ€ν¬λ¦½νΈ μμ§ νμλ‘ μΈλΆ λ°μ‘
λΈλ¦¬ν μμ± μλ λ
ΈνΈ μΈμ
μ‘μ
μμ΄ν
μλ¦Ό
λ―Έν
μμ±/μμ½ λ΄λΆΒ·μΈλΆ νμλ‘ Contacts μλ κ°±μ
| λ¨κ³ | κΈ°λ₯ |
|---|---|
| Before | μΈλΆ λ―Έν μλ κ°μ§ β λ―Έν ν€λ μ¦μ λ°μ‘ β μ 체·μΈλ¬Ό 리μμΉ λ°±κ·ΈλΌμ΄λ μμ°¨ λ°μ‘ |
| Before | μμ°μ΄ λ―Έν
μμ± (λ΄μΌ μ€μ 10μ KISA λ―Έν
μ‘μμ€) + μ€λ λ λ΅κΈλ‘ μ
체λͺ
Β·μ₯μ λ± μμ |
| Before | λͺ ν¨ DM μ λ‘λ β Claude Vision OCR β Contacts μλ λ±λ‘ |
| During | Google Meet νΈλμ€ν¬λ¦½νΈ μλ ν΄λ§ (10λΆ μ£ΌκΈ°) + λ¦κ² λμ°© μ νμλ‘ μλ λ³΄κ° |
| During | Slack μλ λ
ΈνΈ μΈμ
(/λ―Έν
μμ, /λ©λͺ¨, /λ―Έν
μ’
λ£) |
| During | μμ± νμΌ μ λ‘λ β Deepgram STT β λ©λͺ¨ μλ λ±λ‘ |
| During | ν μ€νΈ λ¬Έμ μ λ‘λ (TXT, MD, PDF, DOCX λ±) β μΈμ μ€μ λ©λͺ¨ μΆκ°, μΈμ μμ΄ μ λ‘λ μ νΈλμ€ν¬λ¦½νΈλ‘ κ°μ£Όν΄ νμλ‘ μ΄μ μ¦μ μμ± (μΊλ¦°λ μλ λ―Έν λ μ§μ) |
| After | λ΄λΆμ©Β·μΈλΆμ© νμλ‘ μ΄μ κ²ν /νΈμ§ ν Drive μ μ₯ |
| After | μΈλΆμ© νμλ‘ Gmail λ°μ‘ (μ¬μ©μ μΉμΈ ν) |
| After | μ‘μ μμ΄ν μΆμΆ β λ΄λΉμ DM β λ§€μΌ 08:00 리λ§μΈλ |
| κ²μ | νμλ‘ κ²μ (μ 체λͺ Β·νμλͺ Β·λ μ§ β μμ°μ΄ μ§μ: "μ§λ λͺ©μμΌ", "4μ 13μΌ", "μ§λλ¬") |
| λ©λͺ¨ | μ
체 λ©λͺ¨ μ μ₯ (μΉ΄μΉ΄μ€ λ©λͺ¨ β PoC μμ° ν보) β Drive μ
체 Wiki νμΌμ κΈ°λ‘ |
| μ μμ | νμ κΈ°λ° μ μμ κ°μΒ·μ΄μ μμ± (μ€λ λμμ μμ κ°λ₯) |
| Feedback | μ¬μ©μ νΌλλ°± (κΈ°λ₯ μμ²Β·κ°μ Β·λ²κ·Έ) μμ§ β λ§€μΌ 22:00 κ΄λ¦¬μ λ€μ΄μ μ€νΈ λ°μ‘ |
| Trello μ£Όκ° λ³΄κ³ μ | λ§€μ£Ό κΈ 21:00 μν¬μ€νμ΄μ€ μ 보λ λ³κ²½μ¬ν μ§κ³ β Google Docs μλ³Έ + Slack μμ½ λ°μ‘ |
| νλͺ© | λ΄μ© |
|---|---|
| LLM | Claude claude-haiku-4-5 (κΈ°λ³Έ / λͺ
ν¨ OCR) + claude-sonnet-4-5 (νμλ‘ μμ±Β·μμ , μ μμ) |
| STT | Deepgram REST API (nova-2 λͺ¨λΈ, νκ΅μ΄) |
| μΈν°νμ΄μ€ | Slack Bolt (Socket Mode) |
| Google μ°λ | Calendar Β· Drive Β· Gmail Β· Docs Β· Meet API |
| μ€μΌμ€λ¬ | APScheduler (λΈλ¦¬ν 09:00, νΈλμ€ν¬λ¦½νΈ ν΄λ§ 10λΆ, 리λ§μΈλ 08:00, νΌλλ°± λ€μ΄μ μ€νΈ 22:00, Trello μ£Όκ° λ³΄κ³ μ κΈ 21:00) |
| μ μ₯μ | SQLite + Fernet μνΈν (μ¬μ©μ ν ν°), Google Drive (Contacts Β· νμλ‘) |
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt.env νμΌ μμ±:
# Slack
SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-...
# LLM
GOOGLE_API_KEY=...
ANTHROPIC_API_KEY=...
# STT
DEEPGRAM_API_KEY=...
# Google OAuth
OAUTH_CALLBACK_URL=https://your-domain.com/oauth/callback
# μνΈν ν€ (Fernet)
ENCRYPTION_KEY=...
# λ΄λΆ λλ©μΈ (μΌν ꡬλΆ)
INTERNAL_DOMAINS=parametacorp.com,iconloop.com
# νΌλλ°± λ€μ΄μ μ€νΈ λ°μ‘ μ±λ (Slack μ±λ ID λλ κ΄λ¦¬μ μ¬μ©μ ID)
FEEDBACK_CHANNEL=C0123456789
# Trello μ£Όκ° λ³΄κ³ μ μ€μ (μ ν)
# - TRELLO_WORKSPACE: λμ μν¬μ€νμ΄μ€ μ΄λ¦/displayName (κΈ°λ³Έ CorpDev_BS)
# - TRELLO_REPORT_CHANNEL: λ³΄κ³ μ λ°μ‘ Slack μ±λ (λ―Έμ€μ μ FEEDBACK_CHANNEL μ¬μ©)
# - TRELLO_REPORT_USER_ID: DriveΒ·Trello ν ν°μ μ¬μ©ν Slack user_id (λ―Έμ€μ μ μλ μ ν)
# - TRELLO_REPORT_FOLDER_NAME: Drive μ μ₯ ν΄λλͺ
(κΈ°λ³Έ "Trello μ£Όκ° λ³΄κ³ μ")
TRELLO_WORKSPACE=CorpDev_BS
TRELLO_REPORT_CHANNEL=C0123456789
# ParaScope μ°λ (μ ν)
PARASCOPE_BOT_ID=...
PARASCOPE_BOT_APP_ID=...
PARASCOPE_CHANNEL_ID=...bash start.sh
start.shλ κΈ°μ‘΄ νλ‘μΈμ€λ₯Ό μ’ λ£νκ³ λ¨μΌ μΈμ€ν΄μ€λ‘ μ€νν©λλ€.
Google κ³μ μ°λ (νμ)
/λ±λ‘
Google OAuth μΈμ¦ ν Drive ν΄λ μλ μμ±. λΈλ¦¬νΒ·λ―Έν μμ±Β·νμλ‘ λ± ν΅μ¬ κΈ°λ₯μ νμν©λλ€.
Trello μ°λ (μ ν β νμ΄νλΌμΈ κ΄λ¦¬ μ νμ)
/trello
Slack DMμΌλ‘ μ μ‘λλ μΈμ¦ λ§ν¬λ₯Ό ν΄λ¦νμ¬ Trello κ³μ μ μ°κ²°ν©λλ€. μ°λ μ λΈλ¦¬νμ μ μ²΄λ³ Trello μΉ΄λ 컨ν μ€νΈκ° ν¬ν¨λκ³ , νμλ‘ μλ£ ν μ‘μ μμ΄ν μ Trelloμ λ±λ‘ν μ μμ΅λλ€.
λλ¦Όνλ¬μ€ κ³μ λ±λ‘ (μ ν β νμμ€ μμ½ μ νμ)
/λλ¦Όνλ¬μ€
λλ¦Όνλ¬μ€ νμμ€ μμ½Β·μ‘°νΒ·μ·¨μ λ° ν¬λ λ§ κ΄λ¦¬ κΈ°λ₯μ μ¬μ©νλ €λ©΄ λλ¦Όνλ¬μ€ κ³μ μ 보λ₯Ό λ±λ‘ν΄μΌ ν©λλ€.
- api.slack.com/apps μ μ β Create New App β From scratch
- App Name μ λ ₯, μν¬μ€νμ΄μ€ μ ν ν μμ±
Bot Token (SLACK_BOT_TOKEN)
- μ’μΈ‘ λ©λ΄ OAuth & Permissions μ΄λ
- Bot Token Scopes μμ μλ κΆν μΆκ°:
app_mentions:read
channels:history
chat:write
commands
files:read
groups:history
im:history
im:read
im:write
users:read
- Install to Workspace β μ€μΉ μλ£ ν
Bot User OAuth Tokenλ³΅μ¬ βSLACK_BOT_TOKEN
App Token (SLACK_APP_TOKEN)
- μ’μΈ‘ λ©λ΄ Basic Information β App-Level Tokens β Generate Token
- Token Name μ
λ ₯, Scopeμ
connections:writeμΆκ° β μμ± - μμ±λ
xapp-...ν ν° λ³΅μ¬ βSLACK_APP_TOKEN
Socket Mode νμ±ν
- μ’μΈ‘ λ©λ΄ Socket Mode β Enable Socket Mode μΌκΈ°
Event Subscriptions μ€μ
- μ’μΈ‘ λ©λ΄ Event Subscriptions β Enable Events μΌκΈ°
- Subscribe to bot events μ μΆκ°:
app_mention,message.im
Interactivity μ€μ
- μ’μΈ‘ λ©λ΄ Interactivity & Shortcuts β Interactivity μΌκΈ°
Socket Modeμμλ Event/Interactivityμ Request URL μ λ ₯μ΄ λΆνμν©λλ€.
Slash Commands λ±λ‘
- μ’μΈ‘ λ©λ΄ Slash Commands β Create New Command λ‘ μλ μ¬λμ 컀맨λ μΉμ μ 컀맨λλ₯Ό λͺ¨λ λ±λ‘
Google OAuth μ½λ°±μ λ‘컬μμ λ°μΌλ €λ©΄ μΈλΆμμ μ κ·Ό κ°λ₯ν URLμ΄ νμν©λλ€.
# ngrok μ€μΉ (macOS)
brew install ngrok
# μΈμ¦ (https://ngrok.com μμ ν ν° λ°κΈ)
ngrok config add-authtoken <your-authtoken>
# ν¬νΈ 8000 ν¬μλ© (OAuth μλ² κΈ°λ³Έ ν¬νΈ)
ngrok http 8000ngrok μ€ν ν μΆλ ₯λλ https://xxxx-xxx.ngrok-free.app μ£Όμλ₯Ό .envμ μ€μ ν©λλ€:
OAUTH_CALLBACK_URL=https://xxxx-xxx.ngrok-free.app/oauth/callbackλ¬΄λ£ νλμ μΈμ μ’ λ£ μ URLμ΄ λ³κ²½λ©λλ€. μ¬μ€ν ν
.envμ Google Cloud Consoleμ 리λ€μ΄λ νΈ URIλ₯Ό ν¨κ» μ λ°μ΄νΈν΄μΌ ν©λλ€.
κ°λ° νκ²½(ngrok)μ΄ μλ μμ μ΄μ μλ²μ λ°°ν¬νλ λ°©λ²μ λλ€.
μ μ 쑰건
- Ubuntu VPS (Python 3.10+)
- λλ©μΈ + Cloudflare νλ‘μ μ€μ μλ£
ν¬νΈ μꡬμ¬ν
Socket Modeλ μμλ°μ΄λ WebSocketλ§ μ¬μ©νλ―λ‘ Slack ν΅μ μλ μΈλ°μ΄λ ν¬νΈκ° νμ μμ΅λλ€. Google OAuth μ½λ°±μ© FastAPI μλ²(8000 ν¬νΈ)λ§ μΈλΆ μ κ·Όμ΄ νμνλ©°, Cloudflare Origin Rulesλ‘ μ²λ¦¬ν©λλ€.
κ°λ°μ© vs λΌμ΄λΈμ© Slack μ±
λΌμ΄λΈ μλ²μ© Slack μ±μ λ³λλ‘ μμ±ν΄μΌ ν©λλ€. Socket Modeλ νλμ μ± ν ν°μΌλ‘ νλμ μ°κ²°λ§ μ μ§νλ―λ‘, λμΌ μ±μ λ‘컬과 μλ²μμ λμμ μ€ννλ©΄ μ΄λ²€νΈκ° λλ€μΌλ‘ λΆλ°°λ©λλ€. Slack ν ν°λ§ λΆλ¦¬νκ³ Google/Trello/LLM ν€λ λμΌνκ² μ¬μ©ν μ μμ΅λλ€. μν¬μ€νμ΄μ€κ° λ€λ₯΄λ©΄ μ± μ΄λ¦Β·μ¬λμ 컀맨λ λͺ¨λ λμΌν΄λ μΆ©λ μμ΅λλ€.
1. μλ² νκ²½ μ€μ
# μμ€ν
ν¨ν€μ§ μ€μΉ
sudo apt update
sudo apt install python3.11 python3.11-venv python3.11-dev libffi-dev build-essential -y
# μ½λ λ°°ν¬
git clone <repo-url> ~/workspace/meeting-agent
cd ~/workspace/meeting-agent
# venv μμ± λ° μμ‘΄μ± μ€μΉ
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
libffi-dev,python3.11-dev,build-essentialμcffi/cryptographyλ€μ΄ν°λΈ λΉλμ νμν©λλ€.
2. Slack μ± μμ± (λΌμ΄λΈμ©)
api.slack.com/apps β Create New App β From scratch μΌλ‘ λΌμ΄λΈ μ μ© μ±μ μμ±ν©λλ€.
μ€μ νλͺ©:
-
Socket Mode β Enable Socket Mode β ν ν° μμ± (
xapp-...) βSLACK_APP_TOKEN -
OAuth & Permissions β Bot Token Scopes μΆκ° ν Install β
SLACK_BOT_TOKENapp_mentions:read, channels:history, chat:write, commands, files:read, files:write, groups:history, im:history, im:read, im:write, users:read, users:read.email, users.profile:read -
Event Subscriptions β Enable Events β Subscribe to bot events:
app_mention,message.im -
Interactivity & Shortcuts β Interactivity μΌκΈ°
-
Slash Commands β μ¬λμ 컀맨λ μΉμ μ 컀맨λλ₯Ό λͺ¨λ λ±λ‘ (Socket Modeμμλ Request URL λΆνμ)
3. νκ²½ λ³μ μ€μ
λΉ λ₯Έ μμ > νκ²½ λ³μ μ€μ κ³Ό λμΌν .env νμΌμ μμ±νλ, μλ νλͺ©μ λΌμ΄λΈ νκ²½μ λ§κ² λ³κ²½ν©λλ€:
# λΌμ΄λΈμ© Slack μ± ν ν°μΌλ‘ κ΅μ²΄
SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-...
# λΌμ΄λΈ λλ©μΈμΌλ‘ λ³κ²½
OAUTH_CALLBACK_URL=https://meeting.yourdomain.com/oauth/callback
# Trello μ°λ μ μΆκ°
TRELLO_API_KEY=...
TRELLO_BOARD_ID=...
# Trello μ£Όκ° λ³΄κ³ μ (μ ν β λ―Έμ€μ μ FEEDBACK_CHANNEL·첫 ν ν° λ³΄μ μλ‘ ν΄λ°±)
TRELLO_WORKSPACE=CorpDev_BS
TRELLO_REPORT_CHANNEL=C0123456789
TRELLO_REPORT_USER_ID=U01234567894. Google Cloud Console μ€μ
κ°λ°μ©κ³Ό λμΌν Google Cloud νλ‘μ νΈλ₯Ό μ¬μ©ν©λλ€.
console.cloud.google.com β APIs & Services β Credentials β OAuth 2.0 Client β Authorized redirect URIs μ λΌμ΄λΈ μ½λ°± URL μΆκ°:
https://meeting.yourdomain.com/oauth/callback
κ°λ°μ©(ngrok) URIλ₯Ό ν¨κ» λ±λ‘ν΄λλ©΄ νλμ Google νλ‘μ νΈλ‘ κ°λ°/λΌμ΄λΈ λͺ¨λ μ¬μ© κ°λ₯ν©λλ€.
5. Cloudflare μ€μ
Cloudflareκ° HTTPSλ₯Ό μ²λ¦¬νλ―λ‘ μλ²μ Nginxλ SSL μΈμ¦μκ° λΆνμν©λλ€.
- DNS: A λ μ½λλ‘
meeting.yourdomain.comβ μλ² IP, νλ‘μ νμ±ν (μ£Όν©μ ꡬλ¦) - Origin Rules: Cloudflare λμ보λ β Rules β Origin Rules β Create Rule
- 쑰건: Hostname equals
meeting.yourdomain.com - μ‘μ
: Destination Port β
8000
- 쑰건: Hostname equals
- λ°©νλ²½: μλ²μμ 8000 ν¬νΈλ₯Ό Cloudflare IP λμμλ§ μ€ν
6. systemd μλΉμ€ λ±λ‘
sudo tee /etc/systemd/system/meeting-agent.service <<'EOF'
[Unit]
Description=Meeting Agent Slack Bot
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/workspace/meeting-agent
EnvironmentFile=/home/ubuntu/workspace/meeting-agent/.env
ExecStart=/home/ubuntu/workspace/meeting-agent/.venv/bin/python3.11 main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable meeting-agent
sudo systemctl start meeting-agentμλΉμ€ κ΄λ¦¬:
sudo systemctl status meeting-agent # μν νμΈ
sudo journalctl -u meeting-agent -f # λ‘κ·Έ νμΈ
sudo systemctl restart meeting-agent # μ¬μμ7. λ°°ν¬ μ λ°μ΄νΈ
cd ~/workspace/meeting-agent
git pull
sudo systemctl restart meeting-agentmain λΈλμΉμ νΈμνλ©΄ GitHub Actionsκ° μλμΌλ‘ λ°°ν¬νλ©°, λ°°ν¬ μλ£ μ
FEEDBACK_CHANNELμ λ²μ Β·λ³κ²½μ¬ν μλ¦Όμ΄ λ°μ‘λ©λλ€.
8. λ°μ΄ν° λ°±μ (μ ν)
SQLite DBλ₯Ό μ£ΌκΈ°μ μΌλ‘ λ°±μ ν©λλ€:
# crontab -e μ μΆκ°
0 3 * * * cp /home/ubuntu/workspace/meeting-agent/store/users.db /home/ubuntu/backups/users_$(date +\%Y\%m\%d).dbGemini LLM νΈμΆμ© ν€μ λλ€.
- Google AI Studio μ μ
- Create API key ν΄λ¦ β νλ‘μ νΈ μ ν λλ μ κ· μμ±
- μμ±λ ν€ λ³΅μ¬ β
GOOGLE_API_KEY
Calendar / Drive / Gmail / Docs / Meet API μ°λμ μ¬μ©λλ OAuth 2.0 μ격 μ¦λͺ μ λλ€.
- Google Cloud Console μ μ β νλ‘μ νΈ μ ν/μμ±
- APIs & Services β Library μμ μλ API νμ±ν:
- Google Calendar API
- Google Drive API
- Gmail API
- Google Docs API
- Google Meet API (Google Workspace Meeting API)
- People API
- APIs & Services β OAuth consent screen μ€μ :
- User Type: Internal (μ‘°μ§ λ΄λΆμ©) λλ External
- μ± μ΄λ¦, μ§μ μ΄λ©μΌ μ λ ₯
- APIs & Services β Credentials β Create Credentials β OAuth client ID:
- Application type: Web application
- Authorized redirect URIsμ
OAUTH_CALLBACK_URLκ° μΆκ°
- μμ±λ Client ID Β· Client Secret β
server/oauth.pyμGOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRETνκ²½λ³μλ‘ μ€μ
GOOGLE_CLIENT_ID=...apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-...μ¬μ©μ Google OAuth ν ν°μ SQLiteμ μ μ₯ν λ μνΈνμ μ¬μ©λ©λλ€.
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"μΆλ ₯λ κ°μ .envμ μ€μ ν©λλ€:
ENCRYPTION_KEY=abc123...==μ΄ ν€λ₯Ό λΆμ€νλ©΄ μ μ₯λ λͺ¨λ μ¬μ©μ ν ν°μ 볡νΈνν μ μμ΅λλ€. μμ ν κ³³μ λ°±μ νμΈμ.
μμ± νμΌ STT(Speech-to-Text) λ³νμ μ¬μ©λ©λλ€.
- console.deepgram.com μ μ β νμκ°μ λλ λ‘κ·ΈμΈ
- μ’μΈ‘ λ©λ΄ API Keys β Create a New API Key
- Key Name μ λ ₯, Permissions: Member μ ν β μμ±
- μμ±λ ν€ λ³΅μ¬ β
DEEPGRAM_API_KEY
μ¬μ© λͺ¨λΈ: nova-2 (νκ΅μ΄ μ§μ, smart_format, punctuate μ΅μ
νμ±ν)
μ§μ ν¬λ§·: MP3, MP4, M4A, WAV, OGG, WebM, AAC λ± (μ΅λ 500MB)
μ¬λ΄ λ°©νλ²½ νκ²½μμ SSL μΈμ¦μ μ€λ₯ λ°μ μ
tools/stt.pyμverify=Falseμ€μ μΌλ‘ μ°νν©λλ€.
| 컀맨λ | μ€λͺ |
|---|---|
/λ±λ‘ / /register |
Google κ³μ μ°λ |
/μ¬λ±λ‘ / /reregister |
Google κ³μ μ¬μΈμ¦ (μ€μ½ν λ³κ²½ μ νμ©) |
/λΈλ¦¬ν / /brief |
μ€λ λ―Έν λΈλ¦¬ν μλ μ€ν |
/λ―Έν
μΆκ° / /meet |
μμ°μ΄λ‘ λ―Έν μμ± |
/κΈ°μ
/ /company |
κΈ°μ μ 보 κ°μ 리μμΉ |
/μΈλ¬Ό / /person |
μΈλ¬Ό μ 보 κ°μ 리μμΉ |
/λ―Έν
μμ |
μλ λ ΈνΈ μΈμ μμ (ν보 μΌμ μμΌλ©΄ μ ν UI + μ λ―Έν μΆκ° λ²νΌ) |
/λ©λͺ¨ |
λ―Έν μ€ λ ΈνΈ μΆκ° (μΈμ μμΌλ©΄ μλ μμ) |
/λ―Έν
μ’
λ£ |
μΈμ μ’ λ£ + νμλ‘ μ¦μ μμ± + κ²ν λ¨κ³ |
/νμλ‘μμ± |
νμλ‘ μλ μμ± |
/νμλ‘ |
μ μ₯λ νμλ‘ λͺ©λ‘ μ‘°ν (κ²μμ΄ μ§μ: /νμλ‘ μΉ΄μΉ΄μ€, /νμλ‘ 2026-04) |
/μ
λ°μ΄νΈ / /update |
company_knowledge.md κ°±μ |
/λλ¦Όνλ¬μ€ / /dreamplus |
λλ¦Όνλ¬μ€ κ³μ λ±λ‘/λ³κ²½ |
/νμμ€μμ½ |
λλ¦Όνλ¬μ€ νμμ€ μμ½ |
/νμμ€μ‘°ν |
νμμ€ μμ½ μ‘°ν |
/νμμ€μ·¨μ |
νμμ€ μμ½ μ·¨μ |
/ν¬λ λ§μ‘°ν |
λλ¦Όνλ¬μ€ ν¬λ λ§ μ‘°ν |
/trello |
Trello κ³μ μ°κ²° |
/trello-disconnect |
Trello μ°κ²° ν΄μ |
/νΈλ λ‘μ‘°ν / /trello-search |
Trello μΉ΄λ κ²μ |
/νΈλ λ‘μ£Όκ°λ³΄κ³ / /trello-weekly |
Trello μ£Όκ° λ³΄κ³ μ μμ± (μΈμ: μΌμ, κΈ°λ³Έ 7) |
/λμλ§ / /help |
μ¬μ© κ°λ₯ν 컀맨λ λ° μμ°μ΄ λͺ λ Ήμ΄ μλ΄ |
μμ°μ΄ DMλ μ§μν©λλ€ (λΈλ¦¬ν ν΄μ€, λ΄μΌ 3μ KISA λ―Έν
μ‘μμ€, μ§λ λͺ©μμΌ νμλ‘, μΉ΄μΉ΄μ€ λ©λͺ¨ β PoC μμ° ν보, μ£Όκ°λ³΄κ³ μ, μ§λ 2μ£Ό νΈλ λ‘ λ³΄κ³ μ, ~κΈ°λ₯ μΆκ°ν΄μ€, ~λ²κ·Έ κ°μ λ±).
μΈλΆ λ―Έν λΈλ¦¬νμ 2λ¨κ³ λΉλκΈ° λ°©μμΌλ‘ λμν©λλ€. 리μμΉ λκΈ° μμ΄ λ―Έν μ 보λ₯Ό μ¦μ μμ νκ³ , 리μμΉ κ²°κ³Όλ μλ£λλ μμλλ‘ μ€λ λμ μΆκ°λ©λλ€.
1λ¨κ³ (μ¦μ) λ―Έν
ν€λ λ°μ‘
ββββββββββββββββββββββββββββββββββ
β π μ
체λͺ
β μ€ν 3:00 (Google Meet) β
β [μ΄μ λ€ λ΄μ© λλ μ€λ λ λ΅κΈ μλ΄] β
ββββββββββββββββββββββββββββββββββ
2λ¨κ³ (λ°±κ·ΈλΌμ΄λ, μ
μ²΄λ³ μμ°¨)
β μ
체 리μμΉ μλ£ π’ μ
체λͺ
리μμΉ κ²°κ³Ό (ParaScope / μ
체 λν₯ / μλΉμ€ μ°κ²°μ )
β λ΄λΉμ μλ£ π€ λ΄λΉμ μ 보
β λ§₯λ½ μ‘°ν μλ£ π μ΄μ λ―Έν
λ§₯λ½ + π§ μ΄λ©μΌ λ§₯λ½
λ€μ€ μ 체 λΈλ¦¬ν μμλ λ¨μΌ μ€λ λμμ μμ°¨ μ²λ¦¬νλ―λ‘ λ μ 체μ κ²°κ³Όκ° μμ΄μ§ μμ΅λλ€.
LLMμ μ λ¬λλ μ£Όμ ν둬ννΈλ prompts/templates/ ν΄λμ λ§ν¬λ€μ΄ νμΌλ‘ κ΄λ¦¬λ©λλ€.
νμΌμ μμ ν λ€ μλ²λ₯Ό μ¬μ€ννλ©΄ λ³κ²½ λ΄μ©μ΄ μ¦μ λ°μλ©λλ€ (μ½λ μμ λΆνμ).
prompts/templates/
βββ minutes_internal.md # λ΄λΆμ© νμλ‘ μμ± ν둬ννΈ
βββ minutes_external.md # μΈλΆμ© νμλ‘ μμ± ν둬ννΈ
βββ company_news.md # μ
체 μ΅κ·Ό λν₯ κ²μ ν둬ννΈ
βββ person_info.md # μΈλ¬Ό μ 보 κ²μ ν둬ννΈ
βββ service_connection.md # μλΉμ€ μ°κ²°μ λΆμ ν둬ννΈ
ν
νλ¦Ώ λ΄ λ³μλ {{λ³μλͺ
}} νμμΌλ‘ μμ±ν©λλ€:
| ν νλ¦Ώ νμΌ | μ¬μ© λ³μ |
|---|---|
minutes_internal.md |
{{title}}, {{date}}, {{attendees}}, {{sources}} |
minutes_external.md |
{{title}}, {{date}}, {{attendees}}, {{internal_minutes}} |
company_news.md |
{{today}}, {{company_name}} |
person_info.md |
{{person_name}}, {{company_name}} |
service_connection.md |
{{knowledge}}, {{company_info}} |
μΈλΌμΈμΌλ‘ κ΄λ¦¬λλ ν둬ννΈ(λ―Έν νμ±, μΈν νΈ λΆλ₯, μ‘μ μμ΄ν μΆμΆ λ±)λ
prompts/briefing.pyμμ μ§μ μμ ν©λλ€.
MeetingAgent/
βββ Contacts/
β βββ Companies/ # {μ
체λͺ
}.md (리μμΉ κ²°κ³Ό + λ΄λΆ λ©λͺ¨)
β βββ People/ # {μ΄λ¦}.md
βββ Minutes/ # {λ μ§}_{μ λͺ©}_λ΄λΆμ©.md / _μΈλΆμ©.md
βββ Sources/ # μλ³Έ λ°μ΄ν° 보κ΄
β βββ Research/ # {λ μ§}_{μ
체λͺ
}_web_search.md
βββ company_knowledge.md # μμ¬ μλΉμ€ μμ½
meeting-agent/
βββ main.py # Slack Bolt + APScheduler μ§μ
μ
βββ start.sh # λ¨μΌ μΈμ€ν΄μ€ μ€ν μ€ν¬λ¦½νΈ (κ°λ°μ©)
βββ .github/
β βββ workflows/
β βββ deploy.yml # GitHub Actions μλ λ°°ν¬ (μΉν
λ°©μ)
βββ agents/
β βββ before.py # Before μμ΄μ νΈ (λΈλ¦¬ν, 리μμΉ, λ―Έν
μμ±)
β βββ during.py # During μμ΄μ νΈ (νΈλμ€ν¬λ¦½νΈ, λ
ΈνΈ, μμ±STT, λ¬Έμμ
λ‘λ, νμλ‘)
β βββ after.py # After μμ΄μ νΈ (νμλ‘ λ°μ‘, μ‘μ
μμ΄ν
, Trello λ±λ‘)
β βββ proposal.py # μ μμ μμ΄μ νΈ (κ°μΒ·μ΄μ μμ±, μ€λ λ μμ )
β βββ card.py # λͺ
ν¨ OCR μμ΄μ νΈ
β βββ room.py # λλ¦Όνλ¬μ€ νμμ€ μμ½Β·μ‘°νΒ·μ·¨μ (Slack Modal)
β βββ dreamplus.py # λλ¦Όνλ¬μ€ API λνΌ (JWT μΈμ¦)
β βββ feedback.py # νΌλλ°± μμ§Β·λΆλ₯Β·λ€μ΄μ μ€νΈ μμ΄μ νΈ
β βββ trello_report.py # Trello μ£Όκ° λ³΄κ³ μ (Google Docs + Slack μμ½)
βββ tools/
β βββ calendar.py # Google Calendar API
β βββ docs.py # Google Docs API (νΈλμ€ν¬λ¦½νΈ μ½κΈ°)
β βββ drive.py # Google Drive API
β βββ gmail.py # Gmail API
β βββ stt.py # Deepgram STT API
β βββ slack_tools.py # Slack Block Kit λ©μμ§ λΉλ
β βββ trello.py # Trello REST API λνΌ
β βββ dreamplus.py # λλ¦Όνλ¬μ€ API ν΄λΌμ΄μΈνΈ
β βββ text_extract.py # ν
μ€νΈ μΆμΆ μ νΈλ¦¬ν°
βββ prompts/
β βββ briefing.py # LLM ν둬ννΈ ν¨μ (ν
νλ¦Ώ λ‘λ ν¬ν¨)
β βββ templates/ # μΈλΆ ν둬ννΈ ν
νλ¦Ώ (μλ² μ¬μ€νμΌλ‘ λ°μ)
β βββ minutes_internal.md
β βββ minutes_external.md
β βββ briefing_summary.md
β βββ company_news.md
β βββ person_info.md
β βββ service_connection.md
β βββ proposal_intake.md
β βββ proposal_generate.md
βββ store/
β βββ user_store.py # SQLite + Fernet μ¬μ©μ ν ν° κ΄λ¦¬
βββ server/
β βββ oauth.py # FastAPI (OAuth μ½λ°± + Trello μΈμ¦ + λ°°ν¬ μΉν
)
βββ tests/ # λ¨μ ν
μ€νΈ
βββ requirements.txt
βββ docs/ # μ€κ³ λ¬Έμ
| λ¬Έμ | λ΄μ© |
|---|---|
| μꡬμ¬ν | μ 체 μμ€ν μꡬμ¬ν λ° κ΅¬ν νν© |
| Before Agent μ€κ³ | λΈλ¦¬ν, 리μμΉ, λ―Έν μμ± μμΈ μ€κ³ |
| During Agent μ€κ³ | νΈλμ€ν¬λ¦½νΈ μμ§, μλ λ ΈνΈ μΈμ μ€κ³ |
| After Agent μ€κ³ | νμλ‘ λ°μ‘, μ‘μ μμ΄ν , Contacts κ°±μ μ€κ³ |
| LLM μ¬μ© νν© | LLM νΈμΆ ν¨μΒ·ν둬ννΈ λͺ©λ‘ |
| ν μ€νΈ κ°μ΄λ | ν μ€νΈ μ€ν λ°©λ² λ° κ΅¬μ± |
pytest tests/
pytest tests/ -v # μμΈ μΆλ ₯
pytest tests/test_before.py # νΉμ νμΌλ§| Scope | μ©λ |
|---|---|
calendar |
λ―Έν μ‘°νΒ·μμ±Β·μ€λͺ μ λ°μ΄νΈΒ·extendedProperties ν¨μΉ |
drive |
ContactsΒ·νμλ‘Β·company_knowledge.md μ½κΈ°/μ°κΈ° |
gmail.readonly |
μ΄λ©μΌ λ§₯λ½ κ²μ, μ΄λ©μΌ μ£Όμ μΆμΆ |
gmail.send |
μΈλΆμ© νμλ‘ μ΄λ©μΌ λ°μ‘ |
documents.readonly |
Google Meet νΈλμ€ν¬λ¦½νΈ μ½κΈ° |
contacts.readonly |
Google μ£Όμλ‘ μ°Έμμ μ΄λ©μΌ μ‘°ν (μ κ· λ±λ‘μλΆν° μ μ©, κΈ°μ‘΄ μ¬μ©μλ /μ¬λ±λ‘ νμ) |
meetings.space.created |
Google Meet νΈλμ€ν¬λ¦½μ μλ νμ±ν |