File size: 6,945 Bytes
62f6391
 
 
 
 
 
 
 
 
 
d57d5a9
62f6391
 
 
 
 
 
 
 
 
 
c598964
 
62f6391
86d1b99
 
 
 
 
 
 
 
 
 
8dbd6f6
 
 
 
 
 
62f6391
 
 
86d1b99
 
 
 
8dbd6f6
 
 
62f6391
c598964
 
 
bfe20a9
62f6391
c598964
af3c3e0
 
 
 
bfe20a9
 
 
62f6391
af0cc08
f95c45e
af0cc08
 
1ffabfe
 
f95c45e
 
1ffabfe
 
f95c45e
 
 
 
 
 
 
 
 
 
 
62f6391
 
 
af0cc08
62f6391
 
af0cc08
 
 
 
 
 
 
 
 
 
 
62f6391
af0cc08
 
 
 
86d1b99
af0cc08
86d1b99
 
62f6391
 
c598964
af3c3e0
 
c598964
bfe20a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c598964
 
 
 
62f6391
c598964
62f6391
 
 
c598964
86d1b99
 
 
 
 
 
 
 
 
 
 
 
62f6391
 
 
f95c45e
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
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
179
180
181
182
"""
Hugging Face Spaces entry point.

This file serves as the main entry point for Hugging Face Spaces deployment.
It imports and exposes the FastAPI app from the ai_med_extract package.
"""

import os
import sys
import logging
import importlib.util

# Configure logging for Hugging Face Spaces
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

# Add the services/ai-service/src directory to the Python path
current_dir = os.path.dirname(os.path.abspath(__file__))
src_dir = os.path.join(current_dir, "services", "ai-service", "src")
if src_dir not in sys.path:
    sys.path.insert(0, src_dir)

# Verify the path is correct
logging.info(f"Added src_dir to Python path: {src_dir}")
logging.info(f"src_dir exists: {os.path.exists(src_dir)}")
if os.path.exists(src_dir):
    logging.info(f"Contents of src_dir: {os.listdir(src_dir)}")
    ai_med_extract_path = os.path.join(src_dir, "ai_med_extract")
    logging.info(f"ai_med_extract_path exists: {os.path.exists(ai_med_extract_path)}")
    if os.path.exists(ai_med_extract_path):
        logging.info(f"Contents of ai_med_extract: {os.listdir(ai_med_extract_path)}")

# Detect and set Hugging Face Spaces environment
# HF Spaces sets SPACE_ID environment variable
if os.getenv("SPACE_ID") or os.getenv("SPACE_AUTHOR_NAME"):
    os.environ.setdefault("HF_SPACES", "true")
    logging.info("Detected Hugging Face Spaces environment")

# Set environment variables for Hugging Face Spaces
os.environ.setdefault("FAST_MODE", "true")
os.environ.setdefault("PRELOAD_SMALL_MODELS", "false")
os.environ.setdefault("PYTORCH_CUDA_ALLOC_CONF", "max_split_size_mb:128")
os.environ.setdefault("TOKENIZERS_PARALLELISM", "false")
os.environ.setdefault("OMP_NUM_THREADS", "1")
os.environ.setdefault("MKL_NUM_THREADS", "1")
# Ensure Redis and Database are disabled on HF Spaces
os.environ.setdefault("REDIS_URL", "")
os.environ.setdefault("DATABASE_URL", "")

# Create a robust app instance with multiple fallback strategies
app = None

# Simplified import strategy with better error handling
try:
    logging.info("Attempting to import from ai_med_extract package...")
    logging.info(f"Python path: {sys.path[:3]}")
    logging.info(f"Current working directory: {os.getcwd()}")
    logging.info(f"Files in current directory: {os.listdir('.')}")
    
    # Direct import approach - simpler and more reliable
    from ai_med_extract.app import create_app, initialize_agents  # type: ignore
    logging.info("Successfully imported create_app and initialize_agents")
    
    # Create the app instance WITHOUT initializing agents yet
    try:
        app = create_app(initialize=False)
        logging.info("App instance created successfully (without agents)")
        logging.info(f"App title: {app.title}")
        logging.info(f"App version: {getattr(app, 'version', 'unknown')}")
    except Exception as e:
        logging.error(f"Failed to create app: {e}")
        import traceback
        logging.error(f"App creation traceback: {traceback.format_exc()}")
        # Create minimal fallback app
        from fastapi import FastAPI
        app = FastAPI(title="Medical AI Service (fallback)")
        
        @app.get("/")
        async def root():
            return {"message": "Medical AI Service - Fallback mode", "error": str(e)}
        
        @app.get("/health")
        async def health():
            return {"status": "degraded", "message": "App creation failed", "error": str(e)}
    
    # Initialize agents with minimal preloading for Hugging Face Spaces
    try:
        logging.info("Initializing agents with preload_small_models=False...")
        initialize_agents(app, preload_small_models=False)
        logging.info("Agents initialized successfully")
        
        # Log all registered routes after initialization
        logging.info("=" * 60)
        logging.info("FINAL REGISTERED ROUTES ON HF SPACES:")
        route_count = 0
        for route in app.routes:
            if hasattr(route, "methods") and hasattr(route, "path"):
                logging.info(f"  {list(route.methods)} {route.path}")
                route_count += 1
        logging.info(f"Total routes registered: {route_count}")
        logging.info("=" * 60)
    except Exception as e:
        logging.error(f"Agent initialization failed: {e}")
        import traceback
        logging.error(f"Agent initialization traceback: {traceback.format_exc()}")
        logging.warning("App will start with basic functionality")
        # Add a basic health endpoint if agents fail
        @app.get("/health/status")
        async def basic_health():
            return {"status": "degraded", "message": "Agents not initialized", "error": str(e)}
        
except Exception as e:
    logging.error(f"Failed to import from ai_med_extract package: {e}")
    import traceback
    logging.error(f"Full traceback: {traceback.format_exc()}")
    
    # Create a minimal FastAPI app as fallback
    logging.info("Creating minimal fallback app...")
    from fastapi import FastAPI
    app = FastAPI(title="Medical AI Service (fallback)")
    
    @app.get("/")
    async def root():
        return {
            "message": "Medical AI Service - Fallback mode", 
            "error": str(e),
            "status": "degraded"
        }
    
    @app.get("/health")
    async def health():
        return {"status": "degraded", "message": "Fallback mode active"}
    
    @app.get("/docs")
    async def docs():
        return {"message": "API documentation not available in fallback mode"}
    
    @app.get("/redoc")
    async def redoc():
        return {"message": "ReDoc not available in fallback mode"}

# Ensure we have an app instance
if app is None:
    logging.error("No app instance created, creating emergency fallback...")
    from fastapi import FastAPI
    app = FastAPI(title="Medical AI Service (emergency fallback)")
    
    @app.get("/")
    async def root():
        return {"message": "Emergency fallback mode", "status": "error"}
    
    @app.get("/health")
    async def health():
        return {"status": "error", "message": "Emergency fallback mode"}
    
    @app.get("/docs")
    async def docs():
        return {"message": "API documentation not available in emergency mode"}
    
    @app.get("/redoc")
    async def redoc():
        return {"message": "ReDoc not available in emergency mode"}

# Export the app for Hugging Face Spaces
__all__ = ["app"]

# Ensure the app is available at module level
if 'app' not in locals():
    logging.error("No app instance created, creating emergency fallback...")
    from fastapi import FastAPI
    app = FastAPI(title="Medical AI Service (emergency fallback)")
    
    @app.get("/")
    async def root():
        return {"message": "Emergency fallback mode", "status": "error"}
    
    @app.get("/health")
    async def health():
        return {"status": "error", "message": "Emergency fallback mode"}