模型切换涉及三个值:当前 ModelInfo、Session 持有的 Base Instructions、History 中模型可见的切换说明。ModelInstructionsState 只在模型身份真正变化且存在切换指令时发消息;PersonalityState 则判断人格是否已经烘焙进基础指令,避免重复注入。
Model section 只保存模型标识
ModelInstructionsState.snapshot() 返回当前模型 slug。它还接收 previous model 和本次切换指令,用于没有已知 baseline 的恢复边界判断:若前后模型不同且说明非空,生成 Developer 片段;模型未变则不发。
def render_model_diff(current, previous):
changed = (
previous.value != current.model
if previous.is_known
else current.previous_model not in (None, current.model)
)
return ModelSwitchFragment(current.instructions) if changed and current.instructions else None
Personality 有“烘焙”和“附加”两条路径
模型模板若包含 Personality 占位,初始人格已经进入 Base Instructions;personality_is_baked 为真时不再创建重复片段。无法烘焙的模型或运行中人格变化,才由 PersonalityState 生成独立 Developer 更新。
def resolve_personality_delivery(model, personality, previous):
baked = model.supports_personality_template
base = model.instructions_for(personality)
fragment = None
if not baked and personality_changed(previous, model.slug, personality):
fragment = model.personality_instructions(personality)
return base, fragment
Personality Snapshot 同时包含 model 和 personality,因为换模型后即使人格枚举相同,渲染方式也可能不同。只比较 personality 会漏掉这种转换。
前后顺序
初始上下文发现模型切换片段时把它放到 Developer bundle 首部,使后续项目规则和模式说明在新模型合同之下解释。后续变化按 World State 分区稳定顺序记录。
错误实现包括:切换模型时无条件替换 Session Base Instructions、把同一人格同时写入顶层和 History、只比较人格不比较模型。对应测试要覆盖无变化去重、模型变更、人格变更和 baked 分支。
源码与测试锚点
codex-rs/core/src/context/world_state/model.rs。codex-rs/core/src/context/world_state/personality.rs。codex-rs/protocol/src/openai_models.rs::get_model_instructions。codex-rs/core/src/context/world_state/model_tests.rs与personality_tests.rs。
评论
登录后即可评论