import os # Gitea GITEA_TOKEN = os.environ.get("GITEA_TOKEN", "") GITEA_SERVER_URL = os.environ.get("GITEA_SERVER_URL", "https://gitea.com") GITEA_REPOSITORY = os.environ.get("GITEA_REPOSITORY", "") PR_NUMBER = os.environ.get("PR_NUMBER", "") PR_HEAD_BRANCH = os.environ.get("PR_HEAD_BRANCH", "") PR_BASE_BRANCH = os.environ.get("PR_BASE_BRANCH", "") FINDINGS_PATH = ".gitea/ai-review/findings.json" def get_llm_config(): """依優先順序偵測可用的 LLM,回傳 (provider, api_key, base_url, model)""" checks = [ ("openai", os.environ.get("OPENAI_API_KEY"), os.environ.get("OPENAI_BASE_URL", "https://api.openai.com/v1"), os.environ.get("OPENAI_MODEL", "gpt-4o-mini")), ("claude", os.environ.get("CLAUDE_API_KEY"), os.environ.get("CLAUDE_BASE_URL", "https://api.anthropic.com/v1"), os.environ.get("CLAUDE_MODEL", "claude-3-haiku-20240307")), ("gemini", os.environ.get("GEMINI_API_KEY"), os.environ.get("GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta"), os.environ.get("GEMINI_MODEL", "gemini-1.5-flash")), ("ollama", "ollama", os.environ.get("OLLAMA_BASE_URL", ""), os.environ.get("OLLAMA_MODEL", "")), ("amazonq", os.environ.get("AMAZONQ_API_KEY"), os.environ.get("AMAZONQ_BASE_URL", "https://q.api.aws"), os.environ.get("OPENAI_MODEL", "amazon-q")), ("kilo", os.environ.get("KILO_API_KEY"), os.environ.get("KILO_BASE_URL", "https://api.kilocode.com/v1"), os.environ.get("OPENAI_MODEL", "kilo-default")), ("roo", os.environ.get("ROO_API_KEY"), os.environ.get("ROO_BASE_URL", "https://api.roocode.com/v1"), os.environ.get("OPENAI_MODEL", "roo-default")), ("cline", os.environ.get("CLINE_API_KEY"), os.environ.get("CLINE_BASE_URL", "https://api.cline.dev/v1"), os.environ.get("OPENAI_MODEL", "cline-default")), ("continue", os.environ.get("CONTINUE_API_KEY"), os.environ.get("CONTINUE_BASE_URL", "https://api.continue.dev/v1"), os.environ.get("OPENAI_MODEL", "continue-default")), ("kade", os.environ.get("KADE_API_KEY"), os.environ.get("KADE_BASE_URL", "https://api.kade.dev/v1"), os.environ.get("OPENAI_MODEL", "kade-default")), ] for provider, key, base_url, model in checks: if key and base_url: return provider, key, base_url, model return None, None, None, None