diff --git a/backend/apps/audio/main.py b/backend/apps/audio/main.py index 799d22543..37846d75e 100644 --- a/backend/apps/audio/main.py +++ b/backend/apps/audio/main.py @@ -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"}, diff --git a/backend/apps/ollama/main.py b/backend/apps/ollama/main.py index f479ad35c..25a98686c 100644 --- a/backend/apps/ollama/main.py +++ b/backend/apps/ollama/main.py @@ -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") diff --git a/backend/apps/openai/main.py b/backend/apps/openai/main.py index 50de53a53..d344c6622 100644 --- a/backend/apps/openai/main.py +++ b/backend/apps/openai/main.py @@ -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") diff --git a/backend/apps/rag/main.py b/backend/apps/rag/main.py index bd181c5f7..f9788556b 100644 --- a/backend/apps/rag/main.py +++ b/backend/apps/rag/main.py @@ -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() diff --git a/backend/apps/rag/search/brave.py b/backend/apps/rag/search/brave.py index 76ad1fb47..681caa976 100644 --- a/backend/apps/rag/search/brave.py +++ b/backend/apps/rag/search/brave.py @@ -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. diff --git a/backend/apps/rag/search/duckduckgo.py b/backend/apps/rag/search/duckduckgo.py index f0cc2a710..e994ef47a 100644 --- a/backend/apps/rag/search/duckduckgo.py +++ b/backend/apps/rag/search/duckduckgo.py @@ -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: diff --git a/backend/apps/rag/search/google_pse.py b/backend/apps/rag/search/google_pse.py index 0c78512e7..7fedb3dad 100644 --- a/backend/apps/rag/search/google_pse.py +++ b/backend/apps/rag/search/google_pse.py @@ -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. diff --git a/backend/apps/rag/search/jina_search.py b/backend/apps/rag/search/jina_search.py index 65f9ad68f..8d1c582a1 100644 --- a/backend/apps/rag/search/jina_search.py +++ b/backend/apps/rag/search/jina_search.py @@ -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 = { diff --git a/backend/apps/rag/search/searxng.py b/backend/apps/rag/search/searxng.py index 6e545e994..94bed2857 100644 --- a/backend/apps/rag/search/searxng.py +++ b/backend/apps/rag/search/searxng.py @@ -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. diff --git a/backend/apps/rag/search/serper.py b/backend/apps/rag/search/serper.py index b278a4df1..e71fbb628 100644 --- a/backend/apps/rag/search/serper.py +++ b/backend/apps/rag/search/serper.py @@ -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. diff --git a/backend/apps/rag/search/serply.py b/backend/apps/rag/search/serply.py index 24b249b73..28c15fd78 100644 --- a/backend/apps/rag/search/serply.py +++ b/backend/apps/rag/search/serply.py @@ -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. diff --git a/backend/apps/rag/search/serpstack.py b/backend/apps/rag/search/serpstack.py index 64b0f117d..5c19bd134 100644 --- a/backend/apps/rag/search/serpstack.py +++ b/backend/apps/rag/search/serpstack.py @@ -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. diff --git a/backend/apps/rag/search/tavily.py b/backend/apps/rag/search/tavily.py index b15d6ef9d..ed4ab6e08 100644 --- a/backend/apps/rag/search/tavily.py +++ b/backend/apps/rag/search/tavily.py @@ -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} diff --git a/backend/apps/rag/utils.py b/backend/apps/rag/utils.py index 7fcc9a003..034f71292 100644 --- a/backend/apps/rag/utils.py +++ b/backend/apps/rag/utils.py @@ -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( diff --git a/backend/apps/webui/models/chats.py b/backend/apps/webui/models/chats.py index 4c4f341e7..be77595ec 100644 --- a/backend/apps/webui/models/chats.py +++ b/backend/apps/webui/models/chats.py @@ -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 = ( diff --git a/backend/apps/webui/models/documents.py b/backend/apps/webui/models/documents.py index 1c2384aae..4157c2c95 100644 --- a/backend/apps/webui/models/documents.py +++ b/backend/apps/webui/models/documents.py @@ -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 [ diff --git a/backend/apps/webui/models/files.py b/backend/apps/webui/models/files.py index de4bb0073..2de5c33b5 100644 --- a/backend/apps/webui/models/files.py +++ b/backend/apps/webui/models/files.py @@ -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()] diff --git a/backend/apps/webui/models/functions.py b/backend/apps/webui/models/functions.py index b8433846c..3afdc1ea9 100644 --- a/backend/apps/webui/models/functions.py +++ b/backend/apps/webui/models/functions.py @@ -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) diff --git a/backend/apps/webui/models/memories.py b/backend/apps/webui/models/memories.py index 54a7528dd..41bb11ccf 100644 --- a/backend/apps/webui/models/memories.py +++ b/backend/apps/webui/models/memories.py @@ -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: diff --git a/backend/apps/webui/models/models.py b/backend/apps/webui/models/models.py index 2b25eb7e3..616beb2a9 100644 --- a/backend/apps/webui/models/models.py +++ b/backend/apps/webui/models/models.py @@ -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()] diff --git a/backend/apps/webui/models/prompts.py b/backend/apps/webui/models/prompts.py index d41969bce..942f64a43 100644 --- a/backend/apps/webui/models/prompts.py +++ b/backend/apps/webui/models/prompts.py @@ -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 [ diff --git a/backend/apps/webui/models/tags.py b/backend/apps/webui/models/tags.py index 63a8cb4ca..7ce06cb60 100644 --- a/backend/apps/webui/models/tags.py +++ b/backend/apps/webui/models/tags.py @@ -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 [ diff --git a/backend/apps/webui/models/tools.py b/backend/apps/webui/models/tools.py index a7b585d75..c8c56fb97 100644 --- a/backend/apps/webui/models/tools.py +++ b/backend/apps/webui/models/tools.py @@ -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()] diff --git a/backend/apps/webui/models/users.py b/backend/apps/webui/models/users.py index be0063ea0..36dfa4f85 100644 --- a/backend/apps/webui/models/users.py +++ b/backend/apps/webui/models/users.py @@ -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) diff --git a/backend/apps/webui/routers/chats.py b/backend/apps/webui/routers/chats.py index 6e89722d3..6621e7337 100644 --- a/backend/apps/webui/routers/chats.py +++ b/backend/apps/webui/routers/chats.py @@ -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) diff --git a/backend/apps/webui/routers/configs.py b/backend/apps/webui/routers/configs.py index 39e435013..68c687374 100644 --- a/backend/apps/webui/routers/configs.py +++ b/backend/apps/webui/routers/configs.py @@ -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), diff --git a/backend/apps/webui/routers/documents.py b/backend/apps/webui/routers/documents.py index 5043959c7..3bb2aa15b 100644 --- a/backend/apps/webui/routers/documents.py +++ b/backend/apps/webui/routers/documents.py @@ -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]) diff --git a/backend/apps/webui/routers/files.py b/backend/apps/webui/routers/files.py index 99fb923a1..ba571fc71 100644 --- a/backend/apps/webui/routers/files.py +++ b/backend/apps/webui/routers/files.py @@ -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 diff --git a/backend/apps/webui/routers/functions.py b/backend/apps/webui/routers/functions.py index 3e7737c04..f40d28264 100644 --- a/backend/apps/webui/routers/functions.py +++ b/backend/apps/webui/routers/functions.py @@ -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() diff --git a/backend/apps/webui/routers/memories.py b/backend/apps/webui/routers/memories.py index 2c473ebe8..a7b5474f0 100644 --- a/backend/apps/webui/routers/memories.py +++ b/backend/apps/webui/routers/memories.py @@ -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) diff --git a/backend/apps/webui/routers/models.py b/backend/apps/webui/routers/models.py index eeae9e1c4..8faeed7a6 100644 --- a/backend/apps/webui/routers/models.py +++ b/backend/apps/webui/routers/models.py @@ -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() diff --git a/backend/apps/webui/routers/prompts.py b/backend/apps/webui/routers/prompts.py index bdab6d556..39d79362a 100644 --- a/backend/apps/webui/routers/prompts.py +++ b/backend/apps/webui/routers/prompts.py @@ -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() diff --git a/backend/apps/webui/routers/tools.py b/backend/apps/webui/routers/tools.py index 7e60fe4d1..d6da7ae92 100644 --- a/backend/apps/webui/routers/tools.py +++ b/backend/apps/webui/routers/tools.py @@ -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 diff --git a/backend/apps/webui/routers/users.py b/backend/apps/webui/routers/users.py index 9627f0b06..543757275 100644 --- a/backend/apps/webui/routers/users.py +++ b/backend/apps/webui/routers/users.py @@ -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) diff --git a/backend/apps/webui/routers/utils.py b/backend/apps/webui/routers/utils.py index 4ffe748b0..9c2f809db 100644 --- a/backend/apps/webui/routers/utils.py +++ b/backend/apps/webui/routers/utils.py @@ -57,7 +57,7 @@ async def get_html_from_markdown( class ChatForm(BaseModel): title: str - messages: List[dict] + messages: list[dict] @router.post("/pdf") diff --git a/backend/main.py b/backend/main.py index 3bb5adb8f..d8ce5f5d7 100644 --- a/backend/main.py +++ b/backend/main.py @@ -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") diff --git a/backend/utils/misc.py b/backend/utils/misc.py index 05830568b..ade8d93b5 100644 --- a/backend/utils/misc.py +++ b/backend/utils/misc.py @@ -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. diff --git a/backend/utils/tools.py b/backend/utils/tools.py index 3e5d82fd6..76d616c59 100644 --- a/backend/utils/tools.py +++ b/backend/utils/tools.py @@ -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)