forked from open-webui/open-webui
		
	feat: litellm model add/delete
This commit is contained in:
		
							parent
							
								
									31124d9deb
								
							
						
					
					
						commit
						e627b8bf21
					
				
					 2 changed files with 56 additions and 6 deletions
				
			
		|  | @ -102,6 +102,7 @@ async def shutdown_litellm_background(): | ||||||
|         background_process.terminate() |         background_process.terminate() | ||||||
|         await background_process.wait()  # Ensure the process has terminated |         await background_process.wait()  # Ensure the process has terminated | ||||||
|         log.info("Subprocess terminated") |         log.info("Subprocess terminated") | ||||||
|  |         background_process = None | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @app.on_event("startup") | @app.on_event("startup") | ||||||
|  | @ -178,6 +179,9 @@ async def update_config(form_data: LiteLLMConfigForm, user=Depends(get_admin_use | ||||||
| @app.get("/models") | @app.get("/models") | ||||||
| @app.get("/v1/models") | @app.get("/v1/models") | ||||||
| async def get_models(user=Depends(get_current_user)): | async def get_models(user=Depends(get_current_user)): | ||||||
|  |     while not background_process: | ||||||
|  |         await asyncio.sleep(0.1) | ||||||
|  | 
 | ||||||
|     url = "http://localhost:14365/v1" |     url = "http://localhost:14365/v1" | ||||||
|     r = None |     r = None | ||||||
|     try: |     try: | ||||||
|  | @ -213,6 +217,52 @@ async def get_models(user=Depends(get_current_user)): | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @app.get("/model/info") | ||||||
|  | async def get_model_list(user=Depends(get_admin_user)): | ||||||
|  |     return {"data": app.state.CONFIG["model_list"]} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AddLiteLLMModelForm(BaseModel): | ||||||
|  |     model_name: str | ||||||
|  |     litellm_params: dict | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @app.post("/model/new") | ||||||
|  | async def add_model_to_config( | ||||||
|  |     form_data: AddLiteLLMModelForm, user=Depends(get_admin_user) | ||||||
|  | ): | ||||||
|  |     app.state.CONFIG["model_list"].append(form_data.model_dump()) | ||||||
|  | 
 | ||||||
|  |     with open(LITELLM_CONFIG_DIR, "w") as file: | ||||||
|  |         yaml.dump(app.state.CONFIG, file) | ||||||
|  | 
 | ||||||
|  |     await restart_litellm() | ||||||
|  | 
 | ||||||
|  |     return {"message": "model added"} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class DeleteLiteLLMModelForm(BaseModel): | ||||||
|  |     id: str | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @app.post("/model/delete") | ||||||
|  | async def delete_model_from_config( | ||||||
|  |     form_data: DeleteLiteLLMModelForm, user=Depends(get_admin_user) | ||||||
|  | ): | ||||||
|  |     app.state.CONFIG["model_list"] = [ | ||||||
|  |         model | ||||||
|  |         for model in app.state.CONFIG["model_list"] | ||||||
|  |         if model["model_name"] != form_data.id | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     with open(LITELLM_CONFIG_DIR, "w") as file: | ||||||
|  |         yaml.dump(app.state.CONFIG, file) | ||||||
|  | 
 | ||||||
|  |     await restart_litellm() | ||||||
|  | 
 | ||||||
|  |     return {"message": "model deleted"} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) | @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) | ||||||
| async def proxy(path: str, request: Request, user=Depends(get_verified_user)): | async def proxy(path: str, request: Request, user=Depends(get_verified_user)): | ||||||
|     body = await request.body() |     body = await request.body() | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ | ||||||
| 	let liteLLMRPM = ''; | 	let liteLLMRPM = ''; | ||||||
| 	let liteLLMMaxTokens = ''; | 	let liteLLMMaxTokens = ''; | ||||||
| 
 | 
 | ||||||
| 	let deleteLiteLLMModelId = ''; | 	let deleteLiteLLMModelName = ''; | ||||||
| 
 | 
 | ||||||
| 	$: liteLLMModelName = liteLLMModel; | 	$: liteLLMModelName = liteLLMModel; | ||||||
| 
 | 
 | ||||||
|  | @ -472,7 +472,7 @@ | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	const deleteLiteLLMModelHandler = async () => { | 	const deleteLiteLLMModelHandler = async () => { | ||||||
| 		const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModelId).catch( | 		const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModelName).catch( | ||||||
| 			(error) => { | 			(error) => { | ||||||
| 				toast.error(error); | 				toast.error(error); | ||||||
| 				return null; | 				return null; | ||||||
|  | @ -485,7 +485,7 @@ | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		deleteLiteLLMModelId = ''; | 		deleteLiteLLMModelName = ''; | ||||||
| 		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token); | 		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token); | ||||||
| 		models.set(await getModels()); | 		models.set(await getModels()); | ||||||
| 	}; | 	}; | ||||||
|  | @ -1099,14 +1099,14 @@ | ||||||
| 								<div class="flex-1 mr-2"> | 								<div class="flex-1 mr-2"> | ||||||
| 									<select | 									<select | ||||||
| 										class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" | 										class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" | ||||||
| 										bind:value={deleteLiteLLMModelId} | 										bind:value={deleteLiteLLMModelName} | ||||||
| 										placeholder={$i18n.t('Select a model')} | 										placeholder={$i18n.t('Select a model')} | ||||||
| 									> | 									> | ||||||
| 										{#if !deleteLiteLLMModelId} | 										{#if !deleteLiteLLMModelName} | ||||||
| 											<option value="" disabled selected>{$i18n.t('Select a model')}</option> | 											<option value="" disabled selected>{$i18n.t('Select a model')}</option> | ||||||
| 										{/if} | 										{/if} | ||||||
| 										{#each liteLLMModelInfo as model} | 										{#each liteLLMModelInfo as model} | ||||||
| 											<option value={model.model_info.id} class="bg-gray-100 dark:bg-gray-700" | 											<option value={model.model_name} class="bg-gray-100 dark:bg-gray-700" | ||||||
| 												>{model.model_name}</option | 												>{model.model_name}</option | ||||||
| 											> | 											> | ||||||
| 										{/each} | 										{/each} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek