diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index 25de81c9..bfde8706 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -44,6 +44,7 @@ from app.utils.http import RequestUtils, AsyncRequestUtils from app.utils.security import SecurityUtils from app.utils.url import UrlUtils from version import APP_VERSION +from app.helper.llm import LLMHelper router = APIRouter() @@ -338,6 +339,18 @@ async def set_setting( return schemas.Response(success=False, message=f"配置项 '{key}' 不存在") +@router.get("/llm-models", summary="获取LLM模型列表", response_model=schemas.Response) +async def get_llm_models(provider: str, api_key: str, base_url: Optional[str] = None, _: User = Depends(get_current_active_user_async)): + """ + 获取LLM模型列表 + """ + try: + models = LLMHelper().get_models(provider, api_key, base_url) + return schemas.Response(success=True, data=models) + except Exception as e: + return schemas.Response(success=False, message=str(e)) + + @router.get("/message", summary="实时消息") async def get_message(request: Request, role: Optional[str] = "system", _: schemas.TokenPayload = Depends(verify_resource_token)): diff --git a/app/helper/llm.py b/app/helper/llm.py new file mode 100644 index 00000000..ca446917 --- /dev/null +++ b/app/helper/llm.py @@ -0,0 +1,42 @@ +"""LLM模型相关辅助功能""" +from typing import List + +from app.log import logger + + +class LLMHelper: + """LLM模型相关辅助功能""" + + def get_models(self, provider: str, api_key: str, base_url: str = None) -> List[str]: + """获取模型列表""" + logger.info(f"获取 {provider} 模型列表...") + if provider == "google": + return self._get_google_models(api_key) + else: + return self._get_openai_compatible_models(provider, api_key, base_url) + + def _get_google_models(self, api_key: str) -> List[str]: + """获取Google模型列表""" + try: + import google.generativeai as genai + genai.configure(api_key=api_key) + models = genai.list_models() + return [m.name for m in models if 'generateContent' in m.supported_generation_methods] + except Exception as e: + logger.error(f"获取Google模型列表失败:{e}") + raise e + + def _get_openai_compatible_models(self, provider: str, api_key: str, base_url: str = None) -> List[str]: + """获取OpenAI兼容模型列表""" + try: + from openai import OpenAI + + if provider == "deepseek": + base_url = base_url or "https://api.deepseek.com" + + client = OpenAI(api_key=api_key, base_url=base_url) + models = client.models.list() + return [model.id for model in models.data] + except Exception as e: + logger.error(f"获取 {provider} 模型列表失败:{e}") + raise e diff --git a/config/plugins/p115strmhelper/p115strmhelper_file.db b/config/plugins/p115strmhelper/p115strmhelper_file.db new file mode 100644 index 00000000..5df2b80e Binary files /dev/null and b/config/plugins/p115strmhelper/p115strmhelper_file.db differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..96db831a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "MoviePilot", + "lockfileVersion": 3, + "requires": true, + "packages": {} +}