feat(nyahome): 支持模型的思考模式(DS)与编辑模型

增加了控制模型是否支持思考以及是否在调用时启用思考的开关,目前为 DeepSeek 适配。
WebUI 进行了同步的更新。
This commit is contained in:
2026-06-01 20:45:45 +08:00
parent 7df66bbc61
commit 567c146fb8
6 changed files with 135 additions and 43 deletions
+100 -17
View File
@@ -1,4 +1,4 @@
from typing import Annotated
from typing import Annotated, Sequence
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.exc import NoResultFound
@@ -9,10 +9,9 @@ from nyahome.database import (
AiiModelPublic,
AiiProvider,
AiiProviderPublic,
AiiProviderPublicWithoutKey,
ModelUser,
get_session,
z_aii_model,
z_aii_provider,
)
from nyahome.service.aii_service import apply_get_models, s_check_remote_model, s_list_remote_provider_models
@@ -23,16 +22,15 @@ aii_router = APIRouter(tags=["Aii"], prefix="/aii")
@aii_router.get("/model/", name="获取模型列表")
async def get_all_model(session: Annotated[Session, Depends(get_session)]) -> ReturnDto:
async def get_all_model(session: Annotated[Session, Depends(get_session)]) -> list[dict]:
"""
获取 AI 模型列表。
此接口无需用户登录即可访问。
Returns:
被 ReturnDto 包裹的 AiiModel 列表
AiiModel 列表
"""
final_model_list = apply_get_models(session)
return ReturnDto(result=final_model_list)
return apply_get_models(session)
@aii_router.post("/model/", name="添加模型")
@@ -40,18 +38,18 @@ async def add_model(
model: AiiModelPublic,
user: Annotated[ModelUser, Depends(verify_token)],
session: Annotated[Session, Depends(get_session)],
) -> ReturnDto:
) -> AiiModel:
"""
添加新的 AI 模型。需要基于已添加的模型提供商。
此接口需要管理员访问。
添加模型时不会进行可用性检查,因此 WebUI 在前端实现了检查按钮。此端点不会负责检查。
不会进行可用性检查,因此 WebUI 在前端实现了检查按钮。此端点不会负责检查。
Raises:
HTTPException: 401 用户无权限管理模型(未登录或非管理员)
HTTPException: 404 模型提供商不存在
Returns:
被 ReturnDto 包裹的、添加的 AiiModel
AiiModel
"""
if not user.is_admin:
raise HTTPException(status_code=401, detail="用户无权限管理模型。") from None
@@ -69,11 +67,57 @@ async def add_model(
session.add(am)
session.commit()
session.refresh(am)
return ReturnDto(result=z_aii_model(am))
return am
@aii_router.post("/model/{id_}", name="修改模型")
async def edit_model(
id_: int,
model: AiiModelPublic,
user: Annotated[ModelUser, Depends(verify_token)],
session: Annotated[Session, Depends(get_session)],
) -> AiiModel:
"""
修改已添加的 AI 模型。
此接口需要管理员访问。
不会进行可用性检查,因此 WebUI 在前端实现了检查按钮。此端点不会负责检查。
**只允许修改模型的名称、最大上下文长度和是否支持思考。**
Raises:
HTTPException: 400 模型提供商 ID 不匹配
HTTPException: 401 用户无权限管理模型(未登录或非管理员)
HTTPException: 404 模型提供商不存在
Returns:
AiiModel
"""
if not user.is_admin:
raise HTTPException(status_code=401, detail="用户无权限管理模型。") from None
try:
ap: AiiProvider = session.exec(select(AiiProvider).where(AiiProvider.id == model.aii_provider_id)).one()
except NoResultFound:
raise HTTPException(status_code=404, detail="Provider 不存在。") from None
try:
am: AiiModel = session.exec(select(AiiModel).where(AiiModel.id == id_)).one()
except NoResultFound:
raise HTTPException(status_code=404, detail="模型不存在。") from None
if ap.id != am.aii_provider_id:
raise HTTPException(status_code=400, detail="模型提供商 ID 不匹配。") from None
am.model_name = model.model_name
am.max_context_length = model.max_context_length
am.reasonable = model.reasonable
session.add(am)
session.commit()
session.refresh(am)
return am
@aii_router.get("/provider/", name="获取提供商列表")
async def get_all_provider(session: Annotated[Session, Depends(get_session)]) -> ReturnDto:
async def get_all_provider(session: Annotated[Session, Depends(get_session)]) -> Sequence[AiiProvider]:
"""
获取 AI 模型提供商列表。
此接口无需用户登录即可访问。
@@ -81,8 +125,7 @@ async def get_all_provider(session: Annotated[Session, Depends(get_session)]) ->
Returns:
被 ReturnDto 包裹的 AiiProvider 列表
"""
aii_providers = session.exec(select(AiiProvider)).all()
return ReturnDto(result=[z_aii_provider(ap) for ap in aii_providers])
return session.exec(select(AiiProvider)).all()
@aii_router.post("/provider/", name="添加提供商")
@@ -90,11 +133,11 @@ async def add_provider(
provider: AiiProviderPublic,
user: Annotated[ModelUser, Depends(verify_token)],
session: Annotated[Session, Depends(get_session)],
) -> ReturnDto:
) -> AiiProvider:
"""
添加新的 AI 模型提供商。
此接口需要管理员才能访问。
添加提供商时不会进行可用性检查,因此 WebUI 在前端实现了检查按钮。此端点不会负责检查。
不会进行可用性检查,因此 WebUI 在前端实现了检查按钮。此端点不会负责检查。
Raises:
HTTPException: 401 表示用户未登录或非管理员。
@@ -108,7 +151,47 @@ async def add_provider(
session.add(ap)
session.commit()
session.refresh(ap)
return ReturnDto(result=z_aii_provider(ap))
return ap
@aii_router.post("/provider/{id_}/", name="修改提供商")
async def edit_provider(
id_: int,
provider: AiiProviderPublicWithoutKey,
user: Annotated[ModelUser, Depends(verify_token)],
session: Annotated[Session, Depends(get_session)],
) -> AiiProvider:
"""
修改 AI 模型提供商。
此接口需要管理员才能访问。
不会进行可用性检查,因此 WebUI 在前端实现了检查按钮。此端点不会负责检查。
**只允许修改模型提供商的名称和 Base URL。**
Raises:
HTTPException: 400 模型提供商 ID 不匹配。
HTTPException: 401 表示用户未登录或非管理员。
HTTPException: 404 提供商不存在。
Returns:
被 ReturnDto 包裹的、添加的 AiiProvider
"""
if not user.is_admin:
raise HTTPException(status_code=401, detail="用户无权限管理模型。") from None
if provider.id != id_:
raise HTTPException(status_code=400, detail="模型提供商 ID 不匹配。") from None
try:
ap: AiiProvider = session.exec(select(AiiProvider).where(AiiProvider.id == id_)).one()
except NoResultFound:
raise HTTPException(status_code=404, detail="提供商不存在。") from None
ap.name = provider.name
ap.base_url = provider.base_url
session.add(ap)
session.commit()
session.refresh(ap)
return ap
@aii_router.get("/provider/{id_}/remote/models/", name="获取提供商远端模型")