消息、内容、上下文与能力矩阵:练习答案
答案用于核对,不是正文首次实验的前置。先运行每篇正文中的完整代码,再把变体单独保存。
练习解答
输入封装与跨平台映射
为 Part 增加 call_id: str | None = None,并在 validate 中加入:
python
if part.type == 'tool_result' and not part.call_id:
raise ValueError('tool result needs call id')1
2
2
文本适配器应显式返回:
python
def map_for_text_only_provider(request):
unsupported = [part.type for m in request.messages for part in m.parts
if part.type in {'image', 'file'}]
if unsupported:
return {'status': 'unsupported_content', 'types': sorted(set(unsupported))}
return {'status': 'ready'}1
2
3
4
5
6
2
3
4
5
6
重试沿用 task_id,因为它仍是同一业务目标;每次实际生成使用新的 call_id,这样日志可以区分新调用与重放。
上下文窗口与历史裁剪
第一题的固定输入为 24、输出预留为 20,窗口按正文 pack 的 remaining 计算;先放最新 42-token 工具轮,再放 28-token 轮,若安全策略轮属于不可删除的固定输入,应先从预算中扣除,不能将它作为普通历史混入。第二题要求 tool_pair 同时保留调用 ID 与来源版本;第三题的摘要至少保存 source_message_ids、summary_model_version、created_at 和 open_questions,摘要文本不能替代原始证据。
多模态输入与能力矩阵
能力矩阵应把 (provider, model, api_version, region, auth_mode) 作为键,值记录文本、图片、文件、工具、结构化、流式和缓存的验证状态。未知键抛 LookupError,缺失能力抛 ValueError。图片不支持时返回结构化降级结果,例如:
python
{'status': 'degraded', 'mode': 'ocr', 'degraded': True,
'source_id': 'upload-7', 'source_version': 'sha256:...'}1
2
2
不能返回普通回答,因为那会隐藏模型没有看到图片这一事实。验证记录应附实际输入、响应状态、SDK 与 API 版本、区域、认证模式和时间。