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 

如果显示STOPPEDSTARTING,就补一句:

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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

贪心算法(局部最优实现全局最优)第二篇

贪心算法(局部最优实现全局最优)第二篇

目录 1. LeetCode376. 摆动序列 2. LeetCode334. 递增的三元子序列 3. LeetCode674. 最长连续递增序列 4. LeetCode121. 买卖股票的最佳时机 今天我们继续来聊聊贪心算法,因为我在前面也说过贪心算法最重要的就是经验,所以我们今天继续通过刷题的方式来学习贪心算法。 1. LeetCode376. 摆动序列 这道题的意思其实也比较好理解的,就是求一个最长的摆动序列,可以从原数组中删除不符合条件的数。 这道题的话我们先来聊一下思路,因为要求的是最长的子数组。根据题目要求那么是不是说我们每次选的数字都要在有限的分为里面做到尽可能的大或者尽可能的小。为什么要这么做呢?是因为但我们选到最值的时候我们在后面的选择中才可以有更多的选择。 我们看下面这个图,里面有abcdef这几个极值点。我们看,在c和d之间有一个点x1,假设我们在这里选择了这个点的话,那么后面的数都选不了了,因为接下来是要选择比x1小的数。这也是为什么我们每一次都要选择最值的原因。 那么我们代码该怎么设计呢?我们就可以试用一个三指针,通过比较的这三个指针的大

By Ne0inhk
哈希表完全指南:从入门到刷题实战

哈希表完全指南:从入门到刷题实战

文章目录 * 前置知识要求 * 为什么叫Hash? * 和数组有什么关系? * 数组是怎么组织数据的? * 但如果我知道索引呢? * 矛盾点 * 哈希表的做法 * 对比总结 * 哈希表在代码中长什么样?(Java) * 在 Java 中,哈希表的表现形式为**键值对(Key-Value)** * 键值对是什么? * 底层怎么存的? * 哈希表中常用的方法有哪几个? * 实战:刷LeetCode时怎么用哈希表得到更好的时间复杂度? * 简单题:难度1 * 答案 * 通用小技巧 * 简单题:难度2 * 答案 * 中等题:难度4 * 为什么会有不同的哈希表? * 主要的哈希表种类 * **链表法哈希表(最常见)** * **开放寻址法哈希表** * **布谷鸟哈希(Cuckoo Hashing)** * **一致性哈希(Consistent Hashing)** * 题外话:哈希表的前世今生与永远的更优 * 前世 * 今生 *

By Ne0inhk
极致性能的服务器Redis之Hash类型及相关指令介绍

极致性能的服务器Redis之Hash类型及相关指令介绍

目录 1. Hash介绍 2. hset 3. hget 3. hdel 5. hkeys 6. hvals 编辑 7. hgetall  8. hexists 9. hmget 10. hlen 11. hsetnx 12. hincrby 13. hincrbyfloat 1. Hash介绍 Redis 哈希类型是键值对的集合,字段与值均支持字符串、数字等类型,适合建模用户信息、配置项等对象类数据。其支持单字段 / 多字段的增删改查、字段存在性判断、值自增自减等原子操作,且底层通过压缩列表或哈希表优化存储,空间利用率高、查询效率快,是 Redis 中存储结构化数据的核心类型之一。 在Redis中因为本身就是按照哈希的KV结构来进行存储的,所以当我们想要使用Redis里面的哈希的时候,实际上是哈希的哈希,在后者中,

By Ne0inhk
《算法题讲解指南:优选算法-二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值

《算法题讲解指南:优选算法-二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 21. 山峰数组的的峰顶索引 题目链接: 题目描述: 题目示例: 解法(二分查找): 算法思路: C++算法代码: 算法总结及流程解析: 22. 寻找峰值 题目链接: 题目描述: 题目示例: 解法(二分查找): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 21. 山峰数组的的峰顶索引 题目链接: 852. 山脉数组的峰顶索引 - 力扣(LeetCode) 题目描述: 题目示例: 解法(

By Ne0inhk