feat(bulk): SuggestionService.for_selection consensus + POST /api/suggestions/bulk
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -85,3 +85,35 @@ async def dismiss_suggestion(image_id: int):
|
||||
await AllowlistService(session).dismiss(image_id, body["tag_id"])
|
||||
await session.commit()
|
||||
return "", 204
|
||||
|
||||
|
||||
@suggestions_bp.route("/suggestions/bulk", methods=["POST"])
|
||||
async def bulk_suggestions():
|
||||
body = await request.get_json()
|
||||
if not body or "image_ids" not in body:
|
||||
return jsonify({"error": "image_ids required"}), 400
|
||||
raw = body["image_ids"]
|
||||
if not isinstance(raw, list) or not raw:
|
||||
return jsonify({"error": "image_ids must be a non-empty list"}), 400
|
||||
try:
|
||||
ids = [int(x) for x in raw]
|
||||
except (TypeError, ValueError):
|
||||
return jsonify({"error": "image_ids must be integers"}), 400
|
||||
if len(ids) > 200:
|
||||
return jsonify({"error": "selection too large (max 200)"}), 400
|
||||
try:
|
||||
threshold = float(body.get("threshold", 0.8))
|
||||
except (TypeError, ValueError):
|
||||
threshold = 0.8
|
||||
threshold = min(1.0, max(0.0, threshold))
|
||||
async with get_session() as session:
|
||||
suggestions = await SuggestionService(session).for_selection(
|
||||
ids, threshold=threshold
|
||||
)
|
||||
return jsonify(
|
||||
{
|
||||
"suggestions": suggestions,
|
||||
"evaluated": len(ids),
|
||||
"threshold": threshold,
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user