commit c3c76758ae2da52ba530c9b7f5c0f507654161c8
parent 74b6721fc35090cd8cf77d939d0dbc0ca91a16f4
Author: triesap <tyson@radroots.org>
Date: Wed, 8 Apr 2026 20:03:39 +0000
core: add backend selection seam
Diffstat:
7 files changed, 137 insertions(+), 56 deletions(-)
diff --git a/src/hyf_core/backends/heuristic_backend.mojo b/src/hyf_core/backends/heuristic_backend.mojo
@@ -0,0 +1,28 @@
+from mojson import Value
+
+from hyf_core.capabilities.explain_result import execute_explain_result
+from hyf_core.capabilities.query_rewrite import execute_query_rewrite
+from hyf_core.capabilities.semantic_rank import execute_semantic_rank
+from hyf_core.errors import (
+ CapabilityResult,
+ capability_not_implemented_error,
+ failed_capability,
+)
+from hyf_core.request_context import RequestContext
+
+
+def backend_name() -> String:
+ return "heuristic"
+
+
+def execute_capability(
+ capability_id: String, input: Value, context: RequestContext
+) raises -> CapabilityResult:
+ if capability_id == "query_rewrite":
+ return execute_query_rewrite(input, context)
+ if capability_id == "semantic_rank":
+ return execute_semantic_rank(input, context)
+ if capability_id == "explain_result":
+ return execute_explain_result(input, context)
+
+ return failed_capability(capability_not_implemented_error(capability_id))
diff --git a/src/hyf_core/backends/selector.mojo b/src/hyf_core/backends/selector.mojo
@@ -0,0 +1,47 @@
+from mojson import Value
+
+from hyf_core.backends.heuristic_backend import (
+ backend_name as heuristic_backend_name,
+ execute_capability as execute_heuristic_capability,
+)
+from hyf_core.errors import (
+ CapabilityResult,
+ backend_unavailable_error,
+ failed_capability,
+)
+from hyf_core.request_context import (
+ RequestContext,
+ assisted_execution_requested,
+)
+
+
+@fieldwise_init
+struct BackendSelection(Copyable, Movable):
+ var backend_name: String
+ var available: Bool
+
+
+def resolve_backend(context: RequestContext) -> BackendSelection:
+ if assisted_execution_requested(context):
+ return BackendSelection(
+ backend_name="assisted_execution", available=False
+ )
+
+ return BackendSelection(
+ backend_name=heuristic_backend_name(), available=True
+ )
+
+
+def execute_capability(
+ capability_id: String, input: Value, context: RequestContext
+) raises -> CapabilityResult:
+ var selection = resolve_backend(context)
+ if not selection.available:
+ return failed_capability(
+ backend_unavailable_error(selection.backend_name)
+ )
+
+ if selection.backend_name == heuristic_backend_name():
+ return execute_heuristic_capability(capability_id, input, context)
+
+ return failed_capability(backend_unavailable_error(selection.backend_name))
diff --git a/src/hyf_core/capabilities/explain_result.mojo b/src/hyf_core/capabilities/explain_result.mojo
@@ -16,16 +16,12 @@ from hyf_core.capabilities.ranking_support import (
)
from hyf_core.errors import (
CapabilityResult,
- backend_unavailable_error,
failed_capability,
invalid_input_error,
successful_capability,
)
from hyf_core.provenance import ProvenanceSourceRef
-from hyf_core.request_context import (
- RequestContext,
- assisted_execution_requested,
-)
+from hyf_core.request_context import RequestContext
def _join_reason_summary(reasons: List[String]) -> String:
@@ -92,11 +88,6 @@ def _build_output(
def execute_explain_result(
input: Value, context: RequestContext
) raises -> CapabilityResult:
- if assisted_execution_requested(context):
- return failed_capability(
- backend_unavailable_error("assisted_execution")
- )
-
try:
var request: ExplainResultRequest = parse_explain_result_request(input)
var analysis = analyze_query_text(request.query_text, context)
diff --git a/src/hyf_core/capabilities/query_rewrite.mojo b/src/hyf_core/capabilities/query_rewrite.mojo
@@ -14,16 +14,12 @@ from hyf_core.capabilities.query_analysis import (
)
from hyf_core.errors import (
CapabilityResult,
- backend_unavailable_error,
failed_capability,
invalid_input_error,
successful_capability,
)
from hyf_core.provenance import ProvenanceSourceRef
-from hyf_core.request_context import (
- RequestContext,
- assisted_execution_requested,
-)
+from hyf_core.request_context import RequestContext
def _build_output(analysis: QueryAnalysis) raises -> Value:
@@ -47,11 +43,6 @@ def _build_output(analysis: QueryAnalysis) raises -> Value:
def execute_query_rewrite(
input: Value, context: RequestContext
) raises -> CapabilityResult:
- if assisted_execution_requested(context):
- return failed_capability(
- backend_unavailable_error("assisted_execution")
- )
-
try:
var request: QueryRewriteRequest = parse_query_rewrite_request(input)
var analysis = analyze_query_text(request.text, context)
diff --git a/src/hyf_core/capabilities/semantic_rank.mojo b/src/hyf_core/capabilities/semantic_rank.mojo
@@ -17,16 +17,12 @@ from hyf_core.capabilities.ranking_support import (
)
from hyf_core.errors import (
CapabilityResult,
- backend_unavailable_error,
failed_capability,
invalid_input_error,
successful_capability,
)
from hyf_core.provenance import ProvenanceSourceRef
-from hyf_core.request_context import (
- RequestContext,
- assisted_execution_requested,
-)
+from hyf_core.request_context import RequestContext
def _build_scored_candidates(
@@ -77,11 +73,6 @@ def _build_output(
def execute_semantic_rank(
input: Value, context: RequestContext
) raises -> CapabilityResult:
- if assisted_execution_requested(context):
- return failed_capability(
- backend_unavailable_error("assisted_execution")
- )
-
try:
var request: SemanticRankRequest = parse_semantic_rank_request(input)
var analysis = analyze_query_text(request.query_text, context)
diff --git a/src/hyf_stdio/server.mojo b/src/hyf_stdio/server.mojo
@@ -4,13 +4,11 @@ from std.sys import stdin
from mojson import Value
-from hyf_core.capabilities.explain_result import execute_explain_result
+from hyf_core.backends.selector import execute_capability as execute_backend_capability
from hyf_core.capabilities.registry import (
is_deferred_capability,
is_known_business_capability,
)
-from hyf_core.capabilities.query_rewrite import execute_query_rewrite
-from hyf_core.capabilities.semantic_rank import execute_semantic_rank
from hyf_core.errors import CapabilityFailure, CapabilityResult, CapabilitySuccess
from hyf_core.metadata import hyf_protocol_version
from hyf_stdio.codec import (
@@ -128,23 +126,11 @@ def _dispatch_capability_result(
)
-def _dispatch_query_rewrite(request: WireRequest, request_id: String) raises -> String:
- var result = execute_query_rewrite(
- request.input.clone(), request.context.copy()
- )
- return _dispatch_capability_result(request_id, request.trace_id, result)
-
-
-def _dispatch_semantic_rank(request: WireRequest, request_id: String) raises -> String:
- var result = execute_semantic_rank(
- request.input.clone(), request.context.copy()
- )
- return _dispatch_capability_result(request_id, request.trace_id, result)
-
-
-def _dispatch_explain_result(request: WireRequest, request_id: String) raises -> String:
- var result = execute_explain_result(
- request.input.clone(), request.context.copy()
+def _dispatch_business_capability(
+ request: WireRequest, request_id: String
+) raises -> String:
+ var result = execute_backend_capability(
+ request.capability, request.input.clone(), request.context.copy()
)
return _dispatch_capability_result(request_id, request.trace_id, result)
@@ -173,12 +159,12 @@ def handle_request(request: WireRequest) raises -> String:
meta=None,
)
)
- elif request.capability == "query_rewrite":
- return _dispatch_query_rewrite(request.copy(), request_id)
- elif request.capability == "semantic_rank":
- return _dispatch_semantic_rank(request.copy(), request_id)
- elif request.capability == "explain_result":
- return _dispatch_explain_result(request.copy(), request_id)
+ elif (
+ request.capability == "query_rewrite"
+ or request.capability == "semantic_rank"
+ or request.capability == "explain_result"
+ ):
+ return _dispatch_business_capability(request.copy(), request_id)
elif is_deferred_capability(request.capability):
return encode_error(_disabled_response(request))
elif is_known_business_capability(request.capability):
diff --git a/tests/test_hyf.mojo b/tests/test_hyf.mojo
@@ -2,6 +2,11 @@ from std.testing import assert_equal, assert_true, assert_raises, TestSuite
from mojson import Value, loads
+from hyf_core.backends.selector import (
+ execute_capability as execute_core_capability,
+ resolve_backend,
+)
+from hyf_core.request_context import default_request_context
from hyf_stdio.codec import decode_request, encode_error, encode_success
from hyf_stdio.envelope import WireErrorResponse, WireSuccessResponse
from hyf_stdio.errors import WireError
@@ -211,6 +216,48 @@ def test_disabled_capability_returns_capability_disabled() raises:
assert_equal(result["error"]["code"].string_value(), "capability_disabled")
+def test_backend_selector_routes_deterministic_wave() raises:
+ var context = default_request_context()
+ var selection = resolve_backend(context)
+
+ assert_equal(selection.backend_name, "heuristic")
+ assert_equal(selection.available, True)
+
+ var result = execute_core_capability(
+ "query_rewrite",
+ loads('{"text":"eggs near me with weekend pickup"}'),
+ context,
+ )
+
+ assert_true(result.success)
+ assert_equal(
+ result.success.value().meta.value().backend,
+ "heuristic",
+ )
+ assert_equal(
+ result.success.value().meta.value().execution_mode,
+ "deterministic",
+ )
+
+
+def test_backend_selector_reports_assisted_unavailable() raises:
+ var context = default_request_context()
+ context.execution_mode_preference = "assisted"
+
+ var selection = resolve_backend(context)
+ assert_equal(selection.backend_name, "assisted_execution")
+ assert_equal(selection.available, False)
+
+ var result = execute_core_capability(
+ "query_rewrite",
+ loads('{"text":"eggs near me"}'),
+ context,
+ )
+
+ assert_true(result.failure)
+ assert_equal(result.failure.value().error.code, "backend_unavailable")
+
+
def test_query_rewrite_returns_deterministic_output() raises:
var result = _dispatch(
'{"version":1,"request_id":"rewrite-1","trace_id":"trace-rewrite-1","capability":"query_rewrite","input":{"text":"eggs near me with weekend pickup"}}'