File size: 1,347 Bytes
0c591a7
 
53fe655
0c591a7
 
 
 
 
 
 
53fe655
07bfcf6
6ab9879
 
0c591a7
 
6ab9879
0c591a7
 
 
 
 
53fe655
 
0c591a7
 
6ab9879
 
 
 
 
0c591a7
 
 
6ab9879
 
0c591a7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from typing import Literal


def should_continue(state) -> Literal["exit", "retry"]:
    """
    Conditional routing function that determines whether to continue
    the self-correcting loop or exit.

    Exit conditions:
    - Error set (LLM providers failed - abort immediately)
    - Analyzer revision skipped (LLM failed but using fallback draft - exit gracefully)
    - Score >= 6 (good quality)
    - Revision count >= 3 (max attempts reached)
    - Status is ESCALATE (critic escalated for human review)

    Continue conditions:
    - No error AND No revision skip AND Score < 6 AND Revisions < 3
    """
    # Abort immediately if error is set (critical failure)
    if state.get("error"):
        return "exit"

    # Exit gracefully if analyzer revision was skipped (using fallback draft)
    if state.get("analyzer_revision_skipped"):
        return "exit"

    # Exit if critic escalated (max iterations reached)
    critique_details = state.get("critique_details", {})
    if critique_details.get("status") == "ESCALATE":
        return "exit"

    current_score = state.get("score", 0)
    revision_count = state.get("revision_count", 0)

    # Exit if quality is good enough or max revisions reached
    if current_score >= 6 or revision_count >= 3:
        return "exit"

    # Continue the loop for improvement
    return "retry"