File size: 5,098 Bytes
06b8797
 
ebcfb0d
d141ac8
 
 
06b8797
 
 
 
 
 
 
 
 
 
 
d09190e
06b8797
63d6796
d09190e
06b8797
 
 
 
ebcfb0d
06b8797
 
 
 
 
 
 
 
 
 
 
31684d8
8f60829
06b8797
 
 
58c4d5c
 
 
 
 
06b8797
a6cb3c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
06b8797
a6cb3c9
06b8797
 
 
a6cb3c9
 
 
 
06b8797
 
 
 
 
 
 
 
 
 
 
 
a6cb3c9
06b8797
 
 
 
 
 
 
 
 
 
 
 
7d44303
06b8797
 
 
 
 
13841ca
06b8797
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# app.py

import gradio as gr
#from together import Together
import together

import os
import base64
from PIL import Image
from io import BytesIO

# --- 1. 設定: APIキーの読み込み ---
api_key = os.environ.get("TOGETHER_API_KEY")
if api_key:
    together_client = together.Together(api_key=api_key)
else:
    together_client = None

# 使用する画像生成モデル
IMAGE_MODEL = "black-forest-labs/FLUX.1-schnell-Free"

# --- 2. 中核機能: 画像生成関数 ---
def generate_image_from_prompt(prompt: str, history: list):
    """
    TogetherAI APIを使用して画像を生成し、履歴リストの先頭に追加します。
    """
    if not together_client:
        raise gr.Error("TogetherAIのAPIクライアントが設定されていません。環境変数 TOGETHER_API_KEY を確認してください。")
    if not prompt or not prompt.strip():
        raise gr.Error("画像を生成するには、プロンプトを入力してください。")

    print(f"プロンプトを元に画像を生成中: '{prompt}'")
    try:
        # TogetherAI APIを呼び出し
        response = together_client.images.generate(
            prompt=prompt,
            model=IMAGE_MODEL,
            steps=4,
            n=4,
            height=1024,
            width=1024
        )

         # ▼▼▼ デバッグのためにこの行を追加 ▼▼▼
        print("---------- API Response ----------")
        print(response)
        print("--------------------------------")
        
        generated_images = []
        # response.data にはリクエストした全ての画像データが含まれる
        for image_data_item in response.data:
            image_b64 = image_data_item.b64_json
            
            # ▼▼▼ 修正箇所: 安全チェックを追加 ▼▼▼
            # image_b64がNoneでない(正常にデータが返された)場合のみ処理する
            if image_b64:
                image_data = base64.b64decode(image_b64)
                image = Image.open(BytesIO(image_data))
                # Gallery用に (image, caption) のタプルを作成
                generated_images.append((image, prompt))

        # 正常に生成された画像が1枚もなかった場合
        if not generated_images:
            raise gr.Error("画像の生成に失敗しました。プロンプトがコンテンツフィルターに抵触した可能性があります。別のプロンプトで試してください。")

        # 新しい画像のリストを、既存の履歴の先頭に追加
        new_history = generated_images + history
        
        print(f"{len(generated_images)}枚の画像の生成が完了しました。")
        return new_history, new_history

    except Exception as e:
        # 既にgr.Errorの場合はそのまま表示
        if isinstance(e, gr.Error):
            raise e
        print(f"予期せぬエラーが発生しました: {e}")
        raise gr.Error(f"画像の生成に失敗しました。エラー詳細: {e}")

# --- 3. Gradio UIの構築 ---
with gr.Blocks(theme=gr.themes.Soft(), css=".gradio-container {max-width: 800px; margin: auto;}") as app:
    gr.Markdown(
        """
        # 🖼️ TogetherAI 画像生成アプリ (Gradio版)
        プロンプトを入力して、TogetherAIのAPIで画像を生成します。
        最新の画像がギャラリーの先頭に表示されます。
        """
    )
    gr.Markdown("---")
    
    history_state = gr.State([])

    with gr.Column():
        prompt_input = gr.Textbox(
            label="画像生成プロンプト",
            placeholder="例: 月面にいる、写真のようにリアルな猫の宇宙飛行士",
            lines=4,
            interactive=True,
        )
        if not together_client:
             gr.Warning("環境変数 `TOGETHER_API_KEY` が見つかりません。画像生成機能を利用するにはAPIキーを設定してください。")
        generate_btn = gr.Button(
            "画像生成 ✨",
            variant="primary",
            interactive=(together_client is not None)
        )

    gr.Markdown("---")
    gr.Markdown("## 生成された画像")
    
    image_gallery = gr.Gallery(
        label="生成結果",
        show_label=False,
        columns=2,
        height="auto",
        object_fit="contain",
        value=None,
        preview=True
    )
    
    generate_btn.click(
        fn=generate_image_from_prompt,
        inputs=[prompt_input, history_state],
        outputs=[image_gallery, history_state],
        show_progress="full"
    )
    
    gr.Examples(
        examples=[
            "A high-resolution photo of a futuristic city with flying cars",
            "An oil painting of a serene landscape with a river and mountains",
            "A cute, fluffy alien creature exploring a vibrant, magical forest",
            "Logo for a coffee shop named 'The Daily Grind', minimalist, modern"
        ],
        inputs=prompt_input
    )

if __name__ == "__main__":
    app.launch(mcp_server=True)