Create cinema.py
Browse files- apps/cinema.py +58 -0
apps/cinema.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import json
|
| 3 |
+
from fastapi import APIRouter, HTTPException
|
| 4 |
+
from pydantic import BaseModel
|
| 5 |
+
from huggingface_hub import InferenceClient
|
| 6 |
+
|
| 7 |
+
# ๋ผ์ฐํฐ ์ค์
|
| 8 |
+
router = APIRouter()
|
| 9 |
+
|
| 10 |
+
# HF ํ ํฐ (Settings > Secrets์ HF_TOKEN ์ด ๋ฑ๋ก๋์ด ์์ด์ผ ํจ)
|
| 11 |
+
client = InferenceClient(api_key=os.getenv("HF_TOKEN"))
|
| 12 |
+
|
| 13 |
+
# ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ชจ๋ธ
|
| 14 |
+
class MovieRequest(BaseModel):
|
| 15 |
+
title: str
|
| 16 |
+
director: str
|
| 17 |
+
tmdb_md: str = ""
|
| 18 |
+
|
| 19 |
+
@router.post("/movie-info")
|
| 20 |
+
async def get_movie_info(req: MovieRequest):
|
| 21 |
+
try:
|
| 22 |
+
context = f"TMDB ์ ๋ณด:\n{req.tmdb_md}" if req.tmdb_md else "TMDB ์ ๋ณด๊ฐ ์ ๊ณต๋์ง ์์์ต๋๋ค."
|
| 23 |
+
|
| 24 |
+
prompt = f"""
|
| 25 |
+
๋น์ ์ ์ํ ์ ๋ฌธ AI ๋น์์
๋๋ค. ์๋ [์ ๊ณต๋ ์ ๋ณด]๋ฅผ ๋ฐํ์ผ๋ก๋ง ๋ต๋ณํ์ธ์.
|
| 26 |
+
|
| 27 |
+
[์ ๊ณต๋ ์ ๋ณด]
|
| 28 |
+
{context}
|
| 29 |
+
|
| 30 |
+
[์์ฑ ๊ท์น]
|
| 31 |
+
1. "summary": ์ํ '{req.title}'(๊ฐ๋
:{req.director})์ ๋ด์ฉ์ ํ๊ตญ์ด๋ก 150์ ์ด๋ด๋ก ์์ฝํ ๊ฒ. ๋ด์ฉ ์๊ณก ๋ฐฉ์ง๋ฅผ ์ํด 150์๋ฅผ ์ด๊ณผํ ๊ฒ ๊ฐ์ผ๋ฉด ๋ท๋ถ๋ถ์ 'ยทยทยท'์ผ๋ก ์๋ตํ ๊ฒ.
|
| 32 |
+
2. "ott": ํ๊ตญ์์ ์์ฒญ ๊ฐ๋ฅํ OTT ํ๋ซํผ ์ด๋ฆ๋ง ์ผํ๋ก ๋์ดํ ๊ฒ. (์์ผ๋ฉด "-")
|
| 33 |
+
3. ๋ฐ๋์ ์๋ JSON ํ์์ผ๋ก๋ง ์ถ๋ ฅํ๊ณ ๋ค๋ฅธ ์ค๋ช
์ ์ ๋ ์ถ๊ฐํ์ง ๋ง์ธ์.
|
| 34 |
+
|
| 35 |
+
[์ถ๋ ฅ ํ์]
|
| 36 |
+
{{
|
| 37 |
+
"summary": "...",
|
| 38 |
+
"ott": "..."
|
| 39 |
+
}}
|
| 40 |
+
"""
|
| 41 |
+
|
| 42 |
+
response = client.chat_completion(
|
| 43 |
+
model="Qwen/Qwen2.5-72B-Instruct",
|
| 44 |
+
messages=[{"role": "user", "content": prompt}],
|
| 45 |
+
max_tokens=300,
|
| 46 |
+
temperature=0.1
|
| 47 |
+
)
|
| 48 |
+
|
| 49 |
+
raw_result = response.choices[0].message.content.strip()
|
| 50 |
+
|
| 51 |
+
# ๋งํฌ๋ค์ด ์ฝ๋ ๋ธ๋ก(```json)์ด ๋ถ์ด ๋์ฌ ๊ฒฝ์ฐ ํ
์คํธ ์ ์ฒ๋ฆฌ
|
| 52 |
+
if raw_result.startswith("```"):
|
| 53 |
+
raw_result = raw_result.strip("`").replace("json\n", "")
|
| 54 |
+
|
| 55 |
+
return json.loads(raw_result)
|
| 56 |
+
|
| 57 |
+
except Exception as e:
|
| 58 |
+
raise HTTPException(status_code=500, detail=str(e))
|