Spaces:
Running
Running
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 |