File size: 4,872 Bytes
76c8380
 
 
a54dc6e
76c8380
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a54dc6e
 
 
 
 
76c8380
 
a54dc6e
76c8380
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import yaml
import os
import json
import re  # 正規表現を追加

def load_techniques():
    """テクニック定義を読み込む"""
    try:
        # まずdata/techniques.yamlを探す
        if os.path.exists("data/techniques.yaml"):
            with open("data/techniques.yaml", "r", encoding="utf-8") as f:
                return yaml.safe_load(f)
        
        # フォールバックとして組み込みのテクニック定義を使用
        return {
            "構造化プロンプト": {
                "description": "階層的構造でプロンプトを構築(主題→詳細→スタイル→技術)",
                "effect": "整理され効果的なプロンプトを生成"
            },
            "重み付けシステム": {
                "description": "キーワードに数値的な重みを割り当て (::1.2)",
                "effect": "重要な要素を強調できる"
            },
            "感情マトリックス": {
                "description": "複数の感情表現を階層的に組み込む",
                "effect": "複雑で多層的な感情表現が可能に"
            },
            "マルチペルソナ": {
                "description": "複数の専門家ペルソナがコラボレーション",
                "effect": "複数の専門分野の特性を一つの画像に融合"
            },
            "カメラテクニック": {
                "description": "カメラアングル、レンズ効果、フォーカス設定",
                "effect": "映画/写真のようなプロ品質の表現"
            },
            "照明設定": {
                "description": "プロの撮影ライティング技術を指定",
                "effect": "ムードと雰囲気を大幅に向上"
            },
            "パターン中断": {
                "description": "対照的な概念を融合させる特殊技法",
                "effect": "従来見られない独特な表現が生まれる"
            },
            "論理パラドックス": {
                "description": "矛盾する要素を意図的に組み合わせる",
                "effect": "AIが独創的な表現を生み出す"
            },
            "魔法の単語": {
                "description": "特殊効果をもたらす隠しキーワード",
                "effect": "予測不可能な強化効果"
            },
            "ネスト埋め込み": {
                "description": "プロンプト内に別のプロンプトを埋め込む多層構造",
                "effect": "より緻密で構造化された指示が可能"
            }
        }
    except Exception as e:
        print(f"テクニック定義ロード中にエラー: {e}")
        # 最小限のフォールバック
        return {
            "基本テクニック": {
                "description": "基本的なプロンプト技術",
                "effect": "標準的な効果"
            }
        }

def load_styles():
    """スタイル定義を読み込む"""
    try:
        # まずdata/styles.yamlを探す
        if os.path.exists("data/styles.yaml"):
            with open("data/styles.yaml", "r", encoding="utf-8") as f:
                return yaml.safe_load(f)
        
        # フォールバックとして組み込みのスタイル定義を使用
        return {
            "アート": [
                "oil painting", "watercolor", "digital art", "concept art", 
                "illustration", "anime", "manga", "pixel art", "3D render"
            ],
            "写真": [
                "photorealistic", "portrait photography", "landscape photography", 
                "macro photography", "aerial photography", "night photography"
            ],
            "映画": [
                "cinematic", "film noir", "cyberpunk", "studio ghibli", 
                "disney", "wes anderson", "blade runner"
            ],
            "時代/文化": [
                "medieval", "renaissance", "baroque", "victorian", "art deco", 
                "art nouveau", "vaporwave", "retrofuturism"
            ]
        }
    except Exception as e:
        print(f"スタイル定義ロード中にエラー: {e}")
        # 最小限のフォールバック
        return {
            "基本スタイル": [
                "photorealistic", "digital art", "oil painting", "anime"
            ]
        }

def parse_prompt_result(result):
    """AIからの結果をプロンプトと解説に分ける"""
    # <think>タグとその内容を除去
    cleaned_result = re.sub(r'<think>.*?</think>\s*', '', result, flags=re.DOTALL)
    
    # 解説部分と分ける
    parts = cleaned_result.split("解説:")
    prompt = parts[0].strip()
    explanation = parts[1].strip() if len(parts) > 1 else ""
    
    return prompt, explanation