Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
Binary file added .github/.DS_Store
Binary file not shown.
6 changes: 4 additions & 2 deletions .github/workflows/cicd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
context: .
file: ./Dockerfile
push: true
no-cache: true
tags: |
${{ env.IMAGE }}:latest
${{ env.IMAGE }}:${{ github.sha }}
Expand All @@ -45,7 +46,6 @@ jobs:
name: Deploy to Server
needs: docker-build-push
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'

steps:
- name: Deploy via SSH
Expand All @@ -62,4 +62,6 @@ jobs:
-p 8000:8000 \
-e OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} \
-e OPENAI_MODEL=${{ secrets.OPENAI_MODEL }} \
${{ env.IMAGE }}:latest
${{ env.IMAGE }}:latest

docker image prune -af || true
2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN python -m leftovers.domain.recommend.service.train
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Binary file added leftovers/.DS_Store
Binary file not shown.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from fastapi.responses import JSONResponse
from pydantic import ValidationError

from app.core.response.api_response import fail
from leftovers.core.response.api_response import fail

# 공통 응답 포맷 생성기
def error_response(status: int, message: str, extra: dict = None):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from openai import OpenAI
from app.core.config.config import settings # 환경설정 로더 가져오기
from leftovers.core.config.config import settings # 환경설정 로더 가져오기

_cfg = settings() # settings

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from fastapi import APIRouter
from app.core.response.api_response import Envelope, ok, fail
from app.domain.recommend.schemas.recommend_request import RecommendReq
from app.domain.recommend.schemas.recommend_response import RecommendRes
from app.domain.recommend.service import evaluator, loader
from leftovers.core.response.api_response import Envelope, ok, fail
from leftovers.domain.recommend.schemas.recommend_request import RecommendReq
from leftovers.domain.recommend.schemas.recommend_response import RecommendRes
from leftovers.domain.recommend.service import evaluator, loader

router = APIRouter(prefix="/menus")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np
from app.domain.recommend.service.scoring import compute_score
from app.domain.recommend.schemas.recommend_response import MatchItem
from app.domain.recommend.service import loader, matcher
from leftovers.domain.recommend.service.scoring import compute_score
from leftovers.domain.recommend.schemas.recommend_response import MatchItem
from leftovers.domain.recommend.service import loader, matcher

# 음식 영양 성분을 딕셔너리에서 numpy 배열로 변환(ML 모델 입력은 항상 숫자여야 하므로)
def to_feat(n: dict) -> np.ndarray:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from typing import List
import joblib

from app.domain.recommend.service.food_kfda_loader import load_kfda_excels
from leftovers.domain.recommend.service.food_kfda_loader import load_kfda_excels

FOOD_FILES = ["app/domain/recommend/data/foodData1.xlsx", "app/domain/recommend/data/foodData2.xlsx"]
MODEL_DIR = "app/domain/recommend/model_store"
FOOD_FILES = ["leftovers/domain/recommend/data/foodData1.xlsx", "leftovers/domain/recommend/data/foodData2.xlsx"]
MODEL_DIR = "leftovers/domain/recommend/model_store"

# 컨셉
CONCEPTS = {"diet", "keto", "low_sodium", "glycemic", "bulking"}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from app.domain.recommend.service import loader
from leftovers.domain.recommend.service import loader

# 메뉴 이름이 유사한 것 찾기
def match_top1(query: str):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
from sklearn.metrics import mean_absolute_error
from sklearn.impute import SimpleImputer

from app.domain.recommend.service.food_kfda_loader import load_kfda_excels
from app.domain.recommend.service.scoring import fit_calibration, compute_score
from leftovers.domain.recommend.service.food_kfda_loader import load_kfda_excels
from leftovers.domain.recommend.service.scoring import fit_calibration, compute_score

FOOD_FILES = ["app/domain/recommend/data/foodData1.xlsx", "app/domain/recommend/data/foodData2.xlsx"]
MODEL_DIR = Path("app/domain/recommend/model_store")
FOOD_FILES = ["leftovers/domain/recommend/data/foodData1.xlsx", "leftovers/domain/recommend/data/foodData2.xlsx"]
MODEL_DIR = Path("leftovers/domain/recommend/model_store")
MODEL_DIR.mkdir(parents=True, exist_ok=True)

# 컨셉
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from fastapi import APIRouter, HTTPException
from typing import List

from app.core.response.api_response import Envelope, ok
from app.domain.tip.schemas.tip_request import TipRequest
from app.domain.tip.schemas.tip_response import TipItem
from app.domain.tip.service.prompt import chatForTip
from leftovers.core.response.api_response import Envelope, ok
from leftovers.domain.tip.schemas.tip_request import TipRequest
from leftovers.domain.tip.schemas.tip_response import TipItem
from leftovers.domain.tip.service.prompt import chatForTip

import json
from json import JSONDecodeError
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from app.core.external.open_ai_client import client
from app.core.config.config import settings
from leftovers.core.external.open_ai_client import client
from leftovers.core.config.config import settings

# OpenAI Responses API의 structured outputs 기능에서 쓰는 JSON Schema
# TIp SCHEMA의 형태로 응답을 제공함
Expand Down
9 changes: 4 additions & 5 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
from pydantic import ValidationError
from contextlib import asynccontextmanager

from app.domain.recommend.service import loader
from app.domain.tip.api import tip_api
from app.domain.recommend.api import recommend_api
from app.core.exception.global_error_handler import (
from leftovers.domain.recommend.service import loader
from leftovers.domain.tip.api import tip_api
from leftovers.domain.recommend.api import recommend_api
from leftovers.core.exception.global_error_handler import (
validation_error_handler,
http_exception_handler,
global_exception_handler,
Expand All @@ -17,7 +17,6 @@
async def lifespan(app: FastAPI):
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, loader.load_all)
loader.load_all()
print("모델/DB 로딩 완료")

yield # 여기까지 오면 서버 실행
Expand Down