sirochild commited on
Commit
ee55d2f
·
verified ·
1 Parent(s): b258751

Upload main_app.py

Browse files
Files changed (1) hide show
  1. main_app.py +93 -50
main_app.py CHANGED
@@ -2248,10 +2248,10 @@ Streamlit情報:
2248
  return response if response else "[HIDDEN:(言葉が出てこない...)]…なんて言えばいいか分からない。"
2249
 
2250
  except Exception as e:
2251
- # ★★★ ここからがデバッグ用のコード ★★★
2252
  import traceback
2253
 
2254
- # ターミナルに強制的にエラーの詳細を出力する
2255
  print("--- !!! PROCESS_CHAT_MESSAGE CRASHED !!! ---")
2256
  print(f"ERROR TYPE: {type(e)}")
2257
  print(f"ERROR DETAILS: {e}")
@@ -2261,12 +2261,19 @@ Streamlit情報:
2261
  # Streamlitのログにも詳細を記録する
2262
  logger.error(f"チャットメッセージ処理で致命的なエラーが発生", exc_info=True)
2263
 
 
 
 
 
 
2264
  # 画面にはエラーメッセージを返す
2265
  return "(ごめん、システムの内部で深刻なエラーが起きたみたい。ターミナルを確認して。)"
2266
 
2267
  # 初期化(セッションステートに必要な変数を登録)
2268
  if "awaiting_response" not in st.session_state:
2269
  st.session_state.awaiting_response = False
 
 
2270
  if "latest_prompt" not in st.session_state:
2271
  st.session_state.latest_prompt = ""
2272
  if "chat" not in st.session_state:
@@ -2297,67 +2304,103 @@ Streamlit情報:
2297
  # 応答処理のロジックをトリガーする
2298
  st.session_state.awaiting_response = True
2299
  st.session_state.latest_prompt = prompt
 
2300
 
2301
  # フォームのclear_on_submit=Trueにより自動的に入力欄がクリアされる
2302
  # rerunは不要 - フォーム送信により自動的に再描画される
2303
 
2304
 
 
 
 
 
 
 
 
 
 
 
2305
  # 応答処理(rerun 後にこのブロックが実行される)
2306
  if st.session_state.awaiting_response:
2307
- prompt = st.session_state.latest_prompt
 
2308
 
2309
- # 1. 入力チェック
2310
- if len(prompt) > MAX_INPUT_LENGTH:
2311
- st.error(f"⚠️ メッセージは{MAX_INPUT_LENGTH}文字以内で入力してください。")
2312
- st.session_state.awaiting_response = False
2313
- st.session_state.latest_prompt = ""
2314
- else:
2315
- # 2. ユーザーのメッセージを表示に追加
2316
- from datetime import datetime # ローカルインポートで確実に利用可能にする
2317
- user_message_id = f"user_{len(st.session_state.chat['messages'])}"
2318
- user_message = {
2319
- "role": "user",
2320
- "content": prompt,
2321
- "timestamp": datetime.now().isoformat(),
2322
- "message_id": user_message_id
2323
- }
2324
- st.session_state.chat['messages'].append(user_message)
2325
- logger.info(f"ユーザーメッセージを追加: '{prompt}' (ID: {user_message_id})")
2326
-
2327
- # 3. AI応答生成(スピナー付き)
2328
- with cute_thinking_spinner():
2329
- response = process_chat_message(prompt)
2330
-
2331
- # 4. AI応答を履歴に追加
2332
- assistant_message_id = f"assistant_{len(st.session_state.chat['messages'])}"
2333
- assistant_message = {
2334
- "role": "assistant",
2335
- "content": response,
2336
- "timestamp": datetime.now().isoformat(),
2337
- "message_id": assistant_message_id
2338
- }
2339
- st.session_state.chat['messages'].append(assistant_message)
2340
- logger.info(f"AI応答を追加: '{response[:50]}...' (ID: {assistant_message_id})")
2341
 
2342
- # 5. シーン変更フラグがあればリセット
2343
- if st.session_state.get('scene_change_flag', False):
2344
- del st.session_state['scene_change_flag']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2345
 
2346
- # 6. 応答完了状態に戻す
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2347
  st.session_state.awaiting_response = False
2348
  st.session_state.latest_prompt = ""
 
2349
 
2350
- # rerun回数をリセット
2351
- st.session_state.rerun_count = 0
2352
-
2353
- # ゲームデータを保存
2354
- save_game_data_to_file(managers)
2355
-
2356
- # 応答完了フラグを設定(一度だけ再描画するため)
2357
- st.session_state.response_completed = True
2358
-
2359
- # 応答完了後に強制的にチャット履歴を表示
2360
- logger.info("🎯 応答完了後の強制チャット履歴表示開始")
2361
  for message in st.session_state.chat['messages']:
2362
  role = message.get("role", "user")
2363
  content = message.get("content", "")
 
2248
  return response if response else "[HIDDEN:(言葉が出てこない...)]…なんて言えばいいか分からない。"
2249
 
2250
  except Exception as e:
2251
+ # ★★★ ここからがデバッグ用のコード ★★★
2252
  import traceback
2253
 
2254
+ # ターミナルに強制的にエラーの詳細を出力する
2255
  print("--- !!! PROCESS_CHAT_MESSAGE CRASHED !!! ---")
2256
  print(f"ERROR TYPE: {type(e)}")
2257
  print(f"ERROR DETAILS: {e}")
 
2261
  # Streamlitのログにも詳細を記録する
2262
  logger.error(f"チャットメッセージ処理で致命的なエラーが発生", exc_info=True)
2263
 
2264
+ # 重要: awaiting_response状態をリセットして無限読み込みを防ぐ
2265
+ if 'awaiting_response' in st.session_state:
2266
+ st.session_state.awaiting_response = False
2267
+ logger.error("エラー発生により awaiting_response をリセットしました")
2268
+
2269
  # 画面にはエラーメッセージを返す
2270
  return "(ごめん、システムの内部で深刻なエラーが起きたみたい。ターミナルを確認して。)"
2271
 
2272
  # 初期化(セッションステートに必要な変数を登録)
2273
  if "awaiting_response" not in st.session_state:
2274
  st.session_state.awaiting_response = False
2275
+ if "response_start_time" not in st.session_state:
2276
+ st.session_state.response_start_time = None
2277
  if "latest_prompt" not in st.session_state:
2278
  st.session_state.latest_prompt = ""
2279
  if "chat" not in st.session_state:
 
2304
  # 応答処理のロジックをトリガーする
2305
  st.session_state.awaiting_response = True
2306
  st.session_state.latest_prompt = prompt
2307
+ st.session_state.response_start_time = time.time() # 応答開始時刻を記録
2308
 
2309
  # フォームのclear_on_submit=Trueにより自動的に入力欄がクリアされる
2310
  # rerunは不要 - フォーム送信により自動的に再描画される
2311
 
2312
 
2313
+ # 応答処理のタイムアウトチェック(30秒でタイムアウト)
2314
+ if st.session_state.awaiting_response and st.session_state.response_start_time:
2315
+ elapsed_time = time.time() - st.session_state.response_start_time
2316
+ if elapsed_time > 30: # 30秒でタイムアウト
2317
+ logger.error(f"応答処理がタイムアウトしました({elapsed_time:.1f}秒経過)")
2318
+ st.session_state.awaiting_response = False
2319
+ st.session_state.latest_prompt = ""
2320
+ st.session_state.response_start_time = None
2321
+ st.error("応答処理がタイムアウトしました。もう一度お試しください。")
2322
+
2323
  # 応答処理(rerun 後にこのブロックが実行される)
2324
  if st.session_state.awaiting_response:
2325
+ try:
2326
+ prompt = st.session_state.latest_prompt
2327
 
2328
+ # 1. 入力チェック
2329
+ if len(prompt) > MAX_INPUT_LENGTH:
2330
+ st.error(f"⚠️ メッセージは{MAX_INPUT_LENGTH}文字以内で入力してください。")
2331
+ st.session_state.awaiting_response = False
2332
+ st.session_state.latest_prompt = ""
2333
+ else:
2334
+ # 2. ユーザーのメッセージを表示に追加
2335
+ from datetime import datetime # ローカルインポートで確実に利用可能にする
2336
+ user_message_id = f"user_{len(st.session_state.chat['messages'])}"
2337
+ user_message = {
2338
+ "role": "user",
2339
+ "content": prompt,
2340
+ "timestamp": datetime.now().isoformat(),
2341
+ "message_id": user_message_id
2342
+ }
2343
+ st.session_state.chat['messages'].append(user_message)
2344
+ logger.info(f"ユーザーメッセージを追加: '{prompt}' (ID: {user_message_id})")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2345
 
2346
+ # 3. AI応答生成(スピナー付き + タイムアウト対策)
2347
+ response = None
2348
+ try:
2349
+ with cute_thinking_spinner():
2350
+ response = process_chat_message(prompt)
2351
+ except Exception as e:
2352
+ logger.error(f"AI応答生成でエラーが発生: {e}")
2353
+ response = "(ごめん、今ちょっと調子が悪いみたい...もう一度話しかけてくれる?)"
2354
+
2355
+ # 4. AI応答を履歴に追加
2356
+ if response:
2357
+ assistant_message_id = f"assistant_{len(st.session_state.chat['messages'])}"
2358
+ assistant_message = {
2359
+ "role": "assistant",
2360
+ "content": response,
2361
+ "timestamp": datetime.now().isoformat(),
2362
+ "message_id": assistant_message_id
2363
+ }
2364
+ st.session_state.chat['messages'].append(assistant_message)
2365
+ logger.info(f"AI応答を追加: '{response[:50]}...' (ID: {assistant_message_id})")
2366
 
2367
+ # 5. シーン変更フラグがあればリセット
2368
+ if st.session_state.get('scene_change_flag', False):
2369
+ del st.session_state['scene_change_flag']
2370
+
2371
+ # 6. 応答完了状態に戻す(必ず実行)
2372
+ st.session_state.awaiting_response = False
2373
+ st.session_state.latest_prompt = ""
2374
+ st.session_state.response_start_time = None
2375
+
2376
+ # rerun回数をリセット
2377
+ st.session_state.rerun_count = 0
2378
+
2379
+ # ゲームデータを保存
2380
+ try:
2381
+ save_game_data_to_file(managers)
2382
+ except Exception as e:
2383
+ logger.error(f"ゲームデータ保存でエラーが発生: {e}")
2384
+
2385
+ # 応答完了フラグを設定(一度だけ再描画するため)
2386
+ st.session_state.response_completed = True
2387
+
2388
+ # 応答完了後に強制的にチャット履歴を表示
2389
+ logger.info("🎯 応答完了後の強制チャット履歴表示開始")
2390
+
2391
+ except Exception as e:
2392
+ # 応答処理全体でエラーが発生した場合の緊急処理
2393
+ logger.error(f"応答処理全体でエラーが発生: {e}")
2394
+ import traceback
2395
+ logger.error(f"応答処理エラーの詳細: {traceback.format_exc()}")
2396
+
2397
+ # 必ず awaiting_response をリセット
2398
  st.session_state.awaiting_response = False
2399
  st.session_state.latest_prompt = ""
2400
+ st.session_state.response_start_time = None
2401
 
2402
+ # エラーメッセージを表示
2403
+ st.error("応答処理中にエラーが発生しました。もう一度お試しください。")
 
 
 
 
 
 
 
 
 
2404
  for message in st.session_state.chat['messages']:
2405
  role = message.get("role", "user")
2406
  content = message.get("content", "")