Python 调用 8848AI API 完整教程:requests 和 openai 库两种方式详解
Python 调用 8848AI API 完整教程:requests 和 openai 库两种方式详解
你兴冲冲写好了 Python 代码,import openai,填好 API Key,运行——
ConnectionError: HTTPSConnectionPool: Max retries exceeded
换个节点再试——403 Forbidden。
折腾两小时,翻遍 Stack Overflow,一行有效的 AI 输出都没拿到。
这不是你的代码问题,这是中国开发者调用 OpenAI/Anthropic 官方 API 的三道必经之坎:网络不稳定、支付门槛高(需要境外信用卡)、账号随时可能被封。
今天这篇教程,就是要彻底终结这种体验。
我们用 8848AI(api.884819.xyz)作为 API 中转平台——国内网络直连、人民币充值、一个 Key 调用 GPT-4o / Claude 3.5 / Gemini 等全系模型。我会手把手演示两种最主流的 Python 调用方式,读完即可上手,不废话。
---
一、准备工作:5 分钟搞定环境与密钥
1.1 获取 API Key
打开 8848AI 官网([api.884819.xyz](https://api.884819.xyz)),注册账号并登录。新用户注册即有免费额度,足够跟完本教程所有示例。
进入控制台 → API Keys → 点击「创建新密钥」,复制生成的 Key(格式类似 sk-xxxxxxxxxxxxxxxx)。
⚠️ 安全提示:API Key 是你的账户凭证,绝对不要硬编码进代码里,更不要上传到 GitHub。
1.2 配置环境变量
把 Key 写入环境变量是最佳实践:
# macOS / Linux
export OPENAI_API_KEY="sk-你的密钥"
Windows PowerShell
$env:OPENAI_API_KEY="sk-你的密钥"
或者在项目根目录创建 .env 文件(记得加入 .gitignore):
OPENAI_API_KEY=sk-你的密钥
1.3 安装依赖库
pip install requests openai python-dotenv
1.4 环境自检脚本
运行以下脚本,确认所有准备工作就绪:
# check_env.py
import os
import sys
import requests
from dotenv import load_dotenv
load_dotenv()
print(f"Python 版本: {sys.version}")
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
print("❌ 未找到 OPENAI_API_KEY,请检查环境变量配置")
sys.exit(1)
print(f"✅ API Key 已加载: {api_key[:8]}{'' 20}")
BASE_URL = "https://api.884819.xyz/v1" # 8848AI 接口地址
try:
resp = requests.get(f"{BASE_URL}/models",
headers={"Authorization": f"Bearer {api_key}"},
timeout=10)
if resp.status_code == 200:
models = resp.json().get("data", [])
print(f"✅ 接口连通,当前可用模型数量: {len(models)}")
else:
print(f"❌ 接口返回异常: {resp.status_code}")
except Exception as e:
print(f"❌ 连接失败: {e}")
看到三个 ✅,说明你已经准备好了。接下来进入正题。
---
二、方式一:用 requests 库"裸调" API
为什么要学这种方式?
requests 方式不依赖任何 AI SDK,让你真正理解 API 通信的本质——本质上就是一个 HTTP POST 请求,带着你的 Key 和对话内容,发到服务器,拿回 JSON 响应。理解了这个,你就能把 AI 能力嵌入任意框架,不受 SDK 版本限制。
2.1 基础对话调用
# requests_basic.py
import os
import requests
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = "https://api.884819.xyz/v1" # 8848AI 接口地址
def chat(message: str, model: str = "gpt-4o") -> str:
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
body = {
"model": model,
"messages": [
{"role": "user", "content": message}
],
"temperature": 0.7,
"max_tokens": 1024,
}
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=body,
timeout=30,
)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
if __name__ == "__main__":
reply = chat("用一句话解释什么是大语言模型")
print(reply)
运行后,终端会打出 AI 的回复。恭喜——你刚刚完成了第一次 AI API 调用。
2.2 多轮对话(携带上下文)
单轮对话解决不了实际需求,多轮对话的关键是把历史消息一起发给 API:
# requests_multi_turn.py
import os
import requests
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = "https://api.884819.xyz/v1" # 8848AI 接口地址
def multi_turn_chat():
history = [] # 存储对话历史
while True:
user_input = input("你: ").strip()
if user_input.lower() in ("exit", "quit", "q"):
break
history.append({"role": "user", "content": user_input})
response = requests.post(
f"{BASE_URL}/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"},
json={"model": "gpt-4o", "messages": history},
timeout=30,
)
response.raise_for_status()
assistant_msg = response.json()["choices"][0]["message"]
history.append(assistant_msg) # 把 AI 回复也存入历史
print(f"AI: {assistant_msg['content']}\n")
if __name__ == "__main__":
multi_turn_chat()
2.3 流式输出(SSE 解析)
流式输出让回复像打字机一样逐字显示,用户体验远好于"等待 → 一次性输出":
# requests_stream.py
import os
import json
import requests
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = "https://api.884819.xyz/v1" # 8848AI 接口地址
def stream_chat(message: str):
response = requests.post(
f"{BASE_URL}/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"},
json={
"model": "gpt-4o",
"messages": [{"role": "user", "content": message}],
"stream": True, # 开启流式
},
stream=True, # requests 也要开启流式读取
timeout=60,
)
response.raise_for_status()
print("AI: ", end="", flush=True)
for line in response.iter_lines():
if not line:
continue
line = line.decode("utf-8")
if line.startswith("data: "):
data = line[6:]
if data == "[DONE]":
break
chunk = json.loads(data)
delta = chunk["choices"][0]["delta"].get("content", "")
print(delta, end="", flush=True)
print() # 换行
if __name__ == "__main__":
stream_chat("写一首关于程序员的五言绝句")
---
三、方式二:用 openai 官方库"无缝迁移"
最大的惊喜:只改两行代码
如果你已有基于 OpenAI SDK 的项目,迁移到 8848AI 只需修改两个参数:
# 原来的代码
client = openai.OpenAI(api_key="sk-官方key")
改成这样,其他代码零改动
client = openai.OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://api.884819.xyz/v1", # 8848AI 接口地址
)
就这两行。你所有的上层业务逻辑、Prompt 模板、对话管理代码,全部不用动。
3.1 同步调用
# openai_basic.py
import os
import openai
from dotenv import load_dotenv
load_dotenv()
client = openai.OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://api.884819.xyz/v1", # 8848AI 接口地址
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Python 和 Go 各适合什么场景?"}],
temperature=0.7,
max_tokens=1024,
)
print(response.choices[0].message.content)
print(f"\n📊 Token 用量 | 输入: {response.usage.prompt_tokens} | 输出: {response.usage.completion_tokens}")
3.2 异步调用(asyncio)
高并发场景下,异步调用能显著提升吞吐量:
# openai_async.py
import os
import asyncio
import openai
from dotenv import load_dotenv
load_dotenv()
async_client = openai.AsyncOpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://api.884819.xyz/v1", # 8848AI 接口地址
)
async def async_chat(prompt: str) -> str:
response = await async_client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content
async def main():
# 并发发送 3 个请求
tasks = [
async_chat("解释递归"),
async_chat("解释闭包"),
async_chat("解释装饰器"),
]
results = await asyncio.gather(*tasks)
for i, result in enumerate(results, 1):
print(f"--- 回复 {i} ---\n{result}\n")
if __name__ == "__main__":
asyncio.run(main())
3.3 流式输出
# openai_stream.py
import os
import openai
from dotenv import load_dotenv
load_dotenv()
client = openai.OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://api.884819.xyz/v1", # 8848AI 接口地址
)
stream = client.chat.completions.create(
model="claude-3-5-sonnet-20241022", # 换个模型试试
messages=[{"role": "user", "content": "给我讲一个程序员的睡前故事"}],
stream=True,
)
print("AI: ", end="", flush=True)
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
print(delta, end="", flush=True)
print()
---
四、两种方式怎么选?
| 对比维度 | requests 裸调 | openai 官方库 | | 代码量 | 稍多,需手动构造请求 | 少,SDK 封装完善 | | 学习曲线 | 需理解 HTTP/JSON 结构 | 几乎零门槛 | | 灵活性 | ⭐⭐⭐⭐⭐ 完全自定义 | ⭐⭐⭐ 受 SDK 约束 | | 功能完整度 | 取决于你自己实现多少 | 开箱即用,含异步/流式/函数调用 | | 迁移成本 | 无历史包袱 | 已有 OpenAI 项目:改两行搞定 | | 推荐场景 | 嵌入特殊框架、学习原理 | 新项目首选、快速开发 | 结论:新项目直接用 openai 库;有历史 OpenAI 项目直接改两行迁移;需要深度定制或理解底层原理时选 requests。---
五、生产级封装与避坑指南
5.1 常见错误码速查
| 状态码 | 含义 | 解决方案 | | 401 | API Key 无效或过期 | 检查 Key 是否正确,是否已过期 | | 403 | 无权访问该模型 | 确认账户余额,检查模型名称是否正确 | | 429 | 请求频率超限 | 添加重试机制,指数退避 | | 500 | 服务端错误 | 稍后重试,或切换备用模型 | | 503 | 服务暂时不可用 | 等待后重试 |5.2 生产级封装工具类
这段代码包含了重试机制、超时处理、Token 统计和日志记录,可以直接复制进项目:
# ai_client.py —— 生产级封装,可直接复用
import os
import time
import logging
import openai
from dotenv import load_dotenv
load_dotenv()
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger(__name__)
class AIClient:
def __init__(self, model: str = "gpt-4o", max_retries: int = 3, timeout: int = 30):
self.client = openai.OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://api.884819.xyz/v1", # 8848AI 接口地址
timeout=timeout,
)
self.model = model
self.max_retries = max_retries
self.total_tokens = 0 # 累计 Token 用量
def chat(self, messages: list, **kwargs) -> str:
"""带重试机制的对话调用"""
for attempt in range(1, self.max_retries + 1):
try:
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
**kwargs,
)
usage = response.usage
self.total_tokens += usage.total_tokens
logger.info(f"本次 Token | 输入:{usage.prompt_tokens} 输出:{usage.completion_tokens} | 累计:{self.total_tokens}")
return response.choices[0].message.content
except openai.RateLimitError:
wait = 2 ** attempt # 指数退避:2s, 4s, 8s
logger.warning(f"触发限速,{wait}s 后重试(第 {attempt} 次)")
time.sleep(wait)
except openai.APITimeoutError:
logger.warning(f"请求超时,重试中(第 {attempt} 次)")
except openai.APIError as e:
logger.error(f"API 错误: {e}")
if attempt == self.max_retries:
raise
raise RuntimeError(f"重试 {self.max_retries} 次后仍然失败")
def cost_estimate(self, input_price_per_1k: float = 0.005,
output_price_per_1k: float = 0.015) -> str:
"""估算费用(单位:元)"""
cost = self.total_tokens / 1000 * ((input_price_per_1k + output_price_per_1k) / 2)
return f"累计消耗 {self.total_tokens} tokens,预估费用约 ¥{cost:.4f}"
使用示例
if __name__ == "__main__":
client = AIClient(model="gpt-4o")
reply = client.chat([
{"role": "system", "content": "你是一个专业的 Python 代码审查专家"},
{"role": "user", "content": "帮我审查这段代码的性能问题:for i in range(len(lst)): print(lst[i])"},
])
print(reply)
print(client.cost_estimate())
5.3 几个实用建议
关于 temperature:创意写作用 0.8-1.0,代码生成用 0.1-0.3,问答类用 0.5-0.7。 关于 max_tokens:不要设置过小,否则回复会被截断。GPT-4o 支持最大 4096 输出 token,日常对话设 1024 够用。 关于成本控制:system prompt 越短越省钱;多轮对话要控制历史长度,超过 10 轮可以做摘要压缩;开发调试阶段用gpt-4o-mini,成本约为 GPT-4o 的 1/15。
---
写在最后
回到最开头那个场景——Connection Timeout,403 Forbidden,两小时零产出。
今天跟完这篇教程,你已经能用两种方式稳定调用 GPT-4o、Claude 3.5 等顶级模型,还有一个可以直接复制进项目的生产级工具类。
网络不是门槛,支付不是门槛,不动手才是唯一的门槛。现在打开终端,跑起来第一段代码吧。
---
📌 资源汇总
- 8848AI 官网:[api.884819.xyz](https://api.884819.xyz)
- API 文档:[api.884819.xyz/docs](https://api.884819.xyz/docs)
- 模型与价格:[api.884819.xyz/pricing](https://api.884819.xyz/pricing)
---
🔜 下一篇预告
>
今天我们学会了调用 API——但 API 只是起点。
>
你有没有想过,把这个能力包装成一个微信聊天机器人,让朋友直接在微信里跟 GPT-4o 对话?或者做成飞书工作助手,帮团队自动处理日报、会议纪要?
>
下一篇《用 Python + 8848AI 搭建你的第一个 AI 聊天机器人(微信 / 飞书 / Telegram 三平台实战)》,我们将基于今天写的 AIClient 工具类,30 分钟内部署一个真正能对话的 AI Bot——代码你已经有了一半。
>
关注收藏,下周见。
---
本文由8848AI原创,转载请注明出处。