Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
67 KiB
JSON
1 line
67 KiB
JSON
{"repo": "byron2306/l1l1th", "files": {"tools/api_key_generator.py": {"915ee6468a80918f25f90cbf4361cca2e532e2df": {"t": 1785747470.2089179, "n": 18308, "h": "1896702a82948bc2", "c": "#!/usr/bin/env python3\n\"\"\"\nROBUST API KEY GENERATOR\n========================\nGenerates realistic API keys for various AI/ML providers.\nSupports multiple formats, validation, and batch generation.\n\"\"\"\n\nimport secrets\nimport string\nimport hashlib\nimport base64\nimport uuid\nimport time\nimport re\nfrom typing import Dict, List, Optional, Tuple\nfrom datetime import datetime\n\n\nclass APIKeyGenerator:\n \"\"\"\n Robust API Key Generator for multiple providers.\n Generates keys that match the real format of each provider.\n \"\"\"\n \n # Provider key formats and patterns\n PROVIDERS = {\n 'openai': {\n 'prefix': 'sk-',\n 'length': 48,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^sk-[A-Za-z0-9]{48}$',\n 'example': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'anthropic': {\n 'prefix': 'sk-ant-',\n 'length': 95,\n 'charset': string.ascii_letters + string.digits + '-_',\n 'pattern': r'^sk-ant-[A-Za-z0-9\\-_]{89}$',\n 'example': 'sk-ant-api03-xxxxx...'\n },\n 'groq': {\n 'prefix': 'gsk_',\n 'length': 52,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^gsk_[A-Za-z0-9]{52}$',\n 'example': 'gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'huggingface': {\n 'prefix': 'hf_',\n 'length': 34,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^hf_[A-Za-z0-9]{34}$',\n 'example': 'hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'together': {\n 'prefix': '',\n 'length': 64,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^[a-f0-9]{64}$',\n 'example': '0123456789abcdef...'\n },\n 'mistral': {\n 'prefix': '',\n 'length': 32,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{32}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'openrouter': {\n 'prefix': 'sk-or-v1-',\n 'length': 64,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^sk-or-v1-[a-f0-9]{64}$',\n 'example': 'sk-or-v1-0123456789abcdef...'\n },\n 'cerebras': {\n 'prefix': 'csk-',\n 'length': 48,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^csk-[A-Za-z0-9]{48}$',\n 'example': 'csk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'deepinfra': {\n 'prefix': '',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{40}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'sambanova': {\n 'prefix': 'snk-',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits + '-',\n 'pattern': r'^snk-[A-Za-z0-9\\-]{40}$',\n 'example': 'snk-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'\n },\n 'fireworks': {\n 'prefix': 'fw_',\n 'length': 43,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^fw_[A-Za-z0-9]{43}$',\n 'example': 'fw_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'cohere': {\n 'prefix': '',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{40}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'replicate': {\n 'prefix': 'r8_',\n 'length': 37,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^r8_[A-Za-z0-9]{37}$',\n 'example': 'r8_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'perplexity': {\n 'prefix': 'pplx-',\n 'length': 48,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^pplx-[a-f0-9]{48}$',\n 'example': 'pplx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'dolphin': {\n 'prefix': 'dph-',\n 'length': 44,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^dph-[A-Za-z0-9]{44}$',\n 'example': 'dph-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'deepseek': {\n 'prefix': 'sk-',\n 'length': 32,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^sk-[a-f0-9]{32}$',\n 'example': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'google': {\n 'prefix': 'AIza',\n 'length': 35,\n 'charset': string.ascii_letters + string.digits + '-_',\n 'pattern': r'^AIza[A-Za-z0-9\\-_]{35}$',\n 'example': 'AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'aws': {\n 'prefix': 'AKIA',\n 'length': 16,\n 'charset': string.ascii_uppercase + string.digits,\n 'pattern': r'^AKIA[A-Z0-9]{16}$',\n 'example': 'AKIAxxxxxxxxxxxxxxxx'\n },\n 'stripe': {\n 'prefix': 'sk_live_',\n 'length': 24,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^sk_live_[A-Za-z0-9]{24}$',\n 'example': 'sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'generic': {\n 'prefix': '',\n 'length': 32,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{32}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n }\n }\n \n def __init__(self):\n self.generated_keys = []\n self.generation_stats = {\n 'total_generated': 0,\n 'by_provider': {}\n }\n \n def generate_key(self, provider: str = 'generic', \n custom_prefix: str = None,\n custom_length: int = None,\n include_checksum: bool = False) -> Dict:\n \"\"\"\n Generate a single API key for a specific provider.\n \n Args:\n provider: Provider name (openai, groq, etc.)\n custom_prefix: Override default prefix\n custom_length: Override default length\n include_checksum: Add checksum suffix for validation\n \n Returns:\n Dict with key details\n \"\"\"\n provider = provider.lower()\n \n if provider not in self.PROVIDERS:\n provider = 'generic'\n \n config = self.PROVIDERS[provider]\n prefix = custom_prefix if custom_prefix is not None else config['prefix']\n key_length = custom_length if custom_length is not None else config['length']\n charset = config['charset']\n \n # Generate random portion\n random_part = ''.join(secrets.choice(charset) for _ in range(key_length - len(prefix)))\n \n # Construct key\n api_key = prefix + random_part\n \n # Optional checksum\n checksum = None\n if include_checksum:\n checksum = self._generate_checksum(api_key)\n api_key = f\"{api_key}-{checksum}\"\n \n # Track stats\n self.generation_stats['total_generated'] += 1\n self.generation_stats['by_provider'][provider] = \\\n self.generation_stats['by_provider'].get(provider, 0) + 1\n \n result = {\n 'key': api_key,\n 'provider': provider,\n 'prefix': prefix,\n 'length': len(api_key),\n 'generated_at': datetime.utcnow().isoformat(),\n 'checksum': checksum,\n 'format_valid': self.validate_key(api_key, provider)\n }\n \n self.generated_keys.append(result)\n return result\n \n def generate_batch(self, provider: str = 'generic', \n count: int = 10,\n unique: bool = True) -> List[Dict]:\n \"\"\"\n Generate multiple API keys.\n \n Args:\n provider: Provider name\n count: Number of keys to generate\n unique: Ensure all keys are unique\n \n Returns:\n List of key dictionaries\n \"\"\"\n keys = []\n seen = set()\n attempts = 0\n max_attempts = count * 10\n \n while len(keys) < count and attempts < max_attempts:\n result = self.generate_key(provider)\n attempts += 1\n \n if unique:\n if result['key'] not in seen:\n seen.add(result['key'])\n keys.append(result)\n else:\n keys.append(result)\n \n return keys\n \n def generate_multi_provider(self, providers: List[str] = None, \n count_per_provider: int = 1) -> Dict[str, List[Dict]]:\n \"\"\"\n Generate keys for multiple providers at once.\n \n Args:\n providers: List of provider names (None = all providers)\n count_per_provider: Keys per provider\n \n Returns:\n Dict mapping provider names to key lists\n \"\"\"\n if providers is None:\n providers = list(self.PROVIDERS.keys())\n \n results = {}\n for provider in providers:\n results[provider] = self.generate_batch(provider, count_per_provider)\n \n return results\n \n def validate_key(self, key: str, provider: str = None) -> Dict:\n \"\"\"\n Validate an API key format.\n \n Args:\n key: API key to validate\n provider: Expected provider (None = auto-detect)\n \n Returns:\n Validation result dict\n \"\"\"\n result = {\n 'valid': False,\n 'provider': None,\n 'detected_providers': [],\n 'issues': []\n }\n \n if not key or not isinstance(key, str):\n result['issues'].append('Key is empty or invalid type')\n return result\n \n # Check against all providers if not specified\n providers_to_check = [provider] if provider else list(self.PROVIDERS.keys())\n \n for prov in providers_to_check:\n if prov not in self.PROVIDERS:\n continue\n \n config = self.PROVIDERS[prov]\n pattern = config['pattern']\n \n if re.match(pattern, key):\n result['detected_providers'].append(prov)\n \n if result['detected_providers']:\n result['valid'] = True\n result['provider'] = result['detected_providers'][0]\n else:\n result['issues'].append('Key format does not match any known provider')\n \n # Provide hints\n if key.startswith('sk-'):\n result['issues'].append('Looks like OpenAI/DeepSeek format but length may be wrong')\n elif key.startswith('gsk_'):\n result['issues'].append('Looks like Groq format but length may be wrong')\n \n return result\n \n def detect_provider(self, key: str) -> Optional[str]:\n \"\"\"\n Detect the provider from a key's format.\n \n Args:\n key: API key\n \n Returns:\n Provider name or None\n \"\"\"\n validation = self.validate_key(key)\n return validation.get('provider')\n \n def _generate_checksum(self, key: str) -> str:\n \"\"\"Generate a short checksum for key verification.\"\"\"\n hash_obj = hashlib.sha256(key.encode())\n return hash_obj.hexdigest()[:8]\n \n def generate_jwt_like_key(self, provider: str = 'generic') -> Dict:\n \"\"\"\n Generate a JWT-like token structure.\n \n Returns:\n Dict with JWT-style key\n \"\"\"\n # Header\n header = base64.urlsafe_b64encode(b'{\"alg\":\"HS256\",\"typ\":\"JWT\"}').decode().rstrip('=')\n \n # Payload with provider info\n payload_data = {\n 'iss': provider,\n 'iat': int(time.time()),\n 'exp': int(time.time()) + 86400 * 365,\n 'sub': secrets.token_hex(16)\n }\n import json\n payload = base64.urlsafe_b64encode(json.dumps(payload_data).encode()).decode().rstrip('=')\n \n # Signature\n signature = secrets.token_urlsafe(32)\n \n jwt_key = f\"{header}.{payload}.{signature}\"\n \n return {\n 'key': jwt_key,\n 'provider': provider,\n 'type': 'jwt',\n 'length': len(jwt_key),\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def generate_uuid_key(self, provider: str = 'generic', \n prefix: str = None,\n version: int = 4) -> Dict:\n \"\"\"\n Generate a UUID-based API key.\n \n Args:\n provider: Provider name\n prefix: Optional prefix\n version: UUID version (1 or 4)\n \n Returns:\n Dict with UUID key\n \"\"\"\n if version == 1:\n key_uuid = str(uuid.uuid1())\n else:\n key_uuid = str(uuid.uuid4())\n \n if prefix:\n api_key = f\"{prefix}{key_uuid}\"\n else:\n api_key = key_uuid\n \n return {\n 'key': api_key,\n 'provider': provider,\n 'type': 'uuid',\n 'version': version,\n 'length': len(api_key),\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def generate_secure_token(self, length: int = 64, \n encoding: str = 'hex') -> Dict:\n \"\"\"\n Generate a cryptographically secure token.\n \n Args:\n length: Token length\n encoding: 'hex', 'base64', or 'urlsafe'\n \n Returns:\n Dict with secure token\n \"\"\"\n if encoding == 'hex':\n token = secrets.token_hex(length // 2)\n elif encoding == 'base64':\n token = secrets.token_bytes(length).hex()\n token = base64.b64encode(bytes.fromhex(token)).decode()[:length]\n else: # urlsafe\n token = secrets.token_urlsafe(length)[:length]\n \n return {\n 'key': token,\n 'type': 'secure_token',\n 'encoding': encoding,\n 'length': len(token),\n 'entropy_bits': len(token) * 4 if encoding == 'hex' else len(token) * 6,\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def get_provider_info(self, provider: str) -> Optional[Dict]:\n \"\"\"\n Get information about a provider's key format.\n \n Args:\n provider: Provider name\n \n Returns:\n Provider config dict or None\n \"\"\"\n provider = provider.lower()\n if provider in self.PROVIDERS:\n config = self.PROVIDERS[provider].copy()\n config['name'] = provider\n return config\n return None\n \n def list_providers(self) -> List[Dict]:\n \"\"\"\n List all supported providers with their key formats.\n \n Returns:\n List of provider info dicts\n \"\"\"\n providers = []\n for name, config in self.PROVIDERS.items():\n providers.append({\n 'name': name,\n 'prefix': config['prefix'],\n 'length': config['length'],\n 'example': config['example']\n })\n return providers\n \n def get_stats(self) -> Dict:\n \"\"\"Get generation statistics.\"\"\"\n return {\n **self.generation_stats,\n 'recent_keys': len(self.generated_keys),\n 'providers_used': list(self.generation_stats['by_provider'].keys())\n }\n \n def export_keys(self, format: str = 'json') -> str:\n \"\"\"\n Export generated keys.\n \n Args:\n format: 'json', 'csv', or 'text'\n \n Returns:\n Formatted string\n \"\"\"\n import json\n \n if format == 'json':\n return json.dumps(self.generated_keys, indent=2)\n elif format == 'csv':\n lines = ['provider,key,generated_at']\n for k in self.generated_keys:\n lines.append(f\"{k['provider']},{k['key']},{k['generated_at']}\")\n return '\\n'.join(lines)\n else: # text\n lines = []\n for k in self.generated_keys:\n lines.append(f\"[{k['provider']}] {k['key']}\")\n return '\\n'.join(lines)\n \n def clear_history(self):\n \"\"\"Clear generated keys history.\"\"\"\n self.generated_keys = []\n\n\n# Singleton instance\n_key_generator = None\n\ndef get_key_generator() -> APIKeyGenerator:\n \"\"\"Get singleton key generator instance.\"\"\"\n global _key_generator\n if _key_generator is None:\n _key_generator = APIKeyGenerator()\n return _key_generator\n\n\n# Quick access functions\ndef generate_api_key(provider: str = 'generic') -> str:\n \"\"\"Quick function to generate a single key.\"\"\"\n gen = get_key_generator()\n return gen.generate_key(provider)['key']\n\ndef generate_keys(provider: str = 'generic', count: int = 5) -> List[str]:\n \"\"\"Quick function to generate multiple keys.\"\"\"\n gen = get_key_generator()\n results = gen.generate_batch(provider, count)\n return [r['key'] for r in results]\n\ndef validate_api_key(key: str) -> Dict:\n \"\"\"Quick function to validate a key.\"\"\"\n gen = get_key_generator()\n return gen.validate_key(key)\n\n\nif __name__ == '__main__':\n # Test the generator\n gen = APIKeyGenerator()\n \n print(\"=== API KEY GENERATOR TEST ===\\n\")\n \n # Generate keys for different providers\n providers = ['openai', 'groq', 'anthropic', 'huggingface', 'together', 'deepseek']\n \n for provider in providers:\n result = gen.generate_key(provider)\n print(f\"{provider.upper():12} | {result['key']}\")\n \n print(f\"\\n=== Stats ===\")\n print(gen.get_stats())\n"}, "7efdf4f0df4629b3b2ebd73ac1e6bd0592db6343": {"t": 1785773506.6042275, "n": 18308, "h": "1896702a82948bc2", "c": "#!/usr/bin/env python3\n\"\"\"\nROBUST API KEY GENERATOR\n========================\nGenerates realistic API keys for various AI/ML providers.\nSupports multiple formats, validation, and batch generation.\n\"\"\"\n\nimport secrets\nimport string\nimport hashlib\nimport base64\nimport uuid\nimport time\nimport re\nfrom typing import Dict, List, Optional, Tuple\nfrom datetime import datetime\n\n\nclass APIKeyGenerator:\n \"\"\"\n Robust API Key Generator for multiple providers.\n Generates keys that match the real format of each provider.\n \"\"\"\n \n # Provider key formats and patterns\n PROVIDERS = {\n 'openai': {\n 'prefix': 'sk-',\n 'length': 48,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^sk-[A-Za-z0-9]{48}$',\n 'example': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'anthropic': {\n 'prefix': 'sk-ant-',\n 'length': 95,\n 'charset': string.ascii_letters + string.digits + '-_',\n 'pattern': r'^sk-ant-[A-Za-z0-9\\-_]{89}$',\n 'example': 'sk-ant-api03-xxxxx...'\n },\n 'groq': {\n 'prefix': 'gsk_',\n 'length': 52,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^gsk_[A-Za-z0-9]{52}$',\n 'example': 'gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'huggingface': {\n 'prefix': 'hf_',\n 'length': 34,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^hf_[A-Za-z0-9]{34}$',\n 'example': 'hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'together': {\n 'prefix': '',\n 'length': 64,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^[a-f0-9]{64}$',\n 'example': '0123456789abcdef...'\n },\n 'mistral': {\n 'prefix': '',\n 'length': 32,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{32}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'openrouter': {\n 'prefix': 'sk-or-v1-',\n 'length': 64,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^sk-or-v1-[a-f0-9]{64}$',\n 'example': 'sk-or-v1-0123456789abcdef...'\n },\n 'cerebras': {\n 'prefix': 'csk-',\n 'length': 48,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^csk-[A-Za-z0-9]{48}$',\n 'example': 'csk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'deepinfra': {\n 'prefix': '',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{40}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'sambanova': {\n 'prefix': 'snk-',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits + '-',\n 'pattern': r'^snk-[A-Za-z0-9\\-]{40}$',\n 'example': 'snk-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'\n },\n 'fireworks': {\n 'prefix': 'fw_',\n 'length': 43,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^fw_[A-Za-z0-9]{43}$',\n 'example': 'fw_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'cohere': {\n 'prefix': '',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{40}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'replicate': {\n 'prefix': 'r8_',\n 'length': 37,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^r8_[A-Za-z0-9]{37}$',\n 'example': 'r8_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'perplexity': {\n 'prefix': 'pplx-',\n 'length': 48,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^pplx-[a-f0-9]{48}$',\n 'example': 'pplx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'dolphin': {\n 'prefix': 'dph-',\n 'length': 44,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^dph-[A-Za-z0-9]{44}$',\n 'example': 'dph-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'deepseek': {\n 'prefix': 'sk-',\n 'length': 32,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^sk-[a-f0-9]{32}$',\n 'example': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'google': {\n 'prefix': 'AIza',\n 'length': 35,\n 'charset': string.ascii_letters + string.digits + '-_',\n 'pattern': r'^AIza[A-Za-z0-9\\-_]{35}$',\n 'example': 'AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'aws': {\n 'prefix': 'AKIA',\n 'length': 16,\n 'charset': string.ascii_uppercase + string.digits,\n 'pattern': r'^AKIA[A-Z0-9]{16}$',\n 'example': 'AKIAxxxxxxxxxxxxxxxx'\n },\n 'stripe': {\n 'prefix': 'sk_live_',\n 'length': 24,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^sk_live_[A-Za-z0-9]{24}$',\n 'example': 'sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'generic': {\n 'prefix': '',\n 'length': 32,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{32}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n }\n }\n \n def __init__(self):\n self.generated_keys = []\n self.generation_stats = {\n 'total_generated': 0,\n 'by_provider': {}\n }\n \n def generate_key(self, provider: str = 'generic', \n custom_prefix: str = None,\n custom_length: int = None,\n include_checksum: bool = False) -> Dict:\n \"\"\"\n Generate a single API key for a specific provider.\n \n Args:\n provider: Provider name (openai, groq, etc.)\n custom_prefix: Override default prefix\n custom_length: Override default length\n include_checksum: Add checksum suffix for validation\n \n Returns:\n Dict with key details\n \"\"\"\n provider = provider.lower()\n \n if provider not in self.PROVIDERS:\n provider = 'generic'\n \n config = self.PROVIDERS[provider]\n prefix = custom_prefix if custom_prefix is not None else config['prefix']\n key_length = custom_length if custom_length is not None else config['length']\n charset = config['charset']\n \n # Generate random portion\n random_part = ''.join(secrets.choice(charset) for _ in range(key_length - len(prefix)))\n \n # Construct key\n api_key = prefix + random_part\n \n # Optional checksum\n checksum = None\n if include_checksum:\n checksum = self._generate_checksum(api_key)\n api_key = f\"{api_key}-{checksum}\"\n \n # Track stats\n self.generation_stats['total_generated'] += 1\n self.generation_stats['by_provider'][provider] = \\\n self.generation_stats['by_provider'].get(provider, 0) + 1\n \n result = {\n 'key': api_key,\n 'provider': provider,\n 'prefix': prefix,\n 'length': len(api_key),\n 'generated_at': datetime.utcnow().isoformat(),\n 'checksum': checksum,\n 'format_valid': self.validate_key(api_key, provider)\n }\n \n self.generated_keys.append(result)\n return result\n \n def generate_batch(self, provider: str = 'generic', \n count: int = 10,\n unique: bool = True) -> List[Dict]:\n \"\"\"\n Generate multiple API keys.\n \n Args:\n provider: Provider name\n count: Number of keys to generate\n unique: Ensure all keys are unique\n \n Returns:\n List of key dictionaries\n \"\"\"\n keys = []\n seen = set()\n attempts = 0\n max_attempts = count * 10\n \n while len(keys) < count and attempts < max_attempts:\n result = self.generate_key(provider)\n attempts += 1\n \n if unique:\n if result['key'] not in seen:\n seen.add(result['key'])\n keys.append(result)\n else:\n keys.append(result)\n \n return keys\n \n def generate_multi_provider(self, providers: List[str] = None, \n count_per_provider: int = 1) -> Dict[str, List[Dict]]:\n \"\"\"\n Generate keys for multiple providers at once.\n \n Args:\n providers: List of provider names (None = all providers)\n count_per_provider: Keys per provider\n \n Returns:\n Dict mapping provider names to key lists\n \"\"\"\n if providers is None:\n providers = list(self.PROVIDERS.keys())\n \n results = {}\n for provider in providers:\n results[provider] = self.generate_batch(provider, count_per_provider)\n \n return results\n \n def validate_key(self, key: str, provider: str = None) -> Dict:\n \"\"\"\n Validate an API key format.\n \n Args:\n key: API key to validate\n provider: Expected provider (None = auto-detect)\n \n Returns:\n Validation result dict\n \"\"\"\n result = {\n 'valid': False,\n 'provider': None,\n 'detected_providers': [],\n 'issues': []\n }\n \n if not key or not isinstance(key, str):\n result['issues'].append('Key is empty or invalid type')\n return result\n \n # Check against all providers if not specified\n providers_to_check = [provider] if provider else list(self.PROVIDERS.keys())\n \n for prov in providers_to_check:\n if prov not in self.PROVIDERS:\n continue\n \n config = self.PROVIDERS[prov]\n pattern = config['pattern']\n \n if re.match(pattern, key):\n result['detected_providers'].append(prov)\n \n if result['detected_providers']:\n result['valid'] = True\n result['provider'] = result['detected_providers'][0]\n else:\n result['issues'].append('Key format does not match any known provider')\n \n # Provide hints\n if key.startswith('sk-'):\n result['issues'].append('Looks like OpenAI/DeepSeek format but length may be wrong')\n elif key.startswith('gsk_'):\n result['issues'].append('Looks like Groq format but length may be wrong')\n \n return result\n \n def detect_provider(self, key: str) -> Optional[str]:\n \"\"\"\n Detect the provider from a key's format.\n \n Args:\n key: API key\n \n Returns:\n Provider name or None\n \"\"\"\n validation = self.validate_key(key)\n return validation.get('provider')\n \n def _generate_checksum(self, key: str) -> str:\n \"\"\"Generate a short checksum for key verification.\"\"\"\n hash_obj = hashlib.sha256(key.encode())\n return hash_obj.hexdigest()[:8]\n \n def generate_jwt_like_key(self, provider: str = 'generic') -> Dict:\n \"\"\"\n Generate a JWT-like token structure.\n \n Returns:\n Dict with JWT-style key\n \"\"\"\n # Header\n header = base64.urlsafe_b64encode(b'{\"alg\":\"HS256\",\"typ\":\"JWT\"}').decode().rstrip('=')\n \n # Payload with provider info\n payload_data = {\n 'iss': provider,\n 'iat': int(time.time()),\n 'exp': int(time.time()) + 86400 * 365,\n 'sub': secrets.token_hex(16)\n }\n import json\n payload = base64.urlsafe_b64encode(json.dumps(payload_data).encode()).decode().rstrip('=')\n \n # Signature\n signature = secrets.token_urlsafe(32)\n \n jwt_key = f\"{header}.{payload}.{signature}\"\n \n return {\n 'key': jwt_key,\n 'provider': provider,\n 'type': 'jwt',\n 'length': len(jwt_key),\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def generate_uuid_key(self, provider: str = 'generic', \n prefix: str = None,\n version: int = 4) -> Dict:\n \"\"\"\n Generate a UUID-based API key.\n \n Args:\n provider: Provider name\n prefix: Optional prefix\n version: UUID version (1 or 4)\n \n Returns:\n Dict with UUID key\n \"\"\"\n if version == 1:\n key_uuid = str(uuid.uuid1())\n else:\n key_uuid = str(uuid.uuid4())\n \n if prefix:\n api_key = f\"{prefix}{key_uuid}\"\n else:\n api_key = key_uuid\n \n return {\n 'key': api_key,\n 'provider': provider,\n 'type': 'uuid',\n 'version': version,\n 'length': len(api_key),\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def generate_secure_token(self, length: int = 64, \n encoding: str = 'hex') -> Dict:\n \"\"\"\n Generate a cryptographically secure token.\n \n Args:\n length: Token length\n encoding: 'hex', 'base64', or 'urlsafe'\n \n Returns:\n Dict with secure token\n \"\"\"\n if encoding == 'hex':\n token = secrets.token_hex(length // 2)\n elif encoding == 'base64':\n token = secrets.token_bytes(length).hex()\n token = base64.b64encode(bytes.fromhex(token)).decode()[:length]\n else: # urlsafe\n token = secrets.token_urlsafe(length)[:length]\n \n return {\n 'key': token,\n 'type': 'secure_token',\n 'encoding': encoding,\n 'length': len(token),\n 'entropy_bits': len(token) * 4 if encoding == 'hex' else len(token) * 6,\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def get_provider_info(self, provider: str) -> Optional[Dict]:\n \"\"\"\n Get information about a provider's key format.\n \n Args:\n provider: Provider name\n \n Returns:\n Provider config dict or None\n \"\"\"\n provider = provider.lower()\n if provider in self.PROVIDERS:\n config = self.PROVIDERS[provider].copy()\n config['name'] = provider\n return config\n return None\n \n def list_providers(self) -> List[Dict]:\n \"\"\"\n List all supported providers with their key formats.\n \n Returns:\n List of provider info dicts\n \"\"\"\n providers = []\n for name, config in self.PROVIDERS.items():\n providers.append({\n 'name': name,\n 'prefix': config['prefix'],\n 'length': config['length'],\n 'example': config['example']\n })\n return providers\n \n def get_stats(self) -> Dict:\n \"\"\"Get generation statistics.\"\"\"\n return {\n **self.generation_stats,\n 'recent_keys': len(self.generated_keys),\n 'providers_used': list(self.generation_stats['by_provider'].keys())\n }\n \n def export_keys(self, format: str = 'json') -> str:\n \"\"\"\n Export generated keys.\n \n Args:\n format: 'json', 'csv', or 'text'\n \n Returns:\n Formatted string\n \"\"\"\n import json\n \n if format == 'json':\n return json.dumps(self.generated_keys, indent=2)\n elif format == 'csv':\n lines = ['provider,key,generated_at']\n for k in self.generated_keys:\n lines.append(f\"{k['provider']},{k['key']},{k['generated_at']}\")\n return '\\n'.join(lines)\n else: # text\n lines = []\n for k in self.generated_keys:\n lines.append(f\"[{k['provider']}] {k['key']}\")\n return '\\n'.join(lines)\n \n def clear_history(self):\n \"\"\"Clear generated keys history.\"\"\"\n self.generated_keys = []\n\n\n# Singleton instance\n_key_generator = None\n\ndef get_key_generator() -> APIKeyGenerator:\n \"\"\"Get singleton key generator instance.\"\"\"\n global _key_generator\n if _key_generator is None:\n _key_generator = APIKeyGenerator()\n return _key_generator\n\n\n# Quick access functions\ndef generate_api_key(provider: str = 'generic') -> str:\n \"\"\"Quick function to generate a single key.\"\"\"\n gen = get_key_generator()\n return gen.generate_key(provider)['key']\n\ndef generate_keys(provider: str = 'generic', count: int = 5) -> List[str]:\n \"\"\"Quick function to generate multiple keys.\"\"\"\n gen = get_key_generator()\n results = gen.generate_batch(provider, count)\n return [r['key'] for r in results]\n\ndef validate_api_key(key: str) -> Dict:\n \"\"\"Quick function to validate a key.\"\"\"\n gen = get_key_generator()\n return gen.validate_key(key)\n\n\nif __name__ == '__main__':\n # Test the generator\n gen = APIKeyGenerator()\n \n print(\"=== API KEY GENERATOR TEST ===\\n\")\n \n # Generate keys for different providers\n providers = ['openai', 'groq', 'anthropic', 'huggingface', 'together', 'deepseek']\n \n for provider in providers:\n result = gen.generate_key(provider)\n print(f\"{provider.upper():12} | {result['key']}\")\n \n print(f\"\\n=== Stats ===\")\n print(gen.get_stats())\n"}, "0b941a4199650cfec04ad6dcf82b900d0bec9973": {"t": 1785773509.9873369, "n": 9730, "h": "b125dd48ec7be90f", "c": "#!/usr/bin/env python3\n\"\"\"\nAPI Key Generator for LILITH\n=============================\nGenerates and validates working API keys from various free providers.\nThis module helps LILITH find new working endpoints when existing ones fail.\n\"\"\"\n\nimport requests\nimport json\nimport time\nimport re\nfrom typing import Dict, List, Optional, Tuple\nfrom datetime import datetime\n\nclass APIKeyGenerator:\n \"\"\"\n Generates and validates API keys from various sources.\n \"\"\"\n \n # Free API providers that don't require keys or have free tiers\n FREE_PROVIDERS = [\n {\n 'name': 'Ollama (Local)',\n 'type': 'local',\n 'base_url': 'http://localhost:11434',\n 'models': ['llama3.2:3b', 'mistral:7b', 'phi3:mini'],\n 'requires_key': False,\n 'instructions': 'Install Ollama: curl -fsSL https://ollama.com/install.sh | sh'\n },\n {\n 'name': 'Together.ai Free Tier',\n 'type': 'cloud',\n 'base_url': 'https://api.together.xyz/v1',\n 'models': ['meta-llama/Llama-3.2-3B-Instruct-Turbo', 'mistralai/Mixtral-8x7B-Instruct-v0.1'],\n 'requires_key': True,\n 'signup_url': 'https://api.together.xyz',\n 'instructions': 'Sign up at https://api.together.xyz for $25 free credits'\n },\n {\n 'name': 'Groq Free Tier',\n 'type': 'cloud',\n 'base_url': 'https://api.groq.com/openai/v1',\n 'models': ['llama-3.3-70b-versatile', 'mixtral-8x7b-32768'],\n 'requires_key': True,\n 'signup_url': 'https://console.groq.com',\n 'instructions': 'Sign up at https://console.groq.com for free API access'\n },\n {\n 'name': 'HuggingFace Inference',\n 'type': 'cloud',\n 'base_url': 'https://router.huggingface.co/hf-inference/models',\n 'models': ['meta-llama/Llama-3.2-3B-Instruct', 'mistralai/Mistral-7B-Instruct-v0.3'],\n 'requires_key': True,\n 'signup_url': 'https://huggingface.co/settings/tokens',\n 'instructions': 'Create a free account at https://huggingface.co and generate a token'\n },\n {\n 'name': 'OpenRouter Free Models',\n 'type': 'cloud',\n 'base_url': 'https://openrouter.ai/api/v1',\n 'models': ['meta-llama/llama-3.2-3b-instruct:free', 'google/gemma-2-9b-it:free'],\n 'requires_key': False,\n 'instructions': 'Some models available without API key'\n }\n ]\n \n def __init__(self):\n self.working_keys = []\n self.tested_providers = []\n \n def test_ollama(self) -> Tuple[bool, str]:\n \"\"\"Test if Ollama is running locally\"\"\"\n try:\n response = requests.get('http://localhost:11434/api/tags', timeout=5)\n if response.status_code == 200:\n models = response.json().get('models', [])\n if models:\n return True, f\"✓ Ollama is running with {len(models)} models\"\n else:\n return False, \"✗ Ollama is running but no models installed\"\n return False, \"✗ Ollama not responding\"\n except Exception as e:\n return False, f\"✗ Ollama not available: {str(e)}\"\n \n def test_openrouter_free(self) -> Tuple[bool, str]:\n \"\"\"Test OpenRouter free models (no key required)\"\"\"\n try:\n response = requests.post(\n 'https://openrouter.ai/api/v1/chat/completions',\n headers={\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://luciferos.local',\n 'X-Title': 'LILITH'\n },\n json={\n 'model': 'meta-llama/llama-3.2-3b-instruct:free',\n 'messages': [{'role': 'user', 'content': 'test'}],\n 'max_tokens': 10\n },\n timeout=30\n )\n if response.status_code == 200:\n return True, \"✓ OpenRouter free models working (no key needed)\"\n return False, f\"✗ OpenRouter returned {response.status_code}: {response.text[:100]}\"\n except Exception as e:\n return False, f\"✗ OpenRouter error: {str(e)}\"\n \n def generate_instructions(self) -> str:\n \"\"\"Generate instructions for getting working API keys\"\"\"\n instructions = \"\"\"\n╔════════════════════════════════════════════════════════════════╗\n║ LILITH API Key Generation Guide ║\n╚════════════════════════════════════════════════════════════════╝\n\nIMMEDIATE OPTIONS (No API Key Required):\n----------------------------------------\n\n1. 🏠 OLLAMA (RECOMMENDED - Local, Free, No Restrictions)\n Installation:\n ```bash\n curl -fsSL https://ollama.com/install.sh | sh\n ollama pull llama3.2:3b\n ```\n Then restart LILITH backend\n\n2. 🌐 OpenRouter Free Models\n - No API key needed for free models\n - Limited rate limits\n - Works out of the box\n\n\nFREE API KEY OPTIONS (Sign up required):\n-----------------------------------------\n\n3. ⚡ GROQ (FAST & FREE)\n - Sign up: https://console.groq.com\n - Get API key from dashboard\n - Free tier: Very fast, generous limits\n - Add to config: groq_api_key = YOUR_KEY\n\n4. 🤗 HuggingFace (FREE)\n - Sign up: https://huggingface.co\n - Generate token: https://huggingface.co/settings/tokens\n - Free tier: Unlimited inference\n - Add to config: hf_token = YOUR_TOKEN\n\n5. 🔥 Together.ai (FREE CREDITS)\n - Sign up: https://api.together.xyz\n - Get $25 free credits\n - Add to config: together_api_key = YOUR_KEY\n\n6. 🧠 Venice.ai (FREE & UNCENSORED)\n - Sign up: https://venice.ai\n - Free tier available\n - No content restrictions\n\n\nCONFIGURATION:\n--------------\nAdd your keys to /app/config/lucifera.conf:\n\n[lilith]\ngroq_api_key = YOUR_GROQ_KEY\nhf_token = YOUR_HF_TOKEN\ntogether_api_key = YOUR_TOGETHER_KEY\nvenice_api_key = YOUR_VENICE_KEY\n\n\nTESTING:\n--------\nAfter adding keys, test with:\n```bash\ncurl -X POST http://127.0.0.1:5000/chat \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\"message\": \"Hello LILITH\"}'\n```\n\n\"\"\"\n return instructions\n \n def scan_working_providers(self) -> Dict:\n \"\"\"Scan all providers and return status\"\"\"\n results = {\n 'timestamp': datetime.now().isoformat(),\n 'working': [],\n 'needs_key': [],\n 'failed': []\n }\n \n print(\"\\n🔍 Scanning for working AI providers...\")\n print(\"=\" * 60)\n \n # Test Ollama\n print(\"\\nTesting Ollama (local)...\")\n success, message = self.test_ollama()\n print(f\" {message}\")\n if success:\n results['working'].append({\n 'provider': 'Ollama',\n 'type': 'local',\n 'requires_key': False,\n 'status': message\n })\n else:\n results['needs_key'].append({\n 'provider': 'Ollama',\n 'type': 'local',\n 'requires_key': False,\n 'status': message,\n 'instructions': 'curl -fsSL https://ollama.com/install.sh | sh'\n })\n \n # Test OpenRouter free\n print(\"\\nTesting OpenRouter free models...\")\n success, message = self.test_openrouter_free()\n print(f\" {message}\")\n if success:\n results['working'].append({\n 'provider': 'OpenRouter',\n 'type': 'cloud',\n 'requires_key': False,\n 'status': message\n })\n else:\n results['failed'].append({\n 'provider': 'OpenRouter',\n 'type': 'cloud',\n 'status': message\n })\n \n # List providers that need keys\n for provider in self.FREE_PROVIDERS:\n if provider['requires_key'] and provider['name'] not in ['OpenRouter Free Models']:\n results['needs_key'].append({\n 'provider': provider['name'],\n 'type': provider['type'],\n 'requires_key': True,\n 'signup_url': provider.get('signup_url', ''),\n 'instructions': provider.get('instructions', '')\n })\n \n return results\n \n def save_results(self, results: Dict, filename: str = '/tmp/api_scan_results.json'):\n \"\"\"Save scan results to file\"\"\"\n with open(filename, 'w') as f:\n json.dump(results, f, indent=2)\n print(f\"\\n📄 Results saved to: {filename}\")\n\n\ndef main():\n \"\"\"Main function to run API key generator\"\"\"\n generator = APIKeyGenerator()\n \n print(\"\"\"\n╔════════════════════════════════════════════════════════════════╗\n║ LILITH API Key Generator & Provider Scanner ║\n╚════════════════════════════════════════════════════════════════╝\n \"\"\")\n \n # Scan providers\n results = generator.scan_working_providers()\n \n # Print summary\n print(\"\\n\" + \"=\" * 60)\n print(\"📊 SUMMARY\")\n print(\"=\" * 60)\n print(f\"✓ Working providers (no key needed): {len(results['working'])}\")\n print(f\"🔑 Providers available (key required): {len(results['needs_key'])}\")\n print(f\"✗ Failed/unavailable: {len(results['failed'])}\")\n \n # Print working providers\n if results['working']:\n print(\"\\n✅ WORKING NOW:\")\n for p in results['working']:\n print(f\" • {p['provider']}: {p['status']}\")\n \n # Print instructions for getting keys\n print(generator.generate_instructions())\n \n # Save results\n generator.save_results(results)\n\n\nif __name__ == '__main__':\n main()\n"}, "cefc21a14db046c78e0f051f613ae5f2da9822c2": {"t": 1786068177.9267678, "n": 18308, "h": "1896702a82948bc2", "c": "#!/usr/bin/env python3\n\"\"\"\nROBUST API KEY GENERATOR\n========================\nGenerates realistic API keys for various AI/ML providers.\nSupports multiple formats, validation, and batch generation.\n\"\"\"\n\nimport secrets\nimport string\nimport hashlib\nimport base64\nimport uuid\nimport time\nimport re\nfrom typing import Dict, List, Optional, Tuple\nfrom datetime import datetime\n\n\nclass APIKeyGenerator:\n \"\"\"\n Robust API Key Generator for multiple providers.\n Generates keys that match the real format of each provider.\n \"\"\"\n \n # Provider key formats and patterns\n PROVIDERS = {\n 'openai': {\n 'prefix': 'sk-',\n 'length': 48,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^sk-[A-Za-z0-9]{48}$',\n 'example': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'anthropic': {\n 'prefix': 'sk-ant-',\n 'length': 95,\n 'charset': string.ascii_letters + string.digits + '-_',\n 'pattern': r'^sk-ant-[A-Za-z0-9\\-_]{89}$',\n 'example': 'sk-ant-api03-xxxxx...'\n },\n 'groq': {\n 'prefix': 'gsk_',\n 'length': 52,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^gsk_[A-Za-z0-9]{52}$',\n 'example': 'gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'huggingface': {\n 'prefix': 'hf_',\n 'length': 34,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^hf_[A-Za-z0-9]{34}$',\n 'example': 'hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'together': {\n 'prefix': '',\n 'length': 64,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^[a-f0-9]{64}$',\n 'example': '0123456789abcdef...'\n },\n 'mistral': {\n 'prefix': '',\n 'length': 32,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{32}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'openrouter': {\n 'prefix': 'sk-or-v1-',\n 'length': 64,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^sk-or-v1-[a-f0-9]{64}$',\n 'example': 'sk-or-v1-0123456789abcdef...'\n },\n 'cerebras': {\n 'prefix': 'csk-',\n 'length': 48,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^csk-[A-Za-z0-9]{48}$',\n 'example': 'csk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'deepinfra': {\n 'prefix': '',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{40}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'sambanova': {\n 'prefix': 'snk-',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits + '-',\n 'pattern': r'^snk-[A-Za-z0-9\\-]{40}$',\n 'example': 'snk-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'\n },\n 'fireworks': {\n 'prefix': 'fw_',\n 'length': 43,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^fw_[A-Za-z0-9]{43}$',\n 'example': 'fw_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'cohere': {\n 'prefix': '',\n 'length': 40,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{40}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'replicate': {\n 'prefix': 'r8_',\n 'length': 37,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^r8_[A-Za-z0-9]{37}$',\n 'example': 'r8_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'perplexity': {\n 'prefix': 'pplx-',\n 'length': 48,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^pplx-[a-f0-9]{48}$',\n 'example': 'pplx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'dolphin': {\n 'prefix': 'dph-',\n 'length': 44,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^dph-[A-Za-z0-9]{44}$',\n 'example': 'dph-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'deepseek': {\n 'prefix': 'sk-',\n 'length': 32,\n 'charset': string.hexdigits.lower(),\n 'pattern': r'^sk-[a-f0-9]{32}$',\n 'example': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'google': {\n 'prefix': 'AIza',\n 'length': 35,\n 'charset': string.ascii_letters + string.digits + '-_',\n 'pattern': r'^AIza[A-Za-z0-9\\-_]{35}$',\n 'example': 'AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'aws': {\n 'prefix': 'AKIA',\n 'length': 16,\n 'charset': string.ascii_uppercase + string.digits,\n 'pattern': r'^AKIA[A-Z0-9]{16}$',\n 'example': 'AKIAxxxxxxxxxxxxxxxx'\n },\n 'stripe': {\n 'prefix': 'sk_live_',\n 'length': 24,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^sk_live_[A-Za-z0-9]{24}$',\n 'example': 'sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'\n },\n 'generic': {\n 'prefix': '',\n 'length': 32,\n 'charset': string.ascii_letters + string.digits,\n 'pattern': r'^[A-Za-z0-9]{32}$',\n 'example': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n }\n }\n \n def __init__(self):\n self.generated_keys = []\n self.generation_stats = {\n 'total_generated': 0,\n 'by_provider': {}\n }\n \n def generate_key(self, provider: str = 'generic', \n custom_prefix: str = None,\n custom_length: int = None,\n include_checksum: bool = False) -> Dict:\n \"\"\"\n Generate a single API key for a specific provider.\n \n Args:\n provider: Provider name (openai, groq, etc.)\n custom_prefix: Override default prefix\n custom_length: Override default length\n include_checksum: Add checksum suffix for validation\n \n Returns:\n Dict with key details\n \"\"\"\n provider = provider.lower()\n \n if provider not in self.PROVIDERS:\n provider = 'generic'\n \n config = self.PROVIDERS[provider]\n prefix = custom_prefix if custom_prefix is not None else config['prefix']\n key_length = custom_length if custom_length is not None else config['length']\n charset = config['charset']\n \n # Generate random portion\n random_part = ''.join(secrets.choice(charset) for _ in range(key_length - len(prefix)))\n \n # Construct key\n api_key = prefix + random_part\n \n # Optional checksum\n checksum = None\n if include_checksum:\n checksum = self._generate_checksum(api_key)\n api_key = f\"{api_key}-{checksum}\"\n \n # Track stats\n self.generation_stats['total_generated'] += 1\n self.generation_stats['by_provider'][provider] = \\\n self.generation_stats['by_provider'].get(provider, 0) + 1\n \n result = {\n 'key': api_key,\n 'provider': provider,\n 'prefix': prefix,\n 'length': len(api_key),\n 'generated_at': datetime.utcnow().isoformat(),\n 'checksum': checksum,\n 'format_valid': self.validate_key(api_key, provider)\n }\n \n self.generated_keys.append(result)\n return result\n \n def generate_batch(self, provider: str = 'generic', \n count: int = 10,\n unique: bool = True) -> List[Dict]:\n \"\"\"\n Generate multiple API keys.\n \n Args:\n provider: Provider name\n count: Number of keys to generate\n unique: Ensure all keys are unique\n \n Returns:\n List of key dictionaries\n \"\"\"\n keys = []\n seen = set()\n attempts = 0\n max_attempts = count * 10\n \n while len(keys) < count and attempts < max_attempts:\n result = self.generate_key(provider)\n attempts += 1\n \n if unique:\n if result['key'] not in seen:\n seen.add(result['key'])\n keys.append(result)\n else:\n keys.append(result)\n \n return keys\n \n def generate_multi_provider(self, providers: List[str] = None, \n count_per_provider: int = 1) -> Dict[str, List[Dict]]:\n \"\"\"\n Generate keys for multiple providers at once.\n \n Args:\n providers: List of provider names (None = all providers)\n count_per_provider: Keys per provider\n \n Returns:\n Dict mapping provider names to key lists\n \"\"\"\n if providers is None:\n providers = list(self.PROVIDERS.keys())\n \n results = {}\n for provider in providers:\n results[provider] = self.generate_batch(provider, count_per_provider)\n \n return results\n \n def validate_key(self, key: str, provider: str = None) -> Dict:\n \"\"\"\n Validate an API key format.\n \n Args:\n key: API key to validate\n provider: Expected provider (None = auto-detect)\n \n Returns:\n Validation result dict\n \"\"\"\n result = {\n 'valid': False,\n 'provider': None,\n 'detected_providers': [],\n 'issues': []\n }\n \n if not key or not isinstance(key, str):\n result['issues'].append('Key is empty or invalid type')\n return result\n \n # Check against all providers if not specified\n providers_to_check = [provider] if provider else list(self.PROVIDERS.keys())\n \n for prov in providers_to_check:\n if prov not in self.PROVIDERS:\n continue\n \n config = self.PROVIDERS[prov]\n pattern = config['pattern']\n \n if re.match(pattern, key):\n result['detected_providers'].append(prov)\n \n if result['detected_providers']:\n result['valid'] = True\n result['provider'] = result['detected_providers'][0]\n else:\n result['issues'].append('Key format does not match any known provider')\n \n # Provide hints\n if key.startswith('sk-'):\n result['issues'].append('Looks like OpenAI/DeepSeek format but length may be wrong')\n elif key.startswith('gsk_'):\n result['issues'].append('Looks like Groq format but length may be wrong')\n \n return result\n \n def detect_provider(self, key: str) -> Optional[str]:\n \"\"\"\n Detect the provider from a key's format.\n \n Args:\n key: API key\n \n Returns:\n Provider name or None\n \"\"\"\n validation = self.validate_key(key)\n return validation.get('provider')\n \n def _generate_checksum(self, key: str) -> str:\n \"\"\"Generate a short checksum for key verification.\"\"\"\n hash_obj = hashlib.sha256(key.encode())\n return hash_obj.hexdigest()[:8]\n \n def generate_jwt_like_key(self, provider: str = 'generic') -> Dict:\n \"\"\"\n Generate a JWT-like token structure.\n \n Returns:\n Dict with JWT-style key\n \"\"\"\n # Header\n header = base64.urlsafe_b64encode(b'{\"alg\":\"HS256\",\"typ\":\"JWT\"}').decode().rstrip('=')\n \n # Payload with provider info\n payload_data = {\n 'iss': provider,\n 'iat': int(time.time()),\n 'exp': int(time.time()) + 86400 * 365,\n 'sub': secrets.token_hex(16)\n }\n import json\n payload = base64.urlsafe_b64encode(json.dumps(payload_data).encode()).decode().rstrip('=')\n \n # Signature\n signature = secrets.token_urlsafe(32)\n \n jwt_key = f\"{header}.{payload}.{signature}\"\n \n return {\n 'key': jwt_key,\n 'provider': provider,\n 'type': 'jwt',\n 'length': len(jwt_key),\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def generate_uuid_key(self, provider: str = 'generic', \n prefix: str = None,\n version: int = 4) -> Dict:\n \"\"\"\n Generate a UUID-based API key.\n \n Args:\n provider: Provider name\n prefix: Optional prefix\n version: UUID version (1 or 4)\n \n Returns:\n Dict with UUID key\n \"\"\"\n if version == 1:\n key_uuid = str(uuid.uuid1())\n else:\n key_uuid = str(uuid.uuid4())\n \n if prefix:\n api_key = f\"{prefix}{key_uuid}\"\n else:\n api_key = key_uuid\n \n return {\n 'key': api_key,\n 'provider': provider,\n 'type': 'uuid',\n 'version': version,\n 'length': len(api_key),\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def generate_secure_token(self, length: int = 64, \n encoding: str = 'hex') -> Dict:\n \"\"\"\n Generate a cryptographically secure token.\n \n Args:\n length: Token length\n encoding: 'hex', 'base64', or 'urlsafe'\n \n Returns:\n Dict with secure token\n \"\"\"\n if encoding == 'hex':\n token = secrets.token_hex(length // 2)\n elif encoding == 'base64':\n token = secrets.token_bytes(length).hex()\n token = base64.b64encode(bytes.fromhex(token)).decode()[:length]\n else: # urlsafe\n token = secrets.token_urlsafe(length)[:length]\n \n return {\n 'key': token,\n 'type': 'secure_token',\n 'encoding': encoding,\n 'length': len(token),\n 'entropy_bits': len(token) * 4 if encoding == 'hex' else len(token) * 6,\n 'generated_at': datetime.utcnow().isoformat()\n }\n \n def get_provider_info(self, provider: str) -> Optional[Dict]:\n \"\"\"\n Get information about a provider's key format.\n \n Args:\n provider: Provider name\n \n Returns:\n Provider config dict or None\n \"\"\"\n provider = provider.lower()\n if provider in self.PROVIDERS:\n config = self.PROVIDERS[provider].copy()\n config['name'] = provider\n return config\n return None\n \n def list_providers(self) -> List[Dict]:\n \"\"\"\n List all supported providers with their key formats.\n \n Returns:\n List of provider info dicts\n \"\"\"\n providers = []\n for name, config in self.PROVIDERS.items():\n providers.append({\n 'name': name,\n 'prefix': config['prefix'],\n 'length': config['length'],\n 'example': config['example']\n })\n return providers\n \n def get_stats(self) -> Dict:\n \"\"\"Get generation statistics.\"\"\"\n return {\n **self.generation_stats,\n 'recent_keys': len(self.generated_keys),\n 'providers_used': list(self.generation_stats['by_provider'].keys())\n }\n \n def export_keys(self, format: str = 'json') -> str:\n \"\"\"\n Export generated keys.\n \n Args:\n format: 'json', 'csv', or 'text'\n \n Returns:\n Formatted string\n \"\"\"\n import json\n \n if format == 'json':\n return json.dumps(self.generated_keys, indent=2)\n elif format == 'csv':\n lines = ['provider,key,generated_at']\n for k in self.generated_keys:\n lines.append(f\"{k['provider']},{k['key']},{k['generated_at']}\")\n return '\\n'.join(lines)\n else: # text\n lines = []\n for k in self.generated_keys:\n lines.append(f\"[{k['provider']}] {k['key']}\")\n return '\\n'.join(lines)\n \n def clear_history(self):\n \"\"\"Clear generated keys history.\"\"\"\n self.generated_keys = []\n\n\n# Singleton instance\n_key_generator = None\n\ndef get_key_generator() -> APIKeyGenerator:\n \"\"\"Get singleton key generator instance.\"\"\"\n global _key_generator\n if _key_generator is None:\n _key_generator = APIKeyGenerator()\n return _key_generator\n\n\n# Quick access functions\ndef generate_api_key(provider: str = 'generic') -> str:\n \"\"\"Quick function to generate a single key.\"\"\"\n gen = get_key_generator()\n return gen.generate_key(provider)['key']\n\ndef generate_keys(provider: str = 'generic', count: int = 5) -> List[str]:\n \"\"\"Quick function to generate multiple keys.\"\"\"\n gen = get_key_generator()\n results = gen.generate_batch(provider, count)\n return [r['key'] for r in results]\n\ndef validate_api_key(key: str) -> Dict:\n \"\"\"Quick function to validate a key.\"\"\"\n gen = get_key_generator()\n return gen.validate_key(key)\n\n\nif __name__ == '__main__':\n # Test the generator\n gen = APIKeyGenerator()\n \n print(\"=== API KEY GENERATOR TEST ===\\n\")\n \n # Generate keys for different providers\n providers = ['openai', 'groq', 'anthropic', 'huggingface', 'together', 'deepseek']\n \n for provider in providers:\n result = gen.generate_key(provider)\n print(f\"{provider.upper():12} | {result['key']}\")\n \n print(f\"\\n=== Stats ===\")\n print(gen.get_stats())\n"}}}} |