Files
our-claude-skills/custom-skills/02-ourdigital-designer/code/scripts/mood_calibrator.py
Andrew Yim b69e4b6f3a refactor: Reorganize skill numbering and update documentation
Skill Numbering Changes:
- 01-03: OurDigital core (was 30-32)
- 31-32: Notion tools (was 01-02)
- 99_archive: Renamed from _archive for sorting

New Files:
- AGENTS.md: Claude Code agent routing guide
- requirements.txt for 00-claude-code-setting, 32-notion-writer, 43-jamie-youtube-manager

Documentation Updates:
- CLAUDE.md: Updated skill inventory (23 skills)
- AUDIT_REPORT.md: Current completion status (91%)
- Archived REFACTORING_PLAN.md (most tasks complete)

Removed:
- ga-agent-skills/ (moved to separate repo ~/Project/dintel-ga4-agent)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 18:42:39 +07:00

251 lines
8.5 KiB
Python

#!/usr/bin/env python3
"""
OurDigital Mood Calibrator
Fine-tune emotional and stylistic parameters for visual prompts
"""
import json
from typing import Dict, Any
import argparse
class MoodCalibrator:
def __init__(self):
self.presets = {
"default": {
"contemplative_depth": 0.8,
"cultural_fusion": 0.6,
"technical_precision": 0.7,
"emotional_weight": 0.5,
"innovation_index": 0.7
},
"philosophical_essay": {
"contemplative_depth": 0.95,
"cultural_fusion": 0.7,
"technical_precision": 0.6,
"emotional_weight": 0.3,
"innovation_index": 0.8
},
"technical_analysis": {
"contemplative_depth": 0.6,
"cultural_fusion": 0.4,
"technical_precision": 0.9,
"emotional_weight": 0.3,
"innovation_index": 0.6
},
"social_commentary": {
"contemplative_depth": 0.7,
"cultural_fusion": 0.6,
"technical_precision": 0.5,
"emotional_weight": 0.7,
"innovation_index": 0.7
},
"cultural_exploration": {
"contemplative_depth": 0.8,
"cultural_fusion": 0.9,
"technical_precision": 0.4,
"emotional_weight": 0.6,
"innovation_index": 0.8
}
}
self.parameter_descriptions = {
"contemplative_depth": "Level of abstraction (0=literal, 1=highly abstract)",
"cultural_fusion": "Balance of Korean-Western aesthetics (0=Western only, 1=Korean dominant)",
"technical_precision": "Clean geometric vs organic forms (0=organic, 1=geometric)",
"emotional_weight": "Mood intensity (0=neutral, 1=heavy atmosphere)",
"innovation_index": "Traditional vs experimental approach (0=traditional, 1=experimental)"
}
def calibrate(self, preset: str = "default", **overrides) -> Dict[str, float]:
"""
Get calibrated mood parameters
Args:
preset: Base preset to use
**overrides: Specific parameter overrides
Returns:
Dictionary of calibrated parameters
"""
params = self.presets.get(preset, self.presets["default"]).copy()
# Apply overrides
for key, value in overrides.items():
if key in params:
params[key] = max(0, min(1, value)) # Clamp to 0-1
return params
def generate_modifier_text(self, params: Dict[str, float]) -> str:
"""
Generate text modifiers based on parameters
Args:
params: Dictionary of mood parameters
Returns:
Text description for prompt modification
"""
modifiers = []
# Contemplative depth
if params["contemplative_depth"] > 0.8:
modifiers.append("highly abstract and philosophical")
elif params["contemplative_depth"] > 0.6:
modifiers.append("semi-abstract with symbolic elements")
else:
modifiers.append("grounded with recognizable forms")
# Cultural fusion
if params["cultural_fusion"] > 0.7:
modifiers.append("strong Korean aesthetic influence")
elif params["cultural_fusion"] > 0.4:
modifiers.append("balanced East-West aesthetic fusion")
else:
modifiers.append("Western minimalist approach")
# Technical precision
if params["technical_precision"] > 0.7:
modifiers.append("precise geometric construction")
elif params["technical_precision"] > 0.4:
modifiers.append("blend of geometric and organic")
else:
modifiers.append("flowing organic forms")
# Emotional weight
if params["emotional_weight"] > 0.7:
modifiers.append("heavy, contemplative atmosphere")
elif params["emotional_weight"] > 0.4:
modifiers.append("balanced emotional tone")
else:
modifiers.append("light, open feeling")
# Innovation index
if params["innovation_index"] > 0.7:
modifiers.append("experimental and avant-garde")
elif params["innovation_index"] > 0.4:
modifiers.append("contemporary with classic elements")
else:
modifiers.append("timeless and traditional")
return ", ".join(modifiers)
def suggest_color_temperature(self, params: Dict[str, float]) -> str:
"""
Suggest color temperature based on parameters
Args:
params: Dictionary of mood parameters
Returns:
Color temperature suggestion
"""
emotional = params.get("emotional_weight", 0.5)
technical = params.get("technical_precision", 0.7)
if emotional > 0.6:
if technical > 0.6:
return "Cool palette with strategic warm accents"
else:
return "Warm, earthy tones with depth"
else:
if technical > 0.6:
return "Neutral grays with single accent color"
else:
return "Soft, desaturated natural colors"
def export_for_prompt(self, params: Dict[str, float]) -> Dict[str, Any]:
"""
Export parameters in a format ready for prompt generation
Args:
params: Dictionary of mood parameters
Returns:
Formatted export for prompt generation
"""
return {
"parameters": params,
"modifiers": self.generate_modifier_text(params),
"color_temperature": self.suggest_color_temperature(params),
"abstraction_level": params["contemplative_depth"],
"cultural_balance": params["cultural_fusion"]
}
def main():
parser = argparse.ArgumentParser(
description="Calibrate mood parameters for OurDigital visual prompts"
)
parser.add_argument(
"--preset",
choices=["default", "philosophical_essay", "technical_analysis",
"social_commentary", "cultural_exploration"],
default="default",
help="Base preset to use"
)
parser.add_argument(
"--contemplative-depth",
type=float,
help="Override contemplative depth (0-1)"
)
parser.add_argument(
"--cultural-fusion",
type=float,
help="Override cultural fusion (0-1)"
)
parser.add_argument(
"--technical-precision",
type=float,
help="Override technical precision (0-1)"
)
parser.add_argument(
"--emotional-weight",
type=float,
help="Override emotional weight (0-1)"
)
parser.add_argument(
"--innovation-index",
type=float,
help="Override innovation index (0-1)"
)
parser.add_argument(
"--export",
action="store_true",
help="Export full configuration for prompt generation"
)
args = parser.parse_args()
calibrator = MoodCalibrator()
# Build overrides
overrides = {}
if args.contemplative_depth is not None:
overrides["contemplative_depth"] = args.contemplative_depth
if args.cultural_fusion is not None:
overrides["cultural_fusion"] = args.cultural_fusion
if args.technical_precision is not None:
overrides["technical_precision"] = args.technical_precision
if args.emotional_weight is not None:
overrides["emotional_weight"] = args.emotional_weight
if args.innovation_index is not None:
overrides["innovation_index"] = args.innovation_index
# Calibrate
params = calibrator.calibrate(args.preset, **overrides)
if args.export:
export = calibrator.export_for_prompt(params)
print(json.dumps(export, indent=2, ensure_ascii=False))
else:
print(f"Calibrated Parameters for '{args.preset}':")
print("-" * 50)
for key, value in params.items():
desc = calibrator.parameter_descriptions[key]
print(f"{key}: {value:.2f} - {desc}")
print("-" * 50)
print(f"Modifiers: {calibrator.generate_modifier_text(params)}")
print(f"Color Temperature: {calibrator.suggest_color_temperature(params)}")
if __name__ == "__main__":
main()