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() | ||||
|         await background_process.wait()  # Ensure the process has terminated | ||||
|         log.info("Subprocess terminated") | ||||
|         background_process = None | ||||
| 
 | ||||
| 
 | ||||
| @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("/v1/models") | ||||
| async def get_models(user=Depends(get_current_user)): | ||||
|     while not background_process: | ||||
|         await asyncio.sleep(0.1) | ||||
| 
 | ||||
|     url = "http://localhost:14365/v1" | ||||
|     r = None | ||||
|     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"]) | ||||
| async def proxy(path: str, request: Request, user=Depends(get_verified_user)): | ||||
|     body = await request.body() | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ | |||
| 	let liteLLMRPM = ''; | ||||
| 	let liteLLMMaxTokens = ''; | ||||
| 
 | ||||
| 	let deleteLiteLLMModelId = ''; | ||||
| 	let deleteLiteLLMModelName = ''; | ||||
| 
 | ||||
| 	$: liteLLMModelName = liteLLMModel; | ||||
| 
 | ||||
|  | @ -472,7 +472,7 @@ | |||
| 	}; | ||||
| 
 | ||||
| 	const deleteLiteLLMModelHandler = async () => { | ||||
| 		const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModelId).catch( | ||||
| 		const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModelName).catch( | ||||
| 			(error) => { | ||||
| 				toast.error(error); | ||||
| 				return null; | ||||
|  | @ -485,7 +485,7 @@ | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		deleteLiteLLMModelId = ''; | ||||
| 		deleteLiteLLMModelName = ''; | ||||
| 		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token); | ||||
| 		models.set(await getModels()); | ||||
| 	}; | ||||
|  | @ -1099,14 +1099,14 @@ | |||
| 								<div class="flex-1 mr-2"> | ||||
| 									<select | ||||
| 										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')} | ||||
| 									> | ||||
| 										{#if !deleteLiteLLMModelId} | ||||
| 										{#if !deleteLiteLLMModelName} | ||||
| 											<option value="" disabled selected>{$i18n.t('Select a model')}</option> | ||||
| 										{/if} | ||||
| 										{#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 | ||||
| 											> | ||||
| 										{/each} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek