Skip to content

ModelRetryBackoffSettings accepts negative values that produce invalid retry delays #3270

@Aphroq

Description

@Aphroq

Please read this first

  • Have you read the docs? Yes. The runner-managed retry docs describe initial_delay, max_delay, and multiplier as retry backoff settings.
  • Have you searched for related issues? Yes. I searched for related ModelRetryBackoffSettings, negative delay, negative max_delay, negative multiplier, and model retry issues/PRs and did not find a direct match.

Describe the bug

ModelRetryBackoffSettings accepts negative initial_delay, max_delay, and multiplier values. Those values can flow into the default retry delay calculation and produce negative delays. The retry sleep helper skips non-positive delays, so invalid retry configuration can turn into immediate retries instead of a clear configuration error.

Debug information

  • Agents SDK version: 0.17.0
  • Python version: Python 3.12.1
  • Revision: 683b6e79

Repro steps

Run this script from the repository root:

from agents.retry import ModelRetryBackoffSettings
from agents.run_internal.model_retry import _default_retry_delay

settings = [
    ModelRetryBackoffSettings(initial_delay=-1.0, jitter=False),
    ModelRetryBackoffSettings(max_delay=-1.0, jitter=False),
    ModelRetryBackoffSettings(multiplier=-2.0, jitter=False),
]

for setting in settings:
    print(setting.to_json_dict(), "->", _default_retry_delay(2, setting))

Actual result:

{'initial_delay': -1.0, 'max_delay': None, 'multiplier': None, 'jitter': False} -> -2.0
{'initial_delay': None, 'max_delay': -1.0, 'multiplier': None, 'jitter': False} -> -1.0
{'initial_delay': None, 'max_delay': None, 'multiplier': -2.0, 'jitter': False} -> -0.5

Expected behavior

Negative retry backoff settings should be rejected during ModelRetryBackoffSettings construction or dict coercion, before they can produce invalid retry delays. Zero values can remain valid because they are explicit immediate-retry configuration rather than negative time.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions