虚构服务 example-chat（模型标识 example-model-id）的事件流记录
协议：Server-Sent Events。本服务的帧只有一行 data:，没有 event: 行；
本服务的结束约定是最后一条 "type":"message_stop"。
注意：这是本课程虚构的事件类型，不同服务定义自己的类型与结束约定，不能对所有服务硬编码同一个结束字符串。
以下内容全部虚构，域名为保留示例域名。

===== 记录 1：正常结束的流 =====

data: {"type":"message_start","id":"demo-s-001","model":"example-model-id"}

data: {"type":"text_delta","text":"周六"}

data: {"type":"text_delta","text":""}

data: {"type":"text_delta","text":"有图书交换活动。"}

data: {"type":"message_stop","id":"demo-s-001","reason":"completed"}


===== 记录 2：收到了内容，但没有正常结束 =====

data: {"type":"message_start","id":"demo-s-002","model":"example-model-id"}

data: {"type":"text_delta","text":"旧书修复工作坊"}

data: {"type":"text_delta","text":"定于 11 月"}

（此处连接断开。日志里没有 message_stop，也没有 error 帧；无法从流本身判断原因。）


===== 记录 3：中途出现明确的错误帧 =====

data: {"type":"message_start","id":"demo-s-003","model":"example-model-id"}

data: {"type":"text_delta","text":"报名截止"}

data: {"type":"error","code":"upstream_timeout","message":"上游生成中断","request_id":"demo-s-003"}


===== 记录 4：块边界标注版（一条块里挤了两条事件，另一条事件跨两块） =====

下面用 [块 n] 标出网络一次读到的字节边界，标记本身不属于流内容。

[块 1]
data: {"type":"text_delta","text":"二楼"}

data: {"type":"text_
[块 1 到此结束]

[块 2]
delta","text":"多功能厅"}

data: {"type":"message_stop","id":"demo-s-004","reason":"completed"}
[块 2 到此结束]


===== 关于字节边界的三点提醒 =====

1. 一条事件可能被拆成多块，多条事件也可能落在同一块里，两者都不违规。
2. 本包的 chunk-01/02/03.txt 是**按字符边界**切开的，方便肉眼拼接；真实字节块可能把一个汉字
   的三个 UTF-8 字节切到两处，按块直接转成文本就会得到乱码，需要用支持连续解码的方式处理。
3. 事件之间的分隔方式由 SSE 协议规定，不能假设「换行」总是一次收到。
