diff --git a/litellm/llms/featherless_ai/chat/transformation.py b/litellm/llms/featherless_ai/chat/transformation.py index 96702cf886..e62108624d 100644 --- a/litellm/llms/featherless_ai/chat/transformation.py +++ b/litellm/llms/featherless_ai/chat/transformation.py @@ -103,10 +103,15 @@ class FeatherlessAIConfig(OpenAIGPTConfig): # FeatherlessAI is openai compatible, set to custom_openai and use FeatherlessAI's endpoint api_base = ( api_base + or get_secret_str("FEATHERLESS_AI_API_BASE") or get_secret_str("FEATHERLESS_API_BASE") or "https://api.featherless.ai/v1" ) - dynamic_api_key = api_key or get_secret_str("FEATHERLESS_API_KEY") + dynamic_api_key = ( + api_key + or get_secret_str("FEATHERLESS_AI_API_KEY") + or get_secret_str("FEATHERLESS_API_KEY") + ) return api_base, dynamic_api_key def validate_environment( diff --git a/tests/test_litellm/llms/featherless_ai/chat/test_featherless_chat_transformation.py b/tests/test_litellm/llms/featherless_ai/chat/test_featherless_chat_transformation.py index b4ef78b913..a1240705fd 100644 --- a/tests/test_litellm/llms/featherless_ai/chat/test_featherless_chat_transformation.py +++ b/tests/test_litellm/llms/featherless_ai/chat/test_featherless_chat_transformation.py @@ -7,8 +7,6 @@ Featherless AI is an OpenAI-compatible provider with a few customizations. import os import sys -from typing import Dict, List, Optional -from unittest.mock import patch import pytest @@ -149,6 +147,45 @@ class TestFeatherlessAIConfig: ) assert "Featherless AI doesn't support tools=" in str(excinfo.value) + def test_get_provider_info_with_featherless_ai_api_key(self, monkeypatch): + """Test that FEATHERLESS_AI_API_KEY env var is picked up correctly""" + config = FeatherlessAIConfig() + for key in ("FEATHERLESS_AI_API_KEY", "FEATHERLESS_API_KEY", + "FEATHERLESS_AI_API_BASE", "FEATHERLESS_API_BASE"): + monkeypatch.delenv(key, raising=False) + monkeypatch.setenv("FEATHERLESS_AI_API_KEY", "key-from-ai-env") + api_base, api_key = config._get_openai_compatible_provider_info( + api_base=None, api_key=None + ) + assert api_key == "key-from-ai-env" + assert api_base == "https://api.featherless.ai/v1" + + def test_get_provider_info_with_legacy_featherless_api_key(self, monkeypatch): + """Test that legacy FEATHERLESS_API_KEY env var still works""" + config = FeatherlessAIConfig() + for key in ("FEATHERLESS_AI_API_KEY", "FEATHERLESS_API_KEY", + "FEATHERLESS_AI_API_BASE", "FEATHERLESS_API_BASE"): + monkeypatch.delenv(key, raising=False) + monkeypatch.setenv("FEATHERLESS_API_KEY", "key-from-legacy-env") + api_base, api_key = config._get_openai_compatible_provider_info( + api_base=None, api_key=None + ) + assert api_key == "key-from-legacy-env" + assert api_base == "https://api.featherless.ai/v1" + + def test_get_provider_info_prefers_featherless_ai_key_over_legacy(self, monkeypatch): + """Test that FEATHERLESS_AI_API_KEY takes precedence over FEATHERLESS_API_KEY""" + config = FeatherlessAIConfig() + for key in ("FEATHERLESS_AI_API_KEY", "FEATHERLESS_API_KEY", + "FEATHERLESS_AI_API_BASE", "FEATHERLESS_API_BASE"): + monkeypatch.delenv(key, raising=False) + monkeypatch.setenv("FEATHERLESS_AI_API_KEY", "preferred-key") + monkeypatch.setenv("FEATHERLESS_API_KEY", "legacy-key") + _, api_key = config._get_openai_compatible_provider_info( + api_base=None, api_key=None + ) + assert api_key == "preferred-key" + def test_default_api_base(self): """Test that default API base is used when none is provided""" config = FeatherlessAIConfig()