news 2026/11/4 22:06:44

一篇文章讲清楚:中转API如何用Python调用ChatGPT

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一篇文章讲清楚:中转API如何用Python调用ChatGPT

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

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

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


这套中转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)文档示例包含这些字段:model、messages、temperature、top_p、n、stream、stop、max_tokens、presence_penalty、frequency_penalty、logit_bias、user、response_format、seen、tools、tool_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"]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 2:55:29

keycloak测试11.0.2 for windows

keycloak测试11.0.2PasswordClient credentialsIntrospectionAuthorization codePassword 应用于后端处理: set KEYCLOAK_HOSThttp://keycloak.demofor.com.cn/ set KEYCLOAK_REALMkeycloak-learn set CLIENT_IDchapter-1 set CLIENT_SECRET149240f3-31c6-46dc-bab4-0b53c0ee1…

作者头像 李华
网站建设 2026/11/5 1:50:36

电气设计的隐藏外挂:1:1元器件图库实战

电气高低压成套元器件 几乎每个厂家的元器件都画出来了尺寸大小电气高低压成套元器件 几乎每个厂家的元器件都画出来了尺寸大小型号都有,应有尽有,全部1:1尺寸,直接标注就OK配电柜设计现场最要命的场景:左手抓着某厂家的断路器样本…

作者头像 李华
网站建设 2026/11/4 15:09:59

珲春推荐烤肉哪家无广

珲春无广烤肉推荐:延炭乳酸菌烤肉 在珲春这座美食之城,烤肉是当地极具特色的美食之一。若想寻找一家无广且高品质的烤肉店,延炭乳酸菌烤肉是不可错过的选择。 主打健康概念 延炭乳酸菌烤肉以其独特的健康理念脱颖而出。店内用乳酸菌腌制肉类…

作者头像 李华
网站建设 2026/11/3 5:21:14

基于BP神经网络的迭代优化实现(MATLAB)

一、MATLAB实现代码 1. 网络结构定义 %% 网络参数设置 input_neurons 2; % 输入层神经元数 hidden_neurons 3; % 隐藏层神经元数 output_neurons 1; % 输出层神经元数 learning_rate 0.1; % 学习率 epochs 10000; % 迭代次数%% 权重初始化(He初始化…

作者头像 李华
网站建设 2026/11/2 2:55:35

Java分布式系统开发与实践!

我们都知道,目前大型网站跟企业级应用目前的要求都是达到“互联网三高”,这时传统的集中式系统肯定是无法满足基本的需求的,越来越多的企业的系统架构目前都是向着分布式系统的方向演进。分布式系统的特征分布式系统相对于传统的集中式系统来…

作者头像 李华
网站建设 2026/11/4 6:36:28

灵活就业简历制作难?项目导向模板下载,HR一眼认可

不同求职场景,简历误区各不相同?校招应届生分不清实习和校招简历重点,要么堆砌校园经历,要么遗漏实习成果;跨行业转行想突破壁垒,却不会衔接过往经历、突出可迁移技能;职场深耕3-5年&#xff0c…

作者头像 李华