ai-review/vector/app/models/vector_models.py
2025-06-17 12:30:32 +09:00

133 lines
6.4 KiB
Python

# app/models/vector_models.py
from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any
class VectorBuildRequest(BaseModel):
"""Vector DB 구축 요청 모델"""
region: str = Field(
...,
description="지역 (시군구 + 읍면동)",
example="서울특별시 강남구 역삼동"
)
store_name: str = Field(
...,
description="가게명",
example="맛있는 한식당"
)
force_rebuild: bool = Field(
False,
description="강제 재구축 여부",
example=False
)
class StoredDataInfo(BaseModel):
"""Vector DB에 저장된 데이터 정보"""
store_info: Dict[str, Any] = Field(description="가게 정보")
reviews: List[Dict[str, Any]] = Field(description="리뷰 목록")
review_summary: Dict[str, Any] = Field(description="리뷰 요약 정보")
combined_at: str = Field(description="데이터 결합 시간")
class FindReviewsResponse(BaseModel):
"""리뷰 검색 응답 모델 - Vector DB 저장 데이터 포함"""
success: bool = Field(description="검색 성공 여부")
message: str = Field(description="응답 메시지")
target_store: Optional[Dict[str, Any]] = Field(None, description="본인 가게 정보")
food_category: Optional[str] = Field(None, description="추출된 음식 카테고리")
total_reviews: int = Field(default=0, description="총 수집된 리뷰 수")
total_stores: int = Field(default=0, description="분석된 동종 업체 수")
execution_time: Optional[float] = Field(None, description="실행 시간(초)")
# Vector DB 저장 데이터
stored_data: Optional[Dict[str, StoredDataInfo]] = Field(None, description="Vector DB에 저장된 데이터")
class VectorBuildResponse(BaseModel):
"""Vector DB 구축 응답 모델"""
success: bool = Field(description="구축 성공 여부")
message: str = Field(description="응답 메시지")
store_info: Dict[str, Any] = Field(description="대상 가게 정보")
similar_stores_count: int = Field(description="동종 업체 수")
total_reviews_processed: int = Field(description="처리된 총 리뷰 수")
vector_db_status: str = Field(description="Vector DB 상태")
execution_time: float = Field(description="실행 시간(초)")
food_category: str = Field(description="추출된 음식 카테고리")
class ActionRecommendationRequest(BaseModel):
"""액션 추천 요청 모델"""
store_id: str = Field(
...,
description="가게 ID",
example="12345"
)
context: Optional[str] = Field(
None,
description="추가 컨텍스트",
example="매출이 감소하고 있어서 개선 방안이 필요합니다."
)
class ActionRecommendationResponse(BaseModel):
"""액션 추천 응답 모델"""
success: bool = Field(description="추천 성공 여부")
message: str = Field(description="응답 메시지")
claude_input: str = Field(description="Claude API에 전달한 프롬프트")
claude_response: Optional[str] = Field(None, description="Claude AI 원본 응답")
parsed_response: Optional[Dict[str, Any]] = Field(None, description="파싱된 JSON 응답")
store_name: str = Field(description="가게명")
food_category: str = Field(description="음식 카테고리")
similar_stores_count: int = Field(description="분석된 동종 업체 수")
execution_time: Optional[float] = Field(None, description="Claude API 응답 시간(초)")
json_parse_success: Optional[bool] = Field(None, description="JSON 파싱 성공 여부")
class ActionRecommendationSimpleResponse(BaseModel):
"""단순화된 액션 추천 응답 - JSON만 반환 + INPUT 데이터 포함"""
success: bool = Field(description="추천 성공 여부")
recommendation: Optional[Dict[str, Any]] = Field(None, description="추천 결과 JSON")
error_message: Optional[str] = Field(None, description="오류 메시지 (실패시에만)")
# 새로 추가: Claude에게 전달된 INPUT 데이터
input_data: Optional[Dict[str, Any]] = Field(None, description="Claude AI에게 전달된 입력 데이터")
class VectorStoreDocument(BaseModel):
"""Vector Store에 저장될 문서 구조"""
store_id: str = Field(description="가게 ID")
store_name: str = Field(description="가게명")
food_category: str = Field(description="음식 카테고리")
region: str = Field(description="지역")
store_info: Dict[str, Any] = Field(description="가게 정보")
reviews: List[Dict[str, Any]] = Field(description="리뷰 목록")
review_summary: Dict[str, Any] = Field(description="리뷰 요약 정보")
last_updated: str = Field(description="마지막 업데이트 시간")
class VectorDBStatus(BaseModel):
"""Vector DB 상태 정보"""
collection_name: str = Field(description="컬렉션명")
total_documents: int = Field(description="총 문서 수")
total_stores: int = Field(description="총 가게 수")
db_path: str = Field(description="DB 경로")
last_updated: Optional[str] = Field(None, description="마지막 업데이트 시간")
class VectorDBStatusResponse(BaseModel):
"""Vector DB 상태 조회 응답"""
success: bool = Field(description="조회 성공 여부")
status: VectorDBStatus = Field(description="DB 상태 정보")
message: str = Field(description="응답 메시지")
class StoreInfoRequest(BaseModel):
"""매장 정보 조회 요청 모델"""
store_id: str = Field(
...,
description="조회할 매장 ID",
example="501745730"
)
class StoreInfoResponse(BaseModel):
"""매장 정보 조회 응답 모델"""
success: bool = Field(description="조회 성공 여부")
message: str = Field(description="응답 메시지")
store_id: str = Field(description="매장 ID")
store_info: Optional[Dict[str, Any]] = Field(None, description="매장 기본 정보")
reviews: Optional[List[Dict[str, Any]]] = Field(None, description="리뷰 목록")
review_summary: Optional[Dict[str, Any]] = Field(None, description="리뷰 요약 정보")
metadata: Optional[Dict[str, Any]] = Field(None, description="Vector DB 메타데이터")
last_updated: Optional[str] = Field(None, description="마지막 업데이트 시간")
total_reviews: int = Field(default=0, description="총 리뷰 수")
execution_time: Optional[float] = Field(None, description="실행 시간(초)")