--- title: '10-Minute Guide to Building Dify Plugins' description: 'Learn how to build a functional Dify plugin that connects with Flomo note-taking service in just 10 minutes' language: en standard_title: 10-Minute Guide to Building Dify Plugins --- ## What you'll build By the end of this guide, you'll have created a Dify plugin that: - Connects to the Flomo note-taking API - Allows users to save notes from AI conversations directly to Flomo - Handles authentication and error states properly - Is ready for distribution in the Dify Marketplace 10 minutes Basic Python knowledge and a Flomo account ## Step 1: Install the Dify CLI and create a project ```bash brew tap langgenius/dify brew install dify ``` Get the latest Dify CLI from the [Dify GitHub releases page](https://github.com/langgenius/dify-plugin-daemon/releases) ```bash # Download appropriate version chmod +x dify-plugin-linux-amd64 mv dify-plugin-linux-amd64 dify sudo mv dify /usr/local/bin/ ``` Verify installation: ```bash dify version ``` Create a new plugin project using: ```bash dify plugin init ``` Follow the prompts to set up your plugin: - Name it "flomo" - Select "tool" as the plugin type - Complete other required fields ```bash cd flomo ``` This will create the basic structure for your plugin with all necessary files. ## Step 2: Define your plugin manifest The manifest.yaml file defines your plugin's metadata, permissions, and capabilities. Create a `manifest.yaml` file: ```yaml version: 0.0.4 type: plugin author: yourname label: en_US: Flomo zh_Hans: Flomo 浮墨笔记 created_at: "2023-10-01T00:00:00Z" icon: icon.png resource: memory: 67108864 # 64MB permission: storage: enabled: false plugins: tools: - flomo.yaml meta: version: 0.0.1 arch: - amd64 - arm64 runner: language: python version: 3.12 entrypoint: main ``` ## Step 3: Create the tool definition Create a `flomo.yaml` file to define your tool interface: ```yaml identity: author: yourname name: flomo label: en_US: Flomo Note zh_Hans: Flomo 浮墨笔记 description: human: en_US: Add notes to your Flomo account directly from Dify. zh_Hans: 直接从Dify添加笔记到您的Flomo账户。 llm: > A tool that allows users to save notes to Flomo. Use this tool when users want to save important information from the conversation. The tool accepts a 'content' parameter that contains the text to be saved as a note. credential_schema: api_url: type: string required: true label: en_US: API URL zh_Hans: API URL human_description: en_US: Flomo API URL from your Flomo account settings. zh_Hans: 从您的Flomo账户设置中获取的API URL。 tool_schema: content: type: string required: true label: en_US: Note Content zh_Hans: 笔记内容 human_description: en_US: Content to save as a note in Flomo. zh_Hans: 要保存为Flomo笔记的内容。 ``` ## Step 4: Implement core utility functions Create a utility module in `utils/flomo_utils.py` for API interaction: ```python utils/flomo_utils.py import requests def send_flomo_note(api_url: str, content: str) -> None: """ Send a note to Flomo via the API URL. Raises requests.RequestException on network errors, and ValueError on invalid status codes or input. """ api_url = api_url.strip() if not api_url: raise ValueError("API URL is required and cannot be empty.") if not api_url.startswith('https://flomoapp.com/iwh/'): raise ValueError( "API URL should be in the format: https://flomoapp.com/iwh/{token}/{secret}/" ) if not content: raise ValueError("Content cannot be empty.") headers = {'Content-Type': 'application/json'} response = requests.post(api_url, json={"content": content}, headers=headers, timeout=10) if response.status_code != 200: raise ValueError(f"API URL is not valid. Received status code: {response.status_code}") ``` ## Step 5: Implement the Tool Provider The Tool Provider handles credential validation. Create `provider/flomo.py`: ```python provider/flomo.py from typing import Any from dify_plugin import ToolProvider from dify_plugin.errors.tool import ToolProviderCredentialValidationError import requests from utils.flomo_utils import send_flomo_note class FlomoProvider(ToolProvider): def _validate_credentials(self, credentials: dict[str, Any]) -> None: try: api_url = credentials.get('api_url', '').strip() # Use utility for validation and sending test note send_flomo_note(api_url, "Hello, #flomo https://flomoapp.com") except ValueError as e: raise ToolProviderCredentialValidationError(str(e)) except requests.RequestException as e: raise ToolProviderCredentialValidationError(f"Connection error: {str(e)}") ``` ## Step 6: Implement the Tool The Tool class handles actual API calls when the user invokes the plugin. Create `tools/flomo.py`: ```python tools/flomo.py from collections.abc import Generator from typing import Any from dify_plugin import Tool from dify_plugin.entities.tool import ToolInvokeMessage import requests from utils.flomo_utils import send_flomo_note class FlomoTool(Tool): def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]: content = tool_parameters.get("content", "") api_url = self.runtime.credentials.get("api_url", "") try: send_flomo_note(api_url, content) except ValueError as e: yield self.create_text_message(str(e)) return except requests.RequestException as e: yield self.create_text_message(f"Connection error: {str(e)}") return # Return success message and structured data yield self.create_text_message( "Note created successfully! Your content has been sent to Flomo." ) yield self.create_json_message({ "status": "success", "content": content, }) ``` Always handle exceptions gracefully and return user-friendly error messages. Remember that your plugin represents your brand in the Dify ecosystem. ## Step 7: Test your plugin Copy the example environment file: ```bash cp .env.example .env ``` Edit the `.env` file with your Dify environment details: ``` INSTALL_METHOD=remote REMOTE_INSTALL_HOST=debug-plugin.dify.dev REMOTE_INSTALL_PORT=5003 REMOTE_INSTALL_KEY=your_debug_key ``` You can find your debug key and host in the Dify dashboard: click the "Plugins" icon in the top right corner, then click the debug icon. In the pop-up window, copy the "API Key" and "Host Address". ```bash pip install -r requirements.txt python -m main ``` Your plugin will connect to your Dify instance in debug mode. In your Dify instance, navigate to plugins and find your debugging plugin (marked as "debugging"). Add your Flomo API credentials and test sending a note. ## Step 9: Package and distribute When you're ready to share your plugin: ```bash dify plugin package ./ ``` This creates a `plugin.difypkg` file you can upload to the Dify Marketplace. ## FAQ and Troubleshooting Make sure your `.env` file is properly configured and you're using the correct debug key. Double-check your Flomo API URL format. It should be in the form: `https://flomoapp.com/iwh/{token}/{secret}/` Ensure all required files are present and the manifest.yaml structure is valid. ## Summary You've built a functioning Dify plugin that connects with an external API service! This same pattern works for integrating with thousands of services - from databases and search engines to productivity tools and custom APIs. Write your README.md in English (en_US) describing functionality, setup, and usage examples Create additional README files like `readme/README_zh_Hans.md` for other languages Add a privacy policy (PRIVACY.md) if publishing your plugin Include comprehensive examples in documentation Test thoroughly with various document sizes and formats {/* Contributing Section DO NOT edit this section! It will be automatically generated by the script. */} --- [Edit this page](https://github.com/langgenius/dify-docs/edit/main/plugin-dev-en/0432-develop-flomo-plugin.mdx) | [Report an issue](https://github.com/langgenius/dify-docs/issues/new?template=docs.yml)