Spaces:
Runtime error
Runtime error
Upload main_app.py
Browse files- 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 |
-
|
|
|
|
| 2308 |
|
| 2309 |
-
|
| 2310 |
-
|
| 2311 |
-
|
| 2312 |
-
|
| 2313 |
-
|
| 2314 |
-
|
| 2315 |
-
|
| 2316 |
-
|
| 2317 |
-
|
| 2318 |
-
|
| 2319 |
-
|
| 2320 |
-
|
| 2321 |
-
|
| 2322 |
-
|
| 2323 |
-
|
| 2324 |
-
|
| 2325 |
-
|
| 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 |
-
|
| 2343 |
-
|
| 2344 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2345 |
|
| 2346 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2347 |
st.session_state.awaiting_response = False
|
| 2348 |
st.session_state.latest_prompt = ""
|
|
|
|
| 2349 |
|
| 2350 |
-
#
|
| 2351 |
-
st.
|
| 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", "")
|