hgzero/ai-python/app/models/transcript.py
Minseo-Jo e30aa5c116 feat: Meeting AI 통합 - 회의 종료 API 및 AI 회의록 요약 기능 구현
주요 변경사항:
- 회의 종료 API 구현 (POST /api/meetings/{meetingId}/end)
- AI 회의록 통합 요약 기능 구현
- Claude API 연동 및 프롬프트 최적화
- 안건별 요약, 키워드 추출, 결정사항 자동 정리

AI Service (Python):
- Claude 모델 설정: claude-sonnet-4-5-20250929
- 회의록 통합 프롬프트 개선
- AgendaSummary 모델 summary 필드 매핑 수정
- decisions 필드 추가 및 응답 구조 정리
- 입력 데이터 로깅 추가

Meeting Service (Java):
- EndMeetingService AI 통합 로직 구현
- MeetingAnalysis 엔티티 decisions 필드 추가
- AgendaSection opinions 필드 제거
- AI Service 포트 8086으로 설정
- DB 마이그레이션 스크립트 추가 (V7)

테스트 결과:
 회의 종료 API 정상 동작
 AI 응답 검증 (keywords, summary, decisions)
 안건별 요약 및 보류사항 추출
 처리 시간: ~11초, 토큰: ~2,600

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 14:46:41 +09:00

45 lines
2.0 KiB
Python

"""Transcript Models"""
from pydantic import BaseModel, Field
from typing import List, Optional, Dict
from datetime import datetime
class ParticipantMinutes(BaseModel):
"""참석자별 회의록"""
user_id: str = Field(..., description="사용자 ID")
user_name: str = Field(..., description="사용자 이름")
content: str = Field(..., description="회의록 전체 내용 (MEMO 섹션)")
class ConsolidateRequest(BaseModel):
"""회의록 통합 요약 요청"""
meeting_id: str = Field(..., description="회의 ID")
participant_minutes: List[ParticipantMinutes] = Field(..., description="참석자별 회의록 목록")
agendas: Optional[List[str]] = Field(None, description="안건 목록")
duration_minutes: Optional[int] = Field(None, description="회의 시간(분)")
class ExtractedTodo(BaseModel):
"""추출된 Todo (제목만)"""
title: str = Field(..., description="Todo 제목")
class AgendaSummary(BaseModel):
"""안건별 요약"""
agenda_number: int = Field(..., description="안건 번호")
agenda_title: str = Field(..., description="안건 제목")
summary_short: str = Field(..., description="AI 생성 짧은 요약 (1줄, 20자 이내)")
summary: str = Field(..., description="안건별 회의록 요약 (논의사항+결정사항, 사용자 수정 가능)")
pending: List[str] = Field(default_factory=list, description="보류 사항")
todos: List[ExtractedTodo] = Field(default_factory=list, description="Todo 목록 (제목만)")
class ConsolidateResponse(BaseModel):
"""회의록 통합 요약 응답"""
meeting_id: str = Field(..., description="회의 ID")
keywords: List[str] = Field(..., description="주요 키워드")
statistics: Dict[str, int] = Field(..., description="통계 정보")
decisions: str = Field(..., description="회의 전체 결정사항 (TEXT 형식)")
agenda_summaries: List[AgendaSummary] = Field(..., description="안건별 요약")
generated_at: datetime = Field(default_factory=datetime.utcnow, description="생성 시각")