雨天小六

读懂 Codex(4.19):孤儿 Output、图片和音频的 Prompt-only 规范化

· 更新于 2026-08-02 · 专栏:读懂 Codex

#Codex#Agent Runtime#Prompt#上下文工程#软件架构

Prompt-only 规范化不仅修调用配对,还根据目标模型的输入模态处理图片与音频。原则是保留事件存在的语义、移除模型无法消费的载荷:消息或工具结果里的媒体替换为明确文本,占位符告诉模型内容因能力不支持而省略。

图片处理覆盖三处

InputModality::Image 不可用时,Message 中的 InputImage、Function/Custom output content 中的图片都替换为文本;ImageGenerationCall.result 则直接清空,防止大结果继续进入请求。

不支持图片或音频的模型对消息和工具结果进行降级
图 4.19-1:降级发生在模型请求副本,原始 History 仍保留媒体。以后切回支持该模态的模型,可以从原始事实重新投影。
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 又会让模型不知道此处曾有关键输入。显式占位兼顾结构与可解释性。

原始多模态历史向不同模型能力投影
图 4.19-2:同一原始 History 可分别投影给视觉模型和纯文本模型。若把降级写回原始历史,第二次切换模型时无法恢复图片。
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 多模态测试。

评论


← 返回文章列表