curl https://api.pipellm.ai/v1beta/models/gemini-3-pro-image:generateContent \
-H "x-goog-api-key: $PIPELLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [{"text": "A red bicycle leaning against a cafe window, morning light"}]
}]
}'
import os
from google import genai
client = genai.Client(
api_key=os.environ["PIPELLM_API_KEY"],
http_options={"base_url": "https://api.pipellm.ai"},
)
response = client.models.generate_content(
model="gemini-3-pro-image",
contents="A red bicycle leaning against a cafe window, morning light",
)
for part in response.parts:
if part.inline_data is not None:
part.as_image().save("bicycle.png")
import fs from "node:fs";
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: process.env.PIPELLM_API_KEY,
httpOptions: { baseUrl: "https://api.pipellm.ai" },
});
const response = await ai.models.generateContent({
model: "gemini-3-pro-image",
contents: "A red bicycle leaning against a cafe window, morning light",
});
for (const part of response.candidates[0].content.parts) {
if (part.inlineData) {
fs.writeFileSync("bicycle.png", Buffer.from(part.inlineData.data, "base64"));
}
}
{
"candidates": [{
"content": {
"role": "model",
"parts": [
{ "text": "Here is the bicycle scene you asked for." },
{
"inlineData": {
"mimeType": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUgAA..."
}
}
]
},
"finishReason": "STOP"
}],
"usageMetadata": {
"promptTokenCount": 12,
"candidatesTokenCount": 1290,
"totalTokenCount": 1302
}
}
用 Gemini 生成图像
用 Gemini 图像模型生成和编辑图像。
POST
/
v1beta
/
models
/
{model}
:generateContent
curl https://api.pipellm.ai/v1beta/models/gemini-3-pro-image:generateContent \
-H "x-goog-api-key: $PIPELLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [{"text": "A red bicycle leaning against a cafe window, morning light"}]
}]
}'
import os
from google import genai
client = genai.Client(
api_key=os.environ["PIPELLM_API_KEY"],
http_options={"base_url": "https://api.pipellm.ai"},
)
response = client.models.generate_content(
model="gemini-3-pro-image",
contents="A red bicycle leaning against a cafe window, morning light",
)
for part in response.parts:
if part.inline_data is not None:
part.as_image().save("bicycle.png")
import fs from "node:fs";
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: process.env.PIPELLM_API_KEY,
httpOptions: { baseUrl: "https://api.pipellm.ai" },
});
const response = await ai.models.generateContent({
model: "gemini-3-pro-image",
contents: "A red bicycle leaning against a cafe window, morning light",
});
for (const part of response.candidates[0].content.parts) {
if (part.inlineData) {
fs.writeFileSync("bicycle.png", Buffer.from(part.inlineData.data, "base64"));
}
}
{
"candidates": [{
"content": {
"role": "model",
"parts": [
{ "text": "Here is the bicycle scene you asked for." },
{
"inlineData": {
"mimeType": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUgAA..."
}
}
]
},
"finishReason": "STOP"
}],
"usageMetadata": {
"promptTokenCount": 12,
"candidatesTokenCount": 1290,
"totalTokenCount": 1302
}
}
Gemini 图像模型不走
和所有 Gemini 路由一样,用
/v1/images/*。它和文本模型一样通过 generateContent 生成图像,图像字节以 inline part 的形式,和模型输出的文本一起返回。
GPT 图像模型请改用 POST /v1/images/generations。
完整的文生图、图生图示例见 Nano Banana。
模型 ID 会随时间变化。用
GET /v1/models 查询你的账户当前可用的模型。端点
| 模式 | 路径 |
|---|---|
| 非流式 | POST /v1beta/models/{model}:generateContent |
| 流式 | POST /v1beta/models/{model}:streamGenerateContent |
x-goog-api-key 认证。见 Gemini 总览。
array
必填
object
Gemini 标准生成配置。图像模型还接受尺寸相关的控制项,但各模型支持的宽高比和分辨率不同,依赖具体取值前请先确认该模型的能力。
curl https://api.pipellm.ai/v1beta/models/gemini-3-pro-image:generateContent \
-H "x-goog-api-key: $PIPELLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"role": "user",
"parts": [{"text": "A red bicycle leaning against a cafe window, morning light"}]
}]
}'
import os
from google import genai
client = genai.Client(
api_key=os.environ["PIPELLM_API_KEY"],
http_options={"base_url": "https://api.pipellm.ai"},
)
response = client.models.generate_content(
model="gemini-3-pro-image",
contents="A red bicycle leaning against a cafe window, morning light",
)
for part in response.parts:
if part.inline_data is not None:
part.as_image().save("bicycle.png")
import fs from "node:fs";
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: process.env.PIPELLM_API_KEY,
httpOptions: { baseUrl: "https://api.pipellm.ai" },
});
const response = await ai.models.generateContent({
model: "gemini-3-pro-image",
contents: "A red bicycle leaning against a cafe window, morning light",
});
for (const part of response.candidates[0].content.parts) {
if (part.inlineData) {
fs.writeFileSync("bicycle.png", Buffer.from(part.inlineData.data, "base64"));
}
}
{
"candidates": [{
"content": {
"role": "model",
"parts": [
{ "text": "Here is the bicycle scene you asked for." },
{
"inlineData": {
"mimeType": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUgAA..."
}
}
]
},
"finishReason": "STOP"
}],
"usageMetadata": {
"promptTokenCount": 12,
"candidatesTokenCount": 1290,
"totalTokenCount": 1302
}
}
array
解析响应
两个习惯能省掉不少麻烦:- 遍历每一个 part。 让模型生成带插图的说明时,文本和图像 part 是交错的。只取第一个 part 会静默丢内容。
- 要能接受纯文本响应。 提示词因安全策略被拒时,响应仍是
200,只有文本 part,没有inlineData。解码前先确认图像 part 存在。
错误
Gemini 路由返回 Gemini 的错误结构,不是 OpenAI 那套。完整映射见 错误处理。400 INVALID_ARGUMENT
400 INVALID_ARGUMENT
contents 结构有误、inline part 的 mimeType 不受支持,或尺寸取值模型不接受。401 UNAUTHENTICATED
401 UNAUTHENTICATED
缺少或填错
x-goog-api-key。429 RESOURCE_EXHAUSTED
429 RESOURCE_EXHAUSTED
见 速率限制。
此页面对您有帮助吗?