image-gen-mcp / app.py
baxin's picture
Update app.py
d141ac8 verified
raw
history blame
5.1 kB
# 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)