Update app.py
Browse files
app.py
CHANGED
|
@@ -1,69 +1,89 @@
|
|
| 1 |
import os
|
| 2 |
-
import google.generativeai as genai
|
| 3 |
-
import gradio as gr
|
| 4 |
import time
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
|
|
|
| 6 |
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
|
| 7 |
|
| 8 |
-
# Set up the model
|
| 9 |
generation_config = {
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
}
|
| 15 |
|
| 16 |
safety_settings = [
|
| 17 |
-
|
| 18 |
-
"category": "
|
| 19 |
-
"threshold": "BLOCK_NONE"
|
| 20 |
-
|
| 21 |
-
{
|
| 22 |
-
"category": "HARM_CATEGORY_HATE_SPEECH",
|
| 23 |
-
"threshold": "BLOCK_NONE"
|
| 24 |
-
},
|
| 25 |
-
{
|
| 26 |
-
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
|
| 27 |
-
"threshold": "BLOCK_NONE"
|
| 28 |
-
},
|
| 29 |
-
{
|
| 30 |
-
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
|
| 31 |
-
"threshold": "BLOCK_NONE"
|
| 32 |
-
},
|
| 33 |
]
|
| 34 |
|
| 35 |
-
model = genai.GenerativeModel(
|
| 36 |
-
|
| 37 |
-
|
|
|
|
|
|
|
| 38 |
|
| 39 |
def generate_curriculum(prompt):
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
prompt,
|
| 45 |
-
"수업 주제 및 수업 의도 ",
|
| 46 |
-
"질문이 넘치는 수업",
|
| 47 |
-
]
|
| 48 |
|
| 49 |
-
|
| 50 |
-
yield full_text # 초기 빈 텍스트 출력
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
description="수업
|
|
|
|
| 67 |
)
|
| 68 |
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import os
|
|
|
|
|
|
|
| 2 |
import time
|
| 3 |
+
import streamlit as st
|
| 4 |
+
import google.generativeai as genai
|
| 5 |
+
from streamlit_extras.colored_header import colored_header
|
| 6 |
+
from streamlit_extras.add_vertical_space import add_vertical_space
|
| 7 |
+
import markdown
|
| 8 |
|
| 9 |
+
# Configure the generative AI model
|
| 10 |
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
|
| 11 |
|
|
|
|
| 12 |
generation_config = {
|
| 13 |
+
"temperature": 1,
|
| 14 |
+
"top_p": 0.95,
|
| 15 |
+
"top_k": 40,
|
| 16 |
+
"max_output_tokens": 8192,
|
| 17 |
}
|
| 18 |
|
| 19 |
safety_settings = [
|
| 20 |
+
{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"},
|
| 21 |
+
{"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"},
|
| 22 |
+
{"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"},
|
| 23 |
+
{"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
]
|
| 25 |
|
| 26 |
+
model = genai.GenerativeModel(
|
| 27 |
+
model_name="gemini-1.5-pro",
|
| 28 |
+
generation_config=generation_config,
|
| 29 |
+
safety_settings=safety_settings,
|
| 30 |
+
)
|
| 31 |
|
| 32 |
def generate_curriculum(prompt):
|
| 33 |
+
prompt_parts = [
|
| 34 |
+
f"수업설계 전문가. 학년: {prompt['grade']}, 주제: {prompt['subject']}, 수업 의도: {prompt['lesson_intent']}. 수업자의 의도를 파악하여, 수업 주제 및 목표에 관한 핵심 질문 및 수업 질문을 만들어 줘, 소크라테스 산파법(교사와 학생이 질문을 계속 주고 받는)을 기반으로한 수업 계획 및 시나리오 작성.",
|
| 35 |
+
"질문 1. 핵심 질문(Big Question)\n\n2. 수업 질문(inquiry question)\n\n3. 수업 도입(전시학습 상기, 동기유발, 학습 목표 및 활동 안내) 부분 시나리오\n\n4. 수업 전개(학습활동 1, 2...) 부분 시나리오\n\n5. 수업 정리(간단한 정리 퀴즈, 수업 내용 정리, 차시 예고) 부분 시나리오\n\n6. 활용할 수 있는 자료\n\n7. 평가 계획 및 수행과제(GRASPS), 평가 루브릭(상, 중, 하)\n\n8. 학습을 위한 팁",
|
| 36 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
+
full_text = "" # 초기 빈 텍스트 출력
|
|
|
|
| 39 |
|
| 40 |
+
try:
|
| 41 |
+
response = model.generate_content(prompt_parts, stream=True)
|
| 42 |
+
for chunk in response:
|
| 43 |
+
full_text += chunk.text
|
| 44 |
+
# Convert markdown to HTML for display
|
| 45 |
+
html_text = markdown.markdown(full_text, extensions=['tables'])
|
| 46 |
+
output_area.markdown(html_text, unsafe_allow_html=True)
|
| 47 |
+
time.sleep(0.05)
|
| 48 |
+
except Exception as e:
|
| 49 |
+
st.error(f"Error: {str(e)}")
|
| 50 |
+
return ""
|
| 51 |
|
| 52 |
+
return full_text
|
| 53 |
+
|
| 54 |
+
# Streamlit Interface
|
| 55 |
+
colored_header(
|
| 56 |
+
label="질문이 넘치는 수업 설계",
|
| 57 |
+
description="수업 주제에 대한 질문이 넘치는 수업 설계를 생성하세요!",
|
| 58 |
+
color_name="red-70",
|
| 59 |
)
|
| 60 |
|
| 61 |
+
add_vertical_space(1)
|
| 62 |
+
|
| 63 |
+
with st.sidebar.expander("입력 설정", expanded=True):
|
| 64 |
+
grade = st.selectbox("학년", ["초등학교 1학년", "초등학교 2학년", "초등학교 3학년", "초등학교 4학년", "초등학교 5학년", "초등학교 6학년"])
|
| 65 |
+
subject = st.text_input("수업 주제")
|
| 66 |
+
lesson_intent = st.text_input("수업 의도")
|
| 67 |
+
|
| 68 |
+
generate_button = st.button("질문이 넘치는 수업 설계 생성")
|
| 69 |
+
|
| 70 |
+
# 출력 영역 정의
|
| 71 |
+
output_area = st.empty()
|
| 72 |
+
|
| 73 |
+
if generate_button:
|
| 74 |
+
prompt_data = {
|
| 75 |
+
"grade": grade,
|
| 76 |
+
"subject": subject,
|
| 77 |
+
"lesson_intent": lesson_intent,
|
| 78 |
+
}
|
| 79 |
+
result = generate_curriculum(prompt_data)
|
| 80 |
+
st.session_state.generated_activity = result
|
| 81 |
+
|
| 82 |
+
# 복사 버튼 추가
|
| 83 |
+
if result:
|
| 84 |
+
if st.button("출력 내용 복사"):
|
| 85 |
+
try:
|
| 86 |
+
st.experimental_set_query_params(copied_text=result)
|
| 87 |
+
st.success("출력 내용이 복사되었습니다!")
|
| 88 |
+
except Exception as e:
|
| 89 |
+
st.error(f"복사 중 오류가 발생했습니다: {str(e)}")
|