From d968812120fd07db81800f80875548363a29ea2c Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Thu, 2 Oct 2025 17:18:34 +0200 Subject: [PATCH] Use int for retry after --- .../src/Bridge/Anthropic/ResultConverter.php | 2 +- .../src/Bridge/OpenAi/Gpt/ResultConverter.php | 21 +++++++------------ .../Exception/RateLimitExceededException.php | 4 ++-- .../ResultConverterRateLimitTest.php | 2 +- .../Gpt/ResultConverterRateLimitTest.php | 4 ++-- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/platform/src/Bridge/Anthropic/ResultConverter.php b/src/platform/src/Bridge/Anthropic/ResultConverter.php index d8c974b40..415d7a54c 100644 --- a/src/platform/src/Bridge/Anthropic/ResultConverter.php +++ b/src/platform/src/Bridge/Anthropic/ResultConverter.php @@ -42,7 +42,7 @@ public function convert(RawHttpResult|RawResultInterface $result, array $options if (429 === $response->getStatusCode()) { $retryAfter = $response->getHeaders(false)['retry-after'][0] ?? null; - $retryAfterValue = $retryAfter ? (float) $retryAfter : null; + $retryAfterValue = $retryAfter ? (int) $retryAfter : null; throw new RateLimitExceededException($retryAfterValue); } diff --git a/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php b/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php index e7f447e1b..02c6b611e 100644 --- a/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php +++ b/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php @@ -58,15 +58,11 @@ public function convert(RawResultInterface|RawHttpResult $result, array $options if (429 === $response->getStatusCode()) { $headers = $response->getHeaders(false); - $resetTime = null; + $resetTime = $headers['x-ratelimit-reset-requests'][0] + ?? $headers['x-ratelimit-reset-tokens'][0] + ?? null; - if (isset($headers['x-ratelimit-reset-requests'][0])) { - $resetTime = self::parseResetTime($headers['x-ratelimit-reset-requests'][0]); - } elseif (isset($headers['x-ratelimit-reset-tokens'][0])) { - $resetTime = self::parseResetTime($headers['x-ratelimit-reset-tokens'][0]); - } - - throw new RateLimitExceededException($resetTime); + throw new RateLimitExceededException($resetTime ? self::parseResetTime($resetTime) : null); } if ($options['stream'] ?? false) { @@ -221,16 +217,15 @@ private function convertToolCall(array $toolCall): ToolCall * - "6m0s" * - "2m30s" */ - private static function parseResetTime(string $resetTime): float + private static function parseResetTime(string $resetTime): ?int { - $seconds = 0; - if (preg_match('/^(?:(\d+)m)?(?:(\d+)s)?$/', $resetTime, $matches)) { $minutes = isset($matches[1]) ? (int) $matches[1] : 0; $secs = isset($matches[2]) ? (int) $matches[2] : 0; - $seconds = ($minutes * 60) + $secs; + + return ($minutes * 60) + $secs; } - return (float) $seconds; + return null; } } diff --git a/src/platform/src/Exception/RateLimitExceededException.php b/src/platform/src/Exception/RateLimitExceededException.php index b64520b56..ba7ede499 100644 --- a/src/platform/src/Exception/RateLimitExceededException.php +++ b/src/platform/src/Exception/RateLimitExceededException.php @@ -17,12 +17,12 @@ final class RateLimitExceededException extends RuntimeException { public function __construct( - private readonly ?float $retryAfter = null, + private readonly ?int $retryAfter = null, ) { parent::__construct('Rate limit exceeded.'); } - public function getRetryAfter(): ?float + public function getRetryAfter(): ?int { return $this->retryAfter; } diff --git a/src/platform/tests/Bridge/Anthropic/ResultConverterRateLimitTest.php b/src/platform/tests/Bridge/Anthropic/ResultConverterRateLimitTest.php index 7f1f96318..e88873cd6 100644 --- a/src/platform/tests/Bridge/Anthropic/ResultConverterRateLimitTest.php +++ b/src/platform/tests/Bridge/Anthropic/ResultConverterRateLimitTest.php @@ -40,7 +40,7 @@ public function testRateLimitExceededThrowsException() try { $handler->convert(new RawHttpResult($httpResponse)); } catch (RateLimitExceededException $e) { - $this->assertSame(60.0, $e->getRetryAfter()); + $this->assertSame(60, $e->getRetryAfter()); throw $e; } } diff --git a/src/platform/tests/Bridge/OpenAi/Gpt/ResultConverterRateLimitTest.php b/src/platform/tests/Bridge/OpenAi/Gpt/ResultConverterRateLimitTest.php index 4c75098e9..c2537b8fb 100644 --- a/src/platform/tests/Bridge/OpenAi/Gpt/ResultConverterRateLimitTest.php +++ b/src/platform/tests/Bridge/OpenAi/Gpt/ResultConverterRateLimitTest.php @@ -42,7 +42,7 @@ public function testRateLimitExceededWithRequestsResetTime() try { $handler->convert(new RawHttpResult($httpResponse)); } catch (RateLimitExceededException $e) { - $this->assertSame(20.0, $e->getRetryAfter()); + $this->assertSame(20, $e->getRetryAfter()); throw $e; } } @@ -69,7 +69,7 @@ public function testRateLimitExceededWithTokensResetTime() try { $handler->convert(new RawHttpResult($httpResponse)); } catch (RateLimitExceededException $e) { - $this->assertSame(150.0, $e->getRetryAfter()); + $this->assertSame(150, $e->getRetryAfter()); throw $e; } }