Appearance
Gemini API 接口 python 方式
该模型适配于 Gemini 端侧接口标准
Base Url: https://maas-openapi.wanjiedata.com/api
获取 API KEY:https://www.wjark.com/center/api-key
使用说明
本文作为 Gemini 接口文档的 Python 版本,全文使用的 Python 版本: 3.13.5
基础文本对话
模型:gemini-2.5-flash-lite
请求示例:
python
import requests
import json
def generate_content():
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-2.5-flash-lite:generateContent?alt=sse"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}" # 替换为真实的 API Key
}
payload = {
"contents": [
{
"parts": [
{
"text": "你好"
}
]
}
]
}
# 使用 stream=True 处理 SSE 流
response = requests.post(url, headers=headers, json=payload, stream=True)
if response.status_code == 200:
print("开始接收流式响应...")
for line in response.iter_lines():
if line:
# 打印原始流数据
decoded_line = line.decode('utf-8')
print(decoded_line)
else:
print(f"请求失败,状态码: {response.status_code}")
print(response.text)
if __name__ == "__main__":
generate_content()响应示例
python
开始接收流式响应...
data: {"candidates": [{"content": {"role": "model","parts": [{"text": "你好"}]}}],"usageMetadata": {"trafficType": "ON_DEMAND"},"modelVersion": "gemini-2.5-flash-lite","createTime": "2026-01-13T02:51:20.372087Z","responseId": "KLNlaffaFq3htgKQm6WxBg"}
data: {"candidates": [{"content": {"role": "model","parts": [{"text": "!有什么我可以帮忙的吗?"}]},"finishReason": "STOP"}],"usageMetadata": {"promptTokenCount": 1,"candidatesTokenCount": 8,"totalTokenCount": 9,"trafficType": "ON_DEMAND","promptTokensDetails": [{"modality": "TEXT","tokenCount": 1}],"candidatesTokensDetails": [{"modality": "TEXT","tokenCount": 8}]},"modelVersion": "gemini-2.5-flash-lite","createTime": "2026-01-13T02:51:20.372087Z","responseId": "KLNlaffaFq3htgKQm6WxBg"}图像分析对话
模型:gemini-2.5-flash-image-preview
请求示例:
python
import requests
import base64
import json
def generate_content_with_image(image_path):
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-2.5-flash-image-preview:generateContent"
api_key = "你的_API_KEY"
# 1. 读取图片并转为 Base64
with open(image_path, "rb") as image_file:
base64_image = base64.b64encode(image_file.read()).decode('utf-8')
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
# 2. 构建请求体
payload = {
"contents": [
{
"parts": [
{"text": "告诉我这张图片里有什么"},
{
"inline_data": {
"mime_type": "image/jpeg", # 根据实际图片类型修改,如 image/png
"data": base64_image
}
}
]
}
]
}
# 3. 发送请求
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
print("回答内容:")
print(response.json())
else:
print(f"请求失败: {response.status_code}")
print(response.text)
if __name__ == "__main__":
generate_content_with_image("test.jpg") # 确保当前目录下有这张图响应示例
python
回答内容:
{'candidates': [{'content': {'parts': [{'text': '这张图片中,一位年轻男子坐在一个厨房台面上,他穿着一件灰色的套头衫和一条红色的围巾。他微笑着看向镜头。在他的旁边有一个大块的奶酪。\n\n 背景是厨房,可以看到炉灶、铜锅、一些餐具和窗台上摆放的盆栽植物。'}], 'role': 'model'}, 'finishReason': 'STOP'}], 'createTime': '2026-01-13T05:48:37.337385Z', 'model': 'gemini-2.5-flash-image-preview', 'modelVersion': 'gemini-2.5-flash-image', 'responseId': 'tdxlaenLFKaxk8sPhIizoAQ', 'usageMetadata': {'candidatesTokenCount': 68, 'candidatesTokensDetails': [{'modality': 'TEXT', 'tokenCount': 68}], 'promptTokenCount': 1295, 'promptTokensDetails': [{'modality': 'IMAGE', 'tokenCount': 1290}, {'modality': 'TEXT', 'tokenCount': 5}], 'totalTokenCount': 1363, 'trafficType': 'ON_DEMAND'}}文字生成图片
模型:gemini-3-pro-image-preview
请求示例:
python
import requests
import json
import base64
def generate_image():
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-3-pro-image-preview:generateContent"
api_key = "YOUR_API_KEY" # 替换为您的实际 API Key
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# 严格按照 API 允许的结构发送
payload = {
"contents": [
{
"role": "user",
"parts": [
{
"text": "画一只可爱的赛博朋克风格的猫" # 输入生成要求
}
]
}
]
}
try:
response = requests.post(url, headers=headers, json=payload)
if response.status_code != 200:
print(f"请求失败: {response.status_code}")
print(response.text)
return
resp_json = response.json()
# 解析 Gemini 返回的图片数据 (通常在第一个 candidate 的第一个 part 中)
# 结构通常是: candidates[0].content.parts[0].inlineData.data
try:
parts = resp_json['candidates'][0]['content']['parts']
image_part = next(p for p in parts if 'inlineData' in p)
base64_data = image_part['inlineData']['data']
mime_type = image_part['inlineData'].get('mimeType', 'image/png')
# 将 Base64 保存为本地图片文件
file_name = "generated_output.png"
with open(file_name, "wb") as f:
f.write(base64.b64decode(base64_data))
print(f"图片已生成并保存到本地: {file_name}")
print(f"您可以直接使用该本地路径,或将其上传获取 URL。")
except (KeyError, StopIteration, IndexError):
print("未能从响应中找到图片数据,请检查 prompt 或模型返回内容。")
print(json.dumps(resp_json, indent=2, ensure_ascii=False))
except Exception as e:
print(f"发生错误: {e}")
if __name__ == "__main__":
generate_image()响应示例
python
图片已生成并保存到本地: generated_output.png
您可以直接使用该本地路径,或将其上传获取 URL。图片编辑
模型:gemini-3-pro-image-preview
请求示例:
python
import requests
import json
import base64
import os
from datetime import datetime
def image_to_image():
# --- 1. 配置信息 ---
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-3-pro-image-preview:generateContent"
api_key = "你的API_KEY" # <--- 请确保这里是正确的
input_path = "d:/maas-docs/input.jpg" # <--- 你要上传的本地图片路径
prompt = "把这张图转换成赛博朋克风格" # <--- 你的想法
# --- 2. 检查并转换输入图片 ---
if not os.path.exists(input_path):
print(f"❌ 错误:找不到输入图片 {input_path}")
return
with open(input_path, "rb") as f:
input_base64 = base64.b64encode(f.read()).decode('utf-8')
# --- 3. 构造请求体 (严格匹配你的 CURL 格式) ---
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"contents": [
{
"parts": [
{"text": prompt},
{
"inline_data": {
"mime_type": "image/jpeg",
"data": input_base64
}
}
]
}
]
}
print("🚀 正在上传并处理图片,请稍候...")
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
res_data = response.json()
# --- 4. 自动探测返回的图片数据 ---
# 定义递归搜索函数:寻找返回 JSON 中最长的字符串(通常就是图片 Base64)
def find_output_image(obj):
if isinstance(obj, dict):
# 优先找可能是 URL 的字段
for k in ['url', 'fileUri', 'link']:
if k in obj and isinstance(obj[k], str) and obj[k].startswith('http'):
return "URL", obj[k]
# 其次找 Base64 数据
for k, v in obj.items():
if isinstance(v, str) and len(v) > 500: # 长度超过500基本就是图片
return "BASE64", v
res = find_output_image(v)
if res: return res
elif isinstance(obj, list):
for item in obj:
res = find_output_image(item)
if res: return res
return None
result = find_output_image(res_data)
if result:
res_type, content = result
if res_type == "URL":
print(f"✅ 成功!获得生成图片链接: {content}")
else:
# 处理 Base64 并下载
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_filename = f"output_{timestamp}.png"
with open(output_filename, "wb") as f:
f.write(base64.b64decode(content))
print(f"✅ 生成成功!图片已下载至: {os.path.abspath(output_filename)}")
else:
print("❌ 未能在响应中识别到图片。响应摘要:")
print(json.dumps(res_data, indent=2, ensure_ascii=False)[:500] + "...")
except Exception as e:
print(f"❌ 请求失败: {e}")
if __name__ == "__main__":
image_to_image()响应示例
python
🚀 正在上传并处理图片,请稍候...
✅ 生成成功!图片已下载至: D:\maas-docs\output_20260113_145538.png音频处理
模型:gemini-2.5-pro
请求示例:
python
import requests
import json
import base64
import os
def analyze_audio():
# --- 1. 配置信息 ---
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-2.5-pro:generateContent"
api_key = "你的API_KEY" # <--- 替换为你的真实 API KEY
audio_path = "d:/maas-docs/input.mp3" # <--- 你的音频文件路径
prompt = "这个音频文件描述了什么"
if not os.path.exists(audio_path):
print(f"❌ 错误:找不到音频文件 {audio_path}")
return
# --- 2. 读取音频并转为 Base64 ---
with open(audio_path, "rb") as f:
audio_base64 = base64.b64encode(f.read()).decode('utf-8')
# --- 3. 构造请求体 ---
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"contents": [
{
"parts": [
{"text": prompt},
{
"inline_data": {
"mime_type": "audio/mpeg", # 如果是 wav 请改为 audio/wav
"data": audio_base64
}
}
]
}
]
}
print("🚀 正在上传并分析音频,请稍候...")
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
res_data = response.json()
# --- 4. 解析文字回复 ---
# Gemini 结构的文字通常在 candidates[0].content.parts[0].text
try:
answer = res_data['candidates'][0]['content']['parts'][0]['text']
print("\n系统回复:")
print("-" * 30)
print(answer)
print("-" * 30)
except (KeyError, IndexLocal) as e:
print("❌ 无法解析回复内容,原始响应:")
print(json.dumps(res_data, indent=2, ensure_ascii=False))
except Exception as e:
print(f"❌ 请求失败: {e}")
if __name__ == "__main__":
analyze_audio()响应示例
python
🚀 正在上传并分析音频,请稍候...
系统回复:
------------------------------
这段音频是一位女性的自我介绍。
她说的话是:**“你好,我是万界方舟,很高兴认识你。”**
所以,这个音频文件描述的是一个名为“万界方舟”的角色或实体在向你问好和介绍自己。
------------------------------PDF 处理
模型:gemini-2.5-pro
请求示例:
python
import requests
import json
import base64
import os
def analyze_pdf():
# --- 1. 配置信息 ---
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-2.5-pro:generateContent"
api_key = "你的API_KEY" # <--- 替换为你的真实 API KEY
pdf_path = "d:/maas-docs/poem.pdf" # <--- 你的 PDF 文件路径
prompt = "你能为这首诗再多写几行吗?"
if not os.path.exists(pdf_path):
print(f"❌ 错误:找不到 PDF 文件 {pdf_path}")
return
# --- 2. 读取 PDF 并转为 Base64 ---
with open(pdf_path, "rb") as f:
pdf_base64 = base64.b64encode(f.read()).decode('utf-8')
# --- 3. 构造请求体 ---
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"contents": [
{
"parts": [
{"text": prompt},
{
"inline_data": {
"mime_type": "application/pdf",
"data": pdf_base64
}
}
]
}
]
}
print("🚀 正在上传并解析 PDF,请稍候...")
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
res_data = response.json()
# --- 4. 解析文字回复 ---
try:
answer = res_data['candidates'][0]['content']['parts'][0]['text']
print("\n📄 模型回复:")
print("-" * 30)
print(answer)
print("-" * 30)
except (KeyError, IndexError):
print("❌ 无法解析回复内容,响应详情:")
print(json.dumps(res_data, indent=2, ensure_ascii=False))
except Exception as e:
print(f"❌ 请求失败: {e}")
if __name__ == "__main__":
analyze_pdf()响应示例
python
分析结果:
🚀 正在上传并解析 PDF,请稍候...
📄 模型回复:
------------------------------
当然可以。这是一首意境非常优美的山水诗,充满了隐逸之士的闲适与超然。诗歌描绘了从登山、闻声、远眺到心境变化的整个过程,最后两句“心随归鸟去,不问路何方”更是点睛之笔,将物我两忘的境界表现得淋漓尽致。
要续写这首诗,我们需要保持其七言古风的格律、意境和“ang”韵。可以从“不问路何方”之后,夜色渐深、山中独坐的场景和心境来展开。
这是为您续写的几行,提供了两个版本,您可以看看更喜欢哪一个:
**原诗:**
《山行》
石径盘云上,松风入袖凉。
溪声穿竹响,野鹤唳空长。
忽见千峰外,一霞染夕阳。
心随归鸟去,不问路何方。
---
### **续写版本一 (侧重于夜景与禅意)**
这个版本延续了原诗的宁静与超脱,描绘了夜幕降临后,诗人在山中独坐,与天地精神往来的情景。
**...(原诗结尾)**
**心随归鸟去,不问路何方。**
**坐石忘年光,且取岚作裳。**
**万籁寂无语,孤月照微霜。**
**忽闻钟声远,疑是白云乡。**
**解说:**
* **坐石忘年光,且取岚作裳。** (zuò shí wàng nián guāng, qiě qǔ lán zuò shang)
* 我坐在石头上,忘记了时间的流逝,姑且就让山间的雾气作我的衣裳。这一句深化了“不问路何方”的洒脱,进入了物我一体的境界。
* **万籁寂无语,孤月照微霜。** (wàn lài jì wú yǔ, gū yuè zhào wēi shuāng)
* 天地万物都已寂静,只有一轮孤独的月亮,清冷的光辉洒在薄薄的秋霜上。描绘了夜深人静的清冷之美。
* **忽闻钟声远,疑是白云乡。** (hū wén zhōng shēng yuǎn, yí shì bái yún xiāng)
* 忽然听到远方传来隐约的钟声,让我怀疑自己是不是已经身处仙境了。“白云乡”常指仙人或隐士居住的地方。
---
### **续写版本二 (侧重于卧听与梦境)**
这个版本描绘了诗人在山中宿下,在半梦半醒之间,感受自然,神游天外的逍遥。
**...(原诗结尾)**
**心随归鸟去,不问路何方。**
**苍山隐暮色,星河渐生芒。**
**卧听松涛响,梦入水中央。**
**一身随风去,天地任徜徉。**
**解说:**
* **苍山隐暮色,星河渐生芒。** (cāng shān yǐn mù sè, xīng hé jiàn shēng máng)
* 青黛色的群山隐没在暮色里,天上的银河渐渐亮起了光芒。承接“夕阳”,描写夜色完全降临。
* **卧听松涛响,梦入水中央。** (wò tīng sōng tāo xiǎng, mèng rù shuǐ zhōng yāng)
* 我躺下听着松林被风吹过、如波涛般的声音,在梦中仿佛进入了广阔水域的中央。这是听觉与幻觉的结合,非常空灵。
* **一身随风去,天地任徜徉。** (yī shēn suí fēng qù, tiān dì rèn cháng yáng)
* 感觉自己的整个身心都随风飘去,在这广阔的天地之间自由自在地漫游。将“心随归鸟去”的意境推向了极致的逍遥。
希望这两个续写的版本能给您带来新的感受,并契合原诗的优美意境。
------------------------------视频分析
模型:gemini-3-flash-preview
接口示例
请求示例:
python
import requests
import json
def analyze_video():
# --- 1. 配置信息 ---
url = "https://maas-openapi.wanjiedata.com/api/v1beta/models/gemini-3-flash-preview:generateContent"
api_key = "你的API_KEY" # <--- 替换为你的 API KEY
# 视频的在线链接 (必须是 API 能访问到的公开地址或万界存储地址)
video_url = "https://example.com/test_video.mp4"
prompt = "请分析这个视频并给出关键词"
# --- 2. 构造请求体 (按照提供的 CURL 格式) ---
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"contents": [
{
"role": "user",
"parts": [
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": video_url
}
},
{
"text": prompt
}
]
}
]
}
print(f"🚀 正在请求 API 分析视频: {video_url}")
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
res_data = response.json()
# --- 3. 解析回复 ---
try:
answer = res_data['candidates'][0]['content']['parts'][0]['text']
print("\n📹 视频分析结果:")
print("-" * 30)
print(answer)
print("-" * 30)
except (KeyError, IndexError):
print("❌ 无法解析回复,完整响应:")
print(json.dumps(res_data, indent=2, ensure_ascii=False))
except Exception as e:
print(f"❌ 请求失败: {e}")
if __name__ == "__main__":
analyze_video()响应示例
python
🚀 正在请求 API 分析视频: https://filesystem.site/cdn/20260105/8c6e55f822b67f09a7dcf53876c1ac.mp4
📹 视频分析结果:
------------------------------
这段视频展示了一个电影拍摄现场的幕后过程。视频从一个紧张刺激的电影画面(消防员跑离燃烧的汽车)开始,随后导演喊“卡”,画面揭示了这是一个使用了绿幕、专业灯光和摄影设备的摄影棚环境。
以下是针对该视频的关键词分析:
### 核心关键词:
* **电影制作 (Film Production / Filmmaking)**:展示了从拍摄到喊停的全过程。
* **幕后 (Behind the Scenes / BTS)**:揭示了电影特效背后的真实场景。
* **绿幕 (Green Screen / Chroma Key)**:视频中清晰展示了用于后期合成的绿色背景。
* **片场 (Movie Set)**:包含了摄影机、灯光师、导演和演员的专业环境。
### 场景与元素关键词:
* **动作片 (Action Movie)**:涉及爆炸、车祸和消防员等元素。
* **视觉特效 (Visual Effects / VFX)**:暗示了现场拍摄与后期合成的结合。
* **导演 (Director)**:画面中出现了使用扩音器指挥的导演。
* **摄影机 (Camera Crew / Cinematography)**:展示了多台专业摄影机及摇臂设备。
* **演员 (Actors)**:展示了穿戏服的消防员以及从道具车中走出的男女演员。
### 氛围关键词:
* **专业 (Professional)**
* **创意 (Creative)**
* **虚幻与现实 (Illusion vs. Reality)**
这个视频非常适合用于讨论电影技术、媒体制作、后期特效合成或影视行业的职场展示。
------------------------------