Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -42,7 +42,6 @@ from difflib import SequenceMatcher
|
|
42 |
import httpx
|
43 |
import langdetect
|
44 |
from langdetect import detect
|
45 |
-
import gradio as gr
|
46 |
import threading
|
47 |
|
48 |
# Configure advanced logging
|
@@ -2808,291 +2807,7 @@ Response:
|
|
2808 |
error_msg = "β AI Assistant encountered an error. Please try again or type 'main' to return to main menu."
|
2809 |
send_whatsjet_message(from_number, error_msg)
|
2810 |
|
2811 |
-
# ============================================================================
|
2812 |
-
# GRADIO INTERFACE FUNCTIONS
|
2813 |
-
# ============================================================================
|
2814 |
-
|
2815 |
-
# Global variables for Gradio
|
2816 |
-
bot_status = "Running" # Bot is running since it's integrated
|
2817 |
-
bot_thread = None
|
2818 |
-
|
2819 |
-
def get_bot_status():
|
2820 |
-
"""Get the current status of the bot"""
|
2821 |
-
global bot_status
|
2822 |
-
try:
|
2823 |
-
# Try to connect to the bot's health endpoint
|
2824 |
-
response = requests.get("http://localhost:7860/health", timeout=5)
|
2825 |
-
if response.status_code == 200:
|
2826 |
-
data = response.json()
|
2827 |
-
if data.get("status") == "healthy":
|
2828 |
-
bot_status = "Running"
|
2829 |
-
return "π’ Running", data
|
2830 |
-
else:
|
2831 |
-
bot_status = "Error"
|
2832 |
-
return "π΄ Error", data
|
2833 |
-
else:
|
2834 |
-
bot_status = "Error"
|
2835 |
-
return "π΄ Error", {"error": f"HTTP {response.status_code}"}
|
2836 |
-
except Exception as e:
|
2837 |
-
bot_status = "Stopped"
|
2838 |
-
return "π΄ Stopped", {"error": str(e)}
|
2839 |
-
|
2840 |
-
def start_bot():
|
2841 |
-
"""Start the WhatsApp bot (for Gradio interface)"""
|
2842 |
-
global bot_status
|
2843 |
-
|
2844 |
-
if bot_status == "Running":
|
2845 |
-
return "Bot is already running!", "π’ Running", "Bot is already active"
|
2846 |
-
|
2847 |
-
try:
|
2848 |
-
bot_status = "Running"
|
2849 |
-
return "β
Bot started successfully!", "π’ Running", "Bot is now running on port 7860"
|
2850 |
-
except Exception as e:
|
2851 |
-
return f"β Error starting bot: {str(e)}", "π΄ Stopped", f"Error: {str(e)}"
|
2852 |
-
|
2853 |
-
def stop_bot():
|
2854 |
-
"""Stop the WhatsApp bot (for Gradio interface)"""
|
2855 |
-
global bot_status
|
2856 |
-
|
2857 |
-
try:
|
2858 |
-
bot_status = "Stopped"
|
2859 |
-
return "β
Bot stopped successfully!", "π΄ Stopped", "Bot has been stopped"
|
2860 |
-
except:
|
2861 |
-
bot_status = "Stopped"
|
2862 |
-
return "β
Bot stopped!", "π΄ Stopped", "Bot has been stopped"
|
2863 |
-
|
2864 |
-
def get_health_info():
|
2865 |
-
"""Get detailed health information"""
|
2866 |
-
try:
|
2867 |
-
response = requests.get("http://localhost:7860/health", timeout=5)
|
2868 |
-
if response.status_code == 200:
|
2869 |
-
data = response.json()
|
2870 |
-
return f"""
|
2871 |
-
## π₯ Bot Health Status
|
2872 |
-
|
2873 |
-
**Status**: {data.get('status', 'Unknown')}
|
2874 |
-
**Timestamp**: {data.get('timestamp', 'Unknown')}
|
2875 |
-
**Products Loaded**: {'β
Yes' if data.get('products_loaded') else 'β No'}
|
2876 |
-
**OpenAI Available**: {'β
Yes' if data.get('openai_available') else 'β No'}
|
2877 |
-
**WhatsJet Configured**: {'β
Yes' if data.get('whatsjet_configured') else 'β No'}
|
2878 |
-
|
2879 |
-
**Environment**: Hugging Face Spaces
|
2880 |
-
**Port**: 7860
|
2881 |
-
**Version**: 2.0.0 (Complete Edition)
|
2882 |
-
"""
|
2883 |
-
else:
|
2884 |
-
return "β Unable to get health information"
|
2885 |
-
except Exception as e:
|
2886 |
-
return f"β Error getting health info: {str(e)}"
|
2887 |
-
|
2888 |
-
def get_webhook_info():
|
2889 |
-
"""Get webhook configuration information"""
|
2890 |
-
server_url = os.getenv("SERVER_URL", "Not configured")
|
2891 |
-
whatsjet_url = os.getenv("WHATSJET_API_URL", "Not configured")
|
2892 |
-
vendor_uid = os.getenv("WHATSJET_VENDOR_UID", "Not configured")
|
2893 |
-
|
2894 |
-
return f"""
|
2895 |
-
## π Webhook Configuration
|
2896 |
-
|
2897 |
-
**Server URL**: {server_url}
|
2898 |
-
**WhatsJet API URL**: {whatsjet_url}
|
2899 |
-
**Vendor UID**: {vendor_uid[:10] + '...' if len(vendor_uid) > 10 else vendor_uid}
|
2900 |
-
**Webhook Endpoint**: {server_url}/webhook
|
2901 |
-
|
2902 |
-
## π Setup Instructions
|
2903 |
-
|
2904 |
-
1. **Configure WhatsJet Dashboard**:
|
2905 |
-
- Log into your WhatsJet dashboard
|
2906 |
-
- Go to webhook settings
|
2907 |
-
- Set webhook URL to: `{server_url}/webhook`
|
2908 |
-
- Enable webhook
|
2909 |
-
|
2910 |
-
2. **Test Webhook**:
|
2911 |
-
```bash
|
2912 |
-
curl -X POST {server_url}/webhook \\
|
2913 |
-
-H "Content-Type: application/json" \\
|
2914 |
-
-d '{{"test": "message"}}'
|
2915 |
-
```
|
2916 |
-
|
2917 |
-
3. **Health Check**:
|
2918 |
-
```bash
|
2919 |
-
curl {server_url}/health
|
2920 |
-
```
|
2921 |
-
|
2922 |
-
4. **Voice Test**:
|
2923 |
-
```bash
|
2924 |
-
curl {server_url}/test-voice
|
2925 |
-
```
|
2926 |
-
"""
|
2927 |
-
|
2928 |
-
def get_product_info():
|
2929 |
-
"""Get information about the product database"""
|
2930 |
-
try:
|
2931 |
-
if products_df is not None and not products_df.empty:
|
2932 |
-
categories = products_df['Category'].value_counts().to_dict()
|
2933 |
-
total_products = len(products_df)
|
2934 |
-
|
2935 |
-
category_info = "\n".join([f"- **{cat}**: {count} products" for cat, count in categories.items()])
|
2936 |
-
|
2937 |
-
return f"""
|
2938 |
-
## π¦ Product Database
|
2939 |
-
|
2940 |
-
**Total Products**: {total_products}
|
2941 |
-
|
2942 |
-
**Categories**:
|
2943 |
-
{category_info}
|
2944 |
-
|
2945 |
-
**Sample Products**:
|
2946 |
-
{products_df.head(5)[['Product Name', 'Category']].to_string(index=False)}
|
2947 |
-
"""
|
2948 |
-
else:
|
2949 |
-
return "β No products loaded"
|
2950 |
-
except Exception as e:
|
2951 |
-
return f"β Error reading product database: {str(e)}"
|
2952 |
-
|
2953 |
-
def get_bot_features():
|
2954 |
-
"""Get information about bot features"""
|
2955 |
-
return """
|
2956 |
-
## π― Bot Features (Complete Edition)
|
2957 |
-
|
2958 |
-
### π€ AI & Intelligence
|
2959 |
-
- **GPT-4 Integration** - Advanced AI responses
|
2960 |
-
- **Voice Transcription** - OpenAI Whisper support
|
2961 |
-
- **Language Detection** - Auto-detect English/Urdu
|
2962 |
-
- **Smart Context Management** - Remember user preferences
|
2963 |
-
- **Intelligent Product Matching** - Fuzzy search with veterinary domain knowledge
|
2964 |
-
|
2965 |
-
### π₯ Veterinary Features
|
2966 |
-
- **Product Catalog** - 25+ veterinary products
|
2967 |
-
- **Category Browsing** - Organized by treatment type
|
2968 |
-
- **PDF Generation** - Dynamic catalogs and product sheets
|
2969 |
-
- **Symptom Matching** - Intelligent product recommendations
|
2970 |
-
- **Species-Specific Advice** - Poultry, livestock, pets
|
2971 |
-
|
2972 |
-
### π± WhatsApp Integration
|
2973 |
-
- **Webhook Handling** - Real-time message processing
|
2974 |
-
- **Voice Messages** - Audio transcription and response
|
2975 |
-
- **Menu System** - Context-aware navigation
|
2976 |
-
- **Contact Management** - Inquiries and availability requests
|
2977 |
-
- **Analytics** - User interaction tracking
|
2978 |
-
|
2979 |
-
### π Multilingual Support
|
2980 |
-
- **English** - Primary language
|
2981 |
-
- **Urdu** - Full translation support
|
2982 |
-
- **Auto-Detection** - Language switching
|
2983 |
-
- **Cultural Adaptation** - Localized responses
|
2984 |
-
|
2985 |
-
### π Advanced Features
|
2986 |
-
- **Conversation History** - Persistent user sessions
|
2987 |
-
- **Product Analytics** - Usage tracking
|
2988 |
-
- **Error Handling** - Graceful failure recovery
|
2989 |
-
- **Logging** - Comprehensive activity logs
|
2990 |
-
- **Health Monitoring** - System status checks
|
2991 |
-
"""
|
2992 |
-
|
2993 |
-
# ============================================================================
|
2994 |
-
# GRADIO INTERFACE
|
2995 |
-
# ============================================================================
|
2996 |
-
|
2997 |
-
# Create Gradio interface
|
2998 |
-
with gr.Blocks(title="Apex Biotical Veterinary WhatsApp Bot - Complete Edition", theme=gr.themes.Soft(), app=app) as demo:
|
2999 |
-
gr.Markdown("""
|
3000 |
-
# π₯ Apex Biotical Veterinary WhatsApp Bot - Complete Edition
|
3001 |
-
|
3002 |
-
**The most effective and accurate veterinary chatbot in the market**
|
3003 |
-
|
3004 |
-
*3000+ lines of advanced veterinary AI with comprehensive features*
|
3005 |
-
|
3006 |
-
---
|
3007 |
-
""")
|
3008 |
-
|
3009 |
-
with gr.Row():
|
3010 |
-
with gr.Column(scale=1):
|
3011 |
-
gr.Markdown("### π Bot Control")
|
3012 |
-
|
3013 |
-
status_display = gr.Textbox(
|
3014 |
-
label="Bot Status",
|
3015 |
-
value="π’ Running",
|
3016 |
-
interactive=False
|
3017 |
-
)
|
3018 |
-
|
3019 |
-
with gr.Row():
|
3020 |
-
start_btn = gr.Button("βΆοΈ Start Bot", variant="primary", size="lg")
|
3021 |
-
stop_btn = gr.Button("βΉοΈ Stop Bot", variant="secondary", size="lg")
|
3022 |
-
|
3023 |
-
status_output = gr.Textbox(
|
3024 |
-
label="Status Message",
|
3025 |
-
interactive=False
|
3026 |
-
)
|
3027 |
-
|
3028 |
-
gr.Markdown("### π Quick Actions")
|
3029 |
-
refresh_btn = gr.Button("π Refresh Status", size="lg")
|
3030 |
-
|
3031 |
-
with gr.Column(scale=2):
|
3032 |
-
gr.Markdown("### π System Information")
|
3033 |
-
health_info = gr.Markdown("Click 'Refresh Status' to see bot information")
|
3034 |
-
|
3035 |
-
with gr.Tabs():
|
3036 |
-
with gr.TabItem("π₯ Health Status"):
|
3037 |
-
health_tab = gr.Markdown("Click 'Refresh Status' to see detailed health information")
|
3038 |
-
|
3039 |
-
with gr.TabItem("π Webhook Setup"):
|
3040 |
-
webhook_tab = gr.Markdown("Click 'Refresh Status' to see webhook configuration")
|
3041 |
-
|
3042 |
-
with gr.TabItem("π¦ Products"):
|
3043 |
-
products_tab = gr.Markdown("Click 'Refresh Status' to see product database information")
|
3044 |
-
|
3045 |
-
with gr.TabItem("π― Features"):
|
3046 |
-
features_tab = gr.Markdown(get_bot_features())
|
3047 |
-
|
3048 |
-
gr.Markdown("""
|
3049 |
-
---
|
3050 |
-
|
3051 |
-
## π§ Environment Variables Required
|
3052 |
-
|
3053 |
-
Make sure these are set in your Hugging Face Space secrets:
|
3054 |
-
|
3055 |
-
- `WHATSJET_API_URL` - WhatsJet API endpoint
|
3056 |
-
- `WHATSJET_VENDOR_UID` - Your vendor UID
|
3057 |
-
- `WHATSJET_API_TOKEN` - Your API token
|
3058 |
-
- `OPENAI_API_KEY` - OpenAI API key for AI features
|
3059 |
-
- `SERVER_URL` - Your Hugging Face Space URL
|
3060 |
-
|
3061 |
-
## π Support
|
3062 |
-
|
3063 |
-
- Check logs in your Hugging Face Space dashboard
|
3064 |
-
- Monitor the health endpoint at `/health`
|
3065 |
-
- Test webhook functionality
|
3066 |
-
- Contact support if needed
|
3067 |
-
|
3068 |
-
## π Ready to Deploy!
|
3069 |
-
|
3070 |
-
This is the complete 3000-line veterinary bot with all advanced features!
|
3071 |
-
""")
|
3072 |
-
|
3073 |
-
# Event handlers
|
3074 |
-
start_btn.click(
|
3075 |
-
fn=start_bot,
|
3076 |
-
outputs=[status_output, status_display, health_info]
|
3077 |
-
)
|
3078 |
-
|
3079 |
-
stop_btn.click(
|
3080 |
-
fn=stop_bot,
|
3081 |
-
outputs=[status_output, status_display, health_info]
|
3082 |
-
)
|
3083 |
-
|
3084 |
-
def refresh_all():
|
3085 |
-
status, data = get_bot_status()
|
3086 |
-
health = get_health_info()
|
3087 |
-
webhook = get_webhook_info()
|
3088 |
-
products = get_product_info()
|
3089 |
-
return status, health, webhook, products
|
3090 |
-
|
3091 |
-
refresh_btn.click(
|
3092 |
-
fn=refresh_all,
|
3093 |
-
outputs=[health_tab, health_tab, webhook_tab, products_tab]
|
3094 |
-
)
|
3095 |
-
|
3096 |
if __name__ == "__main__":
|
3097 |
-
# Launch
|
3098 |
-
|
|
|
|
42 |
import httpx
|
43 |
import langdetect
|
44 |
from langdetect import detect
|
|
|
45 |
import threading
|
46 |
|
47 |
# Configure advanced logging
|
|
|
2807 |
error_msg = "β AI Assistant encountered an error. Please try again or type 'main' to return to main menu."
|
2808 |
send_whatsjet_message(from_number, error_msg)
|
2809 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2810 |
if __name__ == "__main__":
|
2811 |
+
# Launch FastAPI app
|
2812 |
+
import uvicorn
|
2813 |
+
uvicorn.run(app, host="0.0.0.0", port=7860)
|