mirror of
				https://github.com/open-webui/open-webui
				synced 2025-06-26 18:26:48 +00:00 
			
		
		
		
	remove List imports
This commit is contained in:
		
							parent
							
								
									038fc48ac0
								
							
						
					
					
						commit
						29f904db45
					
				@ -438,7 +438,7 @@ def transcribe(
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_available_models() -> List[dict]:
 | 
			
		||||
def get_available_models() -> list[dict]:
 | 
			
		||||
    if app.state.config.TTS_ENGINE == "openai":
 | 
			
		||||
        return [{"id": "tts-1"}, {"id": "tts-1-hd"}]
 | 
			
		||||
    elif app.state.config.TTS_ENGINE == "elevenlabs":
 | 
			
		||||
@ -466,7 +466,7 @@ async def get_models(user=Depends(get_verified_user)):
 | 
			
		||||
    return {"models": get_available_models()}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_available_voices() -> List[dict]:
 | 
			
		||||
def get_available_voices() -> list[dict]:
 | 
			
		||||
    if app.state.config.TTS_ENGINE == "openai":
 | 
			
		||||
        return [
 | 
			
		||||
            {"name": "alloy", "id": "alloy"},
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,7 @@ async def get_ollama_api_urls(user=Depends(get_admin_user)):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UrlUpdateForm(BaseModel):
 | 
			
		||||
    urls: List[str]
 | 
			
		||||
    urls: list[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.post("/urls/update")
 | 
			
		||||
@ -646,7 +646,7 @@ def generate_ollama_embeddings(
 | 
			
		||||
class GenerateCompletionForm(BaseModel):
 | 
			
		||||
    model: str
 | 
			
		||||
    prompt: str
 | 
			
		||||
    images: Optional[List[str]] = None
 | 
			
		||||
    images: Optional[list[str]] = None
 | 
			
		||||
    format: Optional[str] = None
 | 
			
		||||
    options: Optional[dict] = None
 | 
			
		||||
    system: Optional[str] = None
 | 
			
		||||
@ -689,12 +689,12 @@ async def generate_completion(
 | 
			
		||||
class ChatMessage(BaseModel):
 | 
			
		||||
    role: str
 | 
			
		||||
    content: str
 | 
			
		||||
    images: Optional[List[str]] = None
 | 
			
		||||
    images: Optional[list[str]] = None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GenerateChatCompletionForm(BaseModel):
 | 
			
		||||
    model: str
 | 
			
		||||
    messages: List[ChatMessage]
 | 
			
		||||
    messages: list[ChatMessage]
 | 
			
		||||
    format: Optional[str] = None
 | 
			
		||||
    options: Optional[dict] = None
 | 
			
		||||
    template: Optional[str] = None
 | 
			
		||||
@ -772,7 +772,7 @@ class OpenAIChatMessage(BaseModel):
 | 
			
		||||
 | 
			
		||||
class OpenAIChatCompletionForm(BaseModel):
 | 
			
		||||
    model: str
 | 
			
		||||
    messages: List[OpenAIChatMessage]
 | 
			
		||||
    messages: list[OpenAIChatMessage]
 | 
			
		||||
 | 
			
		||||
    model_config = ConfigDict(extra="allow")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ from config import (
 | 
			
		||||
    MODEL_FILTER_LIST,
 | 
			
		||||
    AppConfig,
 | 
			
		||||
)
 | 
			
		||||
from typing import List, Optional, Literal, overload
 | 
			
		||||
from typing import Optional, Literal, overload
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import hashlib
 | 
			
		||||
@ -89,11 +89,11 @@ async def update_config(form_data: OpenAIConfigForm, user=Depends(get_admin_user
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UrlsUpdateForm(BaseModel):
 | 
			
		||||
    urls: List[str]
 | 
			
		||||
    urls: list[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class KeysUpdateForm(BaseModel):
 | 
			
		||||
    keys: List[str]
 | 
			
		||||
    keys: list[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.get("/urls")
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ import os, shutil, logging, re
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from typing import List, Union, Sequence, Iterator, Any
 | 
			
		||||
from typing import Union, Sequence, Iterator, Any
 | 
			
		||||
 | 
			
		||||
from chromadb.utils.batch_utils import create_batches
 | 
			
		||||
from langchain_core.documents import Document
 | 
			
		||||
@ -439,7 +439,7 @@ class ChunkParamUpdateForm(BaseModel):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class YoutubeLoaderConfig(BaseModel):
 | 
			
		||||
    language: List[str]
 | 
			
		||||
    language: list[str]
 | 
			
		||||
    translation: Optional[str] = None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -642,7 +642,7 @@ def query_doc_handler(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class QueryCollectionsForm(BaseModel):
 | 
			
		||||
    collection_names: List[str]
 | 
			
		||||
    collection_names: list[str]
 | 
			
		||||
    query: str
 | 
			
		||||
    k: Optional[int] = None
 | 
			
		||||
    r: Optional[float] = None
 | 
			
		||||
@ -1021,7 +1021,7 @@ class TikaLoader:
 | 
			
		||||
        self.file_path = file_path
 | 
			
		||||
        self.mime_type = mime_type
 | 
			
		||||
 | 
			
		||||
    def load(self) -> List[Document]:
 | 
			
		||||
    def load(self) -> list[Document]:
 | 
			
		||||
        with open(self.file_path, "rb") as f:
 | 
			
		||||
            data = f.read()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import logging
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from apps.rag.search.main import SearchResult, get_filtered_results
 | 
			
		||||
@ -10,7 +10,7 @@ log.setLevel(SRC_LOG_LEVELS["RAG"])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def search_brave(
 | 
			
		||||
    api_key: str, query: str, count: int, filter_list: Optional[List[str]] = None
 | 
			
		||||
    api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """Search using Brave's Search API and return the results as a list of SearchResult objects.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import logging
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
from apps.rag.search.main import SearchResult, get_filtered_results
 | 
			
		||||
from duckduckgo_search import DDGS
 | 
			
		||||
from config import SRC_LOG_LEVELS
 | 
			
		||||
@ -9,7 +9,7 @@ log.setLevel(SRC_LOG_LEVELS["RAG"])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def search_duckduckgo(
 | 
			
		||||
    query: str, count: int, filter_list: Optional[List[str]] = None
 | 
			
		||||
    query: str, count: int, filter_list: Optional[list[str]] = None
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """
 | 
			
		||||
    Search using DuckDuckGo's Search API and return the results as a list of SearchResult objects.
 | 
			
		||||
@ -18,7 +18,7 @@ def search_duckduckgo(
 | 
			
		||||
        count (int): The number of results to return
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        List[SearchResult]: A list of search results
 | 
			
		||||
        list[SearchResult]: A list of search results
 | 
			
		||||
    """
 | 
			
		||||
    # Use the DDGS context manager to create a DDGS object
 | 
			
		||||
    with DDGS() as ddgs:
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
import json
 | 
			
		||||
import logging
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from apps.rag.search.main import SearchResult, get_filtered_results
 | 
			
		||||
@ -15,7 +15,7 @@ def search_google_pse(
 | 
			
		||||
    search_engine_id: str,
 | 
			
		||||
    query: str,
 | 
			
		||||
    count: int,
 | 
			
		||||
    filter_list: Optional[List[str]] = None,
 | 
			
		||||
    filter_list: Optional[list[str]] = None,
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """Search using Google's Programmable Search Engine API and return the results as a list of SearchResult objects.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ def search_jina(query: str, count: int) -> list[SearchResult]:
 | 
			
		||||
        count (int): The number of results to return
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        List[SearchResult]: A list of search results
 | 
			
		||||
        list[SearchResult]: A list of search results
 | 
			
		||||
    """
 | 
			
		||||
    jina_search_endpoint = "https://s.jina.ai/"
 | 
			
		||||
    headers = {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
import logging
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
 | 
			
		||||
from apps.rag.search.main import SearchResult, get_filtered_results
 | 
			
		||||
from config import SRC_LOG_LEVELS
 | 
			
		||||
@ -14,9 +14,9 @@ def search_searxng(
 | 
			
		||||
    query_url: str,
 | 
			
		||||
    query: str,
 | 
			
		||||
    count: int,
 | 
			
		||||
    filter_list: Optional[List[str]] = None,
 | 
			
		||||
    filter_list: Optional[list[str]] = None,
 | 
			
		||||
    **kwargs,
 | 
			
		||||
) -> List[SearchResult]:
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """
 | 
			
		||||
    Search a SearXNG instance for a given query and return the results as a list of SearchResult objects.
 | 
			
		||||
 | 
			
		||||
@ -31,10 +31,10 @@ def search_searxng(
 | 
			
		||||
        language (str): Language filter for the search results; e.g., "en-US". Defaults to an empty string.
 | 
			
		||||
        safesearch (int): Safe search filter for safer web results; 0 = off, 1 = moderate, 2 = strict. Defaults to 1 (moderate).
 | 
			
		||||
        time_range (str): Time range for filtering results by date; e.g., "2023-04-05..today" or "all-time". Defaults to ''.
 | 
			
		||||
        categories: (Optional[List[str]]): Specific categories within which the search should be performed, defaulting to an empty string if not provided.
 | 
			
		||||
        categories: (Optional[list[str]]): Specific categories within which the search should be performed, defaulting to an empty string if not provided.
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        List[SearchResult]: A list of SearchResults sorted by relevance score in descending order.
 | 
			
		||||
        list[SearchResult]: A list of SearchResults sorted by relevance score in descending order.
 | 
			
		||||
 | 
			
		||||
    Raise:
 | 
			
		||||
        requests.exceptions.RequestException: If a request error occurs during the search process.
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
import json
 | 
			
		||||
import logging
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from apps.rag.search.main import SearchResult, get_filtered_results
 | 
			
		||||
@ -11,7 +11,7 @@ log.setLevel(SRC_LOG_LEVELS["RAG"])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def search_serper(
 | 
			
		||||
    api_key: str, query: str, count: int, filter_list: Optional[List[str]] = None
 | 
			
		||||
    api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """Search using serper.dev's API and return the results as a list of SearchResult objects.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
import json
 | 
			
		||||
import logging
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import requests
 | 
			
		||||
from urllib.parse import urlencode
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ def search_serply(
 | 
			
		||||
    limit: int = 10,
 | 
			
		||||
    device_type: str = "desktop",
 | 
			
		||||
    proxy_location: str = "US",
 | 
			
		||||
    filter_list: Optional[List[str]] = None,
 | 
			
		||||
    filter_list: Optional[list[str]] = None,
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """Search using serper.dev's API and return the results as a list of SearchResult objects.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
import json
 | 
			
		||||
import logging
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from apps.rag.search.main import SearchResult, get_filtered_results
 | 
			
		||||
@ -14,7 +14,7 @@ def search_serpstack(
 | 
			
		||||
    api_key: str,
 | 
			
		||||
    query: str,
 | 
			
		||||
    count: int,
 | 
			
		||||
    filter_list: Optional[List[str]] = None,
 | 
			
		||||
    filter_list: Optional[list[str]] = None,
 | 
			
		||||
    https_enabled: bool = True,
 | 
			
		||||
) -> list[SearchResult]:
 | 
			
		||||
    """Search using serpstack.com's and return the results as a list of SearchResult objects.
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ def search_tavily(api_key: str, query: str, count: int) -> list[SearchResult]:
 | 
			
		||||
        query (str): The query to search for
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        List[SearchResult]: A list of search results
 | 
			
		||||
        list[SearchResult]: A list of search results
 | 
			
		||||
    """
 | 
			
		||||
    url = "https://api.tavily.com/search"
 | 
			
		||||
    data = {"query": query, "api_key": api_key}
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ import os
 | 
			
		||||
import logging
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from typing import List, Union
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
from apps.ollama.main import (
 | 
			
		||||
    generate_ollama_embeddings,
 | 
			
		||||
@ -142,7 +142,7 @@ def merge_and_sort_query_results(query_results, k, reverse=False):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def query_collection(
 | 
			
		||||
    collection_names: List[str],
 | 
			
		||||
    collection_names: list[str],
 | 
			
		||||
    query: str,
 | 
			
		||||
    embedding_function,
 | 
			
		||||
    k: int,
 | 
			
		||||
@ -163,7 +163,7 @@ def query_collection(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def query_collection_with_hybrid_search(
 | 
			
		||||
    collection_names: List[str],
 | 
			
		||||
    collection_names: list[str],
 | 
			
		||||
    query: str,
 | 
			
		||||
    embedding_function,
 | 
			
		||||
    k: int,
 | 
			
		||||
@ -411,7 +411,7 @@ class ChromaRetriever(BaseRetriever):
 | 
			
		||||
        query: str,
 | 
			
		||||
        *,
 | 
			
		||||
        run_manager: CallbackManagerForRetrieverRun,
 | 
			
		||||
    ) -> List[Document]:
 | 
			
		||||
    ) -> list[Document]:
 | 
			
		||||
        query_embeddings = self.embedding_function(query)
 | 
			
		||||
 | 
			
		||||
        results = self.collection.query(
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
import json
 | 
			
		||||
import uuid
 | 
			
		||||
@ -215,7 +215,7 @@ class ChatTable:
 | 
			
		||||
 | 
			
		||||
    def get_archived_chat_list_by_user_id(
 | 
			
		||||
        self, user_id: str, skip: int = 0, limit: int = 50
 | 
			
		||||
    ) -> List[ChatModel]:
 | 
			
		||||
    ) -> list[ChatModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            all_chats = (
 | 
			
		||||
@ -233,7 +233,7 @@ class ChatTable:
 | 
			
		||||
        include_archived: bool = False,
 | 
			
		||||
        skip: int = 0,
 | 
			
		||||
        limit: int = 50,
 | 
			
		||||
    ) -> List[ChatModel]:
 | 
			
		||||
    ) -> list[ChatModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            query = db.query(Chat).filter_by(user_id=user_id)
 | 
			
		||||
            if not include_archived:
 | 
			
		||||
@ -251,7 +251,7 @@ class ChatTable:
 | 
			
		||||
        include_archived: bool = False,
 | 
			
		||||
        skip: int = 0,
 | 
			
		||||
        limit: int = -1,
 | 
			
		||||
    ) -> List[ChatTitleIdResponse]:
 | 
			
		||||
    ) -> list[ChatTitleIdResponse]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            query = db.query(Chat).filter_by(user_id=user_id)
 | 
			
		||||
            if not include_archived:
 | 
			
		||||
@ -279,8 +279,8 @@ class ChatTable:
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
    def get_chat_list_by_chat_ids(
 | 
			
		||||
        self, chat_ids: List[str], skip: int = 0, limit: int = 50
 | 
			
		||||
    ) -> List[ChatModel]:
 | 
			
		||||
        self, chat_ids: list[str], skip: int = 0, limit: int = 50
 | 
			
		||||
    ) -> list[ChatModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            all_chats = (
 | 
			
		||||
                db.query(Chat)
 | 
			
		||||
@ -322,7 +322,7 @@ class ChatTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_chats(self, skip: int = 0, limit: int = 50) -> List[ChatModel]:
 | 
			
		||||
    def get_chats(self, skip: int = 0, limit: int = 50) -> list[ChatModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            all_chats = (
 | 
			
		||||
@ -332,7 +332,7 @@ class ChatTable:
 | 
			
		||||
            )
 | 
			
		||||
            return [ChatModel.model_validate(chat) for chat in all_chats]
 | 
			
		||||
 | 
			
		||||
    def get_chats_by_user_id(self, user_id: str) -> List[ChatModel]:
 | 
			
		||||
    def get_chats_by_user_id(self, user_id: str) -> list[ChatModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            all_chats = (
 | 
			
		||||
@ -342,7 +342,7 @@ class ChatTable:
 | 
			
		||||
            )
 | 
			
		||||
            return [ChatModel.model_validate(chat) for chat in all_chats]
 | 
			
		||||
 | 
			
		||||
    def get_archived_chats_by_user_id(self, user_id: str) -> List[ChatModel]:
 | 
			
		||||
    def get_archived_chats_by_user_id(self, user_id: str) -> list[ChatModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            all_chats = (
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import time
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,7 @@ class DocumentsTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_docs(self) -> List[DocumentModel]:
 | 
			
		||||
    def get_docs(self) -> list[DocumentModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            return [
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
import time
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
@ -93,7 +93,7 @@ class FilesTable:
 | 
			
		||||
            except Exception:
 | 
			
		||||
                return None
 | 
			
		||||
 | 
			
		||||
    def get_files(self) -> List[FileModel]:
 | 
			
		||||
    def get_files(self) -> list[FileModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            return [FileModel.model_validate(file) for file in db.query(File).all()]
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
import time
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
@ -125,7 +125,7 @@ class FunctionsTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_functions(self, active_only=False) -> List[FunctionModel]:
 | 
			
		||||
    def get_functions(self, active_only=False) -> list[FunctionModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            if active_only:
 | 
			
		||||
@ -141,7 +141,7 @@ class FunctionsTable:
 | 
			
		||||
 | 
			
		||||
    def get_functions_by_type(
 | 
			
		||||
        self, type: str, active_only=False
 | 
			
		||||
    ) -> List[FunctionModel]:
 | 
			
		||||
    ) -> list[FunctionModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            if active_only:
 | 
			
		||||
@ -157,7 +157,7 @@ class FunctionsTable:
 | 
			
		||||
                    for function in db.query(Function).filter_by(type=type).all()
 | 
			
		||||
                ]
 | 
			
		||||
 | 
			
		||||
    def get_global_filter_functions(self) -> List[FunctionModel]:
 | 
			
		||||
    def get_global_filter_functions(self) -> list[FunctionModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            return [
 | 
			
		||||
@ -167,7 +167,7 @@ class FunctionsTable:
 | 
			
		||||
                .all()
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
    def get_global_action_functions(self) -> List[FunctionModel]:
 | 
			
		||||
    def get_global_action_functions(self) -> list[FunctionModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            return [
 | 
			
		||||
                FunctionModel.model_validate(function)
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from sqlalchemy import Column, String, BigInteger, Text
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,7 @@ class MemoriesTable:
 | 
			
		||||
            except Exception:
 | 
			
		||||
                return None
 | 
			
		||||
 | 
			
		||||
    def get_memories(self) -> List[MemoryModel]:
 | 
			
		||||
    def get_memories(self) -> list[MemoryModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            try:
 | 
			
		||||
@ -92,7 +92,7 @@ class MemoriesTable:
 | 
			
		||||
            except Exception:
 | 
			
		||||
                return None
 | 
			
		||||
 | 
			
		||||
    def get_memories_by_user_id(self, user_id: str) -> List[MemoryModel]:
 | 
			
		||||
    def get_memories_by_user_id(self, user_id: str) -> list[MemoryModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            try:
 | 
			
		||||
 | 
			
		||||
@ -137,7 +137,7 @@ class ModelsTable:
 | 
			
		||||
            print(e)
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_all_models(self) -> List[ModelModel]:
 | 
			
		||||
    def get_all_models(self) -> list[ModelModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            return [ModelModel.model_validate(model) for model in db.query(Model).all()]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
from sqlalchemy import String, Column, BigInteger, Text
 | 
			
		||||
@ -82,7 +82,7 @@ class PromptsTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_prompts(self) -> List[PromptModel]:
 | 
			
		||||
    def get_prompts(self) -> list[PromptModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            return [
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
 | 
			
		||||
import json
 | 
			
		||||
import uuid
 | 
			
		||||
@ -69,11 +69,11 @@ class ChatIdTagForm(BaseModel):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TagChatIdsResponse(BaseModel):
 | 
			
		||||
    chat_ids: List[str]
 | 
			
		||||
    chat_ids: list[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ChatTagsResponse(BaseModel):
 | 
			
		||||
    tags: List[str]
 | 
			
		||||
    tags: list[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TagTable:
 | 
			
		||||
@ -135,7 +135,7 @@ class TagTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_tags_by_user_id(self, user_id: str) -> List[TagModel]:
 | 
			
		||||
    def get_tags_by_user_id(self, user_id: str) -> list[TagModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            tag_names = [
 | 
			
		||||
                chat_id_tag.tag_name
 | 
			
		||||
@ -159,7 +159,7 @@ class TagTable:
 | 
			
		||||
 | 
			
		||||
    def get_tags_by_chat_id_and_user_id(
 | 
			
		||||
        self, chat_id: str, user_id: str
 | 
			
		||||
    ) -> List[TagModel]:
 | 
			
		||||
    ) -> list[TagModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            tag_names = [
 | 
			
		||||
@ -184,7 +184,7 @@ class TagTable:
 | 
			
		||||
 | 
			
		||||
    def get_chat_ids_by_tag_name_and_user_id(
 | 
			
		||||
        self, tag_name: str, user_id: str
 | 
			
		||||
    ) -> List[ChatIdTagModel]:
 | 
			
		||||
    ) -> list[ChatIdTagModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
 | 
			
		||||
            return [
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
import time
 | 
			
		||||
import logging
 | 
			
		||||
from sqlalchemy import String, Column, BigInteger, Text
 | 
			
		||||
@ -45,7 +45,7 @@ class ToolModel(BaseModel):
 | 
			
		||||
    user_id: str
 | 
			
		||||
    name: str
 | 
			
		||||
    content: str
 | 
			
		||||
    specs: List[dict]
 | 
			
		||||
    specs: list[dict]
 | 
			
		||||
    meta: ToolMeta
 | 
			
		||||
    updated_at: int  # timestamp in epoch
 | 
			
		||||
    created_at: int  # timestamp in epoch
 | 
			
		||||
@ -81,7 +81,7 @@ class ToolValves(BaseModel):
 | 
			
		||||
class ToolsTable:
 | 
			
		||||
 | 
			
		||||
    def insert_new_tool(
 | 
			
		||||
        self, user_id: str, form_data: ToolForm, specs: List[dict]
 | 
			
		||||
        self, user_id: str, form_data: ToolForm, specs: list[dict]
 | 
			
		||||
    ) -> Optional[ToolModel]:
 | 
			
		||||
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
@ -118,7 +118,7 @@ class ToolsTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_tools(self) -> List[ToolModel]:
 | 
			
		||||
    def get_tools(self) -> list[ToolModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            return [ToolModel.model_validate(tool) for tool in db.query(Tool).all()]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from pydantic import BaseModel, ConfigDict, parse_obj_as
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
from sqlalchemy import String, Column, BigInteger, Text
 | 
			
		||||
@ -146,7 +146,7 @@ class UsersTable:
 | 
			
		||||
        except Exception:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def get_users(self, skip: int = 0, limit: int = 50) -> List[UserModel]:
 | 
			
		||||
    def get_users(self, skip: int = 0, limit: int = 50) -> list[UserModel]:
 | 
			
		||||
        with get_db() as db:
 | 
			
		||||
            users = (
 | 
			
		||||
                db.query(User)
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
from fastapi import Depends, Request, HTTPException, status
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
from utils.utils import get_verified_user, get_admin_user
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -40,8 +40,8 @@ router = APIRouter()
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[ChatTitleIdResponse])
 | 
			
		||||
@router.get("/list", response_model=List[ChatTitleIdResponse])
 | 
			
		||||
@router.get("/", response_model=list[ChatTitleIdResponse])
 | 
			
		||||
@router.get("/list", response_model=list[ChatTitleIdResponse])
 | 
			
		||||
async def get_session_user_chat_list(
 | 
			
		||||
    user=Depends(get_verified_user), page: Optional[int] = None
 | 
			
		||||
):
 | 
			
		||||
@ -80,7 +80,7 @@ async def delete_all_user_chats(request: Request, user=Depends(get_verified_user
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/list/user/{user_id}", response_model=List[ChatTitleIdResponse])
 | 
			
		||||
@router.get("/list/user/{user_id}", response_model=list[ChatTitleIdResponse])
 | 
			
		||||
async def get_user_chat_list_by_user_id(
 | 
			
		||||
    user_id: str,
 | 
			
		||||
    user=Depends(get_admin_user),
 | 
			
		||||
@ -119,7 +119,7 @@ async def create_new_chat(form_data: ChatForm, user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/all", response_model=List[ChatResponse])
 | 
			
		||||
@router.get("/all", response_model=list[ChatResponse])
 | 
			
		||||
async def get_user_chats(user=Depends(get_verified_user)):
 | 
			
		||||
    return [
 | 
			
		||||
        ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
 | 
			
		||||
@ -132,7 +132,7 @@ async def get_user_chats(user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/all/archived", response_model=List[ChatResponse])
 | 
			
		||||
@router.get("/all/archived", response_model=list[ChatResponse])
 | 
			
		||||
async def get_user_archived_chats(user=Depends(get_verified_user)):
 | 
			
		||||
    return [
 | 
			
		||||
        ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
 | 
			
		||||
@ -145,7 +145,7 @@ async def get_user_archived_chats(user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/all/db", response_model=List[ChatResponse])
 | 
			
		||||
@router.get("/all/db", response_model=list[ChatResponse])
 | 
			
		||||
async def get_all_user_chats_in_db(user=Depends(get_admin_user)):
 | 
			
		||||
    if not ENABLE_ADMIN_EXPORT:
 | 
			
		||||
        raise HTTPException(
 | 
			
		||||
@ -163,7 +163,7 @@ async def get_all_user_chats_in_db(user=Depends(get_admin_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/archived", response_model=List[ChatTitleIdResponse])
 | 
			
		||||
@router.get("/archived", response_model=list[ChatTitleIdResponse])
 | 
			
		||||
async def get_archived_session_user_chat_list(
 | 
			
		||||
    user=Depends(get_verified_user), skip: int = 0, limit: int = 50
 | 
			
		||||
):
 | 
			
		||||
@ -216,7 +216,7 @@ class TagNameForm(BaseModel):
 | 
			
		||||
    limit: Optional[int] = 50
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.post("/tags", response_model=List[ChatTitleIdResponse])
 | 
			
		||||
@router.post("/tags", response_model=list[ChatTitleIdResponse])
 | 
			
		||||
async def get_user_chat_list_by_tag_name(
 | 
			
		||||
    form_data: TagNameForm, user=Depends(get_verified_user)
 | 
			
		||||
):
 | 
			
		||||
@ -241,7 +241,7 @@ async def get_user_chat_list_by_tag_name(
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/tags/all", response_model=List[TagModel])
 | 
			
		||||
@router.get("/tags/all", response_model=list[TagModel])
 | 
			
		||||
async def get_all_tags(user=Depends(get_verified_user)):
 | 
			
		||||
    try:
 | 
			
		||||
        tags = Tags.get_tags_by_user_id(user.id)
 | 
			
		||||
@ -417,7 +417,7 @@ async def delete_shared_chat_by_id(id: str, user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/{id}/tags", response_model=List[TagModel])
 | 
			
		||||
@router.get("/{id}/tags", response_model=list[TagModel])
 | 
			
		||||
async def get_chat_tags_by_id(id: str, user=Depends(get_verified_user)):
 | 
			
		||||
    tags = Tags.get_tags_by_chat_id_and_user_id(id, user.id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
from fastapi import Response, Request
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -29,12 +29,12 @@ class SetDefaultModelsForm(BaseModel):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PromptSuggestion(BaseModel):
 | 
			
		||||
    title: List[str]
 | 
			
		||||
    title: list[str]
 | 
			
		||||
    content: str
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SetDefaultSuggestionsForm(BaseModel):
 | 
			
		||||
    suggestions: List[PromptSuggestion]
 | 
			
		||||
    suggestions: list[PromptSuggestion]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
############################
 | 
			
		||||
@ -50,7 +50,7 @@ async def set_global_default_models(
 | 
			
		||||
    return request.app.state.config.DEFAULT_MODELS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.post("/default/suggestions", response_model=List[PromptSuggestion])
 | 
			
		||||
@router.post("/default/suggestions", response_model=list[PromptSuggestion])
 | 
			
		||||
async def set_global_default_suggestions(
 | 
			
		||||
    request: Request,
 | 
			
		||||
    form_data: SetDefaultSuggestionsForm,
 | 
			
		||||
@ -67,10 +67,10 @@ async def set_global_default_suggestions(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SetBannersForm(BaseModel):
 | 
			
		||||
    banners: List[BannerModel]
 | 
			
		||||
    banners: list[BannerModel]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.post("/banners", response_model=List[BannerModel])
 | 
			
		||||
@router.post("/banners", response_model=list[BannerModel])
 | 
			
		||||
async def set_banners(
 | 
			
		||||
    request: Request,
 | 
			
		||||
    form_data: SetBannersForm,
 | 
			
		||||
@ -81,7 +81,7 @@ async def set_banners(
 | 
			
		||||
    return request.app.state.config.BANNERS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/banners", response_model=List[BannerModel])
 | 
			
		||||
@router.get("/banners", response_model=list[BannerModel])
 | 
			
		||||
async def get_banners(
 | 
			
		||||
    request: Request,
 | 
			
		||||
    user=Depends(get_verified_user),
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -24,7 +24,7 @@ router = APIRouter()
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[DocumentResponse])
 | 
			
		||||
@router.get("/", response_model=list[DocumentResponse])
 | 
			
		||||
async def get_documents(user=Depends(get_verified_user)):
 | 
			
		||||
    docs = [
 | 
			
		||||
        DocumentResponse(
 | 
			
		||||
@ -102,7 +102,7 @@ class TagItem(BaseModel):
 | 
			
		||||
 | 
			
		||||
class TagDocumentForm(BaseModel):
 | 
			
		||||
    name: str
 | 
			
		||||
    tags: List[dict]
 | 
			
		||||
    tags: list[dict]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.post("/doc/tags", response_model=Optional[DocumentResponse])
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ from fastapi import (
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
@ -104,7 +104,7 @@ def upload_file(file: UploadFile = File(...), user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[FileModel])
 | 
			
		||||
@router.get("/", response_model=list[FileModel])
 | 
			
		||||
async def list_files(user=Depends(get_verified_user)):
 | 
			
		||||
    files = Files.get_files()
 | 
			
		||||
    return files
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status, Request
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -30,7 +30,7 @@ router = APIRouter()
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[FunctionResponse])
 | 
			
		||||
@router.get("/", response_model=list[FunctionResponse])
 | 
			
		||||
async def get_functions(user=Depends(get_verified_user)):
 | 
			
		||||
    return Functions.get_functions()
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ async def get_functions(user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/export", response_model=List[FunctionModel])
 | 
			
		||||
@router.get("/export", response_model=list[FunctionModel])
 | 
			
		||||
async def get_functions(user=Depends(get_admin_user)):
 | 
			
		||||
    return Functions.get_functions()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
from fastapi import Response, Request
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -30,7 +30,7 @@ async def get_embeddings(request: Request):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[MemoryModel])
 | 
			
		||||
@router.get("/", response_model=list[MemoryModel])
 | 
			
		||||
async def get_memories(user=Depends(get_verified_user)):
 | 
			
		||||
    return Memories.get_memories_by_user_id(user.id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status, Request
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -18,7 +18,7 @@ router = APIRouter()
 | 
			
		||||
###########################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[ModelResponse])
 | 
			
		||||
@router.get("/", response_model=list[ModelResponse])
 | 
			
		||||
async def get_models(user=Depends(get_verified_user)):
 | 
			
		||||
    return Models.get_all_models()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -18,7 +18,7 @@ router = APIRouter()
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[PromptModel])
 | 
			
		||||
@router.get("/", response_model=list[PromptModel])
 | 
			
		||||
async def get_prompts(user=Depends(get_verified_user)):
 | 
			
		||||
    return Prompts.get_prompts()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
from fastapi import Depends, HTTPException, status, Request
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ router = APIRouter()
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[ToolResponse])
 | 
			
		||||
@router.get("/", response_model=list[ToolResponse])
 | 
			
		||||
async def get_toolkits(user=Depends(get_verified_user)):
 | 
			
		||||
    toolkits = [toolkit for toolkit in Tools.get_tools()]
 | 
			
		||||
    return toolkits
 | 
			
		||||
@ -38,7 +38,7 @@ async def get_toolkits(user=Depends(get_verified_user)):
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/export", response_model=List[ToolModel])
 | 
			
		||||
@router.get("/export", response_model=list[ToolModel])
 | 
			
		||||
async def get_toolkits(user=Depends(get_admin_user)):
 | 
			
		||||
    toolkits = [toolkit for toolkit in Tools.get_tools()]
 | 
			
		||||
    return toolkits
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
from fastapi import Response, Request
 | 
			
		||||
from fastapi import Depends, FastAPI, HTTPException, status
 | 
			
		||||
from datetime import datetime, timedelta
 | 
			
		||||
from typing import List, Union, Optional
 | 
			
		||||
from typing import Union, Optional
 | 
			
		||||
 | 
			
		||||
from fastapi import APIRouter
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
@ -39,7 +39,7 @@ router = APIRouter()
 | 
			
		||||
############################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.get("/", response_model=List[UserModel])
 | 
			
		||||
@router.get("/", response_model=list[UserModel])
 | 
			
		||||
async def get_users(skip: int = 0, limit: int = 50, user=Depends(get_admin_user)):
 | 
			
		||||
    return Users.get_users(skip, limit)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,7 @@ async def get_html_from_markdown(
 | 
			
		||||
 | 
			
		||||
class ChatForm(BaseModel):
 | 
			
		||||
    title: str
 | 
			
		||||
    messages: List[dict]
 | 
			
		||||
    messages: list[dict]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@router.post("/pdf")
 | 
			
		||||
 | 
			
		||||
@ -51,7 +51,7 @@ from apps.webui.internal.db import Session
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from pydantic import BaseModel
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
from typing import Optional
 | 
			
		||||
 | 
			
		||||
from apps.webui.models.auths import Auths
 | 
			
		||||
from apps.webui.models.models import Models
 | 
			
		||||
@ -2027,7 +2027,7 @@ async def get_model_filter_config(user=Depends(get_admin_user)):
 | 
			
		||||
 | 
			
		||||
class ModelFilterConfigForm(BaseModel):
 | 
			
		||||
    enabled: bool
 | 
			
		||||
    models: List[str]
 | 
			
		||||
    models: list[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.post("/api/config/model/filter")
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@ import time
 | 
			
		||||
from utils.task import prompt_template
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_last_user_message_item(messages: List[dict]) -> Optional[dict]:
 | 
			
		||||
def get_last_user_message_item(messages: list[dict]) -> Optional[dict]:
 | 
			
		||||
    for message in reversed(messages):
 | 
			
		||||
        if message["role"] == "user":
 | 
			
		||||
            return message
 | 
			
		||||
@ -26,7 +26,7 @@ def get_content_from_message(message: dict) -> Optional[str]:
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_last_user_message(messages: List[dict]) -> Optional[str]:
 | 
			
		||||
def get_last_user_message(messages: list[dict]) -> Optional[str]:
 | 
			
		||||
    message = get_last_user_message_item(messages)
 | 
			
		||||
    if message is None:
 | 
			
		||||
        return None
 | 
			
		||||
@ -34,31 +34,31 @@ def get_last_user_message(messages: List[dict]) -> Optional[str]:
 | 
			
		||||
    return get_content_from_message(message)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_last_assistant_message(messages: List[dict]) -> Optional[str]:
 | 
			
		||||
def get_last_assistant_message(messages: list[dict]) -> Optional[str]:
 | 
			
		||||
    for message in reversed(messages):
 | 
			
		||||
        if message["role"] == "assistant":
 | 
			
		||||
            return get_content_from_message(message)
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_system_message(messages: List[dict]) -> Optional[dict]:
 | 
			
		||||
def get_system_message(messages: list[dict]) -> Optional[dict]:
 | 
			
		||||
    for message in messages:
 | 
			
		||||
        if message["role"] == "system":
 | 
			
		||||
            return message
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def remove_system_message(messages: List[dict]) -> List[dict]:
 | 
			
		||||
def remove_system_message(messages: list[dict]) -> list[dict]:
 | 
			
		||||
    return [message for message in messages if message["role"] != "system"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pop_system_message(messages: List[dict]) -> Tuple[Optional[dict], List[dict]]:
 | 
			
		||||
def pop_system_message(messages: list[dict]) -> Tuple[Optional[dict], list[dict]]:
 | 
			
		||||
    return get_system_message(messages), remove_system_message(messages)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def prepend_to_first_user_message_content(
 | 
			
		||||
    content: str, messages: List[dict]
 | 
			
		||||
) -> List[dict]:
 | 
			
		||||
    content: str, messages: list[dict]
 | 
			
		||||
) -> list[dict]:
 | 
			
		||||
    for message in messages:
 | 
			
		||||
        if message["role"] == "user":
 | 
			
		||||
            if isinstance(message["content"], list):
 | 
			
		||||
@ -71,7 +71,7 @@ def prepend_to_first_user_message_content(
 | 
			
		||||
    return messages
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def add_or_update_system_message(content: str, messages: List[dict]):
 | 
			
		||||
def add_or_update_system_message(content: str, messages: list[dict]):
 | 
			
		||||
    """
 | 
			
		||||
    Adds a new system message at the beginning of the messages list
 | 
			
		||||
    or updates the existing system message at the beginning.
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ def doc_to_dict(docstring):
 | 
			
		||||
    return ret_dict
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_tools_specs(tools) -> List[dict]:
 | 
			
		||||
def get_tools_specs(tools) -> list[dict]:
 | 
			
		||||
    function_list = [
 | 
			
		||||
        {"name": func, "function": getattr(tools, func)}
 | 
			
		||||
        for func in dir(tools)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user