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 #2551 相关修复已随 Instructor v1.17.0 正式发布
  • Gemini 安全配置只读修复
  • Release Notes 直接列出 PR #2551
  • 正式版本已发布
查看正式版本