PyPI / openai / 3.35.1

openai 3.35.1

Source
https://github.com/openai/openai-python
Tag scanned
v3.35.1
Compared with
v3.35.0 (0 signals introduced since)
Files
2463 scanned, 37 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 2 warn · 108 info
Scan time
42.1 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 61 of 61 warn and critical signals; 59 demoted to info.
Disclude version
4.0.0
Scanned (UTC)
2026-10-18 21:43

Signals

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

  1. warn 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.65 Install script that sources a repo-local settings file relative to its own path.
    Reasoning

    The install script sources the settings file from a path computed relative to its own location. This matches the launcher bootstrap pattern and is a routine internal source.

  2. warn 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.62 Install step invoking a Deno binary whose path comes from variables set in settings.
    Reasoning

    The script runs the Deno cache step using variables set in the sourced settings file, with --frozen and a fixed repo config. The variables are not defined in this file, so the target binary depends on settings that are not shown. The structure matches a normal toolchain install step.

  3. 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
    dismissed LLM, confidence 0.93 Long single-line JSON example of a transcription streaming event in an OpenAPI spec.
    Reasoning

    A 2410-character line is a JSON-encoded streaming event containing a transcript and token log-probabilities. This is ordinary generated API example data in a YAML spec, and the raw pass flags length alone.

  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. info warn → info by review long-line api_reference/openapi.transformed.yml:20395: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
    dismissed LLM, confidence 0.93 Long example response text inside an OpenAPI example block.
    Reasoning

    The long line is a JSON string literal holding example model output about a Berkshire Hathaway letter. It is documentation example content, and long-line is a weak raw-pass signal here.

  10. 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
  11. info warn → info by review long-line api_reference/openapi.transformed.yml:34967: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
    dismissed LLM, confidence 0.93 Duplicate long example response text in the OpenAPI spec.
    Reasoning

    This is a duplicate of the same generated example text at another location in the spec. It is benign documentation content flagged only for line length.

  12. 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
  13. 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
  14. 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 
  15. 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
  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 566 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 
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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 \
  25. 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
  26. 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 
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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 
  35. 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 
  36. 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
  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 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
  39. 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
  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 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
  42. 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
  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 673 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, OpenA
  45. line length 589 characters (raw pass, confidence 0.50)

          description: Play one complete audio fixture through the session output. Send this event over the primary WebSocket or a server sideband. Audio must be raw mono PCM16 little-endian at 24 kHz, regardless of the session audio format, and at most 30 seconds. The entire payload is validated before model speech is int
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
    dismissed LLM, confidence 0.93 Long Markdown table row documenting client credential selection.
    Reasoning

    The flagged line is a long Markdown table row describing credential-handling behavior in prose. Line length in a documentation table is not obfuscation.

  53. 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
    dismissed LLM, confidence 0.93 Long Markdown table row describing WebSocket destinations and auth headers.
    Reasoning

    A long Markdown table cell explaining WebSocket auth headers and destinations. It is prose documentation with no executable content.

  54. 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
  55. 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
    dismissed LLM, confidence 0.93 Long Markdown threat-table row about WebSocket credential disclosure.
    Reasoning

    A long Markdown table row in a security-model threat table. It is documentation content flagged only for length.

  56. 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
  57. 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
  58. 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.80 Launcher script that sources a sibling settings file located relative to its own directory.
    Reasoning

    The script sources a settings file at a path derived from its own location via dirname and pwd -P. This is a standard relative-to-self bootstrap pattern; the sourced file is part of the same repository.

  59. 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.70 Launcher exec of a Deno binary via directory and binary variables loaded from settings.
    Reasoning

    exec runs a Deno binary from variables set by the sourced settings file, with --cached-only and --frozen and a fixed config path. This is a launcher that runs a pinned runtime. The variables are defined outside this snippet, so the exact binary cannot be confirmed from the code shown.

  60. 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.90 Module-level __getattr__ implementing lazy attribute loading via import_module and globals caching.
    Reasoning

    This is the standard PEP 562 module __getattr__ for lazy submodule loading. It imports the named attribute, caches it in globals, and raises AttributeError otherwise. It is a common, legitimate Python pattern.

  61. 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.90 Module-level __getattr__ for lazy loading of streaming helper submodules.
    Reasoning

    This is the same lazy-loading __getattr__ pattern, importing a relative submodule and caching it in globals. It is ordinary package code with no obfuscation or hidden execution.

  62. 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.95 Module-level __getattr__ that lazily loads and caches submodule attributes via globals().
    Reasoning

    This is the standard lazy-loading __getattr__ pattern for Python submodules: it raises AttributeError for unknown names and caches resolved attributes into globals. It is a well-known legitimate idiom in the openai SDK package.

  63. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Same lazy-import __getattr__ idiom in a package __init__; it only resolves names from a known set and caches them, with no execution of external data.

  64. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ pattern raising AttributeError on unknown names; benign SDK structure.

  65. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Same lazy-import idiom in a generated SDK package __init__; no dynamic code execution or external input involved.

  66. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in a package __init__; benign.

  67. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Same generated lazy-import __getattr__ pattern; no malicious indicators.

  68. 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-loading module __getattr__ caching attributes into globals.
    Reasoning

    Same generated lazy-import __getattr__ pattern; benign.

  69. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Same generated lazy-import __getattr__ pattern; benign.

  70. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Same generated lazy-import __getattr__ pattern; benign.

  71. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  72. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  73. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  74. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  75. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  76. 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.95 Lazy-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  77. 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-loading module __getattr__ caching attributes into globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in SDK package __init__; benign.

  78. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    The snippet is the standard lazy-loading __getattr__ pattern: it resolves a submodule or attribute by name, caches it into globals(), and raises AttributeError when the name is unknown. The name is a module attribute lookup, not attacker-controlled input, and nothing here executes code or reaches the network.

  79. 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 __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Same lazy-loading __getattr__ pattern: the name is looked up, the value is cached in globals(), and an AttributeError is raised for unknown names. This is a common way to defer imports in generated SDK code.

  80. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    The snippet is the standard PEP 562 lazy-attribute pattern, with the value cached into globals() and an AttributeError for unknown names. No decoding, execution, or external input is involved.

  81. 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 Lazy-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    This is the standard PEP 562 lazy-attribute pattern. The globals() write only caches an already-resolved module attribute, which is typical for a generated SDK package.

  82. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    The lazy __getattr__ resolves a name, caches it in globals(), and raises AttributeError otherwise. This is standard deferred-import behaviour in an SDK resource package.

  83. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Same PEP 562 lazy-loading pattern: resolve by name, cache into globals(), and fail with AttributeError. No dynamic execution or suspicious data flow is present.

  84. 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 __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    The snippet is the standard lazy-attribute __getattr__ with globals() caching and an AttributeError fallback. It is a legitimate import-deferral idiom.

  85. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Standard PEP 562 lazy-loading: the module attribute is resolved, cached into globals(), and unknown names raise AttributeError. Nothing here is malicious.

  86. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    This is the standard lazy __getattr__ idiom with a globals() cache and an AttributeError for unknown names. It is typical of generated SDK packages.

  87. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Same PEP 562 lazy-loading pattern with globals() caching and AttributeError fallback. No code execution or external data flow is shown.

  88. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    The lazy __getattr__ resolves a submodule attribute by name, caches it into globals(), and raises AttributeError otherwise. This is an ordinary deferred-import pattern.

  89. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Standard PEP 562 lazy attribute loading with a globals() cache and AttributeError for unknown names. Benign SDK plumbing.

  90. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Same lazy-loading __getattr__ idiom with globals() caching. The flagged 'reach-by-name' is just attribute resolution inside a generated package.

  91. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Standard lazy-import __getattr__ with globals() caching and AttributeError on miss. The pattern is legitimate and the name is only used for module attribute lookup.

  92. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    This is the standard PEP 562 lazy-loading idiom. The globals() write caches an attribute that was already resolved, with no suspicious data flow.

  93. 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-import __getattr__ hook in an SDK package __init__ that caches resolved attributes into module globals.
    Reasoning

    Same lazy __getattr__ pattern with globals() caching and AttributeError fallback. It is a common, legitimate deferred-import idiom in generated SDK code.

  94. 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 attribute loader caching resolved names into module globals.
    Reasoning

    This is the standard lazy-loading module __getattr__ pattern in the Stainless-generated OpenAI SDK: it resolves a submodule attribute by name and caches it in globals. It is a common, legitimate Python idiom with no encoding or remote fetch.

  95. 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 attribute loader caching resolved names into module globals.
    Reasoning

    Same lazy-import __getattr__ pattern as the other OpenAI SDK package __init__ files; it only caches a lazily imported resource object under its name.

  96. 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 attribute loader caching resolved names into module globals.
    Reasoning

    Standard lazy-loading __getattr__ idiom in the SDK package; the globals write stores a resolved attribute, not attacker-controlled code.

  97. 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 attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  98. 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 attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  99. 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.93 Lazy attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  100. 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.93 Lazy attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  101. 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.93 Lazy attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  102. 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.93 Lazy attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  103. 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.93 Lazy attribute loader caching resolved names into module globals.
    Reasoning

    Same generated lazy-loading __getattr__ pattern; benign module plumbing.

  104. 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 fixture webhook secret string flagged as a base64 blob.
    Reasoning

    The flagged value is a test webhook secret constant (whsec_ prefix, matching the TypeScript SDK test vector) used to verify HMAC signatures in tests. Base64 test fixtures are expected here and there is no decoding into execution.

  105. 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 fixture webhook signature string flagged as a base64 blob.
    Reasoning

    The flagged value is a test webhook signature constant (v1, base64 HMAC) in a test file; expected fixture data with no malicious decoding.

  106. 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 Test compiles the repo's dependency-security checker script for in-process execution.
    Reasoning

    compile() of a generated program text is used to run a dependency-security checker script from the repo's own scripts directory in tests. The source is internal test scaffolding, not downloaded or obfuscated, though dynamic compile of script text is worth a glance.

  107. 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 Test compiles a local fake git stub script for in-process execution.
    Reasoning

    Compiles a fake git stub script from the repository's test fixtures to run in-process with patched subprocess calls. It is test harness code for simulating git, with no network or obfuscated payload.

  108. 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 Test executes a local fake git stub in-process with captured output.
    Reasoning

    exec runs the locally compiled fake git stub with a fresh globals dict inside a test, paired with patched argv and stdout. This is a deliberate test technique; the code source is a repo fixture, not attacker-supplied.

  109. 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.70 A test executes a generated program via exec and inspects its SystemExit code.
    Reasoning

    The snippet executes the output of a locally named helper, compiled_security_dependency_floor_program(), inside a test file, and catches SystemExit to inspect the exit code. That reads as a test harness running a generated check program, not a dropper. The exec is still on a non-literal and the helper's source is not shown, so the verdict is not certain.

  110. 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 A test utility evaluates a ForwardRef's string in a given namespace to resolve type annotations.
    Reasoning

    This is a standard helper that resolves a typing.ForwardRef by evaluating its string form against a supplied globals dict, with a type-ignore comment. It is a common pattern in typing-introspection test utilities and handles only the forward reference's own text, not attacker-controlled input.

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.35.1
disclude scan --severity info --diff v3.35.0 .