''' Author: ai-business-hql qingli.hql@alibaba-inc.com Date: 2025-07-31 19:38:08 LastEditors: ai-business-hql ai.bussiness.hql@gmail.com LastEditTime: 2025-09-03 11:00:57 FilePath: /comfyui_copilot/backend/agent_factory.py Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE ''' from agents import Agent, OpenAIChatCompletionsModel, ModelSettings from dotenv import dotenv_values from .utils.globals import LLM_DEFAULT_BASE_URL, LMSTUDIO_DEFAULT_BASE_URL, get_comfyui_copilot_api_key, is_lmstudio_url from openai import AsyncOpenAI import os from agents._config import set_default_openai_api from agents.tracing import set_tracing_disabled # from .utils.logger import log # def load_env_config(): # """Load environment variables from .env.llm file""" # from dotenv import load_dotenv # env_file_path = os.path.join(os.path.dirname(__file__), '.env.llm') # if os.path.exists(env_file_path): # load_dotenv(env_file_path) # log.info(f"Loaded environment variables from {env_file_path}") # else: # log.warning(f"Warning: .env.llm not found at {env_file_path}") # # Load environment configuration # load_env_config() set_default_openai_api("chat_completions") set_tracing_disabled(True) def create_agent(**kwargs) -> Agent: # 通过用户配置拿/环境变量 config = kwargs.pop("config") if "config" in kwargs else {} # 避免将 None 写入 headers session_id = (config or {}).get("session_id") default_headers = {} if session_id: default_headers["X-Session-ID"] = session_id # Determine base URL and API key base_url = LLM_DEFAULT_BASE_URL api_key = get_comfyui_copilot_api_key() or "" if config: if config.get("openai_base_url") and config.get("openai_base_url") != "": base_url = config.get("openai_base_url") if config.get("openai_api_key") and config.get("openai_api_key") != "": api_key = config.get("openai_api_key") # Check if this is LMStudio and adjust API key handling is_lmstudio = is_lmstudio_url(base_url) if is_lmstudio and not api_key: # LMStudio typically doesn't require an API key, use a placeholder api_key = "lmstudio-local" client = AsyncOpenAI( api_key=api_key, base_url=base_url, default_headers=default_headers, ) # Determine model with proper precedence: # 1) Explicit selection from config (model_select from frontend) # 2) Explicit kwarg 'model' (call-site override) model_from_config = (config or {}).get("model_select") model_from_kwargs = kwargs.pop("model", None) model_name = model_from_config or model_from_kwargs or "gemini-2.5-flash" model = OpenAIChatCompletionsModel(model_name, openai_client=client) # Safety: ensure no stray 'model' remains in kwargs to avoid duplicate kwarg errors kwargs.pop("model", None) if config.get("max_tokens"): return Agent(model=model, model_settings=ModelSettings(max_tokens=config.get("max_tokens") or 8192), **kwargs) return Agent(model=model, **kwargs)