From 752609248120a20da92360f6a2540435b6b54129 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Mon, 4 May 2026 16:02:26 -0700 Subject: [PATCH] fix(llm): strengthen embed skip-verification test; add DEMO_MODE check to embed() --- circuitforge_core/llm/router.py | 5 +++++ tests/test_llm_router.py | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/circuitforge_core/llm/router.py b/circuitforge_core/llm/router.py index 5846558..593a4c0 100644 --- a/circuitforge_core/llm/router.py +++ b/circuitforge_core/llm/router.py @@ -398,6 +398,11 @@ class LLMRouter: Raises: RuntimeError: If all eligible backends are exhausted. """ + if os.environ.get("DEMO_MODE", "").lower() in ("1", "true", "yes"): + raise RuntimeError( + "AI inference is disabled in the public demo. " + "Run your own instance to use AI features." + ) order = ( fallback_order if fallback_order is not None diff --git a/tests/test_llm_router.py b/tests/test_llm_router.py index bc48a27..0ca8a81 100644 --- a/tests/test_llm_router.py +++ b/tests/test_llm_router.py @@ -189,13 +189,16 @@ def test_embed_skips_non_openai_compat_backends(): mock_client.embeddings.create.return_value = MagicMock( data=[MagicMock(embedding=[0.1])] ) + mock_openai = MagicMock(return_value=mock_client) with ( patch.object(router, "_is_reachable", return_value=True), - patch("circuitforge_core.llm.router.OpenAI", return_value=mock_client), + patch("circuitforge_core.llm.router.OpenAI", mock_openai), ): result = router.embed(["hello"]) assert result == [[0.1]] + # Only ollama reached the OpenAI constructor; anthropic was skipped by type check + mock_openai.assert_called_once() def test_embed_raises_when_all_backends_exhausted():