schoolcal / app.py
yongyeol's picture
Update app.py
071ecd9 verified
raw
history blame
4.87 kB
import os
import requests
import gradio as gr
from datetime import datetime
from transformers import pipeline
# ────────────────────────────── λͺ¨λΈ 뢈러였기 ──────────────────────────────
llm = pipeline("text-generation", model="google/gemma-2-2b-it", max_new_tokens=512)
# ────────────────────────────── API 처리 ν•¨μˆ˜ ──────────────────────────────
def get_school_info(region_code, school_name, api_key):
url = f"https://open.neis.go.kr/hub/schoolInfo?KEY={api_key}&Type=json&pIndex=1&pSize=1&SCHUL_NM={school_name}&ATPT_OFCDC_SC_CODE={region_code}"
res = requests.get(url)
data = res.json()
school = data.get("schoolInfo", [{}])[1].get("row", [{}])[0]
return school.get("SD_SCHUL_CODE"), school.get("ATPT_OFCDC_SC_CODE")
def get_schedule(region_code, school_code, year, api_key):
from_ymd = f"{year}0101"
to_ymd = f"{year}1231"
url = f"https://open.neis.go.kr/hub/SchoolSchedule?KEY={api_key}&Type=json&pIndex=1&pSize=500&ATPT_OFCDC_SC_CODE={region_code}&SD_SCHUL_CODE={school_code}&AA_FROM_YMD={from_ymd}&AA_TO_YMD={to_ymd}"
res = requests.get(url)
data = res.json()
rows = data.get("SchoolSchedule", [{}])[1].get("row", [])
return rows
def summarize_schedule(rows, school_name, year):
lines = []
for row in rows:
date = row["AA_YMD"]
dt = datetime.strptime(date, "%Y%m%d").strftime("%-mμ›” %-d일")
event = row["EVENT_NM"]
lines.append(f"{dt}: {event}")
text = "\n".join(lines)
prompt = f"{school_name}의 {year}λ…„ 학사일정은 λ‹€μŒκ³Ό κ°™λ‹€:\n{text}\n이 λ‚΄μš©μ„ μš”μ•½ν•΄μ€˜. μ£Όμš” 일정 μ€‘μ‹¬μœΌλ‘œ κ°„κ²°ν•˜κ²Œ."
result = llm([{"role": "user", "content": prompt}])
return result[0]["generated_text"].replace(prompt, "").strip()
# ────────────────────────────── κ·ΈλΌλ””μ˜€ μΈν„°νŽ˜μ΄μŠ€ ν•¨μˆ˜ ──────────────────────────────
def load_and_summarize(region_code, school_name, year, month):
api_key = os.environ.get("NEIS_API_KEY", "a69e08342c8947b4a52cd72789a5ecaf")
if not school_name.strip():
return "❗ 학ꡐλͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.", "", ""
school_code, confirmed_region = get_school_info(region_code, school_name, api_key)
if not school_code:
return "❗ 학ꡐ 정보λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. μž…λ ₯을 ν™•μΈν•΄μ£Όμ„Έμš”.", "", ""
schedule_rows = get_schedule(confirmed_region, school_code, year, api_key)
if not schedule_rows:
return "ℹ️ 학사일정 정보가 μ—†μŠ΅λ‹ˆλ‹€.", "", ""
# 월별 일정 필터링
month_rows = [r for r in schedule_rows if r["AA_YMD"].startswith(f"{year}{month:02}")]
month_display = "\n".join(
f"{datetime.strptime(r['AA_YMD'], '%Y%m%d').strftime('%Y-%m-%d')} - {r['EVENT_NM']}"
for r in month_rows
) or "πŸ“­ μ„ νƒν•œ 월에 ν•΄λ‹Ήν•˜λŠ” 일정이 μ—†μŠ΅λ‹ˆλ‹€."
# μš”μ•½ 생성
summary = summarize_schedule(schedule_rows, school_name, year)
return f"βœ… {school_name}의 {year}λ…„ {month}μ›” μΌμ •μž…λ‹ˆλ‹€.", month_display, summary
# ────────────────────────────── Gradio UI ꡬ성 ──────────────────────────────
region_options = {
"B10": "μ„œμšΈ", "C10": "λΆ€μ‚°", "D10": "λŒ€κ΅¬", "E10": "인천", "F10": "κ΄‘μ£Ό", "G10": "λŒ€μ „",
"H10": "μšΈμ‚°", "I10": "μ„Έμ’…", "J10": "κ²½κΈ°", "K10": "강원", "M10": "좩뢁", "N10": "좩남",
"P10": "전뢁", "Q10": "전남", "R10": "경뢁", "S10": "경남", "T10": "제주"
}
with gr.Blocks(title="학사일정 μš”μ•½ μΊ˜λ¦°λ”") as demo:
gr.Markdown("## 🏫 학사일정 쑰회 및 AI μš”μ•½ (google/gemma-2-2b-it)")
with gr.Row():
region = gr.Dropdown(label="μ§€μ—­ ꡐ윑청", choices=list(region_options.keys()), value="B10", interactive=True)
school_name = gr.Textbox(label="학ꡐλͺ…", placeholder="예: μƒλ¦¬μ΄ˆλ“±ν•™κ΅")
with gr.Row():
year = gr.Dropdown(label="년도", choices=[2022, 2023, 2024, 2025], value=2024)
month = gr.Slider(label="μ›”", minimum=1, maximum=12, value=7, step=1)
btn = gr.Button("πŸ“… 일정 뢈러였기 및 μš”μ•½")
status = gr.Markdown()
month_output = gr.Textbox(label="πŸ“† μ„ νƒν•œ μ›”μ˜ 일정", lines=8)
summary_output = gr.Textbox(label="πŸ“ 1λ…„ 학사일정 μš”μ•½ (Gemma)", lines=6)
btn.click(fn=load_and_summarize, inputs=[region, school_name, year, month], outputs=[status, month_output, summary_output])
demo.launch()