ll7098ll commited on
Commit
b33bbc5
Β·
verified Β·
1 Parent(s): 0ba7b64

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -47
app.py CHANGED
@@ -5,7 +5,6 @@ import google.generativeai as genai
5
  import streamlit as st
6
  from streamlit_extras.colored_header import colored_header
7
  from streamlit_extras.add_vertical_space import add_vertical_space
8
- import streamlit.components.v1 as components
9
 
10
  # Google Gemini API ν‚€ μ„€μ •
11
  genai.configure(api_key=os.environ["GEMINI_API_KEY"])
@@ -20,11 +19,11 @@ generation_config = {
20
  }
21
 
22
  model = genai.GenerativeModel(
23
- model_name="gemini-1.5-pro-002",
24
  generation_config=generation_config,
25
  )
26
 
27
- # ν”„λ‘¬ν”„νŠΈ μ„€μ • (λ³€κ²½ μ—†μŒ)
28
  SYSTEM_PROMPT = """
29
  μœ„ μ£Όμ œμ— λŒ€ν•œ κ°œλ… 기반 κ΅μœ‘κ³Όμ •μ„ λ‹€μŒ ꡬ성 μš”μ†Œμ— 따라 μƒμ„Έν•˜κ²Œ 섀계해 μ£Όμ„Έμš”. 각 ꡬ성 μš”μ†ŒλŠ” μ„œλ‘œ μ—°κ²°λ˜κ³  유기적으둜 κ΅¬μ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ꡬ체적인 μ˜ˆμ‹œλ₯Ό ν¬ν•¨ν•˜μ—¬ μ„€λͺ…ν•˜κ³ , ν•™μƒλ“€μ˜ ν₯미와 μ°Έμ—¬λ₯Ό μœ λ„ν•  수 μžˆλŠ” 창의적이고 ν˜μ‹ μ μΈ ν™œλ™λ“€μ„ μ œμ‹œν•΄ μ£Όμ„Έμš”. 특히, 탐ꡬ ν™œλ™μ„ 톡해 학생듀이 슀슀둜 μΌλ°˜ν™”λ₯Ό λ„μΆœν•˜κ³  핡심 κ°œλ…μ„ 깊이 있게 이해할 수 μžˆλ„λ‘ 섀계해야 ν•©λ‹ˆλ‹€. μŠ€νŠΈλžœλ“œ(Strand)λŠ” λ‹¨μ›μ˜ μ†Œμ£Όμ œμ™€ κ°™μœΌλ©°, 각 μŠ€νŠΈλžœλ“œλŠ” μ—¬λŸ¬ μ°¨μ‹œμ˜ μˆ˜μ—…μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. μ°¨μ‹œλ³„ ν™œλ™ λ‚΄μš©κΉŒμ§€ μƒμ„Ένžˆ κΈ°μˆ ν•΄ μ£Όμ„Έμš”.
30
 
@@ -75,25 +74,20 @@ def generate_curriculum(grade, achievement_standard):
75
  SYSTEM_PROMPT,
76
  f"**λŒ€μƒ ν•™λ…„:** μ΄ˆλ“±ν•™κ΅ {grade}ν•™λ…„",
77
  f"**μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš©:** {achievement_standard}",
78
- "**κ°œλ…κΈ°λ°˜ κ΅μœ‘κ³Όμ •:**",
79
  ]
80
 
81
  full_text = ""
82
- output_area = st.empty() # 좜λ ₯ μ˜μ—­ μ΄ˆκΈ°ν™”
83
  try:
84
  response = model.generate_content(prompt, stream=True)
85
  for chunk in response:
86
  full_text += chunk.text
87
- # Streamlit μ—…λ°μ΄νŠΈ (μ‹€μ‹œκ°„ 좜λ ₯)
88
- output_area.text_area("κ°œλ…κΈ°λ°˜ κ΅μœ‘κ³Όμ •", value=full_text, height=600) # 높이 μ‘°μ •
89
- time.sleep(0.01) # μ§€μ—° μ‹œκ°„ μ‘°μ • (ν•„μš”μ— 따라)
90
  except Exception as e:
91
  print(f"μ—λŸ¬ λ°œμƒ: {str(e)}")
92
- st.error(f"μ—λŸ¬ λ°œμƒ: {str(e)}") # μ—λŸ¬ λ©”μ‹œμ§€ Streamlit에 ν‘œμ‹œ
93
  return ""
94
 
95
- return full_text
96
-
97
 
98
  # Streamlit μΈν„°νŽ˜μ΄μŠ€
99
  colored_header(
@@ -106,48 +100,22 @@ add_vertical_space(1) # 곡간 μΆ”κ°€
106
 
107
  # μž…λ ₯ μœ„μ ― (μ‚¬μ΄λ“œλ°” μ‚¬μš©, ν™•μž₯ κ°€λŠ₯)
108
  with st.sidebar.expander("μž…λ ₯ μ„€μ •", expanded=True): # ν™•μž₯ κ°€λŠ₯ νŒ¨λ„
109
- grade_options = ["μ΄ˆλ“±ν•™κ΅ 1ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 2ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 3ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 4ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 5ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 6ν•™λ…„"]
 
 
 
110
  grade_selected = st.selectbox("ν•™λ…„ 선택", grade_options, index=0)
111
  grade = grade_options.index(grade_selected) + 1
112
 
113
  achievement_standard = st.text_area("μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš© μž…λ ₯", height=200)
114
-
115
- generate_button = st.button("κ΅μœ‘κ³Όμ • 생성") # λ²„νŠΌ λ³€μˆ˜ μ €μž₯
116
 
117
- # 생성 λ²„νŠΌ ν΄λ¦­μ‹œ λ™μž‘
118
- if generate_button and achievement_standard:
119
- result = generate_curriculum(grade, achievement_standard)
120
- st.session_state.generated_curriculum = result
121
- elif generate_button and not achievement_standard:
122
- st.warning("μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš©μ„ μž…λ ₯ν•˜μ„Έμš”.")
123
 
124
- # 좜λ ₯ μ˜μ—­ (슀트리밍 좜λ ₯ 및 슀크둀 μžλ™ μ‘°μ •)
125
- output_area = st.empty()
126
  if generate_button and achievement_standard:
127
- with output_area.container(): # μ»¨ν…Œμ΄λ„ˆ μ‚¬μš©
128
- # μ»΄ν¬λ„ŒνŠΈ 생성 및 슀크둀 μ‘°μ • 콜백 ν•¨μˆ˜ μ •μ˜
129
- def scroll_to_bottom():
130
- js_code = """
131
- <script>
132
- const textArea = parent.document.querySelector('#output-frame .stTextArea textarea');
133
- if (textArea) {
134
- textArea.scrollTop = textArea.scrollHeight;
135
- }
136
- </script>
137
- """
138
- components.html(js_code, height=0, width=0)
139
-
140
- try:
141
- response = model.generate_content(prompt, stream=True)
142
- full_text = ""
143
- for chunk in response:
144
- full_text += chunk.text
145
- st.text_area("κ°œλ…κΈ°λ°˜ κ΅μœ‘κ³Όμ •", value=full_text, height=600, key=f"output_text_area_{time.time()}") # 고유 key κ°’ μ‚¬μš©
146
- scroll_to_bottom()
147
- time.sleep(0.01)
148
- st.session_state.generated_curriculum = full_text # μ„Έμ…˜ μƒνƒœ μ €μž₯
149
- except Exception as e:
150
- print(f"μ—λŸ¬ λ°œμƒ: {str(e)}")
151
- st.error(f"μ—λŸ¬ λ°œμƒ: {str(e)}")
152
  elif generate_button and not achievement_standard:
153
  st.warning("μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš©μ„ μž…λ ₯ν•˜μ„Έμš”.")
 
5
  import streamlit as st
6
  from streamlit_extras.colored_header import colored_header
7
  from streamlit_extras.add_vertical_space import add_vertical_space
 
8
 
9
  # Google Gemini API ν‚€ μ„€μ •
10
  genai.configure(api_key=os.environ["GEMINI_API_KEY"])
 
19
  }
20
 
21
  model = genai.GenerativeModel(
22
+ model_name="gemini-1.5-pro-002",
23
  generation_config=generation_config,
24
  )
25
 
26
+ # ν”„λ‘¬ν”„νŠΈ μ„€μ •
27
  SYSTEM_PROMPT = """
28
  μœ„ μ£Όμ œμ— λŒ€ν•œ κ°œλ… 기반 κ΅μœ‘κ³Όμ •μ„ λ‹€μŒ ꡬ성 μš”μ†Œμ— 따라 μƒμ„Έν•˜κ²Œ 섀계해 μ£Όμ„Έμš”. 각 ꡬ성 μš”μ†ŒλŠ” μ„œλ‘œ μ—°κ²°λ˜κ³  유기적으둜 κ΅¬μ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ꡬ체적인 μ˜ˆμ‹œλ₯Ό ν¬ν•¨ν•˜μ—¬ μ„€λͺ…ν•˜κ³ , ν•™μƒλ“€μ˜ ν₯미와 μ°Έμ—¬λ₯Ό μœ λ„ν•  수 μžˆλŠ” 창의적이고 ν˜μ‹ μ μΈ ν™œλ™λ“€μ„ μ œμ‹œν•΄ μ£Όμ„Έμš”. 특히, 탐ꡬ ν™œλ™μ„ 톡해 학생듀이 슀슀둜 μΌλ°˜ν™”λ₯Ό λ„μΆœν•˜κ³  핡심 κ°œλ…μ„ 깊이 있게 이해할 수 μžˆλ„λ‘ 섀계해야 ν•©λ‹ˆλ‹€. μŠ€νŠΈλžœλ“œ(Strand)λŠ” λ‹¨μ›μ˜ μ†Œμ£Όμ œμ™€ κ°™μœΌλ©°, 각 μŠ€νŠΈλžœλ“œλŠ” μ—¬λŸ¬ μ°¨μ‹œμ˜ μˆ˜μ—…μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. μ°¨μ‹œλ³„ ν™œλ™ λ‚΄μš©κΉŒμ§€ μƒμ„Ένžˆ κΈ°μˆ ν•΄ μ£Όμ„Έμš”.
29
 
 
74
  SYSTEM_PROMPT,
75
  f"**λŒ€μƒ ν•™λ…„:** μ΄ˆλ“±ν•™κ΅ {grade}ν•™λ…„",
76
  f"**μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš©:** {achievement_standard}",
77
+ "**κ°œλ…κΈ°λ°˜ κ΅μœ‘κ³Όμ •:**",
78
  ]
79
 
80
  full_text = ""
 
81
  try:
82
  response = model.generate_content(prompt, stream=True)
83
  for chunk in response:
84
  full_text += chunk.text
85
+ return full_text
 
 
86
  except Exception as e:
87
  print(f"μ—λŸ¬ λ°œμƒ: {str(e)}")
88
+ st.error(f"μ—λŸ¬ λ°œμƒ: {str(e)}")
89
  return ""
90
 
 
 
91
 
92
  # Streamlit μΈν„°νŽ˜μ΄μŠ€
93
  colored_header(
 
100
 
101
  # μž…λ ₯ μœ„μ ― (μ‚¬μ΄λ“œλ°” μ‚¬μš©, ν™•μž₯ κ°€λŠ₯)
102
  with st.sidebar.expander("μž…λ ₯ μ„€μ •", expanded=True): # ν™•μž₯ κ°€λŠ₯ νŒ¨λ„
103
+ grade_options = [
104
+ "μ΄ˆλ“±ν•™κ΅ 1ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 2ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 3ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 4ν•™λ…„",
105
+ "μ΄ˆλ“±ν•™κ΅ 5ν•™λ…„", "μ΄ˆλ“±ν•™κ΅ 6ν•™λ…„"
106
+ ]
107
  grade_selected = st.selectbox("ν•™λ…„ 선택", grade_options, index=0)
108
  grade = grade_options.index(grade_selected) + 1
109
 
110
  achievement_standard = st.text_area("μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš© μž…λ ₯", height=200)
 
 
111
 
112
+ generate_button = st.button("κ΅μœ‘κ³Όμ • 생성")
 
 
 
 
 
113
 
114
+ # 생성 λ²„νŠΌ ν΄λ¦­μ‹œ λ™μž‘
 
115
  if generate_button and achievement_standard:
116
+ with st.spinner("생성 쀑..."): # λ‘œλ”© ν‘œμ‹œ μΆ”κ°€
117
+ result = generate_curriculum(grade, achievement_standard)
118
+ st.session_state.generated_curriculum = result
119
+ st.text_area("κ°œλ…κΈ°λ°˜ κ΅μœ‘κ³Όμ •", value=result, height=600)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  elif generate_button and not achievement_standard:
121
  st.warning("μ„±μ·¨κΈ°μ€€ 및 μ£Όμš” λ‚΄μš©μ„ μž…λ ₯ν•˜μ„Έμš”.")