你用 AI App 时,账号、网络连接和模型请求都由 App 替你处理。用 Python 调 API,则是自己把一句任务发给服务商,再从返回数据里取出回答。下面用一条虚构的读书会通知走完整个过程,大约 25 分钟,已有 Python 环境即可,不必安装额外的 Python 套件。
如果你平时只用手机或网页聊天,这篇可以跳过。API 是给想把 AI 接进脚本、表格流程或自己做的小程序的人准备的。
开始前要准备什么
| 准备项 | 说明 |
|---|---|
| Python | Python 3.9 或更新版本;没安装可先看Python 安装与运行 |
| 百炼账号和 API Key | 创建 Key 需要登录阿里云百炼;Key 与地域对应,调用和费用也归属于账号 |
| 一段虚构文本 | 本例只发送读书会日期、时间和地点,不要拿真实个人资料练习 |
| 网络 | 电脑需要能连接你选择的 API 服务 |
API Key 是能代表账号调用服务的秘密凭据。一次请求可能产生费用;不要把 Key 放进代码、截图、聊天、公开仓库或练习包。下方脚本会先读取 DASHSCOPE_API_KEY 环境变量;没有设置时,会在终端以不显示输入内容的方式询问。脚本不会把 Key 写入文件或打印出来;环境变量会保留在当前终端会话中,按提示输入则只在该次程序运行时使用。
第一步:确认 Key 和接口地址
在百炼控制台为要使用的地域创建或查看 API Key。不同地域的 Key 不通用;本文用北京地域接口举例。代码里先使用百炼仍支持的兼容域名:
https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
百炼建议优先迁移到业务空间专属域名,格式与官方接口说明一致:
https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/chat/completions
{WorkspaceId}要替换成自己百炼控制台里的业务空间 ID。不要把花括号占位符照抄成真实地址。先用本文兼容域名跑通练习;如果账号、地域或服务要求不同,请使用控制台给出的地址,并保证它与 Key 属于同一地域。
第二步:保存并运行脚本
下载完整示例包,把 d9_first_request.py 放到电脑上一个新建文件夹里。在终端进入该文件夹后运行:
macOS / Linux:python3 d9_first_request.py
Windows: py d9_first_request.py
如果已在环境变量中设置 DASHSCOPE_API_KEY,脚本会直接使用它;否则终端会显示 请输入百炼 API Key(输入内容不会显示):。粘贴 Key 后按回车即可。屏幕上看不到输入字符是正常的,程序不会把 Key 打印出来或保存到文件。
脚本使用 Python 自带的 urllib、json 和 getpass,不必执行 pip install。完整代码如下:
import getpass
import json
import os
import sys
import urllib.error
import urllib.request
API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
MODEL = "qwen3.8-27b"
def main():
api_key = os.environ.get("DASHSCOPE_API_KEY")
if not api_key:
api_key = getpass.getpass("请输入百炼 API Key(输入内容不会显示):").strip()
if not api_key:
sys.exit("没有输入 Key,程序已结束。")
request_body = {
"model": MODEL,
"messages": [
{
"role": "user",
"content": "请把这条虚构通知整理成一句话,保留日期、时间和地点:社区读书会,2026年11月7日14:00,河畔图书馆二楼。",
}
],
"max_tokens": 64,
"stream": False,
}
request = urllib.request.Request(
API_URL,
data=json.dumps(request_body, ensure_ascii=False).encode("utf-8"),
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
method="POST",
)
try:
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)
except urllib.error.HTTPError as error:
print(f"请求失败:HTTP {error.code}。检查接口、模型、Key 地域和账号额度。")
try:
details = json.load(error).get("error", {}).get("message", "")
if api_key:
details = details.replace(api_key, "[已隐藏]")
if details:
print("服务端提示:" + details)
except (ValueError, AttributeError):
pass
sys.exit(1)
except (urllib.error.URLError, TimeoutError):
print("连接失败或超时。先检查网络和接口地址;脚本不会自动重试。")
sys.exit(1)
try:
answer = result["choices"][0]["message"]["content"]
except (KeyError, IndexError, TypeError):
sys.exit("请求有返回,但找不到回答字段;请按服务商文档检查响应结构。")
print("模型:" + result.get("model", MODEL))
print("AI 回复:" + answer.replace(api_key, "[已隐藏]"))
usage = result.get("usage", {})
if usage:
print("输入 Token:" + str(usage.get("prompt_tokens", "未知")))
print("输出 Token:" + str(usage.get("completion_tokens", "未知")))
print("合计 Token:" + str(usage.get("total_tokens", "未知")))
if __name__ == "__main__":
main()
这段程序做了四件事:从环境变量或隐藏输入中读取 Key;把任务和模型名装进 JSON;用 POST 请求发送到接口;解析响应中的回答和 Token 用量。它不会保存输入、回答或 Key,也不会在失败时自动重发,因此网络超时后先检查账单或调用记录,再决定是否重试。
第三步:检查返回结果
成功时终端会打印模型名称、AI 回答以及服务端返回的 Token 用量。回答可能与示例不同,先核对日期、时间和地点是否都保留。响应结构里 choices[0].message.content 是回答,usage 是本次请求的用量;可以回看API 请求各部分的解释。
本次实测使用一条虚构通知,服务端返回 HTTP 200,模型为 qwen3.8-27b,回答保留了日期、时间和地点。usage 返回输入 85 Token、输出 105 Token。按 2026-10-12 百炼北京地域标价(输入每百万 Token 3 元、输出每百万 Token 12 元)估算,列表价约为 0.001515 元:
85 ÷ 1,000,000 × 3 + 105 ÷ 1,000,000 × 12 = 0.001515 元
账号免费额度、缓存或活动优惠会改变实际账单,价格也可能更新;真正扣费以控制台账单为准。不要把这一次很短的任务理解成所有请求都有同样费用。
失败时先检查什么
脚本会显示 HTTP 状态码,但不自动重试。常见情况可以这样排查:
| 现象 | 优先检查 |
|---|---|
| HTTP 400 | JSON 格式、字段名、模型名和必填参数 |
| HTTP 401 | Key 是否完整,以及 Key 和接口地址是否属于同一地域 |
| HTTP 403 | 服务是否开通、Key 是否有模型权限 |
| HTTP 404 | 接口地址和模型名是否有效 |
| HTTP 429 | 频率限制、额度和账单状态;不要连续重试 |
| 连接失败或超时 | 网络、接口地址和服务状态;确认是否已有请求成功,再重试 |
查错时只分享状态码和已遮住的错误信息。绝不要把完整 Key 贴到截图或求助消息中。服务端提示和字段可能变化,具体原因以百炼错误码文档为准。
再练一次
把示例里的“整理成一句话”换成另一条不含个人资料的任务,再运行一次。运行前先估算最多会发送多少文字;运行后把输出事实与原文逐项核对,并记录模型、日期、输入/输出 Token 和实际账单。完成后可继续阅读 API Key 与费用,或返回 D8 看懂请求结构。
本篇实测只使用虚构文字通知,没有上传文件,也没有记录或公开 API Key。模型名称、接口地址和单价均可能更新;使用时请查看百炼的接口说明、Key 指引和价格表。封面背景由 AI 生成,标题另行排版。