diff --git a/GramAddict/core/navigation/brain.py b/GramAddict/core/navigation/brain.py index 93da515..ad191b0 100644 --- a/GramAddict/core/navigation/brain.py +++ b/GramAddict/core/navigation/brain.py @@ -15,7 +15,11 @@ def ask_brain_for_action( return None cfg = Config() - url = getattr(cfg.args, "ai_model_url", "http://localhost:11434/api/generate") if hasattr(cfg, "args") else "http://localhost:11434/api/generate" + url = ( + getattr(cfg.args, "ai_model_url", "http://localhost:11434/api/generate") + if hasattr(cfg, "args") + else "http://localhost:11434/api/generate" + ) model = getattr(cfg.args, "ai_model", "qwen3.5:latest") if hasattr(cfg, "args") else "qwen3.5:latest" prompt = ( @@ -40,7 +44,7 @@ def ask_brain_for_action( try: response = query_llm( - url=url, model=model, prompt="Choose the next best action.", system=prompt, format_json=False + url=url, model=model, prompt="Choose the next best action.", system=prompt, format_json=False, max_tokens=20 ) if response: result = response if isinstance(response, str) else response.get("response", "") diff --git a/tests/e2e/test_brain_live.py b/tests/e2e/test_brain_live.py index 93da266..12e1e0b 100644 --- a/tests/e2e/test_brain_live.py +++ b/tests/e2e/test_brain_live.py @@ -34,8 +34,10 @@ def test_brain_recommends_scroll_when_trapped(): logger.info(f"Brain action returned: '{brain_action}'") - if brain_action is None or brain_action == "": - pytest.skip("Brain LLM returned None or empty string. Ollama timeout or hallucination.") + assert ( + brain_action is not None and brain_action != "" + ), "Brain LLM returned None or empty string. Ollama timeout or hallucination." - if brain_action != "scroll down": - pytest.skip(f"VLM chose '{brain_action}' instead of 'scroll down'. Small local models can be flaky.") + assert ( + brain_action == "scroll down" + ), f"VLM chose '{brain_action}' instead of 'scroll down'. Small local models can be flaky." diff --git a/tests/e2e/test_goap_loop_prevention.py b/tests/e2e/test_goap_loop_prevention.py index 5d62c5f..c0e597b 100644 --- a/tests/e2e/test_goap_loop_prevention.py +++ b/tests/e2e/test_goap_loop_prevention.py @@ -320,11 +320,10 @@ def test_live_vlm_selects_following_not_followers(make_real_device_with_image): selected_id = (selected_node.resource_id or "").lower() # THE CRITICAL ASSERTION: Must be "following", NOT "followers" - if "following" not in selected_id and "following" not in selected_desc and "following" not in selected_text: - pytest.skip( - f"VLM hallucinated and selected wrong node! Got: desc='{selected_node.content_desc}', text='{selected_node.text}', id='{selected_node.resource_id}'. " - f"Skipping because small local VLMs often fail this negative constraint." - ) + assert "following" in selected_id or "following" in selected_desc or "following" in selected_text, ( + f"VLM hallucinated and selected wrong node! Got: desc='{selected_node.content_desc}', text='{selected_node.text}', id='{selected_node.resource_id}'. " + f"This proves the local VLM failed the negative constraint." + ) assert ( "followers" not in selected_id ), f"VLM CONFUSED followers with following! Selected: id='{selected_node.resource_id}'" diff --git a/tests/e2e/test_nav_home_feed.py b/tests/e2e/test_nav_home_feed.py index 2a0c01a..d22b6ba 100644 --- a/tests/e2e/test_nav_home_feed.py +++ b/tests/e2e/test_nav_home_feed.py @@ -98,8 +98,7 @@ def test_home_feed_comment_button_extraction(make_real_device_with_image): return True return False - if not _node_has_marker(result, "comment"): - pytest.skip( - f"VLM picked WRONG element for 'tap comment button'!\n" - f" Selected: id='{result.resource_id}', desc='{result.content_desc}'" - ) + assert _node_has_marker(result, "comment"), ( + f"VLM picked WRONG element for 'tap comment button'!\n" + f" Selected: id='{result.resource_id}', desc='{result.content_desc}'" + ) diff --git a/tests/e2e/test_visual_intent_resolver.py b/tests/e2e/test_visual_intent_resolver.py index f7f732f..f6a980c 100644 --- a/tests/e2e/test_visual_intent_resolver.py +++ b/tests/e2e/test_visual_intent_resolver.py @@ -120,10 +120,12 @@ def test_visual_discovery_finds_following_by_seeing(make_real_device_with_image) selected_id = (result.resource_id or "").lower() selected_desc = (result.content_desc or "").lower() - if "following" not in selected_id and "following" not in selected_desc: - pytest.skip(f"Visual discovery picked wrong node! Got: id='{result.resource_id}', desc='{result.content_desc}'") - if "followers" in selected_id: - pytest.skip(f"Visual discovery CONFUSED followers with following! Selected: id='{result.resource_id}'") + assert ( + "following" in selected_id or "following" in selected_desc + ), f"Visual discovery picked wrong node! Got: id='{result.resource_id}', desc='{result.content_desc}'" + assert ( + "followers" not in selected_id + ), f"Visual discovery CONFUSED followers with following! Selected: id='{result.resource_id}'" # ═══════════════════════════════════════════════════════