mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 09:06:24 +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>
45 lines
1.9 KiB
Python
45 lines
1.9 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="짧은 요약 (1줄)")
|
|
discussion: str = Field(..., description="논의 주제")
|
|
decisions: List[str] = Field(default_factory=list, 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="통계 정보")
|
|
agenda_summaries: List[AgendaSummary] = Field(..., description="안건별 요약")
|
|
generated_at: datetime = Field(default_factory=datetime.utcnow, description="생성 시각")
|