hyf

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

commit 627b4424acceba823637eb92c1fd533c89225f9a
parent bdc5e462c7a5970c14f6cfd44aa896c354d95410
Author: triesap <tyson@radroots.org>
Date:   Thu, 18 Jun 2026 18:00:23 -0700

provider: bound transport failure classification

Diffstat:
Msrc/hyf_provider/health.mojo | 26+++++++++++++++++---------
Msrc/hyf_provider/max_local.mojo | 48+++++++++++++++++++++++++-----------------------
Mtests/test_provider_adapter.mojo | 28+++++++++++++++++++++++-----
3 files changed, 65 insertions(+), 37 deletions(-)

diff --git a/src/hyf_provider/health.mojo b/src/hyf_provider/health.mojo @@ -1,3 +1,5 @@ +from std.time import perf_counter_ns + from hyf_assist.contract import max_local_query_rewrite_route from hyf_provider.client import make_max_local_http_client from hyf_provider.config import MaxLocalProviderConfig @@ -31,27 +33,26 @@ def _provider_status( ) +def _elapsed_ms_since(start_ns: UInt) -> Int: + return Int((perf_counter_ns() - start_ns) // 1_000_000) + + def max_local_health_failure_from_error( message: String, ) -> MaxLocalHealthFailure: - if message == "invalid_url" or message.find("invalid_url") >= 0: + if message == "invalid_url": return _health_failure("transport", "invalid_url") - if message == "timeout" or message.find("timeout") >= 0: + if message == "timeout": return _health_failure("transport", "timeout") - if message == "connection_failed" or message.find("connection_failed") >= 0: + if message == "connection_failed": return _health_failure("transport", "connection_failed") - - var lower = message.lower() - if lower.find("url") >= 0 or lower.find("scheme") >= 0: - return _health_failure("transport", "invalid_url") - if lower.find("timeout") >= 0 or lower.find("timed out") >= 0: - return _health_failure("transport", "timeout") return _health_failure("transport", "connection_failed") def resolve_max_local_provider_status( config: MaxLocalProviderConfig, ) -> MaxLocalProviderStatus: + var start_ns = perf_counter_ns() try: with make_max_local_http_client(config) as client: var response = client.get(config.health_url) @@ -60,6 +61,13 @@ def resolve_max_local_provider_status( return _provider_status(config, False, "unavailable", "non_2xx") except e: var failure = max_local_health_failure_from_error(String(e)) + if ( + failure.reason == "connection_failed" + and _elapsed_ms_since(start_ns) >= config.request_timeout_ms + ): + failure = MaxLocalHealthFailure( + kind="transport", reason="timeout" + ) return _provider_status( config, False, diff --git a/src/hyf_provider/max_local.mojo b/src/hyf_provider/max_local.mojo @@ -66,54 +66,49 @@ def _query_rewrite_failure_outcome( ) -def _matches_provider_reason(message: String, reason: String) -> Bool: - return message == reason or message.find(reason) >= 0 +def _elapsed_ms_since(start_ns: UInt) -> Int: + return Int((perf_counter_ns() - start_ns) // 1_000_000) def max_local_query_rewrite_failure_from_error( message: String, ) -> MaxLocalQueryRewriteFailure: - if _matches_provider_reason(message, "invalid_url"): + if message == "invalid_url": return MaxLocalQueryRewriteFailure( kind="transport", reason="invalid_url" ) - if _matches_provider_reason(message, "provider_non_2xx"): + if message == "timeout": + return MaxLocalQueryRewriteFailure( + kind="transport", reason="timeout" + ) + if message == "connection_failed": + return MaxLocalQueryRewriteFailure( + kind="transport", reason="connection_failed" + ) + if message == "provider_non_2xx": return MaxLocalQueryRewriteFailure( kind="http_status", reason="provider_non_2xx" ) - if _matches_provider_reason(message, "provider_error_payload"): + if message == "provider_error_payload": return MaxLocalQueryRewriteFailure( kind="provider_payload", reason="provider_error_payload" ) - if _matches_provider_reason(message, "provider_invalid_json"): + if message == "provider_invalid_json": return MaxLocalQueryRewriteFailure( kind="provider_payload", reason="provider_invalid_json" ) - if _matches_provider_reason(message, "provider_schema_invalid"): + if message == "provider_schema_invalid": return MaxLocalQueryRewriteFailure( kind="provider_payload", reason="provider_schema_invalid" ) - if _matches_provider_reason(message, "provider_empty_choices"): + if message == "provider_empty_choices": return MaxLocalQueryRewriteFailure( kind="provider_payload", reason="provider_empty_choices" ) - if _matches_provider_reason(message, "provider_missing_content"): + if message == "provider_missing_content": return MaxLocalQueryRewriteFailure( kind="provider_payload", reason="provider_missing_content" ) - var lower = message.lower() - if lower.find("url") >= 0 or lower.find("scheme") >= 0: - return MaxLocalQueryRewriteFailure( - kind="transport", reason="invalid_url" - ) - if lower.find("timeout") >= 0 or lower.find("timed out") >= 0: - return MaxLocalQueryRewriteFailure( - kind="transport", reason="timeout" - ) - if lower.find("connection") >= 0: - return MaxLocalQueryRewriteFailure( - kind="transport", reason="connection_failed" - ) return MaxLocalQueryRewriteFailure( kind="provider", reason="provider_error" ) @@ -136,8 +131,8 @@ def try_execute_query_rewrite_via_max_local_provider( config: MaxLocalProviderConfig, text: String, context: RequestContext ) -> MaxLocalQueryRewriteOutcome: with make_max_local_http_client(config) as client: + var start_ns = perf_counter_ns() try: - var start_ns = perf_counter_ns() var response = client.post( max_local_chat_completions_url(config), build_query_rewrite_request_body(config, text, context), @@ -168,6 +163,13 @@ def try_execute_query_rewrite_via_max_local_provider( var failure = max_local_query_rewrite_failure_from_error( String(e) ) + if ( + failure.reason == "provider_error" + and _elapsed_ms_since(start_ns) >= config.request_timeout_ms + ): + failure = MaxLocalQueryRewriteFailure( + kind="transport", reason="timeout" + ) return _query_rewrite_failure_outcome( String(failure.kind), String(failure.reason) ) diff --git a/tests/test_provider_adapter.mojo b/tests/test_provider_adapter.mojo @@ -123,11 +123,11 @@ def test_max_local_route_is_derived_from_assisted_contract() raises: def test_max_local_provider_failure_mapping_preserves_reason_tokens() raises: - _assert_query_rewrite_failure("timed out", "transport", "timeout") + _assert_query_rewrite_failure("timeout", "transport", "timeout") _assert_query_rewrite_failure( - "connection refused", "transport", "connection_failed" + "connection_failed", "transport", "connection_failed" ) - _assert_query_rewrite_failure("bad url scheme", "transport", "invalid_url") + _assert_query_rewrite_failure("invalid_url", "transport", "invalid_url") _assert_query_rewrite_failure( "provider_non_2xx", "http_status", "provider_non_2xx" ) @@ -159,14 +159,32 @@ def test_max_local_provider_failure_mapping_preserves_reason_tokens() raises: _assert_query_rewrite_failure( "unexpected provider failure", "provider", "provider_error" ) + _assert_query_rewrite_failure( + "timed out", "provider", "provider_error" + ) + _assert_query_rewrite_failure( + "connection refused", "provider", "provider_error" + ) + _assert_query_rewrite_failure( + "bad url scheme", "provider", "provider_error" + ) + _assert_query_rewrite_failure( + "not a timeout", "provider", "provider_error" + ) def test_max_local_health_failure_mapping_preserves_reason_tokens() raises: - _assert_health_failure("timed out", "transport", "timeout") - _assert_health_failure("bad url scheme", "transport", "invalid_url") + _assert_health_failure("timeout", "transport", "timeout") + _assert_health_failure("invalid_url", "transport", "invalid_url") + _assert_health_failure( + "connection_failed", "transport", "connection_failed" + ) _assert_health_failure( "unexpected health failure", "transport", "connection_failed" ) + _assert_health_failure("timed out", "transport", "connection_failed") + _assert_health_failure("bad url scheme", "transport", "connection_failed") + _assert_health_failure("not a timeout", "transport", "connection_failed") def test_provider_config_rejects_unconfigured_runtime() raises: