Prompt-only 规范化不仅修调用配对,还根据目标模型的输入模态处理图片与音频。原则是保留事件存在的语义、移除模型无法消费的载荷:消息或工具结果里的媒体替换为明确文本,占位符告诉模型内容因能力不支持而省略。
图片处理覆盖三处
当 InputModality::Image 不可用时,Message 中的 InputImage、Function/Custom output content 中的图片都替换为文本;ImageGenerationCall.result 则直接清空,防止大结果继续进入请求。
def strip_images(items):
for item in items:
if item.is_message or item.is_tool_output:
item.content = [
Text("image content omitted because you do not support image input")
if part.is_image else part
for part in item.content
]
elif item.is_image_generation_call:
item.result.clear()
Audio 同样覆盖 Message 与 Function/Custom output,但不涉及 ImageGenerationCall。模型支持对应模态时函数立即返回,不做无意义重写。
为什么不直接删除整个消息
一条消息可能同时含文字和图片。删除整个 item 会丢掉仍可处理的文字,还可能改变调用/结果结构;只删媒体 part 又会让模型不知道此处曾有关键输入。显式占位兼顾结构与可解释性。
def project_history(raw, modalities):
projected = deep_copy(raw)
repair_call_pairs(projected)
if "image" not in modalities:
strip_images(projected)
if "audio" not in modalities:
strip_audio(projected)
return projected
Responses Lite 还有一层独立处理:它可以保留图片 URL,但移除 detail 字段。那是请求方言适配,不等同于模型不支持图片。
源码与测试锚点
codex-rs/core/src/context_manager/normalize.rs:媒体占位和调用修复。codex-rs/core/src/client_common.rs::strip_image_details:Responses Lite 适配。codex-rs/core/src/context_manager/history_tests.rs:Message 与 Tool output 多模态测试。
评论
登录后即可评论