mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 05:36:23 +00:00
✅ 구현 완료 - AI Python Service (FastAPI, Claude API, 8087 포트) - POST /api/v1/transcripts/consolidate - 참석자별 회의록 → AI 통합 분석 - 키워드/안건별 요약/Todo 추출 - Meeting Service AI 통합 - EndMeetingService (@Primary) - AIServiceClient (RestTemplate, 30초 timeout) - AI 분석 결과 저장 (meeting_analysis, todos) - 회의 상태 COMPLETED 처리 - DTO 구조 (간소화) - ConsolidateRequest/Response - MeetingEndDTO - Todo 제목만 포함 (담당자/마감일 제거) 📝 기술스택 - Python: FastAPI, anthropic 0.71.0, psycopg2 - Java: Spring Boot, RestTemplate - Claude: claude-3-5-sonnet-20241022 🔧 주요 이슈 해결 - 포트 충돌: 8086(feature/stt-ai) → 8087(feat/meeting-ai) - Bean 충돌: @Primary 추가 - YAML 문법: ai.service.url 구조 수정 - anthropic 라이브러리 업그레이드 📚 테스트 가이드 및 스크립트 작성 - claude/MEETING-AI-TEST-GUIDE.md - test-meeting-ai.sh 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
215 lines
6.5 KiB
Bash
Executable File
215 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Meeting AI 통합 테스트 스크립트
|
||
# 작성: 이동욱
|
||
|
||
set -e
|
||
|
||
echo "=========================================="
|
||
echo "Meeting AI 통합 테스트"
|
||
echo "=========================================="
|
||
|
||
# 색상 정의
|
||
GREEN='\033[0;32m'
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 테스트 변수
|
||
MEETING_SERVICE="http://localhost:8082"
|
||
AI_SERVICE="http://localhost:8087"
|
||
USER_ID="test-user-001"
|
||
USER_NAME="홍길동"
|
||
USER_EMAIL="hong@example.com"
|
||
|
||
# 1. 서비스 Health Check
|
||
echo ""
|
||
echo "1️⃣ 서비스 Health Check..."
|
||
echo "----------------------------------------"
|
||
|
||
echo -n "AI Python Service (8087): "
|
||
if curl -s -f "$AI_SERVICE/health" > /dev/null; then
|
||
echo -e "${GREEN}✓ 정상${NC}"
|
||
else
|
||
echo -e "${RED}✗ 실패${NC}"
|
||
echo "AI Python Service가 실행되지 않았습니다."
|
||
exit 1
|
||
fi
|
||
|
||
echo -n "Meeting Service (8082): "
|
||
if curl -s -f "$MEETING_SERVICE/actuator/health" > /dev/null; then
|
||
echo -e "${GREEN}✓ 정상${NC}"
|
||
else
|
||
echo -e "${RED}✗ 실패${NC}"
|
||
echo "Meeting Service가 실행되지 않았습니다."
|
||
exit 1
|
||
fi
|
||
|
||
# 2. 회의 생성
|
||
echo ""
|
||
echo "2️⃣ 회의 생성..."
|
||
echo "----------------------------------------"
|
||
|
||
MEETING_RESPONSE=$(curl -s -X POST "$MEETING_SERVICE/api/meetings" \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-User-Id: $USER_ID" \
|
||
-H "X-User-Name: $USER_NAME" \
|
||
-H "X-User-Email: $USER_EMAIL" \
|
||
-d '{
|
||
"title": "AI 통합 테스트 회의",
|
||
"purpose": "Meeting AI 기능 테스트",
|
||
"scheduledAt": "2025-10-28T14:00:00",
|
||
"endTime": "2025-10-28T15:00:00",
|
||
"location": "회의실 A",
|
||
"participantIds": ["'$USER_ID'", "user-002"]
|
||
}')
|
||
|
||
MEETING_ID=$(echo "$MEETING_RESPONSE" | grep -o '"meetingId":"[^"]*"' | cut -d'"' -f4)
|
||
|
||
if [ -z "$MEETING_ID" ]; then
|
||
echo -e "${RED}✗ 회의 생성 실패${NC}"
|
||
echo "$MEETING_RESPONSE"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✓ 회의 생성 성공${NC}"
|
||
echo "Meeting ID: $MEETING_ID"
|
||
|
||
# 3. 회의 시작
|
||
echo ""
|
||
echo "3️⃣ 회의 시작..."
|
||
echo "----------------------------------------"
|
||
|
||
START_RESPONSE=$(curl -s -X POST "$MEETING_SERVICE/api/meetings/$MEETING_ID/start" \
|
||
-H "X-User-Id: $USER_ID" \
|
||
-H "X-User-Name: $USER_NAME" \
|
||
-H "X-User-Email: $USER_EMAIL")
|
||
|
||
if echo "$START_RESPONSE" | grep -q '"success":true'; then
|
||
echo -e "${GREEN}✓ 회의 시작 성공${NC}"
|
||
else
|
||
echo -e "${RED}✗ 회의 시작 실패${NC}"
|
||
echo "$START_RESPONSE"
|
||
exit 1
|
||
fi
|
||
|
||
# 4. 테스트 데이터 삽입 안내
|
||
echo ""
|
||
echo "4️⃣ 테스트 데이터 준비..."
|
||
echo "----------------------------------------"
|
||
echo -e "${YELLOW}⚠️ 수동 작업 필요${NC}"
|
||
echo ""
|
||
echo "PostgreSQL에 아래 SQL을 실행해주세요:"
|
||
echo ""
|
||
echo "psql -h 4.230.48.72 -U hgzerouser -d meetingdb"
|
||
echo ""
|
||
cat << 'SQL'
|
||
INSERT INTO agenda_sections (
|
||
id, minutes_id, meeting_id, agenda_number, agenda_title,
|
||
ai_summary_short, discussions,
|
||
decisions, pending_items, opinions, todos,
|
||
created_at, updated_at
|
||
) VALUES
|
||
(
|
||
'test-agenda-001', 'test-minutes-001', '여기에_MEETING_ID', 1, '신제품 기획 방향',
|
||
NULL,
|
||
'타겟 고객층을 20-30대 직장인으로 설정하고 UI/UX 개선에 집중하기로 논의했습니다. 모바일 우선 전략을 채택하고, 직관적인 인터페이스 디자인을 최우선 과제로 삼았습니다.',
|
||
'["타겟 고객: 20-30대 직장인", "UI/UX 개선 최우선", "모바일 우선 전략 채택"]'::json,
|
||
'["가격 정책 추가 검토 필요", "경쟁사 벤치마킹 분석"]'::json,
|
||
'[]'::json,
|
||
'[]'::json,
|
||
NOW(), NOW()
|
||
),
|
||
(
|
||
'test-agenda-002', 'test-minutes-001', '여기에_MEETING_ID', 2, '마케팅 전략 수립',
|
||
NULL,
|
||
'SNS 마케팅과 인플루언서 협업을 통한 브랜드 인지도 제고 방안을 논의했습니다. 인스타그램과 유튜브를 주요 채널로 선정하고, 마이크로 인플루언서 3명과 계약을 진행하기로 결정했습니다.',
|
||
'["SNS 광고 집행 (Instagram, YouTube)", "인플루언서 3명과 계약", "월 500만원 마케팅 예산"]'::json,
|
||
'["최종 예산 승인 대기", "인플루언서 선정 기준 확정"]'::json,
|
||
'[]'::json,
|
||
'[]'::json,
|
||
NOW(), NOW()
|
||
);
|
||
SQL
|
||
|
||
echo ""
|
||
echo "위 SQL에서 '여기에_MEETING_ID'를 아래 값으로 치환하세요:"
|
||
echo -e "${GREEN}$MEETING_ID${NC}"
|
||
echo ""
|
||
echo -n "데이터 삽입 완료 후 Enter를 누르세요..."
|
||
read
|
||
|
||
# 5. 회의 종료 (핵심 테스트)
|
||
echo ""
|
||
echo "5️⃣ 🔥 회의 종료 API 호출 (AI 통합 테스트)..."
|
||
echo "----------------------------------------"
|
||
|
||
END_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$MEETING_SERVICE/api/meetings/$MEETING_ID/end" \
|
||
-H "X-User-Id: $USER_ID" \
|
||
-H "X-User-Name: $USER_NAME" \
|
||
-H "X-User-Email: $USER_EMAIL")
|
||
|
||
HTTP_CODE=$(echo "$END_RESPONSE" | tail -n1)
|
||
BODY=$(echo "$END_RESPONSE" | sed '$d')
|
||
|
||
if [ "$HTTP_CODE" -eq 200 ]; then
|
||
echo -e "${GREEN}✓ 회의 종료 성공 (HTTP $HTTP_CODE)${NC}"
|
||
echo ""
|
||
echo "📊 응답 데이터:"
|
||
echo "$BODY" | python3 -m json.tool 2>/dev/null || echo "$BODY"
|
||
|
||
# 주요 데이터 추출
|
||
AGENDA_COUNT=$(echo "$BODY" | grep -o '"agendaCount":[0-9]*' | cut -d':' -f2)
|
||
TODO_COUNT=$(echo "$BODY" | grep -o '"todoCount":[0-9]*' | cut -d':' -f2)
|
||
|
||
echo ""
|
||
echo -e "${GREEN}✅ AI 분석 완료${NC}"
|
||
echo " - 안건 수: $AGENDA_COUNT"
|
||
echo " - Todo 수: $TODO_COUNT"
|
||
else
|
||
echo -e "${RED}✗ 회의 종료 실패 (HTTP $HTTP_CODE)${NC}"
|
||
echo "$BODY"
|
||
exit 1
|
||
fi
|
||
|
||
# 6. 데이터베이스 검증
|
||
echo ""
|
||
echo "6️⃣ 데이터베이스 결과 확인..."
|
||
echo "----------------------------------------"
|
||
echo ""
|
||
echo "PostgreSQL에서 아래 쿼리로 결과를 확인하세요:"
|
||
echo ""
|
||
cat << SQL
|
||
-- 회의 상태 확인
|
||
SELECT meeting_id, title, status, ended_at
|
||
FROM meetings
|
||
WHERE meeting_id = '$MEETING_ID';
|
||
|
||
-- AI 분석 결과 확인
|
||
SELECT analysis_id, meeting_id, keywords, status, completed_at
|
||
FROM meeting_analysis
|
||
WHERE meeting_id = '$MEETING_ID';
|
||
|
||
-- Todo 확인
|
||
SELECT todo_id, title, status
|
||
FROM todos
|
||
WHERE meeting_id = '$MEETING_ID';
|
||
SQL
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
echo -e "${GREEN}✅ 통합 테스트 완료!${NC}"
|
||
echo "=========================================="
|
||
echo ""
|
||
echo "📝 체크리스트:"
|
||
echo " ✓ AI Python Service 실행"
|
||
echo " ✓ Meeting Service 실행"
|
||
echo " ✓ 회의 생성"
|
||
echo " ✓ 회의 시작"
|
||
echo " ✓ 회의 종료 + AI 분석"
|
||
echo ""
|
||
echo "📁 로그 위치:"
|
||
echo " - AI Service: logs/ai-python.log"
|
||
echo " - Meeting Service: meeting/logs/meeting-service.log"
|
||
echo ""
|