whatai

导航

 

你是否遇到过这样的场景?
想把 ChatGPT 接入自己的应用,却被模型限制、价格波动、接口差异搞得一头雾水;
刚写好的代码,换一个模型就要重构一遍;
好不容易跑通了,又发现前端、后端、流式输出全都要重新适配。

现在,这些问题可以用一个“中转 API”一次性解决。

本教程将手把手带你使用神马中转API兼容 OpenAI Chat Completions 的中转 API,通过 Python 快速部署一个可切换多模型的 ChatGPT 应用。无论你使用的是 OpenAI、Claude、Gemini、DeepSeek,还是其他对话模型,只需要 一个统一接口、一套请求格式,就能完成调用。

中转API部署ChatGPT应用Python开发调用请求代码示例


这套中转API是什么

这套神马中转API接口兼容 OpenAI 的 Chat Completions 格式:你只需要在请求体里改 model,就可以切换 OpenAI / Claude / Gemini / DeepSeek / Grok / Qwen 等模型。 

你给的接口是 Chat(聊天)

  • 方法:POST

  • 路径:/v1/chat/completions 


准备工作:Base URL 与 API Key

文档说明:

  • BaseURL:通常是神马中转API域名,也可以在工作台页面查看

  • API key:在令牌页面获取 

你可以把它们放到环境变量里(推荐):

export GPT_BEST_BASE_URL="你的BaseURL(例如:https://api.whatai.cc)"
export GPT_BEST_API_KEY="你的API_KEY"

按文档拼请求:Header + Body

 Header

文档示例里用的是:

  • Accept: application/json

  • Authorization: Bearer {{YOUR_API_KEY}}

  • Content-Type: application/json 

Body

请求体(application/json)文档示例包含这些字段:modelmessagestemperaturetop_pnstreamstopmax_tokenspresence_penaltyfrequency_penaltylogit_biasuserresponse_formatseentoolstool_choice 

最小可用通常是 model + messages,其他按需加。


Python同步请求示例(requests)

import os
import requests

BASE_URL = os.getenv("GPT_BEST_BASE_URL")  # 你的 BaseURL,https://api.whatai.cc)
API_KEY = os.getenv("GPT_BEST_API_KEY")

if not BASE_URL or not API_KEY:
    raise RuntimeError("请先设置 GPT_BEST_BASE_URL 和 GPT_BEST_API_KEY 环境变量")

url = f"{BASE_URL.rstrip('/')}/v1/chat/completions"  # 接口路径  

headers = {
    "Accept": "application/json",
    "Authorization": f"Bearer {API_KEY}",  # Bearer 方式  
    "Content-Type": "application/json",
}

payload = {
    "model": "gpt-4o-mini",  # 按需替换成你要用的模型名
    "messages": [
        {"role": "system", "content": "你是一个严谨的编程助手。"},
        {"role": "user", "content": "用Python写一个快速排序,并解释时间复杂度。"},
    ],
    "temperature": 0.7,
    "top_p": 1,
    "n": 1,
    "stream": False,  # 非流式
    "max_tokens": 800,
}

resp = requests.post(url, headers=headers, json=payload, timeout=60)
resp.raise_for_status()

data = resp.json()
# 返回格式示例:choices[0].message.content 
print(data["choices"][0]["message"]["content"])
print("usage:", data.get("usage"))

Python流式输出示例(stream=true)

文档请求体里有 stream: true 字段示例。 

流式一般是服务端不断返回分片(常见是 SSE:data: ...)。

import os
import json
import requests

BASE_URL = os.getenv("GPT_BEST_BASE_URL")
API_KEY = os.getenv("GPT_BEST_API_KEY")

url = f"{BASE_URL.rstrip('/')}/v1/chat/completions"

headers = {
    "Accept": "application/json",
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

payload = {
    "model": "gpt-4o-mini",
    "messages": [
        {"role": "user", "content": "请用三句话解释什么是递归,并给一个Python例子。"}
    ],
    "stream": True,  # 流式 
    "temperature": 0.6,
}

with requests.post(url, headers=headers, json=payload, stream=True, timeout=60) as r:
    r.raise_for_status()

    for line in r.iter_lines(decode_unicode=True):
        if not line:
            continue

        # 常见 SSE 行:data: {...} 或 data: [DONE]
        if line.startswith("data:"):
            line = line[len("data:"):].strip()

        if line == "[DONE]":
            break

        try:
            chunk = json.loads(line)
        except json.JSONDecodeError:
            # 如果服务端不是 SSE 格式而是纯JSON片段,可在这里按需兼容
            continue

        # OpenAI 风格流式:choices[0].delta.content
        delta = chunk.get("choices", [{}])[0].get("delta", {})
        content = delta.get("content")
        if content:
            print(content, end="", flush=True)

print()  # 换行

“部署一个 ChatGPT 应用”的最小后端:FastAPI转发(可选)

这个小服务做两件事:

  1. 接收你自己的前端请求

  2. 转发到中转 API 的 /v1/chat/completions(仍然保持文档要求的 Header/Body 结构) 

import os
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

BASE_URL = os.getenv("GPT_BEST_BASE_URL")
API_KEY = os.getenv("GPT_BEST_API_KEY")

app = FastAPI()

class ChatReq(BaseModel):
    model: str
    messages: list
    temperature: float | None = None
    top_p: float | None = None
    n: int | None = None
    stream: bool | None = None
    stop: str | None = None
    max_tokens: int | None = None
    presence_penalty: float | None = None
    frequency_penalty: float | None = None
    logit_bias: dict | None = None
    user: str | None = None
    response_format: dict | None = None
    seen: int | None = None
    tools: list | None = None
    tool_choice: dict | None = None

@app.post("/chat")
def chat(req: ChatReq):
    if not BASE_URL or not API_KEY:
        raise HTTPException(status_code=500, detail="Missing GPT_BEST_BASE_URL / GPT_BEST_API_KEY")

    url = f"{BASE_URL.rstrip('/')}/v1/chat/completions"  #
    headers = {
        "Accept": "application/json",
        "Authorization": f"Bearer {API_KEY}",  # 
        "Content-Type": "application/json",
    }

    resp = requests.post(url, headers=headers, json=req.model_dump(exclude_none=True), timeout=60)
    if resp.status_code != 200:
        raise HTTPException(status_code=resp.status_code, detail=resp.text)

    return resp.json()

启动(示例):

uvicorn your_file_name:app --host 0.0.0.0 --port 8000

返回结果怎么看

文档给的返回示例结构是:

  • choices: 数组

  • choices[0].message.role/content

  • usage.prompt_tokens / completion_tokens / total_tokens 

你在 Python 里通常取:

data["choices"][0]["message"]["content"]

 

posted on 2026-01-25 13:35  whatai  阅读(0)  评论(0)    收藏  举报