dify-deploy
Skill46 starsChanged 3 months agoMITView on GitHub
通过 ADMIN_API_KEY 自动化调用 Dify Console API(Node.js 驱动模式)。用于脚本化创建应用、导出 DSL 到文件、从大文件 YAML 导入或覆盖 DSL。
- Reads credentials
- Sends data out
In this repository6 other files it gives its agents.
- dify-workflowSkill
- frontend-reviewSkill
- github-star-managerSkill
- ideological-self-reportSkill
- image-uploadSkill
- mkdocs-shadcnSkill
The file
Files
Dify Console Admin API (Node.js 驱动模式)
通过 ADMIN_API_KEY 自动化调用 Dify Console API。全流程采用 Node.js 模版 执行,避免大文件 DSL YAML 在命令行传输时出现命令行超长溢出或双引号转义失败。
适用场景
- 自动化创建工作流或高级编排应用。
- 将应用或工作流 DSL 导出并保存为本地
.yml文件。 - 从本地 YAML 文件或远程 URL 导入 DSL 到 Dify(支持超大文件)。
- 覆盖导入现有工作流应用并进行异步状态确认。
Phase 1: 配置加载与准备
参数保存在 .dify_key/config.json:
{
"DIFY_BASE_URL": "http://127.0.0.1:5001",
"ADMIN_API_KEY": "sk-admin-xxx",
"WORKSPACE_ID": "d4e26a01-162f-4366-9a25-1c2c1bdd15dz"
}加载或自动获取配置
在当前工作区检查配置:
- 若
.dify_key/config.json存在:直接读取配置。 - 若配置文件不存在:运行一键获取脚本:
(注:请指向实际 Skill 部署路径下的node ./scripts/fetch_keys.jsscripts/fetch_keys.js)
Phase 2: Node.js 操作引擎
所有 HTTP 请求均需包含标准鉴权头:
Authorization: Bearer ${ADMIN_API_KEY}X-WORKSPACE-ID: ${WORKSPACE_ID}
分支 A:创建应用 (Create App)
使用 Node.js 发送创建请求:
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('.dify_key/config.json', 'utf-8'));
async function createApp(appName, description = '') {
const res = await fetch(`${config.DIFY_BASE_URL}/console/api/apps`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${config.ADMIN_API_KEY}`,
'X-WORKSPACE-ID': config.WORKSPACE_ID,
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: appName, mode: 'workflow', description })
});
const data = await res.json();
if (res.status === 201) {
console.log(`应用创建成功! App ID: ${data.id}`);
return data;
} else {
throw new Error(`创建失败 [${res.status}]: ${JSON.stringify(data)}`);
}
}Completion Criterion: 收到 HTTP Status 201 CREATED,返回包含新创建应用的 id。
分支 B:导出 DSL 到本地文件 (Export DSL)
安全将云端 DSL 导出为本地 .yml 文件:
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('.dify_key/config.json', 'utf-8'));
async function exportDSL(appId, outputPath, includeSecret = false) {
const url = `${config.DIFY_BASE_URL}/console/api/apps/${appId}/export?include_secret=${includeSecret}`;
const res = await fetch(url, {
headers: {
'Authorization': `Bearer ${config.ADMIN_API_KEY}`,
'X-WORKSPACE-ID': config.WORKSPACE_ID
}
});
const json = await res.json();
if (res.ok && json.data) {
fs.writeFileSync(outputPath, json.data, 'utf-8');
console.log(`DSL 成功导出至: ${outputPath}`);
} else {
throw new Error(`导出失败 [${res.status}]: ${JSON.stringify(json)}`);
}
}Completion Criterion: 收到 HTTP 200 OK,本地 outputPath 成功写入非空 YAML 内容。
分支 C:从本地文件导入 DSL (Import DSL from Local YAML)
通过 Node.js 文件流直接读取大文件 YAML,解决 CLI 命令超长问题:
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('.dify_key/config.json', 'utf-8'));
async function importDSL(yamlFilePath, targetAppId = null) {
const yamlContent = fs.readFileSync(yamlFilePath, 'utf-8');
const payload = {
mode: 'yaml-content',
yaml_content: yamlContent
};
if (targetAppId) payload.app_id = targetAppId; // 覆盖导入模式
const res = await fetch(`${config.DIFY_BASE_URL}/console/api/apps/imports`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${config.ADMIN_API_KEY}`,
'X-WORKSPACE-ID': config.WORKSPACE_ID,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
const result = await res.json();
return handleImportResponse(res.status, result, config);
}Phase 3: 异步状态确认与终态收敛 (Status Convergence)
当导入的大文件 DSL 处理较慢时,Dify 会返回 HTTP 202 ACCEPTED 且状态为 pending。必须自动进行 Confirm 确认直至收敛。
async function handleImportResponse(statusCode, responseJson, config) {
if (statusCode === 200 || statusCode === 201) {
console.log(`DSL 导入完成! App ID: ${responseJson.app_id || responseJson.id}`);
return responseJson;
}
if (statusCode === 202 && responseJson.status === 'pending') {
const importId = responseJson.id || responseJson.import_id;
console.log(`导入任务排队中 (Import ID: ${importId}),开始自动 Confirm 确认...`);
const confirmRes = await fetch(`${config.DIFY_BASE_URL}/console/api/apps/imports/${importId}/confirm`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${config.ADMIN_API_KEY}`,
'X-WORKSPACE-ID': config.WORKSPACE_ID,
'Content-Type': 'application/json'
},
body: JSON.stringify({})
});
const confirmData = await confirmRes.json();
console.log(`Confirm 状态结果:`, confirmData);
return confirmData;
}
throw new Error(`导入异常 [${statusCode}]: ${JSON.stringify(responseJson)}`);
}Completion Criterion: 响应状态最终收敛为 200/201,且返回导入后的 app_id。
异常排查 (Troubleshooting)
401 Invalid token:- 检查
.dify_key/config.json中的ADMIN_API_KEY是否正确。 - 确认服务端
.env中已配置ADMIN_API_KEY_ENABLE=true。 - 服务端修改
.env后必须重新启动 API 容器(如docker compose up -d --force-recreate api)。
- 检查
Connection refused:- 检查
DIFY_BASE_URL地址是否连通,本地 Docker 部署通常为http://127.0.0.1:5001或http://localhost。
- 检查
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

