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:
parent
c8e0c0bb1e
commit
6d571f56a8
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user