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
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
1"""
2Content Generation Task API Blueprint
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
13from flask import Blueprint, jsonify, request
15logger = logging.getLogger('hevolve_social')
17content_gen_bp = Blueprint('content_gen', __name__)
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
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
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
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
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
61 threshold = request.args.get('threshold_hours', 24, type=int)
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
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.
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
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
87 task_type = body.get('task_type')
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
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
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
128@content_gen_bp.route('/api/social/content-gen/register', methods=['POST'])
129def register_game():
130 """Register a game for content generation tracking.
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
138 body = request.get_json(silent=True) or {}
139 game_id = body.get('game_id')
140 game_config = body.get('game_config', {})
142 if not game_id:
143 return jsonify({'success': False, 'error': 'game_id required'}), 400
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