你用 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 生成,标题另行排版。