ssboost commited on
Commit
7de8013
·
verified ·
1 Parent(s): 809e3e8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -104
app.py CHANGED
@@ -112,83 +112,31 @@ class GradioClientController:
112
  return tuple([[] for _ in range(7)])
113
 
114
  def _parse_dropdown_result(self, result):
115
- """API 응답에서 실제 선택지 데이터만 추출"""
116
  try:
117
- logger.info(f"응답 파싱 시작, 응답 타입: {type(result)}")
118
 
119
- if isinstance(result, (list, tuple)):
120
- parsed_choices = []
121
- for i, item in enumerate(result):
122
- logger.info(f"항목 {i}: 타입={type(item)}, 값={item}")
123
-
124
- if isinstance(item, dict):
125
- # Gradio 응답에서 choices 추출
126
- if 'choices' in item:
127
- choices = item['choices']
128
- logger.info(f"dict에서 choices 추출: {choices}")
129
- elif '__type__' in item:
130
- # __type__ 구조 분석
131
- logger.info(f"__type__ 구조 발견: {item}")
132
- # 일반적으로 Gradio에서는 choices가 별도 필드에 있음
133
- choices = []
134
- else:
135
- # dict의 다른 값들 확인
136
- choices = []
137
- for key, value in item.items():
138
- if isinstance(value, list) and key != '__type__':
139
- choices = value
140
- break
141
- elif isinstance(item, list):
142
- # 이미 리스트인 경우
143
- choices = item
144
- logger.info(f"리스트 형태 choices: {choices}")
145
- else:
146
- # 문자열이거나 기타 타입
147
- choices = [str(item)] if item else []
148
- logger.info(f"기타 타입을 문자열로 변환: {choices}")
149
-
150
- parsed_choices.append(choices)
151
-
152
- logger.info(f"파싱 완료: {parsed_choices}")
153
- return parsed_choices
154
  else:
155
- logger.warning(f"예상하지 못한 응답 형식: {type(result)}")
156
  return [[] for _ in range(7)]
 
157
  except Exception as e:
158
  logger.error(f"드롭다운 결과 파싱 오류: {str(e)}")
159
- logger.error(traceback.format_exc())
160
  return [[] for _ in range(7)]
161
 
162
  def get_initial_simple_choices(self) -> list:
163
- """심플 배경 초기 선택지만 반환"""
164
- try:
165
- logger.info("심플 배경 선택지 로드 시작")
166
-
167
- if "심플 배경" in self.background_options:
168
- result = self.background_options["심플 배경"]
169
- logger.info("캐시에서 심플 배경 선택지 로드")
170
- elif self.client:
171
- logger.info("API에서 심플 배경 선택지 로드")
172
- result = self.client.predict("심플 배경", api_name="/update_dropdowns")
173
- logger.info(f"API 응답: {result}")
174
-
175
- # 응답 파싱
176
- parsed_result = self._parse_dropdown_result(result)
177
- self.background_options["심플 배경"] = parsed_result
178
-
179
- if len(parsed_result) > 0:
180
- choices = parsed_result[0]
181
- logger.info(f"파싱된 심플 배경 선택지: {choices}")
182
- return choices
183
- else:
184
- logger.error("클라이언트가 초기화되지 않음")
185
- return []
186
-
187
- except Exception as e:
188
- logger.error(f"심플 배경 선택지 로드 실패: {str(e)}")
189
- logger.error(traceback.format_exc())
190
-
191
- return []
192
 
193
  def _ensure_client(self) -> bool:
194
  """클라이언트 연결 상태 확인 및 재연결"""
@@ -198,31 +146,19 @@ class GradioClientController:
198
  return self.client is not None
199
 
200
  def update_dropdowns(self, bg_type: str) -> Tuple:
201
- """배경 유형에 따른 드롭다운 업데이트"""
202
  try:
203
- logger.info(f"드롭다운 업데이트 시작: {bg_type}")
204
 
205
  if not self._ensure_client():
206
  logger.error("클라이언트 연결 실패")
207
- # 캐시된 데이터가 있으면 사용
208
- if bg_type in self.background_options:
209
- result = self.background_options[bg_type]
210
- logger.info(f"캐시된 드롭다운 데이터 사용: {bg_type}")
211
- else:
212
- return tuple([gr.update(visible=False) for _ in range(7)])
213
- else:
214
- # 실시간으로 API 호출
215
- result = self.client.predict(bg_type, api_name="/update_dropdowns")
216
- logger.info(f"API 응답 원본: {result}")
217
-
218
- # 응답 파싱
219
- parsed_result = self._parse_dropdown_result(result)
220
- self.background_options[bg_type] = parsed_result
221
- result = parsed_result
222
-
223
- logger.info(f"파싱된 결과: {result}")
224
 
225
- # 결과를 Gradio 업데이트 형식으로 변환
226
  if isinstance(result, (list, tuple)) and len(result) >= 7:
227
  updates = []
228
  visibility_map = ["심플 배경", "스튜디오 배경", "자연 환경", "실내 환경", "특수배경", "주얼리", "특수효과"]
@@ -230,33 +166,24 @@ class GradioClientController:
230
  for i, choices in enumerate(result[:7]):
231
  is_visible = (bg_type == visibility_map[i])
232
 
233
- # 선택지가 있을 때만 번째 값을 기본값으로 설정
234
- if is_visible and choices and len(choices) > 0:
235
- first_choice = choices[0]
236
- logger.info(f"드롭다운 {i} ({visibility_map[i]}): visible=True, choices={len(choices)}개, default='{first_choice}'")
237
  updates.append(gr.update(
238
  visible=True,
239
  choices=choices,
240
- value=first_choice,
241
  interactive=True
242
  ))
243
  else:
244
- logger.info(f"드롭다운 {i} ({visibility_map[i]}): visible=False")
245
- updates.append(gr.update(
246
- visible=False,
247
- choices=[],
248
- value=None,
249
- interactive=True
250
- ))
251
 
252
  return tuple(updates)
253
  else:
254
- logger.warning(f"API에서 예상과 다른 형식의 결과를 반환했습니다: {type(result)}, length={len(result) if hasattr(result, '__len__') else 'N/A'}")
255
  return tuple([gr.update(visible=False) for _ in range(7)])
256
 
257
  except Exception as e:
258
  logger.error(f"드롭다운 업데이트 오류: {str(e)}")
259
- logger.error(traceback.format_exc())
260
  return tuple([gr.update(visible=False) for _ in range(7)])
261
 
262
  def generate_prompt_only(self, password: str, bg_type: str, simple: str, studio: str,
@@ -412,9 +339,10 @@ def create_gradio_interface():
412
  value="심플 배경"
413
  )
414
 
415
- # 드롭다운 컴포넌트들 - 초기에는 상태로 시작
416
  simple_dropdown = gr.Dropdown(
417
- choices=[],
 
418
  label="심플 배경 선택",
419
  visible=True,
420
  interactive=True
 
112
  return tuple([[] for _ in range(7)])
113
 
114
  def _parse_dropdown_result(self, result):
115
+ """API 응답에서 실제 선택지 데이터만 추출 - 단순화"""
116
  try:
117
+ logger.info(f"응답 파싱: {result}")
118
 
119
+ # API 문서에 따르면 tuple of 7 elements를 반환
120
+ # 요소는 Literal 타입의 리스트여야 함
121
+ if isinstance(result, (list, tuple)) and len(result) >= 7:
122
+ # 결과를 그대로 반환 (API가 이미 올바른 형식으로 반환한다고 가정)
123
+ return result[:7]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  else:
125
+ logger.warning(f"예상하지 못한 응답 형식: {type(result)}, length={len(result) if hasattr(result, '__len__') else 'N/A'}")
126
  return [[] for _ in range(7)]
127
+
128
  except Exception as e:
129
  logger.error(f"드롭다운 결과 파싱 오류: {str(e)}")
 
130
  return [[] for _ in range(7)]
131
 
132
  def get_initial_simple_choices(self) -> list:
133
+ """심플 배경 초기 선택지 - 하드코딩으로 테스트"""
134
+ # API 문서에서 확인된 실제 선택지들
135
+ return [
136
+ '화이트 기본', '회색 투톤', '라이트 그레이', '그레이 그라데이션 스포트라이트',
137
+ '프리미엄 드라마틱 블랙', '딥블루 유리반사', '파스텔 그라데이션', '스카이블루 파스텔',
138
+ '버터옐로우 파스텔', '블루 원색', '레드 원색'
139
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
 
141
  def _ensure_client(self) -> bool:
142
  """클라이언트 연결 상태 확인 및 재연결"""
 
146
  return self.client is not None
147
 
148
  def update_dropdowns(self, bg_type: str) -> Tuple:
149
+ """배경 유형에 따른 드롭다운 업데이트 - 단순화"""
150
  try:
151
+ logger.info(f"드롭다운 업데이트: {bg_type}")
152
 
153
  if not self._ensure_client():
154
  logger.error("클라이언트 연결 실패")
155
+ return tuple([gr.update(visible=False) for _ in range(7)])
156
+
157
+ # API 호출
158
+ result = self.client.predict(bg_type, api_name="/update_dropdowns")
159
+ logger.info(f"API 응답: {result}")
 
 
 
 
 
 
 
 
 
 
 
 
160
 
161
+ # API 응답을 그대로 사용
162
  if isinstance(result, (list, tuple)) and len(result) >= 7:
163
  updates = []
164
  visibility_map = ["심플 배경", "스튜디오 배경", "자연 환경", "실내 환경", "특수배경", "주얼리", "특수효과"]
 
166
  for i, choices in enumerate(result[:7]):
167
  is_visible = (bg_type == visibility_map[i])
168
 
169
+ if is_visible and isinstance(choices, list) and len(choices) > 0:
170
+ logger.info(f"{visibility_map[i]} 드롭다운: {len(choices)}개 선택지")
 
 
171
  updates.append(gr.update(
172
  visible=True,
173
  choices=choices,
174
+ value=choices[0], # 첫 번째 항목 선택
175
  interactive=True
176
  ))
177
  else:
178
+ updates.append(gr.update(visible=False))
 
 
 
 
 
 
179
 
180
  return tuple(updates)
181
  else:
182
+ logger.error(f"잘못된 API 응답: {result}")
183
  return tuple([gr.update(visible=False) for _ in range(7)])
184
 
185
  except Exception as e:
186
  logger.error(f"드롭다운 업데이트 오류: {str(e)}")
 
187
  return tuple([gr.update(visible=False) for _ in range(7)])
188
 
189
  def generate_prompt_only(self, password: str, bg_type: str, simple: str, studio: str,
 
339
  value="심플 배경"
340
  )
341
 
342
+ # 드롭다운 컴포넌트들 - 심플 배경은 하드코딩된 선택지로 시작
343
  simple_dropdown = gr.Dropdown(
344
+ choices=controller.get_initial_simple_choices(),
345
+ value="화이트 기본", # 기본값 설정
346
  label="심플 배경 선택",
347
  visible=True,
348
  interactive=True