FGE3 / app.py
ssboost's picture
Update app.py
129efde verified
import gradio as gr
import google.generativeai as genai
import os
class KyungAhNeChatbot:
def __init__(self):
# ํ—ˆ๊น…ํŽ˜์ด์Šค ์ŠคํŽ˜์ด์Šค์—์„œ๋Š” secrets์—์„œ API ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ
api_key = os.getenv("GEMINI_API_KEY")
if not api_key:
raise ValueError("GEMINI_API_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!")
# ์ œ๋ฏธ๋‚˜์ด ํด๋ผ์ด์–ธํŠธ ์„ค์ •
genai.configure(api_key=api_key)
self.model = genai.GenerativeModel('gemini-2.0-flash-exp')
# ๊ฒฝ์•„๋„ค ๋ฐ˜์ฐฌ๊ฐ€๊ฒŒ FAQ ๋ฐ์ดํ„ฐ
self.faq_data = """
๊ฒฝ์•„๋„ค ๋ฐ˜์ฐฌ๊ฐ€๊ฒŒ ๊ณ ๊ฐ์„ผํ„ฐ FAQ:
== ๊ธฐ๋ณธ ์ •๋ณด ==
โ€ข ๊ณ ๊ฐ์„ผํ„ฐ: 010-8082-0047
โ€ข ์ž…๊ธˆ๊ณ„์ขŒ: ํ•˜๋‚˜์€ํ–‰ 12345-00-1234304 ์ฃผ)๊ฒฝ์•„๋„ค
โ€ข ์ตœ์†Œ ์ฃผ๋ฌธ๊ธˆ์•ก: 26,000์›
== ์ฃผ๋ฌธ ๊ด€๋ จ ==
1. Q: ์ฃผ๋ฌธ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
A: โ‘  ๋กœ๊ทธ์ธ โ†’ โ‘ก ์ฃผ๋ฌธํ•˜๊ธฐ ํด๋ฆญ โ†’ โ‘ข ์ „์ฒด์ฃผ๋ฌธ ๋˜๋Š” ์ผ๋ณ„์ฃผ๋ฌธ ํด๋ฆญ โ†’ โ‘ฃ ๋“œ์‹œ๊ณ  ์‹ถ์€ ๋ฐ˜์ฐฌ ํด๋ฆญ(์ตœ์†Œ 26,000์›) โ†’ โ‘ค ๊ตฌ๋งค๋ฒ„ํŠผ ๋ฐ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฒ„ํŠผ ํด๋ฆญ โ†’ โ‘ฅ ๊ฒฐ์ œ์ฐฝ์—์„œ ์‹ ์šฉ์นด๋“œ/์ œ๋กœํŽ˜์ด/๋ฌดํ†ต์žฅ ์ค‘ ์„ ํƒํ•˜์—ฌ ๊ฒฐ์ œ
2. Q: ์ฒซ์ฃผ๋ฌธ ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•ด์š”
A: ์ฒซ๋ฐฉ๋ฌธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์šฉ๋ฐฉ๋ฒ•๊ณผ ๋ฐฐ์†ก์ง€์—ญ์„ ํ™•์ธ โ†’ ํšŒ์›๊ฐ€์ž… ํ›„ ๋กœ๊ทธ์ธ โ†’ ์ฃผ๋ฌธ์ฐฝ์—์„œ ์›ํ•˜๋Š” ๋ฐ˜์ฐฌ ์„ ํƒ โ†’ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ โ†’ ๊ตฌ๋งค๋ฒ„ํŠผ์œผ๋กœ ๊ฒฐ์ œ
3. Q: ๋ฐ˜์ฐฌ ์ถ”๊ฐ€๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
A: ์ฒซ ํŽ˜์ด์ง€์—์„œ ๊ตฌ๋งคํ•˜๊ณ  ์‹ถ์€ ๋ฐ˜์ฐฌ ์„ ํƒ โ†’ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ โ†’ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์ˆ˜๋Ÿ‰ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
== ๊ฒฐ์ œ ๊ด€๋ จ ==
4. Q: ์นด๋“œ๊ฒฐ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
A: ๊ฒฐ์ œ์ฐฝ์—์„œ ์‹ ์šฉ์นด๋“œ/์ œ๋กœํŽ˜์ด/๋ฌดํ†ต์žฅ ์ค‘ ์„ ํƒํ•ด์„œ ๊ฒฐ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค
5. Q: ํฌ์ธํŠธ ์‚ฌ์šฉ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
A: ๊ฒฐ์ œ์‹œ ์ฒซ ํŽ˜์ด์ง€์—์„œ ํฌ์ธํŠธ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฌดํ†ต์žฅ์ž…๊ธˆ์œผ๋กœ ๊ฒฐ์ œ
6. Q: ์„ ๊ฒฐ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
A: ์„ ๊ฒฐ์ œ๋Š” 3๊ฐ€์ง€๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค - ์นด๋“œ์„ ๊ฒฐ์ œ, ์ œ๋กœํŽ˜์ด, ํ˜„๊ธˆ๊ฒฐ์ œ. ์„ ๊ฒฐ์ œ ํ›„ ํ™ˆํŽ˜์ด์ง€ ๊ฒŒ์‹œ๊ธ€์— ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ๊ณ ๊ฐ์„ผํ„ฐ๋กœ ๋ฌธ์ž ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค
7. Q: ๊ณ„์ขŒ๋ฒˆํ˜ธ ํ™•์ธ์€ ์–ด๋””์„œ ํ•˜๋‚˜์š”?
A: ๋ฌดํ†ต์žฅ ๊ฑฐ๋ž˜์‹œ ์ž…๊ธˆ๊ณ„์ขŒ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ํ•˜๋‚˜์€ํ–‰ 12345-00-1234304 ์ฃผ)๊ฒฝ์•„๋„ค
8. Q: ๊ฒฐ์ œ๊ฐ€ ์•ˆ๋ผ์š”
A: ์‹ ์šฉ์นด๋“œ ๊ฒฐ์ œ ์•ˆ๋  ์‹œ ๊ณ ๊ฐ์„ผํ„ฐ(010-8082-0047)๋กœ ์—ฐ๋ฝ์ฃผ์„ธ์š”
== ๋ฐฐ์†ก ๊ด€๋ จ ==
9. Q: ๋ฐฐ์†ก๋น„๋Š” ์–ผ๋งˆ์ธ๊ฐ€์š”?
A: ์ƒˆ๋ฒฝ๋ฐฐ์†ก 3,500์›, ํƒ๋ฐฐ๋ฐฐ์†ก 4,000์›
10. Q: ์ƒˆ๋ฒฝ๋ฐฐ์†ก์ธ์ง€ ํƒ๋ฐฐ์ธ์ง€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋‚˜์š”?
A: ์ด์šฉ๋ฐฉ๋ฒ•์—์„œ ๋ฐฐ์†ก์ง€๋ฅผ ์ž…๋ ฅํ•˜์‹œ๋ฉด ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
11. Q: ๋ฐฐ์†ก์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋‚˜์š”?
A: ์ „๋‚  ํฌ์žฅ โ†’ ๋ฐฐ์†ก์—…์ฒด ๋ƒ‰์žฅ์„ผํ„ฐ 8์‹œ ์ž…๊ณ  โ†’ ๋ถ„๋ฅ˜ ์ž‘์—… โ†’ ์ƒˆ๋ฒฝ๋ฐฐ์†ก(2-7์‹œ)/ํƒ๋ฐฐ๋ฐฐ์†ก(๋‹ค์Œ๋‚  ํ•˜๋ฃจ ์ค‘)
12. Q: ๋ฐ˜์ฐฌ์ด ์•„์ง ์•ˆ์™”์–ด์š”
A: ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์†ก์—…์ฒด์— ํ™•์ธ ํ›„ ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค
== ์ทจ์†Œ/ํ™˜๋ถˆ ๊ด€๋ จ ==
13. Q: ์ทจ์†Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
A: ์ทจ์†Œ๋Š” 2์ผ ์ „์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋ฃจ ์ „์—๋Š” ๋ฐ˜์ฐฌ์ด ์ด๋ฏธ ์ œ์ž‘๋˜์–ด ์ทจ์†Œ๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค
14. Q: ํ™˜๋ถˆ์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋‚˜์š”?
A: ์นด๋“œ๋Š” ์ทจ์†Œ ํ›„ ํ™˜๋ถˆ๊นŒ์ง€ 2-3์ผ ์†Œ์š”. ์นด๋“œ์ทจ์†Œ๋Š” ๋ฌธ์˜ ๋‚จ๊ธฐ์‹œ๋ฉด ์ ๋ฆฝ๊ธˆ ํฌ์ธํŠธ๊ฐ€ ์นด๋“œ์ทจ์†Œ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค
15. Q: ๋ฐ˜์ฐฌ์ด ์ƒํ•œ ๊ฒƒ ๊ฐ™์•„์š”
A: ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์†ก๊ณผ์ •์—์„œ ์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณ„์ขŒํ™˜๋ถˆ/์นด๋“œ์ทจ์†Œ/์ ๋ฆฝ๊ธˆ ์ค‘ ํŽธํ•˜์‹  ๋ฐฉ๋ฒ•์œผ๋กœ ํ™˜๋ถˆํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค
== ๋ฉ”๋‰ด/์ƒํ’ˆ ๊ด€๋ จ ==
16. Q: ์ •๊ธฐ์‹ ๊ตฌ์„ฑ์€ ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?
A: ๊ณ ๊ฐ๋‹˜์ด ์„ ํƒํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ„์„ ์œ„ํ•ด ๋งˆ๋ จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตญ1๊ฐœ + ๋ฐ˜์ฐฌ4๊ฐœ (๋ฉ”์ธ1๊ฐœ, ์„œ๋ธŒ1๊ฐœ, ๋‚˜๋ฌผ ๋ฐ ๋ฐ˜์ฐฌ2๊ฐœ)
17. Q: ๋ฐ˜์ฐฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?
A: ๋ฐ˜์ฐฌ๋ช…์„ ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค
18. Q: ์˜์–‘์„ฑ๋ถ„์„ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”?
A: ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜์ฐฌ๋ช…์„ ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ์˜์–‘์„ฑ๋ถ„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค
19. Q: ์›์‚ฐ์ง€๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด์š”
A: ์›์‚ฐ์ง€ํ‘œ๋ฅผ ๋งํฌ๋กœ ์ œ๊ณตํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค
== ์ด๋ฒคํŠธ/ํ˜œํƒ ๊ด€๋ จ ==
20. Q: ์ด๋ฒคํŠธ๋Š” ์–ด๋””์„œ ๋ณด๋‚˜์š”?
A: ์ด๋ฒคํŠธ ์ฃผ๋ฌธ์ฐฝ์ด ๋ณ„๋„๋กœ ์žˆ์Šต๋‹ˆ๋‹ค
21. Q: ์†Œ๊ฐœํ•˜๋ฉด ํ˜œํƒ์ด ์žˆ๋‚˜์š”?
A: ์†Œ๊ฐœํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์†Œ๊ฐœํ•˜์‹  ๋ถ„๊ณผ ์†Œ๊ฐœ๋ฐ›์€ ๋ถ„ ๋ชจ๋‘์—๊ฒŒ ์„œ๋น„์Šค์ฐฌ ๋˜๋Š” ํฌ์ธํŠธ ์ ๋ฆฝ๊ธˆ์œผ๋กœ ํ˜œํƒ์„ ๋“œ๋ฆฝ๋‹ˆ๋‹ค
22. Q: ํ›„๊ธฐ ๋‚จ๊ธฐ๋ฉด ์–ด๋–ค ํ˜œํƒ์ด ์žˆ๋‚˜์š”?
A: ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด 500ํฌ์ธํŠธ๋ฅผ ์ ๋ฆฝํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค
== ๊ธฐํƒ€ ==
23. Q: ์ฃผ๋ฌธ ๋ˆ„๋ฝ์ธ ๊ฒƒ ๊ฐ™์•„์š”
A: ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”
๋ชจ๋“  ๋ฌธ์˜์‚ฌํ•ญ์€ ๊ณ ๊ฐ์„ผํ„ฐ 010-8082-0047๋กœ ์—ฐ๋ฝ์ฃผ์„ธ์š”.
"""
def chat_stream(self, message, history):
system_prompt = f"""
๋‹น์‹ ์€ ๊ฒฝ์•„๋„ค ๋ฐ˜์ฐฌ๊ฐ€๊ฒŒ์˜ ์นœ์ ˆํ•œ ์ƒ๋‹ด์›์ž…๋‹ˆ๋‹ค.
{self.faq_data}
์œ„ FAQ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ณ ๊ฐ์˜ ์งˆ๋ฌธ์— ์ •ํ™•ํ•˜๊ณ  ์นœ์ ˆํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•ด์ฃผ์„ธ์š”.
- FAQ์— ์žˆ๋Š” ์ •๋ณด๋Š” ์ •ํ™•ํžˆ ์ œ๊ณตํ•ด์ฃผ์„ธ์š”
- FAQ์— ์—†๋Š” ๋‚ด์šฉ์€ "์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๊ณ ๊ฐ์„ผํ„ฐ(010-8082-0047)๋กœ ๋ฌธ์˜ํ•ด์ฃผ์„ธ์š”"๋ผ๊ณ  ์•ˆ๋‚ดํ•ด์ฃผ์„ธ์š”
- ๋ฐ˜๋ง๋ณด๋‹ค๋Š” ์กด๋Œ“๋ง์„ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”
- ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹ต๋ณ€ํ•ด์ฃผ์„ธ์š”
- "์•ˆ๋…•ํ•˜์„ธ์š” ๊ฒฝ์•„๋„ค์ž…๋‹ˆ๋‹ค"๋กœ ์‹œ์ž‘ํ•˜๊ณ  "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค"๋กœ ๋งˆ๋ฌด๋ฆฌํ•ด์ฃผ์„ธ์š”
"""
print(f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {message}")
print(f"API ํ‚ค ์ƒํƒœ: {'์„ค์ •๋จ' if os.getenv('GEMINI_API_KEY') else '์—†์Œ'}")
try:
response = self.model.generate_content(
contents=f"{system_prompt}\n\n์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {message}"
)
print(f"์‘๋‹ต ๋ฐ›์Œ: {response.text[:100]}...")
yield response.text
except Exception as e:
error_msg = str(e)
print(f"์—๋Ÿฌ ๋ฐœ์ƒ: {error_msg}")
yield f"""์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์—๋Ÿฌ ์ •๋ณด: {error_msg}
๊ณ ๊ฐ์„ผํ„ฐ(010-8082-0047)๋กœ ์—ฐ๋ฝํ•ด์ฃผ์„ธ์š”."""
# ์ฑ—๋ด‡ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
try:
chatbot = KyungAhNeChatbot()
# ์‹ฌํ”Œํ•˜๊ณ  ๊น”๋”ํ•œ ๊ทธ๋ผ๋””์˜ค ์ธํ„ฐํŽ˜์ด์Šค
demo = gr.ChatInterface(
fn=chatbot.chat_stream,
title="๐Ÿฅข ๊ฒฝ์•„๋„ค AI ์ƒ๋‹ด๋ด‡",
description="๊ฒฝ์•„๋„ค ๋ฐ˜์ฐฌ๊ฐ€๊ฒŒ ๊ณ ๊ฐ์ƒ๋‹ด ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค.",
examples=[
"์ฃผ๋ฌธ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?",
"ํฌ์ธํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?",
"๋ฐฐ์†ก๋น„๊ฐ€ ์–ผ๋งˆ์ธ๊ฐ€์š”?",
"ํ™˜๋ถˆ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์„ธ์š”"
],
theme=gr.themes.Default(),
css="""
/* ์ „์ฒด ๋ฐฐ๊ฒฝ ํฐ์ƒ‰ */
.gradio-container {
background-color: #ffffff !important;
max-width: 800px !important;
margin: 0 auto !important;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif !important;
}
/* ๋ชจ๋“  ํ…Œ๋‘๋ฆฌ ์ œ๊ฑฐ */
.chatbot, .chatbot > div, .contain, .block {
border: none !important;
box-shadow: none !important;
background-color: #ffffff !important;
}
/* Chatbot ํƒญ ์™„์ „ํžˆ ์ˆจ๊ธฐ๊ธฐ */
.tab-nav, div[role="tablist"], .tabs > div:first-child {
display: none !important;
}
/* ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์Šคํƒ€์ผ๋ง */
.message {
border: none !important;
margin: 10px 0 !important;
}
/* ์ž…๋ ฅ์ฐฝ์„ ํƒ€์›ํ˜•์œผ๋กœ */
.input-container, textarea {
border-radius: 25px !important;
border: 1px solid #e0e0e0 !important;
background-color: #f8f9fa !important;
padding: 12px 20px !important;
}
/* ์ „์†ก ๋ฒ„ํŠผ ๋‘ฅ๊ธ€๊ฒŒ */
button {
border-radius: 20px !important;
border: none !important;
background-color: #007bff !important;
color: white !important;
font-weight: 500 !important;
padding: 8px 16px !important;
}
button:hover {
background-color: #0056b3 !important;
}
/* ์˜ˆ์‹œ ๋ฒ„ํŠผ๋“ค ํƒ€์›ํ˜•์œผ๋กœ */
.examples button {
border-radius: 20px !important;
background-color: #f8f9fa !important;
border: 1px solid #e9ecef !important;
color: #333 !important;
margin: 5px !important;
padding: 8px 16px !important;
}
.examples button:hover {
background-color: #007bff !important;
color: white !important;
border-color: #007bff !important;
}
/* ํƒ€์ดํ‹€ ์Šคํƒ€์ผ */
h1 {
color: #333 !important;
font-size: 28px !important;
text-align: center !important;
margin-bottom: 10px !important;
}
/* ์„ค๋ช… ํ…์ŠคํŠธ */
.description {
color: #666 !important;
text-align: center !important;
font-size: 14px !important;
margin-bottom: 20px !important;
}
/* ์—ฌ๋ฐฑ ์กฐ์ • */
.block {
padding: 10px !important;
}
/* ์Šคํฌ๋กค๋ฐ” ๊น”๋”ํ•˜๊ฒŒ */
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
"""
)
except Exception as e:
def error_message(message, history):
yield "โŒ GEMINI_API_KEY๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์˜ํ•˜์„ธ์š”."
demo = gr.ChatInterface(
fn=error_message,
title="๐Ÿฅข ์„ค์ • ์˜ค๋ฅ˜",
description="API ํ‚ค ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."
)
if __name__ == "__main__":
demo.launch()