# nano-banana 🍌
基于 Google Gemini 2.5 Flash Image 的 Python 包装器,简单易用的图像生成和分析工具。
## 功能和应用场景
- 🎨 **AI绘画创作**: 从文字描述生成艺术作品、插画、概念图
- 🔄 **图片风格转换**: 将照片转换为卡通、油画、素描等不同风格
- 📸 **产品图片优化**: 为电商、营销生成产品展示图
- 🔍 **智能图片分析**: 识别物体、场景、文字,提供详细描述
- 📚 **教育内容制作**: 生成教学插图、图表、示意图
- 🎮 **游戏素材创作**: 角色设计、场景概念图、UI元素
## 安装
```bash
uv add nano-banana
# 或
pip install nano-banana
```
## 快速开始
### 设置 API 密钥
```bash
export SIMEN_AI_API_KEY="your-api-key"
export SIMEN_BASEURL="https://api.simen.ai/v1"
```
### 典型使用场景
#### 场景1:电商产品图生成
```python
import nano_banana as nb
# 为咖啡店生成产品展示图
result = nb.text_to_image("一杯精美的拿铁咖啡,白色陶瓷杯,木质桌面,温暖灯光,专业产品摄影风格")
if result['success']:
print(f"产品图URL: {result['urls'][0]}")
```
#### 场景2:头像风格转换
```python
# 将自拍照转换为动漫风格
result = nb.image_to_image("转换成日系动漫风格,保持人物特征", "selfie.jpg")
if result['success']:
print(f"动漫头像: {result['urls'][0]}")
```
#### 场景3:图片内容分析
```python
# 分析商品图片用于自动标签生成
analysis = nb.analyze("product.jpg", "这个商品的类别、颜色、材质和主要特征是什么?")
print(f"商品信息: {analysis}")
```
## API 接口说明
### 函数接口
#### `text_to_image(prompt: str) -> Dict[str, Any]`
**参数:**
- `prompt` (str): 图片生成描述,支持中英文
**返回值:**
```python
{
"success": bool, # 是否成功提取到图片URL
"urls": List[str], # 图片URL列表
"raw_response": str, # AI原始响应文本
"message": str # 状态信息
}
```
#### `image_to_image(prompt: str, reference_images: Union[str, Path, List]) -> Dict[str, Any]`
**参数:**
- `prompt` (str): 图片编辑/转换指令
- `reference_images`: 参考图片,支持本地文件路径、URL或列表
**返回值:** 同 `text_to_image()`
#### `analyze(image: Union[str, Path, List], question: str = "描述图片") -> str`
**参数:**
- `image`: 待分析图片,支持本地文件、URL或多图列表
- `question` (str): 分析问题,默认为"描述图片"
**返回值:** 分析结果文本字符串
### 类接口
```python
from nano_banana import NanoBanana
# 初始化(可选参数,优先使用环境变量)
client = NanoBanana(api_key="your-key", base_url="your-url")
# 调用方法
result = client.text_to_image("prompt")
result = client.image_to_image("prompt", "image.jpg")
analysis = client.analyze("image.jpg", "question")
```
## 真实返回值示例
### 成功生成图片
```python
{
"success": True,
"urls": ["https://storage.googleapis.com/generated-image-abc123.png"],
"raw_response": "我为您生成了一张图片:\n",
"message": "成功生成图片"
}
```
### 未找到图片URL(但API调用成功)
```python
{
"success": False,
"urls": [],
"raw_response": "抱歉,我无法生成包含版权内容的图片,建议修改描述后重试。",
"message": "未找到图片URL,请检查响应内容"
}
```
### 图片分析结果
```python
"这张图片显示了一只橙色的短毛猫坐在木质地板上,猫咪有着绿色的眼睛,正专注地看向镜头。背景是温暖的室内环境,光线柔和自然。"
```
## 完整使用示例
### 批量处理图片
```python
import nano_banana as nb
# 批量生成产品图
products = ["红色连衣裙", "蓝色牛仔裤", "白色运动鞋"]
for product in products:
result = nb.text_to_image(f"{product},白色背景,专业产品摄影")
if result['success']:
print(f"{product}图片: {result['urls'][0]}")
```
### 错误处理
```python
try:
result = nb.text_to_image("生成图片")
if not result['success']:
print(f"生成失败: {result['message']}")
print(f"AI回复: {result['raw_response']}")
except Exception as e:
print(f"API调用错误: {e}")
```
Raw data
{
"_id": null,
"home_page": null,
"name": "nano-banana",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "ai, computer-vision, gemini, image-analysis, image-generation, openai, text-to-image",
"author": null,
"author_email": "Simen AI <hi@simen.ai>",
"download_url": "https://files.pythonhosted.org/packages/a2/4f/4f94182d58293942920d0c45ce9baa661254e1b6c3236995311a000ecec8/nano_banana-0.4.2.tar.gz",
"platform": null,
"description": "# nano-banana \ud83c\udf4c\n\n\u57fa\u4e8e Google Gemini 2.5 Flash Image \u7684 Python \u5305\u88c5\u5668\uff0c\u7b80\u5355\u6613\u7528\u7684\u56fe\u50cf\u751f\u6210\u548c\u5206\u6790\u5de5\u5177\u3002\n\n## \u529f\u80fd\u548c\u5e94\u7528\u573a\u666f\n\n- \ud83c\udfa8 **AI\u7ed8\u753b\u521b\u4f5c**: \u4ece\u6587\u5b57\u63cf\u8ff0\u751f\u6210\u827a\u672f\u4f5c\u54c1\u3001\u63d2\u753b\u3001\u6982\u5ff5\u56fe\n- \ud83d\udd04 **\u56fe\u7247\u98ce\u683c\u8f6c\u6362**: \u5c06\u7167\u7247\u8f6c\u6362\u4e3a\u5361\u901a\u3001\u6cb9\u753b\u3001\u7d20\u63cf\u7b49\u4e0d\u540c\u98ce\u683c\n- \ud83d\udcf8 **\u4ea7\u54c1\u56fe\u7247\u4f18\u5316**: \u4e3a\u7535\u5546\u3001\u8425\u9500\u751f\u6210\u4ea7\u54c1\u5c55\u793a\u56fe\n- \ud83d\udd0d **\u667a\u80fd\u56fe\u7247\u5206\u6790**: \u8bc6\u522b\u7269\u4f53\u3001\u573a\u666f\u3001\u6587\u5b57\uff0c\u63d0\u4f9b\u8be6\u7ec6\u63cf\u8ff0\n- \ud83d\udcda **\u6559\u80b2\u5185\u5bb9\u5236\u4f5c**: \u751f\u6210\u6559\u5b66\u63d2\u56fe\u3001\u56fe\u8868\u3001\u793a\u610f\u56fe\n- \ud83c\udfae **\u6e38\u620f\u7d20\u6750\u521b\u4f5c**: \u89d2\u8272\u8bbe\u8ba1\u3001\u573a\u666f\u6982\u5ff5\u56fe\u3001UI\u5143\u7d20\n\n## \u5b89\u88c5\n\n```bash\nuv add nano-banana\n# \u6216\npip install nano-banana\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u8bbe\u7f6e API \u5bc6\u94a5\n\n```bash\nexport SIMEN_AI_API_KEY=\"your-api-key\"\nexport SIMEN_BASEURL=\"https://api.simen.ai/v1\"\n```\n\n### \u5178\u578b\u4f7f\u7528\u573a\u666f\n\n#### \u573a\u666f1\uff1a\u7535\u5546\u4ea7\u54c1\u56fe\u751f\u6210\n```python\nimport nano_banana as nb\n\n# \u4e3a\u5496\u5561\u5e97\u751f\u6210\u4ea7\u54c1\u5c55\u793a\u56fe\nresult = nb.text_to_image(\"\u4e00\u676f\u7cbe\u7f8e\u7684\u62ff\u94c1\u5496\u5561\uff0c\u767d\u8272\u9676\u74f7\u676f\uff0c\u6728\u8d28\u684c\u9762\uff0c\u6e29\u6696\u706f\u5149\uff0c\u4e13\u4e1a\u4ea7\u54c1\u6444\u5f71\u98ce\u683c\")\nif result['success']:\n print(f\"\u4ea7\u54c1\u56feURL: {result['urls'][0]}\")\n```\n\n#### \u573a\u666f2\uff1a\u5934\u50cf\u98ce\u683c\u8f6c\u6362\n```python\n# \u5c06\u81ea\u62cd\u7167\u8f6c\u6362\u4e3a\u52a8\u6f2b\u98ce\u683c\nresult = nb.image_to_image(\"\u8f6c\u6362\u6210\u65e5\u7cfb\u52a8\u6f2b\u98ce\u683c\uff0c\u4fdd\u6301\u4eba\u7269\u7279\u5f81\", \"selfie.jpg\")\nif result['success']:\n print(f\"\u52a8\u6f2b\u5934\u50cf: {result['urls'][0]}\")\n```\n\n#### \u573a\u666f3\uff1a\u56fe\u7247\u5185\u5bb9\u5206\u6790\n```python\n# \u5206\u6790\u5546\u54c1\u56fe\u7247\u7528\u4e8e\u81ea\u52a8\u6807\u7b7e\u751f\u6210\nanalysis = nb.analyze(\"product.jpg\", \"\u8fd9\u4e2a\u5546\u54c1\u7684\u7c7b\u522b\u3001\u989c\u8272\u3001\u6750\u8d28\u548c\u4e3b\u8981\u7279\u5f81\u662f\u4ec0\u4e48\uff1f\")\nprint(f\"\u5546\u54c1\u4fe1\u606f: {analysis}\")\n```\n\n## API \u63a5\u53e3\u8bf4\u660e\n\n### \u51fd\u6570\u63a5\u53e3\n\n#### `text_to_image(prompt: str) -> Dict[str, Any]`\n**\u53c2\u6570:**\n- `prompt` (str): \u56fe\u7247\u751f\u6210\u63cf\u8ff0\uff0c\u652f\u6301\u4e2d\u82f1\u6587\n\n**\u8fd4\u56de\u503c:**\n```python\n{\n \"success\": bool, # \u662f\u5426\u6210\u529f\u63d0\u53d6\u5230\u56fe\u7247URL\n \"urls\": List[str], # \u56fe\u7247URL\u5217\u8868\n \"raw_response\": str, # AI\u539f\u59cb\u54cd\u5e94\u6587\u672c\n \"message\": str # \u72b6\u6001\u4fe1\u606f\n}\n```\n\n#### `image_to_image(prompt: str, reference_images: Union[str, Path, List]) -> Dict[str, Any]`\n**\u53c2\u6570:**\n- `prompt` (str): \u56fe\u7247\u7f16\u8f91/\u8f6c\u6362\u6307\u4ee4\n- `reference_images`: \u53c2\u8003\u56fe\u7247\uff0c\u652f\u6301\u672c\u5730\u6587\u4ef6\u8def\u5f84\u3001URL\u6216\u5217\u8868\n\n**\u8fd4\u56de\u503c:** \u540c `text_to_image()`\n\n#### `analyze(image: Union[str, Path, List], question: str = \"\u63cf\u8ff0\u56fe\u7247\") -> str`\n**\u53c2\u6570:**\n- `image`: \u5f85\u5206\u6790\u56fe\u7247\uff0c\u652f\u6301\u672c\u5730\u6587\u4ef6\u3001URL\u6216\u591a\u56fe\u5217\u8868\n- `question` (str): \u5206\u6790\u95ee\u9898\uff0c\u9ed8\u8ba4\u4e3a\"\u63cf\u8ff0\u56fe\u7247\"\n\n**\u8fd4\u56de\u503c:** \u5206\u6790\u7ed3\u679c\u6587\u672c\u5b57\u7b26\u4e32\n\n### \u7c7b\u63a5\u53e3\n\n```python\nfrom nano_banana import NanoBanana\n\n# \u521d\u59cb\u5316\uff08\u53ef\u9009\u53c2\u6570\uff0c\u4f18\u5148\u4f7f\u7528\u73af\u5883\u53d8\u91cf\uff09\nclient = NanoBanana(api_key=\"your-key\", base_url=\"your-url\")\n\n# \u8c03\u7528\u65b9\u6cd5\nresult = client.text_to_image(\"prompt\")\nresult = client.image_to_image(\"prompt\", \"image.jpg\")\nanalysis = client.analyze(\"image.jpg\", \"question\")\n```\n\n## \u771f\u5b9e\u8fd4\u56de\u503c\u793a\u4f8b\n\n### \u6210\u529f\u751f\u6210\u56fe\u7247\n```python\n{\n \"success\": True,\n \"urls\": [\"https://storage.googleapis.com/generated-image-abc123.png\"],\n \"raw_response\": \"\u6211\u4e3a\u60a8\u751f\u6210\u4e86\u4e00\u5f20\u56fe\u7247\uff1a\\n\",\n \"message\": \"\u6210\u529f\u751f\u6210\u56fe\u7247\"\n}\n```\n\n### \u672a\u627e\u5230\u56fe\u7247URL\uff08\u4f46API\u8c03\u7528\u6210\u529f\uff09\n```python\n{\n \"success\": False,\n \"urls\": [],\n \"raw_response\": \"\u62b1\u6b49\uff0c\u6211\u65e0\u6cd5\u751f\u6210\u5305\u542b\u7248\u6743\u5185\u5bb9\u7684\u56fe\u7247\uff0c\u5efa\u8bae\u4fee\u6539\u63cf\u8ff0\u540e\u91cd\u8bd5\u3002\",\n \"message\": \"\u672a\u627e\u5230\u56fe\u7247URL\uff0c\u8bf7\u68c0\u67e5\u54cd\u5e94\u5185\u5bb9\"\n}\n```\n\n### \u56fe\u7247\u5206\u6790\u7ed3\u679c\n```python\n\"\u8fd9\u5f20\u56fe\u7247\u663e\u793a\u4e86\u4e00\u53ea\u6a59\u8272\u7684\u77ed\u6bdb\u732b\u5750\u5728\u6728\u8d28\u5730\u677f\u4e0a\uff0c\u732b\u54aa\u6709\u7740\u7eff\u8272\u7684\u773c\u775b\uff0c\u6b63\u4e13\u6ce8\u5730\u770b\u5411\u955c\u5934\u3002\u80cc\u666f\u662f\u6e29\u6696\u7684\u5ba4\u5185\u73af\u5883\uff0c\u5149\u7ebf\u67d4\u548c\u81ea\u7136\u3002\"\n```\n\n## \u5b8c\u6574\u4f7f\u7528\u793a\u4f8b\n\n### \u6279\u91cf\u5904\u7406\u56fe\u7247\n```python\nimport nano_banana as nb\n\n# \u6279\u91cf\u751f\u6210\u4ea7\u54c1\u56fe\nproducts = [\"\u7ea2\u8272\u8fde\u8863\u88d9\", \"\u84dd\u8272\u725b\u4ed4\u88e4\", \"\u767d\u8272\u8fd0\u52a8\u978b\"]\nfor product in products:\n result = nb.text_to_image(f\"{product}\uff0c\u767d\u8272\u80cc\u666f\uff0c\u4e13\u4e1a\u4ea7\u54c1\u6444\u5f71\")\n if result['success']:\n print(f\"{product}\u56fe\u7247: {result['urls'][0]}\")\n```\n\n### \u9519\u8bef\u5904\u7406\n```python\ntry:\n result = nb.text_to_image(\"\u751f\u6210\u56fe\u7247\")\n if not result['success']:\n print(f\"\u751f\u6210\u5931\u8d25: {result['message']}\")\n print(f\"AI\u56de\u590d: {result['raw_response']}\")\nexcept Exception as e:\n print(f\"API\u8c03\u7528\u9519\u8bef: {e}\")\n```\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Simple wrapper for Google Gemini image generation and analysis",
"version": "0.4.2",
"project_urls": null,
"split_keywords": [
"ai",
" computer-vision",
" gemini",
" image-analysis",
" image-generation",
" openai",
" text-to-image"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "d45fc5717a845b2d1db00240759df042f1db2c217e1df0c672a72173ef74c461",
"md5": "ba7c57e5f180c432fa6c352c2193df97",
"sha256": "e5e16e24e105f3dc12f22ab7731d87b52de1cb86cbaf0a9b74c00b00671db54c"
},
"downloads": -1,
"filename": "nano_banana-0.4.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ba7c57e5f180c432fa6c352c2193df97",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 5748,
"upload_time": "2025-09-12T08:16:38",
"upload_time_iso_8601": "2025-09-12T08:16:38.371688Z",
"url": "https://files.pythonhosted.org/packages/d4/5f/c5717a845b2d1db00240759df042f1db2c217e1df0c672a72173ef74c461/nano_banana-0.4.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a24f4f94182d58293942920d0c45ce9baa661254e1b6c3236995311a000ecec8",
"md5": "30c45e3d5633078b08235b759fbbeda5",
"sha256": "1edbcd4e4104f5788759a07da8eab07a0b23434cd1a9cb7aebf0a3dc0c8a4a5f"
},
"downloads": -1,
"filename": "nano_banana-0.4.2.tar.gz",
"has_sig": false,
"md5_digest": "30c45e3d5633078b08235b759fbbeda5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 45605,
"upload_time": "2025-09-12T08:16:39",
"upload_time_iso_8601": "2025-09-12T08:16:39.969864Z",
"url": "https://files.pythonhosted.org/packages/a2/4f/4f94182d58293942920d0c45ce9baa661254e1b6c3236995311a000ecec8/nano_banana-0.4.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-12 08:16:39",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "nano-banana"
}