Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
chenpangpang
open-webui
Commits
e627b8bf
Commit
e627b8bf
authored
Apr 21, 2024
by
Timothy J. Baek
Browse files
feat: litellm model add/delete
parent
31124d9d
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
6 deletions
+56
-6
backend/apps/litellm/main.py
backend/apps/litellm/main.py
+50
-0
src/lib/components/chat/Settings/Models.svelte
src/lib/components/chat/Settings/Models.svelte
+6
-6
No files found.
backend/apps/litellm/main.py
View file @
e627b8bf
...
@@ -102,6 +102,7 @@ async def shutdown_litellm_background():
...
@@ -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
...
@@ -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)):
...
@@ -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
()
...
...
src/lib/components/chat/Settings/Models.svelte
View file @
e627b8bf
...
@@ -35,7 +35,7 @@
...
@@ -35,7 +35,7 @@
let liteLLMRPM = '';
let liteLLMRPM = '';
let liteLLMMaxTokens = '';
let liteLLMMaxTokens = '';
let deleteLiteLLMModel
Id
= '';
let deleteLiteLLMModel
Name
= '';
$: liteLLMModelName = liteLLMModel;
$: liteLLMModelName = liteLLMModel;
...
@@ -472,7 +472,7 @@
...
@@ -472,7 +472,7 @@
};
};
const deleteLiteLLMModelHandler = async () => {
const deleteLiteLLMModelHandler = async () => {
const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModel
Id
).catch(
const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModel
Name
).catch(
(error) => {
(error) => {
toast.error(error);
toast.error(error);
return null;
return null;
...
@@ -485,7 +485,7 @@
...
@@ -485,7 +485,7 @@
}
}
}
}
deleteLiteLLMModel
Id
= '';
deleteLiteLLMModel
Name
= '';
liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
models.set(await getModels());
models.set(await getModels());
};
};
...
@@ -1099,14 +1099,14 @@
...
@@ -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={deleteLiteLLMModel
Id
}
bind:value={deleteLiteLLMModel
Name
}
placeholder={$i18n.t('Select a model')}
placeholder={$i18n.t('Select a model')}
>
>
{#if !deleteLiteLLMModel
Id
}
{#if !deleteLiteLLMModel
Name
}
<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}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment