import httpx from openai import OpenAI from app.config import get_settings _TIMEOUT = httpx.Timeout(connect=10, read=300, write=60, pool=10) _gpt_client: OpenAI | None = None _qwen_client: OpenAI | None = None _gemini_flash_client: OpenAI | None = None _gemini_lite_client: OpenAI | None = None _deepseek_client: OpenAI | None = None def get_gpt_client() -> OpenAI: """laozhang API — gpt-4o / gpt-4o-mini""" global _gpt_client if _gpt_client is None: s = get_settings() _gpt_client = OpenAI( base_url=s.laozhang_base_url, api_key=s.laozhang_api_key, ) return _gpt_client def get_qwen_client() -> OpenAI: """DashScope — qwen-plus""" global _qwen_client if _qwen_client is None: s = get_settings() _qwen_client = OpenAI( base_url=s.dashscope_base_url, api_key=s.dashscope_api_key, ) return _qwen_client def get_vision_client() -> OpenAI: """Google Gemini 官方 API(视觉,用于拆题+OCR)— 部署在新加坡可用""" global _gemini_flash_client if _gemini_flash_client is None: s = get_settings() _gemini_flash_client = OpenAI( base_url="https://generativelanguage.googleapis.com/v1beta/openai/", api_key=s.google_gemini_api_key, timeout=_TIMEOUT, ) return _gemini_flash_client def get_gemini_lite_client() -> OpenAI: """laozhang — gemini-3.1-flash-lite-preview(轻量,用于 AI trio)""" global _gemini_lite_client if _gemini_lite_client is None: s = get_settings() _gemini_lite_client = OpenAI( base_url=s.laozhang_base_url, api_key=s.laozhang_api_key, timeout=_TIMEOUT, ) return _gemini_lite_client def get_deepseek_client() -> OpenAI: """DeepSeek — deepseek-chat(用于 AI trio)""" global _deepseek_client if _deepseek_client is None: s = get_settings() _deepseek_client = OpenAI( base_url=s.deepseek_base_url, api_key=s.deepseek_api_key, timeout=_TIMEOUT, ) return _deepseek_client