card / app.py
soojeongcrystal's picture
Update app.py
4fee380 verified
from openai import AsyncOpenAI
import gradio as gr
import os
client = AsyncOpenAI(api_key=os.environ['OPENAI_API_KEY'])
async def generate_card_news(input_text, tone, num_cards):
prompt = f"""
ํŒ€์žฅ๋“ค์˜ ๋ฆฌ๋”์‹ญ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ๊ธฐํš์ž์ด์ž ๋งˆ์ผ€ํ„ฐ๋กœ์„œ, ํ•œ๊ตญ์–ด ์–ดํœ˜ ๋Šฅ๋ ฅ์ด ๊ต‰์žฅํžˆ ๋›ฐ์–ด๋‚˜. ์›๋ฌธ์ด ์˜์–ด๋“  ํ•œ๊ตญ์–ด๋“  ๋ชจ๋‘ ์œ ๋ คํ•˜๊ฒŒ ํ•œ๊ตญ์–ด๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ๋„ค๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ์ฃผ์–ด์ง„ ํ…์ŠคํŠธ "{input_text}"์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์นด๋“œ๋‰ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์•ผ. ํŒ€์žฅ๋“ค์€ ๋ฐ”์˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…ํ™•ํ•˜๋ฉด์„œ๋„ ์ž์„ธํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด. ์นด๋“œ๋‰ด์Šค์˜ ํ†ค์€ "{tone}"์ด๋ฉฐ, ์นด๋“œ์˜ ์ด ์ˆ˜๋Š” {num_cards}์•ผ. ์นด๋“œ๋‰ด์Šค์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ด:
1. ์ „์ฒด์นด๋“œ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ํ๋ฆ„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก 100์ž ์ •๋„์˜ ์„ค๋ช…๋ฌธ์œผ๋กœ ์ž‘์„ฑํ•ด์ค˜. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์นด๋“œ๋‰ด์Šค์˜ ์ œ๋ชฉ์„ ๋ฝ‘์•„์ค˜.
2. ์นด๋“œ๋‰ด์Šค์˜ ๋ชฉ์ ์€ {input_text}์˜ ์ค‘์š”ํ•œ ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋Š”๊ฑฐ์•ผ. ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ํ…์ŠคํŠธ์— ์งˆ๋ฌธ์ด ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ๋ผ. ๊ฐ ์นด๋“œ์— ํฌํ•จ๋  ํ…์ŠคํŠธ ๋‚ด์šฉ(๋ณธ๋ฌธ์˜ ์ธ์šฉ ๋ถ€๋ถ„๊ณผ ํฅ๋ฏธ๋กœ์šด ๋ฌธ๊ตฌ๋Š” ์ง์ ‘ ์ธ์šฉํ•˜๊ณ , ์ธ์šฉ๋ฌธ์€ ์˜์–ด์—ฌ๋„ ๊ดœ์ฐฎ์•„. ๊ณผ์ •์ด๋‚˜ ์ ˆ์ฐจ๋ฅผ ์†Œ๊ฐœํ•œ ๊ฒƒ์€ ํ™”๋ฉด์— ์†Œ๊ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌ์ฒด์  ํ‘œํ˜„์„ ์‚ด๋ ค์„œ ๋‚˜์—ดํ•ด์ค˜)์„ ์ž‘์„ฑํ•ด์ค˜. ์ ˆ๋Œ€๋กœ ์ƒ๋žตํ•˜์ง€๋ง๊ณ  ํ™”๋ฉด์— ํฌํ•จ๋  ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋„ฃ์–ด์ค˜
3. ์ „์ฒด ๋ฌธ์„œ ๋‚ด์šฉ์— ๊ฐ€์žฅ ์ž˜ ์–ด์šธ๋ฆฌ๊ณ  ๋ˆˆ๊ธธ์„ ๋„๋Š” ์ด๋ฏธ์ง€์™€ ํ™”๋ฉด ๊ตฌ์„ฑ์„ ๊ณจ๋ผ์„œ ์ถ”์ฒœํ•ด์ฃผ๋˜ ๋‹ค์Œ ๋‚ด์šฉ์„ ํฌํ•จํ•ด์ค˜ : 1)์ „๋ฐ˜์ ์ธ ์ฃผ์ œ์˜ ๋ถ„์œ„๊ธฐ(์–ด๋‘์›€/๋ฐ์Œ) ํ‘œํ˜„ 2) ์ƒ‰๊ฐ(๋Œ€ํ‘œ์ƒ‰์ƒ 3๊ฐœ ์„ ํƒํ•ด์„œ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ๊ฐ•์กฐ์ƒ‰์œผ๋กœ ๋‚˜๋ˆˆ ํ›„, ์ƒ‰์ƒ์ด๋ฆ„๊ณผ color์ฝ”๋“œ) ์ œ์‹œ 3) ์œ ํ˜•(์‹ค์‚ฌ/์›นํˆฐ/์ถ”์ƒํ™”) ์ œ์‹œ 4) ์›นํˆฐ์ผ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€์˜ ํŠน์ง•(์บ๋ฆญํ„ฐ์˜ ์ˆ˜, ์ง์žฅ์ธ/๋™๋ฌผ/ํŒ€์žฅ-ํŒ€์› ๋“ฑ์œผ๋กœ ์„ค๋ช…), ์ถ”์ƒํ™”์˜ ๊ฒฝ์šฐ ๋„ํ˜•์˜ ๋ฐฐ์น˜๋‚˜ ๋ชจ์–‘ ์„ค๋ช…, ์‹ค์‚ฌ์ผ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ์„ค๋ช…)
4. ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๋Š” ํŒ€์žฅ๋“ค์ด ์ƒ๊ฐํ•ด๋ณผ๋งŒํ•œ ์งˆ๋ฌธ์ด๋‚˜ ๋ช…์–ธ, ์ƒ๊ฐ๊ฑฐ๋ฆฌ ๋“ฑ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ•ด์ค˜.
***์˜ˆ์‹œ***
1. ์ „์ฒด ํ๋ฆ„ ์„ค๋ช… :
- ์„ค๋ช…๋ฌธ(100์ž) :
- ์ฃผ์ œ ๋ถ„์œ„๊ธฐ(๋ฐ์Œ/์–ด๋‘์›€) :
- ์ƒ‰๊ฐ(์ƒ‰์ƒ๋ช…+์ƒ‰์ƒ์ฝ”๋“œ)
- ์œ ํ˜• (์‹ค์‚ฌ/์›นํˆฐ/์ถ”์ƒํ™”) :
- ์œ ํ˜•๋ณ„ ์„ธ๋ถ€ ์„ค๋ช… :
2. ์ฒซ๋ฒˆ์งธ ์นด๋“œ
- ํ…์ŠคํŠธ :
- ์ด๋ฏธ์ง€์™€ ํ™”๋ฉด๊ตฌ์„ฑ :
3. ๋‘๋ฒˆ์งธ ์นด๋“œ
- ํ…์ŠคํŠธ :
- ์ด๋ฏธ์ง€์™€ ํ™”๋ฉด ๊ตฌ์„ฑ :
***์˜ˆ์‹œ ๋***
์นด๋“œ๋‰ด์Šค๋ฅผ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์€ ํ•ญ์ƒ ๋ฐ”์œ ํŒ€์žฅ๋“ค์ด๋ฏ€๋กœ, ๋‚ด์šฉ์€ ์‹œ์„ ์„ ๋Œ๊ณ  ํฅ๋ฏธ๋กญ๊ณ  ์ •๋ณด๊ฐ€ ์ถฉ์‹คํ•ด์•ผํ•ด. ๊ฒฐ๊ณผ๋ฌผ์€ ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด๋กœ ์ œ๊ณตํ•ด์ค˜
"""
try:
response = await client.chat.completions.create(
model="gpt-4-1106-preview",
messages=[{"role": "system", "content": prompt}]
)
except Exception as e:
print(f"Error: {e}")
return "Error generating card news"
# Correctly access the 'content' attribute from the 'ChatCompletionMessage' object
if response.choices:
card_news_plan = response.choices[0].message.content.strip() # Use dot notation to access 'content'
else:
card_news_plan = "No card news plan generated."
return card_news_plan
iface = gr.Interface(
fn=generate_card_news,
inputs=[
gr.Textbox(label="์—ฌ๊ธฐ์— ์›๋ฌธ์„ ๋ถ™์—ฌ๋„ฃ์–ด์ฃผ์„ธ์š”(์ž‘๊ฐ€๋‹˜ ๊ธ€, HBR/Forbes ๊ฐ™์€ ์›๋ฌธ๋„ ๊ฐ€๋Šฅ!)", lines=5),
gr.Radio(["๊ณต๊ฐ๊ฐ€๋Š”", "์ „๋ฌธ์ ์ธ", "์žฌ๋ฏธ์žˆ๋Š”"], label="์›ํ•˜๋Š” ์นด๋“œ๋‰ด์Šค์˜ ํ†ค"),
gr.Radio([5, 6, 7, 8, 9, 10], label="์นด๋“œ๋‰ด์Šค์˜ ์žฅ์ˆ˜")
],
outputs=gr.Textbox(label="์นด๋“œ๋‰ด์Šค ๊ธฐํš์•ˆ", lines=15),
title="์นด๋“œ๋‰ด์Šค ์ƒ์„ฑ๊ธฐ by Crystalโœจ",
description="ํ–‰๋ณต์ปฌ๋ฆฌ์ง€์˜ ํ–‰๋ณต์„ ์œ„ํ•˜์—ฌ...๐Ÿ™‹๐Ÿปโ€โ™€๏ธ240301๐Ÿ‡ฐ๐Ÿ‡ท"
)
iface.launch()