diff --git a/api/insurance/admin/ppt_admin_service.py b/api/insurance/admin/ppt_admin_service.py index b02476c..6cec844 100644 --- a/api/insurance/admin/ppt_admin_service.py +++ b/api/insurance/admin/ppt_admin_service.py @@ -497,53 +497,30 @@ class PptAdminService: return {"code": 0, "data": {"models": self._BUILTIN_MODELS, "source": "builtin"}} def _fetch_dify_models(self) -> list | None: - """调用 Dify API 获取可用 LLM 模型列表,失败返回 None。""" - import requests + """从 Dify 数据库直接查询已配置的 LLM 模型列表。""" try: - base_url = os.getenv("DIFY_BASE_URL", "http://localhost:5001") - - # 收集可用的 API Key,按优先级尝试 - candidate_keys: list[str] = [] - key_setting = SystemSetting.query.filter_by(key="dify_workspace_api_key").first() - if key_setting and key_setting.value: - candidate_keys.append(key_setting.value) - for env_key in ("DIFY_CHAT_APP_API_KEY", "DIFY_WORKFLOW_APP_API_KEY", - "BAODAN_CHAT_API_KEY", "BAODAN_WORKFLOW_API_KEY"): - val = os.getenv(env_key, "").strip() - if val: - candidate_keys.append(val) - # 去重保持顺序 - seen = set() - api_keys = [] - for k in candidate_keys: - if k not in seen: - seen.add(k) - api_keys.append(k) - - for api_key in api_keys: - try: - resp = requests.get( - f"{base_url}/v1/workspaces/current/models/model-types/llm", - headers={"Authorization": f"Bearer {api_key}"}, - timeout=10, - ) - if resp.status_code != 200: - continue - data = resp.json() - models = [] - for item in data.get("data", []): - provider = item.get("provider", "") - for model in item.get("models", []): - model_name = model.get("model", "") - label = model.get("label", {}).get("zh_Hans", "") or model.get("label", {}).get("en_US", "") or model_name - models.append({"provider": provider, "model": model_name, "label": label}) - if models: - return models - except Exception: - continue - return None + rows = db.session.execute(db.text( + "SELECT DISTINCT pm.model_name, pm.provider_name " + "FROM provider_models pm " + "WHERE pm.model_type = 'llm' AND pm.is_valid = true " + "ORDER BY pm.provider_name, pm.model_name" + )).fetchall() + if not rows: + return None + models = [] + for row in rows: + model_name = row[0] + provider_name = row[1] + # 从插件标识中提取简短供应商名 + short_provider = provider_name.split("/")[-1] if "/" in provider_name else provider_name + models.append({ + "provider": short_provider, + "model": model_name, + "label": f"{model_name}", + }) + return models except Exception as e: - logger.warning(f"从 Dify 获取模型列表失败: {e}") + logger.warning(f"从 Dify 数据库获取模型列表失败: {e}") return None def get_settings(self) -> dict: diff --git a/frontend/src/pages/admin/PptSettingsAdmin.vue b/frontend/src/pages/admin/PptSettingsAdmin.vue index a90a836..06edd6d 100644 --- a/frontend/src/pages/admin/PptSettingsAdmin.vue +++ b/frontend/src/pages/admin/PptSettingsAdmin.vue @@ -159,14 +159,34 @@ function onPosterProviderChange(val: string) { } } +// 从模型名推断 base_url +const MODEL_BASE_URLS: Record = { + 'deepseek': 'https://api.deepseek.com/v1', + 'minimax': 'https://api.minimax.chat/v1', + 'gemini': 'https://generativelanguage.googleapis.com/v1/models', + 'gpt': 'https://api.openai.com/v1', + 'claude': 'https://api.anthropic.com/v1', +} + +function inferBaseUrl(model: string): string { + const lower = model.toLowerCase() + for (const [keyword, url] of Object.entries(MODEL_BASE_URLS)) { + if (lower.startsWith(keyword)) return url + } + return '' +} + function applyDifyModel(target: 'ppt' | 'poster', command: string) { - const [provider, model] = command.split('|') + const [, model] = command.split('|') + const baseUrl = inferBaseUrl(model) if (target === 'ppt') { - form.ppt_llm_provider = provider + form.ppt_llm_provider = 'custom' form.ppt_llm_model = model + form.ppt_llm_base_url = baseUrl } else { - form.poster_llm_provider = provider + form.poster_llm_provider = 'custom' form.poster_llm_model = model + form.poster_llm_base_url = baseUrl } }