# 完成后的自查

用自己的程序实际操作一次，把结果记进自己的 README。下面是帮助你查错的场景，不是额外的评分表。

## 先检查作业的主要功能

| 操作 | 观察什么 |
| --- | --- |
| 发送一个简单问题 | 得到真实模型回答，已不再使用演示函数 |
| 先给出一个新信息，再追问它 | 实际请求包含此前问答；页面也能显示整段历史 |
| 新建对话后发送问题 | 新会话从空历史开始，请求不含旧会话的消息 |
| 回到旧会话并继续提问 | 原来的记录仍在，后续请求属于这段会话 |
| 在第二段会话中连续发送两次 | 页面、表单提交和跳转始终指向同一个编号 |

调试时可以临时打印发送的消息列表，确认实际内容；不要只凭模型“好像记住了”判断，也不要打印 Key 或认证头。完成检查后去掉不需要的调试输出。

## 再检查容易出错的情况

- 发送空白：应给提示，不调用模型，也不增加历史。
- 输入 `<b>你好</b>` 或带多行的文字：页面应显示原文，不把它当成 HTML 执行。
- 成功发送后刷新：不会重新调用模型或重复追加问答。
- 模型调用失败：已有历史不变，页面有提示。可以临时使用无效模型名做一次检查，随后恢复；也可以在自己的本地调试中模拟失败。
- 打开 `/?chat=abc`、`/?chat=-1` 或不存在的编号：程序拒绝这个地址，不选错会话。
- 停止后重启：确认历史是否仍在，并在 README 如实说明。教程中的内存列表实现会丢失记录。

## 能解释这些地方，就更容易自己改动

浏览器里的 `name="question"` 与 Python 的哪一行相对应？为什么历史不能在 `index()` 中每次初始化？为什么新建会话要追加空列表？为什么成功后才保存问答？为什么选中历史可以直接引用列表，而准备请求要另建列表？

不必另交这些问题的书面答案。它们用于帮你沿着代码梳理自己的实现。