Spaces:
Runtime error
Runtime error
| """ | |
| Simplified Storage Utilities for API Keys and Settings | |
| Provides basic storage utilities without complex warning systems | |
| """ | |
| import json | |
| import os | |
| from typing import Dict, Any, Optional | |
| from datetime import datetime | |
| import logging | |
| class SecureStorageManager: | |
| """ | |
| Simple storage manager for API keys and settings | |
| Focuses on environment variables and config file loading | |
| """ | |
| def __init__(self): | |
| self.logger = logging.getLogger(__name__) | |
| def create_simple_warning_html(self) -> str: | |
| """Create a simple warning for AI settings section""" | |
| return """ | |
| <div style=" | |
| background-color: #fff3cd; | |
| border: 1px solid #ffeaa7; | |
| border-radius: 6px; | |
| padding: 12px; | |
| margin: 8px 0; | |
| "> | |
| <div style="color: #856404; display: flex; align-items: center; gap: 8px;"> | |
| <span style="font-size: 18px;">⚠️</span> | |
| <div> | |
| <strong>API Key Storage Notice</strong><br> | |
| <small>API keys will be cleared when you refresh/reload the page or close the browser. | |
| Please keep your API keys and model information handy for re-entry when needed.</small> | |
| </div> | |
| </div> | |
| </div> | |
| """ | |
| def load_from_environment(self) -> Dict[str, Any]: | |
| """Load API keys from environment variables""" | |
| config = {} | |
| # Claude API | |
| if os.getenv('CLAUDE_API_KEY'): | |
| config['claude'] = { | |
| 'api_key': os.getenv('CLAUDE_API_KEY'), | |
| 'model': os.getenv('CLAUDE_MODEL', 'claude-3-5-sonnet-20241022'), | |
| 'api_url': os.getenv('CLAUDE_API_URL', 'https://api.anthropic.com') | |
| } | |
| # SambaNova API | |
| if os.getenv('SAMBANOVA_API_KEY'): | |
| config['sambanova'] = { | |
| 'api_key': os.getenv('SAMBANOVA_API_KEY'), | |
| 'model': os.getenv('SAMBANOVA_MODEL', 'Meta-Llama-3.1-70B-Instruct'), | |
| 'api_url': os.getenv('SAMBANOVA_API_URL', 'https://api.sambanova.ai') | |
| } | |
| # LM Studio API | |
| if os.getenv('LM_STUDIO_URL'): | |
| config['lm_studio'] = { | |
| 'api_url': os.getenv('LM_STUDIO_URL', 'http://localhost:1234/v1'), | |
| 'model': os.getenv('LM_STUDIO_MODEL', 'local-model') | |
| } | |
| # Ollama API | |
| if os.getenv('OLLAMA_URL'): | |
| config['ollama'] = { | |
| 'api_url': os.getenv('OLLAMA_URL', 'http://localhost:11434'), | |
| 'model': os.getenv('OLLAMA_MODEL', 'llama3.1') | |
| } | |
| # Custom API | |
| if os.getenv('CUSTOM_API_URL'): | |
| config['custom'] = { | |
| 'api_url': os.getenv('CUSTOM_API_URL'), | |
| 'api_key': os.getenv('CUSTOM_API_KEY', ''), | |
| 'model': os.getenv('CUSTOM_MODEL', 'default') | |
| } | |
| return config | |
| def load_config_from_file(self, config_path: str = "config.json") -> Optional[Dict[str, Any]]: | |
| """Load configuration from file""" | |
| try: | |
| if os.path.exists(config_path): | |
| with open(config_path, 'r') as f: | |
| return json.load(f) | |
| except Exception as e: | |
| self.logger.error(f"Failed to load config file: {e}") | |
| return None | |
| def create_config_file_template(self) -> Dict[str, Any]: | |
| """Create a template for configuration file""" | |
| return { | |
| "api_keys": { | |
| "claude": { | |
| "api_key": "your-claude-api-key-here", | |
| "model": "claude-3-5-sonnet-20241022", | |
| "api_url": "https://api.anthropic.com" | |
| }, | |
| "sambanova": { | |
| "api_key": "your-sambanova-api-key-here", | |
| "model": "Meta-Llama-3.1-70B-Instruct", | |
| "api_url": "https://api.sambanova.ai" | |
| }, | |
| "lm_studio": { | |
| "api_url": "http://localhost:1234/v1", | |
| "model": "local-model" | |
| }, | |
| "ollama": { | |
| "api_url": "http://localhost:11434", | |
| "model": "llama3.1" | |
| } | |
| }, | |
| "settings": { | |
| "temperature": 0.7, | |
| "max_tokens": 1000, | |
| "enable_insights": True, | |
| "enable_recommendations": True | |
| }, | |
| "_metadata": { | |
| "version": "1.0", | |
| "created": datetime.now().isoformat(), | |
| "description": "Spend Analyzer MCP Configuration File" | |
| } | |
| } | |
| def save_config_template(self, config_path: str = "config.json.template") -> bool: | |
| """Save configuration template file""" | |
| try: | |
| template = self.create_config_file_template() | |
| with open(config_path, 'w') as f: | |
| json.dump(template, f, indent=2) | |
| self.logger.info(f"Configuration template saved to {config_path}") | |
| return True | |
| except Exception as e: | |
| self.logger.error(f"Failed to save config template: {e}") | |
| return False | |
| def get_environment_variables_guide(self) -> str: | |
| """Get guide for setting up environment variables""" | |
| return """ | |
| # Environment Variables Setup Guide | |
| ## For Local Development: | |
| ### Windows (Command Prompt): | |
| ```cmd | |
| set CLAUDE_API_KEY=your-claude-api-key-here | |
| set SAMBANOVA_API_KEY=your-sambanova-api-key-here | |
| set LM_STUDIO_URL=http://localhost:1234/v1 | |
| set OLLAMA_URL=http://localhost:11434 | |
| ``` | |
| ### Windows (PowerShell): | |
| ```powershell | |
| $env:CLAUDE_API_KEY="your-claude-api-key-here" | |
| $env:SAMBANOVA_API_KEY="your-sambanova-api-key-here" | |
| $env:LM_STUDIO_URL="http://localhost:1234/v1" | |
| $env:OLLAMA_URL="http://localhost:11434" | |
| ``` | |
| ### macOS/Linux (Bash): | |
| ```bash | |
| export CLAUDE_API_KEY="your-claude-api-key-here" | |
| export SAMBANOVA_API_KEY="your-sambanova-api-key-here" | |
| export LM_STUDIO_URL="http://localhost:1234/v1" | |
| export OLLAMA_URL="http://localhost:11434" | |
| ``` | |
| ### .env File (Recommended): | |
| Create a `.env` file in your project directory: | |
| ``` | |
| CLAUDE_API_KEY=your-claude-api-key-here | |
| SAMBANOVA_API_KEY=your-sambanova-api-key-here | |
| LM_STUDIO_URL=http://localhost:1234/v1 | |
| OLLAMA_URL=http://localhost:11434 | |
| ``` | |
| ## Security Best Practices: | |
| 1. Never commit API keys to version control | |
| 2. Use different keys for development and production | |
| 3. Regularly rotate your API keys | |
| 4. Monitor API usage for unusual activity | |
| 5. Use least-privilege access principles | |
| """ | |