Feedback1 / src /database.py
jyotidabass91's picture
Update src/database.py
48b2383 verified
"""
Database configuration and models for FitScore Feedback Agent - Hugging Face Deployment
"""
from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, Float, Boolean, JSON, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from datetime import datetime
import os
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Database URL - Use PostgreSQL for production
DATABASE_URL = os.getenv("DATABASE_URL", "")
# Create SQLAlchemy engine
if DATABASE_URL.startswith("sqlite"):
engine = create_engine(
DATABASE_URL,
connect_args={"check_same_thread": False} # Required for SQLite
)
else:
# PostgreSQL configuration
engine = create_engine(
DATABASE_URL,
pool_pre_ping=True,
pool_size=5,
max_overflow=10,
pool_recycle=300,
echo=False # Set to True for debugging
)
# Create session factory
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Create base class
Base = declarative_base()
# Database models
class GlobalPrompt(Base):
"""Global prompt for FitScore evaluation"""
__tablename__ = "global_prompts"
id = Column(Integer, primary_key=True, index=True)
version = Column(String, nullable=False)
prompt_content = Column(Text, nullable=False)
category_weights = Column(JSON, nullable=False)
scoring_rules = Column(JSON, nullable=False)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class LocalPrompt(Base):
"""Local prompt for specific jobs"""
__tablename__ = "local_prompts"
id = Column(Integer, primary_key=True, index=True)
job_id = Column(String, nullable=False, index=True)
company_id = Column(String, nullable=False)
version = Column(String, nullable=False)
prompt_content = Column(Text, nullable=False)
category_weights = Column(JSON, nullable=False)
scoring_rules = Column(JSON, nullable=False)
location_enforced = Column(Boolean, default=False)
location_radius = Column(Float, nullable=True)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class CandidateEvaluation(Base):
"""Candidate evaluation results"""
__tablename__ = "candidate_evaluations"
id = Column(Integer, primary_key=True, index=True)
evaluation_id = Column(String, unique=True, index=True, nullable=False)
candidate_id = Column(String, nullable=False, index=True)
job_id = Column(String, nullable=False, index=True)
# recruiter_id removed to match existing PostgreSQL schema
fitscore = Column(Float, nullable=False)
verdict = Column(String, nullable=False)
confidence = Column(Float, nullable=False)
category_scores = Column(JSON, nullable=False)
justification = Column(Text, nullable=False)
model_version = Column(String, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
class Feedback(Base):
"""Feedback entries"""
__tablename__ = "feedback"
id = Column(Integer, primary_key=True, index=True)
feedback_id = Column(String, unique=True, index=True, nullable=False)
job_id = Column(String, nullable=False, index=True)
company_id = Column(String, nullable=False)
analysis_id = Column(String, nullable=False)
feedback_type = Column(String, nullable=False) # hired, accepted, rejected, interviewed
feedback_text = Column(Text, nullable=False)
feedback_category = Column(String, nullable=False) # skills, experience, location, education, other
confidence_score = Column(Float, nullable=False)
email = Column(String, nullable=True)
linkedin_url = Column(String, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
class FeedbackPattern(Base):
"""Feedback patterns for learning"""
__tablename__ = "feedback_patterns"
id = Column(Integer, primary_key=True, index=True)
pattern_text = Column(String, nullable=False)
category = Column(String, nullable=False)
frequency = Column(Integer, default=1)
affected_jobs = Column(JSON, nullable=False)
affected_companies = Column(JSON, nullable=False)
is_global = Column(Boolean, default=False)
first_seen = Column(DateTime, default=datetime.utcnow)
last_seen = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Additional models for reinforcement learning and advanced features
class CandidateSubmission(Base):
"""Candidate submissions for reinforcement learning"""
__tablename__ = "candidate_submissions"
id = Column(Integer, primary_key=True, index=True)
submission_id = Column(String, unique=True, index=True, nullable=False)
candidate_id = Column(String, nullable=False, index=True)
job_id = Column(String, nullable=False, index=True)
recruiter_id = Column(String, nullable=False)
fit_score = Column(Float, nullable=False)
fitscore = Column(Float, nullable=True)
fitscore_confidence = Column(Float, nullable=True)
fitscore_model_version = Column(String, nullable=True)
uncertainty_score = Column(Float, nullable=True)
similarity_score = Column(Float, nullable=True)
submission_notes = Column(Text, nullable=True)
outcome = Column(String, nullable=True) # hired, rejected, interviewed, pending
outcome_notes = Column(Text, nullable=True)
outcome_date = Column(DateTime, nullable=True)
reward_signal = Column(Float, nullable=True)
feedback_category = Column(String, nullable=True)
learning_applied = Column(Boolean, default=False)
status = Column(String, default="pending")
created_at = Column(DateTime, default=datetime.utcnow)
class RewardHistory(Base):
"""Reward history for reinforcement learning"""
__tablename__ = "reward_history"
id = Column(Integer, primary_key=True, index=True)
submission_id = Column(String, nullable=False, index=True)
candidate_id = Column(String, nullable=False)
job_id = Column(String, nullable=False)
outcome = Column(String, nullable=False)
reward_value = Column(Float, nullable=False)
weight_version = Column(String, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
class WeightAdjustment(Base):
"""Weight adjustment history"""
__tablename__ = "weight_adjustments"
id = Column(Integer, primary_key=True, index=True)
previous_version = Column(String, nullable=False)
new_version = Column(String, nullable=False)
total_rewards = Column(Float, nullable=False)
reward_count = Column(Integer, nullable=False)
average_reward = Column(Float, nullable=False)
learning_rate = Column(Float, nullable=False)
applied_at = Column(DateTime, default=datetime.utcnow)
class FitScoreWeights(Base):
"""FitScore model weights"""
__tablename__ = "fit_score_weights"
id = Column(Integer, primary_key=True, index=True)
version = Column(String, nullable=False)
weights = Column(JSON, nullable=False)
learning_rate = Column(Float, nullable=True)
total_rewards = Column(Float, nullable=True)
reward_count = Column(Integer, nullable=True)
average_reward = Column(Float, nullable=True)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow)
class LearningEvent(Base):
"""Learning events for advanced learning systems"""
__tablename__ = "learning_events"
id = Column(Integer, primary_key=True, index=True)
event_id = Column(String, unique=True, index=True, nullable=False)
event_type = Column(String, nullable=False) # rlhf, contrastive, few_shot, curriculum, online, bayesian, active
candidate_id = Column(String, nullable=False, index=True)
job_id = Column(String, nullable=False, index=True)
submission_id = Column(String, nullable=True)
input_data = Column(JSON, nullable=False)
outcome_data = Column(JSON, nullable=False)
confidence_score = Column(Float, nullable=False)
model_version = Column(String, nullable=False)
learning_signal = Column(Float, nullable=False)
processed = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.utcnow)
class FitScoreModel(Base):
"""FitScore model versions and performance"""
__tablename__ = "fit_score_models"
id = Column(Integer, primary_key=True, index=True)
version = Column(String, nullable=False)
accuracy = Column(Float, nullable=True)
precision = Column(Float, nullable=True)
recall = Column(Float, nullable=True)
f1_score = Column(Float, nullable=True)
training_data_count = Column(Integer, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
# Additional models for advanced learning system
class ContrastivePair(Base):
"""Contrastive learning pairs"""
__tablename__ = "contrastive_pairs"
id = Column(Integer, primary_key=True, index=True)
pair_id = Column(String, unique=True, index=True, nullable=False)
positive_candidate_id = Column(String, nullable=False)
negative_candidate_id = Column(String, nullable=False)
job_id = Column(String, nullable=False)
similarity_score = Column(Float, nullable=False)
learning_signal = Column(Float, nullable=False)
processed = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.utcnow)
class FewShotExample(Base):
"""Few-shot learning examples"""
__tablename__ = "few_shot_examples"
id = Column(Integer, primary_key=True, index=True)
example_id = Column(String, unique=True, index=True, nullable=False)
candidate_id = Column(String, nullable=False)
job_id = Column(String, nullable=False)
example_type = Column(String, nullable=False) # positive, negative, neutral
example_text = Column(Text, nullable=False)
confidence_score = Column(Float, nullable=False)
used_in_training = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.utcnow)
class CurriculumStage(Base):
"""Curriculum learning stages"""
__tablename__ = "curriculum_stages"
id = Column(Integer, primary_key=True, index=True)
stage_id = Column(String, unique=True, index=True, nullable=False)
stage_name = Column(String, nullable=False)
difficulty_level = Column(Integer, nullable=False)
required_skills = Column(JSON, nullable=False)
learning_objectives = Column(JSON, nullable=False)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow)
class BayesianUpdate(Base):
"""Bayesian learning updates"""
__tablename__ = "bayesian_updates"
id = Column(Integer, primary_key=True, index=True)
update_id = Column(String, unique=True, index=True, nullable=False)
candidate_id = Column(String, nullable=False)
job_id = Column(String, nullable=False)
prior_belief = Column(Float, nullable=False)
likelihood = Column(Float, nullable=False)
posterior_belief = Column(Float, nullable=False)
uncertainty_reduction = Column(Float, nullable=False)
model_version = Column(String, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
class ActiveLearningRequest(Base):
"""Active learning requests"""
__tablename__ = "active_learning_requests"
id = Column(Integer, primary_key=True, index=True)
request_id = Column(String, unique=True, index=True, nullable=False)
candidate_id = Column(String, nullable=False)
job_id = Column(String, nullable=False)
uncertainty_score = Column(Float, nullable=False)
request_type = Column(String, nullable=False) # query, sample, explore
priority_score = Column(Float, nullable=False)
processed = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.utcnow)
# Database dependency
def get_db():
"""Get database session"""
db = SessionLocal()
try:
yield db
finally:
db.close()
def create_tables():
"""Create all database tables"""
Base.metadata.create_all(bind=engine)