hgzero/design/backend/api/ai-service-api.yaml
Minseo-Jo 8f7e3fc1b7 회의록 공유 기능 제거에 따른 대시보드 조회 시퀀스 수정
- meeting-대시보드조회.puml에서 공유받은 회의록 조회 로직 제거
- findSharedMinutes(userId) 메서드 호출 및 관련 시퀀스 삭제
- 응답 데이터 구조에서 sharedMinutes 필드 제거
- 프로토타입 변경사항 반영 완료

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 11:14:05 +09:00

1057 lines
30 KiB
YAML

openapi: 3.0.3
info:
title: AI Service API
description: |
회의록 작성 및 공유 개선 서비스의 AI Service API
**주요 기능:**
- 회의록 자동 작성 (LLM 기반)
- Todo 자동 추출 및 담당자 식별
- 프롬프팅 기반 회의록 개선
- 관련 회의록 자동 연결 (RAG)
- 전문용어 감지 및 맥락 기반 설명 (RAG)
- 논의사항/결정사항 실시간 제안
version: 1.0.0
contact:
name: AI Service Team
email: ai-service@example.com
servers:
- url: https://virtserver.swaggerhub.com/ai-service/1.0.0
description: SwaggerHub Mock Server
- url: http://localhost:8083/api
description: Local Development Server
- url: https://dev-api.hgzero.com/ai/api
description: Development Server
- url: https://api.hgzero.com/ai/api
description: Production Server
tags:
- name: Transcript
description: 회의록 자동 작성 관련 API
- name: Todo
description: Todo 자동 추출 관련 API
- name: Improve
description: 회의록 개선 관련 API
- name: Relation
description: 관련 회의록 연결 관련 API
- name: Term
description: 전문용어 감지 및 설명 관련 API
- name: Suggestion
description: 논의사항/결정사항 제안 관련 API
paths:
/transcripts/process:
post:
tags:
- Transcript
summary: 회의록 자동 작성
description: |
STT에서 변환된 텍스트를 받아 LLM 기반으로 회의록을 자동 작성합니다.
회의 맥락을 고려하여 구조화된 회의록 초안을 생성합니다.
operationId: processTranscript
x-user-story: UFR-AI-010
x-controller: TranscriptController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TranscriptProcessRequest'
responses:
'200':
description: 회의록 자동 작성 성공
content:
application/json:
schema:
$ref: '#/components/schemas/TranscriptProcessResponse'
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
/todos/extract:
post:
tags:
- Todo
summary: Todo 자동 추출
description: |
회의록에서 액션 아이템을 자동으로 추출하고 담당자를 식별합니다.
추출된 Todo는 Meeting Service로 전달됩니다.
operationId: extractTodos
x-user-story: UFR-AI-020
x-controller: TodoController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TodoExtractionRequest'
responses:
'200':
description: Todo 추출 성공
content:
application/json:
schema:
$ref: '#/components/schemas/TodoExtractionResponse'
'400':
$ref: '#/components/responses/BadRequest'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
/transcripts/{meetingId}/improve:
post:
tags:
- Improve
summary: 회의록 개선
description: |
프롬프팅을 통해 회의록을 다양한 형식으로 변환합니다.
(1Page 요약, 핵심 요약, 상세 보고서 등)
operationId: improveTranscript
x-user-story: UFR-AI-030
x-controller: ImproveController
parameters:
- name: meetingId
in: path
required: true
schema:
type: string
format: uuid
description: 회의 ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TranscriptImproveRequest'
responses:
'200':
description: 회의록 개선 성공
content:
application/json:
schema:
$ref: '#/components/schemas/TranscriptImproveResponse'
'400':
$ref: '#/components/responses/BadRequest'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
/transcripts/{meetingId}/related:
get:
tags:
- Relation
summary: 관련 회의록 조회
description: |
벡터 유사도 검색을 통해 관련된 회의록을 찾아 반환합니다.
주제 유사도, 키워드 일치도, 참석자 중복도 등을 종합하여 계산합니다.
operationId: findRelatedTranscripts
x-user-story: UFR-AI-040
x-controller: RelationController
parameters:
- name: meetingId
in: path
required: true
schema:
type: string
format: uuid
description: 회의 ID
- name: transcriptId
in: query
required: true
schema:
type: string
format: uuid
description: 회의록 ID
- name: limit
in: query
schema:
type: integer
default: 5
minimum: 1
maximum: 10
description: 반환할 최대 개수
responses:
'200':
description: 관련 회의록 조회 성공
content:
application/json:
schema:
$ref: '#/components/schemas/RelatedTranscriptsResponse'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
/terms/detect:
post:
tags:
- Term
summary: 전문용어 감지
description: |
회의록 텍스트에서 전문용어를 자동으로 감지합니다.
조직별/산업별 용어 사전과 비교하여 신뢰도 점수를 계산합니다.
operationId: detectTerms
x-user-story: UFR-RAG-010
x-controller: TermController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TermDetectionRequest'
responses:
'200':
description: 전문용어 감지 성공
content:
application/json:
schema:
$ref: '#/components/schemas/TermDetectionResponse'
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
/terms/{term}/explain:
get:
tags:
- Term
summary: 맥락 기반 용어 설명
description: |
전문용어에 대한 맥락 기반 설명을 생성합니다.
RAG를 통해 과거 회의록, 사내 문서, 업무 이력을 검색하여
실용적인 설명을 제공합니다.
operationId: explainTerm
x-user-story: UFR-RAG-020
x-controller: ExplanationController
parameters:
- name: term
in: path
required: true
schema:
type: string
description: 용어명
- name: meetingId
in: query
required: true
schema:
type: string
format: uuid
description: 회의 ID
- name: context
in: query
schema:
type: string
description: 현재 회의 맥락 (선택)
responses:
'200':
description: 용어 설명 생성 성공
content:
application/json:
schema:
$ref: '#/components/schemas/TermExplanationResponse'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
/suggestions/discussion:
post:
tags:
- Suggestion
summary: 논의사항 제안
description: |
현재 회의 진행 상황을 분석하여 추가로 논의하면 좋을 주제를 제안합니다.
회의 안건 대비 빠진 항목이나 중요한 논의를 식별합니다.
operationId: suggestDiscussion
x-user-story: UFR-AI-010
x-controller: SuggestionController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DiscussionSuggestionRequest'
responses:
'200':
description: 논의사항 제안 성공
content:
application/json:
schema:
$ref: '#/components/schemas/DiscussionSuggestionResponse'
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
/suggestions/decision:
post:
tags:
- Suggestion
summary: 결정사항 제안
description: |
회의록 텍스트에서 결정사항 패턴을 감지하여 제안합니다.
"~하기로 함", "~로 결정" 등의 패턴을 분석합니다.
operationId: suggestDecision
x-user-story: UFR-AI-010
x-controller: SuggestionController
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DecisionSuggestionRequest'
responses:
'200':
description: 결정사항 제안 성공
content:
application/json:
schema:
$ref: '#/components/schemas/DecisionSuggestionResponse'
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
components:
schemas:
# ========================================
# Request Schemas
# ========================================
TranscriptProcessRequest:
type: object
required:
- meetingId
- transcriptText
properties:
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
transcriptText:
type: string
description: STT에서 변환된 텍스트
example: "안녕하세요. 오늘 회의는 신규 프로젝트 킥오프 미팅입니다..."
userId:
type: string
description: 사용자 ID
example: "user123"
userName:
type: string
description: 사용자 이름
example: "김철수"
context:
$ref: '#/components/schemas/MeetingContext'
TodoExtractionRequest:
type: object
required:
- meetingId
- minutesContent
properties:
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
userId:
type: string
description: 요청자 ID
example: "user123"
minutesContent:
type: string
description: |
회의록 전체 내용 (Markdown 형식)
AI가 TODO를 추출하기 위해 필요한 전체 맥락을 포함합니다.
example: |
# 신규 프로젝트 킥오프 미팅
## 참석자
- 김철수, 이영희, 박민수
## 논의사항
1. 프로젝트 개요
- React + Spring Boot 기반 개발
## 결정사항
1. API 설계서는 박민수님이 1월 30일까지 작성
2. 프론트엔드는 이영희님이 2월 5일까지 개발
## 보류사항
- 배포 일정은 다음 회의에서 논의
TranscriptImproveRequest:
type: object
required:
- promptType
properties:
promptType:
type: string
enum:
- 1PAGE_SUMMARY
- CORE_SUMMARY
- DETAILED_REPORT
- DECISION_FOCUSED
- ACTION_FOCUSED
- EXECUTIVE_REPORT
- CUSTOM
description: 프롬프트 유형
example: "1PAGE_SUMMARY"
customPrompt:
type: string
description: 사용자 정의 프롬프트 (promptType이 CUSTOM일 때)
example: "경영진 보고용으로 3가지 핵심 결정사항만 요약해주세요"
userId:
type: string
description: 사용자 ID
example: "user123"
TermDetectionRequest:
type: object
required:
- meetingId
- text
properties:
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
text:
type: string
description: 분석할 회의록 텍스트
example: "MSA 아키텍처로 설계하고, API Gateway를 통해 라우팅합니다..."
organizationId:
type: string
description: 조직 ID
example: "org123"
DiscussionSuggestionRequest:
type: object
required:
- meetingId
- transcriptText
properties:
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
transcriptText:
type: string
description: 현재까지의 회의록 텍스트
example: "프로젝트 일정에 대해 논의했습니다..."
DecisionSuggestionRequest:
type: object
required:
- meetingId
- transcriptText
properties:
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
transcriptText:
type: string
description: 현재까지의 회의록 텍스트
example: "React로 프론트엔드를 개발하기로 했습니다..."
# ========================================
# Response Schemas
# ========================================
TranscriptProcessResponse:
type: object
properties:
transcriptId:
type: string
format: uuid
description: 생성된 회의록 ID
example: "660e8400-e29b-41d4-a716-446655440001"
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
content:
$ref: '#/components/schemas/TranscriptContent'
suggestions:
$ref: '#/components/schemas/RealtimeSuggestions'
createdAt:
type: string
format: date-time
description: 생성 시간
example: "2025-01-23T10:30:00Z"
status:
type: string
enum: [DRAFT, COMPLETED]
description: 회의록 상태
example: "DRAFT"
TodoExtractionResponse:
type: object
properties:
meetingId:
type: string
format: uuid
description: 회의 ID
example: "550e8400-e29b-41d4-a716-446655440000"
todos:
type: array
items:
$ref: '#/components/schemas/ExtractedTodo'
totalCount:
type: integer
description: 추출된 Todo 개수
example: 5
extractedAt:
type: string
format: date-time
description: 추출 시간
example: "2025-01-23T11:00:00Z"
TranscriptImproveResponse:
type: object
properties:
transcriptId:
type: string
format: uuid
description: 개선된 회의록 ID
example: "770e8400-e29b-41d4-a716-446655440002"
version:
type: integer
description: 버전 번호
example: 2
baseVersion:
type: integer
description: 원본 버전 번호
example: 1
improvementType:
type: string
description: 개선 유형
example: "1PAGE_SUMMARY"
content:
type: string
description: 개선된 회의록 내용
example: "## 프로젝트 킥오프 미팅 요약\n\n### 핵심 결정사항\n1. React 기반 프론트엔드 개발..."
originalLink:
type: string
description: 원본 회의록 링크
example: "/transcripts/660e8400-e29b-41d4-a716-446655440001"
createdAt:
type: string
format: date-time
description: 생성 시간
example: "2025-01-23T11:30:00Z"
RelatedTranscriptsResponse:
type: object
properties:
relatedTranscripts:
type: array
items:
$ref: '#/components/schemas/RelatedTranscript'
totalCount:
type: integer
description: 관련 회의록 개수
example: 3
TermDetectionResponse:
type: object
properties:
detectedTerms:
type: array
items:
$ref: '#/components/schemas/DetectedTerm'
totalCount:
type: integer
description: 감지된 용어 개수
example: 8
highlightInfo:
type: array
items:
$ref: '#/components/schemas/HighlightInfo'
TermExplanationResponse:
type: object
properties:
term:
type: string
description: 용어명
example: "MSA"
basicDefinition:
type: string
description: 간단한 정의
example: "Microservices Architecture의 약자로, 애플리케이션을 작은 독립적인 서비스로 나누는 아키텍처 패턴"
contextualMeaning:
type: string
description: 현재 회의 맥락에서의 의미
example: "이번 프로젝트에서는 확장성과 독립 배포를 위해 MSA를 적용하기로 결정"
useCases:
type: array
items:
type: string
description: 실제 사용 사례
example:
- "2024년 프로젝트 X에서 주문/결제/배송 서비스를 독립적으로 구성"
- "서비스별 독립 배포로 배포 시간 70% 단축"
relatedProjects:
type: array
items:
$ref: '#/components/schemas/RelatedProject'
pastDiscussions:
type: array
items:
$ref: '#/components/schemas/PastDiscussion'
references:
type: array
items:
$ref: '#/components/schemas/Reference'
DiscussionSuggestionResponse:
type: object
properties:
suggestions:
type: array
items:
$ref: '#/components/schemas/DiscussionSuggestion'
totalCount:
type: integer
description: 제안 개수
example: 3
timestamp:
type: string
format: date-time
description: 생성 시각
example: "2025-01-23T10:35:00Z"
DecisionSuggestionResponse:
type: object
properties:
suggestions:
type: array
items:
$ref: '#/components/schemas/DecisionSuggestion'
totalCount:
type: integer
description: 제안 개수
example: 4
timestamp:
type: string
format: date-time
description: 생성 시각
example: "2025-01-23T10:35:00Z"
# ========================================
# Common Schemas
# ========================================
MeetingContext:
type: object
description: 회의 맥락 정보
properties:
title:
type: string
description: 회의 제목
example: "신규 프로젝트 킥오프 미팅"
participants:
type: array
items:
type: string
description: 참석자 목록
example: ["김철수", "이영희", "박민수"]
agenda:
type: array
items:
type: string
description: 회의 안건
example: ["프로젝트 개요", "일정 논의", "역할 분담"]
previousContent:
type: string
description: 이전 회의록 내용
example: "지난 회의에서 기술 스택을 논의했습니다..."
TranscriptContent:
type: object
description: 회의록 내용
properties:
summary:
type: string
description: 전체 요약
example: "프로젝트 킥오프 미팅에서 기술 스택과 일정을 확정했습니다."
discussions:
type: array
items:
$ref: '#/components/schemas/DiscussionItem'
decisions:
type: array
items:
$ref: '#/components/schemas/DecisionItem'
pendingItems:
type: array
items:
type: string
description: 보류 사항
example: ["추가 예산 검토 필요", "외주 업체 선정 보류"]
DiscussionItem:
type: object
properties:
topic:
type: string
description: 논의 주제
example: "기술 스택 선정"
speaker:
type: string
description: 발언자
example: "김철수"
content:
type: string
description: 논의 내용
example: "프론트엔드는 React, 백엔드는 Spring Boot를 사용하기로 제안"
DecisionItem:
type: object
properties:
content:
type: string
description: 결정 내용
example: "React로 프론트엔드 개발"
decisionMaker:
type: string
description: 결정자
example: "이영희"
category:
type: string
enum: [기술, 일정, 리소스, 정책, 기타]
description: 결정 카테고리
example: "기술"
RealtimeSuggestions:
type: object
description: 실시간 추천사항
properties:
discussionTopics:
type: array
items:
$ref: '#/components/schemas/DiscussionSuggestion'
decisions:
type: array
items:
$ref: '#/components/schemas/DecisionSuggestion'
DiscussionSuggestion:
type: object
properties:
id:
type: string
format: uuid
description: 제안 ID
example: "880e8400-e29b-41d4-a716-446655440003"
topic:
type: string
description: 논의 주제
example: "보안 요구사항 검토"
reason:
type: string
description: 제안 이유
example: "안건에 포함되어 있으나 아직 논의되지 않음"
priority:
type: string
enum: [HIGH, MEDIUM, LOW]
description: 우선순위
example: "HIGH"
relatedAgenda:
type: string
description: 관련 안건
example: "프로젝트 개요"
estimatedTime:
type: integer
description: 예상 소요 시간 (분)
example: 15
DecisionSuggestion:
type: object
properties:
id:
type: string
format: uuid
description: 제안 ID
example: "990e8400-e29b-41d4-a716-446655440004"
content:
type: string
description: 결정 내용
example: "React로 프론트엔드 개발"
category:
type: string
enum: [기술, 일정, 리소스, 정책, 기타]
description: 결정 카테고리
example: "기술"
decisionMaker:
type: string
description: 결정자
example: "김철수"
participants:
type: array
items:
type: string
description: 참여자
example: ["김철수", "이영희"]
confidence:
type: number
format: float
minimum: 0
maximum: 1
description: 신뢰도 점수
example: 0.85
extractedFrom:
type: string
description: 원문 발췌
example: "프론트엔드는 React로 개발하기로 했습니다"
context:
type: string
description: 결정 배경
example: "팀원 대부분이 React 경험이 있어 개발 속도가 빠를 것으로 예상"
ExtractedTodo:
type: object
properties:
content:
type: string
description: Todo 내용
example: "API 설계서 작성"
assignee:
type: string
description: 담당자
example: "박민수"
dueDate:
type: string
format: date
description: 마감일
example: "2025-01-30"
priority:
type: string
enum: [HIGH, MEDIUM, LOW]
description: 우선순위
example: "HIGH"
sectionReference:
type: string
description: 관련 회의록 섹션
example: "결정사항 #3"
RelatedTranscript:
type: object
properties:
transcriptId:
type: string
format: uuid
description: 회의록 ID
example: "aa0e8400-e29b-41d4-a716-446655440005"
title:
type: string
description: 회의 제목
example: "프로젝트 X 주간 회의"
date:
type: string
format: date
description: 회의 날짜
example: "2025-01-15"
participants:
type: array
items:
type: string
description: 참석자
example: ["김철수", "이영희"]
relevanceScore:
type: number
format: float
description: 관련도 점수 (0-100%)
example: 85.5
commonKeywords:
type: array
items:
type: string
description: 공통 키워드
example: ["MSA", "API Gateway", "Spring Boot"]
link:
type: string
description: 회의록 링크
example: "/transcripts/aa0e8400-e29b-41d4-a716-446655440005"
DetectedTerm:
type: object
properties:
term:
type: string
description: 용어명
example: "MSA"
position:
$ref: '#/components/schemas/TextPosition'
confidence:
type: number
format: float
minimum: 0
maximum: 1
description: 신뢰도 점수
example: 0.92
category:
type: string
enum: [기술, 업무, 도메인]
description: 용어 카테고리
example: "기술"
highlight:
type: boolean
description: 하이라이트 여부
example: true
TextPosition:
type: object
description: 텍스트 위치 정보
properties:
line:
type: integer
description: 줄 번호
example: 5
offset:
type: integer
description: 시작 오프셋
example: 42
HighlightInfo:
type: object
properties:
term:
type: string
description: 용어명
example: "API Gateway"
position:
$ref: '#/components/schemas/TextPosition'
style:
type: string
description: 하이라이트 스타일
example: "background-color: yellow"
tooltip:
type: string
description: 툴팁 텍스트
example: "용어 설명 로딩 중..."
RelatedProject:
type: object
properties:
name:
type: string
description: 프로젝트명
example: "프로젝트 X"
relevance:
type: string
description: 연관성 설명
example: "동일한 MSA 아키텍처 적용"
PastDiscussion:
type: object
properties:
date:
type: string
format: date
description: 논의 날짜
example: "2024-12-15"
participants:
type: array
items:
type: string
description: 참석자
example: ["김철수", "이영희"]
summary:
type: string
description: 논의 요약
example: "MSA 아키텍처의 장단점을 비교하고 적용 방안을 논의"
link:
type: string
description: 회의록 링크
example: "/transcripts/bb0e8400-e29b-41d4-a716-446655440006"
Reference:
type: object
properties:
title:
type: string
description: 문서 제목
example: "MSA 아키텍처 가이드"
type:
type: string
enum: [위키, 매뉴얼, 회의록, 보고서]
description: 문서 유형
example: "위키"
link:
type: string
description: 문서 URL
example: "https://wiki.example.com/msa-guide"
ErrorResponse:
type: object
properties:
error:
type: string
description: 에러 코드
example: "INVALID_REQUEST"
message:
type: string
description: 에러 메시지
example: "meetingId는 필수 항목입니다"
timestamp:
type: string
format: date-time
description: 에러 발생 시각
example: "2025-01-23T10:30:00Z"
responses:
BadRequest:
description: 잘못된 요청
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: "BAD_REQUEST"
message: "필수 파라미터가 누락되었습니다"
timestamp: "2025-01-23T10:30:00Z"
NotFound:
description: 리소스를 찾을 수 없음
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: "NOT_FOUND"
message: "해당 회의록을 찾을 수 없습니다"
timestamp: "2025-01-23T10:30:00Z"
InternalServerError:
description: 서버 내부 오류
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: "INTERNAL_SERVER_ERROR"
message: "서버 처리 중 오류가 발생했습니다"
timestamp: "2025-01-23T10:30:00Z"
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: JWT 토큰 기반 인증
security:
- BearerAuth: []