Saral_Ai / saral_ai_api.py
divyesh01's picture
File Uploading
41ea5e0 verified
from flask import Flask, render_template, request, jsonify, session
import re
import os
import json
import traceback
from dotenv import load_dotenv
from openai import AzureOpenAI
# Import your custom modules (make sure these are available)
try:
from nlp_parsed import parse_recruiter_query, prompt_enhancer
from SERP import query_making, serp_api_call
from apify import apify_call
from validate import validate_function, score_candidates
from postgres_db import fetch_from_saral_data, check_completeness, data_input, cur, conn, store_prompt
MODULES_AVAILABLE = True
except ImportError as e:
print(f"Warning: Some modules not available: {e}")
MODULES_AVAILABLE = False
load_dotenv()
app = Flask(__name__)
app.secret_key = os.getenv('SECRET_KEY', 'your-secret-key-here')
# Mock functions for when modules aren't available (for testing)
def mock_parse_recruiter_query(query):
return {
"job_title": "Software Engineer",
"skills": ["Python", "Flask"],
"experience": "3-5",
"location": "Mumbai",
"work_preference": "Remote",
"job_type": "Full-time",
"is_indian": True
}
def mock_prompt_enhancer(prompt):
return f"Enhanced: {prompt} - Looking for skilled professionals"
def mock_query_making(parsed_data):
return "https://linkedin.com/search", ["Mumbai", "Delhi"]
def mock_serp_api_call(query, start=0, results_per_page=10):
return [f"https://linkedin.com/in/user{i}" for i in range(start, start + results_per_page)]
def mock_fetch_from_saral_data(serp_data, conn):
return [], serp_data # Return empty saral_data, all URLs as remaining
def mock_apify_call(serp_json):
mock_profiles = []
for i in range(min(5, len(serp_json))):
mock_profiles.append({
"fullName": f"John Doe {i+1}",
"headline": "Software Engineer with 5+ years experience",
"addressWithCountry": "Mumbai, India",
"email": f"john{i+1}@example.com",
"linkedinUrl": f"https://linkedin.com/in/johndoe{i+1}",
"skills": [{"title": "Python"}, {"title": "Flask"}, {"title": "JavaScript"}],
"about": "Experienced software developer with expertise in web technologies...",
"experiences": [
{
"title": "Senior Software Engineer",
"subtitle": "Tech Company",
"caption": "Jan 2020 - Present",
"description": [{"text": "Developed web applications using Python and Flask"}]
}
],
"profilePic": "https://via.placeholder.com/150",
"is_complete": "Complete Profile"
})
return mock_profiles
def mock_validate_function(location, candidates):
# Split candidates into matched and unmatched (80% matched, 20% unmatched)
split_point = int(len(candidates) * 0.8)
return candidates[:split_point], candidates[split_point:]
def mock_score_candidates(parsed_data, candidates):
for i, candidate in enumerate(candidates):
candidate['score'] = round(85 + (i % 15), 1) # Scores between 85-100
return candidates
def mock_data_input(candidates):
pass
def mock_store_prompt(conn, prompt, parsed_data):
pass
@app.route('/')
def index():
return render_template('index.html')
@app.route('/parse_query', methods=['POST'])
def parse_query():
try:
data = request.json
user_input = data.get('query', '').strip()
if not user_input:
return jsonify({'error': 'Please enter a valid query'})
if MODULES_AVAILABLE:
parsed_data = parse_recruiter_query(user_input)
else:
parsed_data = mock_parse_recruiter_query(user_input)
return jsonify({'success': True, 'parsed_data': parsed_data})
except Exception as e:
return jsonify({'error': f'Error parsing query: {str(e)}'})
@app.route('/enhance_prompt', methods=['POST'])
def enhance_prompt():
try:
data = request.json
user_input = data.get('query', '').strip()
if not user_input:
return jsonify({'error': 'Please enter a valid query'})
if MODULES_AVAILABLE:
enhanced = prompt_enhancer(user_input)
else:
enhanced = mock_prompt_enhancer(user_input)
return jsonify({'success': True, 'enhanced_query': enhanced})
except Exception as e:
return jsonify({'error': f'Error enhancing prompt: {str(e)}'})
@app.route('/search', methods=['POST'])
def search():
try:
data = request.json
user_input = data.get('query', '').strip()
current_page = data.get('page', 0)
if not user_input:
return jsonify({'error': 'Please enter a valid query'})
# Parse query
if MODULES_AVAILABLE:
parsed_data = parse_recruiter_query(user_input)
print(parsed_data)
else:
parsed_data = mock_parse_recruiter_query(user_input)
print(parsed_data)
if "error" in parsed_data:
return jsonify({'error': parsed_data["error"]})
if parsed_data.get("is_indian") == False:
return jsonify({'error': 'Our platform is not allowing search outside of India'})
# Store prompt
if MODULES_AVAILABLE:
store_prompt(conn, user_input, parsed_data)
else:
mock_store_prompt(None, user_input, parsed_data)
# Get query and location
if MODULES_AVAILABLE:
query, location = query_making(parsed_data)
print(query)
else:
query, location = mock_query_making(parsed_data)
print(query)
# Pagination
results_per_page = 10
start = current_page * results_per_page
# Get SERP data
if MODULES_AVAILABLE:
serp_data = serp_api_call(query, start=start, results_per_page=results_per_page)
saral_data, remain_urls = fetch_from_saral_data(serp_data, conn)
else:
serp_data = mock_serp_api_call(query, start=start, results_per_page=results_per_page)
saral_data, remain_urls = mock_fetch_from_saral_data(serp_data, None)
# Process remaining URLs with Apify
apify_json = {}
if len(remain_urls) >= 1:
serp_json = {idx: url for idx, url in enumerate(remain_urls, start=1)}
if MODULES_AVAILABLE:
apify_json = apify_call(serp_json)
else:
apify_json = mock_apify_call(serp_json)
# Combine data
if apify_json:
total_candidates = saral_data + apify_json
else:
total_candidates = saral_data
# Store data
if MODULES_AVAILABLE:
data_input(total_candidates)
else:
mock_data_input(total_candidates)
# Validate and score
if MODULES_AVAILABLE:
matched, unmatched = validate_function(location, total_candidates)
matched = score_candidates(parsed_data, matched)
else:
matched, unmatched = mock_validate_function(location, total_candidates)
matched = mock_score_candidates(parsed_data, matched)
return jsonify({
'success': True,
'parsed_data': parsed_data,
'matched_results': matched,
'unmatched_results': unmatched,
'current_page': current_page
})
except Exception as e:
print(f"Error in search: {traceback.format_exc()}")
return jsonify({'error': f'Search error: {str(e)}'})
# if __name__ == '__main__':
# # Ensure templates directory exists
# if not os.path.exists('templates'):
# os.makedirs('templates')
# app.run(debug=True, host='0.0.0.0', port=5000)