fix: auto-fetch Dify models using existing API keys as fallback

- Backend: try DIFY_CHAT/WORKFLOW_API_KEY when workspace key is missing
- Frontend: always show '从 Dify 获取' button, not just after first fetch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wsb1224 2026-07-24 13:48:37 +08:00
parent c8e0c0bb1e
commit 6d571f56a8
2 changed files with 44 additions and 26 deletions

View File

@ -500,31 +500,48 @@ class PptAdminService:
"""调用 Dify API 获取可用 LLM 模型列表,失败返回 None。"""
import requests
try:
# 从 SystemSetting 读取 Dify Workspace API Key
key_setting = SystemSetting.query.filter_by(key="dify_workspace_api_key").first()
api_key = key_setting.value if key_setting and key_setting.value else ""
if not api_key:
return None
base_url = os.getenv("DIFY_BASE_URL", "http://localhost:5001")
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:
logger.warning(f"Dify 模型查询失败: HTTP {resp.status_code}")
return None
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})
return models if models else None
# 收集可用的 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
except Exception as e:
logger.warning(f"从 Dify 获取模型列表失败: {e}")
return None

View File

@ -21,7 +21,8 @@
<el-form-item label="模型名称">
<div style="display: flex; gap: 8px; width: 100%">
<el-input v-model="form.ppt_llm_model" placeholder="如 deepseek-chat" />
<el-dropdown v-if="difyModels.length" trigger="click" @command="(cmd: string) => applyDifyModel('ppt', cmd)">
<el-button v-if="!difyModels.length" @click="fetchDifyModels" :loading="fetchingModels"> Dify 获取</el-button>
<el-dropdown v-else trigger="click" @command="(cmd: string) => applyDifyModel('ppt', cmd)">
<el-button> Dify 获取 <el-icon><ArrowDown /></el-icon></el-button>
<template #dropdown>
<el-dropdown-menu>
@ -32,7 +33,6 @@
</el-dropdown-menu>
</template>
</el-dropdown>
<el-button v-else @click="fetchDifyModels" :loading="fetchingModels"> Dify 获取</el-button>
</div>
</el-form-item>
@ -60,7 +60,8 @@
<el-form-item label="模型名称">
<div style="display: flex; gap: 8px; width: 100%">
<el-input v-model="form.poster_llm_model" placeholder="如 deepseek-chat" />
<el-dropdown v-if="difyModels.length" trigger="click" @command="(cmd: string) => applyDifyModel('poster', cmd)">
<el-button v-if="!difyModels.length" @click="fetchDifyModels" :loading="fetchingModels"> Dify 获取</el-button>
<el-dropdown v-else trigger="click" @command="(cmd: string) => applyDifyModel('poster', cmd)">
<el-button> Dify 获取 <el-icon><ArrowDown /></el-icon></el-button>
<template #dropdown>
<el-dropdown-menu>