Files
NyaHome/src/nyahome/service/aii_service.py
T
MangoFanFanw 567c146fb8 feat(nyahome): 支持模型的思考模式(DS)与编辑模型
增加了控制模型是否支持思考以及是否在调用时启用思考的开关,目前为 DeepSeek 适配。
WebUI 进行了同步的更新。
2026-06-01 20:45:45 +08:00

62 lines
2.2 KiB
Python

from typing import Sequence
import openai
from openai import AsyncOpenAI
from sqlalchemy.orm import joinedload
from sqlmodel import Session, select
from nyahome.database import AiiModel
def apply_get_models(session: Session) -> list[dict]:
"""
从数据库中获取可用的 AI 模型列表。
Args:
session: 数据库连接对象。
Returns:
"""
aii_models: Sequence[AiiModel] = session.exec(select(AiiModel).options(joinedload(AiiModel.aii_provider))).all() # type: ignore[arg-type]
final_model_list = []
for aii_model in aii_models:
final_model_list.append({
"id": aii_model.id,
"model_name": aii_model.model_name,
"max_context_length": aii_model.max_context_length,
"provider_id": aii_model.aii_provider_id,
"provider_name": aii_model.aii_provider.name,
"base_url": aii_model.aii_provider.base_url,
"reasonable": bool(aii_model.reasonable), # 数据库中的 reasonable 字段可能为 None,在这里归一为 False
})
return final_model_list
async def s_list_remote_provider_models(base_url: str, api_key: str) -> list[dict]:
client = AsyncOpenAI(base_url=base_url, api_key=api_key)
try:
models = await client.models.list()
final_model_list = []
async for model in models:
# model 实际上是 pydantic 模型,因此拥有 BaseModel 的所有方法。
# model.model_dump() 的示例结果:
# {'id': 'xxx', 'created': None, 'object': 'model', 'owned_by': 'xxx'}
final_model_list.append(model.model_dump())
return final_model_list
except Exception as e:
raise TypeError(f"获取模型提供商 {base_url} 的可用模型列表失败。") from e
async def s_check_remote_model(model_name: str, base_url: str, api_key: str) -> bool:
client = AsyncOpenAI(base_url=base_url, api_key=api_key)
try:
await client.models.retrieve(model_name)
return True
except openai.NotFoundError:
return False
except Exception as e:
raise TypeError(f"从模型提供商 {base_url} 检测模型 {model_name} 可用性时遇到未知错误") from e