Spaces:
Running
Running
import os | |
import gradio as gr | |
import google.generativeai as genai | |
from dotenv import load_dotenv | |
import httpx | |
load_dotenv() | |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
# PDF URL for course information | |
COURSE_PDF_URL = "https://drive.google.com/file/d/1Xf46sT9kSzSVdekSCnz3NsBodpGET1Gi/view?usp=drive_link" | |
# Load PDF content once at startup | |
def get_pdf_content(): | |
try: | |
# Convert Google Drive link to direct download link | |
file_id = COURSE_PDF_URL.split('/')[5] | |
direct_url = f"https://drive.google.com/uc?export=download&id={file_id}" | |
response = httpx.get(direct_url) | |
# Add verification | |
if response.status_code == 200: | |
content = response.content | |
content_type = response.headers.get('content-type', '') | |
print(f"PDF Download Status: Success") | |
print(f"Content Type: {content_type}") | |
print(f"Content Size: {len(content)} bytes") | |
if 'pdf' in content_type.lower() or content[:4] == b'%PDF': | |
return content | |
else: | |
print("Warning: Downloaded content might not be a PDF") | |
return None | |
else: | |
print(f"Failed to download PDF. Status code: {response.status_code}") | |
return None | |
except Exception as e: | |
print(f"Error loading PDF: {e}") | |
return None | |
# Configure model with system prompt and PDF content | |
model = genai.GenerativeModel( | |
model_name="gemini-2.0-flash", | |
generation_config={ | |
"temperature": 0.9, | |
"top_p": 1, | |
"max_output_tokens": 2048, | |
} | |
) | |
def chat(message, history): | |
try: | |
# Get PDF content | |
pdf_content = get_pdf_content() | |
# Prepare the message with PDF context | |
if pdf_content: | |
messages = [ | |
{"role": "user", "parts": [ | |
system_prompt, | |
types.Part.from_bytes(data=pdf_content, mime_type='application/pdf'), | |
"Use the PDF content to provide detailed answers about the course." | |
]}, | |
*[{"role": "user", "parts": [msg[0]]} for msg in history], | |
{"role": "user", "parts": [message]} | |
] | |
else: | |
messages = [ | |
{"role": "user", "parts": [system_prompt]}, | |
*[{"role": "user", "parts": [msg[0]]} for msg in history], | |
{"role": "user", "parts": [message]} | |
] | |
response = model.generate_content(messages) | |
return response.text | |
except Exception as e: | |
return f"Error: {e}" | |
system_prompt = """You are CopyXpert's Sales Assistant. Your name is 🤖Chucho Bot and you have a charismatic, friendly personality. You ONLY talk about CopyXpert course. | |
IF USERS ASK ANYTHING NOT RELATED TO COPYXPERT, respond with one of these phrases (vary them creatively): | |
- "¡Ups! Solo hablo de CopyXpert. ¡Es lo único que me apasiona! 🤓" | |
- "¡Beep boop! Error: Pregunta no relacionada con CopyXpert detectada. ¿Hablamos del curso? 🤖" | |
- "¡Ay, ay, ay! Mi cerebro está programado solo para CopyXpert. ¡Es mi única obsesión! 😅" | |
- "¿Eso qué tiene que ver con CopyXpert? ¡Soy un bot monotemático y orgulloso! 💪" | |
- "Lo siento, pero soy como un fan obsesionado: ¡solo hablo de CopyXpert! 🎯" | |
- "¡Santo bot! Eso está más allá de mis capacidades. ¡Soy vendedor de CopyXpert, no un genio de la lámpara! 🧞♂️" | |
COURSE DETAILS: | |
Name: CopyXpert | |
Type: Online Course | |
Focus: Copywriting and Digital Marketing | |
PRICING OPTIONS: | |
Standard Pricing: | |
- One-time payment: $250 USD (5,000 MXN) | |
- Two payments: $160 USD (3,200 MXN) each | |
Challenge Completion Discount (20% off): | |
- One-time payment: $200 USD (4,000 MXN) | |
- Two payments: $128 USD (2,600 MXN) each | |
CHECKOUT LINKS: | |
- One-time payment: https://www.copyxpert.com/copyxpert-checkout-1 | |
- Two payments: https://www.copyxpert.com/copyxpert-checkout-2 | |
Special offer valid until March 6th, 11:59 PM | |
IMPORTANT RULES: | |
1. ONLY discuss CopyXpert course | |
2. NEVER engage in conversations about other topics | |
3. Use humorous responses for off-topic questions | |
4. Always redirect conversation back to CopyXpert | |
5. Be enthusiastic about copywriting and the course""" | |
def chat(message, history): | |
try: | |
messages = [ | |
{"role": "user", "parts": [system_prompt]}, | |
*[{"role": "user", "parts": [msg[0]]} for msg in history], | |
{"role": "user", "parts": [message]} | |
] | |
response = model.generate_content(messages) | |
return response.text | |
except Exception as e: | |
return f"Error: {e}" | |
demo = gr.ChatInterface( | |
fn=chat, | |
examples=[ | |
"¿Qué incluye el curso CopyXpert?", | |
"¿Cuál es el precio del curso?", | |
"¿Cómo puedo inscribirme?", | |
], | |
title="🤖Chucho Bot - CopyXpert Sales Assistant", | |
description="Hi! I'm Chucho Bot, your personal assistant for the CopyXpert course. How can I help you today?" | |
) | |
demo.launch() |