env_step.py
1 from pathlib import Path 2 3 import click 4 5 from ...utils import ask_if_not_provided 6 7 ENV_DEFAULTS = { 8 "LLM_SERVICE_ENDPOINT": "YOUR_LLM_SERVICE_ENDPOINT_HERE", 9 "LLM_SERVICE_API_KEY": "YOUR_LLM_SERVICE_API_KEY_HERE", 10 "LLM_SERVICE_PLANNING_MODEL_NAME": "YOUR_LLM_SERVICE_PLANNING_MODEL_NAME_HERE", 11 "LLM_SERVICE_GENERAL_MODEL_NAME": "YOUR_LLM_SERVICE_GENERAL_MODEL_NAME_HERE", 12 "AWS_ACCESS_KEY_ID": "YOUR_AWS_ACCESS_KEY_ID_HERE", 13 "AWS_SECRET_ACCESS_KEY": "YOUR_AWS_SECRET_ACCESS_KEY_HERE", 14 "AWS_SESSION_TOKEN": "", 15 "BEDROCK_MODEL_NAME": "YOUR_BEDROCK_MODEL_NAME_HERE", 16 "BEDROCK_MODEL_ID": "YOUR_BEDROCK_MODEL_ID_HERE", 17 "NAMESPACE": "my_project_namespace/", 18 "SOLACE_BROKER_URL": "ws://localhost:8008", 19 "SOLACE_BROKER_VPN": "default", 20 "SOLACE_BROKER_USERNAME": "default", 21 "SOLACE_BROKER_PASSWORD": "default", 22 "SOLACE_DEV_MODE": "false", 23 "SESSION_SECRET_KEY": "please_change_me_in", 24 "FASTAPI_HOST": "127.0.0.1", 25 "FASTAPI_PORT": "8000", 26 "FASTAPI_HTTPS_PORT": "8443", 27 "ENABLE_EMBED_RESOLUTION": "true", 28 "SSL_KEYFILE": "", 29 "SSL_CERTFILE": "", 30 "SSL_KEYFILE_PASSWORD": "", 31 "LOGGING_CONFIG_PATH": "configs/logging_config.yaml", 32 "S3_BUCKET_NAME": "", 33 "S3_ENDPOINT_URL": "", 34 "S3_REGION": "us-east-1", 35 "PLATFORM_SERVICE_URL": None, 36 "LLM_SERVICE_OAUTH_TOKEN_URL": "YOUR_LLM_SERVICE_OAUTH_TOKEN_URL_HERE", 37 "LLM_SERVICE_OAUTH_CLIENT_ID": "YOUR_LLM_SERVICE_OAUTH_CLIENT_ID_HERE", 38 "LLM_SERVICE_OAUTH_CLIENT_SECRET": "YOUR_LLM_SERVICE_OAUTH_CLIENT_SECRET_HERE", 39 "LLM_SERVICE_OAUTH_SCOPE": "", 40 "LLM_SERVICE_OAUTH_CA_CERT_PATH": "", 41 "LLM_SERVICE_OAUTH_TOKEN_REFRESH_BUFFER_SECONDS": "300", 42 "LLM_SERVICE_OAUTH_PLANNING_MODEL_NAME": "YOUR_LLM_SERVICE_OAUTH_PLANNING_MODEL_NAME_HERE", 43 "LLM_SERVICE_OAUTH_GENERAL_MODEL_NAME": "YOUR_LLM_SERVICE_OAUTH_GENERAL_MODEL_NAME_HERE", 44 "LLM_SERVICE_OAUTH_ENDPOINT": "YOUR_LLM_SERVICE_OAUTH_ENDPOINT_HERE", 45 "PLATFORM_API_HOST": "127.0.0.1", 46 "PLATFORM_API_PORT": "8001", 47 "SAM_AUTHORIZATION_CONFIG": '{"authorization_service": {"type": "none"}}', 48 } 49 50 51 def create_env_file(project_root: Path, options: dict, skip_interactive: bool) -> bool: 52 """ 53 Creates the .env file, using ask_if_not_provided to get values. 54 The 'options' dict contains values from CLI args or web_init. 55 Returns True on success, False on failure. 56 """ 57 env_path = project_root / ".env" 58 click.echo("Configuring .env file...") 59 60 # Check if a LLM provider was selected 61 llm_provider = options.get("llm_provider", "") 62 63 env_params_config = [] 64 65 # Only add LLM parameters if a provider was selected 66 if llm_provider == "aws_bedrock": 67 env_params_config.extend([ 68 ( 69 "llm_model_name", 70 "BEDROCK_MODEL_NAME", 71 "Enter AWS Bedrock Model Name", 72 False, 73 "BEDROCK_MODEL_NAME", 74 ), 75 ( 76 "aws_model_id", 77 "BEDROCK_MODEL_ID", 78 "Enter AWS Bedrock Model ID", 79 False, 80 "BEDROCK_MODEL_ID", 81 ), 82 ( 83 "aws_access_key", 84 "AWS_ACCESS_KEY_ID", 85 "Enter AWS Access Key ID", 86 True, 87 "AWS_ACCESS_KEY_ID", 88 ), 89 ( 90 "aws_secret_access_key", 91 "AWS_SECRET_ACCESS_KEY", 92 "Enter AWS Secret Access Key", 93 True, 94 "AWS_SECRET_ACCESS_KEY", 95 ), 96 ( 97 "aws_session_token", 98 "AWS_SESSION_TOKEN", 99 "Enter AWS Session Token (optional)", 100 True, 101 "AWS_SESSION_TOKEN", 102 ), 103 ]) 104 elif llm_provider: 105 # Add standard LLM parameters for non-Bedrock providers 106 env_params_config.extend([ 107 ( 108 "llm_service_endpoint", 109 "LLM_SERVICE_ENDPOINT", 110 "Enter LLM Service Endpoint URL", 111 False, 112 "LLM_SERVICE_ENDPOINT", 113 ), 114 ( 115 "llm_service_api_key", 116 "LLM_SERVICE_API_KEY", 117 "Enter LLM Service API Key", 118 True, 119 "LLM_SERVICE_API_KEY", 120 ), 121 ( 122 "llm_service_planning_model_name", 123 "LLM_SERVICE_PLANNING_MODEL_NAME", 124 "Enter LLM Planning Model Name (e.g., openai/gpt-4o)", 125 False, 126 "LLM_SERVICE_PLANNING_MODEL_NAME", 127 ), 128 ( 129 "llm_service_general_model_name", 130 "LLM_SERVICE_GENERAL_MODEL_NAME", 131 "Enter LLM General Model Name (e.g., openai/gpt-3.5-turbo)", 132 False, 133 "LLM_SERVICE_GENERAL_MODEL_NAME", 134 ), 135 ]) 136 137 # Add common parameters (namespace, broker, webui, etc.) 138 env_params_config.extend([ 139 ( 140 "namespace", 141 "NAMESPACE", 142 "Enter Namespace for the project (e.g., my_project)", 143 False, 144 "NAMESPACE", 145 ), 146 ( 147 "broker_url", 148 "SOLACE_BROKER_URL", 149 "Solace Broker URL", 150 False, 151 "SOLACE_BROKER_URL", 152 ), 153 ( 154 "broker_vpn", 155 "SOLACE_BROKER_VPN", 156 "Solace Broker VPN", 157 False, 158 "SOLACE_BROKER_VPN", 159 ), 160 ( 161 "broker_username", 162 "SOLACE_BROKER_USERNAME", 163 "Solace Broker Username", 164 False, 165 "SOLACE_BROKER_USERNAME", 166 ), 167 ( 168 "broker_password", 169 "SOLACE_BROKER_PASSWORD", 170 "Solace Broker Password", 171 True, 172 "SOLACE_BROKER_PASSWORD", 173 ), 174 ( 175 "dev_mode", 176 "SOLACE_DEV_MODE", 177 "Enable Solace Dev Mode (true/false)", 178 False, 179 "SOLACE_DEV_MODE", 180 ), 181 ( 182 "webui_session_secret_key", 183 "SESSION_SECRET_KEY", 184 "Enter Web UI Session Secret Key", 185 True, 186 "SESSION_SECRET_KEY", 187 ), 188 ( 189 "webui_fastapi_host", 190 "FASTAPI_HOST", 191 "Enter Web UI FastAPI Host", 192 False, 193 "FASTAPI_HOST", 194 ), 195 ( 196 "webui_fastapi_port", 197 "FASTAPI_PORT", 198 "Enter Web UI FastAPI Port", 199 False, 200 "FASTAPI_PORT", 201 ), 202 ( 203 "webui_fastapi_https_port", 204 "FASTAPI_HTTPS_PORT", 205 "Enter Web UI FastAPI HTTPS Port", 206 False, 207 "FASTAPI_HTTPS_PORT", 208 ), 209 ( 210 "webui_ssl_keyfile", 211 "SSL_KEYFILE", 212 "Enter SSL Key File Path", 213 False, 214 "SSL_KEYFILE", 215 ), 216 ( 217 "webui_ssl_certfile", 218 "SSL_CERTFILE", 219 "Enter SSL Certificate File Path", 220 False, 221 "SSL_CERTFILE", 222 ), 223 ( 224 "webui_ssl_keyfile_password", 225 "SSL_KEYFILE_PASSWORD", 226 "Enter SSL Key File Passphrase", 227 True, 228 "SSL_KEYFILE_PASSWORD", 229 ), 230 ( 231 "webui_enable_embed_resolution", 232 "ENABLE_EMBED_RESOLUTION", 233 "Enable Embed Resolution for Web UI? (true/false)", 234 False, 235 "ENABLE_EMBED_RESOLUTION", 236 ), 237 ( 238 "logging_config_path", 239 "LOGGING_CONFIG_PATH", 240 "Enter Logging Config Path", 241 False, 242 "LOGGING_CONFIG_PATH", 243 ), 244 ( 245 "s3_bucket_name", 246 "S3_BUCKET_NAME", 247 "Enter S3 Bucket Name (for S3 artifact service)", 248 False, 249 "S3_BUCKET_NAME", 250 ), 251 ( 252 "s3_endpoint_url", 253 "S3_ENDPOINT_URL", 254 "Enter S3 Endpoint URL (for S3-compatible services, leave empty for AWS S3)", 255 False, 256 "S3_ENDPOINT_URL", 257 ), 258 ( 259 "s3_region", 260 "S3_REGION", 261 "Enter S3 Region (for S3 artifact service)", 262 False, 263 "S3_REGION", 264 ), 265 ( 266 "platform_api_host", 267 "PLATFORM_API_HOST", 268 "Enter Platform API Host", 269 False, 270 "PLATFORM_API_HOST", 271 ), 272 ( 273 "platform_api_port", 274 "PLATFORM_API_PORT", 275 "Enter Platform API Port", 276 False, 277 "PLATFORM_API_PORT", 278 ), 279 ]) 280 281 env_vars_to_write = {} 282 283 for opt_key, env_name, prompt, is_secret, default_key in env_params_config: 284 ask_if_not_provided( 285 options, 286 opt_key, 287 prompt, 288 default=ENV_DEFAULTS.get(default_key), 289 none_interactive=skip_interactive, 290 hide_input=is_secret, 291 ) 292 env_vars_to_write[env_name] = options.get(opt_key) 293 294 if ( 295 env_vars_to_write.get("NAMESPACE") 296 and env_vars_to_write["NAMESPACE"] != ENV_DEFAULTS.get("NAMESPACE") 297 and not str(env_vars_to_write["NAMESPACE"]).endswith("/") 298 ): 299 env_vars_to_write["NAMESPACE"] = str(env_vars_to_write["NAMESPACE"]) + "/" 300 301 # Handle Platform Service URL generation 302 frontend_is_ssl = env_vars_to_write.get("SSL_CERTFILE") and env_vars_to_write.get("SSL_KEYFILE") 303 if not env_vars_to_write.get("PLATFORM_SERVICE_URL"): 304 platform_url = "https://" if frontend_is_ssl else "http://" 305 platform_url += env_vars_to_write.get("PLATFORM_API_HOST") or "127.0.0.1" 306 platform_url += ":" + str(env_vars_to_write.get("PLATFORM_API_PORT") or 8001) 307 env_vars_to_write["PLATFORM_SERVICE_URL"] = platform_url 308 309 env_vars_to_write["SAM_AUTHORIZATION_CONFIG"] = ENV_DEFAULTS["SAM_AUTHORIZATION_CONFIG"] 310 311 final_env_vars = {k: v for k, v in env_vars_to_write.items() if v is not None} 312 env_content_lines = [] 313 for key, value in final_env_vars.items(): 314 if '"' in str(value): 315 env_content_lines.append(f"{key}='{value}'") 316 else: 317 env_content_lines.append(f'{key}="{value}"') 318 319 try: 320 with open(env_path, "w", encoding="utf-8") as f: 321 f.write("\n".join(env_content_lines) + "\n") 322 click.echo(f" Created: {env_path.relative_to(project_root)}") 323 return True 324 except IOError as e: 325 click.echo( 326 click.style(f"Error creating file {env_path}: {e}", fg="red"), err=True 327 ) 328 return False