hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

commit d2e043118258db815d4811515d80032d12111f7a
parent 66a4548cbd232e5a4f2f53871c71e1ddc1597095
Author: triesap <tyson@radroots.org>
Date:   Mon, 21 Sep 2026 13:46:18 +0000

provider: integrate bounded client retry and budget behavior

Diffstat:
Msrc/hyf_provider/jev_client.mojo | 30++++++++++++++++++++++++++++++
Mtests/test_jev.mojo | 19+++++++++++++++++++
2 files changed, 49 insertions(+), 0 deletions(-)

diff --git a/src/hyf_provider/jev_client.mojo b/src/hyf_provider/jev_client.mojo @@ -1,6 +1,8 @@ from flare.http import HttpClient from flare.tls import TlsConfig, TlsVerify from json import Value, dumps +from hyf_provider.jev_failures import map_jev_failure +from hyf_provider.jev_retry import RetryPolicy, should_retry @fieldwise_init @@ -84,3 +86,31 @@ def assert_tls_verification_required(config: TlsConfig) raises: def redirects_forward_credentials() -> Bool: return False + + +def failure_kind_for_status(status: Int) -> String: + if status == 401: + return "authentication" + if status == 400 or status == 422 or status == 404: + return "validation" + if status == 408: + return "request_timeout" + if status == 429: + return "rate_limit" + if status == 529: + return "overloaded" + if status == 500 or status == 502 or status == 503 or status == 504: + return "internal_server" + return "unexpected_status" + + +def retry_decision( + policy: RetryPolicy, attempt: Int, elapsed_ms: Int, status: Int +) raises -> Bool: + if status >= 200 and status < 300: + raise Error("retry_decision requires a failure status") + var kind = failure_kind_for_status(status) + var failure = map_jev_failure( + kind if kind != "unexpected_status" else "transport" + ) + return should_retry(policy, attempt, elapsed_ms, failure.retryable) diff --git a/tests/test_jev.mojo b/tests/test_jev.mojo @@ -348,3 +348,22 @@ def test_tls_and_redirect_policy() raises: "http://127.0.0.1:" + String(port) + "/v1/systemone", "{}" ) stub.wait() + + +from hyf_provider.jev_client import failure_kind_for_status, retry_decision + + +def test_bounded_retry_and_budget_behavior() raises: + assert_equal(failure_kind_for_status(401), "authentication") + assert_equal(failure_kind_for_status(429), "rate_limit") + assert_equal(failure_kind_for_status(500), "internal_server") + assert_equal(failure_kind_for_status(529), "overloaded") + var policy = retry_policy(2, 50, 200, 400) + assert_true(retry_decision(policy, 0, 0, 429)) + assert_true(retry_decision(policy, 0, 0, 500)) + assert_true(not retry_decision(policy, 0, 0, 401)) + assert_true(not retry_decision(policy, 0, 0, 422)) + assert_true(not retry_decision(policy, 2, 0, 429)) + assert_true(not retry_decision(policy, 0, 390, 429)) + with assert_raises(): + _ = retry_decision(policy, 0, 0, 200)