# ============================================================
# 示例:用 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