refac: modernize type annotations (PEP 604 / PEP 585)

This commit is contained in:
Timothy Jaeryang Baek
2026-05-12 17:10:15 +09:00
parent a59c967d7e
commit 6d0295588e
197 changed files with 3265 additions and 3488 deletions
+34 -39
View File
@@ -1,21 +1,18 @@
from __future__ import annotations
import json
import logging
import time
from typing import Optional
from sqlalchemy import select, delete, update, or_, func, String, cast
from sqlalchemy.ext.asyncio import AsyncSession
from open_webui.internal.db import Base, JSONField, get_async_db_context
from open_webui.models.groups import Groups
from open_webui.models.users import User, UserModel, Users, UserResponse
from open_webui.models.access_grants import AccessGrantModel, AccessGrants
from open_webui.models.groups import Groups
from open_webui.models.users import User, UserModel, UserResponse, Users
from pydantic import BaseModel, ConfigDict, Field, model_validator
from sqlalchemy import BigInteger, Boolean, Column, String, Text, cast, delete, func, or_, select, update
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy import BigInteger, Column, Text, Boolean
from sqlalchemy.ext.asyncio import AsyncSession
log = logging.getLogger(__name__)
@@ -35,14 +32,14 @@ class ModelParams(BaseModel):
# ModelMeta is a model for the data stored in the meta field of the Model table
class ModelMeta(BaseModel):
profile_image_url: Optional[str] = '/static/favicon.png'
profile_image_url: str | None = '/static/favicon.png'
description: Optional[str] = None
description: str | None = None
"""
User-facing description of the model.
"""
capabilities: Optional[dict] = None
capabilities: dict | None = None
model_config = ConfigDict(extra='allow')
@@ -100,7 +97,7 @@ class Model(Base):
class ModelModel(BaseModel):
id: str
user_id: str
base_model_id: Optional[str] = None
base_model_id: str | None = None
name: str
params: ModelParams
@@ -121,11 +118,11 @@ class ModelModel(BaseModel):
class ModelUserResponse(ModelModel):
user: Optional[UserResponse] = None
user: UserResponse | None = None
class ModelAccessResponse(ModelUserResponse):
write_access: Optional[bool] = False
write_access: bool | None = False
class ModelResponse(ModelModel):
@@ -146,23 +143,23 @@ class ModelForm(BaseModel):
model_config = ConfigDict(extra='ignore')
id: str
base_model_id: Optional[str] = None
base_model_id: str | None = None
name: str
meta: ModelMeta
params: ModelParams
access_grants: Optional[list[dict]] = None
access_grants: list[dict | None] = None
is_active: bool = True
class ModelsTable:
async def _get_access_grants(self, model_id: str, db: Optional[AsyncSession] = None) -> list[AccessGrantModel]:
async def _get_access_grants(self, model_id: str, db: AsyncSession | None = None) -> list[AccessGrantModel]:
return await AccessGrants.get_grants_by_resource('model', model_id, db=db)
async def _to_model_model(
self,
model: Model,
access_grants: Optional[list[AccessGrantModel]] = None,
db: Optional[AsyncSession] = None,
access_grants: list[AccessGrantModel | None] = None,
db: AsyncSession | None = None,
) -> ModelModel:
model_data = ModelModel.model_validate(model).model_dump(exclude={'access_grants'})
model_data['access_grants'] = (
@@ -171,8 +168,8 @@ class ModelsTable:
return ModelModel.model_validate(model_data)
async def insert_new_model(
self, form_data: ModelForm, user_id: str, db: Optional[AsyncSession] = None
) -> Optional[ModelModel]:
self, form_data: ModelForm, user_id: str, db: AsyncSession | None = None
) -> ModelModel | None:
try:
async with get_async_db_context(db) as db:
result = Model(
@@ -196,7 +193,7 @@ class ModelsTable:
log.exception(f'Failed to insert a new model: {e}')
return None
async def get_all_models(self, db: Optional[AsyncSession] = None) -> list[ModelModel]:
async def get_all_models(self, db: AsyncSession | None = None) -> list[ModelModel]:
async with get_async_db_context(db) as db:
result = await db.execute(select(Model))
all_models = result.scalars().all()
@@ -207,7 +204,7 @@ class ModelsTable:
for model in all_models
]
async def get_models(self, db: Optional[AsyncSession] = None) -> list[ModelUserResponse]:
async def get_models(self, db: AsyncSession | None = None) -> list[ModelUserResponse]:
async with get_async_db_context(db) as db:
result = await db.execute(select(Model).filter(Model.base_model_id != None))
all_models = result.scalars().all()
@@ -238,7 +235,7 @@ class ModelsTable:
)
return models
async def get_base_models(self, db: Optional[AsyncSession] = None) -> list[ModelModel]:
async def get_base_models(self, db: AsyncSession | None = None) -> list[ModelModel]:
async with get_async_db_context(db) as db:
result = await db.execute(select(Model).filter(Model.base_model_id == None))
all_models = result.scalars().all()
@@ -250,7 +247,7 @@ class ModelsTable:
]
async def get_models_by_user_id(
self, user_id: str, permission: str = 'write', db: Optional[AsyncSession] = None
self, user_id: str, permission: str = 'write', db: AsyncSession | None = None
) -> list[ModelUserResponse]:
models = await self.get_models(db=db)
user_groups = await Groups.get_groups_by_member_id(user_id, db=db)
@@ -287,7 +284,7 @@ class ModelsTable:
filter: dict = {},
skip: int = 0,
limit: int = 30,
db: Optional[AsyncSession] = None,
db: AsyncSession | None = None,
) -> ModelListResponse:
async with get_async_db_context(db) as db:
stmt = select(Model, User).outerjoin(User, User.id == Model.user_id)
@@ -391,7 +388,7 @@ class ModelsTable:
return ModelListResponse(items=models, total=total)
async def get_model_meta_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[tuple[dict, int]]:
async def get_model_meta_by_id(self, id: str, db: AsyncSession | None = None) -> tuple[dict, int | None]:
"""Return (meta, updated_at) for a model, skipping access grant resolution."""
try:
async with get_async_db_context(db) as db:
@@ -404,7 +401,7 @@ class ModelsTable:
self,
user_id: str,
is_admin: bool = False,
db: Optional[AsyncSession] = None,
db: AsyncSession | None = None,
) -> set[str]:
"""Extract unique tag names from model meta, querying only the meta column."""
async with get_async_db_context(db) as db:
@@ -437,7 +434,7 @@ class ModelsTable:
return tags_set
async def get_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]:
async def get_model_by_id(self, id: str, db: AsyncSession | None = None) -> ModelModel | None:
try:
async with get_async_db_context(db) as db:
model = await db.get(Model, id)
@@ -445,7 +442,7 @@ class ModelsTable:
except Exception:
return None
async def get_models_by_ids(self, ids: list[str], db: Optional[AsyncSession] = None) -> list[ModelModel]:
async def get_models_by_ids(self, ids: list[str], db: AsyncSession | None = None) -> list[ModelModel]:
try:
async with get_async_db_context(db) as db:
result = await db.execute(select(Model).filter(Model.id.in_(ids)))
@@ -463,7 +460,7 @@ class ModelsTable:
except Exception:
return []
async def toggle_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]:
async def toggle_model_by_id(self, id: str, db: AsyncSession | None = None) -> ModelModel | None:
async with get_async_db_context(db) as db:
try:
result = await db.execute(select(Model).filter_by(id=id))
@@ -480,9 +477,7 @@ class ModelsTable:
except Exception:
return None
async def update_model_by_id(
self, id: str, model: ModelForm, db: Optional[AsyncSession] = None
) -> Optional[ModelModel]:
async def update_model_by_id(self, id: str, model: ModelForm, db: AsyncSession | None = None) -> ModelModel | None:
try:
async with get_async_db_context(db) as db:
# update only the fields that are present in the model
@@ -499,7 +494,7 @@ class ModelsTable:
log.exception(f'Failed to update the model by id {id}: {e}')
return None
async def update_model_updated_at_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]:
async def update_model_updated_at_by_id(self, id: str, db: AsyncSession | None = None) -> ModelModel | None:
try:
async with get_async_db_context(db) as db:
result = await db.execute(select(Model).filter_by(id=id))
@@ -514,7 +509,7 @@ class ModelsTable:
log.exception(f'Failed to update the model updated_at by id {id}: {e}')
return None
async def delete_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool:
async def delete_model_by_id(self, id: str, db: AsyncSession | None = None) -> bool:
try:
async with get_async_db_context(db) as db:
await AccessGrants.revoke_all_access('model', id, db=db)
@@ -525,7 +520,7 @@ class ModelsTable:
except Exception:
return False
async def delete_all_models(self, db: Optional[AsyncSession] = None) -> bool:
async def delete_all_models(self, db: AsyncSession | None = None) -> bool:
try:
async with get_async_db_context(db) as db:
result = await db.execute(select(Model.id))
@@ -540,7 +535,7 @@ class ModelsTable:
return False
async def sync_models(
self, user_id: str, models: list[ModelModel], db: Optional[AsyncSession] = None
self, user_id: str, models: list[ModelModel], db: AsyncSession | None = None
) -> list[ModelModel]:
try:
async with get_async_db_context(db) as db: