from app.services.external_query_service.planner import ExternalQueryPlanner def test_fallback_plan_stays_generic_for_fresh_weather_semantics() -> None: planner = ExternalQueryPlanner( llm_service=object(), db=object(), tenant_id=1, ) plan = planner._build_fallback_plan( question="帮我看看未来5天的广州天气如何", query_semantics={ "query_type": "status", "object_mentions": ["广州"], "query_profile": { "needs_freshness": True, "referenced_objects": ["weather"], }, }, ) assert plan.query_kind == "generic_web" assert plan.answer_contract == "summary_with_sources" assert plan.location_hint is None assert plan.result_limit == 3 def test_fallback_plan_uses_compare_contract_without_object_kind_mapping() -> None: planner = ExternalQueryPlanner( llm_service=object(), db=object(), tenant_id=1, ) plan = planner._build_fallback_plan( question="对比 OpenAI 和 Anthropic 最新模型能力差异", query_semantics={ "query_type": "compare", "object_mentions": ["OpenAI", "Anthropic"], "query_profile": { "needs_freshness": True, "referenced_objects": ["public_model"], }, }, ) assert plan.query_kind == "generic_web" assert plan.answer_contract == "compare_with_sources" assert plan.requires_multi_source is True assert plan.result_limit == 3