JUNGU commited on
Commit
f5b13b1
ยท
verified ยท
1 Parent(s): a4e39c8

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +41 -12
src/streamlit_app.py CHANGED
@@ -19,6 +19,9 @@ import schedule
19
  import threading
20
  import matplotlib.pyplot as plt
21
  import kss # KoNLPy ๋Œ€์‹  KSS ์‚ฌ์šฉ
 
 
 
22
 
23
  # ์›Œ๋“œํด๋ผ์šฐ๋“œ ์ถ”๊ฐ€
24
  try:
@@ -357,7 +360,7 @@ def generate_article(original_content, prompt_text):
357
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
358
 
359
  response = st.session_state.openai_client.chat.completions.create(
360
- model="gpt-4.1-nano", # ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ์ ˆํ•œ ๋ชจ๋ธ
361
  messages=[
362
  {"role": "system", "content": "๋‹น์‹ ์€ ์ „๋ฌธ์ ์ธ ๋‰ด์Šค ๊ธฐ์ž์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."},
363
  {"role": "user", "content": f"๋‹ค์Œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ {prompt_text}\n\n{original_content[:1000]}"}
@@ -374,13 +377,31 @@ def generate_image(prompt):
374
  if not st.session_state.openai_client:
375
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
376
 
377
- response = st.session_state.openai_client.images.generate(
378
- model="gpt-image-1", # ๋˜๋Š” "dall-e-2"
 
379
  prompt=prompt,
380
- n=1,
381
  size="1024x1024"
382
  )
383
- return response.data[0].url
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
384
  except Exception as e:
385
  return f"์ด๋ฏธ์ง€ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(e)}"
386
 
@@ -662,9 +683,18 @@ elif menu == "๊ธฐ์‚ฌ ๋ถ„์„ํ•˜๊ธฐ":
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}, ...]}"},
 
 
 
 
 
 
 
 
 
668
  {"role": "user", "content": f"๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ๋ฅผ ๋ถ„์„ํ•ด ์ฃผ์„ธ์š”:\n\n์ œ๋ชฉ: {selected_article['title']}\n\n๋‚ด์šฉ: {selected_article['content'][:1500]}"}
669
  ],
670
  max_tokens=800
@@ -867,7 +897,6 @@ elif menu == "์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ":
867
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ (์˜ต์…˜์ด ์„ ํƒ๋œ ๊ฒฝ์šฐ)
868
  if generate_image_too:
869
  with st.spinner("๊ธฐ์‚ฌ ๊ด€๋ จ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค..."):
870
- # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ ์ค€๋น„
871
  image_prompt = f"""์‹ ๋ฌธ๊ธฐ์‚ฌ ์ œ๋ชฉ "{selected_article['title']}" ์„ ๋ณด๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค˜
872
  ์ด๋ฏธ์ง€์—๋Š” ๋‹ค์Œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
873
  - ๊ธฐ์‚ฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋„์‹
@@ -876,13 +905,13 @@ elif menu == "์ƒˆ ๊ธฐ์‚ฌ ์ƒ์„ฑํ•˜๊ธฐ":
876
  """
877
 
878
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ
879
- image_url = generate_image(image_prompt)
880
 
881
- if image_url and not image_url.startswith("์ด๋ฏธ์ง€ ์ƒ์„ฑ ์˜ค๋ฅ˜"):
882
  st.subheader("์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€:")
883
- st.image(image_url)
884
  else:
885
- st.error(image_url)
886
 
887
  # ์ƒ์„ฑ๋œ ๊ธฐ์‚ฌ ์ €์žฅ ์˜ต์…˜
888
  if st.button("์ƒ์„ฑ๋œ ๊ธฐ์‚ฌ ์ €์žฅ"):
 
19
  import threading
20
  import matplotlib.pyplot as plt
21
  import kss # KoNLPy ๋Œ€์‹  KSS ์‚ฌ์šฉ
22
+ from PIL import Image
23
+ import base64
24
+ from io import BytesIO
25
 
26
  # ์›Œ๋“œํด๋ผ์šฐ๋“œ ์ถ”๊ฐ€
27
  try:
 
360
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
361
 
362
  response = st.session_state.openai_client.chat.completions.create(
363
+ model="gpt-4", # ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ์ ˆํ•œ ๋ชจ๋ธ
364
  messages=[
365
  {"role": "system", "content": "๋‹น์‹ ์€ ์ „๋ฌธ์ ์ธ ๋‰ด์Šค ๊ธฐ์ž์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."},
366
  {"role": "user", "content": f"๋‹ค์Œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ {prompt_text}\n\n{original_content[:1000]}"}
 
377
  if not st.session_state.openai_client:
378
  return "OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
379
 
380
+ # GPT Image 1 ๋ชจ๋ธ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
381
+ result = st.session_state.openai_client.images.generate(
382
+ model="gpt-image-1", # ์ƒˆ๋กœ์šด ๋ชจ๋ธ๋ช… ์‚ฌ์šฉ
383
  prompt=prompt,
 
384
  size="1024x1024"
385
  )
386
+
387
+ # base64 ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉ
388
+ image_base64 = result.data[0].b64_json
389
+ image_bytes = base64.b64decode(image_base64)
390
+
391
+ # BytesIO ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
392
+ image = BytesIO(image_bytes)
393
+
394
+ # PIL Image๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํฌ๊ธฐ ์กฐ์ • (์„ ํƒ์‚ฌํ•ญ)
395
+ pil_image = Image.open(image)
396
+ pil_image = pil_image.resize((800, 800), Image.LANCZOS) # ํฌ๊ธฐ ์กฐ์ •
397
+
398
+ # ๋‹ค์‹œ BytesIO๋กœ ๋ณ€ํ™˜
399
+ output = BytesIO()
400
+ pil_image.save(output, format="JPEG", quality=80, optimize=True)
401
+ output.seek(0)
402
+
403
+ return output
404
+
405
  except Exception as e:
406
  return f"์ด๋ฏธ์ง€ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(e)}"
407
 
 
683
  with st.spinner("๊ธฐ์‚ฌ์˜ ๊ฐ์ •์„ ๋ถ„์„ ์ค‘์ž…๋‹ˆ๋‹ค..."):
684
  try:
685
  response = st.session_state.openai_client.chat.completions.create(
686
+ model="gpt-4",
687
  messages=[
688
+ {"role": "system", "content": """๋‹น์‹ ์€ ํ…์ŠคํŠธ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค.
689
+ ๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ์˜ ๊ฐ์ •๊ณผ ๋…ผ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ํ˜•์‹์˜ JSON์œผ๋กœ ์‘๋‹ตํ•ด์ฃผ์„ธ์š”:
690
+ {
691
+ "sentiment": "๊ธ์ •์ /๋ถ€์ •์ /์ค‘๋ฆฝ์ ",
692
+ "reason": "์ด์œ  ์„ค๋ช…...",
693
+ "keywords": [
694
+ {"word": "ํ‚ค์›Œ๋“œ1", "score": 8},
695
+ {"word": "ํ‚ค์›Œ๋“œ2", "score": 7}
696
+ ]
697
+ }"""},
698
  {"role": "user", "content": f"๋‹ค์Œ ๋‰ด์Šค ๊ธฐ์‚ฌ๋ฅผ ๋ถ„์„ํ•ด ์ฃผ์„ธ์š”:\n\n์ œ๋ชฉ: {selected_article['title']}\n\n๋‚ด์šฉ: {selected_article['content'][:1500]}"}
699
  ],
700
  max_tokens=800
 
897
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ (์˜ต์…˜์ด ์„ ํƒ๋œ ๊ฒฝ์šฐ)
898
  if generate_image_too:
899
  with st.spinner("๊ธฐ์‚ฌ ๊ด€๋ จ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค..."):
 
900
  image_prompt = f"""์‹ ๋ฌธ๊ธฐ์‚ฌ ์ œ๋ชฉ "{selected_article['title']}" ์„ ๋ณด๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค˜
901
  ์ด๋ฏธ์ง€์—๋Š” ๋‹ค์Œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
902
  - ๊ธฐ์‚ฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋„์‹
 
905
  """
906
 
907
  # ์ด๋ฏธ์ง€ ์ƒ์„ฑ
908
+ image = generate_image(image_prompt)
909
 
910
+ if isinstance(image, BytesIO):
911
  st.subheader("์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€:")
912
+ st.image(image, use_column_width=True)
913
  else:
914
+ st.error(image)
915
 
916
  # ์ƒ์„ฑ๋œ ๊ธฐ์‚ฌ ์ €์žฅ ์˜ต์…˜
917
  if st.button("์ƒ์„ฑ๋œ ๊ธฐ์‚ฌ ์ €์žฅ"):