JUNGU commited on
Commit
5401fa4
ยท
verified ยท
1 Parent(s): 1e902e8

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +36 -26
src/streamlit_app.py CHANGED
@@ -41,21 +41,35 @@ class SchedulerState:
41
  global_scheduler_state = SchedulerState()
42
 
43
  # API ํ‚ค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์„ธ์…˜ ์ƒํƒœ ์ดˆ๊ธฐํ™”
44
- if 'openai_api_key' not in st.session_state:
45
- st.session_state.openai_api_key = None
46
 
47
  # ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ API ํ‚ค ๋กœ๋“œ ์‹œ๋„
48
  load_dotenv() # .env ํŒŒ์ผ์—์„œ ๋กœ๋“œ ์‹œ๋„
49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  # 1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ API ํ‚ค ํ™•์ธ
51
- if os.environ.get('OPENAI_API_KEY'):
52
- st.session_state.openai_api_key = os.environ.get('OPENAI_API_KEY')
 
53
 
54
- # 2. Streamlit secrets์—์„œ API ํ‚ค ํ™•์ธ (try-except๋กœ ์˜ค๋ฅ˜ ๋ฐฉ์ง€)
55
- if not st.session_state.openai_api_key:
56
  try:
57
  if 'OPENAI_API_KEY' in st.secrets:
58
- st.session_state.openai_api_key = st.secrets['OPENAI_API_KEY']
59
  except Exception as e:
60
  pass # secrets ํŒŒ์ผ์ด ์—†์–ด๋„ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
61
 
@@ -88,13 +102,12 @@ with st.sidebar:
88
  st.divider()
89
  api_key = st.text_input("OpenAI API ํ‚ค ์ž…๋ ฅ", type="password")
90
  if api_key:
91
- st.session_state.openai_api_key = api_key
92
-
93
- # OpenAI ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜
94
- def init_openai_client():
95
- if st.session_state.openai_api_key:
96
- return OpenAI(api_key=st.session_state.openai_api_key)
97
- return None
98
 
99
  # ์ €์žฅ๋œ ๊ธฐ์‚ฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜
100
  def load_saved_articles():
@@ -340,11 +353,10 @@ def analyze_news_content(news_df):
340
  # OpenAI API๋ฅผ ์ด์šฉํ•œ ์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑ (์ƒˆ๋กœ์šด ๋ฒ„์ „ ๋ฐฉ์‹)
341
  def generate_article(original_content, prompt_text):
342
  try:
343
- if not st.session_state.openai_api_key:
344
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
345
 
346
- client = init_openai_client()
347
- response = client.chat.completions.create(
348
  model="gpt-4", # ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ์ ˆํ•œ ๋ชจ๋ธ
349
  messages=[
350
  {"role": "system", "content": "๋‹น์‹ ์€ ์ „๋ฌธ์ ์ธ ๋‰ด์Šค ๊ธฐ์ž์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."},
@@ -359,11 +371,10 @@ def generate_article(original_content, prompt_text):
359
  # OpenAI API๋ฅผ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ (์ƒˆ๋กœ์šด ๋ฒ„์ „ ๋ฐฉ์‹)
360
  def generate_image(prompt):
361
  try:
362
- if not st.session_state.openai_api_key:
363
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
364
 
365
- client = init_openai_client()
366
- response = client.images.generate(
367
  model="dall-e-3", # ๋˜๋Š” "dall-e-2"
368
  prompt=prompt,
369
  n=1,
@@ -647,11 +658,10 @@ elif menu == "๊ธฐ์‚ฌ ๋ถ„์„ํ•˜๊ธฐ":
647
 
648
  elif analysis_type == "๊ฐ์ • ๋ถ„์„":
649
  if st.button("๊ฐ์ • ๋ถ„์„ํ•˜๊ธฐ"):
650
- if st.session_state.openai_api_key:
651
  with st.spinner("๊ธฐ์‚ฌ์˜ ๊ฐ์ •์„ ๋ถ„์„ ์ค‘์ž…๋‹ˆ๋‹ค..."):
652
  try:
653
- client = init_openai_client()
654
- response = client.chat.completions.create(
655
  model="gpt-4", # ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ์ ˆํ•œ ๋ชจ๋ธ
656
  messages=[
657
  {"role": "system", "content": "๋‹น์‹ ์€ ํ…์ŠคํŠธ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , '๊ธ์ •์ ', '๋ถ€์ •์ ', '์ค‘๋ฆฝ์ ' ์ค‘ ํ•˜๋‚˜๋กœ ๋ถ„๋ฅ˜ํ•ด ์ฃผ์„ธ์š”. ๋˜ํ•œ ๊ธฐ์‚ฌ์—์„œ ๋“œ๋Ÿฌ๋‚˜๋Š” ํ•ต์‹ฌ ๊ฐ์ • ํ‚ค์›Œ๋“œ๋ฅผ 5๊ฐœ ์ถ”์ถœํ•˜๊ณ , ๊ฐ ํ‚ค์›Œ๋“œ๋ณ„๋กœ 1-10 ์‚ฌ์ด์˜ ๊ฐ•๋„ ์ ์ˆ˜๋ฅผ ๋งค๊ฒจ์ฃผ์„ธ์š”. JSON ํ˜•์‹์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•ด์ฃผ์„ธ์š”: {'sentiment': '๊ธ์ •์ /๋ถ€์ •์ /์ค‘๋ฆฝ์ ', 'reason': '์ด์œ  ์„ค๋ช…...', 'keywords': [{'word': 'ํ‚ค์›Œ๋“œ1', 'score': 8}, {'word': 'ํ‚ค์›Œ๋“œ2', 'score': 7}, ...]}"},
@@ -810,9 +820,9 @@ elif menu == "๊ธฐ์‚ฌ ๋ถ„์„ํ•˜๊ธฐ":
810
 
811
  except Exception as e:
812
  st.error(f"๊ฐ์ • ๋ถ„์„ ์˜ค๋ฅ˜: {str(e)}")
813
- st.code(traceback.format_exc())
814
  else:
815
- st.warning("OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ด๋“œ๋ฐ”์—์„œ API ํ‚ค๋ฅผ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.")
816
 
817
  elif menu == "์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ":
818
  st.header("์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ")
@@ -847,7 +857,7 @@ elif menu == "์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ":
847
  generate_image_too = st.checkbox("๊ธฐ์‚ฌ ์ƒ์„ฑ ํ›„ ์ด๋ฏธ์ง€๋„ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๊ธฐ", value=True)
848
 
849
  if st.button("์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ"):
850
- if st.session_state.openai_api_key:
851
  with st.spinner("๊ธฐ์‚ฌ๋ฅผ ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค..."):
852
  new_article = generate_article(selected_article['content'], prompt_text)
853
 
 
41
  global_scheduler_state = SchedulerState()
42
 
43
  # API ํ‚ค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์„ธ์…˜ ์ƒํƒœ ์ดˆ๊ธฐํ™”
44
+ if 'openai_client' not in st.session_state:
45
+ st.session_state.openai_client = None
46
 
47
  # ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ API ํ‚ค ๋กœ๋“œ ์‹œ๋„
48
  load_dotenv() # .env ํŒŒ์ผ์—์„œ ๋กœ๋“œ ์‹œ๋„
49
 
50
+ # OpenAI ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜
51
+ def init_openai_client(api_key=None):
52
+ try:
53
+ if api_key:
54
+ client = OpenAI(api_key=api_key)
55
+ # ๊ฐ„๋‹จํ•œ API ํ‚ค ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
56
+ client.models.list() # API ํ‚ค๊ฐ€ ์œ ํšจํ•œ์ง€ ํ…Œ์ŠคํŠธ
57
+ return client
58
+ return None
59
+ except Exception as e:
60
+ st.error(f"API ํ‚ค ์ดˆ๊ธฐํ™” ์˜ค๋ฅ˜: {str(e)}")
61
+ return None
62
+
63
  # 1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ API ํ‚ค ํ™•์ธ
64
+ api_key = os.environ.get('OPENAI_API_KEY')
65
+ if api_key:
66
+ st.session_state.openai_client = init_openai_client(api_key)
67
 
68
+ # 2. Streamlit secrets์—์„œ API ํ‚ค ํ™•์ธ
69
+ if not st.session_state.openai_client:
70
  try:
71
  if 'OPENAI_API_KEY' in st.secrets:
72
+ st.session_state.openai_client = init_openai_client(st.secrets['OPENAI_API_KEY'])
73
  except Exception as e:
74
  pass # secrets ํŒŒ์ผ์ด ์—†์–ด๋„ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
75
 
 
102
  st.divider()
103
  api_key = st.text_input("OpenAI API ํ‚ค ์ž…๋ ฅ", type="password")
104
  if api_key:
105
+ client = init_openai_client(api_key)
106
+ if client:
107
+ st.session_state.openai_client = client
108
+ st.success("API ํ‚ค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!")
109
+ else:
110
+ st.error("์œ ํšจํ•˜์ง€ ์•Š์€ API ํ‚ค์ž…๋‹ˆ๋‹ค.")
 
111
 
112
  # ์ €์žฅ๋œ ๊ธฐ์‚ฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜
113
  def load_saved_articles():
 
353
  # OpenAI API๋ฅผ ์ด์šฉํ•œ ์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑ (์ƒˆ๋กœ์šด ๋ฒ„์ „ ๋ฐฉ์‹)
354
  def generate_article(original_content, prompt_text):
355
  try:
356
+ if not st.session_state.openai_client:
357
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
358
 
359
+ response = st.session_state.openai_client.chat.completions.create(
 
360
  model="gpt-4", # ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ์ ˆํ•œ ๋ชจ๋ธ
361
  messages=[
362
  {"role": "system", "content": "๋‹น์‹ ์€ ์ „๋ฌธ์ ์ธ ๋‰ด์Šค ๊ธฐ์ž์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."},
 
371
  # OpenAI API๋ฅผ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ (์ƒˆ๋กœ์šด ๋ฒ„์ „ ๋ฐฉ์‹)
372
  def generate_image(prompt):
373
  try:
374
+ if not st.session_state.openai_client:
375
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
376
 
377
+ response = st.session_state.openai_client.images.generate(
 
378
  model="dall-e-3", # ๋˜๋Š” "dall-e-2"
379
  prompt=prompt,
380
  n=1,
 
658
 
659
  elif analysis_type == "๊ฐ์ • ๋ถ„์„":
660
  if st.button("๊ฐ์ • ๋ถ„์„ํ•˜๊ธฐ"):
661
+ if st.session_state.openai_client:
662
  with st.spinner("๊ธฐ์‚ฌ์˜ ๊ฐ์ •์„ ๋ถ„์„ ์ค‘์ž…๋‹ˆ๋‹ค..."):
663
  try:
664
+ response = st.session_state.openai_client.chat.completions.create(
 
665
  model="gpt-4", # ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ์ ˆํ•œ ๋ชจ๋ธ
666
  messages=[
667
  {"role": "system", "content": "๋‹น์‹ ์€ ํ…์ŠคํŠธ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , '๊ธ์ •์ ', '๋ถ€์ •์ ', '์ค‘๋ฆฝ์ ' ์ค‘ ํ•˜๋‚˜๋กœ ๋ถ„๋ฅ˜ํ•ด ์ฃผ์„ธ์š”. ๋˜ํ•œ ๊ธฐ์‚ฌ์—์„œ ๋“œ๋Ÿฌ๋‚˜๋Š” ํ•ต์‹ฌ ๊ฐ์ • ํ‚ค์›Œ๋“œ๋ฅผ 5๊ฐœ ์ถ”์ถœํ•˜๊ณ , ๊ฐ ํ‚ค์›Œ๋“œ๋ณ„๋กœ 1-10 ์‚ฌ์ด์˜ ๊ฐ•๋„ ์ ์ˆ˜๋ฅผ ๋งค๊ฒจ์ฃผ์„ธ์š”. JSON ํ˜•์‹์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•ด์ฃผ์„ธ์š”: {'sentiment': '๊ธ์ •์ /๋ถ€์ •์ /์ค‘๋ฆฝ์ ', 'reason': '์ด์œ  ์„ค๋ช…...', 'keywords': [{'word': 'ํ‚ค์›Œ๋“œ1', 'score': 8}, {'word': 'ํ‚ค์›Œ๋“œ2', 'score': 7}, ...]}"},
 
820
 
821
  except Exception as e:
822
  st.error(f"๊ฐ์ • ๋ถ„์„ ์˜ค๋ฅ˜: {str(e)}")
823
+ st.error(traceback.format_exc())
824
  else:
825
+ st.warning("OpenAI API ํ‚ค๋ฅผ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.")
826
 
827
  elif menu == "์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ":
828
  st.header("์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ")
 
857
  generate_image_too = st.checkbox("๊ธฐ์‚ฌ ์ƒ์„ฑ ํ›„ ์ด๋ฏธ์ง€๋„ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๊ธฐ", value=True)
858
 
859
  if st.button("์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ"):
860
+ if st.session_state.openai_client:
861
  with st.spinner("๊ธฐ์‚ฌ๋ฅผ ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค..."):
862
  new_article = generate_article(selected_article['content'], prompt_text)
863