commit 627b4424acceba823637eb92c1fd533c89225f9a
parent bdc5e462c7a5970c14f6cfd44aa896c354d95410
Author: triesap <tyson@radroots.org>
Date: Thu, 18 Jun 2026 18:00:23 -0700
provider: bound transport failure classification
Diffstat:
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: