diff --git a/01-workflow/text-at-level.dify.yml b/01-workflow/text-at-level.dify.yml new file mode 100644 index 0000000..1273de8 --- /dev/null +++ b/01-workflow/text-at-level.dify.yml @@ -0,0 +1,254 @@ +app: + description: '' + icon: 🤖 + icon_background: '#FFEAD5' + icon_type: emoji + mode: workflow + name: Text at level + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/openai:1.0.5@51583313a5988d5dca405063831ffeeacdc1f2e95f32a8c10b4c281ceef39ebb + version: null +kind: app +version: 0.7.0 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + allowed_file_extensions: + - .JPG + - .JPEG + - .PNG + - .GIF + - .WEBP + - .SVG + allowed_file_types: + - image + allowed_file_upload_methods: + - local_file + - remote_url + enabled: false + fileUploadConfig: + attachment_image_file_size_limit: 2 + audio_file_size_limit: 50 + batch_count_limit: 5 + file_size_limit: 15 + file_upload_limit: 50 + image_file_batch_limit: 10 + image_file_size_limit: 10 + knowledge_file_size_limit: 50 + single_chunk_attachment_limit: 10 + skill_file_size_limit: 50 + video_file_size_limit: 100 + workflow_file_upload_limit: 10 + image: + enabled: false + number_limits: 3 + transfer_methods: + - local_file + - remote_url + number_limits: 3 + opening_statement: '' + retriever_resource: + enabled: true + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + graph: + edges: + - data: + isInIteration: false + isInLoop: false + sourceType: start + targetType: llm + id: 1789938975576--1789939221760-target + source: '1789938975576' + sourceHandle: source + target: '1789939221760' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: llm + id: 1789939221760--1789939284953-target + source: '1789939221760' + sourceHandle: source + target: '1789939284953' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: end + id: 1789939284953--1789939323209-target + source: '1789939284953' + sourceHandle: source + target: '1789939323209' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + selected: false + title: User Input + type: start + variables: + - default: '' + hint: '' + label: The text you want to adapt + max_length: 5000 + options: [] + placeholder: '' + required: true + type: paragraph + variable: text + - hint: '' + label: Level + options: + - year 6 + - year 7 + - year 9 + - year 12 + placeholder: '' + required: true + type: select + variable: level + height: 134 + id: '1789938975576' + position: + x: 80 + y: 282 + positionAbsolute: + x: 80 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + context: + enabled: false + variable_selector: [] + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: f40476ac-a09a-4e92-b358-695f89703c7a + role: system + text: 'Rewrite the text below so that a student at this level can read it. + Keep all the factual content. Do not replace technical terms, but explain + them in a subordinate clause. Write short sentences. + + Level: {{#1789938975576.level#}} + + Text: {{#1789938975576.text#}}' + selected: false + title: LLM + type: llm + vision: + enabled: false + height: 87 + id: '1789939221760' + position: + x: 382 + y: 282 + positionAbsolute: + x: 382 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + context: + enabled: false + variable_selector: [] + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: 99018d18-8dd6-47d0-80b8-99d56108f7e0 + role: system + text: 'Write three comprehension questions about the text below. Question + 1 is about a fact in the text, question 2 about the main idea, question + 3 asks the student to apply something. Do not give answers. + + Text: {{#1789939221760.text#}}' + selected: false + title: LLM 2 + type: llm + vision: + enabled: false + height: 87 + id: '1789939284953' + position: + x: 684 + y: 282 + positionAbsolute: + x: 684 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + outputs: + - value_selector: + - '1789939221760' + - text + value_type: string + variable: rewritten_text + - value_selector: + - '1789939284953' + - text + value_type: string + variable: questions + selected: false + title: Output + type: end + height: 114 + id: '1789939323209' + position: + x: 986 + y: 282 + positionAbsolute: + x: 986 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + viewport: + x: -877.9220779220777 + y: 85.78808995882173 + zoom: 1.4254038644282545 + rag_pipeline_variables: [] diff --git a/02-agent-knowledge-base/school-guide-assistant.dify.yml b/02-agent-knowledge-base/school-guide-assistant.dify.yml new file mode 100644 index 0000000..2fad491 --- /dev/null +++ b/02-agent-knowledge-base/school-guide-assistant.dify.yml @@ -0,0 +1,122 @@ +app: + description: '' + icon: 🤖 + icon_background: '#FFEAD5' + icon_type: emoji + mode: agent-chat + name: School guide assistant + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/openai:1.0.5@51583313a5988d5dca405063831ffeeacdc1f2e95f32a8c10b4c281ceef39ebb + version: null +kind: app +model_config: + agent_mode: + enabled: true + max_iteration: 10 + prompt: null + strategy: function_call + tools: [] + annotation_reply: + enabled: false + chat_prompt_config: + prompt: + - role: system + text: '' + completion_prompt_config: + conversation_histories_role: + assistant_prefix: '' + user_prefix: '' + prompt: + text: '' + dataset_configs: + datasets: + datasets: + - dataset: + enabled: true + id: 368e0cf3-6774-459c-9beb-0479aa6f72b5 + reranking_enable: true + reranking_mode: reranking_model + reranking_model: + reranking_model_name: qwen3-rerank + reranking_provider_name: langgenius/tongyi/tongyi + retrieval_model: multiple + top_k: 4 + dataset_query_variable: '' + external_data_tools: [] + file_upload: + allowed_file_extensions: + - .JPG + - .JPEG + - .PNG + - .GIF + - .WEBP + - .SVG + - .MP4 + - .MOV + - .MPEG + - .WEBM + allowed_file_types: [] + allowed_file_upload_methods: + - remote_url + - local_file + enabled: false + image: + detail: high + enabled: false + number_limits: 3 + transfer_methods: + - remote_url + - local_file + number_limits: 3 + model: + completion_params: + stop: [] + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + more_like_this: + enabled: false + opening_statement: '' + pre_prompt: 'You are the school guide assistant of Example College. You answer questions + from parents and students about the school rules. + + + Rules: + + - Base your answer only on the school guide in your knowledge base. + + - If the answer is not in the school guide, say honestly that you do not know + and refer to reception. + + - Answer briefly and in plain English, at most five sentences. + + - Where possible, name the chapter of the school guide the answer comes from. + + + Reception mode: if a staff member starts with "Reception:" and then pastes a question + from a parent, you write the reply that the staff member can send to that parent. + Then follow the style guide in your knowledge base: address the parent formally, + reading level B1, no abbreviations, no words from the list of words to avoid, + at most six sentences, and end with a way to get in touch. If you do not know + the answer from the school guide, write a short message saying you will check + and put [FILL IN] where the staff member must add the real answer.' + prompt_type: simple + retriever_resource: + enabled: true + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + user_input_form: [] +version: 0.7.0 diff --git a/03-school-communication/parent-letter-assistant.dify.yml b/03-school-communication/parent-letter-assistant.dify.yml new file mode 100644 index 0000000..678d686 --- /dev/null +++ b/03-school-communication/parent-letter-assistant.dify.yml @@ -0,0 +1,121 @@ +app: + description: '' + icon: 🤖 + icon_background: '#FFEAD5' + icon_type: emoji + mode: agent-chat + name: Parent letter assistant + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/openai:1.0.5@51583313a5988d5dca405063831ffeeacdc1f2e95f32a8c10b4c281ceef39ebb + version: null +kind: app +model_config: + agent_mode: + enabled: true + max_iteration: 10 + prompt: null + strategy: function_call + tools: [] + annotation_reply: + enabled: false + chat_prompt_config: + prompt: + - role: system + text: '' + completion_prompt_config: + conversation_histories_role: + assistant_prefix: '' + user_prefix: '' + prompt: + text: '' + dataset_configs: + datasets: + datasets: + - dataset: + enabled: true + id: 368e0cf3-6774-459c-9beb-0479aa6f72b5 + reranking_enable: true + reranking_mode: reranking_model + reranking_model: + reranking_model_name: qwen3-rerank + reranking_provider_name: langgenius/tongyi/tongyi + retrieval_model: multiple + top_k: 4 + dataset_query_variable: '' + external_data_tools: [] + file_upload: + allowed_file_extensions: + - .JPG + - .JPEG + - .PNG + - .GIF + - .WEBP + - .SVG + - .MP4 + - .MOV + - .MPEG + - .WEBM + allowed_file_types: [] + allowed_file_upload_methods: + - remote_url + - local_file + enabled: false + image: + detail: high + enabled: false + number_limits: 3 + transfer_methods: + - remote_url + - local_file + number_limits: 3 + model: + completion_params: + stop: [] + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + more_like_this: + enabled: false + opening_statement: '' + pre_prompt: 'You are the parent letter assistant of Example College. Teachers, form + tutors and heads of year paste a draft letter or a few loose sentences, and you + turn it into a letter that parents understand at first reading. + + + Method: + + 1. Always consult the style guide in your knowledge base first. Apply the rules + on reading level B1, formal address, words to avoid, the structure of a parent + letter and the length. + + 2. If it is not clear who the letter is for (which class or year group) or what + the parent has to do, ask that first; do not guess. + + 3. First give the rewritten letter, with a subject line, and then under the heading + "What I changed" a list of at most five points, each with the rule from the style + guide it belongs to. + + 4. Do not invent dates, names or appointments that are not in the supplied text. + If something a parent needs to know is missing, put [FILL IN] in that place. + + 5. Be brief. No introduction, no compliment, no sign-off from you.' + prompt_type: simple + retriever_resource: + enabled: true + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + user_input_form: [] +version: 0.7.0 diff --git a/03-school-communication/school-news.dify.yml b/03-school-communication/school-news.dify.yml new file mode 100644 index 0000000..e45c26f --- /dev/null +++ b/03-school-communication/school-news.dify.yml @@ -0,0 +1,633 @@ +app: + description: '' + icon: 🤖 + icon_background: '#FFEAD5' + icon_type: emoji + mode: workflow + name: School news + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/openai:1.0.5@51583313a5988d5dca405063831ffeeacdc1f2e95f32a8c10b4c281ceef39ebb + version: null +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/tongyi:0.2.22@9cea96ffc7977f536c02999c80ff1283b1819aab9b6fa2fdf789d0c6c7d03715 + version: null +kind: app +version: 0.7.0 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + allowed_file_extensions: + - .JPG + - .JPEG + - .PNG + - .GIF + - .WEBP + - .SVG + allowed_file_types: + - image + allowed_file_upload_methods: + - local_file + - remote_url + enabled: false + fileUploadConfig: + attachment_image_file_size_limit: 2 + audio_file_size_limit: 50 + batch_count_limit: 5 + file_size_limit: 15 + file_upload_limit: 50 + image_file_batch_limit: 10 + image_file_size_limit: 10 + knowledge_file_size_limit: 50 + single_chunk_attachment_limit: 10 + skill_file_size_limit: 50 + video_file_size_limit: 100 + workflow_file_upload_limit: 10 + image: + enabled: false + number_limits: 3 + transfer_methods: + - local_file + - remote_url + number_limits: 3 + opening_statement: '' + retriever_resource: + enabled: true + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + graph: + edges: + - data: + isInIteration: false + isInLoop: false + sourceType: start + targetType: knowledge-retrieval + id: 1789970877464--1789971129095-target + source: '1789970877464' + sourceHandle: source + target: '1789971129095' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: knowledge-retrieval + targetType: llm + id: 1789971129095--1789971168021-target + source: '1789971129095' + sourceHandle: source + target: '1789971168021' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: llm + id: 1789971168021--1789971306805-target + source: '1789971168021' + sourceHandle: source + target: '1789971306805' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: llm + id: 1789971306805--1789971527769-target + source: '1789971306805' + sourceHandle: source + target: '1789971527769' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: llm + id: 1789971527769--1789974076229-target + source: '1789971527769' + sourceHandle: '' + target: '1789974076229' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: code + id: 1789974076229--1789974245797-target + source: '1789974076229' + sourceHandle: '' + target: '1789974245797' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: code + targetType: if-else + id: 1789974245797--1789974430545-target + source: '1789974245797' + sourceHandle: '' + target: '1789974430545' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: if-else + targetType: end + id: 1789974430545-true-1789974474578-target + source: '1789974430545' + sourceHandle: 'true' + target: '1789974474578' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: if-else + targetType: end + id: 1789974430545-false-1789974564321-target + source: '1789974430545' + sourceHandle: 'false' + target: '1789974564321' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + selected: false + title: User Input + type: start + variables: + - default: '' + hint: '' + label: What has happened or is going to happen? (who, what, where, when) + options: [] + placeholder: '' + required: true + type: paragraph + variable: core_message + - default: '' + hint: '' + label: 'For which class or year group? (or: whole school)' + options: [] + placeholder: '' + required: true + type: text-input + variable: year_group + - hint: '' + label: Which tone fits this message? + options: + - informative + - celebratory + - urgent + placeholder: '' + required: true + type: select + variable: tone + height: 160 + id: '1789970877464' + position: + x: 80 + y: 282 + positionAbsolute: + x: 80 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + dataset_ids: + - oTycHUKIxz5h9TqTOxYZojCNnbtTICvzVXxyCqucL8j6opdim+1j1Pa/ejwe91Qg + multiple_retrieval_config: + reranking_enable: true + reranking_mode: reranking_model + reranking_model: + model: qwen3-rerank + provider: langgenius/tongyi/tongyi + top_k: 4 + query_attachment_selector: [] + query_variable_selector: + - '1789970877464' + - core_message + retrieval_mode: multiple + selected: false + title: Knowledge Retrieval + type: knowledge-retrieval + height: 89 + id: '1789971129095' + position: + x: 382 + y: 282 + positionAbsolute: + x: 382 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + context: + enabled: true + variable_selector: + - '1789971129095' + - result + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: 8cfee75c-0407-46b1-bcec-b19c6bb59459 + role: system + text: 'Start your answer with the line WEBSITE followed by an empty line. + + + You write for Example College, a secondary school. Write a news item for + the website of at most 200 words. The headline is an active sentence of + at most eight words, without an exclamation mark. The first paragraph + answers who, what, where and when. End with a next step or a way to get + in touch. Stick strictly to the style guide below: reading level B1, formal + address for parents, words to avoid, names and photos of students. Adapt + to the chosen tone. Invent no facts. If something is missing, write [FILL + IN]. + + + Style guide: {{#context#}} + + + Year group: {{#1789970877464.year_group#}} + + Tone: {{#1789970877464.tone#}} + + Core message: {{#1789970877464.core_message#}}' + selected: false + title: Website + type: llm + vision: + enabled: false + height: 87 + id: '1789971168021' + position: + x: 684 + y: 282 + positionAbsolute: + x: 684 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + context: + enabled: true + variable_selector: + - '1789971129095' + - result + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: 6d05c2e0-dfe6-4cd7-8cb8-f527927ed86e + role: system + text: 'Start your answer with the line PARENT APP followed by an empty line. + + + You write for Example College, a secondary school. Write a message for + the parent app of at most 80 words: parents read this on their phone. + One message, one date, one action; no introduction and no headline. Address + parents formally. Stick strictly to the style guide below. Adapt to the + chosen tone. Invent no facts. If something is missing, write [FILL IN]. + + + Style guide: {{#context#}} + + + Year group: {{#1789970877464.year_group#}} + + Tone: {{#1789970877464.tone#}} + + Core message: {{#1789970877464.core_message#}}' + selected: false + title: Parent app + type: llm + vision: + enabled: false + height: 87 + id: '1789971306805' + position: + x: 986 + y: 282 + positionAbsolute: + x: 986 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + context: + enabled: true + variable_selector: + - '1789971129095' + - result + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: e86f1562-baba-4d04-b3f8-f47f4348b803 + role: system + text: 'Start your answer with the line SOCIAL followed by an empty line. + + + You write for Example College, a secondary school. Write a post for the + school''s social media (Instagram and LinkedIn) of at most 60 words. Warm + and concrete, no hype. End with at most three hashtags, always including + #ExampleCollege. No names of students and no reference to recognisable + photos of students. Stick to the style guide below. Adapt to the chosen + tone. Invent no facts. If something is missing, write [FILL IN]. + + + Style guide: {{#context#}} + + + Year group: {{#1789970877464.year_group#}} + + Tone: {{#1789970877464.tone#}} + + Core message: {{#1789970877464.core_message#}}' + selected: false + title: Social + type: llm + vision: + enabled: false + height: 87 + id: '1789971527769' + position: + x: 1288 + y: 282 + positionAbsolute: + x: 1288 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + context: + enabled: true + variable_selector: + - '1789971129095' + - result + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: 46332227-30db-4baf-a45f-59440772a731 + role: system + text: 'You are the checker of Example College. Below is a draft message + for the parent app. Assess it on these points from the style guide: at + most 80 words; parents are addressed formally; one message, one date and + one action; no abbreviations and no words from the list of words to avoid; + no names of students; reading level B1 (short sentences, everyday words). + + + Work in two steps. Step 1: briefly name what is wrong (or write: nothing). + Step 2: give the improved version. Invent no facts; what is not in the + draft stays [FILL IN]. Do not remove facts, dates or times that are in + the draft; a deadline for signing up belongs to the action and stays. + Do not change digits into words. + + + As your answer give ONLY the improved text, without step 1, without a + heading and without explanation. If the draft is already good, return + it unchanged. + + + Style guide: {{#context#}} + + + Draft message: {{#1789971306805.text#}}' + selected: false + title: Checker + type: llm + vision: + enabled: false + height: 87 + id: '1789974076229' + position: + x: 1590 + y: 282 + positionAbsolute: + x: 1590 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + code: "def main(website: str, parent_app: str, social: str) -> dict:\n \ + \ reasons = []\n forbidden = [\"by means of\", \"with regard to\", \"\ + asap\", \"w.r.t.\", \"kindly\", \"parent(s)/carer(s)\", \"utilise\"]\n \ + \ texts = ((\"website\", website, 230), (\"parent app\", parent_app, 90),\ + \ (\"social\", social, 70))\n for name, text, maximum in texts:\n \ + \ count = len(text.split())\n if count > maximum:\n \ + \ reasons.append(f\"{name}: {count} words, maximum {maximum}\")\n \ + \ if \"[FILL IN]\" in text:\n reasons.append(f\"{name}: contains\ + \ [FILL IN], information is missing\")\n for word in forbidden:\n\ + \ if word in text.lower():\n reasons.append(f\"\ + {name}: contains the word to avoid '{word.strip()}'\")\n if \"#examplecollege\"\ + \ not in social.lower():\n reasons.append(\"social: #ExampleCollege\ + \ is missing\")\n return {\n \"ok\": 0 if reasons else 1,\n \ + \ \"reasons\": \"\\n\".join(reasons) if reasons else \"All rules satisfied.\"\ + ,\n }\n" + code_language: python3 + outputs: + ok: + children: null + type: number + reasons: + children: null + type: string + selected: false + title: Gatekeeper + type: code + variables: + - value_selector: + - '1789971168021' + - text + value_type: string + variable: website + - value_selector: + - '1789974076229' + - text + value_type: string + variable: parent_app + - value_selector: + - '1789971527769' + - text + value_type: string + variable: social + height: 51 + id: '1789974245797' + position: + x: 1892 + y: 282 + positionAbsolute: + x: 1892 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + cases: + - case_id: 'true' + conditions: + - comparison_operator: '=' + id: 905ee344-fc66-4bfd-91d0-773aa3a8ffe4 + value: '1' + varType: number + variable_selector: + - '1789974245797' + - ok + logical_operator: and + selected: false + title: IF/ELSE + type: if-else + height: 123 + id: '1789974430545' + position: + x: 2194 + y: 282 + positionAbsolute: + x: 2194 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + outputs: + - value_selector: + - '1789971168021' + - text + value_type: string + variable: website + - value_selector: + - '1789974076229' + - text + value_type: string + variable: parent_app + - value_selector: + - '1789971527769' + - text + value_type: string + variable: social + selected: false + title: Approved + type: end + height: 140 + id: '1789974474578' + position: + x: 2496 + y: 282 + positionAbsolute: + x: 2496 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + outputs: + - value_selector: + - '1789974245797' + - reasons + value_type: string + variable: rejected_because + - value_selector: + - '1789971168021' + - text + value_type: string + variable: draft_website + - value_selector: + - '1789974076229' + - text + value_type: string + variable: draft_parent_app + - value_selector: + - '1789971527769' + - text + value_type: string + variable: draft_social + selected: false + title: To the communications officer + type: end + height: 166 + id: '1789974564321' + position: + x: 2496 + y: 461 + positionAbsolute: + x: 2496 + y: 461 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + viewport: + x: -679.6126274026951 + y: 109.12408509473971 + zoom: 0.4152130788699637 + rag_pipeline_variables: [] diff --git a/05-transcription-tool/transcription-tool.dify.yml b/05-transcription-tool/transcription-tool.dify.yml new file mode 100644 index 0000000..011cd5b --- /dev/null +++ b/05-transcription-tool/transcription-tool.dify.yml @@ -0,0 +1,380 @@ +app: + description: '' + icon: 🤖 + icon_background: '#FFEAD5' + icon_type: emoji + mode: workflow + name: Transcription tool + use_icon_as_answer_icon: false +dependencies: +- current_identifier: null + type: marketplace + value: + marketplace_plugin_unique_identifier: langgenius/openai:1.0.5@51583313a5988d5dca405063831ffeeacdc1f2e95f32a8c10b4c281ceef39ebb + version: null +kind: app +version: 0.7.0 +workflow: + conversation_variables: [] + environment_variables: [] + features: + file_upload: + allowed_file_extensions: + - .JPG + - .JPEG + - .PNG + - .GIF + - .WEBP + - .SVG + allowed_file_types: + - image + allowed_file_upload_methods: + - local_file + - remote_url + enabled: false + fileUploadConfig: + attachment_image_file_size_limit: 2 + audio_file_size_limit: 50 + batch_count_limit: 5 + file_size_limit: 15 + file_upload_limit: 50 + image_file_batch_limit: 10 + image_file_size_limit: 10 + knowledge_file_size_limit: 50 + single_chunk_attachment_limit: 10 + skill_file_size_limit: 50 + video_file_size_limit: 100 + workflow_file_upload_limit: 10 + image: + enabled: false + number_limits: 3 + transfer_methods: + - local_file + - remote_url + number_limits: 3 + opening_statement: '' + retriever_resource: + enabled: true + sensitive_word_avoidance: + enabled: false + speech_to_text: + enabled: false + suggested_questions: [] + suggested_questions_after_answer: + enabled: false + text_to_speech: + enabled: false + language: '' + voice: '' + graph: + edges: + - data: + isInIteration: false + isInLoop: false + sourceType: start + targetType: tool + id: 1789973195460--1789973681972-target + source: '1789973195460' + sourceHandle: '' + target: '1789973681972' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: tool + targetType: llm + id: 1789973681972--1789973772088-target + source: '1789973681972' + sourceHandle: '' + target: '1789973772088' + targetHandle: target + type: custom + zIndex: 0 + - data: + isInIteration: false + isInLoop: false + sourceType: llm + targetType: end + id: 1789973772088--1789973899206-target + source: '1789973772088' + sourceHandle: '' + target: '1789973899206' + targetHandle: target + type: custom + zIndex: 0 + nodes: + - data: + selected: false + title: User Input + type: start + variables: + - allowed_file_extensions: [] + allowed_file_types: + - audio + allowed_file_upload_methods: + - local_file + default: '' + hide: false + hint: '' + label: Recording of the meeting (mp3, m4a or wav) + options: [] + placeholder: '' + required: true + type: file + variable: recording + height: 108 + id: '1789973195460' + position: + x: 80 + y: 282 + positionAbsolute: + x: 80 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + zIndex: 0 + - data: + is_team_authorization: true + paramSchemas: + - auto_generate: null + default: null + form: llm + human_description: + en_US: The audio file to be converted. + ja_JP: The audio file to be converted. + pt_BR: The audio file to be converted. + zh_Hans: 要转换的音频文件。 + input_schema: null + label: + en_US: Audio File + ja_JP: Audio File + pt_BR: Audio File + zh_Hans: 音频文件 + llm_description: The audio file to be converted. + max: null + min: null + multiple: false + name: audio_file + options: [] + placeholder: null + precision: null + required: true + scope: null + template: null + type: file + - auto_generate: null + default: null + form: form + human_description: + en_US: All available ASR models. You can config model in the Model Provider + of Settings. + ja_JP: All available ASR models. You can config model in the Model Provider + of Settings. + pt_BR: All available ASR models. You can config model in the Model Provider + of Settings. + zh_Hans: 所有可用的 ASR 模型。你可以在设置中的模型供应商里配置。 + input_schema: null + label: + en_US: Model + ja_JP: Model + pt_BR: Model + zh_Hans: Model + llm_description: null + max: null + min: null + multiple: false + name: model + options: + - icon: null + label: + en_US: gpt-4o-mini-transcribe-2025-12-15(langgenius/openai/openai) + ja_JP: gpt-4o-mini-transcribe-2025-12-15(langgenius/openai/openai) + pt_BR: gpt-4o-mini-transcribe-2025-12-15(langgenius/openai/openai) + zh_Hans: gpt-4o-mini-transcribe-2025-12-15(langgenius/openai/openai) + value: langgenius/openai/openai#gpt-4o-mini-transcribe-2025-12-15 + - icon: null + label: + en_US: gpt-4o-mini-transcribe(langgenius/openai/openai) + ja_JP: gpt-4o-mini-transcribe(langgenius/openai/openai) + pt_BR: gpt-4o-mini-transcribe(langgenius/openai/openai) + zh_Hans: gpt-4o-mini-transcribe(langgenius/openai/openai) + value: langgenius/openai/openai#gpt-4o-mini-transcribe + - icon: null + label: + en_US: gpt-4o-transcribe-diarize(langgenius/openai/openai) + ja_JP: gpt-4o-transcribe-diarize(langgenius/openai/openai) + pt_BR: gpt-4o-transcribe-diarize(langgenius/openai/openai) + zh_Hans: gpt-4o-transcribe-diarize(langgenius/openai/openai) + value: langgenius/openai/openai#gpt-4o-transcribe-diarize + - icon: null + label: + en_US: gpt-4o-transcribe(langgenius/openai/openai) + ja_JP: gpt-4o-transcribe(langgenius/openai/openai) + pt_BR: gpt-4o-transcribe(langgenius/openai/openai) + zh_Hans: gpt-4o-transcribe(langgenius/openai/openai) + value: langgenius/openai/openai#gpt-4o-transcribe + - icon: null + label: + en_US: whisper-1(langgenius/openai/openai) + ja_JP: whisper-1(langgenius/openai/openai) + pt_BR: whisper-1(langgenius/openai/openai) + zh_Hans: whisper-1(langgenius/openai/openai) + value: langgenius/openai/openai#whisper-1 + placeholder: null + precision: null + required: true + scope: null + template: null + type: select + params: + audio_file: '' + model: '' + plugin_id: null + plugin_unique_identifier: '' + provider_icon: https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/audio/icon + provider_id: audio + provider_name: audio + provider_show_name: Audio + provider_type: builtin + selected: false + title: Speech To Text + tool_configurations: + model: + type: constant + value: langgenius/openai/openai#gpt-4o-transcribe-diarize + tool_description: Convert audio file to text. + tool_label: Speech To Text + tool_name: asr + tool_node_version: '2' + tool_parameters: + audio_file: + type: variable + value: + - '1789973195460' + - recording + type: tool + height: 87 + id: '1789973681972' + position: + x: 382 + y: 282 + positionAbsolute: + x: 382 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + context: + enabled: false + variable_selector: [] + model: + completion_params: {} + mode: chat + name: gpt-5-mini + provider: langgenius/openai/openai + prompt_template: + - id: fc3c9e64-5361-4d05-9d64-1704260d1ee7 + role: system + text: 'Start your answer with the line # MINUTES followed by an empty line. + + + You write the minutes of a meeting at a school, based on the transcript + below. The transcript comes from automatic speech recognition and may + contain errors in names and numbers; write down what is most likely and + put a question mark in brackets after anything you are not sure of. + + + Write in English, businesslike and brief. Use exactly this structure with + these headings: + + + ## Meeting + + One line: which meeting, date, those present (if the transcript shows + it). + + + ## Summary + + At most five sentences about what was discussed. + + + ## Decisions + + Numbered list. Only what was really decided, no intentions. + + + ## Action points + + Table with columns: What, Who, When. If no date is given, write "not mentioned". + + + ## Deferred + + Items deliberately moved to a later meeting, with the reason. + + + Leave out side tracks and informal remarks. Invent nothing that is not + in the transcript. + + + Transcript: {{#1789973681972.text#}}' + selected: false + title: Minutes + type: llm + vision: + enabled: false + height: 87 + id: '1789973772088' + position: + x: 684 + y: 282 + positionAbsolute: + x: 684 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + - data: + outputs: + - value_selector: + - '1789973772088' + - text + value_type: string + variable: minutes + - value_selector: + - '1789973681972' + - text + value_type: string + variable: transcript + selected: false + title: Output + type: end + height: 114 + id: '1789973899206' + position: + x: 986 + y: 282 + positionAbsolute: + x: 986 + y: 282 + selected: false + sourcePosition: right + targetPosition: left + type: custom + width: 242 + viewport: + x: -21.72663921444405 + y: 9.100411783338643 + zoom: 0.9613557174532783 + rag_pipeline_variables: [] diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dd546a..16e431b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This is what changed per release. ## 2026-09-20, English screenshots - Guides 01, 02, 03 and 07 rebuilt with the English Dify interface and English apps (Text at level, School guide assistant, Parent letter assistant, School news with checks; links in the README). The other guides follow. +- Every Studio app as a `.dify.yml` file in its guide's folder, to import via Studio, Create, Import DSL file. Instructions in the README. - New appendix 00-self-hosting: running Dify Community Edition yourself with Docker (Windows, Mac, Linux). ## 2026-09-20, first release diff --git a/README.md b/README.md index 6602250..917c841 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,30 @@ The apps are live to try out: - Materials check (06; Dutch build): https://udify.app/agent/lkWKedkSW2d3nqBV - Study coach biology (08; Dutch build): https://udify.app/chat/fP0TJW3s8IXOj9BO +## Installing the apps in your own Dify + +Every Studio app is also in its guide's folder as a file: `.dify.yml`. That is Dify's DSL +export. This is how you put it in your own workspace (online or self-hosted): + +1. Download the `.dify.yml` file from the folder. +2. In Dify go to **Studio**, click **Create** and choose **Import DSL file**. +3. Drag the file into the window and click **Create**. +4. At every LLM step pick your own model (the export refers to gpt-5-mini via OpenAI) and under + **Knowledge** attach your own knowledge base; that does not travel with the file. Create it + first with the sample document from the same folder (guide 02, steps 1 to 5). +5. **Publish**. + +The files contain no keys. The Agent Console apps of 04 and 06 have no export (yet); you build +those with the guide. + +| File | Guide | +| --- | --- | +| 01-workflow/text-at-level.dify.yml | 01 | +| 02-agent-knowledge-base/school-guide-assistant.dify.yml | 02 (including the Reception mode from 03) | +| 03-school-communication/parent-letter-assistant.dify.yml | 03 | +| 03-school-communication/school-news.dify.yml | 03 and 07 (version 2, with Checker and Gatekeeper) | +| 05-transcription-tool/transcription-tool.dify.yml | 05 | + ## Building or editing yourself Every folder has the same structure: