fix: Remove redundant api key field in KB Ingest (#12624)

* fix: Remove redundant api key field in KB Ingest

* Update component_index.json
This commit is contained in:
Eric Hare
2026-04-11 14:19:17 -07:00
committed by GitHub
parent ca8547b6e6
commit cfaba3ede7
4 changed files with 23 additions and 53 deletions

View File

@ -3365,15 +3365,6 @@
"is_secret": false
}
],
"src/backend/tests/unit/components/files_and_knowledge/test_ingestion.py": [
{
"type": "Secret Keyword",
"filename": "src/backend/tests/unit/components/files_and_knowledge/test_ingestion.py",
"hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
"is_verified": false,
"line_number": 312
}
],
"src/backend/tests/unit/components/files_and_knowledge/test_retrieval.py": [
{
"type": "Secret Keyword",
@ -8414,5 +8405,5 @@
}
]
},
"generated_at": "2026-04-09T14:26:21Z"
"generated_at": "2026-04-10T17:09:16Z"
}

View File

@ -106,6 +106,16 @@ class TestKnowledgeIngestionComponent(ComponentTestBaseWithClient):
with pytest.raises(ValueError, match="Column 'nonexistent' not found in DataFrame"):
component._validate_column_config(data_df)
def test_new_knowledge_dialog_uses_provider_credentials(self, component_class, default_kwargs):
"""Test the create-knowledge dialog no longer exposes a redundant API key override."""
component = component_class(**default_kwargs)
dialog_inputs = component.inputs[0].dialog_inputs["fields"]["data"]["node"]
embedding_model_input = dialog_inputs["template"]["02_embedding_model"]
assert dialog_inputs["field_order"] == ["01_new_kb_name", "02_embedding_model"]
assert "03_api_key" not in dialog_inputs["template"]
assert "configured credentials" in embedding_model_input.info
@patch("lfx.components.files_and_knowledge.ingestion.get_settings_service")
@patch("lfx.components.files_and_knowledge.ingestion.encrypt_api_key")
def test_build_embedding_metadata(self, mock_encrypt, mock_get_settings, component_class, default_kwargs):
@ -309,7 +319,6 @@ class TestKnowledgeIngestionComponent(ComponentTestBaseWithClient):
field_value = {
"01_new_kb_name": "new_test_kb",
"02_embedding_model": model_selection,
"03_api_key": "test-key",
}
# Mock embedding validation
@ -322,8 +331,8 @@ class TestKnowledgeIngestionComponent(ComponentTestBaseWithClient):
assert result["knowledge_base"]["value"] == "new_test_kb"
assert "new_test_kb" in result["knowledge_base"]["options"]
assert mock_get_embeddings.call_args.kwargs["api_key"] == "test-key"
assert mock_save_metadata.call_args.kwargs["api_key"] == "test-key"
assert "api_key" not in mock_get_embeddings.call_args.kwargs
assert "api_key" not in mock_save_metadata.call_args.kwargs
@patch("lfx.components.files_and_knowledge.ingestion.get_embeddings")
async def test_build_kb_info_with_message_input(self, mock_get_embeddings, component_class, default_kwargs):
@ -353,7 +362,6 @@ class TestKnowledgeIngestionComponent(ComponentTestBaseWithClient):
field_value = {
"01_new_kb_name": "invalid@name", # Invalid character
"02_embedding_model": "sentence-transformers/all-MiniLM-L6-v2",
"03_api_key": None,
}
with pytest.raises(ValueError, match="Invalid knowledge base name"):

File diff suppressed because one or more lines are too long

View File

@ -87,7 +87,6 @@ class KnowledgeIngestionComponent(Component):
"field_order": [
"01_new_kb_name",
"02_embedding_model",
"03_api_key",
],
"template": {
"01_new_kb_name": StrInput(
@ -99,17 +98,13 @@ class KnowledgeIngestionComponent(Component):
"02_embedding_model": ModelInput(
name="embedding_model",
display_name="Choose Embedding Model",
info="Select the embedding model to use for this knowledge base.",
info=(
"Select the embedding model to use for this knowledge base. "
"Langflow uses the configured credentials for that model provider."
),
required=True,
model_type="embedding",
),
"03_api_key": SecretStrInput(
name="api_key",
display_name="Embedding Provider API Key",
info="Optional API key override used to validate and save this knowledge base.",
required=False,
advanced=True,
),
},
},
}
@ -254,7 +249,7 @@ class KnowledgeIngestionComponent(Component):
Args:
model_selection: Model selection list from ModelInput
(e.g. [{'name': ..., 'provider': ..., 'metadata': ...}])
api_key: Optional API key override.
api_key: Optional runtime API key override.
"""
model_dict = model_selection[0] if isinstance(model_selection, list) else model_selection
embedding_model = model_dict.get("name", "")
@ -718,13 +713,10 @@ class KnowledgeIngestionComponent(Component):
if isinstance(model_selection, dict):
model_selection = [model_selection]
api_key = field_value.get("03_api_key") or None
# Build and validate the embedding model via the shared utility
embed_model = get_embeddings(
model=model_selection,
user_id=self.user_id,
api_key=api_key,
)
# Try to generate a dummy embedding to validate without blocking the event loop
@ -749,7 +741,6 @@ class KnowledgeIngestionComponent(Component):
self._save_embedding_metadata(
kb_path=kb_path,
model_selection=model_selection,
api_key=api_key,
)
# Update the knowledge base options dynamically