| 250 | # --------------------------------------------------------------------------- |
| 251 | |
| 252 | def _parse_image_judge_response(response: str) -> tuple[str, int]: |
| 253 | score_match = re.search(r"(?is)\bscore\b[^1-5]*([1-5])\b", response) |
| 254 | reasoning_match = re.search( |
| 255 | r"(?is)(?:\*\*?\s*reasoning\s*\*\*?|reasoning)\s*[:\-]\s*" |
| 256 | r"(.*?)(?=\n\s*(?:\d+\.\s*)?(?:\*\*?\s*score\s*\*\*?|score)\s*[:\-]|\Z)", |
| 257 | response, |
| 258 | ) |
| 259 | |
| 260 | if score_match and reasoning_match: |
| 261 | reasoning = re.sub(r"\s+", " ", reasoning_match.group(1)).strip() |
| 262 | return reasoning, int(score_match.group(1)) |
| 263 | |
| 264 | try: |
| 265 | payload = json.loads(response) |
| 266 | except Exception: |
| 267 | payload = None |
| 268 | |
| 269 | if isinstance(payload, dict): |
| 270 | score = payload.get("Score", payload.get("score")) |
| 271 | reasoning = payload.get("Reasoning", payload.get("reasoning")) |
| 272 | if ( |
| 273 | isinstance(score, int) |
| 274 | and 1 <= score <= 5 |
| 275 | and isinstance(reasoning, str) |
| 276 | and reasoning.strip() |
| 277 | ): |
| 278 | return re.sub(r"\s+", " ", reasoning).strip(), score |
| 279 | |
| 280 | raise ValueError("Could not parse image judge response") |
| 281 | |
| 282 | |
| 283 | def _parse_final_verdict(response: str) -> int | None: |