Instructor

Stars

基于 Pydantic 的 LLM 结构化输出框架,将响应模型、验证、重试与多提供商适配统一到类型安全的 Python 接口,支持 OpenAI、Anthropic、Gemini、Bedrock 等主流模型服务。

GEMINI REQUEST PIPELINE · INPUT OWNERSHIP

补全请求参数,不代表可以改写调用者的配置

外层字典被复制后,嵌套映射仍可能指向同一个对象;真正的输入隔离必须切断这条别名关系。

CALLER-OWNED CONFIGsafety_settings
HATEBLOCK_ONLY_HIGH
id: config_A
BEFORE · SHALLOW COPY
result = kwargs.copy()nested mappingconfig_A ↔ config_A
apply defaultsCALLER MUTATED
AFTER · DETACHED MERGE
INPUTconfig_A→ copy →OUTPUTconfig_B
input unchanged ✓identity differs ✓defaults applied ✓
NO SHARED MUTABLE STATE
隐蔽副作用

默认阈值写回了调用方字典

`update_gemini_kwargs()` 虽然复制了最外层请求参数,却继续复用调用者传入的嵌套 `safety_settings` 映射;合并 Gemini 默认阈值时会原地修改应用持有的配置,使同一字典在后续请求中携带 Instructor 写入的状态。

对象边界

浅拷贝没有隔离嵌套映射

外层浅拷贝只隔离字典壳,不能改变嵌套可变对象仍被共享的事实。请求规范化应把调用方输入视为只读:既要把默认阈值写入即将发送的请求,也必须保证返回映射与原对象不再别名,避免一次调用改变之后的应用行为。

安全合并

先复制 safety settings,再应用默认值

在应用默认阈值前显式复制 `safety_settings`,再把独立映射写回结果;回归测试同时锁定三条契约:原始配置保持不变、输出不与输入共享对象身份、发送给 Gemini 的默认安全阈值仍然完整生效。

上游采用

代码、测试与原 PR 署名进入主分支

PR #2551 随维护者的整合 PR #2566 进入 `main`:合并说明明确将其列为 superseded contribution,并保留原始 provider contributor commits 与作者;1.16.1 Changelog 单独链接 #2551,维护者关闭原 PR 时也确认修复已整合并致谢。