/ cli / commands / init_cmd / env_step.py
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