fix(orch): release Tier 2 allocation ctx when alloc is None; add fallback tests
This commit is contained in:
parent
02abc8e734
commit
dd39418bc8
2 changed files with 46 additions and 0 deletions
|
|
@ -125,6 +125,7 @@ def get_meal_plan_router():
|
||||||
alloc = ctx.__enter__()
|
alloc = ctx.__enter__()
|
||||||
if alloc is not None:
|
if alloc is not None:
|
||||||
return _OrchTextRouter(alloc.url), ctx
|
return _OrchTextRouter(alloc.url), ctx
|
||||||
|
ctx.__exit__(None, None, None) # release allocation before falling through
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.debug("cf-orch cf-text allocation failed, falling back to LLMRouter: %s", exc)
|
logger.debug("cf-orch cf-text allocation failed, falling back to LLMRouter: %s", exc)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,3 +80,48 @@ def test_no_cf_orch_url_returns_llm_router(monkeypatch):
|
||||||
router, ctx = get_meal_plan_router()
|
router, ctx = get_meal_plan_router()
|
||||||
|
|
||||||
assert router is mock_lr
|
assert router is mock_lr
|
||||||
|
|
||||||
|
|
||||||
|
def test_tier1_general_exception_falls_back_to_direct_allocate(monkeypatch):
|
||||||
|
"""get_meal_plan_router() falls back to direct allocation when task_allocate raises RuntimeError."""
|
||||||
|
monkeypatch.setenv("CF_ORCH_URL", "http://coord:7700")
|
||||||
|
direct_ctx = _make_direct_alloc_ctx(url="http://node:9003")
|
||||||
|
|
||||||
|
import unittest.mock as um
|
||||||
|
failing_ctx = MagicMock()
|
||||||
|
failing_ctx.__enter__ = MagicMock(side_effect=RuntimeError("coordinator down"))
|
||||||
|
failing_ctx.__exit__ = MagicMock(return_value=False)
|
||||||
|
|
||||||
|
with um.patch("app.services.meal_plan.llm_router.task_allocate",
|
||||||
|
return_value=failing_ctx), \
|
||||||
|
um.patch("app.services.meal_plan.llm_router.CFOrchClient") as MockClient:
|
||||||
|
MockClient.return_value.allocate.return_value = direct_ctx
|
||||||
|
from app.services.meal_plan.llm_router import get_meal_plan_router, _OrchTextRouter
|
||||||
|
router, ctx = get_meal_plan_router()
|
||||||
|
|
||||||
|
assert isinstance(router, _OrchTextRouter)
|
||||||
|
assert router._base_url == "http://node:9003"
|
||||||
|
|
||||||
|
|
||||||
|
def test_tier2_none_alloc_releases_ctx_and_falls_through(monkeypatch):
|
||||||
|
"""get_meal_plan_router() releases Tier 2 ctx and falls through when alloc is None."""
|
||||||
|
monkeypatch.setenv("CF_ORCH_URL", "http://coord:7700")
|
||||||
|
|
||||||
|
import unittest.mock as um
|
||||||
|
|
||||||
|
none_alloc_ctx = MagicMock()
|
||||||
|
none_alloc_ctx.__enter__ = MagicMock(return_value=None)
|
||||||
|
none_alloc_ctx.__exit__ = MagicMock(return_value=False)
|
||||||
|
|
||||||
|
mock_lr = MagicMock()
|
||||||
|
|
||||||
|
with um.patch("app.services.meal_plan.llm_router.task_allocate",
|
||||||
|
return_value=_make_task_ctx_not_registered()), \
|
||||||
|
um.patch("app.services.meal_plan.llm_router.CFOrchClient") as MockClient, \
|
||||||
|
um.patch("app.services.meal_plan.llm_router.LLMRouter", return_value=mock_lr):
|
||||||
|
MockClient.return_value.allocate.return_value = none_alloc_ctx
|
||||||
|
from app.services.meal_plan.llm_router import get_meal_plan_router
|
||||||
|
router, ctx = get_meal_plan_router()
|
||||||
|
|
||||||
|
assert router is mock_lr
|
||||||
|
none_alloc_ctx.__exit__.assert_called_once_with(None, None, None)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue