aiqcamp commited on
Commit
de65ede
ยท
verified ยท
1 Parent(s): 9be8a74

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -424
app.py DELETED
@@ -1,424 +0,0 @@
1
-
2
- import os
3
- import gradio as gr
4
- import random
5
- import time
6
- import logging
7
- from typing import Iterator
8
-
9
- import google.generativeai as genai
10
-
11
- logging.basicConfig(
12
- level=logging.INFO,
13
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
14
- handlers=[
15
- logging.FileHandler("api_debug.log"),
16
- logging.StreamHandler()
17
- ]
18
- )
19
- logger = logging.getLogger("idea_generator")
20
-
21
- # ====== Gemini API ์„ค์ • ======
22
- GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
23
- genai.configure(api_key=GEMINI_API_KEY)
24
-
25
- # ====== ์‚ฌ์šฉํ•  Gemini ๋ชจ๋ธ ======
26
- model = genai.GenerativeModel("gemini-2.0-flash-thinking-exp-01-21")
27
-
28
- # ์Šฌ๋ž˜์‹œ("/")๋กœ ๊ตฌ๋ถ„๋œ ๋ณ€ํ™˜ ๋ฌธ์ž์—ด์—์„œ ํ•œ ์˜ต์…˜๋งŒ ์„ ํƒ
29
- def choose_alternative(transformation):
30
- if "/" not in transformation:
31
- return transformation
32
- parts = transformation.split("/")
33
- if len(parts) != 2:
34
- return random.choice([part.strip() for part in parts])
35
- left = parts[0].strip()
36
- right = parts[1].strip()
37
- if " " in left:
38
- tokens = left.split(" ", 1)
39
- prefix = tokens[0]
40
- if not right.startswith(prefix):
41
- option1 = left
42
- option2 = prefix + " " + right
43
- else:
44
- option1 = left
45
- option2 = right
46
- return random.choice([option1, option2])
47
- else:
48
- return random.choice([left, right])
49
-
50
-
51
-
52
- ##############################################################################
53
- # ์นดํ…Œ๊ณ ๋ฆฌ ์‚ฌ์ „
54
- # (์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” ๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํฌํ•จ์‹œ์ผฐ์ง€๋งŒ, ํ•„์š”์— ๋”ฐ๋ผ ๋ฒ”์œ„๋ฅผ ์กฐ์ •ํ•˜์„ธ์š”.)
55
- ##############################################################################
56
- physical_transformation_categories = {
57
- "๊ณต๊ฐ„ ์ด๋™": [
58
- "์•ž/๋’ค ์ด๋™", "์ขŒ/์šฐ ์ด๋™", "์œ„/์•„๋ž˜ ์ด๋™", "์„ธ๋กœ์ถ• ํšŒ์ „(๊ณ ๊ฐœ ๋„๋•์ž„)",
59
- "๊ฐ€๋กœ์ถ• ํšŒ์ „(๊ณ ๊ฐœ ์ “๊ธฐ)", "๊ธธ์ด์ถ• ํšŒ์ „(์˜†์œผ๋กœ ๊ธฐ์šธ์ž„)", "์› ์šด๋™", "๋‚˜์„ ํ˜• ์ด๋™",
60
- "๊ด€์„ฑ์— ์˜ํ•œ ๋ฏธ๋„๋Ÿฌ์ง", "ํšŒ์ „์ถ• ๋ณ€ํ™”", "๋ถˆ๊ทœ์น™ ํšŒ์ „", "ํ”๋“ค๋ฆผ ์šด๋™", "ํฌ๋ฌผ์„  ์ด๋™",
61
- "๋ฌด์ค‘๋ ฅ ๋ถ€์œ ", "์ˆ˜๋ฉด ์œ„ ๋ถ€์œ ", "์ ํ”„/๋„์•ฝ", "์Šฌ๋ผ์ด๋”ฉ", "๋กค๋ง", "์ž์œ  ๋‚™ํ•˜",
62
- "์™•๋ณต ์šด๋™", "ํƒ„์„ฑ ํŠ•๊น€", "๊ด€ํ†ต", "ํšŒํ”ผ ์›€์ง์ž„", "์ง€๊ทธ์žฌ๊ทธ ์ด๋™", "์Šค์œ™ ์šด๋™"
63
- ],
64
-
65
- "ํฌ๊ธฐ์™€ ํ˜•ํƒœ ๋ณ€ํ™”": [
66
- "๋ถ€ํ”ผ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๊ธธ์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋„ˆ๋น„ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋†’์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ",
67
- "๋ฐ€๋„ ๋ณ€ํ™”", "๋ฌด๊ฒŒ ์ฆ๊ฐ€/๊ฐ์†Œ", "๋ชจ์–‘ ๋ณ€ํ˜•", "์ƒํƒœ ๋ณ€ํ™”", "๋ถˆ๊ท ๋“ฑ ๋ณ€ํ˜•",
68
- "๋ณต์žกํ•œ ํ˜•ํƒœ ๋ณ€ํ˜•", "๋น„ํ‹€๋ฆผ/๊ผฌ์ž„", "๋ถˆ๊ท ์ผํ•œ ํ™•์žฅ/์ถ•์†Œ", "๋ชจ์„œ๋ฆฌ ๋‘ฅ๊ธ€๊ฒŒ/๋‚ ์นด๋กญ๊ฒŒ",
69
- "๊นจ์ง/๊ฐˆ๋ผ์ง", "์—ฌ๋Ÿฌ ์กฐ๊ฐ ๋‚˜๋ˆ ์ง", "๋ฌผ ์ €ํ•ญ", "๋จผ์ง€ ์ €ํ•ญ", "์ฐŒ๊ทธ๋Ÿฌ์ง/๋ณต์›",
70
- "์ ‘ํž˜/ํŽผ์ณ์ง", "์••์ฐฉ/ํŒฝ์ฐฝ", "๋Š˜์–ด๋‚จ/์ˆ˜์ถ•", "๊ตฌ๊ฒจ์ง/ํ‰ํ‰ํ•ด์ง", "๋ญ‰๊ฐœ์ง/๋‹จ๋‹จํ•ด์ง",
71
- "๋ง๋ฆผ/ํŽด์ง", "๊บพ์ž„/๊ตฌ๋ถ€๋Ÿฌ์ง"
72
- ],
73
-
74
- "ํ‘œ๋ฉด ๋ฐ ์™ธ๊ด€ ๋ณ€ํ™”": [
75
- "์ƒ‰์ƒ ๋ณ€ํ™”", "์งˆ๊ฐ ๋ณ€ํ™”", "ํˆฌ๋ช…/๋ถˆํˆฌ๋ช… ๋ณ€ํ™”", "๋ฐ˜์ง์ž„/๋ฌด๊ด‘ ๋ณ€ํ™”",
76
- "๋น› ๋ฐ˜์‚ฌ ์ •๋„ ๋ณ€ํ™”", "๋ฌด๋Šฌ ๋ณ€ํ™”", "๊ฐ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”", "๋น›์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”",
77
- "์˜จ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”", "ํ™€๋กœ๊ทธ๋žจ ํšจ๊ณผ", "ํ‘œ๋ฉด ๊ฐ๋„๋ณ„ ๋น› ๋ฐ˜์‚ฌ", "ํ‘œ๋ฉด ๋ชจ์–‘ ๋ณ€ํ˜•",
78
- "์ดˆ๋ฏธ์„ธ ํ‘œ๋ฉด ๊ตฌ์กฐ ๋ณ€ํ™”", "์ž๊ฐ€ ์„ธ์ • ํšจ๊ณผ", "์–ผ๋ฃฉ/ํŒจํ„ด ์ƒ์„ฑ", "ํ๋ฆผ/์„ ๋ช…ํ•จ ๋ณ€ํ™”",
79
- "๊ด‘ํƒ/์œค๊ธฐ ๋ณ€ํ™”", "์ƒ‰์กฐ/์ฑ„๋„ ๋ณ€ํ™”", "๋ฐœ๊ด‘/ํ˜•๊ด‘", "๋น› ์‚ฐ๋ž€ ํšจ๊ณผ",
80
- "๋น› ํก์ˆ˜ ๋ณ€ํ™”", "๋ฐ˜ํˆฌ๋ช… ํšจ๊ณผ", "๊ทธ๋ฆผ์ž ํšจ๊ณผ ๋ณ€ํ™”", "์ž์™ธ์„  ๋ฐ˜์‘ ๋ณ€ํ™”",
81
- "์•ผ๊ด‘ ํšจ๊ณผ"
82
- ],
83
-
84
- "๋ฌผ์งˆ์˜ ์ƒํƒœ ๋ณ€ํ™”": [
85
- "๊ณ ์ฒด/์•ก์ฒด/๊ธฐ์ฒด ์ „ํ™˜", "๊ฒฐ์ •ํ™”/์šฉํ•ด", "์‚ฐํ™”/๋ถ€์‹", "๋”ฑ๋”ฑํ•ด์ง/๋ถ€๋“œ๋Ÿฌ์›Œ์ง",
86
- "ํŠน์ˆ˜ ์ƒํƒœ ์ „ํ™˜", "๋ฌด์ •ํ˜•/๊ฒฐ์ •ํ˜• ์ „ํ™˜", "์„ฑ๋ถ„ ๋ถ„๋ฆฌ", "๋ฏธ์„ธ ์ž…์ž ํ˜•์„ฑ/๋ถ„ํ•ด",
87
- "์ ค ํ˜•์„ฑ/ํ’€์–ด์ง", "์ค€์•ˆ์ • ์ƒํƒœ ๋ณ€ํ™”", "๋ถ„์ž ์ž๊ฐ€ ์ •๋ ฌ/๋ถ„ํ•ด", "์ƒํƒœ๋ณ€ํ™” ์ง€์—ฐ ํ˜„์ƒ",
88
- "๋…น์Œ", "๊ตณ์Œ", "์ฆ๋ฐœ/์‘์ถ•", "์Šนํ™”/์ฆ์ฐฉ", "์นจ์ „/๋ถ€์œ ", "๋ถ„์‚ฐ/์‘์ง‘",
89
- "๊ฑด์กฐ/์Šต์œค", "ํŒฝ์œค/์ˆ˜์ถ•", "๋™๊ฒฐ/ํ•ด๋™", "ํ’ํ™”/์นจ์‹", "์ถฉ์ „/๋ฐฉ์ „",
90
- "๊ฒฐํ•ฉ/๋ถ„๋ฆฌ", "๋ฐœํšจ/๋ถ€ํŒจ"
91
- ],
92
-
93
- "์—ด ๊ด€๋ จ ๋ณ€ํ™”": [
94
- "์˜จ๋„ ์ƒ์Šน/ํ•˜๊ฐ•", "์—ด์— ์˜ํ•œ ํŒฝ์ฐฝ/์ˆ˜์ถ•", "์—ด ์ „๋‹ฌ/์ฐจ๋‹จ", "์••๋ ฅ ์ƒ์Šน/ํ•˜๊ฐ•",
95
- "์—ด ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์žํ™”", "๋ฌด์งˆ์„œ๋„ ๋ณ€ํ™”", "์—ด์ „๊ธฐ ํ˜„์ƒ", "์ž๊ธฐ์žฅ์— ์˜ํ•œ ์—ด ๋ณ€ํ™”",
96
- "์ƒํƒœ๋ณ€ํ™” ์ค‘ ์—ด ์ €์žฅ/๋ฐฉ์ถœ", "์—ด ์ŠคํŠธ๋ ˆ์Šค ๋ฐœ์ƒ/ํ•ด์†Œ", "๊ธ‰๊ฒฉํ•œ ์˜จ๋„ ๋ณ€ํ™” ์˜ํ–ฅ",
97
- "๋ณต์‚ฌ์—ด์— ์˜ํ•œ ๋ƒ‰๊ฐ/๊ฐ€์—ด", "๋ฐœ์—ด/ํก์—ด", "์—ด ๋ถ„ํฌ ๋ณ€ํ™”", "์—ด ๋ฐ˜์‚ฌ/ํก์ˆ˜",
98
- "๋ƒ‰๊ฐ ์‘์ถ•", "์—ด ํ™œ์„ฑํ™”", "์—ด ๋ณ€์ƒ‰", "์—ด ํŒฝ์ฐฝ ๊ณ„์ˆ˜ ๋ณ€ํ™”", "์—ด ์•ˆ์ •์„ฑ ๋ณ€ํ™”",
99
- "๋‚ด์—ด์„ฑ/๋‚ดํ•œ์„ฑ", "์ž๊ธฐ๋ฐœ์—ด", "์—ด์  ํ‰ํ˜•/๋ถˆ๊ท ํ˜•", "์—ด์  ๋ณ€ํ˜•", "์—ด ๋ถ„์‚ฐ/์ง‘์ค‘"
100
- ],
101
-
102
- "์›€์ง์ž„ ํŠน์„ฑ ๋ณ€ํ™”": [
103
- "๊ฐ€์†/๊ฐ์†", "์ผ์ • ์†๋„ ์œ ์ง€", "์ง„๋™/์ง„๋™ ๊ฐ์†Œ", "๋ถ€๋”ชํž˜/ํŠ•๊น€",
104
- "ํšŒ์ „ ์†๋„ ์ฆ๊ฐ€/๊ฐ์†Œ", "ํšŒ์ „ ๋ฐฉํ–ฅ ๋ณ€ํ™”", "๋ถˆ๊ทœ์น™ ์›€์ง์ž„", "๋ฉˆ์ท„๋‹ค ๋ฏธ๋„๋Ÿฌ์ง€๋Š” ํ˜„์ƒ",
105
- "๊ณต์ง„/๋ฐ˜๊ณต์ง„", "์œ ์ฒด ์† ์ €ํ•ญ/์–‘๋ ฅ ๋ณ€ํ™”", "์›€์ง์ž„ ์ €ํ•ญ ๋ณ€ํ™”", "๋ณตํ•ฉ ์ง„๋™ ์›€์ง์ž„",
106
- "ํŠน์ˆ˜ ์œ ์ฒด ์† ์›€์ง์ž„", "ํšŒ์ „-์ด๋™ ์—ฐ๊ณ„ ์›€์ง์ž„", "๊ด€์„ฑ ์ •์ง€", "์ถฉ๊ฒฉ ํก์ˆ˜",
107
- "์ถฉ๊ฒฉ ์ „๋‹ฌ", "์šด๋™๋Ÿ‰ ๋ณด์กด", "๋งˆ์ฐฐ๋ ฅ ๋ณ€ํ™”", "๊ด€์„ฑ ํƒˆ์ถœ", "๋ถˆ์•ˆ์ • ๊ท ํ˜•",
108
- "๋™์  ์•ˆ์ •์„ฑ", "ํ”๋“ค๋ฆผ ๊ฐ์‡ ", "๊ฒฝ๋กœ ์˜ˆ์ธก์„ฑ", "ํšŒํ”ผ ์›€์ง์ž„"
109
- ],
110
-
111
- "๊ตฌ์กฐ์  ๋ณ€ํ™”": [
112
- "๋ถ€ํ’ˆ ์ถ”๊ฐ€/์ œ๊ฑฐ", "์กฐ๋ฆฝ/๋ถ„ํ•ด", "์ ‘๊ธฐ/ํŽด๊ธฐ", "๋ณ€ํ˜•/์›์ƒ๋ณต๊ตฌ", "์ตœ์  ๊ตฌ์กฐ ๋ณ€ํ™”",
113
- "์ž๊ฐ€ ์žฌ๋ฐฐ์—ด", "์ž์—ฐ ํŒจํ„ด ํ˜•์„ฑ/์†Œ๋ฉธ", "๊ทœ์น™์  ํŒจํ„ด ๋ณ€ํ™”", "๋ชจ๋“ˆ์‹ ๋ณ€ํ˜•",
114
- "๋ณต์žก์„ฑ ์ฆ๊ฐ€ ๊ตฌ์กฐ", "์›๋ž˜ ๋ชจ์–‘ ๊ธฐ์–ต ํšจ๊ณผ", "์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ํ˜•ํƒœ ๋ณ€ํ™”", "๋ถ€๋ถ„ ์ œ๊ฑฐ",
115
- "๋ถ€๋ถ„ ๊ต์ฒด", "๊ฒฐํ•ฉ", "๋ถ„๋ฆฌ", "๋ถ„ํ• /ํ†ตํ•ฉ", "์ค‘์ฒฉ/๊ฒน์นจ", "๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ณ€ํ™”",
116
- "์™ธ๋ถ€ ๊ตฌ์กฐ ๋ณ€ํ™”", "์ค‘์‹ฌ์ถ• ์ด๋™", "๊ท ํ˜•์  ๋ณ€ํ™”", "๊ณ„์ธต ๊ตฌ์กฐ ๋ณ€ํ™”", "์ง€์ง€ ๊ตฌ์กฐ ๋ณ€ํ™”",
117
- "์‘๋ ฅ ๋ถ„์‚ฐ ๊ตฌ์กฐ", "์ถฉ๊ฒฉ ํก์ˆ˜ ๊ตฌ์กฐ", "๊ทธ๋ฆฌ๋“œ/๋งคํŠธ๋ฆญ์Šค ๊ตฌ์กฐ ๋ณ€ํ™”", "์ƒํ˜ธ ์—ฐ๊ฒฐ์„ฑ ๋ณ€ํ™”"
118
- ],
119
-
120
- "์ „๊ธฐ ๋ฐ ์ž๊ธฐ ๋ณ€ํ™”": [
121
- "์ž์„ฑ ์ƒ์„ฑ/์†Œ๋ฉธ", "์ „ํ•˜๋Ÿ‰ ์ฆ๊ฐ€/๊ฐ์†Œ", "์ „๊ธฐ์žฅ ์ƒ์„ฑ/์†Œ๋ฉธ", "์ž๊ธฐ์žฅ ์ƒ์„ฑ/์†Œ๋ฉธ",
122
- "์ดˆ์ „๋„ ์ƒํƒœ ์ „ํ™˜", "๊ฐ•์œ ์ „์ฒด ํŠน์„ฑ ๋ณ€ํ™”", "์–‘์ž ์ƒํƒœ ๋ณ€ํ™”", "ํ”Œ๋ผ์ฆˆ๋งˆ ์ƒํƒœ ํ˜•์„ฑ/์†Œ๋ฉธ",
123
- "์Šคํ•€ํŒŒ ์ „๋‹ฌ", "๋น›์— ์˜ํ•œ ์ „๊ธฐ ๋ฐœ์ƒ", "์••๋ ฅ์— ์˜ํ•œ ์ „๊ธฐ ๋ฐœ์ƒ", "์ž๊ธฐ์žฅ ์† ์ „๋ฅ˜ ๋ณ€ํ™”",
124
- "์ „๊ธฐ ์ €ํ•ญ ๋ณ€ํ™”", "์ „๊ธฐ ์ „๋„์„ฑ ๋ณ€ํ™”", "์ •์ „๊ธฐ ๋ฐœ์ƒ/๋ฐฉ์ „", "์ „์ž๊ธฐ ์œ ๋„",
125
- "์ „์ž๊ธฐํŒŒ ๋ฐฉ์ถœ/ํก์ˆ˜", "์ „๊ธฐ ์šฉ๋Ÿ‰ ๋ณ€ํ™”", "์ž๊ธฐ ์ด๋ ฅ ํ˜„์ƒ", "์ „๊ธฐ์  ๋ถ„๊ทน",
126
- "์ „์ž ํ๋ฆ„ ๋ฐฉํ–ฅ ๋ณ€ํ™”", "์ „๊ธฐ์  ๊ณต๋ช…", "์ „๊ธฐ์  ์ฐจํ/๋…ธ์ถœ", "์ž๊ธฐ ์ฐจํ/๋…ธ์ถœ",
127
- "์ž๊ธฐ์žฅ ๋ฐฉํ–ฅ ์ •๋ ฌ"
128
- ],
129
-
130
- "ํ™”ํ•™์  ๋ณ€ํ™”": [
131
- "ํ‘œ๋ฉด ์ฝ”ํŒ… ๋ณ€ํ™”", "๋ฌผ์งˆ ์„ฑ๋ถ„ ๋ณ€ํ™”", "ํ™”ํ•™ ๋ฐ˜์‘ ๋ณ€ํ™”", "์ด‰๋งค ์ž‘์šฉ ์‹œ์ž‘/์ค‘๋‹จ",
132
- "๋น›์— ์˜ํ•œ ํ™”ํ•™ ๋ฐ˜์‘", "์ „๊ธฐ์— ์˜ํ•œ ํ™”ํ•™ ๋ฐ˜์‘", "๋‹จ๋ถ„์ž๋ง‰ ํ˜•์„ฑ", "๋ถ„์ž ์ˆ˜์ค€ ๊ณ„์‚ฐ ๋ณ€ํ™”",
133
- "์ž์—ฐ ๋ชจ๋ฐฉ ํ‘œ๋ฉด ๋ณ€ํ™”", "ํ™˜๊ฒฝ ๋ฐ˜์‘ํ˜• ๋ฌผ์งˆ ๋ณ€ํ™”", "์ฃผ๊ธฐ์  ํ™”ํ•™ ๋ฐ˜์‘", "์‚ฐํ™”", "ํ™˜์›",
134
- "๊ณ ๋ถ„์žํ™”", "๋ฌผ ๋ถ„ํ•ด", "ํ™”ํ•ฉ", "๋ฐฉ์‚ฌ์„  ์˜ํ–ฅ", "์‚ฐ-์—ผ๊ธฐ ๋ฐ˜์‘", "์ค‘ํ™” ๋ฐ˜์‘",
135
- "์ด์˜จํ™”", "ํ™”ํ•™์  ํก์ฐฉ/ํƒˆ์ฐฉ", "์ด‰๋งค ํšจ์œจ ๋ณ€ํ™”", "ํšจ์†Œ ํ™œ์„ฑ ๋ณ€ํ™”", "๋ฐœ์ƒ‰ ๋ฐ˜์‘",
136
- "pH ๋ณ€ํ™”", "ํ™”ํ•™์  ํ‰ํ˜• ์ด๋™", "๊ฒฐํ•ฉ ํ˜•์„ฑ/๋ถ„ํ•ด", "์šฉํ•ด๋„ ๋ณ€ํ™”"
137
- ],
138
-
139
- "์‹œ๊ฐ„ ๊ด€๋ จ ๋ณ€ํ™”": [
140
- "๋…ธํ™”/ํ’ํ™”", "๋งˆ๋ชจ/๋ถ€์‹", "์ƒ‰ ๋ฐ”๋žจ/๋ณ€์ƒ‰", "์†์ƒ/ํšŒ๋ณต", "์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ณ€ํ™”",
141
- "์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ฅธ ์ ์‘", "ํ•™์Šต ๊ธฐ๋ฐ˜ ํ˜•ํƒœ ์ตœ์ ํ™”", "์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ฌผ์„ฑ ๋ณ€ํ™”",
142
- "์ง‘๋‹จ ๊ธฐ์–ต ํšจ๊ณผ", "๋ฌธํ™”์  ์˜๋ฏธ ๋ณ€ํ™”", "์ง€์—ฐ ๋ฐ˜์‘", "์ด์ „ ์ƒํƒœ ์˜์กด ๋ณ€ํ™”",
143
- "์ ์ง„์  ์‹œ๊ฐ„ ๋ณ€ํ™”", "์ง„ํ™”์  ๋ณ€ํ™”", "์ฃผ๊ธฐ์  ์žฌ์ƒ", "๊ณ„์ ˆ ๋ณ€ํ™” ์ ์‘",
144
- "์ƒ์ฒด๋ฆฌ๋“ฌ ๋ณ€ํ™”", "์ƒ์•  ์ฃผ๊ธฐ ๋‹จ๊ณ„", "์„ฑ์žฅ/ํ‡ดํ™”", "์ž๊ธฐ ๋ณต๊ตฌ/์žฌ์ƒ",
145
- "์ž์—ฐ ์ˆœํ™˜ ์ ์‘", "์ง€์†์„ฑ/์ผ์‹œ์„ฑ", "๊ธฐ์–ต ํšจ๊ณผ", "์ง€์—ฐ๋œ ์ž‘์šฉ", "๋ˆ„์  ํšจ๊ณผ"
146
- ],
147
-
148
- "๋น›๊ณผ ์‹œ๊ฐ ํšจ๊ณผ": [
149
- "๋ฐœ๊ด‘/์†Œ๋“ฑ", "๋น› ํˆฌ๊ณผ/์ฐจ๋‹จ", "๋น› ์‚ฐ๋ž€/์ง‘์ค‘", "์ƒ‰์ƒ ์ŠคํŽ™ํŠธ๋Ÿผ ๋ณ€ํ™”", "๋น› ํšŒ์ ˆ",
150
- "๋น› ๊ฐ„์„ญ", "ํ™€๋กœ๊ทธ๋žจ ์ƒ์„ฑ", "๋ ˆ์ด์ € ํšจ๊ณผ", "๋น› ํŽธ๊ด‘", "ํ˜•๊ด‘/์ธ๊ด‘",
151
- "์ž์™ธ์„ /์ ์™ธ์„  ๋ฐœ๊ด‘", "๊ด‘ํ•™์  ์ฐฉ์‹œ", "๋น› ๊ตด์ ˆ", "๊ทธ๋ฆผ์ž ์ƒ์„ฑ/์ œ๊ฑฐ",
152
- "์ƒ‰์ˆ˜์ฐจ ํšจ๊ณผ", "๋ฌด์ง€๊ฐœ ํšจ๊ณผ", "๊ธ€๋กœ์šฐ ํšจ๊ณผ", "ํ”Œ๋ž˜์‹œ ํšจ๊ณผ", "์กฐ๋ช… ํŒจํ„ด",
153
- "๋น” ํšจ๊ณผ", "๊ด‘ ํ•„ํ„ฐ ํšจ๊ณผ", "๋น›์˜ ๋ฐฉํ–ฅ์„ฑ ๋ณ€ํ™”", "ํˆฌ์˜ ํšจ๊ณผ", "๋น› ๊ฐ์ง€/๋ฐ˜์‘",
154
- "๊ด‘๋„ ๋ณ€ํ™”"
155
- ],
156
-
157
- "์†Œ๋ฆฌ์™€ ์ง„๋™ ํšจ๊ณผ": [
158
- "์†Œ๋ฆฌ ๋ฐœ์ƒ/์†Œ๋ฉธ", "์†Œ๋ฆฌ ๋†’๋‚ฎ์ด ๋ณ€ํ™”", "์†Œ๋ฆฌ ํฌ๊ธฐ ๋ณ€ํ™”", "์Œ์ƒ‰ ๋ณ€ํ™”",
159
- "๊ณต๋ช…/๋ฐ˜๊ณต๋ช…", "์Œํ–ฅ ์ง„๋™", "์ดˆ์ŒํŒŒ/์ €์ŒํŒŒ ๋ฐœ์ƒ", "์Œํ–ฅ ์ง‘์ค‘/๋ถ„์‚ฐ",
160
- "์Œํ–ฅ ๋ฐ˜์‚ฌ/ํก์ˆ˜", "์Œํ–ฅ ๋„ํ”Œ๋Ÿฌ ํšจ๊ณผ", "์ŒํŒŒ ๊ฐ„์„ญ", "์Œํ–ฅ ๊ณต์ง„",
161
- "์ง„๋™ ํŒจํ„ด ๋ณ€ํ™”", "ํƒ€์•… ํšจ๊ณผ", "์Œํ–ฅ ํ”ผ๋“œ๋ฐฑ", "์Œํ–ฅ ์ฐจํ/์ฆํญ",
162
- "์†Œ๋ฆฌ ์ง€ํ–ฅ์„ฑ", "์Œํ–ฅ ์™œ๊ณก", "๋น„ํŠธ ์ƒ์„ฑ", "ํ•˜๋ชจ๋‹‰์Šค ์ƒ์„ฑ", "์ฃผํŒŒ์ˆ˜ ๋ณ€์กฐ",
163
- "์Œํ–ฅ ์ถฉ๊ฒฉํŒŒ", "์Œํ–ฅ ํ•„ํ„ฐ๋ง", "์ŒํŒŒ ์ „ํŒŒ ํŒจํ„ด", "์ง„๋™ ๋Œํ•‘"
164
- ],
165
-
166
- "์ƒ๋ฌผํ•™์  ๋ณ€ํ™”": [
167
- "์ƒ์žฅ/์œ„์ถ•", "์„ธํฌ ๋ถ„์—ด/์‚ฌ๋ฉธ", "์ƒ๋ฌผ ๋ฐœ๊ด‘", "์‹ ์ง„๋Œ€์‚ฌ ๋ณ€ํ™”", "๋ฉด์—ญ ๋ฐ˜์‘",
168
- "ํ˜ธ๋ฅด๋ชฌ ๋ถ„๋น„", "์‹ ๊ฒฝ ๋ฐ˜์‘", "์œ ์ „์  ๋ฐœํ˜„", "์ ์‘/์ง„ํ™”", "์ƒ์ฒด๋ฆฌ๋“ฌ ๋ณ€ํ™”",
169
- "์žฌ์ƒ/์น˜์œ ", "๋…ธํ™”/์„ฑ์ˆ™", "์ƒ์ฒด ๋ชจ๋ฐฉ ๏ฟฝ๏ฟฝํ™”", "๋ฐ”์ด์˜คํ•„๋ฆ„ ํ˜•์„ฑ", "์ƒ๋ฌผํ•™์  ๋ถ„ํ•ด",
170
- "ํšจ์†Œ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”", "์ƒ๋ฌผํ•™์  ์‹ ํ˜ธ ์ „๋‹ฌ", "์ŠคํŠธ๋ ˆ์Šค ๋ฐ˜์‘", "์ฒด์˜จ ์กฐ์ ˆ",
171
- "์ƒ๋ฌผํ•™์  ์‹œ๊ณ„ ๋ณ€ํ™”", "์„ธํฌ์™ธ ๊ธฐ์งˆ ๋ณ€ํ™”", "์ƒ์ฒด ์—ญํ•™์  ๋ฐ˜์‘", "์„ธํฌ ์šด๋™์„ฑ",
172
- "์„ธํฌ ๊ทน์„ฑ ๋ณ€ํ™”", "์˜์–‘ ์ƒํƒœ ๋ณ€ํ™”"
173
- ],
174
-
175
- "ํ™˜๊ฒฝ ์ƒํ˜ธ์ž‘์šฉ": [
176
- "์˜จ๋„ ๋ฐ˜์‘", "์Šต๋„ ๋ฐ˜์‘", "๊ธฐ์•• ๋ฐ˜์‘", "์ค‘๋ ฅ ๋ฐ˜์‘", "์ž๊ธฐ์žฅ ๋ฐ˜์‘",
177
- "๋น› ๋ฐ˜์‘", "์†Œ๋ฆฌ ๋ฐ˜์‘", "ํ™”ํ•™ ๋ฌผ์งˆ ๊ฐ์ง€", "๊ธฐ๊ณ„์  ์ž๊ทน ๊ฐ์ง€", "์ „๊ธฐ ์ž๊ทน ๋ฐ˜์‘",
178
- "๋ฐฉ์‚ฌ์„  ๋ฐ˜์‘", "์ง„๋™ ๊ฐ์ง€", "pH ๋ฐ˜์‘", "์šฉ๋งค ๋ฐ˜์‘", "๊ธฐ์ฒด ๊ตํ™˜",
179
- "ํ™˜๊ฒฝ ์˜ค์—ผ ๋ฐ˜์‘", "๋‚ ์”จ ๋ฐ˜์‘", "๊ณ„์ ˆ ๋ณ€ํ™” ๋ฐ˜์‘", "์ผ์ฃผ๊ธฐ ๋ฐ˜์‘", "์ƒํƒœ๊ณ„ ์ƒํ˜ธ์ž‘์šฉ",
180
- "๊ณต์ƒ/๊ฒฝ์Ÿ ๋ฐ˜์‘", "ํฌ์‹/ํ”ผ์‹ ๊ด€๊ณ„", "๊ตฐ์ง‘ ํ˜•์„ฑ", "์˜์—ญ ์„ค์ •", "์ด์ฃผ/์ •์ฐฉ ํŒจํ„ด"
181
- ],
182
-
183
- "์„ผ์„œ ๊ธฐ๋Šฅ": [
184
- "์‹œ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "์ฒญ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "์ด‰๊ฐ ์„ผ์„œ/๊ฐ์ง€", "๋ฏธ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "ํ›„๊ฐ ์„ผ์„œ/๊ฐ์ง€",
185
- "์˜จ๋„ ์„ผ์„œ/๊ฐ์ง€", "์Šต๋„ ์„ผ์„œ/๊ฐ์ง€", "์••๋ ฅ ์„ผ์„œ/๊ฐ์ง€", "๊ฐ€์†๋„ ์„ผ์„œ/๊ฐ์ง€", "ํšŒ์ „ ์„ผ์„œ/๊ฐ์ง€",
186
- "๊ทผ์ ‘ ์„ผ์„œ/๊ฐ์ง€", "์œ„์น˜ ์„ผ์„œ/๊ฐ์ง€", "์šด๋™ ์„ผ์„œ/๊ฐ์ง€", "๊ฐ€์Šค ์„ผ์„œ/๊ฐ์ง€", "์ ์™ธ์„  ์„ผ์„œ/๊ฐ์ง€",
187
- "์ž์™ธ์„  ์„ผ์„œ/๊ฐ์ง€", "๋ฐฉ์‚ฌ์„  ์„ผ์„œ/๊ฐ์ง€", "์ž๊ธฐ์žฅ ์„ผ์„œ/๊ฐ์ง€", "์ „๊ธฐ์žฅ ์„ผ์„œ/๊ฐ์ง€", "ํ™”ํ•™๋ฌผ์งˆ ์„ผ์„œ/๊ฐ์ง€",
188
- "์ƒ์ฒด์‹ ํ˜ธ ์„ผ์„œ/๊ฐ์ง€", "์ง„๋™ ์„ผ์„œ/๊ฐ์ง€", "์†Œ์Œ ์„ผ์„œ/๊ฐ์ง€", "๋น› ์„ธ๊ธฐ ์„ผ์„œ/๊ฐ์ง€", "๋น› ํŒŒ์žฅ ์„ผ์„œ/๊ฐ์ง€",
189
- "๊ธฐ์šธ๊ธฐ ์„ผ์„œ/๊ฐ์ง€", "pH ์„ผ์„œ/๊ฐ์ง€", "์ „๋ฅ˜ ์„ผ์„œ/๊ฐ์ง€", "์ „์•• ์„ผ์„œ/๊ฐ์ง€", "์ด๋ฏธ์ง€ ์„ผ์„œ/๊ฐ์ง€",
190
- "๊ฑฐ๋ฆฌ ์„ผ์„œ/๊ฐ์ง€", "๊นŠ์ด ์„ผ์„œ/๊ฐ์ง€", "์ค‘๋ ฅ ์„ผ์„œ/๊ฐ์ง€", "์†๋„ ์„ผ์„œ/๊ฐ์ง€", "ํ๋ฆ„ ์„ผ์„œ/๊ฐ์ง€",
191
- "์ˆ˜์œ„ ์„ผ์„œ/๊ฐ์ง€", "ํƒ๋„ ์„ผ์„œ/๊ฐ์ง€", "์—ผ๋„ ์„ผ์„œ/๊ฐ์ง€", "๊ธˆ์† ๊ฐ์ง€", "์••์ „ ์„ผ์„œ/๊ฐ์ง€",
192
- "๊ด‘์ „ ์„ผ์„œ/๊ฐ์ง€", "์—ด์ „๋Œ€ ์„ผ์„œ/๊ฐ์ง€", "ํ™€ ํšจ๊ณผ ์„ผ์„œ/๊ฐ์ง€", "์ดˆ์ŒํŒŒ ์„ผ์„œ/๊ฐ์ง€", "๋ ˆ์ด๋” ์„ผ์„œ/๊ฐ์ง€",
193
- "๋ผ์ด๋‹ค ์„ผ์„œ/๊ฐ์ง€", "ํ„ฐ์น˜ ์„ผ์„œ/๊ฐ์ง€", "์ œ์Šค์ฒ˜ ์„ผ์„œ/๊ฐ์ง€", "์‹ฌ๋ฐ• ์„ผ์„œ/๊ฐ์ง€", "ํ˜ˆ์•• ์„ผ์„œ/๊ฐ์ง€"
194
- ]
195
- }
196
-
197
-
198
-
199
- # ====== Gemini ์ŠคํŠธ๋ฆฌ๋ฐ API ํ•จ์ˆ˜ ======
200
- def query_gemini_api_stream(prompt: str) -> Iterator[str]:
201
- """
202
- Gemini 2.0 Flash ๋ชจ๋ธ์—์„œ Thinking(์‚ฌ๊ณ  ๊ณผ์ •) + Response(์ตœ์ข… ๋‹ต๋ณ€)๋ฅผ
203
- stream=True๋กœ ๋ฐ›์•„, chunk ๋‹จ์œ„๋กœ yield.
204
- """
205
- # ๋Œ€ํ™” ์ด๋ ฅ ์—†์ด ๋‹จ์ˆœ ํ˜ธ์ถœ
206
- chat = model.start_chat(history=[])
207
- response = chat.send_message(prompt, stream=True)
208
-
209
- thought_buffer = ""
210
- response_buffer = ""
211
- thinking_complete = False
212
-
213
- for chunk in response:
214
- parts = chunk.candidates[0].content.parts
215
-
216
- if len(parts) == 2 and not thinking_complete:
217
- # ์ฒซ ๋ฒˆ์งธ part: Thinking
218
- thought_buffer += parts[0].text
219
- yield f"[Thinking Chunk] {parts[0].text}"
220
-
221
- # ๋‘ ๋ฒˆ์งธ part: Response
222
- response_buffer = parts[1].text
223
- yield f"[Response Start] {parts[1].text}"
224
-
225
- thinking_complete = True
226
- elif thinking_complete:
227
- # ์ด๋ฏธ ์‘๋‹ต ๋‹จ๊ณ„์— ์žˆ์Œ
228
- current_chunk = parts[0].text
229
- response_buffer += current_chunk
230
- yield current_chunk
231
- else:
232
- # ์•„์ง Thinking ๋‹จ๊ณ„
233
- current_chunk = parts[0].text
234
- thought_buffer += current_chunk
235
- yield f"[Thinking Chunk] {current_chunk}"
236
-
237
- # ๋งˆ์ง€๋ง‰์— ์ „์ฒด ์ตœ์ข… ์‘๋‹ต
238
- yield f"\n[Final Response]\n{response_buffer}"
239
-
240
-
241
- # ====== ์„ค๋ช… ํ™•์žฅ ํ•จ์ˆ˜ (์ŠคํŠธ๋ฆฌ๋ฐ) ======
242
- def enhance_with_llm_stream(base_description, obj_name, category) -> Iterator[str]:
243
- prompt = f"""
244
- ๋‹ค์Œ์€ '{obj_name}'์˜ '{category}' ๊ด€๋ จ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค:
245
- "{base_description}"
246
- ์œ„ ๋‚ด์šฉ์„ ๋ณด๋‹ค ๊ตฌ์ฒดํ™”ํ•˜์—ฌ,
247
- 1) ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ดํ•ด,
248
- 2) ํ˜์‹  ํฌ์ธํŠธ์™€ ๊ธฐ๋Šฅ์„ฑ ๋“ฑ์„ ์ค‘์‹ฌ์œผ๋กœ
249
- 3~4๋ฌธ์žฅ์˜ ์•„์ด๋””์–ด๋กœ ํ™•์žฅํ•ด ์ฃผ์„ธ์š”.
250
- """
251
- for chunk in query_gemini_api_stream(prompt):
252
- yield chunk
253
-
254
-
255
- # ====== ๋‹จ์ผ ํ‚ค์›Œ๋“œ(์˜ค๋ธŒ์ ํŠธ)์— ๋Œ€ํ•œ ์•„์ด๋””์–ด ์ƒ์„ฑ ======
256
- def generate_single_object_transformations(obj):
257
- results = {}
258
- for category, transformations in physical_transformation_categories.items():
259
- transformation = choose_alternative(random.choice(transformations))
260
- base_description = f"{obj}์ด(๊ฐ€) {transformation} ํ˜„์ƒ์„ ๋ณด์ธ๋‹ค"
261
- results[category] = {"base": base_description, "enhanced": ""}
262
- return results
263
-
264
- # ====== 2๊ฐœ ์˜ค๋ธŒ์ ํŠธ ์ƒํ˜ธ์ž‘์šฉ ======
265
- def generate_two_objects_interaction(obj1, obj2):
266
- results = {}
267
- for category, transformations in physical_transformation_categories.items():
268
- transformation = choose_alternative(random.choice(transformations))
269
- template = random.choice([
270
- "{obj1}์ด(๊ฐ€) {obj2}์— ๊ฒฐํ•ฉํ•˜์—ฌ {change}๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค",
271
- "{obj1}๊ณผ(์™€) {obj2}์ด(๊ฐ€) ์ถฉ๋Œํ•˜๋ฉด์„œ {change}๊ฐ€ ์ผ์–ด๋‚ฌ๋‹ค"
272
- ])
273
- base_description = template.format(obj1=obj1, obj2=obj2, change=transformation)
274
- results[category] = {"base": base_description, "enhanced": ""}
275
- return results
276
-
277
- # ====== 3๊ฐœ ์˜ค๋ธŒ์ ํŠธ ์ƒํ˜ธ์ž‘์šฉ ======
278
- def generate_three_objects_interaction(obj1, obj2, obj3):
279
- results = {}
280
- for category, transformations in physical_transformation_categories.items():
281
- transformation = choose_alternative(random.choice(transformations))
282
- template = random.choice([
283
- "{obj1}, {obj2}, {obj3}์ด(๊ฐ€) ์‚ผ๊ฐํ˜• ๊ตฌ์กฐ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ {change}๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค",
284
- "{obj1}์ด(๊ฐ€) {obj2}์™€(๊ณผ) {obj3} ์‚ฌ์ด์—์„œ ๋งค๊ฐœ์ฒด ์—ญํ• ์„ ํ•˜๋ฉฐ {change}๋ฅผ ์ด‰์ง„ํ–ˆ๋‹ค"
285
- ])
286
- base_description = template.format(obj1=obj1, obj2=obj2, obj3=obj3, change=transformation)
287
- results[category] = {"base": base_description, "enhanced": ""}
288
- return results
289
-
290
-
291
- def generate_transformations(text1, text2=None, text3=None):
292
- if text2 and text3:
293
- results = generate_three_objects_interaction(text1, text2, text3)
294
- objects = [text1, text2, text3]
295
- elif text2:
296
- results = generate_two_objects_interaction(text1, text2)
297
- objects = [text1, text2]
298
- else:
299
- results = generate_single_object_transformations(text1)
300
- objects = [text1]
301
- return results, objects
302
-
303
-
304
- # ====== ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ Thinking + Response ํ‘œ์‹œ ======
305
- def process_inputs_stream(text1, text2, text3) -> Iterator[list]:
306
- """
307
- Gradio 3.27+ ์ด์ƒ์—์„œ๋งŒ stream=True๋กœ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ.
308
- ๋ฉ”์‹œ์ง€๋Š” [{'role': 'assistant', 'content': ...}, ...] ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜.
309
- """
310
- # 1) ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ
311
- yield [{"role": "assistant", "content": "์ž…๋ ฅ๊ฐ’ ํ™•์ธ ์ค‘..."}]
312
- time.sleep(0.3)
313
-
314
- text1 = text1.strip() if text1 else None
315
- text2 = text2.strip() if text2 else None
316
- text3 = text3.strip() if text3 else None
317
- if not text1:
318
- yield [{"role": "assistant", "content": "์˜ค๋ฅ˜: ์ตœ์†Œ ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."}]
319
- return
320
-
321
- # 2) ์•„์ด๋””์–ด ์ƒ์„ฑ
322
- yield [{"role": "assistant", "content": "์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ ์ค‘... (์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ถ„์„)"}]
323
- time.sleep(0.3)
324
- results, objects = generate_transformations(text1, text2, text3)
325
-
326
- obj_name = " ๋ฐ ".join([obj for obj in objects if obj])
327
-
328
- # ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ŠคํŠธ๋ฆฌ๋ฐ
329
- for i, (category, info) in enumerate(results.items(), start=1):
330
- base_desc = info["base"]
331
- yield [{
332
- "role": "assistant",
333
- "content": f"**[{i}/{len(results)}] ์นดํ…Œ๊ณ ๋ฆฌ:** {category}\n\n๊ธฐ๋ณธ ์•„์ด๋””์–ด: {base_desc}\n\nThinking + Response ์ŠคํŠธ๋ฆฌ๋ฐ ์‹œ์ž‘..."
334
- }]
335
- time.sleep(0.5)
336
-
337
- thinking_text = ""
338
- response_text = ""
339
- thinking_done = False
340
-
341
- for chunk in enhance_with_llm_stream(base_desc, obj_name, category):
342
- if chunk.startswith("[Thinking Chunk]"):
343
- # Thinking ๋‹จ๊ณ„
344
- thinking_text += chunk.replace("[Thinking Chunk]", "")
345
- yield [{"role": "assistant", "content": f"**[Thinking]**\n{thinking_text}"}]
346
-
347
- elif chunk.startswith("[Response Start]"):
348
- # Response ์‹œ์ž‘
349
- thinking_done = True
350
- partial = chunk.replace("[Response Start]", "")
351
- response_text += partial
352
- yield [{"role": "assistant", "content": f"**[Response ์‹œ์ž‘]**\n{partial}"}]
353
-
354
- elif chunk.startswith("[Final Response]"):
355
- # ์ตœ์ข… ์‘๋‹ต
356
- final = chunk.replace("[Final Response]", "")
357
- response_text += f"\n{final}"
358
- yield [{"role": "assistant", "content": f"**[์ตœ์ข… Response]**\n{response_text.strip()}"}]
359
-
360
- else:
361
- # ์ผ๋ฐ˜ ์‘๋‹ต ์ŠคํŠธ๋ฆฌ๋ฐ
362
- if thinking_done:
363
- response_text += chunk
364
- yield [{"role": "assistant", "content": f"**[์‘๋‹ต ์ง„ํ–‰]**\n{response_text}"}]
365
- else:
366
- thinking_text += chunk
367
- yield [{"role": "assistant", "content": f"**[Thinking]**\n{thinking_text}"}]
368
-
369
- info["enhanced"] = response_text
370
-
371
- # ์™„๋ฃŒ ์•Œ๋ฆผ
372
- yield [{"role": "assistant", "content": "**๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!**"}]
373
-
374
-
375
- ##############################################################################
376
- # Gradio UI (Chatbot: type='messages')
377
- ##############################################################################
378
- with gr.Blocks(title="Gemini Flash Thinking (Stream)", theme=gr.themes.Soft(primary_hue="teal")) as demo:
379
- gr.Markdown("# ๐Ÿš€ ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด (Gemini 2.0 Flash Thinking, Streaming)\n"+
380
- "ํ‚ค์›Œ๋“œ 1~3๊ฐœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, **์นดํ…Œ๊ณ ๋ฆฌ๋ณ„**๋กœ 'Thinking'๊ณผ 'Response'๊ฐ€ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ๋ฉ๋‹ˆ๋‹ค.")
381
-
382
- chatbot = gr.Chatbot(
383
- label="์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ŠคํŠธ๋ฆฌ๋ฐ",
384
- type="messages", # OpenAI ์Šคํƒ€์ผ {"role":"assistant", "content":...} ํฌ๋งท
385
- render_markdown=True
386
- )
387
-
388
- with gr.Row():
389
- with gr.Column(scale=1):
390
- text_input1 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 1 (ํ•„์ˆ˜)", placeholder="์˜ˆ: ์ž๋™์ฐจ")
391
- text_input2 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 2 (์„ ํƒ)", placeholder="์˜ˆ: ๋กœ๋ด‡")
392
- text_input3 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 3 (์„ ํƒ)", placeholder="์˜ˆ: ์ธ๊ณต์ง€๋Šฅ")
393
- submit_button = gr.Button("์•„์ด๋””์–ด ์ƒ์„ฑํ•˜๊ธฐ")
394
- clear_button = gr.Button("๋Œ€ํ™” ์ง€์šฐ๊ธฐ")
395
-
396
- with gr.Column(scale=2):
397
- pass
398
-
399
- def clear_chat():
400
- return []
401
-
402
- # ์˜ˆ์‹œ
403
- examples = [
404
- ["์ž๋™์ฐจ", "", ""],
405
- ["์Šค๋งˆํŠธํฐ", "์ธ๊ณต์ง€๋Šฅ", ""],
406
- ["๋“œ๋ก ", "์ธ๊ณต์ง€๋Šฅ", ""],
407
- ["์šด๋™ํ™”", "์›จ์–ด๋Ÿฌ๋ธ”", "๊ฑด๊ฐ•"],
408
- ]
409
- gr.Examples(examples=examples, inputs=[text_input1, text_input2, text_input3])
410
-
411
- submit_button.click(
412
- fn=process_inputs_stream,
413
- inputs=[text_input1, text_input2, text_input3],
414
- outputs=chatbot,
415
- stream=True # ์ตœ์‹  Gradio(3.27+)์—์„œ๋งŒ ์ง€์›
416
- )
417
-
418
- clear_button.click(
419
- fn=clear_chat,
420
- outputs=chatbot
421
- )
422
-
423
- if __name__ == "__main__":
424
- demo.launch(debug=True)