JUNGU commited on
Commit
df30c77
ยท
verified ยท
1 Parent(s): 7fc484d

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +22 -19
src/streamlit_app.py CHANGED
@@ -11,7 +11,7 @@ from collections import Counter
11
  import json
12
  import os
13
  from datetime import datetime, timedelta
14
- import openai # ๊ตฌ ๋ฒ„์ „ ๋ฐฉ์‹ ์‚ฌ์šฉ
15
  from dotenv import load_dotenv
16
  import traceback
17
  import plotly.graph_objects as go
@@ -50,14 +50,12 @@ load_dotenv() # .env ํŒŒ์ผ์—์„œ ๋กœ๋“œ ์‹œ๋„
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
- openai.api_key = st.session_state.openai_api_key
54
 
55
  # 2. Streamlit secrets์—์„œ API ํ‚ค ํ™•์ธ (try-except๋กœ ์˜ค๋ฅ˜ ๋ฐฉ์ง€)
56
  if not st.session_state.openai_api_key:
57
  try:
58
  if 'OPENAI_API_KEY' in st.secrets:
59
  st.session_state.openai_api_key = st.secrets['OPENAI_API_KEY']
60
- openai.api_key = st.session_state.openai_api_key
61
  except Exception as e:
62
  pass # secrets ํŒŒ์ผ์ด ์—†์–ด๋„ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
63
 
@@ -91,8 +89,12 @@ with st.sidebar:
91
  api_key = st.text_input("OpenAI API ํ‚ค ์ž…๋ ฅ", type="password")
92
  if api_key:
93
  st.session_state.openai_api_key = api_key
94
- openai.api_key = api_key
95
- st.success("API ํ‚ค๊ฐ€ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!")
 
 
 
 
96
 
97
  # ์ €์žฅ๋œ ๊ธฐ์‚ฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜
98
  def load_saved_articles():
@@ -335,36 +337,39 @@ def analyze_news_content(news_df):
335
  results['top_keywords'] = []
336
  return results
337
 
338
- # OpenAI API๋ฅผ ์ด์šฉํ•œ ์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑ (๊ตฌ ๋ฒ„์ „ ๋ฐฉ์‹)
339
  def generate_article(original_content, prompt_text):
340
  try:
341
  if not st.session_state.openai_api_key:
342
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
343
 
344
- response = openai.ChatCompletion.create(
345
- model="gpt-4.1-mini",
 
346
  messages=[
347
  {"role": "system", "content": "๋‹น์‹ ์€ ์ „๋ฌธ์ ์ธ ๋‰ด์Šค ๊ธฐ์ž์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."},
348
  {"role": "user", "content": f"๋‹ค์Œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ {prompt_text}\n\n{original_content[:1000]}"}
349
  ],
350
  max_tokens=2000
351
  )
352
- return response.choices[0].message['content']
353
  except Exception as e:
354
  return f"๊ธฐ์‚ฌ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(e)}"
355
 
356
- # OpenAI API๋ฅผ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ (๊ตฌ ๋ฒ„์ „ ๋ฐฉ์‹)
357
  def generate_image(prompt):
358
  try:
359
  if not st.session_state.openai_api_key:
360
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
361
 
362
- response = openai.Image.create(
 
 
363
  prompt=prompt,
364
  n=1,
365
  size="1024x1024"
366
  )
367
- return response['data'][0]['url']
368
  except Exception as e:
369
  return f"์ด๋ฏธ์ง€ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(e)}"
370
 
@@ -645,9 +650,9 @@ elif menu == "๊ธฐ์‚ฌ ๋ถ„์„ํ•˜๊ธฐ":
645
  if st.session_state.openai_api_key:
646
  with st.spinner("๊ธฐ์‚ฌ์˜ ๊ฐ์ •์„ ๋ถ„์„ ์ค‘์ž…๋‹ˆ๋‹ค..."):
647
  try:
648
- # ๊ฐ์ • ๋ถ„์„ ํ”„๋กฌํ”„ํŠธ ์„ค์ • (๊ตฌ ๋ฒ„์ „ ๋ฐฉ์‹)
649
- response = openai.ChatCompletion.create(
650
- model="gpt-4.1-mini",
651
  messages=[
652
  {"role": "system", "content": "๋‹น์‹ ์€ ํ…์ŠคํŠธ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , '๊ธ์ •์ ', '๋ถ€์ •์ ', '์ค‘๋ฆฝ์ ' ์ค‘ ํ•˜๋‚˜๋กœ ๋ถ„๋ฅ˜ํ•ด ์ฃผ์„ธ์š”. ๋˜ํ•œ ๊ธฐ์‚ฌ์—์„œ ๋“œ๋Ÿฌ๋‚˜๋Š” ํ•ต์‹ฌ ๊ฐ์ • ํ‚ค์›Œ๋“œ๋ฅผ 5๊ฐœ ์ถ”์ถœํ•˜๊ณ , ๊ฐ ํ‚ค์›Œ๋“œ๋ณ„๋กœ 1-10 ์‚ฌ์ด์˜ ๊ฐ•๋„ ์ ์ˆ˜๋ฅผ ๋งค๊ฒจ์ฃผ์„ธ์š”. JSON ํ˜•์‹์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•ด์ฃผ์„ธ์š”: {'sentiment': '๊ธ์ •์ /๋ถ€์ •์ /์ค‘๋ฆฝ์ ', 'reason': '์ด์œ  ์„ค๋ช…...', 'keywords': [{'word': 'ํ‚ค์›Œ๋“œ1', 'score': 8}, {'word': 'ํ‚ค์›Œ๋“œ2', 'score': 7}, ...]}"},
653
  {"role": "user", "content": f"๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ๋ฅผ ๋ถ„์„ํ•ด ์ฃผ์„ธ์š”:\n\n์ œ๋ชฉ: {selected_article['title']}\n\n๋‚ด์šฉ: {selected_article['content'][:1500]}"}
@@ -655,8 +660,8 @@ elif menu == "๊ธฐ์‚ฌ ๋ถ„์„ํ•˜๊ธฐ":
655
  max_tokens=800
656
  )
657
 
658
- # JSON ํŒŒ์‹ฑ (๊ตฌ ๋ฒ„์ „ ๋ฐฉ์‹)
659
- analysis_result = json.loads(response.choices[0].message['content'])
660
 
661
  # ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
662
  st.subheader("๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ")
@@ -885,8 +890,6 @@ elif menu == "์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ":
885
  else:
886
  st.warning("OpenAI API ํ‚ค๋ฅผ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.")
887
 
888
-
889
-
890
  elif menu == "๋‰ด์Šค ๊ธฐ์‚ฌ ์˜ˆ์•ฝํ•˜๊ธฐ":
891
  st.header("๋‰ด์Šค ๊ธฐ์‚ฌ ์˜ˆ์•ฝํ•˜๊ธฐ")
892
 
 
11
  import json
12
  import os
13
  from datetime import datetime, timedelta
14
+ from openai import OpenAI # ์ƒˆ๋กœ์šด import ๋ฐฉ์‹
15
  from dotenv import load_dotenv
16
  import traceback
17
  import plotly.graph_objects as go
 
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
 
 
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():
 
337
  results['top_keywords'] = []
338
  return results
339
 
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": "๋‹น์‹ ์€ ์ „๋ฌธ์ ์ธ ๋‰ด์Šค ๊ธฐ์ž์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."},
351
  {"role": "user", "content": f"๋‹ค์Œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ {prompt_text}\n\n{original_content[:1000]}"}
352
  ],
353
  max_tokens=2000
354
  )
355
+ return response.choices[0].message.content
356
  except Exception as e:
357
  return f"๊ธฐ์‚ฌ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(e)}"
358
 
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,
370
  size="1024x1024"
371
  )
372
+ return response.data[0].url
373
  except Exception as e:
374
  return f"์ด๋ฏธ์ง€ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(e)}"
375
 
 
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}, ...]}"},
658
  {"role": "user", "content": f"๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ๋ฅผ ๋ถ„์„ํ•ด ์ฃผ์„ธ์š”:\n\n์ œ๋ชฉ: {selected_article['title']}\n\n๋‚ด์šฉ: {selected_article['content'][:1500]}"}
 
660
  max_tokens=800
661
  )
662
 
663
+ # JSON ํŒŒ์‹ฑ
664
+ analysis_result = json.loads(response.choices[0].message.content)
665
 
666
  # ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
667
  st.subheader("๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ")
 
890
  else:
891
  st.warning("OpenAI API ํ‚ค๋ฅผ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.")
892
 
 
 
893
  elif menu == "๋‰ด์Šค ๊ธฐ์‚ฌ ์˜ˆ์•ฝํ•˜๊ธฐ":
894
  st.header("๋‰ด์Šค ๊ธฐ์‚ฌ ์˜ˆ์•ฝํ•˜๊ธฐ")
895