File size: 4,759 Bytes
bf10662
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/bin/bash

# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Cleanup function
cleanup() {
    if [ ! -z "$API_PID" ]; then
        echo -e "\n${YELLOW}Shutting down FastAPI server (PID: $API_PID)...${NC}"
        kill $API_PID 2>/dev/null
        wait $API_PID 2>/dev/null
    fi
    echo -e "${GREEN}✅ Cleanup complete${NC}"
    exit 0
}

# Set trap to cleanup on script exit
trap cleanup SIGINT SIGTERM EXIT

echo "🚀 RAG Pipeline Launcher"
echo "========================"

# Step 1: Check if Python exists
echo -e "\n${YELLOW}Step 1: Checking Python installation...${NC}"
if ! command -v python3 &> /dev/null && ! command -v python &> /dev/null; then
    echo -e "${RED}❌ Python not found. Please install Python first.${NC}"
    exit 1
fi

# Determine Python command
if command -v python3 &> /dev/null; then
    PYTHON_CMD="python3"
else
    PYTHON_CMD="python"
fi

PYTHON_VERSION=$($PYTHON_CMD --version 2>&1)
echo -e "${GREEN}✅ Found: $PYTHON_VERSION${NC}"

# Step 2: Check if requirements.txt exists
if [ ! -f "requirements.txt" ]; then
    echo -e "${RED}❌ requirements.txt not found!${NC}"
    exit 1
fi

# Step 3: Check if pip exists
echo -e "\n${YELLOW}Step 2: Checking pip installation...${NC}"
if ! $PYTHON_CMD -m pip --version &> /dev/null; then
    echo -e "${RED}❌ pip not found. Installing pip...${NC}"
    $PYTHON_CMD -m ensurepip --upgrade
fi

# Step 4: Install requirements
echo -e "\n${YELLOW}Step 3: Installing/updating dependencies from requirements.txt...${NC}"
$PYTHON_CMD -m pip install -q -r requirements.txt
if [ $? -ne 0 ]; then
    echo -e "${RED}❌ Failed to install requirements${NC}"
    exit 1
fi
echo -e "${GREEN}✅ Dependencies installed${NC}"

# Step 5: Check if key libraries are installed
echo -e "\n${YELLOW}Step 4: Verifying key libraries...${NC}"
$PYTHON_CMD -c "import streamlit, fastapi, uvicorn, langchain" 2>/dev/null
if [ $? -ne 0 ]; then
    echo -e "${RED}❌ Key libraries not found. Please check your installation.${NC}"
    exit 1
fi
echo -e "${GREEN}✅ Key libraries found${NC}"

# Step 6: Find API file
echo -e "\n${YELLOW}Step 5: Locating API file...${NC}"
if [ -f "api.py" ]; then
    API_FILE="api.py"
elif [ -f "experimental_files/api.py" ]; then
    API_FILE="experimental_files/api.py"
else
    echo -e "${RED}❌ api.py not found in root or experimental_files directory${NC}"
    exit 1
fi
echo -e "${GREEN}✅ Found API file: $API_FILE${NC}"

# Step 7: Start FastAPI server in background
echo -e "\n${YELLOW}Step 6: Starting FastAPI server...${NC}"
API_PID=""
if [ "$API_FILE" == "api.py" ]; then
    uvicorn api:app --host 0.0.0.0 --port 8000 > /dev/null 2>&1 &
    API_PID=$!
else
    # If api.py is in experimental_files, add to PYTHONPATH and run from there
    export PYTHONPATH="${PWD}/experimental_files:${PYTHONPATH}"
    cd experimental_files
    uvicorn api:app --host 0.0.0.0 --port 8000 > /dev/null 2>&1 &
    API_PID=$!
    cd - > /dev/null
fi
echo -e "${GREEN}✅ FastAPI server started (PID: $API_PID)${NC}"

# Step 8: Check if curl is available for health check
if ! command -v curl &> /dev/null; then
    echo -e "${YELLOW}⚠️  curl not found. Skipping health check.${NC}"
    echo -e "${YELLOW}   Please verify the API is running manually at http://localhost:8000${NC}"
    HEALTH_CHECK_PASSED=true
else
    # Wait for server to be ready and check health
    echo -e "\n${YELLOW}Step 7: Checking API health status...${NC}"
    MAX_RETRIES=30
    RETRY_COUNT=0
    HEALTH_CHECK_PASSED=false

    while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
        sleep 1
        HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/ 2>/dev/null || echo "000")
        
        if [ "$HTTP_CODE" == "200" ]; then
            HEALTH_CHECK_PASSED=true
            break
        fi
        
        RETRY_COUNT=$((RETRY_COUNT + 1))
        echo -n "."
    done

    echo ""

    if [ "$HEALTH_CHECK_PASSED" = true ]; then
        echo -e "${GREEN}✅ API health check passed!${NC}"
        echo -e "${GREEN}   API is running at http://localhost:8000${NC}"
    else
        echo -e "${RED}❌ API health check failed after $MAX_RETRIES seconds${NC}"
        echo -e "${YELLOW}   Attempting to kill background process...${NC}"
        kill $API_PID 2>/dev/null
        exit 1
    fi
fi

# Step 9: Launch Streamlit frontend
echo -e "\n${YELLOW}Step 8: Launching Streamlit frontend...${NC}"
echo -e "${GREEN}✅ Starting Streamlit app (app_api.py)${NC}"
echo -e "${GREEN}   Frontend will be available at http://localhost:8501${NC}"
echo -e "\n${YELLOW}Press Ctrl+C to stop both servers${NC}\n"

# Launch Streamlit (this will block)
# When Streamlit exits, the trap will handle cleanup
streamlit run app_api.py