|  | """ | 
					
						
						|  | API Key Generator Script | 
					
						
						|  |  | 
					
						
						|  | This script is used to generate API keys for new users. | 
					
						
						|  | API keys are generated in the format sk-{username}-{base64_encoded_data}. | 
					
						
						|  | The encoded data includes username, creation timestamp, and HMAC signature. | 
					
						
						|  |  | 
					
						
						|  | Usage: | 
					
						
						|  | python generate_api_key.py <username> <secret_key> | 
					
						
						|  |  | 
					
						
						|  | Example: | 
					
						
						|  | python generate_api_key.py new_user mock-secret-key-123456789 | 
					
						
						|  | """ | 
					
						
						|  |  | 
					
						
						|  | import base64 | 
					
						
						|  | import json | 
					
						
						|  | import sys | 
					
						
						|  | import argparse | 
					
						
						|  | import hmac | 
					
						
						|  | import hashlib | 
					
						
						|  | from datetime import datetime | 
					
						
						|  | from loguru import logger | 
					
						
						|  |  | 
					
						
						|  | logger.add("logs/api_key_generator.log") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def generate_api_key(username: str, secret_key: str) -> str: | 
					
						
						|  | """ | 
					
						
						|  | Generates an API key for the given username using a secret key. | 
					
						
						|  |  | 
					
						
						|  | Args: | 
					
						
						|  | username (str): Username to generate API key for | 
					
						
						|  | secret_key (str): Secret key for API key generation | 
					
						
						|  |  | 
					
						
						|  | Returns: | 
					
						
						|  | str: Generated API_KEY (ACCESS_KEY, ACCESS_TOKEN) | 
					
						
						|  | """ | 
					
						
						|  |  | 
					
						
						|  | timestamp = int(datetime.now().timestamp()) | 
					
						
						|  | data = {"username": username, "created_at": timestamp} | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | json_data = {"username": username, "created_at": timestamp} | 
					
						
						|  | json_str = json.dumps(json_data) | 
					
						
						|  | logger.debug(f"JSON data for signature: {json_str}") | 
					
						
						|  | logger.debug(f"Secret key: {secret_key}") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | signature = hmac.new(secret_key.encode(), json_str.encode(), hashlib.sha256).hexdigest() | 
					
						
						|  |  | 
					
						
						|  | logger.debug(f"Generated signature: {signature}") | 
					
						
						|  |  | 
					
						
						|  | data["signature"] = signature | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | api_key = f"sk-{username}-" + base64.b64encode(json.dumps(data).encode()).decode() | 
					
						
						|  |  | 
					
						
						|  | return api_key, timestamp | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def save_api_key(username: str, api_key: str, timestamp: int): | 
					
						
						|  | """ | 
					
						
						|  | Save API key to api_keys.txt file in the same format as the shell script. | 
					
						
						|  |  | 
					
						
						|  | Args: | 
					
						
						|  | username (str): Username | 
					
						
						|  | api_key (str): Generated API key | 
					
						
						|  | timestamp (int): Creation timestamp | 
					
						
						|  | """ | 
					
						
						|  | formatted_timestamp = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S") | 
					
						
						|  | with open("api_keys.txt", "a") as f: | 
					
						
						|  | f.write(f"Username: {username}\n") | 
					
						
						|  | f.write(f"API Key: {api_key}\n") | 
					
						
						|  | f.write(f"Timestamp: {formatted_timestamp}\n") | 
					
						
						|  | f.write("--------------------------------\n") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def main(): | 
					
						
						|  | parser = argparse.ArgumentParser(description="API Key Generator") | 
					
						
						|  | parser.add_argument("username", help="Username to generate API key for") | 
					
						
						|  | parser.add_argument("secret_key", help="Secret key for API key generation") | 
					
						
						|  | args = parser.parse_args() | 
					
						
						|  |  | 
					
						
						|  | try: | 
					
						
						|  | api_key, timestamp = generate_api_key(args.username, args.secret_key) | 
					
						
						|  |  | 
					
						
						|  | print("\nAPI Key generated:") | 
					
						
						|  | print(f"Username: {args.username}") | 
					
						
						|  | print(f"API Key: {api_key}") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | save_api_key(args.username, api_key, timestamp) | 
					
						
						|  | print("\nAPI Key saved to api_keys.txt") | 
					
						
						|  |  | 
					
						
						|  | print("\nUsage example:") | 
					
						
						|  | print('curl -X POST "http://localhost:8000/v1/chat/completions" \\') | 
					
						
						|  | print(f'     -H "Authorization: Bearer {api_key}" \\') | 
					
						
						|  | print('     -H "Content-Type: application/json" \\') | 
					
						
						|  | print('     -d \'{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Hello!"}]}\'') | 
					
						
						|  |  | 
					
						
						|  | except argparse.ArgumentError: | 
					
						
						|  | print("Please provide a username and secret key", file=sys.stderr) | 
					
						
						|  | sys.exit(1) | 
					
						
						|  | except Exception as e: | 
					
						
						|  | print(f"Error: {str(e)}", file=sys.stderr) | 
					
						
						|  | sys.exit(1) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if __name__ == "__main__": | 
					
						
						|  | main() | 
					
						
						|  |  |