diff --git a/litellm/proxy/credential_endpoints/endpoints.py b/litellm/proxy/credential_endpoints/endpoints.py index 84b35e3c52..75d89502b5 100644 --- a/litellm/proxy/credential_endpoints/endpoints.py +++ b/litellm/proxy/credential_endpoints/endpoints.py @@ -164,7 +164,45 @@ async def delete_credential( return handle_exception_on_proxy(e) -@router.put( +def update_db_credential( + db_credential: CredentialItem, updated_patch: CredentialItem +) -> CredentialItem: + """ + Update a credential in the DB. + """ + merged_credential = CredentialItem( + credential_name=db_credential.credential_name, + credential_info=db_credential.credential_info, + credential_values=db_credential.credential_values, + ) + + encrypted_credential = CredentialHelperUtils.encrypt_credential_values( + updated_patch + ) + # update model name + if encrypted_credential.credential_name: + merged_credential.credential_name = encrypted_credential.credential_name + + # update litellm params + if encrypted_credential.credential_values: + # Encrypt any sensitive values + encrypted_params = { + k: v for k, v in encrypted_credential.credential_values.items() + } + + merged_credential.credential_values.update(encrypted_params) + + # update model info + if encrypted_credential.credential_info: + """Update credential info""" + if "credential_info" not in merged_credential.credential_info: + merged_credential.credential_info = {} + merged_credential.credential_info.update(encrypted_credential.credential_info) + + return merged_credential + + +@router.patch( "/credentials/{credential_name}", dependencies=[Depends(user_api_key_auth)], tags=["credential management"], @@ -187,7 +225,13 @@ async def update_credential( status_code=500, detail={"error": CommonProxyErrors.db_not_connected_error.value}, ) - credential_object_jsonified = jsonify_object(credential.model_dump()) + db_credential = await prisma_client.db.litellm_credentialstable.find_unique( + where={"credential_name": credential_name}, + ) + if db_credential is None: + raise HTTPException(status_code=404, detail="Credential not found in DB.") + merged_credential = update_db_credential(db_credential, credential) + credential_object_jsonified = jsonify_object(merged_credential.model_dump()) await prisma_client.db.litellm_credentialstable.update( where={"credential_name": credential_name}, data={ diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 19589400a0..2cd122aba8 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -2698,7 +2698,7 @@ export const credentialUpdateCall = async ( const url = proxyBaseUrl ? `${proxyBaseUrl}/credentials/${credentialName}` : `/credentials/${credentialName}`; const response = await fetch(url, { - method: "PUT", + method: "PATCH", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json",