Z-Image-Turbo API怎么调?Python请求代码实例详细步骤
Z-Image-Turbo API怎么调?Python请求代码实例详细步骤
1. 为什么你需要知道Z-Image-Turbo的API调用方法
你可能已经试过在浏览器里打开Gradio界面,输入“一只橘猫坐在窗台上晒太阳”,点几下就生成了高清图——很爽,但只够玩玩。真正想把它用起来,比如集成到自己的电商后台批量生成商品图、接入客服系统自动配图、或者做成微信小程序让用户随时画图,光靠网页界面就不够了。
这时候,API就是那把钥匙。它不挑环境、不依赖界面、能写进任何程序里,还能批量跑、定时跑、自动跑。而Z-Image-Turbo的API尤其友好:没有复杂鉴权、不用申请密钥、返回结构清晰、响应快得像按了快进键。更重要的是,它不是黑盒服务——你本地部署、模型在你手里、数据不出内网,安全可控。
这篇文章不讲大道理,也不堆参数。我们就从你刚启动完服务那一刻开始,手把手写出能立刻运行的Python代码,调通API、拿到图、保存下来、再加点实用技巧。哪怕你只写过print("hello"),也能跟着走完全部流程。
2. 先确认你的Z-Image-Turbo服务真的跑起来了
别急着写代码,先确保后端已就绪。很多卡点其实出在这一步。
2.1 检查服务状态
登录你的ZEEKLOG镜像实例后,执行:
supervisorctl status z-image-turbo 正常输出应该是:
z-image-turbo RUNNING pid 1234, uptime 0:05:23 如果显示STOPPED或STARTING,就补一句:
supervisorctl start z-image-turbo 2.2 验证API端口是否可访问
Z-Image-Turbo的WebUI和API共用一个端口(默认7860),但API路径是/api/predict。我们用curl快速测一下:
curl -X POST http://127.0.0.1:7860/api/predict \ -H "Content-Type: application/json" \ -d '{"data": ["a red apple on a wooden table"], "event_data": null, "fn_index": 0}' 如果返回一长串JSON,里面包含"data"字段且值是base64编码的图片字符串,说明API已活。如果报Connection refused,请回头检查SSH隧道是否建立成功(见上文“快速上手”第2步)。
小提醒:你在本地开发时,实际请求地址是http://127.0.0.1:7860;但如果Python脚本也跑在镜像服务器内部(比如用Jupyter写),就可以直接用http://localhost:7860,省去隧道步骤。
3. Python调用API:从零写出第一行可用代码
我们不用任何高级框架,就用最基础的requests库——它自带,不用装,小白零门槛。
3.1 最简可用版本(3行代码)
把下面这段复制进你的.py文件或Jupyter单元格,改好提示词就能跑:
import requests import base64 # 替换为你自己的提示词 prompt = "a cyberpunk cityscape at night, neon lights, rain on the street, cinematic lighting" response = requests.post( "http://127.0.0.1:7860/api/predict", json={"data": [prompt], "event_data": None, "fn_index": 0} ) result = response.json() image_base64 = result["data"][0] 这段代码干了三件事:
① 发送POST请求,把提示词塞进data列表;
② fn_index: 0告诉Gradio:“我要调用第一个函数”,也就是图像生成主逻辑;
③ 从返回JSON里精准捞出data[0]——它就是那张图的base64字符串。
3.2 把base64转成真实图片并保存
上面拿到的只是字符串,还得解码成图片文件。加4行就搞定:
# 接上一段代码 image_data = base64.b64decode(image_base64) with open("output.png", "wb") as f: f.write(image_data) print(" 图片已保存为 output.png") 运行后,当前目录下就会多出一张output.png。打开看看——是不是你想要的赛博朋克夜景?如果是,恭喜,API调通了!
3.3 完整可运行脚本(含错误处理)
把上面两段合成一个健壮版本,加了网络异常、超时、JSON解析失败的兜底:
import requests import base64 import time def generate_image(prompt: str, api_url: str = "http://127.0.0.1:7860/api/predict") -> str: """ 调用Z-Image-Turbo API生成图片 返回:图片保存路径(str)或错误信息(str) """ try: response = requests.post( api_url, json={"data": [prompt], "event_data": None, "fn_index": 0}, timeout=120 # 给足时间,高清图生成要几秒 ) response.raise_for_status() # 网络错误抛异常 result = response.json() if "data" not in result or not result["data"]: return "❌ API返回无图片数据" image_base64 = result["data"][0] image_data = base64.b64decode(image_base64) # 用时间戳命名,避免覆盖 filename = f"zimage_{int(time.time())}.png" with open(filename, "wb") as f: f.write(image_data) return f" 已保存:{filename}" except requests.exceptions.Timeout: return "❌ 请求超时,请检查服务是否卡住" except requests.exceptions.ConnectionError: return "❌ 连接失败,请检查URL和SSH隧道" except Exception as e: return f"❌ 未知错误:{str(e)}" # 使用示例 if __name__ == "__main__": prompt = "a fluffy white rabbit holding a tiny umbrella, watercolor style" print(generate_image(prompt)) 保存为zimage_api.py,终端执行python zimage_api.py,几秒后就能看到结果。
4. 进阶技巧:让生成更可控、更实用
光会调通还不够。真实场景中,你肯定需要更多控制力。
4.1 控制生成参数(尺寸、步数、种子)
Z-Image-Turbo的Gradio界面里那些滑块,背后都是可编程的参数。它们藏在data列表的后面几位。完整data结构是:
"data": [ "your prompt", # 提示词(必填) "negative prompt", # 负向提示词(可空) 1024, # 宽度(像素) 1024, # 高度(像素) 8, # 采样步数(Z-Image-Turbo默认8步,别乱改!) 7, # CFG值(指导强度,7是平衡点) 42 # 随机种子(固定值可复现结果) ] 所以,想生成一张1920×1080的横版海报,带“不要文字”负向提示,代码这样写:
response = requests.post( "http://127.0.0.1:7860/api/predict", json={ "data": [ "a modern office desk with laptop and coffee cup, clean background", "text, words, watermark, blurry", # 负向提示 1920, 1080, 8, 7, 42 ], "event_data": None, "fn_index": 0 } ) 小贴士:Z-Image-Turbo对8步采样做了深度优化,强行改成20步反而可能降低质量或变慢。保持默认8步,是最稳的选择。
4.2 批量生成:一次发10个提示词
API本身不支持批量,但我们可以用循环+异步请求提速。这里给一个轻量级方案(不用额外装库):
import time prompts = [ "a golden retriever puppy playing in autumn leaves", "a minimalist logo for 'CloudTech' with blue and white", "surreal landscape: floating islands with waterfalls, soft light" ] for i, p in enumerate(prompts, 1): print(f" 正在生成第{i}张:{p[:30]}...") result = generate_image(p) # 复用前面定义的函数 print(result) time.sleep(1) # 避免请求太密,留点缓冲 如果追求极致速度,可以换成concurrent.futures.ThreadPoolExecutor,但对Z-Image-Turbo这种单卡推理模型,5线程并发基本就是极限了,再多反而抢显存。
4.3 中文提示词实测效果与技巧
Z-Image-Turbo的中文能力是真·亮点。我们实测过这些场景:
- 准确理解复合描述:
"穿汉服的少女站在樱花树下,手持团扇,背景虚化,胶片质感"→ 人物、服饰、动作、背景、风格全中。 - 识别中文专有名词:
"敦煌飞天壁画风格的AI插画"→ 出图有飘带、琵琶、藻井纹样,不是简单套个“古风”滤镜。 - 处理带标点的长句:
"一只蓝猫(品种:俄罗斯蓝猫),坐姿端正,眼神警觉,室内摄影,浅景深"→ 括号内容被当作强调,没被忽略。
避坑建议:
- ❌ 别混用中英文标点(如
,和,混用),可能干扰分词; - 用顿号
、代替逗号分隔并列元素,更符合中文习惯; - 重要元素放前面,比如
"水墨风格、黄山云海、松树、远山"比"远山、松树、黄山云海、水墨风格"构图更稳。
5. 常见问题排查指南(附真实报错截图思路)
遇到问题别慌,90%的情况看这几条就能解决。
5.1 “Connection refused” 或 “Max retries exceeded”
原因:本地没连上镜像的7860端口。
自查清单:
- SSH隧道命令是否执行成功?终端有没有持续输出日志?
ps aux | grep ssh看隧道进程是否活着;- 换个端口试试(比如
-L 8080:127.0.0.1:7860,然后请求http://127.0.0.1:8080); - 在镜像服务器里直接
curl http://localhost:7860,如果通,说明是本地网络问题。
5.2 返回JSON里data为空或报错"fn_index out of range"
原因:Gradio界面函数索引变了。Z-Image-Turbo镜像里,fn_index: 0是主生图函数,但如果你自己加了其他组件(比如图生图tab),索引可能偏移。
解决:打开http://127.0.0.1:7860,右键→“查看页面源代码”,搜索"fn_index",找到生成图那个按钮对应的索引值(通常是0或1),替换代码里的数字。
5.3 图片模糊、细节糊成一团
原因:不是模型问题,是分辨率设低了。Z-Image-Turbo默认输出1024×1024,但如果你在data里写了512, 512,就会强制压缩。
对策:
- 优先用
1024, 1024(显存够); - 16GB显存下,
1280, 720(16:9)或1024, 768(4:3)也很稳; - 避免奇数尺寸(如
1023, 1023),Diffusers对非2的幂次尺寸支持不佳。
5.4 生成图里出现奇怪文字(如“prompt”、“text”)
原因:负向提示词没写或写得不够狠。Z-Image-Turbo虽强,但对文字渲染太“诚实”。
万能负向词(直接复制):"text, words, letters, signature, watermark, timestamp, blurry, deformed, disfigured, bad anatomy"
6. 总结:你现在已经掌握的核心能力
你刚刚完成的,不只是调通一个API。你拿到了一把能打开AI图像生产力的钥匙:
- 从零写出可运行的Python请求代码,不依赖任何第三方SDK;
- 精准控制生成参数:尺寸、步数、种子、负向提示,全在你指尖;
- 批量生成不卡壳,知道什么时候该加延时、什么时候能并发;
- 中文提示词实战经验,避开常见坑,让AI真正听懂你的话;
- 问题自诊能力,遇到报错不再抓瞎,5分钟内定位根源。
下一步,你可以把这段代码封装成一个简单的命令行工具(python gen.py --prompt "xxx"),或者嵌入到Flask Web服务里,甚至用它每天自动生成公众号头图。Z-Image-Turbo的潜力,取决于你怎么用它——而今天,你已经跨过了最难的那道门槛。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。