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。"""
|
"""调用 Dify API 获取可用 LLM 模型列表,失败返回 None。"""
|
||||||
import requests
|
import requests
|
||||||
try:
|
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")
|
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()
|
# 收集可用的 API Key,按优先级尝试
|
||||||
models = []
|
candidate_keys: list[str] = []
|
||||||
for item in data.get("data", []):
|
key_setting = SystemSetting.query.filter_by(key="dify_workspace_api_key").first()
|
||||||
provider = item.get("provider", "")
|
if key_setting and key_setting.value:
|
||||||
for model in item.get("models", []):
|
candidate_keys.append(key_setting.value)
|
||||||
model_name = model.get("model", "")
|
for env_key in ("DIFY_CHAT_APP_API_KEY", "DIFY_WORKFLOW_APP_API_KEY",
|
||||||
label = model.get("label", {}).get("zh_Hans", "") or model.get("label", {}).get("en_US", "") or model_name
|
"BAODAN_CHAT_API_KEY", "BAODAN_WORKFLOW_API_KEY"):
|
||||||
models.append({"provider": provider, "model": model_name, "label": label})
|
val = os.getenv(env_key, "").strip()
|
||||||
return models if models else None
|
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:
|
except Exception as e:
|
||||||
logger.warning(f"从 Dify 获取模型列表失败: {e}")
|
logger.warning(f"从 Dify 获取模型列表失败: {e}")
|
||||||
return None
|
return None
|
||||||
|
|||||||
@ -21,7 +21,8 @@
|
|||||||
<el-form-item label="模型名称">
|
<el-form-item label="模型名称">
|
||||||
<div style="display: flex; gap: 8px; width: 100%">
|
<div style="display: flex; gap: 8px; width: 100%">
|
||||||
<el-input v-model="form.ppt_llm_model" placeholder="如 deepseek-chat" />
|
<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>
|
<el-button>从 Dify 获取 <el-icon><ArrowDown /></el-icon></el-button>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
@ -32,7 +33,6 @@
|
|||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
<el-button v-else @click="fetchDifyModels" :loading="fetchingModels">从 Dify 获取</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@ -60,7 +60,8 @@
|
|||||||
<el-form-item label="模型名称">
|
<el-form-item label="模型名称">
|
||||||
<div style="display: flex; gap: 8px; width: 100%">
|
<div style="display: flex; gap: 8px; width: 100%">
|
||||||
<el-input v-model="form.poster_llm_model" placeholder="如 deepseek-chat" />
|
<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>
|
<el-button>从 Dify 获取 <el-icon><ArrowDown /></el-icon></el-button>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user