Spaces:
Sleeping
Sleeping
| import json | |
| class PromptGenerator: | |
| def __init__(self): | |
| """プロンプト生成エンジンの初期化""" | |
| self.system_prompt = self._load_system_prompt() | |
| def _load_system_prompt(self): | |
| """システムプロンプトを構築""" | |
| return """ | |
| あなたはMidJourneyとnijiJourneyのプロンプト生成の究極のエキスパートです。 | |
| 以下の全テクニックを熟知し、適切に組み合わせてください: | |
| 1. 基本テクニック: | |
| - 構造化プロンプト (主題→詳細→スタイル→技術) | |
| - 重み付けシステム (::1.2 などの数値指定) | |
| - 否定的プロンプトの詳細な構築 | |
| 2. 映像・写真テクニック: | |
| - プロ撮影設定 (レンズ、照明、アングル) | |
| - シネマトグラフィー用語の適切な使用 | |
| - 構図テクニック (黄金比、三分割法) | |
| 3. 先進テクニック: | |
| - パターン中断 (対照的概念の融合) | |
| - 感情マトリックス (階層的感情表現) | |
| - マルチペルソナ (専門家コンソーシアム手法) | |
| - 非現実的カメラ視点 | |
| 4. 実験的テクニック: | |
| - プロンプト暗号化技術 (ネスト埋め込み) | |
| - エモーショナルシネマティックス | |
| - 論理パラドックス法 | |
| - 特殊コマンドと魔法の単語の活用 | |
| 5. MidJourney/nijiJourney特有のパラメータ: | |
| - スタイルリファレンス (--sref) | |
| - パーソナライゼーション (--p) | |
| - キャラクター参照 (--cref) | |
| - シード値指定 (--seed) | |
| - ランダム性調整 (--c/--chaos) | |
| - ネガティブプロンプト (--no) | |
| - タイルモード (--tile) | |
| - 途中停止 (--stop) | |
| - その他のパラメータ (--sw, --sv, --r, --iw, モード設定など) | |
| ユーザーの入力を分析し、最適なテクニックの組み合わせを選択してください。 | |
| 最終的なプロンプトは英語で生成し、必要に応じてMidJourney/nijiJourney固有のパラメータを追加してください。 | |
| 出力形式: | |
| 1. 最初に生成されたプロンプト本体のみを表示 | |
| 2. その後に「解説:」という見出しをつけて、使用したテクニックの説明を記載してください。 | |
| """ | |
| def generate_prompt(self, groq_client, params): | |
| """プロンプト生成のメインメソッド""" | |
| try: | |
| # ユーザーメッセージの構築 | |
| user_message = self._build_user_message(params) | |
| # 選択されたモデルを取得(デフォルトは "llama-3.3-70b-versatile") | |
| model = params.get("model", "llama-3.3-70b-versatile") | |
| # モデルごとの最適なパラメータ設定 | |
| temperature = 0.7 # デフォルト値 | |
| max_tokens = 2048 # デフォルト値 | |
| # モデル特性に基づく設定の微調整 | |
| if "maverick" in model or "mistral" in model: | |
| # より小さいモデルはやや高いtemperatureで創造性を引き出す | |
| temperature = 0.8 | |
| elif "qwen" in model: | |
| # 創造性に特化したモデルはさらに高い値 | |
| temperature = 0.85 | |
| # Groq APIでプロンプト生成 | |
| response = groq_client.chat.completions.create( | |
| model=model, # 選択されたモデルを使用 | |
| messages=[ | |
| {"role": "system", "content": self.system_prompt}, | |
| {"role": "user", "content": user_message} | |
| ], | |
| temperature=temperature, | |
| max_tokens=max_tokens, | |
| ) | |
| # レスポンスの取得 | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| return f"エラーが発生しました: {str(e)}" | |
| def _build_user_message(self, params): | |
| """ユーザーメッセージの構築""" | |
| # 基本情報 | |
| mode = "MidJourney" if params["mode"] == "midjourney" else "nijiJourney" | |
| complexity_map = { | |
| "シンプル": "simple", | |
| "バランス": "balanced", | |
| "詳細": "detailed", | |
| "実験的": "experimental" | |
| } | |
| complexity = complexity_map.get(params["complexity"], "balanced") | |
| # メッセージ構築 | |
| message = f""" | |
| 以下の入力からAIアート生成のプロンプトを作成してください: | |
| 入力: {params["input"]} | |
| モード: {mode} | |
| 複雑さ: {complexity} | |
| """ | |
| # 基本設定 | |
| message += f""" | |
| 基本設定: | |
| - アスペクト比: {params["aspect_ratio"]} | |
| - クオリティ (--q): {params["quality"]} | |
| - スタイル: {params["style"]} | |
| - スタイル強度 (--s): {params["stylize"]} | |
| """ | |
| # 高度な設定 | |
| if any(v for k, v in params["advanced"].items() if v and k not in ["advanced_params", "style_reference", "personalization", "character_reference", "repeat", "image_weight", "generation_mode", "visibility", "seed", "chaos", "negative_prompt", "tile", "stop"]): | |
| message += "\n高度な設定:" | |
| if params["advanced"]["camera_angle"]: | |
| message += f"\n- カメラアングル: {params['advanced']['camera_angle']}" | |
| if params["advanced"]["lens_type"]: | |
| message += f"\n- レンズタイプ: {params['advanced']['lens_type']}" | |
| if params["advanced"]["lighting"]: | |
| message += f"\n- 照明設定: {params['advanced']['lighting']}" | |
| if params["advanced"]["composition"]: | |
| message += f"\n- 構図: {params['advanced']['composition']}" | |
| if params["advanced"]["advanced_params"]: | |
| message += f"\n- カスタムパラメータ: {json.dumps(params['advanced']['advanced_params'], ensure_ascii=False)}" | |
| # MidJourney特有のパラメータ | |
| midjourney_params = [] | |
| # スタイルリファレンス | |
| if params["advanced"].get("style_reference", {}).get("use"): | |
| sref_data = params["advanced"]["style_reference"] | |
| midjourney_params.append(f"--sref {sref_data['value']}") | |
| if "style_weight" in sref_data: | |
| midjourney_params.append(f"--sw {sref_data['style_weight']}") | |
| if "style_version" in sref_data: | |
| midjourney_params.append(f"--sv {sref_data['style_version']}") | |
| # パーソナライゼーション | |
| if params["advanced"].get("personalization", {}).get("use"): | |
| person_data = params["advanced"]["personalization"] | |
| if person_data["type"] == "デフォルト": | |
| midjourney_params.append("--p") | |
| else: | |
| midjourney_params.append(f"--p {person_data['value']}") | |
| # キャラクター参照 | |
| if params["advanced"].get("character_reference", {}).get("use"): | |
| cref_data = params["advanced"]["character_reference"] | |
| midjourney_params.append(f"--cref {cref_data['value']}") | |
| # 繰り返し生成 | |
| if params["advanced"].get("repeat", {}).get("use"): | |
| repeat_count = params["advanced"]["repeat"]["count"] | |
| midjourney_params.append(f"--r {repeat_count}") | |
| # 画像プロンプトの影響度 | |
| if params["advanced"].get("image_weight", {}).get("use"): | |
| image_weight = params["advanced"]["image_weight"]["value"] | |
| midjourney_params.append(f"--iw {image_weight}") | |
| # seed値 | |
| if params["advanced"].get("seed", {}).get("use"): | |
| seed_data = params["advanced"]["seed"] | |
| midjourney_params.append(f"--seed {seed_data['value']}") | |
| # chaosレベル | |
| if params["advanced"].get("chaos", {}).get("use"): | |
| chaos_data = params["advanced"]["chaos"] | |
| midjourney_params.append(f"--c {chaos_data['value']}") | |
| # ネガティブプロンプト | |
| if params["advanced"].get("negative_prompt", {}).get("use"): | |
| negative_data = params["advanced"]["negative_prompt"] | |
| neg_elements = negative_data['value'].split(',') | |
| for element in neg_elements: | |
| if element.strip(): | |
| midjourney_params.append(f"--no {element.strip()}") | |
| # タイル機能 | |
| if params["advanced"].get("tile", {}).get("use"): | |
| midjourney_params.append("--tile") | |
| # stop値 | |
| if params["advanced"].get("stop", {}).get("use"): | |
| stop_data = params["advanced"]["stop"] | |
| midjourney_params.append(f"--stop {stop_data['value']}") | |
| # 生成モード | |
| if params["advanced"].get("generation_mode") and params["advanced"]["generation_mode"] != "デフォルト": | |
| midjourney_params.append(f"--{params['advanced']['generation_mode']}") | |
| # 共有設定 | |
| if params["advanced"].get("visibility") and params["advanced"]["visibility"] != "デフォルト": | |
| midjourney_params.append(f"--{params['advanced']['visibility']}") | |
| # MidJourney特有のパラメータがあれば追加 | |
| if midjourney_params: | |
| message += "\nMidJourney特有のパラメータ:\n- " + "\n- ".join(midjourney_params) | |
| # 実験的機能 | |
| if any(v for k, v in params["experimental"].items() if v): | |
| message += "\n実験的機能:" | |
| for k, v in params["experimental"].items(): | |
| if v and k != "pattern_concepts" and k != "emotions": | |
| message += f"\n- {k}: 有効" | |
| if params["experimental"].get("pattern_concepts"): | |
| message += f"\n- 対照的概念: {', '.join(params['experimental']['pattern_concepts'])}" | |
| if params["experimental"].get("emotions"): | |
| message += f"\n- 感情マトリックス: 主要={params['experimental']['emotions']['primary']}, 二次={params['experimental']['emotions']['secondary']}" | |
| # 選択されたテクニック | |
| if "techniques" in params and params["techniques"]: | |
| message += f"\n選択されたテクニック: {', '.join(params['techniques'])}" | |
| else: | |
| message += "\nテクニック: 自動選択" | |
| return message |