# 第29课学生操作单
## Q0 0—10分钟
画输入→模型服务→输出。指出model、messages、stream和max_tokens各控制什么。本页不会联网，也没有密钥框。
## Q1 10—20分钟
先在默认人工响应里找到choices[0].message.content与finish_reason，再点击“构建请求并检查响应”。记录模式为人工响应检查。分别只改HTTP状态401、content空字符串、finish_reason为length，比较三种未完成。
## Q2 20—30分钟
下载[api_client.py](../../materials/api_client.py)副本到独立classroom29文件夹，在这个文件夹打开终端。需要Python3.9+；Windows可把python3换为教师核对过的py -3。
```text
python3 --version
python3 api_client.py --model deepseek-flash
```
课堂前查[官方页面](https://api-docs.deepseek.com/)和账户可用模型。示例名核对日期2026-09-10，不把旧名当永久保证。记录dry_run_no_network、endpoint、payload。这个步骤没有回答。
在同一文件夹新建call_once.py，粘贴：
```python
from pathlib import Path
import getpass
import os
import subprocess
import sys

model_name = input("填写已核对的模型名：").strip()
question = "原创材料：周三15:00在图书馆二楼举行资料分享，报名方式未提供。请提取时间、地点、报名方式；没有的内容写未提供。"
api_key = getpass.getpass("输入API密钥（不回显）：").strip()
if not api_key or not api_key.isascii() or any(ord(c) < 33 or ord(c) > 126 for c in api_key):
    raise SystemExit("密钥格式不适合本示例，未发送请求；请按官方说明检查。")
child_env = os.environ.copy()
child_env["DEEPSEEK_API_KEY"] = api_key
child_env["PYTHONIOENCODING"] = "utf-8"
result = subprocess.run(
    [sys.executable, "api_client.py", "--model", model_name,
     "--question", question, "--live"],
    env=child_env, capture_output=True, text=True, encoding="utf-8"
)
Path("api-result.json").write_text(result.stdout, encoding="utf-8")
Path("api-stderr.txt").write_text(result.stderr, encoding="utf-8")
print(result.stdout)
if result.returncode != 0:
    print("本次未完成。检查api-result.json；若为空，再检查api-stderr.txt，不要循环重试。")
else:
    print("脚本已返回。继续核对answer、finish_reason和材料事实。")

```
## Q3 30—45分钟
已有API账户与本次额度时，运行：
```text
python3 call_once.py
```
填已核对模型名；密钥只在本机终端不回显输入，不写进文件或作业。一次运行等待结束，不反复并发重试。
打开api-result.json，记录mode、answer、finish_reason、usage是否提供；这是脚本已解析的输出，不是完整原始HTTP包。错误则保留实际类型与阶段，填写真实调用未完成。
将记录粘到本地响应框可辅助核对；人工HTTP状态不能充当真实发送证据。另以原文检查时间、地点、报名缺失是否保持。
无账户或环境时完成Q1的四类响应检查，明确“本地后备完成，真实API未完成”，之后补做。
## Q4 45—55分钟，独立不再付费调用
新材料：周五10:00在实验楼一层举行资料交流，报名方式未提供。要求同样三项提取。把材料换到prompt框，使用下列人工响应，先判断再运行：
```json
{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "时间：周五10:00；地点：实验楼一层；报名方式：未提供。"
      },
      "finish_reason": "stop"
    }
  ]
}
```
第二轮仅改finish_reason为length，说明差异。第三轮恢复stop但把响应地点改实验楼三层：结构检查是否能代替原文核对？
只有dry_run_no_network记录，能否说已取得真实模型回答？说明依据。
## Q5 55—60分钟
提交脱敏运行记录或准确的未完成记录。写请求到交付需要检查的三层。猜测写错不扣分，不能把人工样例当实测。
