diff --git a/litellm/setup_wizard.py b/litellm/setup_wizard.py index 30af947430c..e2a1a9c40da 100644 --- a/litellm/setup_wizard.py +++ b/litellm/setup_wizard.py @@ -322,19 +322,24 @@ class SetupWizard: SetupWizard._render_selector(cursor, selected, first_render=True) while True: key = SetupWizard._read_key() + dirty = False if key == "\x1b[A": cursor = (cursor - 1) % len(PROVIDERS) + dirty = True elif key == "\x1b[B": cursor = (cursor + 1) % len(PROVIDERS) + dirty = True elif key == " ": selected.symmetric_difference_update({cursor}) + dirty = True elif key in ("\r", "\n"): if not selected: selected.add(cursor) break elif key in ("\x03", "\x04"): raise KeyboardInterrupt - SetupWizard._render_selector(cursor, selected, first_render=False) + if dirty: + SetupWizard._render_selector(cursor, selected, first_render=False) finally: if _supports_color(): sys.stdout.write(_CURSOR_SHOW) @@ -521,8 +526,10 @@ class SetupWizard: if p["id"] == "azure": deployment = env_copy.pop( - f"_LITELLM_AZURE_DEPLOYMENT_{p['id'].upper()}", "gpt-4o" + f"_LITELLM_AZURE_DEPLOYMENT_{p['id'].upper()}", "" ) + if not deployment: + continue # skip Azure entirely if no deployment name was provided models = [f"azure/{deployment}"] else: models = p["models"] @@ -539,11 +546,15 @@ class SetupWizard: if p["env_key"] and p["env_key"] in env_copy: lines.append(f" api_key: os.environ/{p['env_key']}") if p.get("api_base"): - lines.append(f" api_base: {p['api_base']}") + lines.append( + f' api_base: "{_yaml_escape(str(p["api_base"]))}"' + ) elif p.get("needs_api_base"): azure_base_key = f"_LITELLM_AZURE_API_BASE_{p['id'].upper()}" if azure_base_key in env_copy: - lines.append(f" api_base: {env_copy.pop(azure_base_key)}") + lines.append( + f' api_base: "{_yaml_escape(env_copy.pop(azure_base_key))}"' + ) if p.get("api_version"): lines.append(f" api_version: {p['api_version']}") diff --git a/tests/test_litellm/test_setup_wizard.py b/tests/test_litellm/test_setup_wizard.py index 49a1711b0dc..21f34ce8161 100644 --- a/tests/test_litellm/test_setup_wizard.py +++ b/tests/test_litellm/test_setup_wizard.py @@ -129,6 +129,15 @@ def test_build_config_azure_uses_deployment_name(): config = SetupWizard._build_config([_AZURE], env_vars, "sk-master") assert "model: azure/my-gpt4o" in config assert "model_name: azure-my-gpt4o" in config + # api_base must be quoted to survive YAML special chars + assert 'api_base: "https://my.azure.com"' in config + + +def test_build_config_azure_no_deployment_skipped(): + """Azure without a deployment name should emit nothing (not fallback to gpt-4o).""" + env_vars = {"AZURE_API_KEY": "az-key"} # no deployment sentinel + config = SetupWizard._build_config([_AZURE], env_vars, "sk-master") + assert "azure" not in config or "model_list:" in config # no azure model emitted def test_build_config_no_display_name_collision_openai_and_azure():