🟠 GPT 编图格式
📝 AI绘画模型简介
gpt-4o-image
gpt-4o-image-vip
这两个模型是ChatGPT新GPT-4o图像功能。OpenAI API模型gpt-image-1
提供多种强大的图像生成模型,可以根据自然语言描述创建、可以对话编辑和修改图像。
💡 Python请求示例
图片编辑示例(一) ✅
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.uiuiapi.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结构可能不同(例如直接使用 "prompt" 而非 "messages")
}
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.uiuiapi.com
(或其他提供商) 获取的真实API密钥。 - 根据需要修改
API_BASE_URL_CONFIG
(默认为https://sg.uiuiapi.com
) 和API_PATH_CONFIG
(默认为/v1/chat/completions
) 以匹配您的API服务。 - 根据需要修改
MODEL
,PROMPT_TEXT
, 和IMAGE_URL_TO_EDIT
。 - 运行脚本。
关于响应内容的处理:
请注意,当前代码在 if __name__ == "__main__":
部分成功调用API后,只是打印了完整的JSON响应。您需要根据您API(gpt-4o-image
模型在 sg.uiuiapi.com
上)实际返回的JSON数据结构来进一步解析和提取您需要的信息(例如,编辑后图像的URL或base64数据)。我在代码末尾注释掉了对此类提取的示例性代码,您需要根据实际情况调整。