1 line
4.8 KiB
JSON
1 line
4.8 KiB
JSON
{"repo": "abhirajadhikary06/onekey", "files": {"backend/provider_detection.py": {"289eeabbffded0b0289601dc41f227e2c06e9273": {"t": 1785674604.5485363, "n": 4252, "h": "8e0e50f8c0f60480", "c": "\"\"\"\nAuto-detection of API provider based on key prefix patterns.\nAdd new providers here to expand platform support.\n\"\"\"\n\nimport re\n\n# Map of key prefixes to provider names\n# Ordered by specificity (more specific prefixes first)\nPROVIDER_PREFIX_MAP = {\n # Specific prefixes before broad/shared patterns\n \"sk-or-\": \"openrouter\",\n \"sk-live_\": \"stripe\",\n \"sk-test_\": \"stripe\",\n \"shpat_\": \"shopify\",\n \"shpca_\": \"shopify\",\n \"ntn_\": \"notion\",\n \"xoxb-\": \"slack\",\n \"xoxp-\": \"slack\",\n \"xapp-\": \"slack\",\n \"xoxa-\": \"slack\",\n \"SG.\": \"sendgrid\",\n \"sk-ant-\": \"anthropic\",\n \"sk-proj-\": \"openai\",\n \"sk-svcacct-\": \"openai\",\n \"sk-\": \"openai\",\n \"AIza\": \"gemini\",\n \"xai-\": \"grok\",\n \"gsk_\": \"groq\",\n \"mistral_\": \"mistral\",\n \"together_\": \"together\",\n \"fw_\": \"fireworks\",\n \"aph0_\": \"anyscale\",\n \"di_\": \"deepinfra\",\n \"neb-\": \"nebius\",\n \"nb-\": \"nebius\",\n \"co_\": \"cohere\",\n \"ai21_\": \"ai21\",\n \"r8_\": \"replicate\",\n \"bt_\": \"baseten\",\n \"hf_\": \"huggingface\",\n \"pplx-\": \"perplexity\",\n \"sk-\": \"deepseek\",\n \"sk-sp-\": \"qwen\",\n # \"neondb_\": \"neondb\",\n \"napi_\": \"neondb\",\n \"sbp_\": \"supabase\",\n \"pscale_tkn_\": \"planetscale\",\n \"ps_\": \"planetscale\",\n \"crdb_\": \"cockroachdb\",\n \"pcsk_\": \"pinecone\",\n \"wcs_\": \"weaviate\",\n \"qdr_\": \"qdrant\",\n \"milvus_\": \"milvus\",\n \"lancedb_\": \"lancedb\",\n \"xau_\": \"xata\",\n \"ab_\": \"airbyte\",\n \"dbtu_\": \"dbt\",\n \"dbts_\": \"dbt\",\n \"ft_\": \"fivetran\",\n \"dag_\": \"dagster\",\n \"pnu_\": \"prefect\",\n \"pnb_\": \"prefect\",\n \"atp_\": \"astronomer\",\n \"meltano_\": \"meltano\",\n \"ghp_\": \"github\",\n \"glft_\": \"gitlab\",\n \"bbat_\": \"bitbucket\",\n \"v1\": \"vercel\",\n \"rnd_\": \"render\",\n \"cfpat_\": \"cloudflare\",\n \"railway_\": \"railway\",\n \"discord_\": \"discord\",\n}\n\n\n# Regex patterns for keys that can be recognized beyond simple prefixes.\n# Keep these strict to avoid accidental provider misclassification.\nPROVIDER_REGEX_PATTERNS: list[tuple[re.Pattern[str], str]] = [\n (re.compile(r\"^github_pat_[A-Za-z0-9_]+$\"), \"github\"),\n (re.compile(r\"^ghp_[A-Za-z0-9]+$\"), \"github\"),\n (re.compile(r\"^glpat-[A-Za-z0-9_-]+$\"), \"gitlab\"),\n (re.compile(r\"^SG\\.[A-Za-z0-9_-]+$\"), \"sendgrid\"),\n (re.compile(r\"^xox[bap]-[A-Za-z0-9-]+$\"), \"slack\"),\n (re.compile(r\"^shpat_[A-Za-z0-9]+$\"), \"shopify\"),\n (re.compile(r\"^sk_(live|test)_[A-Za-z0-9]+$\"), \"stripe\"),\n (re.compile(r\"^SQ[A-Za-z0-9]{32}$\"), \"twilio\"),\n (re.compile(r\"^SK[A-Za-z0-9]{32}$\"), \"twilio\"),\n (re.compile(r\"^AC[A-Za-z0-9]{32}$\"), \"twilio\"),\n (re.compile(r\"^pnu_[A-Za-z0-9]+$\"), \"prefect\"),\n (re.compile(r\"^pnb_[A-Za-z0-9]+$\"), \"prefect\"),\n]\n\n\ndef detect_provider(api_key: str) -> str:\n \"\"\"\n Auto-detect the provider from an API key based on its prefix.\n \n Args:\n api_key: The API key string to analyze\n \n Returns:\n Provider name (e.g., 'openai', 'anthropic', 'groq')\n \n Raises:\n ValueError: If the provider cannot be detected\n \"\"\"\n if not api_key or not isinstance(api_key, str):\n raise ValueError(\"Invalid API key\")\n \n api_key = api_key.strip()\n\n # Regex checks first where format guarantees better classification.\n for pattern, provider in PROVIDER_REGEX_PATTERNS:\n if pattern.match(api_key):\n return provider\n \n # Check prefixes in order (most specific first)\n for prefix, provider in PROVIDER_PREFIX_MAP.items():\n if api_key.startswith(prefix):\n return provider\n \n # If no match found\n all_prefixes = list(PROVIDER_PREFIX_MAP.keys())\n example_prefixes_list = []\n for i in range(min(5, len(all_prefixes))):\n example_prefixes_list.append(all_prefixes[i])\n example_prefixes = \", \".join(example_prefixes_list)\n raise ValueError(\n f\"Could not detect provider from API key. \"\n f\"Key should start with a known prefix like: {example_prefixes}... \"\n f\"For providers that do not expose stable key prefixes, pass provider explicitly.\"\n )\n\n\ndef get_supported_providers() -> list[str]:\n \"\"\"\n Get a list of all supported provider names.\n \n Returns:\n Sorted list of unique provider names\n \"\"\"\n return sorted(set(PROVIDER_PREFIX_MAP.values()))\n"}}}} |