dify-dsl-generator
npx skills add https://github.com/wwwzhouhui/skills_collection --skill dify-dsl-generator
Agent 安装分布
Skill 文档
Dify DSL 工使µçæå¨
ä¸ä¸ç Dify 工使µ DSL/YML æä»¶èªå¨çæå·¥å ·ï¼åºäºå¯¹ 86+ å®é 工使µæ¡ä¾ç深度å¦ä¹ ï¼è½å¤æ ¹æ®ç¨æ·çä¸å¡éæ±èªå¨çæç¬¦å Dify è§èç宿´å·¥ä½æµé ç½®æä»¶ã
æ ¸å¿åè½
- â 宿´DSLçæ: èªå¨çæå å« appãdependenciesãworkflow ç宿´ YML æä»¶
- â å¤èç¹æ¯æ: æ¯æ startãllmãanswerãcodeãhttp-requestãif-elseãtool çææèç¹ç±»å
- â æºè½è¿æ¥: èªå¨çæèç¹é´ç edges è¿æ¥å ³ç³»
- â åæ°é ç½®: æºè½æ¨è模ååæ°ãæç¤ºè¯é ç½®
- â æä»¶éæ: èªå¨è¯å«å¹¶é ç½®æéç Dify æä»¶ä¾èµ
- â è§èæ ¼å¼: ä¸¥æ ¼éµå¾ª Dify 0.3.0 çæ¬ç DSL è§è
ä½¿ç¨æ¹æ³
åºç¡ç¨æ³
çæä¸ä¸ª Dify 工使µç¨äº [ä¸å¡éæ±æè¿°]
详ç»ç¨æ³
帮æçæä¸ä¸ª Dify 工使µ DSL æä»¶:
- åè½: [工使µè¦å®ç°çåè½]
- è¾å
¥: [ç¨æ·è¾å
¥çå
容]
- å¤çæ¥éª¤: [详ç»çå¤çé»è¾]
- è¾åº: [ææçè¾åºç»æ]
- ä½¿ç¨æä»¶: [éè¦çæä»¶ï¼å¯é]
Dify DSL æä»¶ç»æ
åºäºå¯¹ 86+ çå®å·¥ä½æµæ¡ä¾çå¦ä¹ ï¼Dify DSL YML æä»¶éµå¾ªä»¥ä¸ç»æ:
1. App é ç½®
app:
description: '工使µæè¿°'
icon: ð¤
icon_background: '#FFEAD5'
mode: advanced-chat # æ workflow, agent-chat
name: 工使µåç§°
use_icon_as_answer_icon: false
模å¼è¯´æ:
advanced-chat: é«çº§å¯¹è¯æ¨¡å¼(chatflow)workflow: 工使µæ¨¡å¼agent-chat: AI Agent 模å¼
2. Dependencies ä¾èµ
dependencies:
- current_identifier: null
type: marketplace
value:
marketplace_plugin_unique_identifier: æä»¶å¯ä¸æ è¯ç¬¦
å¸¸ç¨æä»¶:
langgenius/openai_api_compatible: OpenAI å ¼å®¹æ¥å£bowenliang123/md_exporter: Markdown 导åºå¨- å ¶ä»å¸åºæä»¶æ ¹æ®éæ±æ·»å
3. Workflow 工使µ
kind: app
version: 0.3.0
workflow:
conversation_variables: []
environment_variables: []
features:
file_upload:
enabled: false
speech_to_text:
enabled: false
text_to_speech:
enabled: false
graph:
edges: []
nodes: []
èç¹ç±»å详解
Start å¼å§èç¹
- data:
desc: ''
title: å¼å§
type: start
variables:
- label: ç¨æ·è¾å
¥
max_length: 1000
options: []
required: true
type: paragraph # æ text-input, select, file
variable: query
id: 'start'
position:
x: 100
y: 300
type: custom
width: 244
height: 90
åéç±»å:
paragraph: æ®µè½ææ¬(å¤è¡)text-input: åè¡ææ¬select: 䏿鿩file: æä»¶ä¸ä¼number: æ°å
LLM 大è¯è¨æ¨¡åèç¹
- data:
context:
enabled: false
variable_selector: []
model:
completion_params:
temperature: 0.7
max_tokens: 2000
mode: chat
name: gpt-4
provider: openai
prompt_template:
- id: å¯ä¸ID
role: system
text: ç³»ç»æç¤ºè¯
- id: å¯ä¸ID
role: user
text: ç¨æ·æç¤ºè¯ {{#åéå¼ç¨#}}
title: LLMèç¹
type: llm
vision:
enabled: false
id: 'èç¹ID'
position:
x: 400
y: 300
type: custom
å¸¸ç¨æ¨¡åprovider:
openai: OpenAIlanggenius/openai_api_compatible/openai_api_compatible: å ¼å®¹æ¥å£anthropic: Claudealibaba: éä¹åé®
åéå¼ç¨æ ¼å¼:
{{#èç¹ID.è¾åºåé#}}: å¼ç¨å ¶ä»èç¹çè¾åº{{#sys.query#}}: å¼ç¨ç³»ç»åé(ç¨æ·è¾å ¥){{#èç¹ID.text#}}: å¼ç¨LLMè¾åºææ¬
Code ä»£ç æ§è¡èç¹
- data:
code: |
import json
def main(arg1: str, arg2: str) -> dict:
# å¤çé»è¾
result = process(arg1, arg2)
return {
"result": result,
"status": "success"
}
code_language: python3
outputs:
result:
type: string
status:
type: string
title: ä»£ç æ§è¡
type: code
variables:
- value_selector:
- 'åç½®èç¹ID'
- è¾åºåé
variable: arg1
id: 'èç¹ID'
position:
x: 700
y: 300
type: custom
代ç è¯è¨:
python3: Python 3javascript: JavaScript (é¨åçæ¬æ¯æ)
è¾åºç±»å:
string: å符串number: æ°åobject: 对象array[string]: å符串æ°ç»array[number]: æ°åæ°ç»array[object]: 对象æ°ç»
HTTP Request èç¹
- data:
authorization:
config: null
type: no-auth
body:
data: '{"key": "{{#åé#}}"}'
type: json
headers: ''
method: post
timeout:
max_connect_timeout: 0
max_read_timeout: 0
max_write_timeout: 0
title: HTTP请æ±
type: http-request
url: https://api.example.com/endpoint
id: 'èç¹ID'
position:
x: 1000
y: 300
type: custom
HTTPæ¹æ³:
get: GET 请æ±post: POST 请æ±put: PUT 请æ±patch: PATCH 请æ±delete: DELETE 请æ±
认è¯ç±»å:
no-auth: æ 认è¯api-key: API Keybearer: Bearer Token
If-Else æ¡ä»¶å¤æèç¹
- data:
cases:
- case_id: case1
conditions:
- comparison_operator: contains
id: æ¡ä»¶ID
value: ææå¼
variable_selector:
- 'èç¹ID'
- åéå
id: case1
logical_operator: and
logical_operator: or
title: æ¡ä»¶å¤æ
type: if-else
id: 'èç¹ID'
position:
x: 1300
y: 300
type: custom
æ¯è¾è¿ç®ç¬¦:
contains: å å«not contains: ä¸å å«is: çäºis not: ä¸çäºempty: 为空not empty: ä¸ä¸ºç©º
é»è¾è¿ç®ç¬¦:
and: ä¸or: æ
Tool å·¥å ·èç¹
- data:
provider_id: å·¥å
·æä¾è
ID
provider_name: å·¥å
·æä¾è
åç§°
provider_type: builtin # æ api
title: å·¥å
·è°ç¨
tool_configurations: {}
tool_label: å·¥å
·æ ç¾
tool_name: å·¥å
·åç§°
tool_parameters:
åæ°å:
type: mixed
value: '{{#åé#}}'
type: tool
id: 'èç¹ID'
position:
x: 1600
y: 300
type: custom
å·¥å ·ç±»å:
builtin: å ç½®å·¥å ·(å¦æç´¢ã天æ°ç)api: API å·¥å ·plugin: æä»¶å·¥å ·
Answer ç´æ¥åå¤èç¹
- data:
answer: |
{{#LLMèç¹ID.text#}}
{{#代ç èç¹ID.result#}}
title: ç´æ¥åå¤
type: answer
variables: []
id: answer
position:
x: 1900
y: 300
type: custom
Variable Aggregator åéèåå¨èç¹
- data:
advanced_settings: null
desc: ''
groups:
- group_name: åç»1
output_type: string
variables:
- value_selector:
- 'èç¹ID'
- åéå
variable: è¾åºåéå
title: åéèåå¨
type: variable-aggregator
id: 'èç¹ID'
position:
x: 2200
y: 300
type: custom
Parameter Extractor åæ°æåå¨èç¹
- data:
instruction: æåæä»¤è¯´æ
is_array: false
model:
completion_params: {}
mode: chat
name: gpt-4
provider: openai
parameters:
- description: åæ°æè¿°
name: åæ°å
required: true
type: string
query:
- role: user
text: '{{#è¾å
¥åé#}}'
reasoning_mode: prompt
title: åæ°æå
type: parameter-extractor
id: 'èç¹ID'
position:
x: 2500
y: 300
type: custom
Edges è¿æ¥å ³ç³»
edges:
- data:
isInIteration: false
isInLoop: false
sourceType: start
targetType: llm
id: æºèç¹ID-source-ç®æ èç¹ID-target
source: 'æºèç¹ID'
sourceHandle: source
target: 'ç®æ èç¹ID'
targetHandle: target
type: custom
zIndex: 0
è¿æ¥è§å:
- æ¯ä¸ªèç¹è³å¤æä¸ä¸ªå ¥è¾¹(start èç¹é¤å¤)
- èç¹å¯ä»¥æå¤ä¸ªåºè¾¹(if-else ç忝èç¹)
- æç»å¿ é¡»è¿æ¥å° answer èç¹æå ¶ä»è¾åºèç¹
sourceTypeåtargetTypeå¿ é¡»ä¸å®é èç¹ç±»åå¹é
Position åæ å¸å±
æ¨èå¸å±:
- èµ·å§ X: 100
- èç¹é´è· X: 300-400
- Y åæ : ä¿æå¨å䏿°´å¹³çº¿(300)ææ ¹æ®åæ¯éå½è°æ´
- 忝èç¹çåèç¹ Y åæ : ±150
示ä¾å¸å±:
Start(100,300) â LLM(400,300) â Code(700,300) â Answer(1000,300)
忝å¸å±:
â Branch1(1100,150)
If-Else(800,300) â
â Branch2(1100,450)
çæå·¥ä½æµæ¥éª¤
1. éæ±åæ
- çè§£ç¨æ·çä¸å¡éæ±
- ç¡®å®å·¥ä½æµç±»å(chatflow/workflow/agent)
- è¯å«æéçèç¹ç±»å
- è§åå¤çæµç¨
2. èç¹è®¾è®¡
- 设计å¼å§èç¹çè¾å ¥åé
- è§å LLM èç¹çæç¤ºè¯
- ç¡®å®ä»£ç æ§è¡é»è¾
- é ç½® HTTP 请æ±åæ°
- 设计è¾åºæ ¼å¼
3. æµç¨è¿æ¥
- 建ç«èç¹é´çé»è¾å ³ç³»
- é ç½®åéä¼ é
- å¤çæ¡ä»¶åæ¯
- ç¡®ä¿æµç¨éç¯
4. DSL çæ
- çæç¬¦åè§èç YAML æ ¼å¼
- é ç½®å¯ä¸çèç¹ ID
- 设置åççåæ ä½ç½®
- æ·»å å¿ è¦çä¾èµæä»¶
5. éªè¯æ£æ¥
- æ£æ¥ YAML æ ¼å¼æ£ç¡®æ§
- éªè¯åéå¼ç¨å®æ´æ§
- 确认èç¹è¿æ¥åçæ§
- æ£æ¥å¿ å¡«åæ®µå®æ´æ§
å®é æ¡ä¾å¦ä¹
åºäº 86+ çå®å·¥ä½æµæ¡ä¾çå¦ä¹ æ»ç»:
æ¡ä¾1: å¾ç OCR è¯å«å·¥ä½æµ
éæ±: ä¸ä¼ å¾ç â OCR è¯å« â æåæå
èç¹æµç¨:
- Start(file input) â
- LLM(vision enabled, OCR) â
- Answer(display result)
å ³é®é ç½®:
- Start èç¹: type: file, allowed_file_types: [image]
- LLM èç¹: vision.enabled: true, vision.configs.variable_selector æåæä»¶åé
- ç³»ç»æç¤ºè¯: “ä» è¾åºè¯å«å°çå¾çä¸çæå信比
æ¡ä¾2: ææ¬çæ HTML 工使µ
éæ±: ææ¬æè¿° â çæHTML代ç â ä¿å为æä»¶
èç¹æµç¨:
- Start(text input) â
- LLM(generate HTML) â
- Parameter Extractor(extract HTML code) â
- Tool(md_exporter, save file) â
- Answer(return file URL)
å ³é®é ç½®:
- LLM æç¤ºè¯: “çæ HTML ç¨åºï¼ä» è¾åº HTML ä»£ç ”
- Parameter Extractor: æå HTML 代ç å
- Tool: ä½¿ç¨ md_exporter æä»¶ä¿åæä»¶
æ¡ä¾3: æ°æ®æ¥è¯¢å¯è§å工使µ
éæ±: ç¨æ·é®é¢ â SQL æ¥è¯¢ â å¾è¡¨å±ç¤º
èç¹æµç¨:
- Start(query input) â
- LLM(generate SQL) â
- HTTP Request(database API) â
- Code(format data) â
- LLM(generate chart HTML) â
- Answer(display chart)
å ³é®é ç½®:
- LLM1: Text-to-SQL çæ
- HTTP: è°ç¨æ°æ®åºæ¥è¯¢ API
- Code: æ ¼å¼å JSON æ°æ®ä¸ºå¾è¡¨æ°æ®æ ¼å¼
- LLM2: çæ ECharts/Chart.js HTML
æ¡ä¾4: AI Agent 工使µ
éæ±: å¤æä»»å¡ â Agent èªä¸»è§å â è°ç¨å·¥å · â è¿åç»æ
èç¹æµç¨:
- Start(task input) â
- LLM(reasoning, with tools) â
- Multiple Tool nodes(parallel) â
- Variable Aggregator(collect results) â
- LLM(summarize) â
- Answer(final response)
å ³é®é ç½®:
- mode: agent-chat
- LLM é ç½®: å¯ç¨å¤ä¸ª tool
- Tool å¹¶è¡æ§è¡: å¤ä¸ª edges ä» LLM æåä¸å Tool
- Variable Aggregator: èåå¤ä¸ª Tool çè¾åº
å¸¸ç¨æç¤ºè¯æ¨¡æ¿
Text-to-SQL
ä½ æ¯ä¸ä¸ªä¸ä¸ç SQL ä¸å®¶ãæ ¹æ®ç¨æ·çèªç¶è¯è¨é®é¢çæåç¡®ç SQL æ¥è¯¢è¯å¥ã
æ°æ®åºschema:
{{#æ°æ®åºç»æ#}}
ç¨æ·é®é¢: {{#sys.query#}}
è¦æ±:
1. åªè¾åº SQL è¯å¥ï¼ä¸è¦æå
¶ä»è¯´æ
2. ç¡®ä¿ SQL è¯æ³æ£ç¡®
3. 使ç¨åéç JOIN å WHERE æ¡ä»¶
æ°æ®æå
ä»ä»¥ä¸ææ¬ä¸æåæå®ä¿¡æ¯:
ææ¬å
容:
{{#è¾å
¥ææ¬#}}
æåè¦æ±:
- æåæææ¥æ
- æåææäººå
- æåææéé¢
以 JSON æ ¼å¼è¾åº:
{
"dates": [],
"names": [],
"amounts": []
}
HTML çæ
æ ¹æ®ç¨æ·éæ±çæå®æ´ç HTML 页é¢ã
éæ±: {{#ç¨æ·éæ±#}}
è¦æ±:
1. çæå®æ´ç HTML ææ¡£
2. å
å«å¿
è¦ç CSS æ ·å¼
3. æ·»å å¿
è¦ç JavaScript 交äº
4. ç¡®ä¿ä»£ç æ ¼å¼è§è
5. åªè¾åº HTML 代ç ï¼ä¸è¦ markdown 代ç åæ è®°
注æäºé¡¹
å¿ é¡»éµå®çè§å
- å¯ä¸IDçæ: æ¯ä¸ªèç¹å¿
é¡»æå¯ä¸ç ID(å»ºè®®ä½¿ç¨æ¶é´æ³:
1747991890414) - åéå¼ç¨æ ¼å¼: å¿
须使ç¨
{{#èç¹ID.åéå#}}æ ¼å¼ - èç¹ç±»åå¹é : edges ä¸ç sourceType å targetType å¿ é¡»ä¸èç¹å®é ç±»åä¸è´
- å¿ å¡«åæ®µ: ä¸è½çç¥ YAML ä¸çå¿ å¡«åæ®µ
- YAMLæ ¼å¼: ä¸¥æ ¼éµå¾ª YAML 缩è¿è§è(2ç©ºæ ¼)
常è§é误é¿å
-
â åéå¼ç¨é误:
{{èç¹ID.åé}}â æ£ç¡®æ ¼å¼:{{#èç¹ID.åé#}} -
â 缺å°èç¹è¿æ¥: èç¹å¤ç«æªè¿æ¥ â ç¡®ä¿ææèç¹é½å¨ edges ä¸æè¿æ¥å ³ç³»
-
â ID éå¤: å¤ä¸ªèç¹ä½¿ç¨ç¸å ID â æ¯ä¸ªèç¹ä½¿ç¨å¯ä¸ ID
-
â Position éå : å¤ä¸ªèç¹åæ ç¸å â åçè§åèç¹ä½ç½®ï¼é¿å éå
-
â ä¾èµç¼ºå¤±: ä½¿ç¨æä»¶ä½æªå¨ dependencies ä¸å£°æ â ä½¿ç¨æä»¶æ¶å¿ 须添å 对åºç dependency
è¾åºæ ¼å¼
çæç DSL æä»¶å¿ é¡»æ¯å®æ´çãå¯ç´æ¥å¯¼å ¥ Dify ç YAML æ ¼å¼:
app:
# App é
ç½®
dependencies:
# ä¾èµå表
kind: app
version: 0.3.0
workflow:
conversation_variables: []
environment_variables: []
features:
# åè½é
ç½®
graph:
edges:
# è¿æ¥å
³ç³»
nodes:
# èç¹å®ä¹
è´¨éæ å
åæ ¼æ å(å¿ è¾¾)
- â YAML æ ¼å¼æ£ç¡®ï¼å¯ä»¥è¢«è§£æ
- â å å«å®æ´ç appãdependenciesãworkflow é ç½®
- â è³å°å å« start å answer èç¹
- â èç¹é´ææ£ç¡®çè¿æ¥å ³ç³»
- â åéå¼ç¨æ ¼å¼æ£ç¡®
- â ææå¿ å¡«åæ®µå®æ´
ä¼ç§æ å(建议)
- ð æç¤ºè¯è®¾è®¡ä¸ä¸ï¼ç¬¦åä¸å¡éæ±
- ð èç¹å¸å±ç¾è§ï¼é»è¾æ¸ æ°
- ð å å«éå½çé误å¤ç(if-else 夿)
- ð 使ç¨åéçæä»¶æååè½
- ð ä»£ç æ§è¡èç¹å¥å£®æ§å¼º
- ð åéå½åè¯ä¹å
触åå ³é®è¯
èªå¨è§¦å dify-dsl-generator skill çå ³é®è¯:
- “çæ Dify 工使µ”
- “å建 Dify DSL”
- “Dify YML æä»¶”
- “工使µé ç½®æä»¶”
æ´æ°æ¥å¿
v1.0.0 (2025-11-22)
- â åå§çæ¬
- â åºäº 86+ ç宿¡ä¾å¦ä¹
- â æ¯æææä¸»è¦èç¹ç±»å
- â 宿´ç DSL çæè½å
- â æºè½èç¹è¿æ¥
- â è§èæ ¼å¼è¾åº
ææ¯æ¯æ
åèèµæº:
- Dify GitHub: https://github.com/langgenius/dify
- DSL æ¡ä¾ä»åº: https://github.com/wwwzhouhui/dify-for-dsl
- Dify 宿¹ææ¡£: https://docs.dify.ai