Spaces:
Runtime error
Runtime error
Fix: Refactor demo creation into function for better error handling
Browse files
app.py
CHANGED
|
@@ -921,40 +921,39 @@ IS_SPACES = (
|
|
| 921 |
os.getenv("HF_SPACE_ID") is not None
|
| 922 |
)
|
| 923 |
|
| 924 |
-
#
|
| 925 |
-
#
|
| 926 |
demo = None
|
| 927 |
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
try:
|
| 931 |
-
if IS_SPACES:
|
| 932 |
-
logger.info("Initializing for Hugging Face Spaces...")
|
| 933 |
-
else:
|
| 934 |
-
logger.info("Initializing for local execution...")
|
| 935 |
-
|
| 936 |
-
# Initialize with default args
|
| 937 |
-
parser = argparse.ArgumentParser()
|
| 938 |
-
parser.add_argument('--model', type=str, default='meta-llama/Llama-3.2-3B-Instruct')
|
| 939 |
-
parser.add_argument('--vector-db-dir', default='./chroma_db')
|
| 940 |
-
parser.add_argument('--data-dir', default='./Data Resources')
|
| 941 |
-
parser.add_argument('--max-new-tokens', type=int, default=1024)
|
| 942 |
-
parser.add_argument('--temperature', type=float, default=0.2)
|
| 943 |
-
parser.add_argument('--top-p', type=float, default=0.9)
|
| 944 |
-
parser.add_argument('--repetition-penalty', type=float, default=1.1)
|
| 945 |
-
parser.add_argument('--k', type=int, default=5)
|
| 946 |
-
parser.add_argument('--skip-indexing', action='store_true', default=True)
|
| 947 |
-
parser.add_argument('--verbose', action='store_true', default=False)
|
| 948 |
-
parser.add_argument('--share', action='store_true', default=False)
|
| 949 |
-
parser.add_argument('--server-name', type=str, default='0.0.0.0')
|
| 950 |
-
parser.add_argument('--server-port', type=int, default=7860)
|
| 951 |
-
parser.add_argument('--seed', type=int, default=42)
|
| 952 |
-
|
| 953 |
-
args = parser.parse_args([]) # Empty args
|
| 954 |
-
args.skip_model_loading = IS_SPACES # Skip model loading on Spaces, use Inference API
|
| 955 |
-
|
| 956 |
-
# Create bot - handle initialization errors gracefully
|
| 957 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 958 |
bot = RAGBot(args)
|
| 959 |
|
| 960 |
if bot.vector_retriever is None:
|
|
@@ -966,18 +965,20 @@ try:
|
|
| 966 |
logger.warning("Vector database is empty. The chatbot may not find relevant documents.")
|
| 967 |
logger.warning("This is OK for initial deployment - documents can be indexed later.")
|
| 968 |
|
|
|
|
| 969 |
# Create the demo interface directly at module level (like HF docs example)
|
| 970 |
demo = create_interface(bot, use_inference_api=IS_SPACES)
|
| 971 |
logger.info(f"Demo created successfully: {type(demo)}")
|
|
|
|
|
|
|
| 972 |
except Exception as bot_error:
|
| 973 |
-
logger.error(f"Error initializing
|
| 974 |
import traceback
|
| 975 |
error_trace = traceback.format_exc()
|
| 976 |
logger.error(f"Full traceback: {error_trace}")
|
| 977 |
|
| 978 |
# Create a demo that shows the error but still allows the interface to load
|
| 979 |
-
|
| 980 |
-
with gr.Blocks(title="CGT-LLM-Beta RAG Chatbot") as demo:
|
| 981 |
gr.Markdown(f"""
|
| 982 |
# ⚠️ Initialization Error
|
| 983 |
|
|
@@ -995,31 +996,41 @@ try:
|
|
| 995 |
- Make sure HF_TOKEN is set as a secret
|
| 996 |
- Check the logs tab for detailed error messages
|
| 997 |
|
| 998 |
-
|
|
|
|
|
|
|
|
|
|
| 999 |
""")
|
| 1000 |
-
logger.info(f"Error demo created: {type(
|
| 1001 |
-
|
| 1002 |
-
|
| 1003 |
-
|
| 1004 |
-
|
| 1005 |
-
|
| 1006 |
-
|
| 1007 |
-
|
| 1008 |
-
elif not isinstance(demo, (gr.Blocks, gr.Interface)):
|
| 1009 |
-
logger.error(f"Demo is not a valid Gradio object: {type(demo)}")
|
| 1010 |
-
with gr.Blocks(title="CGT-LLM-Beta RAG Chatbot") as demo:
|
| 1011 |
-
gr.Markdown(f"# Error: Invalid demo type\n\nType: {type(demo)}\n\nPlease check the logs.")
|
| 1012 |
-
else:
|
| 1013 |
-
logger.info(f"Demo created successfully: {type(demo)}")
|
| 1014 |
-
logger.info("Demo validation passed - ready for Spaces")
|
| 1015 |
except Exception as e:
|
| 1016 |
-
logger.error(f"Error
|
| 1017 |
import traceback
|
| 1018 |
-
|
|
|
|
| 1019 |
# Create a fallback error demo so Spaces doesn't show blank
|
| 1020 |
-
with gr.Blocks() as demo:
|
| 1021 |
-
gr.Markdown(f"
|
| 1022 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1023 |
|
| 1024 |
# Final verification - ensure demo exists and is valid
|
| 1025 |
# This is CRITICAL for Spaces - the demo variable MUST exist and be a valid Gradio object
|
|
|
|
| 921 |
os.getenv("HF_SPACE_ID") is not None
|
| 922 |
)
|
| 923 |
|
| 924 |
+
# CRITICAL: Initialize demo variable FIRST before any try/except
|
| 925 |
+
# This ensures it always exists, even if initialization fails
|
| 926 |
demo = None
|
| 927 |
|
| 928 |
+
def _create_demo():
|
| 929 |
+
"""Create the demo - separated into function for better error handling"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 930 |
try:
|
| 931 |
+
logger.info("=" * 80)
|
| 932 |
+
logger.info("Starting demo creation...")
|
| 933 |
+
logger.info(f"IS_SPACES: {IS_SPACES}")
|
| 934 |
+
|
| 935 |
+
# Initialize with default args
|
| 936 |
+
parser = argparse.ArgumentParser()
|
| 937 |
+
parser.add_argument('--model', type=str, default='meta-llama/Llama-3.2-3B-Instruct')
|
| 938 |
+
parser.add_argument('--vector-db-dir', default='./chroma_db')
|
| 939 |
+
parser.add_argument('--data-dir', default='./Data Resources')
|
| 940 |
+
parser.add_argument('--max-new-tokens', type=int, default=1024)
|
| 941 |
+
parser.add_argument('--temperature', type=float, default=0.2)
|
| 942 |
+
parser.add_argument('--top-p', type=float, default=0.9)
|
| 943 |
+
parser.add_argument('--repetition-penalty', type=float, default=1.1)
|
| 944 |
+
parser.add_argument('--k', type=int, default=5)
|
| 945 |
+
parser.add_argument('--skip-indexing', action='store_true', default=True)
|
| 946 |
+
parser.add_argument('--verbose', action='store_true', default=False)
|
| 947 |
+
parser.add_argument('--share', action='store_true', default=False)
|
| 948 |
+
parser.add_argument('--server-name', type=str, default='0.0.0.0')
|
| 949 |
+
parser.add_argument('--server-port', type=int, default=7860)
|
| 950 |
+
parser.add_argument('--seed', type=int, default=42)
|
| 951 |
+
|
| 952 |
+
args = parser.parse_args([]) # Empty args
|
| 953 |
+
args.skip_model_loading = IS_SPACES # Skip model loading on Spaces, use Inference API
|
| 954 |
+
|
| 955 |
+
logger.info("Creating RAGBot...")
|
| 956 |
+
# Create bot - handle initialization errors gracefully
|
| 957 |
bot = RAGBot(args)
|
| 958 |
|
| 959 |
if bot.vector_retriever is None:
|
|
|
|
| 965 |
logger.warning("Vector database is empty. The chatbot may not find relevant documents.")
|
| 966 |
logger.warning("This is OK for initial deployment - documents can be indexed later.")
|
| 967 |
|
| 968 |
+
logger.info("Creating interface...")
|
| 969 |
# Create the demo interface directly at module level (like HF docs example)
|
| 970 |
demo = create_interface(bot, use_inference_api=IS_SPACES)
|
| 971 |
logger.info(f"Demo created successfully: {type(demo)}")
|
| 972 |
+
return demo
|
| 973 |
+
|
| 974 |
except Exception as bot_error:
|
| 975 |
+
logger.error(f"Error initializing: {bot_error}", exc_info=True)
|
| 976 |
import traceback
|
| 977 |
error_trace = traceback.format_exc()
|
| 978 |
logger.error(f"Full traceback: {error_trace}")
|
| 979 |
|
| 980 |
# Create a demo that shows the error but still allows the interface to load
|
| 981 |
+
with gr.Blocks(title="CGT-LLM-Beta RAG Chatbot") as error_demo:
|
|
|
|
| 982 |
gr.Markdown(f"""
|
| 983 |
# ⚠️ Initialization Error
|
| 984 |
|
|
|
|
| 996 |
- Make sure HF_TOKEN is set as a secret
|
| 997 |
- Check the logs tab for detailed error messages
|
| 998 |
|
| 999 |
+
**Error Details:**
|
| 1000 |
+
```
|
| 1001 |
+
{error_trace[:1000]}...
|
| 1002 |
+
```
|
| 1003 |
""")
|
| 1004 |
+
logger.info(f"Error demo created: {type(error_demo)}")
|
| 1005 |
+
return error_demo
|
| 1006 |
+
|
| 1007 |
+
# Create demo at module level (like HF docs example)
|
| 1008 |
+
# This ensures Spaces can always find it when importing the module
|
| 1009 |
+
try:
|
| 1010 |
+
demo = _create_demo()
|
| 1011 |
+
logger.info("Demo creation completed")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1012 |
except Exception as e:
|
| 1013 |
+
logger.error(f"CRITICAL: Error in demo creation wrapper: {e}", exc_info=True)
|
| 1014 |
import traceback
|
| 1015 |
+
error_trace = traceback.format_exc()
|
| 1016 |
+
logger.error(f"Full traceback: {error_trace}")
|
| 1017 |
# Create a fallback error demo so Spaces doesn't show blank
|
| 1018 |
+
with gr.Blocks(title="CGT-LLM-Beta RAG Chatbot") as demo:
|
| 1019 |
+
gr.Markdown(f"""
|
| 1020 |
+
# Error Initializing Chatbot
|
| 1021 |
+
|
| 1022 |
+
A critical error occurred while initializing the chatbot.
|
| 1023 |
+
|
| 1024 |
+
**Error:** {str(e)}
|
| 1025 |
+
|
| 1026 |
+
**Traceback:**
|
| 1027 |
+
```
|
| 1028 |
+
{error_trace[:1500]}...
|
| 1029 |
+
```
|
| 1030 |
+
|
| 1031 |
+
Please check the logs for more details.
|
| 1032 |
+
""")
|
| 1033 |
+
logger.info(f"Fallback error demo created: {type(demo)}")
|
| 1034 |
|
| 1035 |
# Final verification - ensure demo exists and is valid
|
| 1036 |
# This is CRITICAL for Spaces - the demo variable MUST exist and be a valid Gradio object
|