Skip to content

Gemini API 接口 python 方式

该模型适配于 Gemini 端侧接口标准

Base Url: https://maas-openapi.wanjiedata.com/api

获取 API KEYhttps://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)**

这个视频非常适合用于讨论电影技术、媒体制作、后期特效合成或影视行业的职场展示。
------------------------------