aboutsummaryrefslogtreecommitdiff
path: root/test_moderator.py
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-09-17 20:08:02 -0700
committerFuwn <[email protected]>2025-09-17 20:08:02 -0700
commitaca798820bcd61aa6a155940ee4fd94b54f2ed62 (patch)
tree43944eb92ec66cf239966ba4a003d6d6f37758db /test_moderator.py
parentfeat(test_moderator): Add result stepping feature (diff)
downloadumabot-aca798820bcd61aa6a155940ee4fd94b54f2ed62.tar.xz
umabot-aca798820bcd61aa6a155940ee4fd94b54f2ed62.zip
feat(intelligent_moderator): Reasoning levels
Diffstat (limited to 'test_moderator.py')
-rwxr-xr-xtest_moderator.py88
1 files changed, 82 insertions, 6 deletions
diff --git a/test_moderator.py b/test_moderator.py
index 0725642..70b57f2 100755
--- a/test_moderator.py
+++ b/test_moderator.py
@@ -175,9 +175,10 @@ class RedditDownloader:
class TestIntelligentModerator(IntelligentModeratorBase):
"""Test version of the intelligent roleplay moderator."""
- def __init__(self, openai_api_key: str):
+ def __init__(self, openai_api_key: str, reasoning_level: int = 2):
"""Initialize the test moderator."""
super().__init__(openai_api_key)
+ self.reasoning_level = reasoning_level
def test_file(self, file_path: Path, author_name: str = "testuser") -> Dict[str, Any]:
"""Test a single file against the moderator."""
@@ -249,6 +250,53 @@ class TestIntelligentModerator(IntelligentModeratorBase):
return results
+ def _format_reasoning(self, evaluation: dict) -> str:
+ """Format reasoning based on the configured reasoning level."""
+ original_reasoning = evaluation.get('reasoning', '')
+
+ if self.reasoning_level == 0:
+ # No reasoning included
+ return ""
+ elif self.reasoning_level == 1:
+ # Brief reasoning - extract key points
+ return self._extract_brief_reasoning(original_reasoning)
+ else:
+ # Full reasoning (default)
+ return original_reasoning
+
+ def _extract_brief_reasoning(self, reasoning: str) -> str:
+ """Extract brief key points from the full reasoning."""
+ # Convert to lowercase for easier processing
+ reasoning_lower = reasoning.lower()
+
+ # Extract key issues
+ issues = []
+
+ # Check for common low-effort indicators
+ if any(word in reasoning_lower for word in ['short', 'brief', 'minimal', 'little']):
+ issues.append('short')
+ if any(word in reasoning_lower for word in ['word count', 'words', 'length']):
+ issues.append('low word count')
+ if any(word in reasoning_lower for word in ['plot', 'story', 'narrative']):
+ if 'no plot' in reasoning_lower or 'lack' in reasoning_lower:
+ issues.append('no plot development')
+ if any(word in reasoning_lower for word in ['effort', 'substance', 'content']):
+ if 'low' in reasoning_lower or 'lack' in reasoning_lower:
+ issues.append('low effort')
+ if any(word in reasoning_lower for word in ['creativity', 'originality']):
+ if 'lack' in reasoning_lower or 'no' in reasoning_lower:
+ issues.append('lacks creativity')
+ if any(word in reasoning_lower for word in ['artwork', 'art', 'visual', 'image']):
+ if 'primarily' in reasoning_lower or 'showcasing' in reasoning_lower:
+ issues.append('artwork showcase')
+
+ # If no specific issues found, return a generic brief message
+ if not issues:
+ return "Content quality below standards"
+
+ # Return comma-separated list of issues
+ return ", ".join(issues)
+
# Abstract method implementations for IntelligentModeratorBase
def _get_submission_id(self, submission: MockSubmission) -> str:
"""Get the submission ID."""
@@ -291,7 +339,7 @@ class TestIntelligentModerator(IntelligentModeratorBase):
print(f"ERROR: {message}")
-def print_results(results: List[Dict[str, Any]], pause: bool = False) -> None:
+def print_results(results: List[Dict[str, Any]], pause: bool = False, moderator: TestIntelligentModerator = None) -> None:
"""Print test results in a formatted way."""
print("\n" + "="*80)
print("TEST RESULTS")
@@ -335,13 +383,27 @@ def print_results(results: List[Dict[str, Any]], pause: bool = False) -> None:
print(f"\nšŸ“§ Mod Mail (Art Flair Change):")
print(f" Subject: Your post flair has been changed to Art")
print(f" Message: Your roleplay post has been automatically re-flaired as 'Art' because it appears to be primarily showcasing artwork or visual content rather than roleplay.")
- print(f" Reasoning: {evaluation['reasoning']}")
+
+ # Format reasoning based on moderator's reasoning level
+ if moderator:
+ formatted_reasoning = moderator._format_reasoning(evaluation)
+ if formatted_reasoning:
+ print(f" Reasoning: {formatted_reasoning}")
+ else:
+ print(f" Reasoning: {evaluation['reasoning']}")
if "REMOVE_POST" in actions:
print(f"\nšŸ“§ Mod Mail (Low Effort Removal):")
print(f" Subject: Your roleplay post has been removed for low effort")
print(f" Message: Your roleplay post has been removed because it was determined to be low effort content.")
- print(f" Reasoning: {evaluation['reasoning']}")
+
+ # Format reasoning based on moderator's reasoning level
+ if moderator:
+ formatted_reasoning = moderator._format_reasoning(evaluation)
+ if formatted_reasoning:
+ print(f" Reasoning: {formatted_reasoning}")
+ else:
+ print(f" Reasoning: {evaluation['reasoning']}")
# Add pause between results if requested
if pause and i < len(results):
@@ -370,6 +432,12 @@ Examples:
# Test with pause between results
python test_moderator.py --directory real_test_posts/ --random 3 --pause
+ # Test with brief reasoning in mod mail
+ python test_moderator.py --directory real_test_posts/ --random 2 --reasoning-level 1
+
+ # Test with no reasoning in mod mail
+ python test_moderator.py --file sample_post.txt --reasoning-level 0
+
# Download 20 roleplay posts from Reddit
python test_moderator.py --download-roleplay 20
@@ -424,6 +492,14 @@ Examples:
)
parser.add_argument(
+ "--reasoning-level", "-rl",
+ type=int,
+ choices=[0, 1, 2],
+ default=2,
+ help="Reasoning level for mod mail (0=none, 1=brief, 2=full, default: 2)"
+ )
+
+ parser.add_argument(
"--download-roleplay",
type=int,
metavar="COUNT",
@@ -485,7 +561,7 @@ Examples:
# Initialize moderator
try:
- moderator = TestIntelligentModerator(api_key)
+ moderator = TestIntelligentModerator(api_key, reasoning_level=args.reasoning_level)
except Exception as e:
print(f"āŒ Error initializing moderator: {e}")
sys.exit(1)
@@ -504,7 +580,7 @@ Examples:
results.extend(dir_results)
# Print results
- print_results(results, pause=args.pause)
+ print_results(results, pause=args.pause, moderator=moderator)
# Summary
total = len(results)