1 line
46 KiB
JSON
1 line
46 KiB
JSON
{"repo": "cchenbin042/codex-cli-proxy", "files": {"src/config.py": {"a46d9981cc94903dd2f39c0ffbe4a2af7c4c506b": {"t": 1785746896.184517, "n": 10479, "h": "11d37a3a6100ead1", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nimport json\nimport os\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass RetryConfig:\n max_retries: int = 3\n backoff_base: float = 2.0\n\n\n@dataclass\nclass CircuitBreakerConfig:\n failure_threshold: int = 5\n cooldown_seconds: float = 30.0\n\n\n@dataclass\nclass ConcurrencyConfig:\n max_concurrent: int = 10\n queue_timeout: float = 30.0\n\n\n@dataclass\nclass RateLimitConfig:\n requests_per_minute: int = 30\n burst_size: int = 30\n\n\n@dataclass\nclass ReliabilityConfig:\n retry: RetryConfig = field(default_factory=RetryConfig)\n circuit_breaker: CircuitBreakerConfig = field(default_factory=CircuitBreakerConfig)\n concurrency: ConcurrencyConfig = field(default_factory=ConcurrencyConfig)\n rate_limit: RateLimitConfig = field(default_factory=RateLimitConfig)\n\n\n@dataclass\nclass ProviderConfig:\n api_base: str\n api_keys: list[str]\n default_model: str = \"\"\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n reliability: ReliabilityConfig = field(default_factory=ReliabilityConfig)\n providers: dict[str, ProviderConfig] = field(default_factory=dict)\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n @staticmethod\n def normalize_model_name(model: str) -> str:\n \"\"\"Normalize a model name for the upstream provider.\n\n Handles HuggingFace-style names (org/Model-Name) by extracting the\n last segment and lowercasing it. Simple names pass through as-is.\n\n >>> Config.normalize_model_name(\"deepseek-ai/DeepSeek-V4-Pro\")\n 'deepseek-v4-pro'\n >>> Config.normalize_model_name(\"gpt-5.5\")\n 'gpt-5.5'\n \"\"\"\n if \"/\" in model:\n model = model.rsplit(\"/\", 1)[-1]\n return model.lower()\n\n def get_provider_name(self, model: str) -> str:\n \"\"\"Extract provider name from model_map value (format: 'provider:model').\n\n Falls back to __default__ mapping if the model is not found, and finally\n to \"deepseek\" if nothing else matches.\n \"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[0]\n if model in self.model_map:\n # Model is in map with a bare value (no provider prefix) → use deepseek\n return \"deepseek\"\n # Model not in map — check __default__ fallback\n default_mapped = self.model_map.get(\"__default__\", \"\")\n if isinstance(default_mapped, str) and \":\" in default_mapped:\n return default_mapped.split(\":\", 1)[0]\n if isinstance(default_mapped, str) and default_mapped:\n if default_mapped in self.providers:\n return default_mapped\n return \"deepseek\"\n return \"deepseek\"\n\n def get_provider_model(self, model: str) -> str:\n \"\"\"Extract vendor model name from model_map value (format: 'provider:model').\n\n For models not in the map, normalizes the name (handling HuggingFace\n org/model format) so it's more likely to be accepted upstream.\n Falls back to __default__ if configured.\n \"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[1]\n if model in self.model_map:\n # Model is in map with a bare value → use the mapped value directly\n return mapped\n # Model not in map — check __default__ fallback first\n default_mapped = self.model_map.get(\"__default__\", \"\")\n if isinstance(default_mapped, str) and \":\" in default_mapped:\n return default_mapped.split(\":\", 1)[1]\n if isinstance(default_mapped, str) and default_mapped:\n if default_mapped in self.providers:\n return self.normalize_model_name(model)\n return default_mapped\n # No __default__ — normalize dynamically (handles HF-style names)\n return self.normalize_model_name(model)\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys — warn but don't exit (let UI handle)\n PLACEHOLDER = frozenset({\"sk-xxx\", \"***\"})\n valid_keys = [k for k in api_keys if k and k not in PLACEHOLDER]\n if not valid_keys:\n print(\n \"[WARNING] No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual API key(s), then restart the proxy. \"\n \"See: https://platform.deepseek.com/api_keys\",\n flush=True,\n )\n\n reliability_data = data.get(\"reliability\", {})\n retry_data = reliability_data.get(\"retry\", {})\n cb_data = reliability_data.get(\"circuit_breaker\", {})\n concurrency_data = reliability_data.get(\"concurrency\", {})\n rl_data = reliability_data.get(\"rate_limit\", {})\n\n retry_cfg = RetryConfig(\n max_retries=retry_data.get(\"max_retries\", 3),\n backoff_base=retry_data.get(\"backoff_base\", 2.0),\n )\n cb_cfg = CircuitBreakerConfig(\n failure_threshold=cb_data.get(\"failure_threshold\", 5),\n cooldown_seconds=cb_data.get(\"cooldown_seconds\", 30.0),\n )\n concurrency_cfg = ConcurrencyConfig(\n max_concurrent=concurrency_data.get(\"max_concurrent\", 10),\n queue_timeout=concurrency_data.get(\"queue_timeout\", 30.0),\n )\n rl_cfg = RateLimitConfig(\n requests_per_minute=rl_data.get(\"requests_per_minute\", 30),\n burst_size=rl_data.get(\"burst_size\", 30),\n )\n\n # Parse provider-specific configurations.\n # Always create provider entries (even with empty keys) to preserve api_base\n # for later env-var injection in _apply_env_overrides.\n providers: dict[str, ProviderConfig] = {}\n providers_data = data.get(\"providers\", {})\n for pname, pdata in providers_data.items():\n pkeys = pdata.get(\"api_keys\", [])\n pvalid_keys = [k for k in pkeys if k and k not in PLACEHOLDER]\n providers[pname] = ProviderConfig(\n api_base=pdata.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=pvalid_keys,\n )\n\n server = data.get(\"server\", {})\n config = Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n reliability=ReliabilityConfig(\n retry=retry_cfg,\n circuit_breaker=cb_cfg,\n concurrency=concurrency_cfg,\n rate_limit=rl_cfg,\n ),\n providers=providers,\n )\n return _apply_env_overrides(config)\n\n\ndef _apply_env_overrides(config: Config) -> Config:\n \"\"\"Apply environment variable overrides to the config.\n\n Supported env vars (priority: env > YAML > default):\n - CLI_PROXY_API_KEYS (comma-separated, overrides deepseek.api_keys)\n - CLI_PROXY_API_BASE (overrides deepseek.api_base)\n - CLI_PROXY_THINKING_DISABLED (accepts \"true\"/\"1\"/\"yes\" vs others)\n - CLI_PROXY_<NAME>_API_KEYS (overrides providers.<name>.api_keys)\n - CLI_PROXY_MODEL_MAP (JSON object, merges into model_map)\n \"\"\"\n if env_keys := os.environ.get(\"CLI_PROXY_API_KEYS\"):\n api_keys = [k.strip() for k in env_keys.split(\",\") if k.strip()]\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\" and k != \"***\"]\n if valid_keys:\n config.api_keys = valid_keys\n\n if env_base := os.environ.get(\"CLI_PROXY_API_BASE\"):\n config.api_base = env_base\n\n if env_thinking := os.environ.get(\"CLI_PROXY_THINKING_DISABLED\"):\n config.thinking_disabled = env_thinking.lower() in (\"true\", \"1\", \"yes\")\n\n # Merge model_map from desktop (JSON-encoded, overrides bundled config.yaml)\n if env_model_map := os.environ.get(\"CLI_PROXY_MODEL_MAP\"):\n try:\n desktop_map = json.loads(env_model_map)\n if isinstance(desktop_map, dict):\n # Desktop model_map takes priority over bundled YAML\n config.model_map = {**config.model_map, **desktop_map}\n except json.JSONDecodeError:\n pass\n\n # Apply provider-specific env var overrides (e.g. CLI_PROXY_SILICONFLOW_API_KEYS)\n for env_key, env_val in os.environ.items():\n if not env_key.startswith(\"CLI_PROXY_\"):\n continue\n if env_key in (\"CLI_PROXY_API_KEYS\", \"CLI_PROXY_MODEL_MAP\", \"CLI_PROXY_THINKING_DISABLED\"):\n continue # already handled above\n if env_key.endswith(\"_DEFAULT_MODEL\"):\n pname = env_key[len(\"CLI_PROXY_\"):-len(\"_DEFAULT_MODEL\")].lower()\n if pname in config.providers:\n config.providers[pname].default_model = env_val\n continue\n if not env_key.endswith(\"_API_KEYS\"):\n continue\n pname = env_key[len(\"CLI_PROXY_\"):-len(\"_API_KEYS\")].lower()\n pkeys = [k.strip() for k in env_val.split(\",\") if k.strip()]\n pvalid = [k for k in pkeys if k and k != \"sk-xxx\" and k != \"***\"]\n if not pvalid:\n continue\n if pname in config.providers:\n config.providers[pname].api_keys = pvalid\n else:\n config.providers[pname] = ProviderConfig(\n api_base=config.api_base,\n api_keys=pvalid,\n )\n\n return config\n"}, "ea67706419110cf287e55cd21e27274aeeac5d77": {"t": 1785768623.9599898, "n": 8363, "h": "8ade332035f5adb5", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass RetryConfig:\n max_retries: int = 3\n backoff_base: float = 2.0\n\n\n@dataclass\nclass CircuitBreakerConfig:\n failure_threshold: int = 5\n cooldown_seconds: float = 30.0\n\n\n@dataclass\nclass ConcurrencyConfig:\n max_concurrent: int = 10\n queue_timeout: float = 30.0\n\n\n@dataclass\nclass RateLimitConfig:\n requests_per_minute: int = 30\n burst_size: int = 30\n\n\n@dataclass\nclass ReliabilityConfig:\n retry: RetryConfig = field(default_factory=RetryConfig)\n circuit_breaker: CircuitBreakerConfig = field(default_factory=CircuitBreakerConfig)\n concurrency: ConcurrencyConfig = field(default_factory=ConcurrencyConfig)\n rate_limit: RateLimitConfig = field(default_factory=RateLimitConfig)\n\n\n@dataclass\nclass ProviderConfig:\n api_base: str\n api_keys: list[str]\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n reliability: ReliabilityConfig = field(default_factory=ReliabilityConfig)\n providers: dict[str, ProviderConfig] = field(default_factory=dict)\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n def get_provider_name(self, model: str) -> str:\n \"\"\"Extract provider name from model_map value (format: 'provider:model').\n\n Falls back to __default__ mapping if the model is not found, and finally\n to \"deepseek\" if nothing else matches.\n \"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[0]\n # Check for __default__ fallback\n default_mapped = self.model_map.get(\"__default__\", \"\")\n if isinstance(default_mapped, str) and \":\" in default_mapped:\n return default_mapped.split(\":\", 1)[0]\n if isinstance(default_mapped, str) and default_mapped:\n return default_mapped # bare provider name (e.g. \"siliconflow\")\n return \"deepseek\"\n\n def get_provider_model(self, model: str) -> str:\n \"\"\"Extract vendor model name from model_map value (format: 'provider:model').\n\n Falls back to __default__ mapping if the model is not found.\n \"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[1]\n # Check for __default__ fallback\n default_mapped = self.model_map.get(\"__default__\", \"\")\n if isinstance(default_mapped, str) and \":\" in default_mapped:\n return default_mapped.split(\":\", 1)[1]\n if isinstance(default_mapped, str) and default_mapped:\n return model # bare provider name → pass through original model\n return mapped\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys — warn but don't exit (let UI handle)\n PLACEHOLDER = frozenset({\"sk-xxx\", \"***\"})\n valid_keys = [k for k in api_keys if k and k not in PLACEHOLDER]\n if not valid_keys:\n print(\n \"[WARNING] No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual API key(s), then restart the proxy. \"\n \"See: https://platform.deepseek.com/api_keys\",\n flush=True,\n )\n\n reliability_data = data.get(\"reliability\", {})\n retry_data = reliability_data.get(\"retry\", {})\n cb_data = reliability_data.get(\"circuit_breaker\", {})\n concurrency_data = reliability_data.get(\"concurrency\", {})\n rl_data = reliability_data.get(\"rate_limit\", {})\n\n retry_cfg = RetryConfig(\n max_retries=retry_data.get(\"max_retries\", 3),\n backoff_base=retry_data.get(\"backoff_base\", 2.0),\n )\n cb_cfg = CircuitBreakerConfig(\n failure_threshold=cb_data.get(\"failure_threshold\", 5),\n cooldown_seconds=cb_data.get(\"cooldown_seconds\", 30.0),\n )\n concurrency_cfg = ConcurrencyConfig(\n max_concurrent=concurrency_data.get(\"max_concurrent\", 10),\n queue_timeout=concurrency_data.get(\"queue_timeout\", 30.0),\n )\n rl_cfg = RateLimitConfig(\n requests_per_minute=rl_data.get(\"requests_per_minute\", 30),\n burst_size=rl_data.get(\"burst_size\", 30),\n )\n\n # Parse provider-specific configurations.\n # Always create provider entries (even with empty keys) to preserve api_base\n # for later env-var injection in _apply_env_overrides.\n providers: dict[str, ProviderConfig] = {}\n providers_data = data.get(\"providers\", {})\n for pname, pdata in providers_data.items():\n pkeys = pdata.get(\"api_keys\", [])\n pvalid_keys = [k for k in pkeys if k and k not in PLACEHOLDER]\n providers[pname] = ProviderConfig(\n api_base=pdata.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=pvalid_keys,\n )\n\n server = data.get(\"server\", {})\n config = Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n reliability=ReliabilityConfig(\n retry=retry_cfg,\n circuit_breaker=cb_cfg,\n concurrency=concurrency_cfg,\n rate_limit=rl_cfg,\n ),\n providers=providers,\n )\n return _apply_env_overrides(config)\n\n\ndef _apply_env_overrides(config: Config) -> Config:\n \"\"\"Apply environment variable overrides to the config.\n\n Supported env vars (priority: env > YAML > default):\n - CLI_PROXY_API_KEYS (comma-separated, overrides deepseek.api_keys)\n - CLI_PROXY_API_BASE (overrides deepseek.api_base)\n - CLI_PROXY_THINKING_DISABLED (accepts \"true\"/\"1\"/\"yes\" vs others)\n - CLI_PROXY_<NAME>_API_KEYS (overrides providers.<name>.api_keys)\n \"\"\"\n if env_keys := os.environ.get(\"CLI_PROXY_API_KEYS\"):\n api_keys = [k.strip() for k in env_keys.split(\",\") if k.strip()]\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\" and k != \"***\"]\n if valid_keys:\n config.api_keys = valid_keys\n\n if env_base := os.environ.get(\"CLI_PROXY_API_BASE\"):\n config.api_base = env_base\n\n if env_thinking := os.environ.get(\"CLI_PROXY_THINKING_DISABLED\"):\n config.thinking_disabled = env_thinking.lower() in (\"true\", \"1\", \"yes\")\n\n # Apply provider-specific env var overrides (e.g. CLI_PROXY_QWEN_API_KEYS)\n for env_key, env_val in os.environ.items():\n if not env_key.startswith(\"CLI_PROXY_\") or not env_key.endswith(\"_API_KEYS\"):\n continue\n if env_key == \"CLI_PROXY_API_KEYS\":\n continue # already handled above\n pname = env_key[len(\"CLI_PROXY_\"):-len(\"_API_KEYS\")].lower()\n pkeys = [k.strip() for k in env_val.split(\",\") if k.strip()]\n pvalid = [k for k in pkeys if k and k != \"sk-xxx\" and k != \"***\"]\n if not pvalid:\n continue\n if pname in config.providers:\n config.providers[pname].api_keys = pvalid\n else:\n config.providers[pname] = ProviderConfig(\n api_base=config.api_base,\n api_keys=pvalid,\n )\n\n return config\n"}, "92d5c78c9d80fa488ea152c5b901a1b5dbf9605f": {"t": 1785768626.9170074, "n": 6422, "h": "f257a2ac4c4e3694", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass RetryConfig:\n max_retries: int = 3\n backoff_base: float = 2.0\n\n\n@dataclass\nclass CircuitBreakerConfig:\n failure_threshold: int = 5\n cooldown_seconds: float = 30.0\n\n\n@dataclass\nclass ConcurrencyConfig:\n max_concurrent: int = 10\n queue_timeout: float = 30.0\n\n\n@dataclass\nclass RateLimitConfig:\n requests_per_minute: int = 30\n burst_size: int = 30\n\n\n@dataclass\nclass ReliabilityConfig:\n retry: RetryConfig = field(default_factory=RetryConfig)\n circuit_breaker: CircuitBreakerConfig = field(default_factory=CircuitBreakerConfig)\n concurrency: ConcurrencyConfig = field(default_factory=ConcurrencyConfig)\n rate_limit: RateLimitConfig = field(default_factory=RateLimitConfig)\n\n\n@dataclass\nclass ProviderConfig:\n api_base: str\n api_keys: list[str]\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n reliability: ReliabilityConfig = field(default_factory=ReliabilityConfig)\n providers: dict[str, ProviderConfig] = field(default_factory=dict)\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n def get_provider_name(self, model: str) -> str:\n \"\"\"Extract provider name from model_map value (format: 'provider:model').\"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[0]\n return \"deepseek\"\n\n def get_provider_model(self, model: str) -> str:\n \"\"\"Extract vendor model name from model_map value (format: 'provider:model').\"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[1]\n return mapped\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys — warn but don't exit (let UI handle)\n PLACEHOLDER = frozenset({\"sk-xxx\", \"***\"})\n valid_keys = [k for k in api_keys if k and k not in PLACEHOLDER]\n if not valid_keys:\n print(\n \"[WARNING] No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual API key(s), then restart the proxy. \"\n \"See: https://platform.deepseek.com/api_keys\",\n flush=True,\n )\n\n reliability_data = data.get(\"reliability\", {})\n retry_data = reliability_data.get(\"retry\", {})\n cb_data = reliability_data.get(\"circuit_breaker\", {})\n concurrency_data = reliability_data.get(\"concurrency\", {})\n rl_data = reliability_data.get(\"rate_limit\", {})\n\n retry_cfg = RetryConfig(\n max_retries=retry_data.get(\"max_retries\", 3),\n backoff_base=retry_data.get(\"backoff_base\", 2.0),\n )\n cb_cfg = CircuitBreakerConfig(\n failure_threshold=cb_data.get(\"failure_threshold\", 5),\n cooldown_seconds=cb_data.get(\"cooldown_seconds\", 30.0),\n )\n concurrency_cfg = ConcurrencyConfig(\n max_concurrent=concurrency_data.get(\"max_concurrent\", 10),\n queue_timeout=concurrency_data.get(\"queue_timeout\", 30.0),\n )\n rl_cfg = RateLimitConfig(\n requests_per_minute=rl_data.get(\"requests_per_minute\", 30),\n burst_size=rl_data.get(\"burst_size\", 30),\n )\n\n # Parse provider-specific configurations\n providers: dict[str, ProviderConfig] = {}\n providers_data = data.get(\"providers\", {})\n for pname, pdata in providers_data.items():\n pkeys = pdata.get(\"api_keys\", [])\n pvalid_keys = [k for k in pkeys if k and k not in PLACEHOLDER]\n if not pvalid_keys:\n continue\n providers[pname] = ProviderConfig(\n api_base=pdata.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=pvalid_keys,\n )\n\n server = data.get(\"server\", {})\n config = Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n reliability=ReliabilityConfig(\n retry=retry_cfg,\n circuit_breaker=cb_cfg,\n concurrency=concurrency_cfg,\n rate_limit=rl_cfg,\n ),\n providers=providers,\n )\n return _apply_env_overrides(config)\n\n\ndef _apply_env_overrides(config: Config) -> Config:\n \"\"\"Apply environment variable overrides to the config.\n\n Supported env vars (priority: env > YAML > default):\n - CLI_PROXY_API_KEYS (comma-separated, overrides deepseek.api_keys)\n - CLI_PROXY_API_BASE (overrides deepseek.api_base)\n - CLI_PROXY_THINKING_DISABLED (accepts \"true\"/\"1\"/\"yes\" vs others)\n \"\"\"\n if env_keys := os.environ.get(\"CLI_PROXY_API_KEYS\"):\n api_keys = [k.strip() for k in env_keys.split(\",\") if k.strip()]\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\" and k != \"***\"]\n if valid_keys:\n config.api_keys = valid_keys\n\n if env_base := os.environ.get(\"CLI_PROXY_API_BASE\"):\n config.api_base = env_base\n\n if env_thinking := os.environ.get(\"CLI_PROXY_THINKING_DISABLED\"):\n config.thinking_disabled = env_thinking.lower() in (\"true\", \"1\", \"yes\")\n\n return config\n"}, "017d1fd80c21e46fa702dd0bfe5eace2710417f7": {"t": 1785768629.4638844, "n": 6346, "h": "a9bcbddb5365d7bc", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass RetryConfig:\n max_retries: int = 3\n backoff_base: float = 2.0\n\n\n@dataclass\nclass CircuitBreakerConfig:\n failure_threshold: int = 5\n cooldown_seconds: float = 30.0\n\n\n@dataclass\nclass ConcurrencyConfig:\n max_concurrent: int = 10\n queue_timeout: float = 30.0\n\n\n@dataclass\nclass RateLimitConfig:\n requests_per_minute: int = 30\n burst_size: int = 30\n\n\n@dataclass\nclass ReliabilityConfig:\n retry: RetryConfig = field(default_factory=RetryConfig)\n circuit_breaker: CircuitBreakerConfig = field(default_factory=CircuitBreakerConfig)\n concurrency: ConcurrencyConfig = field(default_factory=ConcurrencyConfig)\n rate_limit: RateLimitConfig = field(default_factory=RateLimitConfig)\n\n\n@dataclass\nclass ProviderConfig:\n api_base: str\n api_keys: list[str]\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n reliability: ReliabilityConfig = field(default_factory=ReliabilityConfig)\n providers: dict[str, ProviderConfig] = field(default_factory=dict)\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n if not self.api_keys:\n return \"\"\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n def get_provider_name(self, model: str) -> str:\n \"\"\"Extract provider name from model_map value (format: 'provider:model').\"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[0]\n return \"deepseek\"\n\n def get_provider_model(self, model: str) -> str:\n \"\"\"Extract vendor model name from model_map value (format: 'provider:model').\"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[1]\n return mapped\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys — warn but don't exit (let UI handle)\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if not valid_keys:\n print(\n \"[WARNING] No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual API key(s), then restart the proxy. \"\n \"See: https://platform.deepseek.com/api_keys\",\n flush=True,\n )\n\n reliability_data = data.get(\"reliability\", {})\n retry_data = reliability_data.get(\"retry\", {})\n cb_data = reliability_data.get(\"circuit_breaker\", {})\n concurrency_data = reliability_data.get(\"concurrency\", {})\n rl_data = reliability_data.get(\"rate_limit\", {})\n\n retry_cfg = RetryConfig(\n max_retries=retry_data.get(\"max_retries\", 3),\n backoff_base=retry_data.get(\"backoff_base\", 2.0),\n )\n cb_cfg = CircuitBreakerConfig(\n failure_threshold=cb_data.get(\"failure_threshold\", 5),\n cooldown_seconds=cb_data.get(\"cooldown_seconds\", 30.0),\n )\n concurrency_cfg = ConcurrencyConfig(\n max_concurrent=concurrency_data.get(\"max_concurrent\", 10),\n queue_timeout=concurrency_data.get(\"queue_timeout\", 30.0),\n )\n rl_cfg = RateLimitConfig(\n requests_per_minute=rl_data.get(\"requests_per_minute\", 30),\n burst_size=rl_data.get(\"burst_size\", 30),\n )\n\n # Parse provider-specific configurations\n providers: dict[str, ProviderConfig] = {}\n providers_data = data.get(\"providers\", {})\n for pname, pdata in providers_data.items():\n pkeys = pdata.get(\"api_keys\", [])\n pvalid_keys = [k for k in pkeys if k and k != \"sk-xxx\"]\n if not pvalid_keys:\n continue\n providers[pname] = ProviderConfig(\n api_base=pdata.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=pvalid_keys,\n )\n\n server = data.get(\"server\", {})\n config = Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n reliability=ReliabilityConfig(\n retry=retry_cfg,\n circuit_breaker=cb_cfg,\n concurrency=concurrency_cfg,\n rate_limit=rl_cfg,\n ),\n providers=providers,\n )\n return _apply_env_overrides(config)\n\n\ndef _apply_env_overrides(config: Config) -> Config:\n \"\"\"Apply environment variable overrides to the config.\n\n Supported env vars (priority: env > YAML > default):\n - CLI_PROXY_API_KEYS (comma-separated, overrides deepseek.api_keys)\n - CLI_PROXY_API_BASE (overrides deepseek.api_base)\n - CLI_PROXY_THINKING_DISABLED (accepts \"true\"/\"1\"/\"yes\" vs others)\n \"\"\"\n if env_keys := os.environ.get(\"CLI_PROXY_API_KEYS\"):\n api_keys = [k.strip() for k in env_keys.split(\",\") if k.strip()]\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if valid_keys:\n config.api_keys = valid_keys\n\n if env_base := os.environ.get(\"CLI_PROXY_API_BASE\"):\n config.api_base = env_base\n\n if env_thinking := os.environ.get(\"CLI_PROXY_THINKING_DISABLED\"):\n config.thinking_disabled = env_thinking.lower() in (\"true\", \"1\", \"yes\")\n\n return config\n"}, "c3302ae09a78089dad804774ff49f1e340c581fc": {"t": 1785768630.647818, "n": 6103, "h": "48c2156dce62b525", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass RetryConfig:\n max_retries: int = 3\n backoff_base: float = 2.0\n\n\n@dataclass\nclass CircuitBreakerConfig:\n failure_threshold: int = 5\n cooldown_seconds: float = 30.0\n\n\n@dataclass\nclass ConcurrencyConfig:\n max_concurrent: int = 10\n queue_timeout: float = 30.0\n\n\n@dataclass\nclass RateLimitConfig:\n requests_per_minute: int = 30\n burst_size: int = 30\n\n\n@dataclass\nclass ReliabilityConfig:\n retry: RetryConfig = field(default_factory=RetryConfig)\n circuit_breaker: CircuitBreakerConfig = field(default_factory=CircuitBreakerConfig)\n concurrency: ConcurrencyConfig = field(default_factory=ConcurrencyConfig)\n rate_limit: RateLimitConfig = field(default_factory=RateLimitConfig)\n\n\n@dataclass\nclass ProviderConfig:\n api_base: str\n api_keys: list[str]\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n reliability: ReliabilityConfig = field(default_factory=ReliabilityConfig)\n providers: dict[str, ProviderConfig] = field(default_factory=dict)\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n def get_provider_name(self, model: str) -> str:\n \"\"\"Extract provider name from model_map value (format: 'provider:model').\"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[0]\n return \"deepseek\"\n\n def get_provider_model(self, model: str) -> str:\n \"\"\"Extract vendor model name from model_map value (format: 'provider:model').\"\"\"\n mapped = self.model_map.get(model, model)\n if \":\" in mapped:\n return mapped.split(\":\", 1)[1]\n return mapped\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if not valid_keys:\n raise SystemExit(\n \"No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual DeepSeek API key.\"\n )\n\n reliability_data = data.get(\"reliability\", {})\n retry_data = reliability_data.get(\"retry\", {})\n cb_data = reliability_data.get(\"circuit_breaker\", {})\n concurrency_data = reliability_data.get(\"concurrency\", {})\n rl_data = reliability_data.get(\"rate_limit\", {})\n\n retry_cfg = RetryConfig(\n max_retries=retry_data.get(\"max_retries\", 3),\n backoff_base=retry_data.get(\"backoff_base\", 2.0),\n )\n cb_cfg = CircuitBreakerConfig(\n failure_threshold=cb_data.get(\"failure_threshold\", 5),\n cooldown_seconds=cb_data.get(\"cooldown_seconds\", 30.0),\n )\n concurrency_cfg = ConcurrencyConfig(\n max_concurrent=concurrency_data.get(\"max_concurrent\", 10),\n queue_timeout=concurrency_data.get(\"queue_timeout\", 30.0),\n )\n rl_cfg = RateLimitConfig(\n requests_per_minute=rl_data.get(\"requests_per_minute\", 30),\n burst_size=rl_data.get(\"burst_size\", 30),\n )\n\n # Parse provider-specific configurations\n providers: dict[str, ProviderConfig] = {}\n providers_data = data.get(\"providers\", {})\n for pname, pdata in providers_data.items():\n pkeys = pdata.get(\"api_keys\", [])\n pvalid_keys = [k for k in pkeys if k and k != \"sk-xxx\"]\n if not pvalid_keys:\n continue\n providers[pname] = ProviderConfig(\n api_base=pdata.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=pvalid_keys,\n )\n\n server = data.get(\"server\", {})\n config = Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n reliability=ReliabilityConfig(\n retry=retry_cfg,\n circuit_breaker=cb_cfg,\n concurrency=concurrency_cfg,\n rate_limit=rl_cfg,\n ),\n providers=providers,\n )\n return _apply_env_overrides(config)\n\n\ndef _apply_env_overrides(config: Config) -> Config:\n \"\"\"Apply environment variable overrides to the config.\n\n Supported env vars (priority: env > YAML > default):\n - CLI_PROXY_API_KEYS (comma-separated, overrides deepseek.api_keys)\n - CLI_PROXY_API_BASE (overrides deepseek.api_base)\n - CLI_PROXY_THINKING_DISABLED (accepts \"true\"/\"1\"/\"yes\" vs others)\n \"\"\"\n if env_keys := os.environ.get(\"CLI_PROXY_API_KEYS\"):\n api_keys = [k.strip() for k in env_keys.split(\",\") if k.strip()]\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if valid_keys:\n config.api_keys = valid_keys\n\n if env_base := os.environ.get(\"CLI_PROXY_API_BASE\"):\n config.api_base = env_base\n\n if env_thinking := os.environ.get(\"CLI_PROXY_THINKING_DISABLED\"):\n config.thinking_disabled = env_thinking.lower() in (\"true\", \"1\", \"yes\")\n\n return config\n"}, "27f5cd8c021c7dd2d797edbacd543fdd8703b35d": {"t": 1785768631.7971423, "n": 2740, "h": "4443d8c91ba8e26d", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if not valid_keys:\n raise SystemExit(\n \"No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual DeepSeek API key.\"\n )\n\n server = data.get(\"server\", {})\n config = Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n )\n return _apply_env_overrides(config)\n\n\ndef _apply_env_overrides(config: Config) -> Config:\n \"\"\"Apply environment variable overrides to the config.\n\n Supported env vars (priority: env > YAML > default):\n - CLI_PROXY_API_KEYS (comma-separated, overrides deepseek.api_keys)\n - CLI_PROXY_API_BASE (overrides deepseek.api_base)\n - CLI_PROXY_THINKING_DISABLED (accepts \"true\"/\"1\"/\"yes\" vs others)\n \"\"\"\n if env_keys := os.environ.get(\"CLI_PROXY_API_KEYS\"):\n api_keys = [k.strip() for k in env_keys.split(\",\") if k.strip()]\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if valid_keys:\n config.api_keys = valid_keys\n\n if env_base := os.environ.get(\"CLI_PROXY_API_BASE\"):\n config.api_base = env_base\n\n if env_thinking := os.environ.get(\"CLI_PROXY_THINKING_DISABLED\"):\n config.thinking_disabled = env_thinking.lower() in (\"true\", \"1\", \"yes\")\n\n return config\n"}, "490c9f1a0e05dd56e9bf00764c31f2c0977f4fa9": {"t": 1785768633.3691804, "n": 1782, "h": "f2ec5d5213f5aa3c", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n thinking_disabled: bool = False\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if not valid_keys:\n raise SystemExit(\n \"No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual DeepSeek API key.\"\n )\n\n server = data.get(\"server\", {})\n return Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n thinking_disabled=deepseek.get(\"thinking_disabled\", False),\n )\n"}, "0c866c4884bf50878fac9306618e58aea4fc27bb": {"t": 1785768634.721942, "n": 1678, "h": "3f8a2c0de768b592", "c": "\"\"\"Configuration loader for cli-proxy.\"\"\"\n\nfrom pathlib import Path\nfrom dataclasses import dataclass, field\n\nimport yaml\n\n\n@dataclass\nclass Config:\n server_host: str\n server_port: int\n api_base: str\n api_keys: list[str]\n model_map: dict[str, str]\n _key_index: int = field(default=0, repr=False)\n\n def get_api_key(self) -> str:\n key = self.api_keys[self._key_index % len(self.api_keys)]\n self._key_index += 1\n return key\n\n def map_model(self, model: str) -> str:\n return self.model_map.get(model, model)\n\n\ndef load_config(path: str = \"config.yaml\") -> Config:\n config_path = Path(path)\n if not config_path.exists():\n raise SystemExit(f\"Config file not found: {path}\")\n\n with open(config_path, \"r\", encoding=\"utf-8\") as f:\n try:\n data = yaml.safe_load(f)\n except yaml.YAMLError as e:\n raise SystemExit(f\"Invalid YAML in config: {e}\")\n\n if data is None:\n raise SystemExit(\"Config file is empty\")\n\n deepseek = data.get(\"deepseek\", {})\n api_keys = deepseek.get(\"api_keys\", [])\n\n # Filter out placeholder keys\n valid_keys = [k for k in api_keys if k and k != \"sk-xxx\"]\n if not valid_keys:\n raise SystemExit(\n \"No valid API key configured in config.yaml. \"\n \"Replace 'sk-xxx' with your actual DeepSeek API key.\"\n )\n\n server = data.get(\"server\", {})\n return Config(\n server_host=server.get(\"host\", \"0.0.0.0\"),\n server_port=server.get(\"port\", 8317),\n api_base=deepseek.get(\"api_base\", \"https://api.deepseek.com\"),\n api_keys=valid_keys,\n model_map=data.get(\"model_map\", {}),\n )\n"}}}} |