diff --git a/backend/danswer/db/llm.py b/backend/danswer/db/llm.py index 36d05948be53..5e3a7abb8e76 100644 --- a/backend/danswer/db/llm.py +++ b/backend/danswer/db/llm.py @@ -62,13 +62,21 @@ def upsert_cloud_embedding_provider( def upsert_llm_provider( - llm_provider: LLMProviderUpsertRequest, db_session: Session + llm_provider: LLMProviderUpsertRequest, + db_session: Session, + is_creation: bool = True, ) -> FullLLMProvider: existing_llm_provider = db_session.scalar( select(LLMProviderModel).where(LLMProviderModel.name == llm_provider.name) ) + if existing_llm_provider and is_creation: + raise ValueError(f"LLM Provider with name {llm_provider.name} already exists") if not existing_llm_provider: + if not is_creation: + raise ValueError( + f"LLM Provider with name {llm_provider.name} does not exist" + ) existing_llm_provider = LLMProviderModel(name=llm_provider.name) db_session.add(existing_llm_provider) diff --git a/backend/danswer/server/manage/llm/api.py b/backend/danswer/server/manage/llm/api.py index 4e57ec7bc35d..8c73a609a7d5 100644 --- a/backend/danswer/server/manage/llm/api.py +++ b/backend/danswer/server/manage/llm/api.py @@ -3,6 +3,7 @@ from collections.abc import Callable from fastapi import APIRouter from fastapi import Depends from fastapi import HTTPException +from fastapi import Query from sqlalchemy.orm import Session from danswer.auth.users import current_admin_user @@ -118,10 +119,22 @@ def list_llm_providers( @admin_router.put("/provider") def put_llm_provider( llm_provider: LLMProviderUpsertRequest, + is_creation: bool = Query( + True, + description="True if updating an existing provider, False if creating a new one", + ), _: User | None = Depends(current_admin_user), db_session: Session = Depends(get_session), ) -> FullLLMProvider: - return upsert_llm_provider(llm_provider=llm_provider, db_session=db_session) + try: + return upsert_llm_provider( + llm_provider=llm_provider, + db_session=db_session, + is_creation=is_creation, + ) + except ValueError as e: + logger.exception("Failed to upsert LLM Provider") + raise HTTPException(status_code=400, detail=str(e)) @admin_router.delete("/provider/{provider_id}") diff --git a/web/src/app/admin/configuration/llm/LLMProviderUpdateForm.tsx b/web/src/app/admin/configuration/llm/LLMProviderUpdateForm.tsx index f461ffbe8891..11c848252325 100644 --- a/web/src/app/admin/configuration/llm/LLMProviderUpdateForm.tsx +++ b/web/src/app/admin/configuration/llm/LLMProviderUpdateForm.tsx @@ -150,18 +150,21 @@ export function LLMProviderUpdateForm({ } } - const response = await fetch(LLM_PROVIDERS_ADMIN_URL, { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - provider: llmProviderDescriptor.name, - ...values, - fast_default_model_name: - values.fast_default_model_name || values.default_model_name, - }), - }); + const response = await fetch( + `${LLM_PROVIDERS_ADMIN_URL}${existingLlmProvider ? "" : "?is_creation=true"}`, + { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + provider: llmProviderDescriptor.name, + ...values, + fast_default_model_name: + values.fast_default_model_name || values.default_model_name, + }), + } + ); if (!response.ok) { const errorMsg = (await response.json()).detail;