chatbot / intent_detector.py
Sensei13k's picture
Upload 18 files
02acac5 verified
import os
import google.generativeai as genai
# Configure Gemini
API_KEY = os.getenv("GOOGLE_API_KEY")
if not API_KEY:
raise ValueError("Error: Set GOOGLE_API_KEY environment variable before running.")
genai.configure(api_key=API_KEY)
def detect_intent(user_message: str, model: str = "gemini-1.5-flash") -> str:
"""
Detect the intent of a user message using Gemini.
Args:
user_message: The user's input message
model: The Gemini model to use for intent detection
Returns:
One of: "ONBOARD", "SEARCH", "POST"
"""
intent_prompt = f"""
Analyze the following user message and classify it into exactly one of these three intents:
1. ONBOARD - User wants to create/register their professional profile (e.g., "I'm a developer with 5 years experience", "Register me as a data scientist")
2. SEARCH - User wants to find job opportunities (e.g., "Show me React jobs", "Find remote developer positions", "I'm looking for work")
3. POST - User wants to create a job posting/listing (e.g., "I need to hire a developer", "Looking for someone to build a website", "Need a freelancer for my project")
User message: "{user_message}"
Respond with ONLY one word: ONBOARD, SEARCH, or POST
"""
try:
# Initialize the model
gemini_model = genai.GenerativeModel(model)
# Generate response
response = gemini_model.generate_content(intent_prompt)
intent = response.text.strip().upper()
# Validate the response
if intent in ["ONBOARD", "SEARCH", "POST"]:
return intent
else:
# Fallback logic based on keywords if Gemini gives unexpected response
return fallback_intent_detection(user_message)
except Exception as e:
print(f"[Warning] Intent detection API call failed: {e}")
# Use fallback method
return fallback_intent_detection(user_message)
def fallback_intent_detection(user_message: str) -> str:
"""
Fallback intent detection using keyword matching.
Args:
user_message: The user's input message
Returns:
One of: "ONBOARD", "SEARCH", "POST"
"""
message_lower = user_message.lower()
# Keywords for each intent
onboard_keywords = [
"i'm a", "i am a", "my name is", "register", "onboard", "profile",
"my skills are", "experience", "years of experience", "based in",
"located in", "developer with", "engineer with"
]
search_keywords = [
"find", "search", "looking for", "show me", "jobs", "opportunities",
"hiring", "remote", "work", "position", "role", "career", "employment",
"job listings", "openings"
]
post_keywords = [
"need", "hire", "looking to hire", "want to hire", "project",
"freelancer", "contractor", "build", "develop", "create", "budget",
"pay", "client", "business needs"
]
# Count matches for each intent
onboard_score = sum(1 for keyword in onboard_keywords if keyword in message_lower)
search_score = sum(1 for keyword in search_keywords if keyword in message_lower)
post_score = sum(1 for keyword in post_keywords if keyword in message_lower)
# Return the intent with the highest score
if onboard_score > search_score and onboard_score > post_score:
return "ONBOARD"
elif search_score > post_score:
return "SEARCH"
else:
return "POST"
# Test function
def test_intent_detection():
"""Test the intent detection with sample messages."""
test_cases = [
("I'm a Python developer with 5 years of experience", "ONBOARD"),
("Show me remote React jobs", "SEARCH"),
("I need to hire a web developer for my startup", "POST"),
("Looking for machine learning positions", "SEARCH"),
("My name is John and I'm a data scientist", "ONBOARD"),
("Need someone to build a mobile app, budget $5000", "POST")
]
print("Testing intent detection...")
for message, expected in test_cases:
detected = detect_intent(message)
status = "✓" if detected == expected else "✗"
print(f"{status} '{message}' -> {detected} (expected: {expected})")
if __name__ == "__main__":
test_intent_detection()