nano-banana2-gen-image
3
总安装量
3
周安装量
#57942
全站排名
安装命令
npx skills add https://github.com/benzema216/dreamina-claude-skills --skill nano-banana2-gen-image
Agent 安装分布
opencode
2
claude-code
2
replit
1
amp
1
trae
1
kimi-cli
1
Skill 文档
nano-banana2 å¾ççæå·¥å ·
API 端ç¹
ç产ç¯å¢
POST https://gpt-i18n.byteintl.net/gpt/openapi/online/multimodal/crawl?ak=gGoT3706okXuOVHBBhA1SBG8erOvgihU_GPT_AK
åå ¬ç½ç»ç¯å¢
POST https://genai-sg-og.tiktok-row.org/gpt/openapi/online/multimodal/crawl?ak=gGoT3706okXuOVHBBhA1SBG8erOvgihU_GPT_AK
宿´è¯·æ±ç¤ºä¾
import requests
import json
import base64
import uuid
from datetime import datetime
def generate_image_nano_banana(prompt, aspect_ratio="1:1", image_size="1K", network="production"):
"""
ä½¿ç¨ nano-banana2 çæå¾ç
Args:
prompt: å¾çæè¿°æç¤ºè¯
aspect_ratio: å¾çæ¯ä¾ï¼æ¯æ 21:9, 16:9, 4:3, 3:2, 1:1, 9:16, 3:4, 2:3, 5:4, 4:5
image_size: å¾ç大å°ï¼æ¯æ "1K" æ "2K"
network: ç½ç»ç¯å¢ï¼"production" æ "office"
Returns:
dict: å
å«å¾çbase64æ°æ®åå
ä¿¡æ¯
"""
# éæ©æ£ç¡®ç端ç¹
if network == "office":
url = "https://genai-sg-og.tiktok-row.org/gpt/openapi/online/multimodal/crawl"
else:
url = "https://gpt-i18n.byteintl.net/gpt/openapi/online/multimodal/crawl"
# æ·»å API key
url += "?ak=gGoT3706okXuOVHBBhA1SBG8erOvgihU_GPT_AK"
# çæ logid
logid = f"nanobanana_{uuid.uuid4().hex}_{int(datetime.now().timestamp())}"
headers = {
"Content-Type": "application/json",
"X-TT-LOGID": logid
}
data = {
"stream": False,
"model": "nano-banana2",
"max_tokens": 20000,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
}
]
}
],
"response_modalities": ["TEXT", "IMAGE"],
"image_config": {
"aspectRatio": aspect_ratio,
"imageSize": image_size,
"imageOutputOptions": {
"mimeType": "image/png"
}
}
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
if result.get("code") == 0:
# æåå¾çæ°æ®
messages = result.get("data", {}).get("choices", [])[0].get("message", {})
multimodal_contents = messages.get("multimodal_contents", [])
images = []
for content in multimodal_contents:
if content.get("type") == "inline_data":
image_data = content.get("inline_data", {})
images.append({
"base64": image_data.get("data"),
"mime_type": image_data.get("mime_type"),
"prompt": prompt,
"aspect_ratio": aspect_ratio
})
return {
"status": "success",
"images": images,
"logid": logid
}
return {
"status": "error",
"error": f"Request failed: {response.status_code}",
"response": response.text
}
def save_base64_image(base64_data, filename):
"""ä¿å base64 å¾çå°æä»¶"""
image_data = base64.b64decode(base64_data)
with open(filename, 'wb') as f:
f.write(image_data)
print(f"Image saved: {filename}")
# 使ç¨ç¤ºä¾
# result = generate_image_nano_banana("ä¸åªå¯ç±çæ´ç¬å¨å
¬åéç©è", aspect_ratio="16:9", image_size="2K")
# if result["status"] == "success" and result["images"]:
# save_base64_image(result["images"][0]["base64"], "shiba_inu.png")
Bash å½ä»¤ç¤ºä¾
# çæå¾çç curl å½ä»¤
curl --location 'https://gpt-i18n.byteintl.net/gpt/openapi/online/multimodal/crawl?ak=gGoT3706okXuOVHBBhA1SBG8erOvgihU_GPT_AK' \
--header 'Content-Type: application/json' \
--header 'X-TT-LOGID: nanobanana_test_'$(date +%s) \
--data '{
"stream": false,
"model": "nano-banana2",
"max_tokens": 20000,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "çæä¸å¼ åæ¹å°åèæ§å±
æ°åºçç
§çï¼åå®é£æ ¼"
}
]
}
],
"response_modalities": ["TEXT","IMAGE"],
"image_config": {
"aspectRatio": "16:9",
"imageSize": "2K",
"imageOutputOptions": {
"mimeType": "image/png"
}
}
}' | jq '.data.choices[0].message.multimodal_contents[] | select(.type=="inline_data") | .inline_data.data' -r | base64 -d > output.png
åæ°è¯´æ
å¿ å¡«åæ°
| åæ° | ç±»å | 说æ |
|---|---|---|
| messages | array | ç¨æ·æ¶æ¯æ°ç»ï¼å å«ææ¬æç¤ºè¯ |
| model | string | åºå®å¼ “nano-banana2” |
å¯éåæ°
| åæ° | ç±»å | é»è®¤å¼ | 说æ |
|---|---|---|---|
| aspect_ratio | string | “1:1” | å¾çæ¯ä¾ |
| image_size | string | “1K” | å¾ç尺寸 |
| max_tokens | number | 20000 | æå¤§tokenæ° |
æ¯æçæ¯ä¾
- 横å: 21:9, 16:9, 4:3, 3:2
- æ¹å½¢: 1:1
- 纵å: 9:16, 3:4, 2:3
- çµæ´»: 5:4, 4:5
å¾ç尺寸
- 1K: æ åè´¨éï¼é»è®¤ï¼
- 2K: é«è´¨é
ååºå¤ç
æåååºç»æ
{
"code": 0,
"msg": "success",
"data": {
"choices": [{
"finish_reason": "stop",
"message": {
"multimodal_contents": [
{
"type": "text",
"text": "好çï¼ä¸ºä½ çæ..."
},
{
"type": "inline_data",
"inline_data": {
"mime_type": "image/png",
"data": "base64_encoded_image_data"
}
}
]
}
}]
}
}
æåå¾çæ°æ®
# ä»ååºä¸æåææå¾ç
def extract_images(response_json):
images = []
choices = response_json.get("data", {}).get("choices", [])
for choice in choices:
contents = choice.get("message", {}).get("multimodal_contents", [])
for content in contents:
if content.get("type") == "inline_data":
images.append(content.get("inline_data"))
return images
使ç¨å»ºè®®
-
æç¤ºè¯ä¼å
- 使ç¨è¯¦ç»çæè¿°è·å¾æ´å¥½çç»æ
- ææé£æ ¼ãå çº¿ãæ°å´çç»è
- å¯ä»¥ä½¿ç¨ä¸ææè±ææç¤ºè¯
-
æ¯ä¾éæ©
- è§è²èåï¼ä½¿ç¨ 2:3 æ 3:4
- åºæ¯æ¨ªå¹ ï¼ä½¿ç¨ 16:9 æ 21:9
- 社交åªä½ï¼ä½¿ç¨ 1:1 æ 9:16
-
æ¹éçæ
- å¯ä»¥éè¿å¤æ¬¡è°ç¨å®ç°æ¹éçæ
- å»ºè®®æ¯æ¹æ§å¶å¨ 5-10 å¼
-
ç½ç»ç¯å¢
- åå ¬ç½ç»ä½¿ç¨ tiktok-row.org åå
- å ¶ä»ç¯å¢ä½¿ç¨ byteintl.net åå
é误å¤ç
def handle_error(response):
if response.status_code == 400:
return "请æ±åæ°é误ï¼è¯·æ£æ¥åæ°æ ¼å¼"
elif response.status_code == 401:
return "API Key æ ææè¿æ"
elif response.status_code == 429:
return "请æ±é¢çè¿é«ï¼è¯·ç¨åéè¯"
else:
return f"æªç¥é误: {response.status_code}"
注æäºé¡¹
- API Key å®å ¨ï¼è¯·å¿å¨ç产ç¯å¢ä¸ç¡¬ç¼ç API Key
- å¾çåå¨ï¼çæçå¾ç为 base64 æ ¼å¼ï¼éè¦åæ¶ä¿å
- 请æ±é¢çï¼é¿å è¿äºé¢ç¹ç请æ±ï¼å»ºè®®é´é 1-2 ç§
- å å®¹å®¡æ ¸ï¼çæå 容é符åç¸å ³æ³å¾æ³è§