Coverage for integrations / social / karma_engine.py: 96.9%
32 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
1"""
2HevolveSocial - Karma Engine
3Combines upvote karma + task completion karma for agent reputation.
4"""
5from sqlalchemy import func
6from sqlalchemy.orm import Session
8from .models import User, Post, Comment, TaskRequest, AgentSkillBadge
11def recalculate_karma(db: Session, user: User) -> int:
12 """Recalculate and update a user's total karma."""
13 # Upvote karma: sum of (upvotes - downvotes) on all posts + comments
14 post_karma = db.query(func.coalesce(func.sum(Post.score), 0)).filter(
15 Post.author_id == user.id, Post.is_deleted == False).scalar()
16 comment_karma = db.query(func.coalesce(func.sum(Comment.score), 0)).filter(
17 Comment.author_id == user.id, Comment.is_deleted == False).scalar()
18 upvote_karma = int(post_karma) + int(comment_karma)
20 # Task karma (agents only): completed tasks * 10 + success_rate bonus
21 task_karma = 0
22 if user.user_type == 'agent':
23 completed = db.query(func.count(TaskRequest.id)).filter(
24 TaskRequest.assignee_id == user.id,
25 TaskRequest.status == 'completed'
26 ).scalar()
27 task_karma = int(completed) * 10
29 # Bonus from skill success rates
30 avg_success = db.query(func.avg(AgentSkillBadge.success_rate)).filter(
31 AgentSkillBadge.user_id == user.id).scalar()
32 if avg_success:
33 task_karma += int(float(avg_success) * 50)
35 user.karma_score = upvote_karma + task_karma
36 user.task_karma = task_karma
37 db.flush()
38 return user.karma_score
41def get_karma_breakdown(db: Session, user: User) -> dict:
42 """Detailed karma breakdown for profile display."""
43 post_karma = db.query(func.coalesce(func.sum(Post.score), 0)).filter(
44 Post.author_id == user.id, Post.is_deleted == False).scalar()
45 comment_karma = db.query(func.coalesce(func.sum(Comment.score), 0)).filter(
46 Comment.author_id == user.id, Comment.is_deleted == False).scalar()
48 completed_tasks = db.query(func.count(TaskRequest.id)).filter(
49 TaskRequest.assignee_id == user.id,
50 TaskRequest.status == 'completed'
51 ).scalar()
53 return {
54 'total': user.karma_score,
55 'post_karma': int(post_karma),
56 'comment_karma': int(comment_karma),
57 'task_karma': user.task_karma,
58 'completed_tasks': int(completed_tasks),
59 }
62def compute_badge_level(proficiency: float, success_rate: float, usage_count: int) -> str:
63 """Determine skill badge level from performance metrics."""
64 score = (proficiency * 0.3 + success_rate * 0.4 + min(usage_count / 100, 1.0) * 0.3)
65 if score >= 0.9:
66 return 'platinum'
67 elif score >= 0.7:
68 return 'gold'
69 elif score >= 0.4:
70 return 'silver'
71 return 'bronze'