超级特价 gemini-2.5-flash-image-0.07
超级特价的模型当然有特别的调用方法啦
请参照下面的方法使用嗷!
模型名称
gemini-2.5-flash-image-0.07
POST 请求
- 接口地址:
http://www.dmxapi.cn/v1beta/models/gemini-2.5-flash-image-0.07:GenerateContent - 方法:
POST - 必要请求头:
Content-Type: application/json,Authorization: Bearer <你的密钥> - 请求体:使用通用多模态结构
contents -> parts -> text
curl 示例(Linux/macOS,或在 Windows 直接使用 curl.exe):
bash
curl -X POST 'http://www.dmxapi.cn/v1beta/models/gemini-2.5-flash-image-0.07:GenerateContent' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer sk-*******************************' \
-d '{"contents":[{"parts":[{"text":"画一只小狗在在树上跳舞"}]}]}'返回说明:
- 若
Content-Type以image/开头,表示直接返回图片二进制,可直接保存为图片文件。 - 若返回 JSON,请从
candidates[].content.parts[].inline_data.data(或inlineData.data)提取 base64 并解码为图片。
文生图python示例
python
# 本脚本:调用 dmxapi 的 Gemini 2.5 Flash Image 接口,根据文本生成图片,并将结果保存到本地。
# 兼容两种返回形式:
# 1) 直接返回图片二进制(Content-Type: image/*),直接落盘;
# 2) 返回 JSON,其中图片位于 inline_data.base64(或 inlineData.data),需 base64 解码保存。
import os # 文件与路径操作
import time # 时间戳用于输出文件命名
import base64 # 处理 base64 编解码
import mimetypes # 根据 MIME 类型猜测文件扩展名
import requests # 发送 HTTP 请求
# 模型生成接口地址(dmxapi,gemini-2.5-flash-image-0.07)
url = "https://www.dmxapi.cn/v1beta/models/gemini-2.5-flash-image-0.07:GenerateContent"
# 请求头:使用 JSON 格式,需携带 Bearer 鉴权令牌
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer sk-********************************", #填入你的DMXAPI的令牌
}
# 请求体:contents/parts 结构为 API 的通用多模态消息格式
# 这里仅演示文本提示词(如需图文/图像输入,可按 API 结构扩展 parts)
payload = {
"contents": [
{
"parts": [
{"text": "画一只小狗在在树上跳舞"} # 示例提示词
]
}
]
}
# 输出目录,若不存在则创建
output_dir = "output"
os.makedirs(output_dir, exist_ok=True)
try:
# 发送 POST 请求,设置 120 秒超时
resp = requests.post(url, headers=headers, json=payload, timeout=120)
resp.raise_for_status() # 非 2xx 状态码会抛出异常
ct = resp.headers.get("Content-Type", "") # 获取返回的内容类型
# 情况一:服务端直接返回图片二进制,按 MIME 保存
if ct.startswith("image/"):
# 从 Content-Type 推断扩展名,如 image/png -> .png
ext = mimetypes.guess_extension(ct.split(";")[0].strip()) or ".png"
filename = os.path.join(output_dir, f"gemini_image_{time.strftime('%Y%m%d_%H%M%S')}{ext}")
with open(filename, "wb") as f:
f.write(resp.content) # 直接写入二进制内容
print(f"已保存图片: {filename}")
else:
# 情况二:常见为 JSON,需要解析其中的 inline_data.base64 字段
try:
data = resp.json() # 尝试解析 JSON
except ValueError:
# 如果既不是图片也不是 JSON,则直接保存原始文本以便排查
filename = os.path.join(output_dir, f"response_{time.strftime('%Y%m%d_%H%M%S')}.txt")
with open(filename, "w", encoding="utf-8") as f:
f.write(resp.text)
print(f"未发现图片数据,已保存原始响应到: {filename}")
else:
saved = 0 # 记录保存的图片数量
candidates = data.get("candidates") or [] # 候选结果列表
for ci, cand in enumerate(candidates):
content = (cand or {}).get("content") or {}
parts = content.get("parts") or []
for pi, part in enumerate(parts):
# 兼容两种键名:inline_data / inlineData
inline = part.get("inline_data") or part.get("inlineData")
if inline and inline.get("data"):
b64 = inline.get("data") # base64 字符串
# 兼容 mime_type / mimeType 两种写法,默认使用 image/png
mime = inline.get("mime_type") or inline.get("mimeType") or "image/png"
try:
img_bytes = base64.b64decode(b64) # 尝试 base64 解码
except Exception:
# 如果不是标准 base64,则原样写入文本以便后续排查
img_bytes = b64.encode("utf-8")
# 根据 MIME 类型猜测扩展名,缺省为 .png
ext = mimetypes.guess_extension(mime) or ".png"
filename = os.path.join(
output_dir,
f"gemini_image_{time.strftime('%Y%m%d_%H%M%S')}_{saved}{ext}"
)
with open(filename, "wb") as f:
f.write(img_bytes)
print(f"已保存图片: {filename}")
saved += 1
if saved == 0:
# 没有发现任何图片数据:将整个 JSON 保存,便于进一步分析
filename = os.path.join(output_dir, f"response_{time.strftime('%Y%m%d_%H%M%S')}.json")
try:
import json # 仅在需要写 JSON 时导入
with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"未发现图片数据,已保存JSON响应到: {filename}")
except Exception:
# 如果写 JSON 失败则退化为写入字符串文本
with open(filename, "w", encoding="utf-8") as f:
f.write(str(data))
print(f"未发现图片数据,已保存文本响应到: {filename}")
except requests.RequestException as e:
# 网络错误、超时、HTTP 错误等统一在此捕获
print(f"请求失败:{e}")图片编辑 python示例
不支持调整图片比例
python
# 说明:本脚本调用 `dmxapi` 的 `chat/completions` 接口进行图片编辑,
# 并从响应中解析图片数据,保存到脚本同级的 `output` 目录。
# 使用:直接运行该脚本,会将返回的图片落盘;若响应为文本或 JSON,
# 则会按需保存原始内容或解析后的图片,便于排查与复用。
import os
import re
import base64
import datetime
import mimetypes
import requests
def ensure_output_dir():
"""确保并返回输出目录路径;若不存在则在脚本目录下创建 output 子目录。"""
out_dir = os.path.join(os.path.dirname(__file__), "output")
os.makedirs(out_dir, exist_ok=True)
return out_dir
def is_base64_image_string(s):
"""判断字符串是否可能是图片 Base64 或 data:image 形式。"""
if not isinstance(s, str):
return False
s = s.strip()
if not s:
return False
# 支持 data:image/png;base64,xxxxx 形式
if s.startswith("data:image"):
return True
# 避免误判太短的字符串
if len(s) < 100:
return False
# 基本的base64字符集判断
if re.fullmatch(r"[A-Za-z0-9+/=\s]+", s) is None:
return False
# 校验并检查是否为常见图片格式签名
try:
b = base64.b64decode(s, validate=True)
except Exception:
return False
sig = b[:12]
return (
sig.startswith(b"\x89PNG\r\n\x1a\n") # PNG
or sig.startswith(b"\xff\xd8") # JPEG
or (sig[:4] == b"RIFF" and sig[8:12] == b"WEBP") # WEBP
or sig[:6] in (b"GIF87a", b"GIF89a") # GIF
)
def decode_base64_image(s):
"""将 Base64 字符串解码为图片二进制;支持 data:image 前缀。"""
if s.startswith("data:image"):
s = s.split(",", 1)[1]
try:
return base64.b64decode(s, validate=True)
except Exception:
return None
def guess_image_ext(b):
"""根据图片字节签名猜测扩展名(png/jpg/webp/gif),默认返回 png。"""
if b.startswith(b"\x89PNG\r\n\x1a\n"):
return "png"
if b.startswith(b"\xff\xd8"):
return "jpg"
if b[:4] == b"RIFF" and b[8:12] == b"WEBP":
return "webp"
if b[:6] in (b"GIF87a", b"GIF89a"):
return "gif"
return "png"
# 新增:从文本中提取 data URL(含 MIME 和 base64 数据)
def extract_data_urls_from_text(text):
"""从文本中批量提取形如 data:image/...;base64,xxx 的数据 URL。"""
results = []
if not isinstance(text, str):
return results
pattern = re.compile(r"data:(image/[a-zA-Z0-9.+-]+);base64,([A-Za-z0-9+/=\s]+)")
for m in pattern.finditer(text):
mime = m.group(1)
b64 = m.group(2)
results.append((mime, b64))
return results
def collect_base64_images(obj, acc):
"""递归收集对象中的 Base64 图片字符串或嵌入 data URL。"""
if isinstance(obj, dict):
for _, v in obj.items():
if isinstance(v, str) and is_base64_image_string(v):
acc.append(v)
elif isinstance(v, str):
# 新增:字符串中嵌入的 data URL
for mime, b64 in extract_data_urls_from_text(v):
acc.append(f"data:{mime};base64,{b64}")
else:
collect_base64_images(v, acc)
elif isinstance(obj, list):
for item in obj:
collect_base64_images(item, acc)
# 接口地址:dmxapi 的 chat/completions(兼容 OpenAI 风格)
url = "http://www.dmxapi.cn/v1/chat/completions"
# 请求头:Authorization 请替换为你的实际密钥;Content-Type 指定 JSON
headers = {
"Authorization": "Bearer sk-*******************************************", # 填入你的DMXAPI的令牌
"Content-Type": "application/json",
}
# 请求体:指定模型、是否流式、以及消息内容(文本 + 图片)
payload = {
"model": "gemini-2.5-flash-image-0.07",
"stream": False,
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "替换这个男人身上衣服的颜色为紫色"},
{
"type": "image_url",
"image_url": {
"url": "https://storage.googleapis.com/datanebula_open_public_test_bucket/20250912-195507.png"
},
},
],
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {"aspectRatio": "1:1"}, # 不可选,不可调整,不生效!
},
}
def save_images_from_response_json(data):
"""解析 JSON 响应中可能包含的图片字段(candidates/choices/任意嵌套),尽可能保存图片到 output 目录。"""
out_dir = ensure_output_dir()
saved = []
# 优先按参考结构解析 candidates -> content -> parts -> inline_data/inlineData
try:
candidates = data.get("candidates") or []
ts = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
for ci, cand in enumerate(candidates):
content = (cand or {}).get("content") or {}
parts = content.get("parts") or []
for pi, part in enumerate(parts):
inline = part.get("inline_data") or part.get("inlineData")
if inline and inline.get("data"):
b64 = inline.get("data")
mime = inline.get("mime_type") or inline.get("mimeType") or "image/png"
try:
img_bytes = base64.b64decode(b64)
except Exception:
img_bytes = b64.encode("utf-8")
ext = (mimetypes.guess_extension(mime) or ".png").lstrip(".")
path = os.path.join(out_dir, f"response_image_{ts}_{len(saved)+1}.{ext}")
with open(path, "wb") as f:
f.write(img_bytes)
saved.append(path)
print("图片已保存:", path)
except Exception:
# 保持健壮性,任何异常不影响后续兜底逻辑
pass
# 新增:解析 OpenAI chat.completions -> choices[].message.content 中的 data URL
try:
choices = data.get("choices") or []
ts2 = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
for ch in choices:
msg = (ch or {}).get("message") or {}
content_text = msg.get("content")
if isinstance(content_text, str):
for mime, b64 in extract_data_urls_from_text(content_text):
try:
img_bytes = base64.b64decode(b64)
except Exception:
continue
ext = (mimetypes.guess_extension(mime) or ".png").lstrip(".")
path = os.path.join(out_dir, f"response_image_{ts2}_{len(saved)+1}.{ext}")
with open(path, "wb") as f:
f.write(img_bytes)
saved.append(path)
print("图片已保存:", path)
except Exception:
pass
# 若未解析到图片,兜底:在整个 JSON 中收集可能的 base64 图片字符串
if not saved:
images_b64 = []
collect_base64_images(data, images_b64)
if images_b64:
ts = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
for i, s in enumerate(images_b64, start=1):
b = decode_base64_image(s)
if not b:
continue
ext = guess_image_ext(b)
path = os.path.join(out_dir, f"response_image_{ts}_{i}.{ext}")
try:
with open(path, "wb") as f:
f.write(b)
saved.append(path)
print("图片已保存:", path)
except Exception as e:
print("保存图片失败:", e)
else:
print("响应中未找到图片数据。")
return saved
# 主请求流程:调用接口并根据 Content-Type 判定是否直接为图片
try:
resp = requests.post(url, headers=headers, json=payload, timeout=120)
print("Status:", resp.status_code)
ct = resp.headers.get("Content-Type", "")
if ct.startswith("image/"):
out_dir = ensure_output_dir()
ts = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
ext = (mimetypes.guess_extension(ct.split(";")[0].strip()) or ".png").lstrip(".")
path = os.path.join(out_dir, f"response_image_{ts}.{ext}")
with open(path, "wb") as f:
f.write(resp.content)
print("图片已保存:", path)
else:
try:
data = resp.json()
except Exception as e:
# 非JSON,保留原始文本以便排查
out_dir = ensure_output_dir()
ts = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
path = os.path.join(out_dir, f"response_{ts}.txt")
with open(path, "w", encoding="utf-8") as f:
f.write(resp.text)
print("解析 JSON 失败:", e)
print("已保存原始响应到:", path)
data = None
if data is not None:
saved_files = save_images_from_response_json(data)
if saved_files:
print("共保存图片文件数量:", len(saved_files))
print("首个图片路径:", saved_files[0])
else:
# 未解析到图片,保存JSON以便进一步分析
try:
import json
out_dir = ensure_output_dir()
ts = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
path = os.path.join(out_dir, f"response_{ts}.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("未发现图片数据,已保存JSON响应到:", path)
except Exception:
pass
except requests.RequestException as e:
print("Request error:", e)