💻 源码
# ============================================================
# 示例:用 OpenAI SDK 调用阿里云百炼 Responses API
# 对应补充材料:04_资料/Day01/补充资料/Completions_API与Responses_API对比说明.md
# 整体流程:导入库 → 创建客户端 → 构造 input → 发起请求 → 解析 output 并打印
# ============================================================

# import os:导入 Python 标准库,用于读取环境变量(如 API Key)
import os

# from openai import OpenAI:从 openai 包引入客户端类
# 虽然叫 OpenAI SDK,但通过 base_url 可指向阿里云百炼的兼容接口
from openai import OpenAI

# ------------------------------------------------------------------
# 第 1 步:创建 API 客户端
# 注意:Responses API 使用的 base_url 与 Chat Completions 不同(见补充材料对比表)
# ------------------------------------------------------------------
client = OpenAI(
    # api_key:百炼平台的 API 密钥,从环境变量 DASHSCOPE_API_KEY 读取
    api_key=os.getenv("DASHSCOPE_API_KEY"),

    # base_url:Responses API 的百炼兼容地址(v2 协议)
    # 与 01 号文件的 compatible-mode/v1 不同,这里是 v2/apps/protocols/compatible-mode/v1
    base_url="https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
)

# ------------------------------------------------------------------
# 第 2 步:发起 Responses API 请求
# client.responses.create(...):OpenAI 新一代「响应式」接口(非 chat.completions)
# ------------------------------------------------------------------
response = client.responses.create(
    # model:指定调用的模型名称
    model="qwen3.7-plus",

    # input:本次请求的输入内容(Responses API 用 input,而非 Completions 的 messages)
    # 可以是简单字符串,也可以扩展为结构化 item 数组(多轮、多模态等场景)
    input="9.9和9.11哪个大?",

    # extra_body:附加到请求体的扩展参数,会原样传给百炼服务端
    extra_body={
        # enable_thinking:是否开启深度思考模式
        # False = 关闭(本示例直接要最终答案);True = 开启,output 中会出现 reasoning 类型 item
        "enable_thinking": False
    }
)

# ------------------------------------------------------------------
# 第 3 步:解析并打印 response.output 中的各类输出项
# Responses API 的核心特点:一次响应的 output 是「多种类型的 item 列表」,而非单一 message
# ------------------------------------------------------------------
print(response)
# response.output:输出项列表,每个 item 有 type 字段标识类型
# for item in ...:遍历每一个输出项,按 type 分别处理
for item in response.output:

    # item.type == "reasoning":该 item 是模型的思考/推理过程(需 enable_thinking=True 才会出现)
    if item.type == "reasoning":
        print("【推理过程】")
        # item.summary:推理摘要列表,每项含 text 字段
        for summary in item.summary:
            # summary.text[:500]:只取前 500 个字符,避免控制台输出过长
            print(summary.text[:500])
        print()  # 空行,分隔不同区块

    # item.type == "message":该 item 是模型的最终正式回复
    elif item.type == "message":
        print("【最终答案】")
        # item.content:正文片段列表;content[0].text 取第一段文本
        print(item.content[0].text)

# 程序结束。若 enable_thinking=True,通常会先打印 reasoning,再打印 message