mirror of
https://github.com/open-webui/open-webui.git
synced 2026-08-28 05:27:35 +00:00
refac
Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com>
This commit is contained in:
parent
92a1502126
commit
8be4c5fa6a
5 changed files with 46 additions and 25 deletions
|
|
@ -140,7 +140,7 @@ from open_webui.models.chats import ChatForm, Chats
|
||||||
from open_webui.models.config import Config
|
from open_webui.models.config import Config
|
||||||
from open_webui.models.functions import Functions
|
from open_webui.models.functions import Functions
|
||||||
from open_webui.models.messages import Messages
|
from open_webui.models.messages import Messages
|
||||||
from open_webui.models.models import Models
|
from open_webui.models.models import Models, normalize_model_tags
|
||||||
from open_webui.models.users import Users
|
from open_webui.models.users import Users
|
||||||
from open_webui.routers import (
|
from open_webui.routers import (
|
||||||
analytics,
|
analytics,
|
||||||
|
|
@ -890,19 +890,17 @@ async def get_models(request: Request, refresh: bool = False, user=Depends(get_v
|
||||||
models = await get_filtered_models(models, user)
|
models = await get_filtered_models(models, user)
|
||||||
|
|
||||||
for model in models:
|
for model in models:
|
||||||
|
info = model.get('info') if isinstance(model.get('info'), dict) else {}
|
||||||
|
meta = info.get('meta') if isinstance(info.get('meta'), dict) else {}
|
||||||
|
|
||||||
# Remove profile image URL to reduce payload size
|
# Remove profile image URL to reduce payload size
|
||||||
if model.get('info', {}).get('meta', {}).get('profile_image_url'):
|
meta.pop('profile_image_url', None)
|
||||||
model['info']['meta'].pop('profile_image_url', None)
|
|
||||||
|
|
||||||
try:
|
if 'tags' in meta:
|
||||||
model_tags = [tag.get('name') for tag in model.get('info', {}).get('meta', {}).get('tags', [])]
|
meta['tags'] = normalize_model_tags(meta['tags'])
|
||||||
tags = [tag.get('name') for tag in model.get('tags', [])]
|
|
||||||
|
|
||||||
tags = list(set(model_tags + tags))
|
tags = normalize_model_tags(meta.get('tags')) + normalize_model_tags(model.get('tags'))
|
||||||
model['tags'] = [{'name': tag} for tag in tags]
|
model['tags'] = list({tag['name']: tag for tag in tags}.values())
|
||||||
except Exception as e:
|
|
||||||
log.debug('Error processing model tags: %s', e)
|
|
||||||
model['tags'] = []
|
|
||||||
|
|
||||||
model_order_list = await Config.get('ui.model_order_list')
|
model_order_list = await Config.get('ui.model_order_list')
|
||||||
if model_order_list:
|
if model_order_list:
|
||||||
|
|
@ -1857,6 +1855,7 @@ async def chat_completion(
|
||||||
generate_chat_completions = chat_completion
|
generate_chat_completions = chat_completion
|
||||||
generate_chat_completion = chat_completion
|
generate_chat_completion = chat_completion
|
||||||
|
|
||||||
|
|
||||||
@app.post('/api/v1/chats/{id}/messages/{message_id}/resolve')
|
@app.post('/api/v1/chats/{id}/messages/{message_id}/resolve')
|
||||||
async def resolve_chat_message_tool_call(
|
async def resolve_chat_message_tool_call(
|
||||||
request: Request,
|
request: Request,
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ from __future__ import annotations
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from typing import Any, Optional
|
from typing import Any
|
||||||
|
|
||||||
from open_webui.internal.db import Base, JSONField, get_async_db_context
|
from open_webui.internal.db import Base, JSONField, get_async_db_context
|
||||||
from open_webui.models.access_grants import AccessGrantModel, AccessGrants
|
from open_webui.models.access_grants import AccessGrantModel, AccessGrants
|
||||||
|
|
@ -13,7 +13,6 @@ from open_webui.utils.misc import json_text_variants
|
||||||
from open_webui.utils.validate import validate_profile_image_url
|
from open_webui.utils.validate import validate_profile_image_url
|
||||||
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
||||||
from sqlalchemy import BigInteger, Boolean, Column, String, Text, cast, delete, func, or_, select, update
|
from sqlalchemy import BigInteger, Boolean, Column, String, Text, cast, delete, func, or_, select, update
|
||||||
from sqlalchemy.dialects.postgresql import JSONB
|
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
@ -23,6 +22,18 @@ log = logging.getLogger(__name__)
|
||||||
_warned_profile_urls: set[str] = set()
|
_warned_profile_urls: set[str] = set()
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_model_tags(tags: Any) -> list[dict[str, str]]:
|
||||||
|
if not isinstance(tags, list):
|
||||||
|
return []
|
||||||
|
|
||||||
|
normalized = []
|
||||||
|
for tag in tags:
|
||||||
|
name = tag.get('name') if isinstance(tag, dict) else tag
|
||||||
|
if isinstance(name, str) and name.strip():
|
||||||
|
normalized.append({'name': name.strip()})
|
||||||
|
return normalized
|
||||||
|
|
||||||
|
|
||||||
def strip_extracted_content_from_model_knowledge(knowledge: Any) -> Any:
|
def strip_extracted_content_from_model_knowledge(knowledge: Any) -> Any:
|
||||||
"""Drop duplicated extracted text from ModelMeta.knowledge."""
|
"""Drop duplicated extracted text from ModelMeta.knowledge."""
|
||||||
if not isinstance(knowledge, list):
|
if not isinstance(knowledge, list):
|
||||||
|
|
@ -99,15 +110,7 @@ class ModelMeta(BaseModel):
|
||||||
@classmethod
|
@classmethod
|
||||||
def normalize_tags(cls, data):
|
def normalize_tags(cls, data):
|
||||||
if isinstance(data, dict) and 'tags' in data:
|
if isinstance(data, dict) and 'tags' in data:
|
||||||
raw_tags = data['tags']
|
data['tags'] = normalize_model_tags(data['tags'])
|
||||||
if isinstance(raw_tags, list):
|
|
||||||
normalized = []
|
|
||||||
for tag in raw_tags:
|
|
||||||
if isinstance(tag, str):
|
|
||||||
normalized.append({'name': tag})
|
|
||||||
elif isinstance(tag, dict) and 'name' in tag:
|
|
||||||
normalized.append(tag)
|
|
||||||
data['tags'] = normalized
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||||
import { convertOpenApiToToolPayload } from '$lib/utils';
|
import { convertOpenApiToToolPayload } from '$lib/utils';
|
||||||
|
import { normalizeTags } from '$lib/utils/tags';
|
||||||
import { getOpenAIModelsDirect } from './openai';
|
import { getOpenAIModelsDirect } from './openai';
|
||||||
|
|
||||||
const TOOL_SERVER_FETCH_TIMEOUT = 10000;
|
const TOOL_SERVER_FETCH_TIMEOUT = 10000;
|
||||||
|
|
@ -141,8 +142,8 @@ export const getModels = async (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const tags = apiConfig.tags;
|
const tags = normalizeTags(apiConfig.tags);
|
||||||
if (tags) {
|
if (tags.length > 0) {
|
||||||
for (const model of models) {
|
for (const model of models) {
|
||||||
model.tags = tags;
|
model.tags = tags;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||||
import XMark from '$lib/components/icons/XMark.svelte';
|
import XMark from '$lib/components/icons/XMark.svelte';
|
||||||
import Textarea from './common/Textarea.svelte';
|
import Textarea from './common/Textarea.svelte';
|
||||||
|
import { normalizeTags } from '$lib/utils/tags';
|
||||||
|
|
||||||
export let onSubmit: Function = () => {};
|
export let onSubmit: Function = () => {};
|
||||||
export let onDelete: Function = () => {};
|
export let onDelete: Function = () => {};
|
||||||
|
|
@ -249,7 +250,7 @@
|
||||||
: '';
|
: '';
|
||||||
|
|
||||||
enable = connection.config?.enable ?? true;
|
enable = connection.config?.enable ?? true;
|
||||||
tags = connection.config?.tags ?? [];
|
tags = normalizeTags(connection.config?.tags);
|
||||||
prefixId = connection.config?.prefix_id ?? '';
|
prefixId = connection.config?.prefix_id ?? '';
|
||||||
passthroughParams = Array.isArray(connection.config?.passthrough_params)
|
passthroughParams = Array.isArray(connection.config?.passthrough_params)
|
||||||
? connection.config.passthrough_params.join(', ')
|
? connection.config.passthrough_params.join(', ')
|
||||||
|
|
|
||||||
17
src/lib/utils/tags.ts
Normal file
17
src/lib/utils/tags.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
export type Tag = { name: string };
|
||||||
|
|
||||||
|
const getTagName = (tag: unknown) => {
|
||||||
|
if (typeof tag === 'string') {
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof tag === 'object' && tag !== null && 'name' in tag) {
|
||||||
|
return (tag as { name?: unknown }).name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const normalizeTags = (tags: unknown): Tag[] =>
|
||||||
|
(Array.isArray(tags) ? tags : [])
|
||||||
|
.map(getTagName)
|
||||||
|
.filter((name): name is string => typeof name === 'string' && name.trim() !== '')
|
||||||
|
.map((name) => ({ name: name.trim() }));
|
||||||
Loading…
Add table
Reference in a new issue