""" QA - 智能问答编排 run_qa(prompt): 按 models 顺序尝试 chat(),首个成功返回 (answer, provider)。 顺序 = vision 模型(Gemini -> NVIDIA) + text 模型(Ollama 兜底)。 即 Gemini -> NVIDIA -> Ollama 三级降级。 """ from typing import Optional, Tuple from .logger import setup_logger from .config_loader import load_config from .model_adapters.adapter_factory import build_adapters logger = setup_logger('fam-edge.qa') class QAOrchestrator: def __init__(self): self.config = load_config() self.adapters = build_adapters(self.config.get('models', [])) def run_qa(self, prompt: str, max_tokens: int = 1024) -> Tuple[Optional[str], Optional[str]]: """依次尝试各适配器的 chat(),返回 (answer, provider)。""" for adapter in self.adapters: try: answer = adapter.chat(prompt, max_tokens=max_tokens) except Exception as e: logger.warning(f"QA {adapter.provider_name} 异常: {e}") continue if answer: logger.info(f"QA 命中 provider={adapter.provider_name}") return answer, adapter.provider_name logger.info(f"QA {adapter.provider_name} 无返回,降级下一模型") return None, None