PyPI / openai / 3.31.0

openai 3.31.0

Source
https://github.com/openai/openai-python
Tag scanned
v3.31.0
Compared with
v3.30.0 (0 signals introduced since)
Files
2416 scanned, 36 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 108 info
Scan time
37.7 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 61 of 61 warn and critical signals; 61 demoted to info.
Disclude version
4.0.0
Scanned (UTC)
2026-10-14 18:26

Signals

Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.

  1. info warn → info by review long-line api_reference/openapi.transformed.yml:1077:1

    line length 2410 characters (raw pass, confidence 0.65)

                data: {"type":"transcript.text.done","text":"I see skies of blue and clouds of white, the bright blessed days, the dark sacred nights, and I think to myself, what a wonderful world.","logprobs":[{"token":"I","logprob":-0.00007588794,"bytes":[73]},{"token":" see","logprob":-3.1281633e-7,"bytes":[32,115,101,1
    likely benign LLM, confidence 0.95 Long single-line JSON example of a transcript event in an API reference file.
    Reasoning

    A 2410-character line containing an inline JSON SSE event with logprobs data in an OpenAPI example; long generated example payloads are normal.

  2. line length 1879 characters (raw pass, confidence 0.50)

                    -d '{"name":"gpt-6-astra","data_source":{"type":"completions","input_messages":{"type":"template","template":[{"role":"developer","content":"Categorize a given news headline into one of the following topics: Technology, Markets, World, Business, or Sports.\n\n# Steps\n\n1. Analyze the content of the new
  3. line length 783 characters (raw pass, confidence 0.50)

                python: "from openai import OpenAI\nfrom openai.types.fine_tuning import ReinforcementMethod, ReinforcementHyperparameters\nfrom openai.types.graders import StringCheckGrader\n\nclient = OpenAI()\n\nclient.fine_tuning.jobs.create(\n  training_file=\"file-abc\",\n  validation_file=\"file-123\",\n  model=\"o4
  4. line length 516 characters (raw pass, confidence 0.50)

            description: Group the costs by the specified fields. Supported fields include `project_id`, `user_id`, `line_item`, `api_key_id`, and `api_source`. Support for combining `user_id` with `project_id` grouping or the `project_ids` filter depends on the organization and requested time range. Unsupported combinatio
  5. line length 687 characters (raw pass, confidence 0.50)

              response: "{\n  \"id\": \"sess_001\",\n  \"object\": \"realtime.session\",\n  \"model\": \"gpt-realtime-2025-08-25\",\n  \"modalities\": [\"audio\", \"text\"],\n  \"instructions\": \"You are a friendly assistant.\",\n  \"voice\": \"alloy\",\n  \"input_audio_format\": \"pcm16\",\n  \"output_audio_format\": \"p
  6. line length 525 characters (raw pass, confidence 0.50)

          description: "Create an ephemeral API token for use in client-side applications with the\nRealtime API specifically for realtime transcriptions. \nCan be configured with the same session parameters as the `transcription_session.update` client event.\n\nIt responds with a session object, plus a `client_secret` key
  7. info warn → info by review long-line api_reference/openapi.transformed.yml:20378:1

    line length 2244 characters (raw pass, confidence 0.65)

                          "text": "The file seems to contain excerpts from a letter to the shareholders of Berkshire Hathaway Inc., likely written by Warren Buffett. It covers several topics:\n\n1. **Communication Philosophy**: Buffett emphasizes the importance of transparency and candidness in reporting mistakes and succe
    likely benign LLM, confidence 0.95 Long example response text string in OpenAPI documentation.
    Reasoning

    Long string literal containing an example model response about a Berkshire letter; documentation example text, not obfuscation.

  8. line length 1261 characters (raw pass, confidence 0.50)

                data: {"id":"run_123","object":"thread.run","created_at":1710351818,"assistant_id":"asst_123","thread_id":"thread_123","status":"requires_action","started_at":1710351818,"expires_at":1710352418,"cancelled_at":null,"failed_at":null,"completed_at":null,"required_action":{"type":"submit_tool_outputs","submit_t
  9. info warn → info by review long-line api_reference/openapi.transformed.yml:34955:1

    line length 2244 characters (raw pass, confidence 0.65)

                          "text": "The file seems to contain excerpts from a letter to the shareholders of Berkshire Hathaway Inc., likely written by Warren Buffett. It covers several topics:\n\n1. **Communication Philosophy**: Buffett emphasizes the importance of transparency and candidness in reporting mistakes and succe
    likely benign LLM, confidence 0.95 Repeated long example response string in OpenAPI documentation.
    Reasoning

    Duplicate of the same documentation example text at another location; benign.

  10. line length 506 characters (raw pass, confidence 0.50)

            **Important:** when using JSON mode, you **must** also instruct the model to produce JSON yourself via a system or user message. Without this, the model may generate an unending stream of whitespace until the generation reaches the token limit, resulting in a long-running and seemingly "stuck" request. Also not
  11. line length 561 characters (raw pass, confidence 0.50)

                Accepts a JSON object that maps tokens (specified by their token ID in the GPT tokenizer) to an associated bias value from -100 to 100. You can use this [tokenizer tool](https://platform.openai.com/tokenizer?view=bpe) to convert text to token IDs. Mathematically, the bias is added to the logits generated by
  12. line length 604 characters (raw pass, confidence 0.50)

                Input text to embed, encoded as a string or array of tokens. To embed multiple inputs in a single request, pass an array of strings or array of token arrays. The input must not exceed the max input tokens for the model (8192 tokens for all embedding models), cannot be an empty string, and any array must be 
  13. line length 779 characters (raw pass, confidence 0.50)

              description: The size of the generated images. Defaults to `auto`. For `gpt-image-2`, `gpt-image-2-2026-04-21`, `gpt-image-2.5-sunburst`, `gpt-image-2.5-sunburst-2026-09-08`, `gpt-image-2.5-flare`, and `gpt-image-2.5-flare-2026-09-08`, arbitrary resolutions are supported as `WIDTHxHEIGHT` strings, for example
  14. line length 759 characters (raw pass, confidence 0.50)

              description: The size of the generated images. For `gpt-image-2`, `gpt-image-2-2026-04-21`, `gpt-image-2.5-sunburst`, `gpt-image-2.5-sunburst-2026-09-08`, `gpt-image-2.5-flare`, and `gpt-image-2.5-flare-2026-09-08`, arbitrary resolutions are supported as `WIDTHxHEIGHT` strings, for example `1536x864`. Width a
  15. line length 505 characters (raw pass, confidence 0.50)

              description: 'The voice to use when generating the audio. Supported built-in voices are `alloy`, `ash`, `ballad`, `coral`, `echo`, `fable`, `onyx`, `nova`, `sage`, `shimmer`, `verse`, `marin`, and `cedar`. You may also provide a custom voice object with an `id`, for example `{ "id": "voice_1234" }`. Previews 
  16. line length 759 characters (raw pass, confidence 0.50)

              description: The size of the generated images. For `gpt-image-2`, `gpt-image-2-2026-04-21`, `gpt-image-2.5-sunburst`, `gpt-image-2.5-sunburst-2026-09-08`, `gpt-image-2.5-flare`, and `gpt-image-2.5-flare-2026-09-08`, arbitrary resolutions are supported as `WIDTHxHEIGHT` strings, for example `1536x864`. Width a
  17. line length 759 characters (raw pass, confidence 0.50)

              description: The size of the generated images. For `gpt-image-2`, `gpt-image-2-2026-04-21`, `gpt-image-2.5-sunburst`, `gpt-image-2.5-sunburst-2026-09-08`, `gpt-image-2.5-flare`, and `gpt-image-2.5-flare-2026-09-08`, arbitrary resolutions are supported as `WIDTHxHEIGHT` strings, for example `1536x864`. Width a
  18. line length 600 characters (raw pass, confidence 0.50)

          description: "Send this event to truncate a previous assistant message’s audio. The server \nwill produce audio faster than realtime, so this event is useful when the user \ninterrupts to truncate audio that has already been sent to the client but not \nyet played. This will synchronize the server's understandi
  19. line length 631 characters (raw pass, confidence 0.50)

          description: "Send this event to append audio bytes to the input audio buffer. The audio \nbuffer is temporary storage you can write to and later commit. In Server VAD \nmode, the audio buffer is used to detect speech and the server will decide \nwhen to commit. When Server VAD is disabled, you must commit the au
  20. line length 583 characters (raw pass, confidence 0.50)

          description: "Send this event to commit the user input audio buffer, which will create a \nnew user message item in the conversation. This event will produce an error \nif the input audio buffer is empty. When in Server VAD mode, the client does \nnot need to send this event, the server will commit the audio buff
  21. line length 1303 characters (raw pass, confidence 0.50)

          description: "This event instructs the server to create a Response, which means triggering \nmodel inference. When in Server VAD mode, the server will create Responses \nautomatically.\n\nA Response will include at least one Item, and may have two, in which case \nthe second will be a function call. These Items w
  22. line length 750 characters (raw pass, confidence 0.50)

              description: "The default system instructions (i.e. system message) prepended to model \ncalls. This field allows the client to guide the model on desired \nresponses. The model can be instructed on response content and format, \n(e.g. \"be extremely succinct\", \"act friendly\", \"here are examples of good \
  23. line length 693 characters (raw pass, confidence 0.50)

          description: "Sent by the server when in `server_vad` mode to indicate that speech has been \ndetected in the audio buffer. This can happen any time audio is added to the \nbuffer (unless speech is already detected). The client may want to use this \nevent to interrupt audio playback or provide visual feedback to
  24. line length 538 characters (raw pass, confidence 0.50)

                  "instructions": "Your knowledge cutoff is 2023-10. You are a helpful, witty, and friendly AI. Act like a human, but remember that you aren't a human and that you can't do human things in the real world. Your voice and personality should be warm and engaging, with a lively and playful tone. If interacting 
  25. line length 511 characters (raw pass, confidence 0.50)

          description: "Add a new Item to the Conversation's context, including messages, function \ncalls, and function call responses. This event can be used both to populate a \n\"history\" of the conversation and to add new items mid-stream, but has the \ncurrent limitation that it cannot populate assistant audio messa
  26. line length 600 characters (raw pass, confidence 0.50)

          description: "Send this event to truncate a previous assistant message’s audio. The server \nwill produce audio faster than realtime, so this event is useful when the user \ninterrupts to truncate audio that has already been sent to the client but not \nyet played. This will synchronize the server's understandi
  27. line length 910 characters (raw pass, confidence 0.50)

          description: "Send this event to append audio bytes to the input audio buffer. The audio \nbuffer is temporary storage you can write to and later commit. A \"commit\" will create a new\nuser message item in the conversation history from the buffer content and clear the buffer.\nInput audio transcription (if enabl
  28. line length 1388 characters (raw pass, confidence 0.50)

          description: "This event instructs the server to create a Response, which means triggering \nmodel inference. When in Server VAD mode, the server will create Responses \nautomatically.\n\nA Response will include at least one Item, and may have two, in which case \nthe second will be a function call. These Items w
  29. line length 535 characters (raw pass, confidence 0.50)

                The default system instructions (i.e. system message) prepended to model calls. This field allows the client to guide the model on desired responses. The model can be instructed on response content and format, (e.g. "be extremely succinct", "act friendly", "here are examples of good responses") and on audio
  30. line length 693 characters (raw pass, confidence 0.50)

          description: "Sent by the server when in `server_vad` mode to indicate that speech has been \ndetected in the audio buffer. This can happen any time audio is added to the \nbuffer (unless speech is already detected). The client may want to use this \nevent to interrupt audio playback or provide visual feedback to
  31. line length 547 characters (raw pass, confidence 0.50)

          description: "Returned when a Response is done streaming. Always emitted, no matter the \nfinal state. The Response object included in the `response.done` event will \ninclude all output Items in the Response but will omit the raw audio data.\n\nClients should check the `status` field of the Response to determine
  32. line length 538 characters (raw pass, confidence 0.50)

                  "instructions": "Your knowledge cutoff is 2023-10. You are a helpful, witty, and friendly AI. Act like a human, but remember that you aren't a human and that you can't do human things in the real world. Your voice and personality should be warm and engaging, with a lively and playful tone. If interacting 
  33. line length 538 characters (raw pass, confidence 0.50)

                  "instructions": "Your knowledge cutoff is 2023-10. You are a helpful, witty, and friendly AI. Act like a human, but remember that you aren't a human and that you can't do human things in the real world. Your voice and personality should be warm and engaging, with a lively and playful tone. If interacting 
  34. line length 634 characters (raw pass, confidence 0.50)

                  Configuration for input audio transcription, defaults to off and can be set to `null` to turn off once on. Input audio transcription is not native to the model, since the model consumes audio directly. Transcription runs asynchronously through [the /audio/transcriptions endpoint](https://developers.openai
  35. line length 535 characters (raw pass, confidence 0.50)

                The default system instructions (i.e. system message) prepended to model calls. This field allows the client to guide the model on desired responses. The model can be instructed on response content and format, (e.g. "be extremely succinct", "act friendly", "here are examples of good responses") and on audio
  36. line length 535 characters (raw pass, confidence 0.50)

                The default system instructions (i.e. system message) prepended to model calls. This field allows the client to guide the model on desired responses. The model can be instructed on response content and format, (e.g. "be extremely succinct", "act friendly", "here are examples of good responses") and on audio
  37. line length 535 characters (raw pass, confidence 0.50)

                The default system instructions (i.e. system message) prepended to model calls. This field allows the client to guide the model on desired responses. The model can be instructed on response content and format, (e.g. "be extremely succinct", "act friendly", "here are examples of good responses") and on audio
  38. line length 669 characters (raw pass, confidence 0.50)

          description: Options for prompt caching. Supported for `gpt-5.6` and later models. By default, OpenAI automatically chooses one implicit cache breakpoint. You can add explicit breakpoints to content blocks with `prompt_cache_breakpoint`. Each request can write up to four breakpoints. For cache matching, OpenAI co
  39. line length 751 characters (raw pass, confidence 0.50)

              description: The Cyber access program to use for this request. Supported values are `standard`, `daybreak_blue`, and `daybreak_red`. If omitted, the API resolves the program from the model's Cyber tier and your organization and project access, subject to model-specific eligibility restrictions. By default, mo
  40. line length 669 characters (raw pass, confidence 0.50)

          description: Options for prompt caching. Supported for `gpt-5.6` and later models. By default, OpenAI automatically chooses one implicit cache breakpoint. You can add explicit breakpoints to content blocks with `prompt_cache_breakpoint`. Each request can write up to four breakpoints. For cache matching, OpenAI co
  41. line length 951 characters (raw pass, confidence 0.50)

                  Specifies the processing type used for serving the request.   - If set to 'auto', then the request will be processed with the service tier configured in the Project settings. Unless otherwise configured, the Project will use 'default'.   - If set to 'default', then the request will be processed with the s
  42. line length 759 characters (raw pass, confidence 0.50)

              description: The size of the generated images. For `gpt-image-2`, `gpt-image-2-2026-04-21`, `gpt-image-2.5-sunburst`, `gpt-image-2.5-sunburst-2026-09-08`, `gpt-image-2.5-flare`, and `gpt-image-2.5-flare-2026-09-08`, arbitrary resolutions are supported as `WIDTHxHEIGHT` strings, for example `1536x864`. Width a
  43. line length 951 characters (raw pass, confidence 0.50)

                  Specifies the processing type used for serving the request.   - If set to 'auto', then the request will be processed with the service tier configured in the Project settings. Unless otherwise configured, the Project will use 'default'.   - If set to 'default', then the request will be processed with the s
  44. line length 669 characters (raw pass, confidence 0.50)

          description: Options for prompt caching. Supported for `gpt-5.6` and later models. By default, OpenAI automatically chooses one implicit cache breakpoint. You can add explicit breakpoints to content blocks with `prompt_cache_breakpoint`. Each request can write up to four breakpoints. For cache matching, OpenAI co
  45. line length 669 characters (raw pass, confidence 0.50)

          description: Options for prompt caching. Supported for `gpt-5.6` and later models. By default, OpenAI automatically chooses one implicit cache breakpoint. You can add explicit breakpoints to content blocks with `prompt_cache_breakpoint`. Each request can write up to four breakpoints. For cache matching, OpenAI co
  46. line length 751 characters (raw pass, confidence 0.50)

              description: The Cyber access program to use for this request. Supported values are `standard`, `daybreak_blue`, and `daybreak_red`. If omitted, the API resolves the program from the model's Cyber tier and your organization and project access, subject to model-specific eligibility restrictions. By default, mo
  47. line length 1109 characters (raw pass, confidence 0.50)

    | Streaming and authenticated WebSockets | Incrementally decode SSE and exchange authenticated current or beta Realtime/Responses WebSocket messages through distinct sync and async connection paths. | [src/openai/_streaming.py:53](../../src/openai/_streaming.py), [src/openai/resources/realtime/realtime.py:683](../../sr
  48. info warn → info by review long-line docs/architecture/security-model.md:54:1

    line length 2482 characters (raw pass, confidence 0.65)

    | Legacy module-level client | Global/environment-selected OpenAI, Azure, or Bedrock credential and destination | Module `api_type` starts from `OPENAI_API_TYPE`. `_load_client()` fills unset Azure endpoint/version globals from environment; only when `api_type` is unset, it rejects `OPENAI_API_KEY` in the environment t
    likely benign LLM, confidence 0.93 Long security-model table row describing client credential sources.
    Reasoning

    Long markdown table row with prose about credential handling; a documentation line-length issue only.

  49. info warn → info by review long-line docs/architecture/security-model.md:65:1

    line length 2772 characters (raw pass, confidence 0.65)

    | Current and beta Realtime/Responses WebSockets | WebSocket destination and client auth headers | All current and beta paths use explicit `websocket_base_url` or transform the configured HTTP base to a WebSocket scheme, then merge client auth with caller extra headers. Only Realtime branches into Azure `_configure_rea
    likely benign LLM, confidence 0.93 Long security-model table row on WebSocket destination and auth headers.
    Reasoning

    Long markdown table row describing WebSocket destinations; prose documentation, not code.

  50. line length 1687 characters (raw pass, confidence 0.50)

    | High | Legacy module-client selection or cache regression routes an OpenAI, Azure, or Bedrock credential through the wrong provider. | Mutable module globals or environment signals must cross a broken precedence, ambiguity, forwarding, or reset boundary; the caller deliberately setting a coherent provider configurati
  51. info warn → info by review long-line docs/architecture/security-model.md:354:1

    line length 2534 characters (raw pass, confidence 0.65)

    | High | A current or beta Realtime/Responses WebSocket regression sends client auth to the wrong peer or redirect target. | A sync direct-connect or async wrapper path must lose its destination/header binding; caller-selected explicit WebSocket configuration alone is insufficient. | API credential disclosure; Azure `a
    likely benign LLM, confidence 0.93 Long risk-table row about WebSocket credential disclosure.
    Reasoning

    Long markdown table row in a risk register; prose documentation with no executable content.

  52. line length 1490 characters (raw pass, confidence 0.50)

    | Medium | Monthly review input or output escapes its intended isolation or publication boundary. | A regression lets independently mutable lifecycle/PyPI data expose the action-held key, mutate protected workspace state, leak sensitive output to the step summary, escape the bounded issue body into publisher commands/m
  53. line length 1595 characters (raw pass, confidence 0.50)

    | High | Castiron candidate data escapes the trusted reporter/publisher boundary and changes published commit statuses or PR comments. | Candidate Git objects, stale run metadata, or an untrusted artifact must bypass provenance/freshness/payload/artifact checks before a write-capable publisher acts; normal candidate in
  54. info warn → info by review dynamic-import scripts/run-steady:5:1

    `source` called with a dynamic path — sourcing a variable script path (ast pass, confidence 0.75)

    STEADY_ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
    source "$STEADY_ROOT/scripts/steady/settings"
    steady_verify
    likely benign LLM, confidence 0.85 Sources a settings file relative to the script's own directory.
    Reasoning

    Sources a settings file under the script's own root directory computed from $0; this is a normal bash include pattern for a project launcher.

  55. info critical → info by review dynamic-execution scripts/run-steady:9:1

    `exec` called with a dynamic (variable/substitution) path (ast pass, confidence 0.85)

    # Keep the caller's working directory so relative spec paths keep working.
    exec "$DENO_DIRECTORY/$DENO_BINARY" run --cached-only --frozen \
      --config "$STEADY_SOURCE/deno.json" \
      --allow-read --allow-net --allow-env --allow-write \
    likely benign LLM, confidence 0.80 Launcher exec of a cached Deno binary with project-scoped config.
    Reasoning

    exec runs a Deno binary from the project's cache directory with fixed flags and a config under the project source; the path is computed from known project variables, which is typical for a launcher. Some doubt remains because the executable path depends on environment-derived variables that are not shown here.

  56. info warn → info by review dynamic-import scripts/steady/install:5:1

    `source` called with a dynamic path — sourcing a variable script path (ast pass, confidence 0.75)

    STEADY_ROOT="$(cd "$(dirname "$0")/../.." && pwd -P)"
    source "$STEADY_ROOT/scripts/steady/settings"
    
    mkdir -p "$STEADY_CACHE"
    likely benign LLM, confidence 0.85 Sources project settings file relative to script location.
    Reasoning

    Sources the project settings file from a root derived from $0, a standard include in an installer script.

  57. info warn → info by review dynamic-execution scripts/steady/install:35:1

    command name is a variable (`$DENO_DIRECTORY`, `$DENO_BINARY`) not set in this file — the caller or environment decides what runs (ast pass, confidence 0.70)

    steady_verify
    "$DENO_DIRECTORY/$DENO_BINARY" cache --frozen --config "$STEADY_SOURCE/deno.json" "$STEADY_SOURCE/cmd/steady.ts" >&2
    
    if [[ "${1:-}" == '--print-executable' ]]; then
    likely benign LLM, confidence 0.80 Installer invokes the Deno binary via settings-defined variables to cache dependencies.
    Reasoning

    Runs deno cache using variables defined in the settings file sourced earlier in the same script; the variables are project-defined rather than attacker-controlled, so this is a normal installer step.

  58. info warn → info by review dynamic-attribute src/openai/__init__.py:139:13

    reach-by-name through `globals` (ast pass, confidence 0.60)

                value = getattr(import_module(module, __name__), name)
                globals()[name] = value
                return value
            raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
    likely benign LLM, confidence 0.97 Lazy-import __getattr__ hook in the openai package that caches submodules via globals().
    Reasoning

    This is the standard PEP 562 lazy-loading module __getattr__ pattern: it imports a submodule by name, caches the result in globals(), and raises AttributeError otherwise. This is a legitimate pattern used throughout the official OpenAI SDK, and the snippet has no network, exec, or encoding behavior.

  59. info warn → info by review dynamic-attribute src/openai/lib/streaming/__init__.py:19:13

    reach-by-name through `globals` (ast pass, confidence 0.60)

                value = getattr(import_module("._assistants", __name__), name)
                globals()[name] = value
                return value
            raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
    likely benign LLM, confidence 0.97 Lazy-loading __getattr__ in the streaming subpackage importing from ._assistants.
    Reasoning

    Same PEP 562 lazy-loading pattern: resolves a name from a relative submodule via import_module, caches it in globals, and raises AttributeError on miss. Benign and standard for a large SDK package.

  60. info warn → info by review dynamic-attribute src/openai/resources/__init__.py:350:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute resolution caching into globals() in resources package.
    Reasoning

    Identical lazy-loading __getattr__ idiom caching resolved attributes into globals(). Standard PEP 562 usage with no suspicious behavior.

  61. info warn → info by review dynamic-attribute src/openai/resources/admin/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy-loading module attribute hook in admin resources package.
    Reasoning

    Standard PEP 562 lazy-loader pattern with globals() caching and AttributeError fallback; matches the rest of the SDK's package layout.

  62. info warn → info by review dynamic-attribute src/openai/resources/admin/organization/__init__.py:233:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy submodule resolution hook in admin organization package.
    Reasoning

    Standard lazy-import __getattr__ caching resolved submodule attributes into globals(). No network or execution behavior visible.

  63. info warn → info by review dynamic-attribute src/openai/resources/admin/organization/groups/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in organization groups subpackage.
    Reasoning

    Same benign PEP 562 lazy-loading idiom with globals() caching and AttributeError on miss.

  64. info warn → info by review dynamic-attribute src/openai/resources/admin/organization/projects/__init__.py:230:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in organization projects subpackage.
    Reasoning

    Standard lazy-loading __getattr__ pattern with globals() caching; consistent with generated SDK package structure.

  65. info warn → info by review dynamic-attribute src/openai/resources/admin/organization/projects/groups/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in project groups subpackage.
    Reasoning

    Benign PEP 562 lazy-import hook caching into globals(); no suspicious calls.

  66. reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in project service_accounts subpackage.
    Reasoning

    Standard lazy-loading __getattr__ idiom; the snippet only resolves and caches module attributes by name.

  67. info warn → info by review dynamic-attribute src/openai/resources/admin/organization/projects/users/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in project users subpackage.
    Reasoning

    Standard PEP 562 lazy-loading hook with globals() caching; benign.

  68. info warn → info by review dynamic-attribute src/openai/resources/admin/organization/users/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in organization users subpackage.
    Reasoning

    Same benign lazy-import __getattr__ pattern caching resolved names into globals().

  69. info warn → info by review dynamic-attribute src/openai/resources/audio/__init__.py:98:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in audio resources package.
    Reasoning

    Standard lazy-loading module attribute hook in the audio resources package; no dangerous behavior in the snippet.

  70. info warn → info by review dynamic-attribute src/openai/resources/beta/__init__.py:113:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.97 Lazy attribute loader in beta resources package.
    Reasoning

    Standard PEP 562 lazy-loading idiom with globals() caching and AttributeError fallback, consistent with the rest of the SDK.

  71. info warn → info by review dynamic-attribute src/openai/resources/beta/agents/__init__.py:83:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Module __getattr__ that caches lazily resolved attributes into globals() for the beta agents package.
    Reasoning

    The snippet is the standard lazy-loading idiom in a module-level __getattr__: it raises AttributeError for unknown names, otherwise caches the resolved value into globals(). This is a common performance pattern for deferring submodule imports, and the AST signal fires on the generic globals() write rather than on any dangerous call.

  72. info warn → info by review dynamic-attribute src/openai/resources/beta/agents/environments/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-attribute caching via globals() in the beta agents environments subpackage.
    Reasoning

    Identical lazy-import __getattr__ pattern: unknown names raise AttributeError and resolved values are cached in globals(). It runs no external input through execution and is ordinary SDK module plumbing.

  73. info warn → info by review dynamic-attribute src/openai/resources/beta/agents/sessions/__init__.py:128:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading __getattr__ with globals() caching in the beta agents sessions package.
    Reasoning

    Same standard module __getattr__ lazy-loading idiom that caches resolved names into globals(). Nothing in the snippet decodes data, executes code, or reaches outside the package.

  74. info warn → info by review dynamic-attribute src/openai/resources/beta/agents/sessions/subagents/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Module-level lazy attribute resolution for the sessions subagents subpackage.
    Reasoning

    Standard lazy-import __getattr__ that raises on unknown names and caches resolved attributes in globals(). This is routine package structure with no dynamic execution or encoded payload.

  75. reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy submodule attribute caching in the subagent turns subpackage.
    Reasoning

    Same generated lazy-loading pattern: AttributeError on miss, cache into globals() on hit. No attacker-controlled input or execution primitive appears in the snippet.

  76. info warn → info by review dynamic-attribute src/openai/resources/beta/agents/sessions/turns/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy attribute caching for the beta agents sessions turns package.
    Reasoning

    Identical lazy __getattr__ idiom with globals() caching. It is generated SDK scaffolding and shows no sign of obfuscation or malicious behavior.

  77. info warn → info by review dynamic-attribute src/openai/resources/beta/agents/vaults/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-import attribute caching for the beta agents vaults package.
    Reasoning

    Standard lazy-loading __getattr__ that writes resolved names into globals(). The pattern is common in large Python SDKs to defer imports and carries no execution or exfiltration risk here.

  78. info warn → info by review dynamic-attribute src/openai/resources/beta/chatkit/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy attribute resolution with globals() caching in the beta chatkit package.
    Reasoning

    Same module __getattr__ pattern: raise on unknown names, cache resolved values in globals(). The AST flag is a generic reach-by-name match on globals() and does not indicate malicious intent.

  79. info warn → info by review dynamic-attribute src/openai/resources/beta/responses/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Module __getattr__ that lazily caches attributes for the beta responses package.
    Reasoning

    Standard lazy-import idiom that raises AttributeError on misses and caches hits in globals(). Benign SDK structure with no dynamic code execution.

  80. info warn → info by review dynamic-attribute src/openai/resources/beta/threads/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy submodule attribute caching in the beta threads package.
    Reasoning

    Identical lazy-loading pattern with globals() caching and AttributeError on unknown names. Routine import deferral in generated SDK code.

  81. info warn → info by review dynamic-attribute src/openai/resources/beta/threads/runs/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy attribute resolution for the beta threads runs subpackage.
    Reasoning

    Same lazy __getattr__ with globals() caching. The snippet shows only attribute resolution with no decoding, execution, or network activity.

  82. info warn → info by review dynamic-attribute src/openai/resources/chat/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-import attribute caching in the top-level chat resource package.
    Reasoning

    Standard module __getattr__ that defers imports and caches resolved names in globals(). This is ordinary, widely used SDK code and matches the expected openai package layout.

  83. info warn → info by review dynamic-attribute src/openai/resources/chat/completions/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy attribute caching for the chat completions subpackage.
    Reasoning

    Same lazy __getattr__ idiom with globals() caching and AttributeError on misses. It is benign import plumbing with no payload or execution path.

  84. info warn → info by review dynamic-attribute src/openai/resources/containers/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    The snippet is the standard PEP 562 module __getattr__ pattern for lazy submodule loading. It caches the resolved attribute into globals() and raises AttributeError for unknown names. This is a normal SDK idiom with no decoding, network, or execution behind the name lookup.

  85. info warn → info by review dynamic-attribute src/openai/resources/containers/files/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Same PEP 562 lazy-attribute pattern as the other OpenAI resource package initializers. It caches the resolved name in globals() and raises AttributeError otherwise. Nothing suggests malicious reach-by-name behavior.

  86. info warn → info by review dynamic-attribute src/openai/resources/conversations/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard lazy-import __getattr__ in a package __init__. The name is only used to look up and cache a known submodule attribute, which is ordinary SDK structure.

  87. info warn → info by review dynamic-attribute src/openai/resources/evals/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard PEP 562 lazy attribute resolution with caching in globals(). The snippet shows no decoding, dynamic code execution, or external input driving the lookup.

  88. info warn → info by review dynamic-attribute src/openai/resources/evals/runs/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Same lazy-loading pattern used across the SDK's resource packages. It resolves a declared attribute name and memoizes it, with a plain AttributeError fallback.

  89. info warn → info by review dynamic-attribute src/openai/resources/fine_tuning/__init__.py:83:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard lazy module __getattr__ that caches the resolved attribute in globals() and raises AttributeError for unknown names. This is ordinary package-level lazy loading.

  90. info warn → info by review dynamic-attribute src/openai/resources/fine_tuning/alpha/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard PEP 562 lazy import pattern in a package initializer. The globals() write only memoizes a resolved name, with no suspicious data flow.

  91. info warn → info by review dynamic-attribute src/openai/resources/fine_tuning/checkpoints/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Lazy module attribute resolution with caching, consistent with the rest of the SDK's resource packages. It shows no sign of hidden execution or obfuscated names.

  92. info warn → info by review dynamic-attribute src/openai/resources/fine_tuning/jobs/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard lazy-import __getattr__ pattern that memoizes a resolved attribute in globals(). This is normal package structure for an SDK.

  93. info warn → info by review dynamic-attribute src/openai/resources/live/__init__.py:67:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Same PEP 562 lazy-loading idiom with caching into globals() and an AttributeError fallback. The code only resolves SDK submodules.

  94. info warn → info by review dynamic-attribute src/openai/resources/realtime/__init__.py:83:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard lazy module attribute pattern memoizing into globals(). It is a common, legitimate way to defer submodule imports in a large SDK.

  95. info warn → info by review dynamic-attribute src/openai/resources/realtime/translations/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Lazy-loading __getattr__ idiom with caching in globals(), matching the other SDK package initializers. No decoding or execution is involved.

  96. info warn → info by review dynamic-attribute src/openai/resources/responses/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.93 Lazy-loading module __getattr__ that caches resolved attributes into globals().
    Reasoning

    Standard PEP 562 lazy attribute resolution that caches into globals() and raises AttributeError otherwise. This is ordinary SDK package structure.

  97. info warn → info by review dynamic-attribute src/openai/resources/safety/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.95 Lazy module attribute loader that caches resolved attributes into module globals.
    Reasoning

    This is the standard lazy-import module __getattr__ pattern in the OpenAI SDK, caching a lazily loaded submodule into globals. It is a legitimate, well-known idiom with no network or execution risk.

  98. info warn → info by review dynamic-attribute src/openai/resources/skills/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.95 Lazy module attribute loader that caches resolved attributes into module globals.
    Reasoning

    Same lazy-loading __getattr__ idiom writing resolved names into globals; benign SDK plumbing.

  99. info warn → info by review dynamic-attribute src/openai/resources/skills/versions/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.95 Lazy module attribute loader that caches resolved attributes into module globals.
    Reasoning

    Identical lazy-import __getattr__ pattern in a subpackage; no sign of malicious behavior.

  100. info warn → info by review dynamic-attribute src/openai/resources/uploads/__init__.py:53:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.95 Lazy module attribute loader that caches resolved attributes into module globals.
    Reasoning

    Standard lazy-loading module __getattr__ caching into globals, consistent with the rest of the SDK.

  101. info warn → info by review dynamic-attribute src/openai/resources/vector_stores/__init__.py:68:9

    reach-by-name through `globals` (ast pass, confidence 0.60)

                raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
            globals()[name] = value
            return value
    likely benign LLM, confidence 0.95 Lazy module attribute loader that caches resolved attributes into module globals.
    Reasoning

    Same benign lazy-import idiom; the globals write only stores a resolved submodule attribute.

  102. info warn → info by review encoding-base64 tests/lib/test_webhooks.py:24:22

    base64-like blob (44 bytes, compression ratio 1.25) (raw pass, confidence 0.60)

    # Standardized test constants (matches TypeScript implementation)
    TEST_SECRET = "whsec_RdvaYFYUXuIFuEbvZHwMfYFhUf7aMYjYcmM24+Aj40c="
    TEST_PAYLOAD = '{"id": "evt_685c059ae3a481909bdc86819b066fb6", "object": "event", "created_at": 1750861210, "type": "response.completed", "data": {"id": "resp_123"}}'
    likely benign LLM, confidence 0.95 Test constant webhook secret string in base64-like form.
    Reasoning

    This is a test fixture webhook secret with a base64-like format (whsec_ prefix, standard Standard Webhooks scheme). The payload is plain JSON, and the blob is a test constant, not obfuscation.

  103. info warn → info by review encoding-base64 tests/lib/test_webhooks.py:28:22

    base64-like blob (44 bytes, compression ratio 1.25) (raw pass, confidence 0.60)

    TEST_WEBHOOK_ID = "wh_685c059ae39c8190af8c71ed1022a24d"
    TEST_SIGNATURE = "v1,gUAg4R2hWouRZqRQG4uJypNS8YK885G838+EHb4nKBY="
    SIP_EVENT_TYPES = ["live.call.incoming", "live.transport.incoming", "realtime.call.incoming"]
    SIP_MEDIA_SECURITY_VALUES = [None, "rtp", "srtp", "future_media_security"]
    likely benign LLM, confidence 0.95 Test constant webhook signature string in base64 form.
    Reasoning

    A test webhook signature and ID used to verify signature validation; expected test data with no encoding-based concealment.

  104. info warn → info by review dynamic-execution tests/test_uv_workflows.py:1243:12

    `compile` called on a non-literal expression (ast pass, confidence 0.70)

        # Compile once per worker, but execute with fresh globals for every case.
        return compile(security_dependency_floor_program(), str(ROOT / "scripts/check-dependency-security.py"), "exec")
    likely benign LLM, confidence 0.80 Compiles a repo-local dependency-security checker script inside a test helper.
    Reasoning

    Compiles a script whose source is produced by a local test helper and whose path is a repo script (check-dependency-security.py). This is test harness code executing a repository file, not an attack, though dynamic compile is noted.

  105. info warn → info by review dynamic-execution tests/test_uv_workflows.py:1522:19

    `compile` called on a non-literal expression (ast pass, confidence 0.70)

        # the same checker and Git stub in-process; keep real CLI coverage below.
        git_program = compile(fake_git.read_text(), str(fake_git), "exec")
    
        def run_git(args: list[str], **_kwargs: Any) -> subprocess.CompletedProcess[str]:
    likely benign LLM, confidence 0.85 Compiles a fake git test stub read from a fixture file.
    Reasoning

    Compiles a fake git stub script from a test fixture file to run the checker in-process. Test isolation code operating on local fixtures; no external payload.

  106. info warn → info by review dynamic-execution tests/test_uv_workflows.py:1529:13

    `exec` called on a non-literal expression (ast pass, confidence 0.70)

                patch.setattr(sys, "argv", args)
                exec(git_program, {"__name__": "__main__"})
            return subprocess.CompletedProcess(args, 0, output.getvalue(), "")
    likely benign LLM, confidence 0.85 Executes a precompiled fake git test stub in-process.
    Reasoning

    Executes the precompiled fake git stub with a fresh globals dict inside a test with patched argv and captured output. Consistent with test harness behavior.

  107. info warn → info by review dynamic-execution tests/test_uv_workflows.py:1543:13

    `exec` called on a non-literal expression (ast pass, confidence 0.70)

            try:
                exec(compiled_security_dependency_floor_program(), {"__name__": "__main__"})
            except SystemExit as error:
                if isinstance(error.code, int):
    likely benign LLM, confidence 0.85 Runs the compiled dependency-security checker in a test and inspects its exit code.
    Reasoning

    Executes the compiled security checker script in a test, catching SystemExit to check exit codes. Legitimate test harness pattern operating on repository content.

  108. info warn → info by review dynamic-execution tests/utils.py:32:12

    `eval` called on a non-literal expression (ast pass, confidence 0.70)

    def evaluate_forwardref(forwardref: ForwardRef, globalns: dict[str, Any]) -> type:
        return eval(str(forwardref), globalns)  # type: ignore[no-any-return]
    likely benign LLM, confidence 0.90 Evaluates a forward reference string to resolve a type in test utilities.
    Reasoning

    eval of str(ForwardRef) in a test/typing utility to resolve forward references; the input is type annotations from the codebase, a standard typing idiom.

Reproduce This Scan

Run disclude locally to verify. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.

cargo install disclude --version 4.0.0
git clone https://github.com/openai/openai-python openai-python && cd openai-python
git checkout v3.31.0
disclude scan --severity info --diff v3.30.0 .