Coverage for integrations / agent_engine / api_content_gen.py: 97.1%

68 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-12 04:49 +0000

1""" 

2Content Generation Task API Blueprint 

3 

4GET /api/social/content-gen/games — All games with content gen tasks 

5GET /api/social/content-gen/games/<game_id> — Single game progress + 24h delta 

6GET /api/social/content-gen/stuck — Games with stalled content gen 

7POST /api/social/content-gen/retry — Retry stuck task(s) 

8GET /api/social/content-gen/services — Media service health 

9POST /api/social/content-gen/register — Register a game for content gen tracking 

10""" 

11import logging 

12 

13from flask import Blueprint, jsonify, request 

14 

15logger = logging.getLogger('hevolve_social') 

16 

17content_gen_bp = Blueprint('content_gen', __name__) 

18 

19 

20@content_gen_bp.route('/api/social/content-gen/games', methods=['GET']) 

21def list_games(): 

22 """All games with content gen task breakdown.""" 

23 from integrations.social.models import db_session 

24 from .content_gen_tracker import ContentGenTracker 

25 

26 try: 

27 with db_session(commit=False) as db: 

28 games = ContentGenTracker.get_all_game_tasks(db) 

29 return jsonify({'success': True, 'data': games}), 200 

30 except Exception as e: 

31 logger.error(f"Content gen list error: {e}") 

32 return jsonify({'success': False, 'error': str(e)}), 500 

33 

34 

35@content_gen_bp.route('/api/social/content-gen/games/<game_id>', methods=['GET']) 

36def get_game(game_id): 

37 """Single game progress with per-task breakdown and 24h delta.""" 

38 from integrations.social.models import db_session 

39 from .content_gen_tracker import ContentGenTracker 

40 

41 try: 

42 with db_session(commit=False) as db: 

43 progress = ContentGenTracker.get_game_progress(db, game_id) 

44 if not progress: 

45 return jsonify({ 

46 'success': False, 

47 'error': f'No content generation found for game {game_id}', 

48 }), 404 

49 return jsonify({'success': True, 'data': progress}), 200 

50 except Exception as e: 

51 logger.error(f"Content gen game error: {e}") 

52 return jsonify({'success': False, 'error': str(e)}), 500 

53 

54 

55@content_gen_bp.route('/api/social/content-gen/stuck', methods=['GET']) 

56def get_stuck(): 

57 """Games where content gen has stalled (0% delta for 24h+).""" 

58 from integrations.social.models import db_session 

59 from .content_gen_tracker import ContentGenTracker 

60 

61 threshold = request.args.get('threshold_hours', 24, type=int) 

62 

63 try: 

64 with db_session(commit=False) as db: 

65 stuck = ContentGenTracker.get_stuck_games(db, stall_threshold_hours=threshold) 

66 return jsonify({'success': True, 'data': stuck}), 200 

67 except Exception as e: 

68 logger.error(f"Content gen stuck error: {e}") 

69 return jsonify({'success': False, 'error': str(e)}), 500 

70 

71 

72@content_gen_bp.route('/api/social/content-gen/retry', methods=['POST']) 

73def retry_task(): 

74 """Retry stuck content gen task(s) for a game. 

75 

76 Body: {game_id: str, task_type?: str} 

77 If task_type omitted, retries all stuck tasks. 

78 """ 

79 from integrations.social.models import db_session 

80 from .content_gen_tracker import ContentGenTracker 

81 

82 body = request.get_json(silent=True) or {} 

83 game_id = body.get('game_id') 

84 if not game_id: 

85 return jsonify({'success': False, 'error': 'game_id required'}), 400 

86 

87 task_type = body.get('task_type') 

88 

89 try: 

90 with db_session() as db: 

91 if task_type: 

92 ContentGenTracker.update_task_job( 

93 db, game_id, task_type, 

94 status='retrying', error=None) 

95 result = { 

96 'action_taken': f'retry_{task_type}', 

97 'success': True, 

98 'detail': f'Retrying {task_type} for game {game_id}', 

99 } 

100 else: 

101 result = ContentGenTracker.attempt_unblock(db, game_id) 

102 return jsonify({'success': True, 'data': result}), 200 

103 except Exception as e: 

104 logger.error(f"Content gen retry error: {e}") 

105 return jsonify({'success': False, 'error': str(e)}), 500 

106 

107 

108@content_gen_bp.route('/api/social/content-gen/services', methods=['GET']) 

109def services_health(): 

110 """Health of all media generation services.""" 

111 from .content_gen_tracker import ContentGenTracker 

112 

113 try: 

114 health = ContentGenTracker.get_services_health() 

115 return jsonify({ 

116 'success': True, 

117 'data': { 

118 'services': {name: 'running' if ok else 'offline' 

119 for name, ok in health.items()}, 

120 'all_healthy': all(health.values()), 

121 }, 

122 }), 200 

123 except Exception as e: 

124 logger.error(f"Content gen services error: {e}") 

125 return jsonify({'success': False, 'error': str(e)}), 500 

126 

127 

128@content_gen_bp.route('/api/social/content-gen/register', methods=['POST']) 

129def register_game(): 

130 """Register a game for content generation tracking. 

131 

132 Body: {game_id: str, game_config: dict} 

133 Creates an AgentGoal with goal_type='content_gen' if one doesn't exist. 

134 """ 

135 from integrations.social.models import db_session 

136 from .content_gen_tracker import ContentGenTracker 

137 

138 body = request.get_json(silent=True) or {} 

139 game_id = body.get('game_id') 

140 game_config = body.get('game_config', {}) 

141 

142 if not game_id: 

143 return jsonify({'success': False, 'error': 'game_id required'}), 400 

144 

145 try: 

146 with db_session() as db: 

147 goal = ContentGenTracker.get_or_create_game_goal(db, game_id, game_config) 

148 if goal: 

149 return jsonify({'success': True, 'data': goal}), 200 

150 return jsonify({'success': False, 'error': 'Failed to create goal'}), 500 

151 except Exception as e: 

152 logger.error(f"Content gen register error: {e}") 

153 return jsonify({'success': False, 'error': str(e)}), 500