コンテンツにスキップ

GPT画像生成フォーマット

本ページの概要

  • gpt-4o-image、gpt-4o-image-vip の2つのモデルは、ChatGPT の新しい GPT-4o 画像機能です。OpenAI API のモデル gpt-image-1 は、自然言語の説明に基づいて画像を生成でき、対話しながら画像の編集や修正も行える強力な画像生成モデルを提供します。
import http.client
import json
from urllib.parse import urlparse # URLを解析するために使用
# 1. パラメータ設定(コード内にキーとエンドポイントを直接記入)
# ==============================================================================
# "YOUR_ACTUAL_API_KEY" を実際の API キーに置き換えてください。
API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 実際のキーに置き換え
# "your_api_provider.com" を実際の API ホスト名に置き換えてください。
API_BASE_URL_CONFIG = "https://sg.4All API.com" # 例。実際のベースURLに置き換え
API_PATH_CONFIG = "/v1/chat/completions" # API の具体的なパス
MODEL = "gpt-image-1" # 指定するモデル。例: gpt-4o-image, gpt-4o-image-vip, gpt-image-1, dall-e-3
# 画像編集のパラメータ
PROMPT_TEXT = "この画像を、よりカートゥーン風で色鮮やかにしてください。" # 編集指示に合わせて変更
IMAGE_URL_TO_EDIT = "https://github.com/dianping/cat/raw/master/cat-home/src/main/webapp/images/logo/cat_logo03.png"
# ==============================================================================
def call_image_api(api_key, base_url_config, path_config, model, prompt_text, image_url):
"""
画像処理 API を呼び出します。
パラメータ:
api_key (str): API キー。
base_url_config (str): API のベースURLまたはホスト名。
path_config (str): API のパス。
model (str): 使用するモデル名。
prompt_text (str): 操作内容を説明するテキストプロンプト。
image_url (str): 処理対象の画像URL。
戻り値:
dict or None: 解析済みの JSON レスポンス。失敗時は None。
"""
parsed_url = urlparse(base_url_config)
host = parsed_url.netloc if parsed_url.netloc else parsed_url.path # scheme がない場合、netloc は空で path がホスト名になる
scheme = parsed_url.scheme if parsed_url.scheme else "https" # 既定では https を使用
if not host:
print(f"エラー: '{base_url_config}' からホスト名を解析できません。")
return None
print(f"接続先を準備中: {scheme}://{host}{path_config}")
# リクエスト payload を構築
payload_dict = {
"model": model,
"stream": False, # 画像編集や生成では、通常ストリーミング応答は不要
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt_text
},
{
"type": "image_url",
"image_url": {
"url": image_url
}
}
]
}
]
# API ドキュメントによっては、max_tokens や temperature など他のパラメータも必要になる場合があります。
# API が編集ではなく生成用の場合、payload の構造が異なることがあります(たとえば "messages" ではなく "prompt" を直接使うなど)。
}
payload_json = json.dumps(payload_dict)
# リクエストヘッダーを設定
headers = {
'Accept': 'application/json', # 通常、API は JSON を返す
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
conn = None
try:
if scheme == "https":
conn = http.client.HTTPSConnection(host)
elif scheme == "http":
conn = http.client.HTTPConnection(host)
else:
print(f"エラー: サポートされていないプロトコル '{scheme}' です。'http' または 'https' を使用してください。")
return None
print(f"POST {path_config} にリクエスト送信中...")
# print(f"Payload: {payload_json}") # デバッグ時はコメントアウトを外して payload を表示できます
conn.request("POST", path_config, payload_json, headers)
res = conn.getresponse()
response_status = res.status
response_reason = res.reason
response_data_bytes = res.read()
print(f"レスポンスを受信しました: {response_status} {response_reason}")
if response_status == 200:
try:
decoded_data = response_data_bytes.decode("utf-8")
json_response = json.loads(decoded_data)
print("API 呼び出しに成功しました。レスポンス内容:")
print(json.dumps(json_response, indent=2, ensure_ascii=False)) # JSON を整形して表示
return json_response
except json.JSONDecodeError:
print("エラー: レスポンスを JSON に変換できませんでした。元のレスポンス内容:")
print(response_data_bytes.decode("utf-8", errors="replace")) # 文字化けは置換してデコード
return None
except Exception as e:
print(f"成功レスポンスの処理中にエラーが発生しました: {e}")
return None
else:
print("API 呼び出しに失敗しました。")
print(f"元のレスポンス内容 ({response_status} {response_reason}):")
print(response_data_bytes.decode("utf-8", errors="replace"))
return None
except http.client.Gaierror as e: # アドレス解決エラー
print(f"エラー: ホスト名 '{host}' を解決できません。API ベースURL の設定を確認してください。詳細: {e}")
except ConnectionRefusedError as e:
print(f"エラー: '{host}' への接続が拒否されました。API サービスが起動しているか、ネットワーク接続を確認してください。詳細: {e}")
except http.client.HTTPException as e: # より一般的な HTTP クライアントエラー
print(f"HTTP リクエスト中にエラーが発生しました: {e}")
except Exception as e:
print(f"不明なエラーが発生しました: {e}")
import traceback
traceback.print_exc() # 詳細なスタック情報を出力
finally:
if conn:
conn.close()
# print("接続を閉じました。")
return None
# メイン処理
if __name__ == "__main__":
if API_KEY == "YOUR_ACTUAL_API_KEY" or not API_KEY: # ユーザーが置き換えていない場合に備えて再チェック
print("エラー: スクリプト先頭の 'YOUR_ACTUAL_API_KEY' を実際の API キーに置き換えてください。")
else:
# API 関数を呼び出し
result = call_image_api(
api_key=API_KEY,
base_url_config=API_BASE_URL_CONFIG,
path_config=API_PATH_CONFIG,
model=MODEL,
prompt_text=PROMPT_TEXT,
image_url=IMAGE_URL_TO_EDIT
)
if result:
# ここで、API の実際のレスポンス構造に応じて 'result' を処理できます
# たとえば、編集後の画像 URL や base64 データを返す場合:
# edited_image_url = result.get("choices", [{}])[0].get("message", {}).get("tool_calls", [{}])[0].get("image",{}).get("url")
# if edited_image_url:
# print(f"\n編集後の画像URL(抽出パスの例): {edited_image_url}")
# else:
# print("\nレスポンスから編集後の画像URLを抽出できませんでした。上の完全なレスポンス内容を確認してください。")
pass # 現在のコードは完全なレスポンスを表示するだけで、具体的な抽出ロジックは API の JSON 構造に依存します
else:
print("\nAPI 呼び出しは有効なデータを返しませんでした。")
print("\nスクリプトの実行が完了しました。")
  • スクリプト冒頭の API_KEY = "sk-wLdqZ6SP5GjJSxHwsUbFNUVKMxhDJCoG06Xfexo2V9Eq4Z6n" のキーを、sg.4All API.com(または他の提供元)から取得した実際の API キーに置き換えてください。
  • 必要に応じて API_BASE_URL_CONFIG(既定は https://sg.4All API.com)と API_PATH_CONFIG(既定は /v1/chat/completions)を変更し、ご利用の API サービスに合わせてください。
  • 必要に応じて MODELPROMPT_TEXTIMAGE_URL_TO_EDIT を変更してください。
  • スクリプトを実行してください。

レスポンス内容の扱いについて:

Section titled “レスポンス内容の扱いについて:”

ご注意ください。現在のコードでは if __name__ == "__main__": 内で API 呼び出しに成功した後、完全な JSON レスポンスを表示するだけです。ご利用の API(sg.4All API.com 上の gpt-4o-image モデル)が実際に返す JSON データ構造に応じて、必要な情報(たとえば編集後画像の URL や base64 データ)をさらに解析・抽出する必要があります。コード末尾には、そのような抽出の例をコメントアウトしてありますので、実際の状況に応じて調整してください。