| @@ -1,23 +1,26 @@ | |||
| # Development with devcontainer | |||
| This project includes a devcontainer configuration that allows you to open the project in a container with a fully configured development environment. | |||
| Both frontend and backend environments are initialized when the container is started. | |||
| ## GitHub Codespaces | |||
| [](https://codespaces.new/langgenius/dify) | |||
| you can simply click the button above to open this project in GitHub Codespaces. | |||
| For more info, check out the [GitHub documentation](https://docs.github.com/en/free-pro-team@latest/github/developing-online-with-codespaces/creating-a-codespace#creating-a-codespace). | |||
| ## VS Code Dev Containers | |||
| [](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/langgenius/dify) | |||
| if you have VS Code installed, you can click the button above to open this project in VS Code Dev Containers. | |||
| You can learn more in the [Dev Containers documentation](https://code.visualstudio.com/docs/devcontainers/containers). | |||
| ## Pros of Devcontainer | |||
| Unified Development Environment: By using devcontainers, you can ensure that all developers are developing in the same environment, reducing the occurrence of "it works on my machine" type of issues. | |||
| Quick Start: New developers can set up their development environment in a few simple steps, without spending a lot of time on environment configuration. | |||
| @@ -25,11 +28,13 @@ Quick Start: New developers can set up their development environment in a few si | |||
| Isolation: Devcontainers isolate your project from your host operating system, reducing the chance of OS updates or other application installations impacting the development environment. | |||
| ## Cons of Devcontainer | |||
| Learning Curve: For developers unfamiliar with Docker and VS Code, using devcontainers may be somewhat complex. | |||
| Performance Impact: While usually minimal, programs running inside a devcontainer may be slightly slower than those running directly on the host. | |||
| ## Troubleshooting | |||
| if you see such error message when you open this project in codespaces: | |||
|  | |||
| @@ -17,27 +17,25 @@ diverse, inclusive, and healthy community. | |||
| Examples of behavior that contributes to a positive environment for our | |||
| community include: | |||
| * Demonstrating empathy and kindness toward other people | |||
| * Being respectful of differing opinions, viewpoints, and experiences | |||
| * Giving and gracefully accepting constructive feedback | |||
| * Accepting responsibility and apologizing to those affected by our mistakes, | |||
| - Demonstrating empathy and kindness toward other people | |||
| - Being respectful of differing opinions, viewpoints, and experiences | |||
| - Giving and gracefully accepting constructive feedback | |||
| - Accepting responsibility and apologizing to those affected by our mistakes, | |||
| and learning from the experience | |||
| * Focusing on what is best not just for us as individuals, but for the | |||
| - Focusing on what is best not just for us as individuals, but for the | |||
| overall community | |||
| Examples of unacceptable behavior include: | |||
| * The use of sexualized language or imagery, and sexual attention or | |||
| - The use of sexualized language or imagery, and sexual attention or | |||
| advances of any kind | |||
| * Trolling, insulting or derogatory comments, and personal or political attacks | |||
| * Public or private harassment | |||
| * Publishing others' private information, such as a physical or email | |||
| - Trolling, insulting or derogatory comments, and personal or political attacks | |||
| - Public or private harassment | |||
| - Publishing others' private information, such as a physical or email | |||
| address, without their explicit permission | |||
| * Other conduct which could reasonably be considered inappropriate in a | |||
| - Other conduct which could reasonably be considered inappropriate in a | |||
| professional setting | |||
| ## Language Policy | |||
| To facilitate clear and effective communication, all discussions, comments, documentation, and pull requests in this project should be conducted in English. This ensures that all contributors can participate and collaborate effectively. | |||
| @@ -1,8 +1,8 @@ | |||
| > [!IMPORTANT] | |||
| > | |||
| > 1. Make sure you have read our [contribution guidelines](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) | |||
| > 2. Ensure there is an associated issue and you have been assigned to it | |||
| > 3. Use the correct syntax to link this PR: `Fixes #<issue number>`. | |||
| > 1. Ensure there is an associated issue and you have been assigned to it | |||
| > 1. Use the correct syntax to link this PR: `Fixes #<issue number>`. | |||
| ## Summary | |||
| @@ -12,7 +12,7 @@ | |||
| | Before | After | | |||
| |--------|-------| | |||
| | ... | ... | | |||
| | ... | ... | | |||
| ## Checklist | |||
| @@ -47,7 +47,16 @@ jobs: | |||
| - name: Run Unit tests | |||
| run: | | |||
| uv run --project api bash dev/pytest/pytest_unit_tests.sh | |||
| - name: Run ty check | |||
| run: | | |||
| cd api | |||
| uv add --dev ty | |||
| uv run ty check || true | |||
| - name: Run pyrefly check | |||
| run: | | |||
| cd api | |||
| uv add --dev pyrefly | |||
| uv run pyrefly check || true | |||
| - name: Coverage Summary | |||
| run: | | |||
| set -x | |||
| @@ -4,10 +4,10 @@ This `launch.json.template` file provides various debug configurations for the D | |||
| ## How to Use | |||
| 1. **Create `launch.json`**: If you don't have one, create a file named `launch.json` inside the `.vscode` directory. | |||
| 2. **Copy Content**: Copy the entire content from `launch.json.template` into your newly created `launch.json` file. | |||
| 3. **Select Debug Configuration**: Go to the Run and Debug view in VS Code / Cursor (Ctrl+Shift+D or Cmd+Shift+D). | |||
| 4. **Start Debugging**: Select the desired configuration from the dropdown menu and click the green play button. | |||
| 1. **Create `launch.json`**: If you don't have one, create a file named `launch.json` inside the `.vscode` directory. | |||
| 1. **Copy Content**: Copy the entire content from `launch.json.template` into your newly created `launch.json` file. | |||
| 1. **Select Debug Configuration**: Go to the Run and Debug view in VS Code / Cursor (Ctrl+Shift+D or Cmd+Shift+D). | |||
| 1. **Start Debugging**: Select the desired configuration from the dropdown menu and click the green play button. | |||
| ## Tips | |||
| @@ -7,6 +7,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co | |||
| Dify is an open-source platform for developing LLM applications with an intuitive interface combining agentic AI workflows, RAG pipelines, agent capabilities, and model management. | |||
| The codebase consists of: | |||
| - **Backend API** (`/api`): Python Flask application with Domain-Driven Design architecture | |||
| - **Frontend Web** (`/web`): Next.js 15 application with TypeScript and React 19 | |||
| - **Docker deployment** (`/docker`): Containerized deployment configurations | |||
| @@ -46,6 +47,7 @@ pnpm test # Run Jest tests | |||
| ## Testing Guidelines | |||
| ### Backend Testing | |||
| - Use `pytest` for all backend tests | |||
| - Write tests first (TDD approach) | |||
| - Test structure: Arrange-Act-Assert | |||
| @@ -53,11 +55,13 @@ pnpm test # Run Jest tests | |||
| ## Code Style Requirements | |||
| ### Python | |||
| - Use type hints for all functions and class attributes | |||
| - No `Any` types unless absolutely necessary | |||
| - Implement special methods (`__repr__`, `__str__`) appropriately | |||
| ### TypeScript/JavaScript | |||
| ### TypeScript/JavaScript | |||
| - Strict TypeScript configuration | |||
| - ESLint with Prettier integration | |||
| - Avoid `any` type | |||
| @@ -73,10 +77,11 @@ pnpm test # Run Jest tests | |||
| ## Common Development Tasks | |||
| ### Adding a New API Endpoint | |||
| 1. Create controller in `/api/controllers/` | |||
| 2. Add service logic in `/api/services/` | |||
| 3. Update routes in controller's `__init__.py` | |||
| 4. Write tests in `/api/tests/` | |||
| 1. Add service logic in `/api/services/` | |||
| 1. Update routes in controller's `__init__.py` | |||
| 1. Write tests in `/api/tests/` | |||
| ## Project-Specific Conventions | |||
| @@ -34,11 +34,11 @@ Don't forget to link an existing issue or open a new issue in the PR's descripti | |||
| How we prioritize: | |||
| | Issue Type | Priority | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bugs in core functions (cloud service, cannot login, applications not working, security loopholes) | Critical | | |||
| | Non-critical bugs, performance boosts | Medium Priority | | |||
| | Minor fixes (typos, confusing but working UI) | Low Priority | | |||
| | Issue Type | Priority | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bugs in core functions (cloud service, cannot login, applications not working, security loopholes) | Critical | | |||
| | Non-critical bugs, performance boosts | Medium Priority | | |||
| | Minor fixes (typos, confusing but working UI) | Low Priority | | |||
| ### Feature requests | |||
| @@ -52,23 +52,25 @@ How we prioritize: | |||
| How we prioritize: | |||
| | Feature Type | Priority | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | High-Priority Features as being labeled by a team member | High Priority | | |||
| | Popular feature requests from our [community feedback board](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Medium Priority | | |||
| | Non-core features and minor enhancements | Low Priority | | |||
| | Valuable but not immediate | Future-Feature | | |||
| | Feature Type | Priority | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | High-Priority Features as being labeled by a team member | High Priority | | |||
| | Popular feature requests from our [community feedback board](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Medium Priority | | |||
| | Non-core features and minor enhancements | Low Priority | | |||
| | Valuable but not immediate | Future-Feature | | |||
| ## Submitting your PR | |||
| ### Pull Request Process | |||
| 1. Fork the repository | |||
| 2. Before you draft a PR, please create an issue to discuss the changes you want to make | |||
| 3. Create a new branch for your changes | |||
| 4. Please add tests for your changes accordingly | |||
| 5. Ensure your code passes the existing tests | |||
| 6. Please link the issue in the PR description, `fixes #<issue_number>` | |||
| 7. Get merged! | |||
| 1. Before you draft a PR, please create an issue to discuss the changes you want to make | |||
| 1. Create a new branch for your changes | |||
| 1. Please add tests for your changes accordingly | |||
| 1. Ensure your code passes the existing tests | |||
| 1. Please link the issue in the PR description, `fixes #<issue_number>` | |||
| 1. Get merged! | |||
| ### Setup the project | |||
| #### Frontend | |||
| @@ -82,12 +84,14 @@ For setting up the backend service, kindly refer to our detailed [instructions]( | |||
| #### Other things to note | |||
| We recommend reviewing this document carefully before proceeding with the setup, as it contains essential information about: | |||
| - Prerequisites and dependencies | |||
| - Installation steps | |||
| - Configuration details | |||
| - Common troubleshooting tips | |||
| Feel free to reach out if you encounter any issues during the setup process. | |||
| ## Getting Help | |||
| If you ever get stuck or get a burning question while contributing, simply shoot your queries our way via the related GitHub issue, or hop onto our [Discord](https://discord.gg/8Tpq4AcN9c) for a quick chat. | |||
| @@ -34,12 +34,11 @@ | |||
| 优先级划分: | |||
| | 问题类型 | 优先级 | | |||
| | -------------------------------------------------- | ---------- | | |||
| | 核心功能 bug(云服务、登录失败、应用无法使用、安全漏洞) | 紧急 | | |||
| | 非关键 bug、性能优化 | 中等优先级 | | |||
| | 小修复(拼写错误、界面混乱但可用) | 低优先级 | | |||
| | 问题类型 | 优先级 | | |||
| | -------------------------------------------------- | ---------- | | |||
| | 核心功能 bug(云服务、登录失败、应用无法使用、安全漏洞) | 紧急 | | |||
| | 非关键 bug、性能优化 | 中等优先级 | | |||
| | 小修复(拼写错误、界面混乱但可用) | 低优先级 | | |||
| ### 功能请求 | |||
| @@ -53,12 +52,12 @@ | |||
| 优先级划分: | |||
| | 功能类型 | 优先级 | | |||
| | -------------------------------------------------- | ---------- | | |||
| | 被团队成员标记为高优先级的功能 | 高优先级 | | |||
| | 来自[社区反馈板](https://github.com/langgenius/dify/discussions/categories/feedbacks)的热门功能请求 | 中等优先级 | | |||
| | 非核心功能和小改进 | 低优先级 | | |||
| | 有价值但非紧急的功能 | 未来特性 | | |||
| | 功能类型 | 优先级 | | |||
| | -------------------------------------------------- | ---------- | | |||
| | 被团队成员标记为高优先级的功能 | 高优先级 | | |||
| | 来自[社区反馈板](https://github.com/langgenius/dify/discussions/categories/feedbacks)的热门功能请求 | 中等优先级 | | |||
| | 非核心功能和小改进 | 低优先级 | | |||
| | 有价值但非紧急的功能 | 未来特性 | | |||
| ## 提交 PR | |||
| @@ -67,12 +66,12 @@ | |||
| ### PR 提交流程 | |||
| 1. Fork 本仓库 | |||
| 2. 在提交 PR 之前,请先创建 issue 讨论你想要做的修改 | |||
| 3. 为你的修改创建一个新的分支 | |||
| 4. 请为你的修改添加相应的测试 | |||
| 5. 确保你的代码能通过现有的测试 | |||
| 6. 请在 PR 描述中关联相关 issue,格式为 `fixes #<issue编号>` | |||
| 7. 等待合并! | |||
| 1. 在提交 PR 之前,请先创建 issue 讨论你想要做的修改 | |||
| 1. 为你的修改创建一个新的分支 | |||
| 1. 请为你的修改添加相应的测试 | |||
| 1. 确保你的代码能通过现有的测试 | |||
| 1. 请在 PR 描述中关联相关 issue,格式为 `fixes #<issue编号>` | |||
| 1. 等待合并! | |||
| #### 前端 | |||
| @@ -85,6 +84,7 @@ | |||
| #### 其他注意事项 | |||
| 我们建议在开始设置之前仔细阅读本文档,因为它包含以下重要信息: | |||
| - 前置条件和依赖项 | |||
| - 安装步骤 | |||
| - 配置细节 | |||
| @@ -32,11 +32,11 @@ Vergessen Sie nicht, in der PR-Beschreibung ein bestehendes Issue zu verlinken o | |||
| Unsere Priorisierung: | |||
| | Fehlertyp | Priorität | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Fehler in Kernfunktionen (Cloud-Service, Login nicht möglich, Anwendungen funktionieren nicht, Sicherheitslücken) | Kritisch | | |||
| | Nicht-kritische Fehler, Leistungsverbesserungen | Mittlere Priorität | | |||
| | Kleinere Korrekturen (Tippfehler, verwirrende aber funktionierende UI) | Niedrige Priorität | | |||
| | Fehlertyp | Priorität | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Fehler in Kernfunktionen (Cloud-Service, Login nicht möglich, Anwendungen funktionieren nicht, Sicherheitslücken) | Kritisch | | |||
| | Nicht-kritische Fehler, Leistungsverbesserungen | Mittlere Priorität | | |||
| | Kleinere Korrekturen (Tippfehler, verwirrende aber funktionierende UI) | Niedrige Priorität | | |||
| ### Feature-Anfragen | |||
| @@ -50,24 +50,24 @@ Unsere Priorisierung: | |||
| Unsere Priorisierung: | |||
| | Feature-Typ | Priorität | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Hochprioritäre Features (durch Teammitglied gekennzeichnet) | Hohe Priorität | | |||
| | Beliebte Feature-Anfragen aus unserem [Community-Feedback-Board](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Mittlere Priorität | | |||
| | Nicht-Kernfunktionen und kleinere Verbesserungen | Niedrige Priorität | | |||
| | Wertvoll, aber nicht dringend | Zukunfts-Feature | | |||
| | Feature-Typ | Priorität | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Hochprioritäre Features (durch Teammitglied gekennzeichnet) | Hohe Priorität | | |||
| | Beliebte Feature-Anfragen aus unserem [Community-Feedback-Board](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Mittlere Priorität | | |||
| | Nicht-Kernfunktionen und kleinere Verbesserungen | Niedrige Priorität | | |||
| | Wertvoll, aber nicht dringend | Zukunfts-Feature | | |||
| ## Einreichen Ihres PRs | |||
| ### Pull-Request-Prozess | |||
| 1. Repository forken | |||
| 2. Vor dem Erstellen eines PRs bitte ein Issue zur Diskussion der Änderungen erstellen | |||
| 3. Einen neuen Branch für Ihre Änderungen erstellen | |||
| 4. Tests für Ihre Änderungen hinzufügen | |||
| 5. Sicherstellen, dass Ihr Code die bestehenden Tests besteht | |||
| 6. Issue in der PR-Beschreibung verlinken (`fixes #<issue_number>`) | |||
| 7. Auf den Merge warten! | |||
| 1. Vor dem Erstellen eines PRs bitte ein Issue zur Diskussion der Änderungen erstellen | |||
| 1. Einen neuen Branch für Ihre Änderungen erstellen | |||
| 1. Tests für Ihre Änderungen hinzufügen | |||
| 1. Sicherstellen, dass Ihr Code die bestehenden Tests besteht | |||
| 1. Issue in der PR-Beschreibung verlinken (`fixes #<issue_number>`) | |||
| 1. Auf den Merge warten! | |||
| ### Projekt einrichten | |||
| @@ -82,6 +82,7 @@ Für die Einrichtung des Backend-Service folgen Sie bitte unseren detaillierten | |||
| #### Weitere Hinweise | |||
| Wir empfehlen, dieses Dokument sorgfältig zu lesen, da es wichtige Informationen enthält über: | |||
| - Voraussetzungen und Abhängigkeiten | |||
| - Installationsschritte | |||
| - Konfigurationsdetails | |||
| @@ -92,4 +93,3 @@ Bei Problemen während der Einrichtung können Sie sich gerne an uns wenden. | |||
| ## Hilfe bekommen | |||
| Wenn Sie beim Mitwirken Fragen haben oder nicht weiterkommen, stellen Sie Ihre Fragen einfach im entsprechenden GitHub Issue oder besuchen Sie unseren [Discord](https://discord.gg/8Tpq4AcN9c) für einen schnellen Austausch. | |||
| @@ -34,11 +34,11 @@ No olvides vincular un issue existente o abrir uno nuevo en la descripción del | |||
| Cómo priorizamos: | |||
| | Tipo de Issue | Prioridad | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Errores en funciones principales (servicio en la nube, no poder iniciar sesión, aplicaciones que no funcionan, fallos de seguridad) | Crítica | | |||
| | Errores no críticos, mejoras de rendimiento | Prioridad Media | | |||
| | Correcciones menores (errores tipográficos, UI confusa pero funcional) | Prioridad Baja | | |||
| | Tipo de Issue | Prioridad | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Errores en funciones principales (servicio en la nube, no poder iniciar sesión, aplicaciones que no funcionan, fallos de seguridad) | Crítica | | |||
| | Errores no críticos, mejoras de rendimiento | Prioridad Media | | |||
| | Correcciones menores (errores tipográficos, UI confusa pero funcional) | Prioridad Baja | | |||
| ### Solicitudes de funcionalidades | |||
| @@ -52,23 +52,25 @@ Cómo priorizamos: | |||
| Cómo priorizamos: | |||
| | Tipo de Funcionalidad | Prioridad | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Funcionalidades de alta prioridad etiquetadas por un miembro del equipo | Prioridad Alta | | |||
| | Solicitudes populares de funcionalidades de nuestro [tablero de comentarios de la comunidad](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Prioridad Media | | |||
| | Funcionalidades no principales y mejoras menores | Prioridad Baja | | |||
| | Valiosas pero no inmediatas | Futura-Funcionalidad | | |||
| | Tipo de Funcionalidad | Prioridad | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Funcionalidades de alta prioridad etiquetadas por un miembro del equipo | Prioridad Alta | | |||
| | Solicitudes populares de funcionalidades de nuestro [tablero de comentarios de la comunidad](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Prioridad Media | | |||
| | Funcionalidades no principales y mejoras menores | Prioridad Baja | | |||
| | Valiosas pero no inmediatas | Futura-Funcionalidad | | |||
| ## Enviando tu PR | |||
| ### Proceso de Pull Request | |||
| 1. Haz un fork del repositorio | |||
| 2. Antes de redactar un PR, por favor crea un issue para discutir los cambios que quieres hacer | |||
| 3. Crea una nueva rama para tus cambios | |||
| 4. Por favor añade pruebas para tus cambios en consecuencia | |||
| 5. Asegúrate de que tu código pasa las pruebas existentes | |||
| 6. Por favor vincula el issue en la descripción del PR, `fixes #<número_del_issue>` | |||
| 7. ¡Fusiona tu código! | |||
| 1. Antes de redactar un PR, por favor crea un issue para discutir los cambios que quieres hacer | |||
| 1. Crea una nueva rama para tus cambios | |||
| 1. Por favor añade pruebas para tus cambios en consecuencia | |||
| 1. Asegúrate de que tu código pasa las pruebas existentes | |||
| 1. Por favor vincula el issue en la descripción del PR, `fixes #<número_del_issue>` | |||
| 1. ¡Fusiona tu código! | |||
| ### Configuración del proyecto | |||
| #### Frontend | |||
| @@ -82,12 +84,14 @@ Para configurar el servicio backend, por favor consulta nuestras [instrucciones | |||
| #### Otras cosas a tener en cuenta | |||
| Recomendamos revisar este documento cuidadosamente antes de proceder con la configuración, ya que contiene información esencial sobre: | |||
| - Requisitos previos y dependencias | |||
| - Pasos de instalación | |||
| - Detalles de configuración | |||
| - Consejos comunes de solución de problemas | |||
| No dudes en contactarnos si encuentras algún problema durante el proceso de configuración. | |||
| ## Obteniendo Ayuda | |||
| Si alguna vez te quedas atascado o tienes una pregunta urgente mientras contribuyes, simplemente envíanos tus consultas a través del issue relacionado de GitHub, o únete a nuestro [Discord](https://discord.gg/8Tpq4AcN9c) para una charla rápida. | |||
| Si alguna vez te quedas atascado o tienes una pregunta urgente mientras contribuyes, simplemente envíanos tus consultas a través del issue relacionado de GitHub, o únete a nuestro [Discord](https://discord.gg/8Tpq4AcN9c) para una charla rápida. | |||
| @@ -34,11 +34,11 @@ N'oubliez pas de lier un problème existant ou d'ouvrir un nouveau problème dan | |||
| Comment nous priorisons : | |||
| | Type de Problème | Priorité | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bugs dans les fonctions principales (service cloud, impossibilité de se connecter, applications qui ne fonctionnent pas, failles de sécurité) | Critique | | |||
| | Bugs non critiques, améliorations de performance | Priorité Moyenne | | |||
| | Corrections mineures (fautes de frappe, UI confuse mais fonctionnelle) | Priorité Basse | | |||
| | Type de Problème | Priorité | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bugs dans les fonctions principales (service cloud, impossibilité de se connecter, applications qui ne fonctionnent pas, failles de sécurité) | Critique | | |||
| | Bugs non critiques, améliorations de performance | Priorité Moyenne | | |||
| | Corrections mineures (fautes de frappe, UI confuse mais fonctionnelle) | Priorité Basse | | |||
| ### Demandes de fonctionnalités | |||
| @@ -52,23 +52,25 @@ Comment nous priorisons : | |||
| Comment nous priorisons : | |||
| | Type de Fonctionnalité | Priorité | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Fonctionnalités hautement prioritaires étiquetées par un membre de l'équipe | Priorité Haute | | |||
| | Demandes populaires de fonctionnalités de notre [tableau de feedback communautaire](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Priorité Moyenne | | |||
| | Fonctionnalités non essentielles et améliorations mineures | Priorité Basse | | |||
| | Précieuses mais non immédiates | Fonctionnalité Future | | |||
| | Type de Fonctionnalité | Priorité | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Fonctionnalités hautement prioritaires étiquetées par un membre de l'équipe | Priorité Haute | | |||
| | Demandes populaires de fonctionnalités de notre [tableau de feedback communautaire](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Priorité Moyenne | | |||
| | Fonctionnalités non essentielles et améliorations mineures | Priorité Basse | | |||
| | Précieuses mais non immédiates | Fonctionnalité Future | | |||
| ## Soumettre votre PR | |||
| ### Processus de Pull Request | |||
| 1. Forkez le dépôt | |||
| 2. Avant de rédiger une PR, veuillez créer un problème pour discuter des changements que vous souhaitez apporter | |||
| 3. Créez une nouvelle branche pour vos changements | |||
| 4. Veuillez ajouter des tests pour vos changements en conséquence | |||
| 5. Assurez-vous que votre code passe les tests existants | |||
| 6. Veuillez lier le problème dans la description de la PR, `fixes #<numéro_du_problème>` | |||
| 7. Faites fusionner votre code ! | |||
| 1. Avant de rédiger une PR, veuillez créer un problème pour discuter des changements que vous souhaitez apporter | |||
| 1. Créez une nouvelle branche pour vos changements | |||
| 1. Veuillez ajouter des tests pour vos changements en conséquence | |||
| 1. Assurez-vous que votre code passe les tests existants | |||
| 1. Veuillez lier le problème dans la description de la PR, `fixes #<numéro_du_problème>` | |||
| 1. Faites fusionner votre code ! | |||
| ### Configuration du projet | |||
| #### Frontend | |||
| @@ -82,12 +84,14 @@ Pour configurer le service backend, veuillez consulter nos [instructions détail | |||
| #### Autres choses à noter | |||
| Nous recommandons de revoir attentivement ce document avant de procéder à la configuration, car il contient des informations essentielles sur : | |||
| - Prérequis et dépendances | |||
| - Étapes d'installation | |||
| - Détails de configuration | |||
| - Conseils courants de dépannage | |||
| N'hésitez pas à nous contacter si vous rencontrez des problèmes pendant le processus de configuration. | |||
| ## Obtenir de l'aide | |||
| Si jamais vous êtes bloqué ou avez une question urgente en contribuant, envoyez-nous simplement vos questions via le problème GitHub concerné, ou rejoignez notre [Discord](https://discord.gg/8Tpq4AcN9c) pour une discussion rapide. | |||
| Si jamais vous êtes bloqué ou avez une question urgente en contribuant, envoyez-nous simplement vos questions via le problème GitHub concerné, ou rejoignez notre [Discord](https://discord.gg/8Tpq4AcN9c) pour une discussion rapide. | |||
| @@ -34,11 +34,11 @@ PRの説明には、既存のイシューへのリンクを含めるか、新し | |||
| 優先順位の付け方: | |||
| | 問題の種類 | 優先度 | | |||
| | ------------------------------------------------------------ | --------- | | |||
| | コア機能のバグ(クラウドサービス、ログイン不可、アプリケーション不具合、セキュリティ脆弱性) | 最重要 | | |||
| | 重要度の低いバグ、パフォーマンス改善 | 中程度 | | |||
| | 軽微な修正(タイプミス、分かりにくいが動作するUI) | 低 | | |||
| | 問題の種類 | 優先度 | | |||
| | ------------------------------------------------------------ | --------- | | |||
| | コア機能のバグ(クラウドサービス、ログイン不可、アプリケーション不具合、セキュリティ脆弱性) | 最重要 | | |||
| | 重要度の低いバグ、パフォーマンス改善 | 中程度 | | |||
| | 軽微な修正(タイプミス、分かりにくいが動作するUI) | 低 | | |||
| ### 機能リクエスト | |||
| @@ -52,24 +52,24 @@ PRの説明には、既存のイシューへのリンクを含めるか、新し | |||
| 優先順位の付け方: | |||
| | 機能の種類 | 優先度 | | |||
| | ------------------------------------------------------------ | --------- | | |||
| | チームメンバーによって高優先度とラベル付けされた機能 | 高 | | |||
| | [コミュニティフィードボード](https://github.com/langgenius/dify/discussions/categories/feedbacks)での人気の機能リクエスト | 中程度 | | |||
| | 非コア機能と軽微な改善 | 低 | | |||
| | 価値はあるが緊急性の低いもの | 将来対応 | | |||
| | 機能の種類 | 優先度 | | |||
| | ------------------------------------------------------------ | --------- | | |||
| | チームメンバーによって高優先度とラベル付けされた機能 | 高 | | |||
| | [コミュニティフィードボード](https://github.com/langgenius/dify/discussions/categories/feedbacks)での人気の機能リクエスト | 中程度 | | |||
| | 非コア機能と軽微な改善 | 低 | | |||
| | 価値はあるが緊急性の低いもの | 将来対応 | | |||
| ## PRの提出 | |||
| ### プルリクエストのプロセス | |||
| 1. リポジトリをフォークする | |||
| 2. PRを作成する前に、変更内容についてイシューで議論する | |||
| 3. 変更用の新しいブランチを作成する | |||
| 4. 変更に応じたテストを追加する | |||
| 5. 既存のテストをパスすることを確認する | |||
| 6. PRの説明文にイシューをリンクする(`fixes #<issue_number>`) | |||
| 7. マージ完了! | |||
| 1. PRを作成する前に、変更内容についてイシューで議論する | |||
| 1. 変更用の新しいブランチを作成する | |||
| 1. 変更に応じたテストを追加する | |||
| 1. 既存のテストをパスすることを確認する | |||
| 1. PRの説明文にイシューをリンクする(`fixes #<issue_number>`) | |||
| 1. マージ完了! | |||
| ### プロジェクトのセットアップ | |||
| @@ -84,6 +84,7 @@ PRの説明には、既存のイシューへのリンクを含めるか、新し | |||
| #### その他の注意点 | |||
| セットアップを進める前に、以下の重要な情報が含まれているため、このドキュメントを注意深く確認することをお勧めします: | |||
| - 前提条件と依存関係 | |||
| - インストール手順 | |||
| - 設定の詳細 | |||
| @@ -94,4 +95,3 @@ PRの説明には、既存のイシューへのリンクを含めるか、新し | |||
| ## サポートを受ける | |||
| 貢献中に行き詰まったり、緊急の質問がある場合は、関連するGitHubイシューで質問するか、[Discord](https://discord.gg/8Tpq4AcN9c)で気軽にチャットしてください。 | |||
| @@ -34,11 +34,11 @@ PR 설명에 기존 이슈를 연결하거나 새 이슈를 여는 것을 잊지 | |||
| 우선순위 결정 방법: | |||
| | 이슈 유형 | 우선순위 | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | 핵심 기능의 버그(클라우드 서비스, 로그인 불가, 애플리케이션 작동 불능, 보안 취약점) | 중대 | | |||
| | 비중요 버그, 성능 향상 | 중간 우선순위 | | |||
| | 사소한 수정(오타, 혼란스럽지만 작동하는 UI) | 낮은 우선순위 | | |||
| | 이슈 유형 | 우선순위 | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | 핵심 기능의 버그(클라우드 서비스, 로그인 불가, 애플리케이션 작동 불능, 보안 취약점) | 중대 | | |||
| | 비중요 버그, 성능 향상 | 중간 우선순위 | | |||
| | 사소한 수정(오타, 혼란스럽지만 작동하는 UI) | 낮은 우선순위 | | |||
| ### 기능 요청 | |||
| @@ -52,23 +52,25 @@ PR 설명에 기존 이슈를 연결하거나 새 이슈를 여는 것을 잊지 | |||
| 우선순위 결정 방법: | |||
| | 기능 유형 | 우선순위 | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | 팀 구성원에 의해 레이블이 지정된 고우선순위 기능 | 높은 우선순위 | | |||
| | 우리의 [커뮤니티 피드백 보드](https://github.com/langgenius/dify/discussions/categories/feedbacks)에서 인기 있는 기능 요청 | 중간 우선순위 | | |||
| | 비핵심 기능 및 사소한 개선 | 낮은 우선순위 | | |||
| | 가치 있지만 즉시 필요하지 않은 기능 | 미래 기능 | | |||
| | 기능 유형 | 우선순위 | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | 팀 구성원에 의해 레이블이 지정된 고우선순위 기능 | 높은 우선순위 | | |||
| | 우리의 [커뮤니티 피드백 보드](https://github.com/langgenius/dify/discussions/categories/feedbacks)에서 인기 있는 기능 요청 | 중간 우선순위 | | |||
| | 비핵심 기능 및 사소한 개선 | 낮은 우선순위 | | |||
| | 가치 있지만 즉시 필요하지 않은 기능 | 미래 기능 | | |||
| ## PR 제출하기 | |||
| ### Pull Request 프로세스 | |||
| 1. 저장소를 포크하세요 | |||
| 2. PR을 작성하기 전에, 변경하고자 하는 내용에 대해 논의하기 위한 이슈를 생성해 주세요 | |||
| 3. 변경 사항을 위한 새 브랜치를 만드세요 | |||
| 4. 변경 사항에 대한 테스트를 적절히 추가해 주세요 | |||
| 5. 코드가 기존 테스트를 통과하는지 확인하세요 | |||
| 6. PR 설명에 이슈를 연결해 주세요, `fixes #<이슈_번호>` | |||
| 7. 병합 완료! | |||
| 1. PR을 작성하기 전에, 변경하고자 하는 내용에 대해 논의하기 위한 이슈를 생성해 주세요 | |||
| 1. 변경 사항을 위한 새 브랜치를 만드세요 | |||
| 1. 변경 사항에 대한 테스트를 적절히 추가해 주세요 | |||
| 1. 코드가 기존 테스트를 통과하는지 확인하세요 | |||
| 1. PR 설명에 이슈를 연결해 주세요, `fixes #<이슈_번호>` | |||
| 1. 병합 완료! | |||
| ### 프로젝트 설정하기 | |||
| #### 프론트엔드 | |||
| @@ -82,12 +84,14 @@ PR 설명에 기존 이슈를 연결하거나 새 이슈를 여는 것을 잊지 | |||
| #### 기타 참고 사항 | |||
| 설정을 진행하기 전에 이 문서를 주의 깊게 검토하는 것을 권장합니다. 다음과 같은 필수 정보가 포함되어 있습니다: | |||
| - 필수 조건 및 종속성 | |||
| - 설치 단계 | |||
| - 구성 세부 정보 | |||
| - 일반적인 문제 해결 팁 | |||
| 설정 과정에서 문제가 발생하면 언제든지 연락해 주세요. | |||
| ## 도움 받기 | |||
| 기여하는 동안 막히거나 긴급한 질문이 있으면, 관련 GitHub 이슈를 통해 질문을 보내거나, 빠른 대화를 위해 우리의 [Discord](https://discord.gg/8Tpq4AcN9c)에 참여하세요. | |||
| 기여하는 동안 막히거나 긴급한 질문이 있으면, 관련 GitHub 이슈를 통해 질문을 보내거나, 빠른 대화를 위해 우리의 [Discord](https://discord.gg/8Tpq4AcN9c)에 참여하세요. | |||
| @@ -34,11 +34,11 @@ Não se esqueça de vincular um problema existente ou abrir um novo problema na | |||
| Como priorizamos: | |||
| | Tipo de Problema | Prioridade | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bugs em funções centrais (serviço em nuvem, não conseguir fazer login, aplicações não funcionando, falhas de segurança) | Crítica | | |||
| | Bugs não críticos, melhorias de desempenho | Prioridade Média | | |||
| | Correções menores (erros de digitação, interface confusa mas funcional) | Prioridade Baixa | | |||
| | Tipo de Problema | Prioridade | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bugs em funções centrais (serviço em nuvem, não conseguir fazer login, aplicações não funcionando, falhas de segurança) | Crítica | | |||
| | Bugs não críticos, melhorias de desempenho | Prioridade Média | | |||
| | Correções menores (erros de digitação, interface confusa mas funcional) | Prioridade Baixa | | |||
| ### Solicitações de recursos | |||
| @@ -52,23 +52,25 @@ Como priorizamos: | |||
| Como priorizamos: | |||
| | Tipo de Recurso | Prioridade | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Recursos de alta prioridade conforme rotulado por um membro da equipe | Prioridade Alta | | |||
| | Solicitações populares de recursos do nosso [quadro de feedback da comunidade](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Prioridade Média | | |||
| | Recursos não essenciais e melhorias menores | Prioridade Baixa | | |||
| | Valiosos mas não imediatos | Recurso Futuro | | |||
| | Tipo de Recurso | Prioridade | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Recursos de alta prioridade conforme rotulado por um membro da equipe | Prioridade Alta | | |||
| | Solicitações populares de recursos do nosso [quadro de feedback da comunidade](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Prioridade Média | | |||
| | Recursos não essenciais e melhorias menores | Prioridade Baixa | | |||
| | Valiosos mas não imediatos | Recurso Futuro | | |||
| ## Enviando seu PR | |||
| ### Processo de Pull Request | |||
| 1. Faça um fork do repositório | |||
| 2. Antes de elaborar um PR, por favor crie um problema para discutir as mudanças que você quer fazer | |||
| 3. Crie um novo branch para suas alterações | |||
| 4. Por favor, adicione testes para suas alterações conforme apropriado | |||
| 5. Certifique-se de que seu código passa nos testes existentes | |||
| 6. Por favor, vincule o problema na descrição do PR, `fixes #<número_do_problema>` | |||
| 7. Faça o merge do seu código! | |||
| 1. Antes de elaborar um PR, por favor crie um problema para discutir as mudanças que você quer fazer | |||
| 1. Crie um novo branch para suas alterações | |||
| 1. Por favor, adicione testes para suas alterações conforme apropriado | |||
| 1. Certifique-se de que seu código passa nos testes existentes | |||
| 1. Por favor, vincule o problema na descrição do PR, `fixes #<número_do_problema>` | |||
| 1. Faça o merge do seu código! | |||
| ### Configurando o projeto | |||
| #### Frontend | |||
| @@ -82,12 +84,14 @@ Para configurar o serviço backend, por favor consulte nossas [instruções deta | |||
| #### Outras coisas a observar | |||
| Recomendamos revisar este documento cuidadosamente antes de prosseguir com a configuração, pois ele contém informações essenciais sobre: | |||
| - Pré-requisitos e dependências | |||
| - Etapas de instalação | |||
| - Detalhes de configuração | |||
| - Dicas comuns de solução de problemas | |||
| Sinta-se à vontade para entrar em contato se encontrar quaisquer problemas durante o processo de configuração. | |||
| ## Obtendo Ajuda | |||
| Se você ficar preso ou tiver uma dúvida urgente enquanto contribui, simplesmente envie suas perguntas através do problema relacionado no GitHub, ou entre no nosso [Discord](https://discord.gg/8Tpq4AcN9c) para uma conversa rápida. | |||
| Se você ficar preso ou tiver uma dúvida urgente enquanto contribui, simplesmente envie suas perguntas através do problema relacionado no GitHub, ou entre no nosso [Discord](https://discord.gg/8Tpq4AcN9c) para uma conversa rápida. | |||
| @@ -34,11 +34,11 @@ PR açıklamasında mevcut bir sorunu bağlamayı veya yeni bir sorun açmayı u | |||
| Nasıl önceliklendiriyoruz: | |||
| | Sorun Türü | Öncelik | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Temel işlevlerdeki hatalar (bulut hizmeti, giriş yapamama, çalışmayan uygulamalar, güvenlik açıkları) | Kritik | | |||
| | Kritik olmayan hatalar, performans artışları | Orta Öncelik | | |||
| | Küçük düzeltmeler (yazım hataları, kafa karıştırıcı ama çalışan UI) | Düşük Öncelik | | |||
| | Sorun Türü | Öncelik | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Temel işlevlerdeki hatalar (bulut hizmeti, giriş yapamama, çalışmayan uygulamalar, güvenlik açıkları) | Kritik | | |||
| | Kritik olmayan hatalar, performans artışları | Orta Öncelik | | |||
| | Küçük düzeltmeler (yazım hataları, kafa karıştırıcı ama çalışan UI) | Düşük Öncelik | | |||
| ### Özellik İstekleri | |||
| @@ -52,23 +52,25 @@ Nasıl önceliklendiriyoruz: | |||
| Nasıl önceliklendiriyoruz: | |||
| | Özellik Türü | Öncelik | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bir ekip üyesi tarafından etiketlenen Yüksek Öncelikli Özellikler | Yüksek Öncelik | | |||
| | [Topluluk geri bildirim panosundan](https://github.com/langgenius/dify/discussions/categories/feedbacks) popüler özellik istekleri | Orta Öncelik | | |||
| | Temel olmayan özellikler ve küçük geliştirmeler | Düşük Öncelik | | |||
| | Değerli ama acil olmayan | Gelecek-Özellik | | |||
| | Özellik Türü | Öncelik | | |||
| | ------------------------------------------------------------ | --------------- | | |||
| | Bir ekip üyesi tarafından etiketlenen Yüksek Öncelikli Özellikler | Yüksek Öncelik | | |||
| | [Topluluk geri bildirim panosundan](https://github.com/langgenius/dify/discussions/categories/feedbacks) popüler özellik istekleri | Orta Öncelik | | |||
| | Temel olmayan özellikler ve küçük geliştirmeler | Düşük Öncelik | | |||
| | Değerli ama acil olmayan | Gelecek-Özellik | | |||
| ## PR'nizi Göndermek | |||
| ### Pull Request Süreci | |||
| 1. Depoyu fork edin | |||
| 2. Bir PR taslağı oluşturmadan önce, yapmak istediğiniz değişiklikleri tartışmak için lütfen bir sorun oluşturun | |||
| 3. Değişiklikleriniz için yeni bir dal oluşturun | |||
| 4. Lütfen değişiklikleriniz için uygun testler ekleyin | |||
| 5. Kodunuzun mevcut testleri geçtiğinden emin olun | |||
| 6. Lütfen PR açıklamasında sorunu bağlayın, `fixes #<sorun_numarası>` | |||
| 7. Kodunuzu birleştirin! | |||
| 1. Bir PR taslağı oluşturmadan önce, yapmak istediğiniz değişiklikleri tartışmak için lütfen bir sorun oluşturun | |||
| 1. Değişiklikleriniz için yeni bir dal oluşturun | |||
| 1. Lütfen değişiklikleriniz için uygun testler ekleyin | |||
| 1. Kodunuzun mevcut testleri geçtiğinden emin olun | |||
| 1. Lütfen PR açıklamasında sorunu bağlayın, `fixes #<sorun_numarası>` | |||
| 1. Kodunuzu birleştirin! | |||
| ### Projeyi Kurma | |||
| #### Frontend | |||
| @@ -82,12 +84,14 @@ Backend hizmetini kurmak için, lütfen `api/README.md` dosyasındaki detaylı [ | |||
| #### Dikkat Edilecek Diğer Şeyler | |||
| Kuruluma geçmeden önce bu belgeyi dikkatlice incelemenizi öneririz, çünkü şunlar hakkında temel bilgiler içerir: | |||
| - Ön koşullar ve bağımlılıklar | |||
| - Kurulum adımları | |||
| - Yapılandırma detayları | |||
| - Yaygın sorun giderme ipuçları | |||
| Kurulum süreci sırasında herhangi bir sorunla karşılaşırsanız bizimle iletişime geçmekten çekinmeyin. | |||
| ## Yardım Almak | |||
| Katkıda bulunurken takılırsanız veya yanıcı bir sorunuz olursa, sorularınızı ilgili GitHub sorunu aracılığıyla bize gönderin veya hızlı bir sohbet için [Discord'umuza](https://discord.gg/8Tpq4AcN9c) katılın. | |||
| Katkıda bulunurken takılırsanız veya yanıcı bir sorunuz olursa, sorularınızı ilgili GitHub sorunu aracılığıyla bize gönderin veya hızlı bir sohbet için [Discord'umuza](https://discord.gg/8Tpq4AcN9c) katılın. | |||
| @@ -22,7 +22,7 @@ | |||
| ### 錯誤回報 | |||
| > [!IMPORTANT] | |||
| > [!IMPORTANT]\ | |||
| > 提交錯誤回報時,請務必包含以下資訊: | |||
| - 清晰明確的標題 | |||
| @@ -34,15 +34,15 @@ | |||
| 優先順序評估: | |||
| | 議題類型 | 優先級 | | |||
| | -------- | ------ | | |||
| | 核心功能錯誤(雲端服務、無法登入、應用程式無法運作、安全漏洞) | 緊急 | | |||
| | 非緊急錯誤、效能優化 | 中等 | | |||
| | 次要修正(拼字錯誤、介面混淆但可運作) | 低 | | |||
| | 議題類型 | 優先級 | | |||
| | -------- | ------ | | |||
| | 核心功能錯誤(雲端服務、無法登入、應用程式無法運作、安全漏洞) | 緊急 | | |||
| | 非緊急錯誤、效能優化 | 中等 | | |||
| | 次要修正(拼字錯誤、介面混淆但可運作) | 低 | | |||
| ### 功能請求 | |||
| > [!NOTE] | |||
| > [!NOTE]\ | |||
| > 提交功能請求時,請務必包含以下資訊: | |||
| - 清晰明確的標題 | |||
| @@ -52,24 +52,24 @@ | |||
| 優先順序評估: | |||
| | 功能類型 | 優先級 | | |||
| | -------- | ------ | | |||
| | 團隊成員標記為高優先級的功能 | 高 | | |||
| | 來自[社群回饋板](https://github.com/langgenius/dify/discussions/categories/feedbacks)的熱門功能請求 | 中 | | |||
| | 非核心功能和小幅改進 | 低 | | |||
| | 有價值但非急迫的功能 | 未來功能 | | |||
| | 功能類型 | 優先級 | | |||
| | -------- | ------ | | |||
| | 團隊成員標記為高優先級的功能 | 高 | | |||
| | 來自[社群回饋板](https://github.com/langgenius/dify/discussions/categories/feedbacks)的熱門功能請求 | 中 | | |||
| | 非核心功能和小幅改進 | 低 | | |||
| | 有價值但非急迫的功能 | 未來功能 | | |||
| ## 提交 PR | |||
| ### PR 流程 | |||
| 1. Fork 專案 | |||
| 2. 在開始撰寫 PR 前,請先建立議題討論你想做的更改 | |||
| 3. 為你的更改建立新分支 | |||
| 4. 請為你的更改新增相應的測試 | |||
| 5. 確保你的程式碼通過現有測試 | |||
| 6. 請在 PR 描述中連結相關議題,使用 `fixes #<issue_number>` | |||
| 7. 等待合併! | |||
| 1. 在開始撰寫 PR 前,請先建立議題討論你想做的更改 | |||
| 1. 為你的更改建立新分支 | |||
| 1. 請為你的更改新增相應的測試 | |||
| 1. 確保你的程式碼通過現有測試 | |||
| 1. 請在 PR 描述中連結相關議題,使用 `fixes #<issue_number>` | |||
| 1. 等待合併! | |||
| ### 專案設定 | |||
| @@ -84,6 +84,7 @@ | |||
| #### 其他注意事項 | |||
| 我們建議在開始設定前仔細閱讀此文件,因為它包含以下重要資訊: | |||
| - 前置需求和相依性 | |||
| - 安裝步驟 | |||
| - 設定細節 | |||
| @@ -94,4 +95,3 @@ | |||
| ## 尋求協助 | |||
| 如果你在貢獻過程中遇到困難或有急切的問題,可以透過相關的 GitHub 議題詢問,或加入我們的 [Discord](https://discord.gg/8Tpq4AcN9c) 進行即時交流。 | |||
| @@ -22,7 +22,7 @@ Hãy tham gia, đóng góp và cùng nhau xây dựng điều tuyệt vời! | |||
| ### Báo cáo lỗi | |||
| > [!QUAN TRỌNG] | |||
| > [!QUAN TRỌNG]\ | |||
| > Vui lòng đảm bảo cung cấp các thông tin sau khi gửi báo cáo lỗi: | |||
| - Tiêu đề rõ ràng và mô tả | |||
| @@ -34,11 +34,11 @@ Hãy tham gia, đóng góp và cùng nhau xây dựng điều tuyệt vời! | |||
| Cách chúng tôi ưu tiên: | |||
| | Loại vấn đề | Mức độ ưu tiên | | |||
| | ----------- | -------------- | | |||
| | Lỗi trong các chức năng cốt lõi (dịch vụ đám mây, không thể đăng nhập, ứng dụng không hoạt động, lỗ hổng bảo mật) | Quan trọng | | |||
| | Lỗi không nghiêm trọng, cải thiện hiệu suất | Ưu tiên trung bình | | |||
| | Sửa lỗi nhỏ (lỗi chính tả, UI gây nhầm lẫn nhưng vẫn hoạt động) | Ưu tiên thấp | | |||
| | Loại vấn đề | Mức độ ưu tiên | | |||
| | ----------- | -------------- | | |||
| | Lỗi trong các chức năng cốt lõi (dịch vụ đám mây, không thể đăng nhập, ứng dụng không hoạt động, lỗ hổng bảo mật) | Quan trọng | | |||
| | Lỗi không nghiêm trọng, cải thiện hiệu suất | Ưu tiên trung bình | | |||
| | Sửa lỗi nhỏ (lỗi chính tả, UI gây nhầm lẫn nhưng vẫn hoạt động) | Ưu tiên thấp | | |||
| ### Yêu cầu tính năng | |||
| @@ -52,24 +52,24 @@ Cách chúng tôi ưu tiên: | |||
| Cách chúng tôi ưu tiên: | |||
| | Loại tính năng | Mức độ ưu tiên | | |||
| | -------------- | -------------- | | |||
| | Tính năng ưu tiên cao được gắn nhãn bởi thành viên nhóm | Ưu tiên cao | | |||
| | Yêu cầu tính năng phổ biến từ [bảng phản hồi cộng đồng](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Ưu tiên trung bình | | |||
| | Tính năng không cốt lõi và cải tiến nhỏ | Ưu tiên thấp | | |||
| | Có giá trị nhưng không cấp bách | Tính năng tương lai | | |||
| | Loại tính năng | Mức độ ưu tiên | | |||
| | -------------- | -------------- | | |||
| | Tính năng ưu tiên cao được gắn nhãn bởi thành viên nhóm | Ưu tiên cao | | |||
| | Yêu cầu tính năng phổ biến từ [bảng phản hồi cộng đồng](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Ưu tiên trung bình | | |||
| | Tính năng không cốt lõi và cải tiến nhỏ | Ưu tiên thấp | | |||
| | Có giá trị nhưng không cấp bách | Tính năng tương lai | | |||
| ## Gửi PR của bạn | |||
| ### Quy trình tạo Pull Request | |||
| 1. Fork repository | |||
| 2. Trước khi soạn PR, vui lòng tạo issue để thảo luận về các thay đổi bạn muốn thực hiện | |||
| 3. Tạo nhánh mới cho các thay đổi của bạn | |||
| 4. Vui lòng thêm test cho các thay đổi tương ứng | |||
| 5. Đảm bảo code của bạn vượt qua các test hiện có | |||
| 6. Vui lòng liên kết issue trong mô tả PR, `fixes #<số_issue>` | |||
| 7. Được merge! | |||
| 1. Trước khi soạn PR, vui lòng tạo issue để thảo luận về các thay đổi bạn muốn thực hiện | |||
| 1. Tạo nhánh mới cho các thay đổi của bạn | |||
| 1. Vui lòng thêm test cho các thay đổi tương ứng | |||
| 1. Đảm bảo code của bạn vượt qua các test hiện có | |||
| 1. Vui lòng liên kết issue trong mô tả PR, `fixes #<số_issue>` | |||
| 1. Được merge! | |||
| ### Thiết lập dự án | |||
| @@ -84,6 +84,7 @@ Cách chúng tôi ưu tiên: | |||
| #### Các điểm cần lưu ý khác | |||
| Chúng tôi khuyến nghị xem xét kỹ tài liệu này trước khi tiến hành thiết lập, vì nó chứa thông tin thiết yếu về: | |||
| - Điều kiện tiên quyết và dependencies | |||
| - Các bước cài đặt | |||
| - Chi tiết cấu hình | |||
| @@ -94,4 +95,3 @@ Chúng tôi khuyến nghị xem xét kỹ tài liệu này trước khi tiến h | |||
| ## Nhận trợ giúp | |||
| Nếu bạn bị mắc kẹt hoặc có câu hỏi cấp bách trong quá trình đóng góp, chỉ cần gửi câu hỏi của bạn thông qua issue GitHub liên quan, hoặc tham gia [Discord](https://discord.gg/8Tpq4AcN9c) của chúng tôi để trò chuyện nhanh. | |||
| @@ -185,7 +185,8 @@ All of Dify's offerings come with corresponding APIs, so you could effortlessly | |||
| Use our [documentation](https://docs.dify.ai) for further references and more in-depth instructions. | |||
| - **Dify for enterprise / organizations</br>** | |||
| We provide additional enterprise-centric features. [Log your questions for us through this chatbot](https://udify.app/chat/22L1zSxg6yW1cWQg) or [send us an email](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) to discuss enterprise needs. </br> | |||
| We provide additional enterprise-centric features. [Log your questions for us through this chatbot](https://udify.app/chat/22L1zSxg6yW1cWQg) or [send us an email](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) to discuss enterprise needs. </br> | |||
| > For startups and small businesses using AWS, check out [Dify Premium on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) and deploy it to your own AWS VPC with one click. It's an affordable AMI offering with the option to create apps with custom logo and branding. | |||
| ## Staying ahead | |||
| @@ -230,16 +231,15 @@ Deploy Dify to AWS with [CDK](https://aws.amazon.com/cdk/) | |||
| #### Using Alibaba Cloud Computing Nest | |||
| Quickly deploy Dify to Alibaba cloud with [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| Quickly deploy Dify to Alibaba cloud with [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| #### Using Alibaba Cloud Data Management | |||
| One-Click deploy Dify to Alibaba Cloud with [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) | |||
| One-Click deploy Dify to Alibaba Cloud with [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) | |||
| #### Deploy to AKS with Azure Devops Pipeline | |||
| One-Click deploy Dify to AKS with [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| One-Click deploy Dify to AKS with [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## Contributing | |||
| @@ -52,7 +52,7 @@ | |||
| مشروع Dify هو منصة تطوير تطبيقات الذكاء الصناعي مفتوحة المصدر. تجمع واجهته البديهية بين سير العمل الذكي بالذكاء الاصطناعي وخط أنابيب RAG وقدرات الوكيل وإدارة النماذج وميزات الملاحظة وأكثر من ذلك، مما يتيح لك الانتقال بسرعة من المرحلة التجريبية إلى الإنتاج. إليك قائمة بالميزات الأساسية: | |||
| </br> </br> | |||
| **1. سير العمل**: قم ببناء واختبار سير عمل الذكاء الاصطناعي القوي على قماش بصري، مستفيدًا من جميع الميزات التالية وأكثر. | |||
| **1. سير العمل**: قم ببناء واختبار سير عمل الذكاء الاصطناعي القوي على قماش بصري، مستفيدًا من جميع الميزات التالية وأكثر. | |||
| **2. الدعم الشامل للنماذج**: تكامل سلس مع مئات من LLMs الخاصة / مفتوحة المصدر من عشرات من موفري التحليل والحلول المستضافة ذاتيًا، مما يغطي GPT و Mistral و Llama3 وأي نماذج متوافقة مع واجهة OpenAI API. يمكن العثور على قائمة كاملة بمزودي النموذج المدعومين [هنا](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| @@ -139,17 +139,17 @@ | |||
| ## استخدام Dify | |||
| - **سحابة </br>** | |||
| نحن نستضيف [خدمة Dify Cloud](https://dify.ai) لأي شخص لتجربتها بدون أي إعدادات. توفر كل قدرات النسخة التي تمت استضافتها ذاتيًا، وتتضمن 200 أمر GPT-4 مجانًا في خطة الصندوق الرملي. | |||
| نحن نستضيف [خدمة Dify Cloud](https://dify.ai) لأي شخص لتجربتها بدون أي إعدادات. توفر كل قدرات النسخة التي تمت استضافتها ذاتيًا، وتتضمن 200 أمر GPT-4 مجانًا في خطة الصندوق الرملي. | |||
| - **استضافة ذاتية لنسخة المجتمع Dify</br>** | |||
| ابدأ سريعًا في تشغيل Dify في بيئتك باستخدام [دليل البدء السريع](#البدء السريع). | |||
| استخدم [توثيقنا](https://docs.dify.ai) للمزيد من المراجع والتعليمات الأعمق. | |||
| ابدأ سريعًا في تشغيل Dify في بيئتك باستخدام \[دليل البدء السريع\](#البدء السريع). | |||
| استخدم [توثيقنا](https://docs.dify.ai) للمزيد من المراجع والتعليمات الأعمق. | |||
| - **مشروع Dify للشركات / المؤسسات</br>** | |||
| نحن نوفر ميزات إضافية مركزة على الشركات. [جدول اجتماع معنا](https://cal.com/guchenhe/30min) أو [أرسل لنا بريدًا إلكترونيًا](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) لمناقشة احتياجات الشركات. </br> | |||
| نحن نوفر ميزات إضافية مركزة على الشركات. [جدول اجتماع معنا](https://cal.com/guchenhe/30min) أو [أرسل لنا بريدًا إلكترونيًا](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) لمناقشة احتياجات الشركات. </br> | |||
| > بالنسبة للشركات الناشئة والشركات الصغيرة التي تستخدم خدمات AWS، تحقق من [Dify Premium على AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) ونشرها في شبكتك الخاصة على AWS VPC بنقرة واحدة. إنها عرض AMI بأسعار معقولة مع خيار إنشاء تطبيقات بشعار وعلامة تجارية مخصصة. | |||
| > | |||
| ## البقاء قدمًا | |||
| قم بإضافة نجمة إلى Dify على GitHub وتلق تنبيهًا فوريًا بالإصدارات الجديدة. | |||
| @@ -157,11 +157,11 @@ | |||
|  | |||
| ## البداية السريعة | |||
| > | |||
| > قبل تثبيت Dify، تأكد من أن جهازك يلبي الحد الأدنى من متطلبات النظام التالية: | |||
| > | |||
| >- معالج >= 2 نواة | |||
| >- ذاكرة وصول عشوائي (RAM) >= 4 جيجابايت | |||
| > - معالج >= 2 نواة | |||
| > - ذاكرة وصول عشوائي (RAM) >= 4 جيجابايت | |||
| </br> | |||
| @@ -212,8 +212,9 @@ docker compose up -d | |||
| - [AWS CDK بواسطة @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| #### استخدام Alibaba Cloud للنشر | |||
| [بسرعة نشر Dify إلى سحابة علي بابا مع عش الحوسبة السحابية علي بابا](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| [بسرعة نشر Dify إلى سحابة علي بابا مع عش الحوسبة السحابية علي بابا](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| #### استخدام Alibaba Cloud Data Management للنشر | |||
| انشر Dify على علي بابا كلاود بنقرة واحدة باستخدام [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) | |||
| @@ -222,7 +223,6 @@ docker compose up -d | |||
| انشر Dify على AKS بنقرة واحدة باستخدام [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## المساهمة | |||
| لأولئك الذين يرغبون في المساهمة، انظر إلى [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) لدينا. | |||
| @@ -237,6 +237,7 @@ docker compose up -d | |||
| </a> | |||
| ## المجتمع والاتصال | |||
| - [مناقشة GitHub](https://github.com/langgenius/dify/discussions). الأفضل لـ: مشاركة التعليقات وطرح الأسئلة. | |||
| - [المشكلات على GitHub](https://github.com/langgenius/dify/issues). الأفضل لـ: الأخطاء التي تواجهها في استخدام Dify.AI، واقتراحات الميزات. انظر [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). الأفضل لـ: مشاركة تطبيقاتك والترفيه مع المجتمع. | |||
| @@ -56,53 +56,55 @@ | |||
| ডিফাই একটি ওপেন-সোর্স LLM অ্যাপ ডেভেলপমেন্ট প্ল্যাটফর্ম। এটি ইন্টুইটিভ ইন্টারফেস, এজেন্টিক AI ওয়ার্কফ্লো, RAG পাইপলাইন, এজেন্ট ক্যাপাবিলিটি, মডেল ম্যানেজমেন্ট, মনিটরিং সুবিধা এবং আরও অনেক কিছু একত্রিত করে, যা দ্রুত প্রোটোটাইপ থেকে প্রোডাকশন পর্যন্ত নিয়ে যেতে সহায়তা করে। | |||
| ## কুইক স্টার্ট | |||
| > ডিফাই ইনস্টল করার আগে, নিশ্চিত করুন যে আপনার মেশিন নিম্নলিখিত ন্যূনতম কনফিগারেশনের প্রয়োজনীয়তা পূরন করে : | |||
| > | |||
| > ডিফাই ইনস্টল করার আগে, নিশ্চিত করুন যে আপনার মেশিন নিম্নলিখিত ন্যূনতম কনফিগারেশনের প্রয়োজনীয়তা পূরন করে : | |||
| > | |||
| >- সিপিউ >= 2 কোর | |||
| >- র্যাম >= 4 জিবি | |||
| > - সিপিউ >= 2 কোর | |||
| > - র্যাম >= 4 জিবি | |||
| </br> | |||
| ডিফাই সার্ভার চালু করার সবচেয়ে সহজ উপায় [docker compose](docker/docker-compose.yaml) মাধ্যমে। নিম্নলিখিত কমান্ডগুলো ব্যবহার করে ডিফাই চালানোর আগে, নিশ্চিত করুন যে আপনার মেশিনে [Docker](https://docs.docker.com/get-docker/) এবং [Docker Compose](https://docs.docker.com/compose/install/) ইনস্টল করা আছে : | |||
| ```bash | |||
| cd dify | |||
| cd docker | |||
| cp .env.example .env | |||
| docker compose up -d | |||
| ``` | |||
| চালানোর পর, আপনি আপনার ব্রাউজারে [http://localhost/install](http://localhost/install)-এ ডিফাই ড্যাশবোর্ডে অ্যাক্সেস করতে পারেন এবং ইনিশিয়ালাইজেশন প্রক্রিয়া শুরু করতে পারেন। | |||
| #### সাহায্যের খোঁজে | |||
| ডিফাই সেট আপ করতে সমস্যা হলে দয়া করে আমাদের [FAQ](https://docs.dify.ai/getting-started/install-self-hosted/faqs) দেখুন। যদি তবুও সমস্যা থেকে থাকে, তাহলে [কমিউনিটি এবং আমাদের](#community--contact) সাথে যোগাযোগ করুন। | |||
| ডিফাই সেট আপ করতে সমস্যা হলে দয়া করে আমাদের [FAQ](https://docs.dify.ai/getting-started/install-self-hosted/faqs) দেখুন। যদি তবুও সমস্যা থেকে থাকে, তাহলে [কমিউনিটি এবং আমাদের](#community--contact) সাথে যোগাযোগ করুন। | |||
| > যদি আপনি ডিফাইতে অবদান রাখতে বা অতিরিক্ত উন্নয়ন করতে চান, আমাদের [সোর্স কোড থেকে ডিপ্লয়মেন্টের গাইড](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code) দেখুন। | |||
| ## প্রধান ফিচারসমূহ | |||
| **১. ওয়ার্কফ্লো**: | |||
| ভিজ্যুয়াল ক্যানভাসে AI ওয়ার্কফ্লো তৈরি এবং পরীক্ষা করুন, নিম্নলিখিত সব ফিচার এবং তার বাইরেও আরও অনেক কিছু ব্যবহার করে। | |||
| ভিজ্যুয়াল ক্যানভাসে AI ওয়ার্কফ্লো তৈরি এবং পরীক্ষা করুন, নিম্নলিখিত সব ফিচার এবং তার বাইরেও আরও অনেক কিছু ব্যবহার করে। | |||
| **২. মডেল সাপোর্ট**: | |||
| GPT, Mistral, Llama3, এবং যেকোনো OpenAI API-সামঞ্জস্যপূর্ণ মডেলসহ, কয়েক ডজন ইনফারেন্স প্রদানকারী এবং সেল্ফ-হোস্টেড সমাধান থেকে শুরু করে প্রোপ্রাইটরি/ওপেন-সোর্স LLM-এর সাথে সহজে ইন্টিগ্রেশন। সমর্থিত মডেল প্রদানকারীদের একটি সম্পূর্ণ তালিকা পাওয়া যাবে [এখানে](https://docs.dify.ai/getting-started/readme/model-providers)। | |||
| **২. মডেল সাপোর্ট**: | |||
| GPT, Mistral, Llama3, এবং যেকোনো OpenAI API-সামঞ্জস্যপূর্ণ মডেলসহ, কয়েক ডজন ইনফারেন্স প্রদানকারী এবং সেল্ফ-হোস্টেড সমাধান থেকে শুরু করে প্রোপ্রাইটরি/ওপেন-সোর্স LLM-এর সাথে সহজে ইন্টিগ্রেশন। সমর্থিত মডেল প্রদানকারীদের একটি সম্পূর্ণ তালিকা পাওয়া যাবে [এখানে](https://docs.dify.ai/getting-started/readme/model-providers)। | |||
|  | |||
| **3. প্রম্পট IDE**: | |||
| প্রম্পট তৈরি, মডেলের পারফরম্যান্স তুলনা এবং চ্যাট-বেজড অ্যাপে টেক্সট-টু-স্পিচের মতো বৈশিষ্ট্য যুক্ত করার জন্য ইন্টুইটিভ ইন্টারফেস। | |||
| **3. প্রম্পট IDE**: | |||
| প্রম্পট তৈরি, মডেলের পারফরম্যান্স তুলনা এবং চ্যাট-বেজড অ্যাপে টেক্সট-টু-স্পিচের মতো বৈশিষ্ট্য যুক্ত করার জন্য ইন্টুইটিভ ইন্টারফেস। | |||
| **4. RAG পাইপলাইন**: | |||
| ডকুমেন্ট ইনজেশন থেকে শুরু করে রিট্রিভ পর্যন্ত সবকিছুই বিস্তৃত RAG ক্যাপাবিলিটির আওতাভুক্ত। PDF, PPT এবং অন্যান্য সাধারণ ডকুমেন্ট ফর্ম্যাট থেকে টেক্সট এক্সট্রাকশনের জন্য আউট-অফ-বক্স সাপোর্ট। | |||
| ডকুমেন্ট ইনজেশন থেকে শুরু করে রিট্রিভ পর্যন্ত সবকিছুই বিস্তৃত RAG ক্যাপাবিলিটির আওতাভুক্ত। PDF, PPT এবং অন্যান্য সাধারণ ডকুমেন্ট ফর্ম্যাট থেকে টেক্সট এক্সট্রাকশনের জন্য আউট-অফ-বক্স সাপোর্ট। | |||
| **5. এজেন্ট ক্যাপাবিলিটি**: | |||
| LLM ফাংশন কলিং বা ReAct উপর ভিত্তি করে এজেন্ট ডিফাইন করতে পারেন এবং এজেন্টের জন্য পূর্ব-নির্মিত বা কাস্টম টুলস যুক্ত করতে পারেন। Dify AI এজেন্টদের জন্য 50+ বিল্ট-ইন টুলস সরবরাহ করে, যেমন Google Search, DALL·E, Stable Diffusion এবং WolframAlpha। | |||
| **5. এজেন্ট ক্যাপাবিলিটি**: | |||
| LLM ফাংশন কলিং বা ReAct উপর ভিত্তি করে এজেন্ট ডিফাইন করতে পারেন এবং এজেন্টের জন্য পূর্ব-নির্মিত বা কাস্টম টুলস যুক্ত করতে পারেন। Dify AI এজেন্টদের জন্য 50+ বিল্ট-ইন টুলস সরবরাহ করে, যেমন Google Search, DALL·E, Stable Diffusion এবং WolframAlpha। | |||
| **6. এলএলএম-অপ্স**: | |||
| সময়ের সাথে সাথে অ্যাপ্লিকেশন লগ এবং পারফরম্যান্স মনিটর এবং বিশ্লেষণ করুন। প্রডাকশন ডেটা এবং annotation এর উপর ভিত্তি করে প্রম্পট, ডেটাসেট এবং মডেলগুলিকে ক্রমাগত উন্নত করতে পারেন। | |||
| **6. এলএলএম-অপ্স**: | |||
| সময়ের সাথে সাথে অ্যাপ্লিকেশন লগ এবং পারফরম্যান্স মনিটর এবং বিশ্লেষণ করুন। প্রডাকশন ডেটা এবং annotation এর উপর ভিত্তি করে প্রম্পট, ডেটাসেট এবং মডেলগুলিকে ক্রমাগত উন্নত করতে পারেন। | |||
| **7. ব্যাকএন্ড-অ্যাজ-এ-সার্ভিস**: | |||
| ডিফাই-এর সমস্ত অফার সংশ্লিষ্ট API-সহ আছে, যাতে আপনি অনায়াসে ডিফাইকে আপনার নিজস্ব বিজনেস লজিকে ইন্টেগ্রেট করতে পারেন। | |||
| ডিফাই-এর সমস্ত অফার সংশ্লিষ্ট API-সহ আছে, যাতে আপনি অনায়াসে ডিফাইকে আপনার নিজস্ব বিজনেস লজিকে ইন্টেগ্রেট করতে পারেন। | |||
| ## বৈশিষ্ট্য তুলনা | |||
| @@ -172,17 +174,17 @@ docker compose up -d | |||
| </tr> | |||
| </table> | |||
| ## ডিফাই-এর ব্যবহার | |||
| ## ডিফাই-এর ব্যবহার | |||
| - **ক্লাউড </br>** | |||
| জিরো সেটাপে ব্যবহার করতে আমাদের [Dify Cloud](https://dify.ai) সার্ভিসটি ব্যবহার করতে পারেন। এখানে সেল্ফহোস্টিং-এর সকল ফিচার ও ক্যাপাবিলিটিসহ স্যান্ডবক্সে ২০০ জিপিটি-৪ কল ফ্রি পাবেন। | |||
| জিরো সেটাপে ব্যবহার করতে আমাদের [Dify Cloud](https://dify.ai) সার্ভিসটি ব্যবহার করতে পারেন। এখানে সেল্ফহোস্টিং-এর সকল ফিচার ও ক্যাপাবিলিটিসহ স্যান্ডবক্সে ২০০ জিপিটি-৪ কল ফ্রি পাবেন। | |||
| - **সেল্ফহোস্টিং ডিফাই কমিউনিটি সংস্করণ</br>** | |||
| সেল্ফহোস্ট করতে এই [স্টার্টার গাইড](#quick-start) ব্যবহার করে দ্রুত আপনার এনভায়রনমেন্টে ডিফাই চালান। | |||
| আরো ইন-ডেপথ রেফারেন্সের জন্য [ডকুমেন্টেশন](https://docs.dify.ai) দেখেন। | |||
| সেল্ফহোস্ট করতে এই [স্টার্টার গাইড](#quick-start) ব্যবহার করে দ্রুত আপনার এনভায়রনমেন্টে ডিফাই চালান। | |||
| আরো ইন-ডেপথ রেফারেন্সের জন্য [ডকুমেন্টেশন](https://docs.dify.ai) দেখেন। | |||
| - **এন্টারপ্রাইজ / প্রতিষ্ঠানের জন্য Dify</br>** | |||
| আমরা এন্টারপ্রাইজ/প্রতিষ্ঠান-কেন্দ্রিক সেবা প্রদান করে থাকি । [এই চ্যাটবটের মাধ্যমে আপনার প্রশ্নগুলি আমাদের জন্য লগ করুন।](https://udify.app/chat/22L1zSxg6yW1cWQg) অথবা [আমাদের ইমেল পাঠান](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) আপনার চাহিদা সম্পর্কে আলোচনা করার জন্য। </br> | |||
| আমরা এন্টারপ্রাইজ/প্রতিষ্ঠান-কেন্দ্রিক সেবা প্রদান করে থাকি । [এই চ্যাটবটের মাধ্যমে আপনার প্রশ্নগুলি আমাদের জন্য লগ করুন।](https://udify.app/chat/22L1zSxg6yW1cWQg) অথবা [আমাদের ইমেল পাঠান](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) আপনার চাহিদা সম্পর্কে আলোচনা করার জন্য। </br> | |||
| > AWS ব্যবহারকারী স্টার্টআপ এবং ছোট ব্যবসার জন্য, [AWS মার্কেটপ্লেসে Dify Premium](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) দেখুন এবং এক-ক্লিকের মাধ্যমে এটি আপনার নিজস্ব AWS VPC-তে ডিপ্লয় করুন। এটি একটি সাশ্রয়ী মূল্যের AMI অফার, যাতে কাস্টম লোগো এবং ব্র্যান্ডিং সহ অ্যাপ তৈরির সুবিধা আছে। | |||
| @@ -194,10 +196,10 @@ GitHub-এ ডিফাইকে স্টার দিয়ে রাখুন | |||
| ## Advanced Setup | |||
| যদি আপনার কনফিগারেশনটি কাস্টমাইজ করার প্রয়োজন হয়, তাহলে অনুগ্রহ করে আমাদের [.env.example](docker/.env.example) ফাইল দেখুন এবং আপনার `.env` ফাইলে সংশ্লিষ্ট মানগুলি আপডেট করুন। এছাড়াও, আপনার নির্দিষ্ট এনভায়রনমেন্ট এবং প্রয়োজনীয়তার উপর ভিত্তি করে আপনাকে `docker-compose.yaml` ফাইলে সমন্বয় করতে হতে পারে, যেমন ইমেজ ভার্সন পরিবর্তন করা, পোর্ট ম্যাপিং করা, অথবা ভলিউম মাউন্ট করা। | |||
| যদি আপনার কনফিগারেশনটি কাস্টমাইজ করার প্রয়োজন হয়, তাহলে অনুগ্রহ করে আমাদের [.env.example](docker/.env.example) ফাইল দেখুন এবং আপনার `.env` ফাইলে সংশ্লিষ্ট মানগুলি আপডেট করুন। এছাড়াও, আপনার নির্দিষ্ট এনভায়রনমেন্ট এবং প্রয়োজনীয়তার উপর ভিত্তি করে আপনাকে `docker-compose.yaml` ফাইলে সমন্বয় করতে হতে পারে, যেমন ইমেজ ভার্সন পরিবর্তন করা, পোর্ট ম্যাপিং করা, অথবা ভলিউম মাউন্ট করা। | |||
| যেকোনো পরিবর্তন করার পর, অনুগ্রহ করে `docker-compose up -d` পুনরায় চালান। ভেরিয়েবলের সম্পূর্ণ তালিকা [এখানে] (https://docs.dify.ai/getting-started/install-self-hosted/environments) খুঁজে পেতে পারেন। | |||
| যদি আপনি একটি হাইলি এভেইলেবল সেটআপ কনফিগার করতে চান, তাহলে কমিউনিটি [Helm Charts](https://helm.sh/) এবং YAML ফাইল রয়েছে যা Dify কে Kubernetes-এ ডিপ্লয় করার প্রক্রিয়া বর্ণনা করে। | |||
| যদি আপনি একটি হাইলি এভেইলেবল সেটআপ কনফিগার করতে চান, তাহলে কমিউনিটি [Helm Charts](https://helm.sh/) এবং YAML ফাইল রয়েছে যা Dify কে Kubernetes-এ ডিপ্লয় করার প্রক্রিয়া বর্ণনা করে। | |||
| - [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) | |||
| - [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) | |||
| @@ -206,7 +208,6 @@ GitHub-এ ডিফাইকে স্টার দিয়ে রাখুন | |||
| - [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) | |||
| - [🚀 নতুন! YAML ফাইলসমূহ (Dify v1.6.0 সমর্থিত) তৈরি করেছেন @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) | |||
| #### টেরাফর্ম ব্যবহার করে ডিপ্লয় | |||
| [terraform](https://www.terraform.io/) ব্যবহার করে এক ক্লিকেই ক্লাউড প্ল্যাটফর্মে Dify ডিপ্লয় করুন। | |||
| @@ -230,17 +231,16 @@ GitHub-এ ডিফাইকে স্টার দিয়ে রাখুন | |||
| #### Alibaba Cloud ব্যবহার করে ডিপ্লয় | |||
| [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| #### Alibaba Cloud Data Management ব্যবহার করে ডিপ্লয় | |||
| [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) | |||
| [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) | |||
| #### AKS-এ ডিপ্লয় করার জন্য Azure Devops Pipeline ব্যবহার | |||
| #### AKS-এ ডিপ্লয় করার জন্য Azure Devops Pipeline ব্যবহার | |||
| [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) ব্যবহার করে Dify কে AKS-এ এক ক্লিকে ডিপ্লয় করুন | |||
| ## Contributing | |||
| যারা কোড অবদান রাখতে চান, তাদের জন্য আমাদের [অবদান নির্দেশিকা] দেখুন (https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)। | |||
| @@ -251,9 +251,9 @@ GitHub-এ ডিফাইকে স্টার দিয়ে রাখুন | |||
| ## কমিউনিটি এবং যোগাযোগ | |||
| - [GitHub Discussion](https://github.com/langgenius/dify/discussions) ফিডব্যাক এবং প্রতিক্রিয়া জানানোর মাধ্যম। | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues). Dify.AI ব্যবহার করে আপনি যেসব বাগের সম্মুখীন হন এবং ফিচার প্রস্তাবনা। আমাদের [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) দেখুন। | |||
| - [Discord](https://discord.gg/FngNHpbcY7) আপনার এপ্লিকেশন শেয়ার এবং কমিউনিটি আড্ডার মাধ্যম। | |||
| - [X(Twitter)](https://twitter.com/dify_ai) আপনার এপ্লিকেশন শেয়ার এবং কমিউনিটি আড্ডার মাধ্যম। | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues). Dify.AI ব্যবহার করে আপনি যেসব বাগের সম্মুখীন হন এবং ফিচার প্রস্তাবনা। আমাদের [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) দেখুন। | |||
| - [Discord](https://discord.gg/FngNHpbcY7) আপনার এপ্লিকেশন শেয়ার এবং কমিউনিটি আড্ডার মাধ্যম। | |||
| - [X(Twitter)](https://twitter.com/dify_ai) আপনার এপ্লিকেশন শেয়ার এবং কমিউনিটি আড্ডার মাধ্যম। | |||
| **অবদানকারীদের তালিকা** | |||
| @@ -265,7 +265,7 @@ GitHub-এ ডিফাইকে স্টার দিয়ে রাখুন | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## নিরাপত্তা বিষয়ক | |||
| ## নিরাপত্তা বিষয়ক | |||
| আপনার গোপনীয়তা রক্ষা করতে, অনুগ্রহ করে GitHub-এ নিরাপত্তা সংক্রান্ত সমস্যা পোস্ট করা এড়িয়ে চলুন। পরিবর্তে, আপনার প্রশ্নগুলি <security@dify.ai> ঠিকানায় পাঠান এবং আমরা আপনাকে আরও বিস্তারিত উত্তর প্রদান করব। | |||
| @@ -48,8 +48,7 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </div> | |||
| # | |||
| # | |||
| <div align="center"> | |||
| <a href="https://trendshift.io/repositories/2152" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2152" alt="langgenius%2Fdify | 趋势转变" style="width: 250px; height: 55px;" width="250" height="55"/></a> | |||
| @@ -58,32 +57,31 @@ | |||
| Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。以下是其核心功能列表: | |||
| </br> </br> | |||
| **1. 工作流**: | |||
| 在画布上构建和测试功能强大的 AI 工作流程,利用以下所有功能以及更多功能。 | |||
| **1. 工作流**: | |||
| 在画布上构建和测试功能强大的 AI 工作流程,利用以下所有功能以及更多功能。 | |||
| **2. 全面的模型支持**: | |||
| 与数百种专有/开源 LLMs 以及数十种推理提供商和自托管解决方案无缝集成,涵盖 GPT、Mistral、Llama3 以及任何与 OpenAI API 兼容的模型。完整的支持模型提供商列表可在[此处](https://docs.dify.ai/getting-started/readme/model-providers)找到。 | |||
| **2. 全面的模型支持**: | |||
| 与数百种专有/开源 LLMs 以及数十种推理提供商和自托管解决方案无缝集成,涵盖 GPT、Mistral、Llama3 以及任何与 OpenAI API 兼容的模型。完整的支持模型提供商列表可在[此处](https://docs.dify.ai/getting-started/readme/model-providers)找到。 | |||
|  | |||
| **3. Prompt IDE**: | |||
| 用于制作提示、比较模型性能以及向基于聊天的应用程序添加其他功能(如文本转语音)的直观界面。 | |||
| **3. Prompt IDE**: | |||
| 用于制作提示、比较模型性能以及向基于聊天的应用程序添加其他功能(如文本转语音)的直观界面。 | |||
| **4. RAG Pipeline**: | |||
| 广泛的 RAG 功能,涵盖从文档摄入到检索的所有内容,支持从 PDF、PPT 和其他常见文档格式中提取文本的开箱即用的支持。 | |||
| **4. RAG Pipeline**: | |||
| 广泛的 RAG 功能,涵盖从文档摄入到检索的所有内容,支持从 PDF、PPT 和其他常见文档格式中提取文本的开箱即用的支持。 | |||
| **5. Agent 智能体**: | |||
| 您可以基于 LLM 函数调用或 ReAct 定义 Agent,并为 Agent 添加预构建或自定义工具。Dify 为 AI Agent 提供了 50 多种内置工具,如谷歌搜索、DALL·E、Stable Diffusion 和 WolframAlpha 等。 | |||
| **5. Agent 智能体**: | |||
| 您可以基于 LLM 函数调用或 ReAct 定义 Agent,并为 Agent 添加预构建或自定义工具。Dify 为 AI Agent 提供了 50 多种内置工具,如谷歌搜索、DALL·E、Stable Diffusion 和 WolframAlpha 等。 | |||
| **6. LLMOps**: | |||
| 随时间监视和分析应用程序日志和性能。您可以根据生产数据和标注持续改进提示、数据集和模型。 | |||
| **7. 后端即服务**: | |||
| 所有 Dify 的功能都带有相应的 API,因此您可以轻松地将 Dify 集成到自己的业务逻辑中。 | |||
| **6. LLMOps**: | |||
| 随时间监视和分析应用程序日志和性能。您可以根据生产数据和标注持续改进提示、数据集和模型。 | |||
| **7. 后端即服务**: | |||
| 所有 Dify 的功能都带有相应的 API,因此您可以轻松地将 Dify 集成到自己的业务逻辑中。 | |||
| ## 功能比较 | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">功能</th> | |||
| @@ -153,14 +151,15 @@ Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI | |||
| ## 使用 Dify | |||
| - **云 </br>** | |||
| 我们提供[ Dify 云服务](https://dify.ai),任何人都可以零设置尝试。它提供了自部署版本的所有功能,并在沙盒计划中包含 200 次免费的 GPT-4 调用。 | |||
| 我们提供[ Dify 云服务](https://dify.ai),任何人都可以零设置尝试。它提供了自部署版本的所有功能,并在沙盒计划中包含 200 次免费的 GPT-4 调用。 | |||
| - **自托管 Dify 社区版</br>** | |||
| 使用这个[入门指南](#快速启动)快速在您的环境中运行 Dify。 | |||
| 使用我们的[文档](https://docs.dify.ai)进行进一步的参考和更深入的说明。 | |||
| 使用这个[入门指南](#%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8)快速在您的环境中运行 Dify。 | |||
| 使用我们的[文档](https://docs.dify.ai)进行进一步的参考和更深入的说明。 | |||
| - **面向企业/组织的 Dify</br>** | |||
| 我们提供额外的面向企业的功能。[给我们发送电子邮件](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry)讨论企业需求。 </br> | |||
| 我们提供额外的面向企业的功能。[给我们发送电子邮件](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry)讨论企业需求。 </br> | |||
| > 对于使用 AWS 的初创公司和中小型企业,请查看 [AWS Marketplace 上的 Dify 高级版](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6),并使用一键部署到您自己的 AWS VPC。它是一个价格实惠的 AMI 产品,提供了使用自定义徽标和品牌创建应用程序的选项。 | |||
| ## 保持领先 | |||
| @@ -199,30 +198,35 @@ docker compose up -d | |||
| 使用 [Helm Chart](https://helm.sh/) 版本或者 Kubernetes 资源清单(YAML),可以在 Kubernetes 上部署 Dify。 | |||
| - [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) | |||
| - [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) | |||
| - [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) | |||
| - [YAML 文件 by @Winson-030](https://github.com/Winson-030/dify-kubernetes) | |||
| - [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) | |||
| - [🚀 NEW! YAML 文件 (支持 Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) | |||
| #### 使用 Terraform 部署 | |||
| 使用 [terraform](https://www.terraform.io/) 一键将 Dify 部署到云平台 | |||
| ##### Azure Global | |||
| - [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### 使用 AWS CDK 部署 | |||
| 使用 [CDK](https://aws.amazon.com/cdk/) 将 Dify 部署到 AWS | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -242,7 +246,6 @@ docker compose up -d | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## Contributing | |||
| 对于那些想要贡献代码的人,请参阅我们的[贡献指南](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)。 | |||
| @@ -262,10 +265,10 @@ docker compose up -d | |||
| - [GitHub Discussion](https://github.com/langgenius/dify/discussions). 👉:分享您的应用程序并与社区交流。 | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues)。👉:使用 Dify.AI 时遇到的错误和问题,请参阅[贡献指南](CONTRIBUTING.md)。 | |||
| - [电子邮件支持](mailto:hello@dify.ai?subject=[GitHub]Questions%20About%20Dify)。👉:关于使用 Dify.AI 的问题。 | |||
| - [电子邮件支持](mailto:hello@dify.ai?subject=%5BGitHub%5DQuestions%20About%20Dify)。👉:关于使用 Dify.AI 的问题。 | |||
| - [Discord](https://discord.gg/FngNHpbcY7)。👉:分享您的应用程序并与社区交流。 | |||
| - [X(Twitter)](https://twitter.com/dify_ai)。👉:分享您的应用程序并与社区交流。 | |||
| - [商业许可](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry)。👉:有关商业用途许可 Dify.AI 的商业咨询。 | |||
| - [商业许可](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry)。👉:有关商业用途许可 Dify.AI 的商业咨询。 | |||
| ## 安全问题 | |||
| @@ -56,10 +56,11 @@ | |||
| Dify ist eine Open-Source-Plattform zur Entwicklung von LLM-Anwendungen. Ihre intuitive Benutzeroberfläche vereint agentenbasierte KI-Workflows, RAG-Pipelines, Agentenfunktionen, Modellverwaltung, Überwachungsfunktionen und mehr, sodass Sie schnell von einem Prototyp in die Produktion übergehen können. | |||
| ## Schnellstart | |||
| > Bevor Sie Dify installieren, stellen Sie sicher, dass Ihr System die folgenden Mindestanforderungen erfüllt: | |||
| > | |||
| >- CPU >= 2 Core | |||
| >- RAM >= 4 GiB | |||
| > | |||
| > - CPU >= 2 Core | |||
| > - RAM >= 4 GiB | |||
| </br> | |||
| @@ -75,37 +76,38 @@ docker compose up -d | |||
| Nachdem Sie den Server gestartet haben, können Sie über Ihren Browser auf das Dify Dashboard unter [http://localhost/install](http://localhost/install) zugreifen und den Initialisierungsprozess starten. | |||
| #### Hilfe suchen | |||
| Bitte beachten Sie unsere [FAQ](https://docs.dify.ai/getting-started/install-self-hosted/faqs), wenn Sie Probleme bei der Einrichtung von Dify haben. Wenden Sie sich an [die Community und uns](#community--contact), falls weiterhin Schwierigkeiten auftreten. | |||
| > Wenn Sie zu Dify beitragen oder zusätzliche Entwicklungen durchführen möchten, lesen Sie bitte unseren [Leitfaden zur Bereitstellung aus dem Quellcode](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code). | |||
| ## Wesentliche Merkmale | |||
| **1. Workflow**: | |||
| Erstellen und testen Sie leistungsstarke KI-Workflows auf einer visuellen Oberfläche, wobei Sie alle der folgenden Funktionen und darüber hinaus nutzen können. | |||
| **2. Umfassende Modellunterstützung**: | |||
| Nahtlose Integration mit Hunderten von proprietären und Open-Source-LLMs von Dutzenden Inferenzanbietern und selbstgehosteten Lösungen, die GPT, Mistral, Llama3 und alle mit der OpenAI API kompatiblen Modelle abdecken. Eine vollständige Liste der unterstützten Modellanbieter finden Sie [hier](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **1. Workflow**: | |||
| Erstellen und testen Sie leistungsstarke KI-Workflows auf einer visuellen Oberfläche, wobei Sie alle der folgenden Funktionen und darüber hinaus nutzen können. | |||
| **2. Umfassende Modellunterstützung**: | |||
| Nahtlose Integration mit Hunderten von proprietären und Open-Source-LLMs von Dutzenden Inferenzanbietern und selbstgehosteten Lösungen, die GPT, Mistral, Llama3 und alle mit der OpenAI API kompatiblen Modelle abdecken. Eine vollständige Liste der unterstützten Modellanbieter finden Sie [hier](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. Prompt IDE**: | |||
| Intuitive Benutzeroberfläche zum Erstellen von Prompts, zum Vergleichen der Modellleistung und zum Hinzufügen zusätzlicher Funktionen wie Text-to-Speech in einer chatbasierten Anwendung. | |||
| **3. Prompt IDE**: | |||
| Intuitive Benutzeroberfläche zum Erstellen von Prompts, zum Vergleichen der Modellleistung und zum Hinzufügen zusätzlicher Funktionen wie Text-to-Speech in einer chatbasierten Anwendung. | |||
| **4. RAG Pipeline**: | |||
| Umfassende RAG-Funktionalitäten, die alles von der Dokumenteneinlesung bis zur -abfrage abdecken, mit sofort einsatzbereiter Unterstützung für die Textextraktion aus PDFs, PPTs und anderen gängigen Dokumentformaten. | |||
| **4. RAG Pipeline**: | |||
| Umfassende RAG-Funktionalitäten, die alles von der Dokumenteneinlesung bis zur -abfrage abdecken, mit sofort einsatzbereiter Unterstützung für die Textextraktion aus PDFs, PPTs und anderen gängigen Dokumentformaten. | |||
| **5. Fähigkeiten des Agenten**: | |||
| Sie können Agenten basierend auf LLM Function Calling oder ReAct definieren und vorgefertigte oder benutzerdefinierte Tools für den Agenten hinzufügen. Dify stellt über 50 integrierte Tools für KI-Agenten bereit, wie zum Beispiel Google Search, DALL·E, Stable Diffusion und WolframAlpha. | |||
| **5. Fähigkeiten des Agenten**: | |||
| Sie können Agenten basierend auf LLM Function Calling oder ReAct definieren und vorgefertigte oder benutzerdefinierte Tools für den Agenten hinzufügen. Dify stellt über 50 integrierte Tools für KI-Agenten bereit, wie zum Beispiel Google Search, DALL·E, Stable Diffusion und WolframAlpha. | |||
| **6. LLMOps**: | |||
| Überwachen und analysieren Sie Anwendungsprotokolle und die Leistung im Laufe der Zeit. Sie können kontinuierlich Prompts, Datensätze und Modelle basierend auf Produktionsdaten und Annotationen verbessern. | |||
| **6. LLMOps**: | |||
| Überwachen und analysieren Sie Anwendungsprotokolle und die Leistung im Laufe der Zeit. Sie können kontinuierlich Prompts, Datensätze und Modelle basierend auf Produktionsdaten und Annotationen verbessern. | |||
| **7. Backend-as-a-Service**: | |||
| Alle Dify-Angebote kommen mit entsprechenden APIs, sodass Sie Dify mühelos in Ihre eigene Geschäftslogik integrieren können. | |||
| **7. Backend-as-a-Service**: | |||
| Alle Dify-Angebote kommen mit entsprechenden APIs, sodass Sie Dify mühelos in Ihre eigene Geschäftslogik integrieren können. | |||
| ## Vergleich der Merkmale | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Feature</th> | |||
| @@ -175,15 +177,15 @@ Bitte beachten Sie unsere [FAQ](https://docs.dify.ai/getting-started/install-sel | |||
| ## Dify verwenden | |||
| - **Cloud </br>** | |||
| Wir hosten einen [Dify Cloud](https://dify.ai)-Service, den jeder ohne Einrichtung ausprobieren kann. Er bietet alle Funktionen der selbstgehosteten Version und beinhaltet 200 kostenlose GPT-4-Aufrufe im Sandbox-Plan. | |||
| Wir hosten einen [Dify Cloud](https://dify.ai)-Service, den jeder ohne Einrichtung ausprobieren kann. Er bietet alle Funktionen der selbstgehosteten Version und beinhaltet 200 kostenlose GPT-4-Aufrufe im Sandbox-Plan. | |||
| - **Selbstgehostete Dify Community Edition</br>** | |||
| Starten Sie Dify schnell in Ihrer Umgebung mit diesem [Schnellstart-Leitfaden](#quick-start). Nutzen Sie unsere [Dokumentation](https://docs.dify.ai) für weiterführende Informationen und detaillierte Anweisungen. | |||
| Starten Sie Dify schnell in Ihrer Umgebung mit diesem [Schnellstart-Leitfaden](#quick-start). Nutzen Sie unsere [Dokumentation](https://docs.dify.ai) für weiterführende Informationen und detaillierte Anweisungen. | |||
| - **Dify für Unternehmen / Organisationen</br>** | |||
| Wir bieten zusätzliche, unternehmensspezifische Funktionen. [Über diesen Chatbot können Sie uns Ihre Fragen mitteilen](https://udify.app/chat/22L1zSxg6yW1cWQg) oder [senden Sie uns eine E-Mail](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry), um Ihre unternehmerischen Bedürfnisse zu besprechen. </br> | |||
| > Für Startups und kleine Unternehmen, die AWS nutzen, schauen Sie sich [Dify Premium on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) an und stellen Sie es mit nur einem Klick in Ihrer eigenen AWS VPC bereit. Es handelt sich um ein erschwingliches AMI-Angebot mit der Option, Apps mit individuellem Logo und Branding zu erstellen. | |||
| Wir bieten zusätzliche, unternehmensspezifische Funktionen. [Über diesen Chatbot können Sie uns Ihre Fragen mitteilen](https://udify.app/chat/22L1zSxg6yW1cWQg) oder [senden Sie uns eine E-Mail](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry), um Ihre unternehmerischen Bedürfnisse zu besprechen. </br> | |||
| > Für Startups und kleine Unternehmen, die AWS nutzen, schauen Sie sich [Dify Premium on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) an und stellen Sie es mit nur einem Klick in Ihrer eigenen AWS VPC bereit. Es handelt sich um ein erschwingliches AMI-Angebot mit der Option, Apps mit individuellem Logo und Branding zu erstellen. | |||
| ## Immer einen Schritt voraus | |||
| @@ -191,7 +193,6 @@ Star Dify auf GitHub und lassen Sie sich sofort über neue Releases benachrichti | |||
|  | |||
| ## Erweiterte Einstellungen | |||
| Falls Sie die Konfiguration anpassen müssen, lesen Sie bitte die Kommentare in unserer [.env.example](docker/.env.example)-Datei und aktualisieren Sie die entsprechenden Werte in Ihrer `.env`-Datei. Zusätzlich müssen Sie eventuell Anpassungen an der `docker-compose.yaml`-Datei vornehmen, wie zum Beispiel das Ändern von Image-Versionen, Portzuordnungen oder Volumen-Mounts, je nach Ihrer spezifischen Einsatzumgebung und Ihren Anforderungen. Nachdem Sie Änderungen vorgenommen haben, starten Sie `docker-compose up -d` erneut. Eine vollständige Liste der verfügbaren Umgebungsvariablen finden Sie [hier](https://docs.dify.ai/getting-started/install-self-hosted/environments). | |||
| @@ -210,20 +211,23 @@ Falls Sie eine hochverfügbare Konfiguration einrichten möchten, gibt es von de | |||
| Stellen Sie Dify mit nur einem Klick mithilfe von [terraform](https://www.terraform.io/) auf einer Cloud-Plattform bereit. | |||
| ##### Azure Global | |||
| - [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### Verwendung von AWS CDK für die Bereitstellung | |||
| Bereitstellung von Dify auf AWS mit [CDK](https://aws.amazon.com/cdk/) | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| #### Alibaba Cloud | |||
| #### Alibaba Cloud | |||
| [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| @@ -235,20 +239,18 @@ Ein-Klick-Bereitstellung von Dify in der Alibaba Cloud mit [Alibaba Cloud Data M | |||
| Stellen Sie Dify mit einem Klick in AKS bereit, indem Sie [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) verwenden | |||
| ## Contributing | |||
| Falls Sie Code beitragen möchten, lesen Sie bitte unseren [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). Gleichzeitig bitten wir Sie, Dify zu unterstützen, indem Sie es in den sozialen Medien teilen und auf Veranstaltungen und Konferenzen präsentieren. | |||
| > Wir suchen Mitwirkende, die dabei helfen, Dify in weitere Sprachen zu übersetzen – außer Mandarin oder Englisch. Wenn Sie Interesse an einer Mitarbeit haben, lesen Sie bitte die [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) für weitere Informationen und hinterlassen Sie einen Kommentar im `global-users`-Kanal unseres [Discord Community Servers](https://discord.gg/8Tpq4AcN9c). | |||
| ## Gemeinschaft & Kontakt | |||
| * [GitHub Discussion](https://github.com/langgenius/dify/discussions). Am besten geeignet für: den Austausch von Feedback und das Stellen von Fragen. | |||
| * [GitHub Issues](https://github.com/langgenius/dify/issues). Am besten für: Fehler, auf die Sie bei der Verwendung von Dify.AI stoßen, und Funktionsvorschläge. Siehe unseren [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Am besten geeignet für: den Austausch von Bewerbungen und den Austausch mit der Community. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Am besten geeignet für: den Austausch von Bewerbungen und den Austausch mit der Community. | |||
| - [GitHub Discussion](https://github.com/langgenius/dify/discussions). Am besten geeignet für: den Austausch von Feedback und das Stellen von Fragen. | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues). Am besten für: Fehler, auf die Sie bei der Verwendung von Dify.AI stoßen, und Funktionsvorschläge. Siehe unseren [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Am besten geeignet für: den Austausch von Bewerbungen und den Austausch mit der Community. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Am besten geeignet für: den Austausch von Bewerbungen und den Austausch mit der Community. | |||
| **Mitwirkende** | |||
| @@ -260,7 +262,6 @@ Falls Sie Code beitragen möchten, lesen Sie bitte unseren [Contribution Guide]( | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## Offenlegung der Sicherheit | |||
| Um Ihre Privatsphäre zu schützen, vermeiden Sie es bitte, Sicherheitsprobleme auf GitHub zu posten. Schicken Sie Ihre Fragen stattdessen an security@dify.ai und wir werden Ihnen eine ausführlichere Antwort geben. | |||
| @@ -268,4 +269,3 @@ Um Ihre Privatsphäre zu schützen, vermeiden Sie es bitte, Sicherheitsprobleme | |||
| ## Lizenz | |||
| Dieses Repository steht unter der [Dify Open Source License](LICENSE), die im Wesentlichen Apache 2.0 mit einigen zusätzlichen Einschränkungen ist. | |||
| @@ -48,7 +48,7 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| # | |||
| # | |||
| <p align="center"> | |||
| <a href="https://trendshift.io/repositories/2152" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2152" alt="langgenius%2Fdify | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> | |||
| @@ -56,32 +56,31 @@ | |||
| Dify es una plataforma de desarrollo de aplicaciones de LLM de código abierto. Su interfaz intuitiva combina flujo de trabajo de IA, pipeline RAG, capacidades de agente, gestión de modelos, características de observabilidad y más, lo que le permite pasar rápidamente de un prototipo a producción. Aquí hay una lista de las características principales: | |||
| </br> </br> | |||
| **1. Flujo de trabajo**: | |||
| Construye y prueba potentes flujos de trabajo de IA en un lienzo visual, aprovechando todas las siguientes características y más. | |||
| **1. Flujo de trabajo**: | |||
| Construye y prueba potentes flujos de trabajo de IA en un lienzo visual, aprovechando todas las siguientes características y más. | |||
| **2. Soporte de modelos completo**: | |||
| Integración perfecta con cientos de LLMs propietarios / de código abierto de docenas de proveedores de inferencia y soluciones auto-alojadas, que cubren GPT, Mistral, Llama3 y cualquier modelo compatible con la API de OpenAI. Se puede encontrar una lista completa de proveedores de modelos admitidos [aquí](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **2. Soporte de modelos completo**: | |||
| Integración perfecta con cientos de LLMs propietarios / de código abierto de docenas de proveedores de inferencia y soluciones auto-alojadas, que cubren GPT, Mistral, Llama3 y cualquier modelo compatible con la API de OpenAI. Se puede encontrar una lista completa de proveedores de modelos admitidos [aquí](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. IDE de prompt**: | |||
| Interfaz intuitiva para crear prompts, comparar el rendimiento del modelo y agregar características adicionales como texto a voz a una aplicación basada en chat. | |||
| **3. IDE de prompt**: | |||
| Interfaz intuitiva para crear prompts, comparar el rendimiento del modelo y agregar características adicionales como texto a voz a una aplicación basada en chat. | |||
| **4. Pipeline RAG**: | |||
| Amplias capacidades de RAG que cubren todo, desde la ingestión de documentos hasta la recuperación, con soporte listo para usar para la extracción de texto de PDF, PPT y otros formatos de documento comunes. | |||
| **4. Pipeline RAG**: | |||
| Amplias capacidades de RAG que cubren todo, desde la ingestión de documentos hasta la recuperación, con soporte listo para usar para la extracción de texto de PDF, PPT y otros formatos de documento comunes. | |||
| **5. Capacidades de agente**: | |||
| Puedes definir agentes basados en LLM Function Calling o ReAct, y agregar herramientas preconstruidas o personalizadas para el agente. Dify proporciona más de 50 herramientas integradas para agentes de IA, como Búsqueda de Google, DALL·E, Difusión Estable y WolframAlpha. | |||
| **5. Capacidades de agente**: | |||
| Puedes definir agentes basados en LLM Function Calling o ReAct, y agregar herramientas preconstruidas o personalizadas para el agente. Dify proporciona más de 50 herramientas integradas para agentes de IA, como Búsqueda de Google, DALL·E, Difusión Estable y WolframAlpha. | |||
| **6. LLMOps**: | |||
| Supervisa y analiza registros de aplicaciones y rendimiento a lo largo del tiempo. Podrías mejorar continuamente prompts, conjuntos de datos y modelos basados en datos de producción y anotaciones. | |||
| **7. Backend como servicio**: | |||
| Todas las ofertas de Dify vienen con APIs correspondientes, por lo que podrías integrar Dify sin esfuerzo en tu propia lógica empresarial. | |||
| **6. LLMOps**: | |||
| Supervisa y analiza registros de aplicaciones y rendimiento a lo largo del tiempo. Podrías mejorar continuamente prompts, conjuntos de datos y modelos basados en datos de producción y anotaciones. | |||
| **7. Backend como servicio**: | |||
| Todas las ofertas de Dify vienen con APIs correspondientes, por lo que podrías integrar Dify sin esfuerzo en tu propia lógica empresarial. | |||
| ## Comparación de características | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Característica</th> | |||
| @@ -151,16 +150,16 @@ Dify es una plataforma de desarrollo de aplicaciones de LLM de código abierto. | |||
| ## Usando Dify | |||
| - **Nube </br>** | |||
| Hospedamos un servicio [Dify Cloud](https://dify.ai) para que cualquiera lo pruebe sin configuración. Proporciona todas las capacidades de la versión autoimplementada e incluye 200 llamadas gratuitas a GPT-4 en el plan sandbox. | |||
| Hospedamos un servicio [Dify Cloud](https://dify.ai) para que cualquiera lo pruebe sin configuración. Proporciona todas las capacidades de la versión autoimplementada e incluye 200 llamadas gratuitas a GPT-4 en el plan sandbox. | |||
| - **Auto-alojamiento de Dify Community Edition</br>** | |||
| Pon rápidamente Dify en funcionamiento en tu entorno con esta [guía de inicio rápido](#quick-start). | |||
| Usa nuestra [documentación](https://docs.dify.ai) para más referencias e instrucciones más detalladas. | |||
| Pon rápidamente Dify en funcionamiento en tu entorno con esta [guía de inicio rápido](#quick-start). | |||
| Usa nuestra [documentación](https://docs.dify.ai) para más referencias e instrucciones más detalladas. | |||
| - **Dify para Empresas / Organizaciones</br>** | |||
| Proporcionamos características adicionales centradas en la empresa. [Envíanos un correo electrónico](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) para discutir las necesidades empresariales. </br> | |||
| > Para startups y pequeñas empresas que utilizan AWS, echa un vistazo a [Dify Premium en AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) e impleméntalo en tu propio VPC de AWS con un clic. Es una AMI asequible que ofrece la opción de crear aplicaciones con logotipo y marca personalizados. | |||
| Proporcionamos características adicionales centradas en la empresa. [Envíanos un correo electrónico](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) para discutir las necesidades empresariales. </br> | |||
| > Para startups y pequeñas empresas que utilizan AWS, echa un vistazo a [Dify Premium en AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) e impleméntalo en tu propio VPC de AWS con un clic. Es una AMI asequible que ofrece la opción de crear aplicaciones con logotipo y marca personalizados. | |||
| ## Manteniéndote al tanto | |||
| @@ -168,13 +167,12 @@ Dale estrella a Dify en GitHub y serás notificado instantáneamente de las nuev | |||
|  | |||
| ## Inicio Rápido | |||
| > Antes de instalar Dify, asegúrate de que tu máquina cumpla con los siguientes requisitos mínimos del sistema: | |||
| > | |||
| >- CPU >= 2 núcleos | |||
| >- RAM >= 4GB | |||
| > | |||
| > - CPU >= 2 núcleos | |||
| > - RAM >= 4GB | |||
| </br> | |||
| @@ -210,16 +208,19 @@ Si desea configurar una configuración de alta disponibilidad, la comunidad prop | |||
| Despliega Dify en una plataforma en la nube con un solo clic utilizando [terraform](https://www.terraform.io/) | |||
| ##### Azure Global | |||
| - [Azure Terraform por @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform por @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### Usando AWS CDK para el Despliegue | |||
| Despliegue Dify en AWS usando [CDK](https://aws.amazon.com/cdk/) | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK por @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK por @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -235,13 +236,11 @@ Despliega Dify en Alibaba Cloud con un solo clic con [Alibaba Cloud Data Managem | |||
| Implementa Dify en AKS con un clic usando [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## Contribuir | |||
| Para aquellos que deseen contribuir con código, consulten nuestra [Guía de contribución](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| Para aquellos que deseen contribuir con código, consulten nuestra [Guía de contribución](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| Al mismo tiempo, considera apoyar a Dify compartiéndolo en redes sociales y en eventos y conferencias. | |||
| > Estamos buscando colaboradores para ayudar con la traducción de Dify a idiomas que no sean el mandarín o el inglés. Si estás interesado en ayudar, consulta el [README de i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para obtener más información y déjanos un comentario en el canal `global-users` de nuestro [Servidor de Comunidad en Discord](https://discord.gg/8Tpq4AcN9c). | |||
| **Contribuidores** | |||
| @@ -252,16 +251,15 @@ Al mismo tiempo, considera apoyar a Dify compartiéndolo en redes sociales y en | |||
| ## Comunidad y Contacto | |||
| * [Discusión en GitHub](https://github.com/langgenius/dify/discussions). Lo mejor para: compartir comentarios y hacer preguntas. | |||
| * [Reporte de problemas en GitHub](https://github.com/langgenius/dify/issues). Lo mejor para: errores que encuentres usando Dify.AI y propuestas de características. Consulta nuestra [Guía de contribución](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Lo mejor para: compartir tus aplicaciones y pasar el rato con la comunidad. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Lo mejor para: compartir tus aplicaciones y pasar el rato con la comunidad. | |||
| - [Discusión en GitHub](https://github.com/langgenius/dify/discussions). Lo mejor para: compartir comentarios y hacer preguntas. | |||
| - [Reporte de problemas en GitHub](https://github.com/langgenius/dify/issues). Lo mejor para: errores que encuentres usando Dify.AI y propuestas de características. Consulta nuestra [Guía de contribución](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Lo mejor para: compartir tus aplicaciones y pasar el rato con la comunidad. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Lo mejor para: compartir tus aplicaciones y pasar el rato con la comunidad. | |||
| ## Historial de Estrellas | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## Divulgación de Seguridad | |||
| Para proteger tu privacidad, evita publicar problemas de seguridad en GitHub. En su lugar, envía tus preguntas a security@dify.ai y te proporcionaremos una respuesta más detallada. | |||
| @@ -269,6 +267,7 @@ Para proteger tu privacidad, evita publicar problemas de seguridad en GitHub. En | |||
| ## Licencia | |||
| Este repositorio está disponible bajo la [Licencia de Código Abierto de Dify](LICENSE), que es esencialmente Apache 2.0 con algunas restricciones adicionales. | |||
| ## Divulgación de Seguridad | |||
| Para proteger tu privacidad, evita publicar problemas de seguridad en GitHub. En su lugar, envía tus preguntas a security@dify.ai y te proporcionaremos una respuesta más detallada. | |||
| @@ -48,7 +48,7 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| # | |||
| # | |||
| <p align="center"> | |||
| <a href="https://trendshift.io/repositories/2152" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2152" alt="langgenius%2Fdify | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> | |||
| @@ -56,32 +56,31 @@ | |||
| Dify est une plateforme de développement d'applications LLM open source. Son interface intuitive combine un flux de travail d'IA, un pipeline RAG, des capacités d'agent, une gestion de modèles, des fonctionnalités d'observabilité, et plus encore, vous permettant de passer rapidement du prototype à la production. Voici une liste des fonctionnalités principales: | |||
| </br> </br> | |||
| **1. Flux de travail** : | |||
| Construisez et testez des flux de travail d'IA puissants sur un canevas visuel, en utilisant toutes les fonctionnalités suivantes et plus encore. | |||
| **1. Flux de travail** : | |||
| Construisez et testez des flux de travail d'IA puissants sur un canevas visuel, en utilisant toutes les fonctionnalités suivantes et plus encore. | |||
| **2. Prise en charge complète des modèles** : | |||
| Intégration transparente avec des centaines de LLM propriétaires / open source provenant de dizaines de fournisseurs d'inférence et de solutions auto-hébergées, couvrant GPT, Mistral, Llama3, et tous les modèles compatibles avec l'API OpenAI. Une liste complète des fournisseurs de modèles pris en charge se trouve [ici](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **2. Prise en charge complète des modèles** : | |||
| Intégration transparente avec des centaines de LLM propriétaires / open source provenant de dizaines de fournisseurs d'inférence et de solutions auto-hébergées, couvrant GPT, Mistral, Llama3, et tous les modèles compatibles avec l'API OpenAI. Une liste complète des fournisseurs de modèles pris en charge se trouve [ici](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. IDE de prompt** : | |||
| Interface intuitive pour créer des prompts, comparer les performances des modèles et ajouter des fonctionnalités supplémentaires telles que la synthèse vocale à une application basée sur des chats. | |||
| **3. IDE de prompt** : | |||
| Interface intuitive pour créer des prompts, comparer les performances des modèles et ajouter des fonctionnalités supplémentaires telles que la synthèse vocale à une application basée sur des chats. | |||
| **4. Pipeline RAG** : | |||
| Des capacités RAG étendues qui couvrent tout, de l'ingestion de documents à la récupération, avec un support prêt à l'emploi pour l'extraction de texte à partir de PDF, PPT et autres formats de document courants. | |||
| **4. Pipeline RAG** : | |||
| Des capacités RAG étendues qui couvrent tout, de l'ingestion de documents à la récupération, avec un support prêt à l'emploi pour l'extraction de texte à partir de PDF, PPT et autres formats de document courants. | |||
| **5. Capacités d'agent** : | |||
| Vous pouvez définir des agents basés sur l'appel de fonction LLM ou ReAct, et ajouter des outils pré-construits ou personnalisés pour l'agent. Dify fournit plus de 50 outils intégrés pour les agents d'IA, tels que la recherche Google, DALL·E, Stable Diffusion et WolframAlpha. | |||
| **5. Capacités d'agent** : | |||
| Vous pouvez définir des agents basés sur l'appel de fonction LLM ou ReAct, et ajouter des outils pré-construits ou personnalisés pour l'agent. Dify fournit plus de 50 outils intégrés pour les agents d'IA, tels que la recherche Google, DALL·E, Stable Diffusion et WolframAlpha. | |||
| **6. LLMOps** : | |||
| Surveillez et analysez les journaux d'application et les performances au fil du temps. Vous pouvez continuellement améliorer les prompts, les ensembles de données et les modèles en fonction des données de production et des annotations. | |||
| **7. Backend-as-a-Service** : | |||
| Toutes les offres de Dify sont accompagnées d'API correspondantes, vous permettant d'intégrer facilement Dify dans votre propre logique métier. | |||
| **6. LLMOps** : | |||
| Surveillez et analysez les journaux d'application et les performances au fil du temps. Vous pouvez continuellement améliorer les prompts, les ensembles de données et les modèles en fonction des données de production et des annotations. | |||
| **7. Backend-as-a-Service** : | |||
| Toutes les offres de Dify sont accompagnées d'API correspondantes, vous permettant d'intégrer facilement Dify dans votre propre logique métier. | |||
| ## Comparaison des fonctionnalités | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Fonctionnalité</th> | |||
| @@ -151,16 +150,16 @@ Dify est une plateforme de développement d'applications LLM open source. Son in | |||
| ## Utiliser Dify | |||
| - **Cloud </br>** | |||
| Nous hébergeons un service [Dify Cloud](https://dify.ai) pour que tout le monde puisse l'essayer sans aucune configuration. Il fournit toutes les capacités de la version auto-hébergée et comprend 200 appels GPT-4 gratuits dans le plan bac à sable. | |||
| Nous hébergeons un service [Dify Cloud](https://dify.ai) pour que tout le monde puisse l'essayer sans aucune configuration. Il fournit toutes les capacités de la version auto-hébergée et comprend 200 appels GPT-4 gratuits dans le plan bac à sable. | |||
| - **Auto-hébergement Dify Community Edition</br>** | |||
| Lancez rapidement Dify dans votre environnement avec ce [guide de démarrage](#quick-start). | |||
| Utilisez notre [documentation](https://docs.dify.ai) pour plus de références et des instructions plus détaillées. | |||
| Lancez rapidement Dify dans votre environnement avec ce [guide de démarrage](#quick-start). | |||
| Utilisez notre [documentation](https://docs.dify.ai) pour plus de références et des instructions plus détaillées. | |||
| - **Dify pour les entreprises / organisations</br>** | |||
| Nous proposons des fonctionnalités supplémentaires adaptées aux entreprises. [Envoyez-nous un e-mail](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) pour discuter des besoins de l'entreprise. </br> | |||
| > Pour les startups et les petites entreprises utilisant AWS, consultez [Dify Premium sur AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) et déployez-le dans votre propre VPC AWS en un clic. C'est une offre AMI abordable avec la possibilité de créer des applications avec un logo et une marque personnalisés. | |||
| Nous proposons des fonctionnalités supplémentaires adaptées aux entreprises. [Envoyez-nous un e-mail](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) pour discuter des besoins de l'entreprise. </br> | |||
| > Pour les startups et les petites entreprises utilisant AWS, consultez [Dify Premium sur AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) et déployez-le dans votre propre VPC AWS en un clic. C'est une offre AMI abordable avec la possibilité de créer des applications avec un logo et une marque personnalisés. | |||
| ## Rester en avance | |||
| @@ -168,13 +167,12 @@ Mettez une étoile à Dify sur GitHub et soyez instantanément informé des nouv | |||
|  | |||
| ## Démarrage rapide | |||
| > Avant d'installer Dify, assurez-vous que votre machine répond aux exigences système minimales suivantes: | |||
| > | |||
| >- CPU >= 2 cœurs | |||
| >- RAM >= 4 Go | |||
| > | |||
| > - CPU >= 2 cœurs | |||
| > - RAM >= 4 Go | |||
| </br> | |||
| @@ -208,16 +206,19 @@ Si vous souhaitez configurer une configuration haute disponibilité, la communau | |||
| Déployez Dify sur une plateforme cloud en un clic en utilisant [terraform](https://www.terraform.io/) | |||
| ##### Azure Global | |||
| - [Azure Terraform par @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform par @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### Utilisation d'AWS CDK pour le déploiement | |||
| Déployez Dify sur AWS en utilisant [CDK](https://aws.amazon.com/cdk/) | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK par @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK par @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -233,13 +234,11 @@ Déployez Dify en un clic sur Alibaba Cloud avec [Alibaba Cloud Data Management] | |||
| Déployez Dify sur AKS en un clic en utilisant [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## Contribuer | |||
| Pour ceux qui souhaitent contribuer du code, consultez notre [Guide de contribution](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| Pour ceux qui souhaitent contribuer du code, consultez notre [Guide de contribution](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| Dans le même temps, veuillez envisager de soutenir Dify en le partageant sur les réseaux sociaux et lors d'événements et de conférences. | |||
| > Nous recherchons des contributeurs pour aider à traduire Dify dans des langues autres que le mandarin ou l'anglais. Si vous êtes intéressé à aider, veuillez consulter le [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) pour plus d'informations, et laissez-nous un commentaire dans le canal `global-users` de notre [Serveur communautaire Discord](https://discord.gg/8Tpq4AcN9c). | |||
| **Contributeurs** | |||
| @@ -250,16 +249,15 @@ Dans le même temps, veuillez envisager de soutenir Dify en le partageant sur le | |||
| ## Communauté & Contact | |||
| * [Discussion GitHub](https://github.com/langgenius/dify/discussions). Meilleur pour: partager des commentaires et poser des questions. | |||
| * [Problèmes GitHub](https://github.com/langgenius/dify/issues). Meilleur pour: les bogues que vous rencontrez en utilisant Dify.AI et les propositions de fonctionnalités. Consultez notre [Guide de contribution](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Meilleur pour: partager vos applications et passer du temps avec la communauté. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Meilleur pour: partager vos applications et passer du temps avec la communauté. | |||
| - [Discussion GitHub](https://github.com/langgenius/dify/discussions). Meilleur pour: partager des commentaires et poser des questions. | |||
| - [Problèmes GitHub](https://github.com/langgenius/dify/issues). Meilleur pour: les bogues que vous rencontrez en utilisant Dify.AI et les propositions de fonctionnalités. Consultez notre [Guide de contribution](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Meilleur pour: partager vos applications et passer du temps avec la communauté. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Meilleur pour: partager vos applications et passer du temps avec la communauté. | |||
| ## Historique des étoiles | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## Divulgation de sécurité | |||
| Pour protéger votre vie privée, veuillez éviter de publier des problèmes de sécurité sur GitHub. Au lieu de cela, envoyez vos questions à security@dify.ai et nous vous fournirons une réponse plus détaillée. | |||
| @@ -267,6 +265,7 @@ Pour protéger votre vie privée, veuillez éviter de publier des problèmes de | |||
| ## Licence | |||
| Ce référentiel est disponible sous la [Licence open source Dify](LICENSE), qui est essentiellement l'Apache 2.0 avec quelques restrictions supplémentaires. | |||
| ## Divulgation de sécurité | |||
| Pour protéger votre vie privée, veuillez éviter de publier des problèmes de sécurité sur GitHub. Au lieu de cela, envoyez vos questions à security@dify.ai et nous vous fournirons une réponse plus détaillée. | |||
| @@ -48,7 +48,7 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| # | |||
| # | |||
| <p align="center"> | |||
| <a href="https://trendshift.io/repositories/2152" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2152" alt="langgenius%2Fdify | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> | |||
| @@ -58,31 +58,30 @@ DifyはオープンソースのLLMアプリケーション開発プラットフ | |||
| </br> </br> | |||
| **1. ワークフロー**: | |||
| 強力なAIワークフローをビジュアルキャンバス上で構築し、テストできます。すべての機能、および以下の機能を使用できます。 | |||
| 強力なAIワークフローをビジュアルキャンバス上で構築し、テストできます。すべての機能、および以下の機能を使用できます。 | |||
| **2. 総合的なモデルサポート**: | |||
| 数百ものプロプライエタリ/オープンソースのLLMと、数十もの推論プロバイダーおよびセルフホスティングソリューションとのシームレスな統合を提供します。GPT、Mistral、Llama3、OpenAI APIと互換性のあるすべてのモデルを統合されています。サポートされているモデルプロバイダーの完全なリストは[こちら](https://docs.dify.ai/getting-started/readme/model-providers)をご覧ください。 | |||
| 数百ものプロプライエタリ/オープンソースのLLMと、数十もの推論プロバイダーおよびセルフホスティングソリューションとのシームレスな統合を提供します。GPT、Mistral、Llama3、OpenAI APIと互換性のあるすべてのモデルを統合されています。サポートされているモデルプロバイダーの完全なリストは[こちら](https://docs.dify.ai/getting-started/readme/model-providers)をご覧ください。 | |||
|  | |||
| **3. プロンプトIDE**: | |||
| プロンプトの作成、モデルパフォーマンスの比較が行え、チャットベースのアプリに音声合成などの機能も追加できます。 | |||
| プロンプトの作成、モデルパフォーマンスの比較が行え、チャットベースのアプリに音声合成などの機能も追加できます。 | |||
| **4. RAGパイプライン**: | |||
| ドキュメントの取り込みから検索までをカバーする広範なRAG機能ができます。ほかにもPDF、PPT、その他の一般的なドキュメントフォーマットからのテキスト抽出のサポートも提供します。 | |||
| ドキュメントの取り込みから検索までをカバーする広範なRAG機能ができます。ほかにもPDF、PPT、その他の一般的なドキュメントフォーマットからのテキスト抽出のサポートも提供します。 | |||
| **5. エージェント機能**: | |||
| LLM Function CallingやReActに基づくエージェントの定義が可能で、AIエージェント用のプリビルトまたはカスタムツールを追加できます。Difyには、Google検索、DALL·E、Stable Diffusion、WolframAlphaなどのAIエージェント用の50以上の組み込みツールが提供します。 | |||
| LLM Function CallingやReActに基づくエージェントの定義が可能で、AIエージェント用のプリビルトまたはカスタムツールを追加できます。Difyには、Google検索、DALL·E、Stable Diffusion、WolframAlphaなどのAIエージェント用の50以上の組み込みツールが提供します。 | |||
| **6. LLMOps**: | |||
| アプリケーションのログやパフォーマンスを監視と分析し、生産のデータと注釈に基づいて、プロンプト、データセット、モデルを継続的に改善できます。 | |||
| アプリケーションのログやパフォーマンスを監視と分析し、生産のデータと注釈に基づいて、プロンプト、データセット、モデルを継続的に改善できます。 | |||
| **7. Backend-as-a-Service**: | |||
| すべての機能はAPIを提供されており、Difyを自分のビジネスロジックに簡単に統合できます。 | |||
| すべての機能はAPIを提供されており、Difyを自分のビジネスロジックに簡単に統合できます。 | |||
| ## 機能比較 | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">機能</th> | |||
| @@ -152,16 +151,16 @@ DifyはオープンソースのLLMアプリケーション開発プラットフ | |||
| ## Difyの使用方法 | |||
| - **クラウド </br>** | |||
| [こちら](https://dify.ai)のDify Cloudサービスを利用して、セットアップ不要で試すことができます。サンドボックスプランには、200回のGPT-4呼び出しが無料で含まれています。 | |||
| [こちら](https://dify.ai)のDify Cloudサービスを利用して、セットアップ不要で試すことができます。サンドボックスプランには、200回のGPT-4呼び出しが無料で含まれています。 | |||
| - **Dify Community Editionのセルフホスティング</br>** | |||
| この[スタートガイド](#クイックスタート)を使用して、ローカル環境でDifyを簡単に実行できます。 | |||
| 詳しくは[ドキュメント](https://docs.dify.ai)をご覧ください。 | |||
| この[スタートガイド](#%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88)を使用して、ローカル環境でDifyを簡単に実行できます。 | |||
| 詳しくは[ドキュメント](https://docs.dify.ai)をご覧ください。 | |||
| - **企業/組織向けのDify</br>** | |||
| 企業中心の機能を提供しています。[メールを送信](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry)して企業のニーズについて相談してください。 </br> | |||
| > AWSを使用しているスタートアップ企業や中小企業の場合は、[AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6)のDify Premiumをチェックして、ワンクリックで自分のAWS VPCにデプロイできます。さらに、手頃な価格のAMIオファリングとして、ロゴやブランディングをカスタマイズしてアプリケーションを作成するオプションがあります。 | |||
| 企業中心の機能を提供しています。[メールを送信](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry)して企業のニーズについて相談してください。 </br> | |||
| > AWSを使用しているスタートアップ企業や中小企業の場合は、[AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6)のDify Premiumをチェックして、ワンクリックで自分のAWS VPCにデプロイできます。さらに、手頃な価格のAMIオファリングとして、ロゴやブランディングをカスタマイズしてアプリケーションを作成するオプションがあります。 | |||
| ## 最新の情報を入手 | |||
| @@ -169,13 +168,12 @@ GitHub上でDifyにスターを付けることで、Difyに関する新しいニ | |||
|  | |||
| ## クイックスタート | |||
| > Difyをインストールする前に、お使いのマシンが以下の最小システム要件を満たしていることを確認してください: | |||
| > | |||
| >- CPU >= 2コア | |||
| >- RAM >= 4GB | |||
| > - CPU >= 2コア | |||
| > - RAM >= 4GB | |||
| </br> | |||
| @@ -209,9 +207,11 @@ docker compose up -d | |||
| [terraform](https://www.terraform.io/) を使用して、ワンクリックでDifyをクラウドプラットフォームにデプロイします | |||
| ##### Azure Global | |||
| - [@nikawangによるAzure Terraform](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [@sotazumによるGoogle Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### AWS CDK を使用したデプロイ | |||
| @@ -219,26 +219,27 @@ docker compose up -d | |||
| [CDK](https://aws.amazon.com/cdk/) を使用して、DifyをAWSにデプロイします | |||
| ##### AWS | |||
| - [@KevinZhaoによるAWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [@tmokmssによるAWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| #### Alibaba Cloud | |||
| [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| #### Alibaba Cloud Data Management | |||
| [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) を利用して、DifyをAlibaba Cloudへワンクリックでデプロイできます | |||
| #### AKSへのデプロイにAzure Devops Pipelineを使用 | |||
| [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)を使用してDifyをAKSにワンクリックでデプロイ | |||
| ## 貢献 | |||
| コードに貢献したい方は、[Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)を参照してください。 | |||
| 同時に、DifyをSNSやイベント、カンファレンスで共有してサポートしていただけると幸いです。 | |||
| > Difyを英語または中国語以外の言語に翻訳してくれる貢献者を募集しています。興味がある場合は、詳細については[i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)を参照してください。また、[Discordコミュニティサーバー](https://discord.gg/8Tpq4AcN9c)の`global-users`チャンネルにコメントを残してください。 | |||
| **貢献者** | |||
| @@ -249,12 +250,10 @@ docker compose up -d | |||
| ## コミュニティ & お問い合わせ | |||
| * [GitHub Discussion](https://github.com/langgenius/dify/discussions). 主に: フィードバックの共有や質問。 | |||
| * [GitHub Issues](https://github.com/langgenius/dify/issues). 主に: Dify.AIを使用する際に発生するエラーや問題については、[貢献ガイド](CONTRIBUTING_JA.md)を参照してください | |||
| * [Discord](https://discord.gg/FngNHpbcY7). 主に: アプリケーションの共有やコミュニティとの交流。 | |||
| * [X(Twitter)](https://twitter.com/dify_ai). 主に: アプリケーションの共有やコミュニティとの交流。 | |||
| - [GitHub Discussion](https://github.com/langgenius/dify/discussions). 主に: フィードバックの共有や質問。 | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues). 主に: Dify.AIを使用する際に発生するエラーや問題については、[貢献ガイド](CONTRIBUTING_JA.md)を参照してください | |||
| - [Discord](https://discord.gg/FngNHpbcY7). 主に: アプリケーションの共有やコミュニティとの交流。 | |||
| - [X(Twitter)](https://twitter.com/dify_ai). 主に: アプリケーションの共有やコミュニティとの交流。 | |||
| ## ライセンス | |||
| @@ -48,7 +48,7 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| # | |||
| # | |||
| <p align="center"> | |||
| <a href="https://trendshift.io/repositories/2152" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2152" alt="langgenius%2Fdify | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> | |||
| @@ -56,32 +56,31 @@ | |||
| Dify is an open-source LLM app development platform. Its intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production. Here's a list of the core features: | |||
| </br> </br> | |||
| **1. Workflow**: | |||
| Build and test powerful AI workflows on a visual canvas, leveraging all the following features and beyond. | |||
| **1. Workflow**: | |||
| Build and test powerful AI workflows on a visual canvas, leveraging all the following features and beyond. | |||
| **2. Comprehensive model support**: | |||
| Seamless integration with hundreds of proprietary / open-source LLMs from dozens of inference providers and self-hosted solutions, covering GPT, Mistral, Llama3, and any OpenAI API-compatible models. A full list of supported model providers can be found [here](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **2. Comprehensive model support**: | |||
| Seamless integration with hundreds of proprietary / open-source LLMs from dozens of inference providers and self-hosted solutions, covering GPT, Mistral, Llama3, and any OpenAI API-compatible models. A full list of supported model providers can be found [here](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. Prompt IDE**: | |||
| Intuitive interface for crafting prompts, comparing model performance, and adding additional features such as text-to-speech to a chat-based app. | |||
| **3. Prompt IDE**: | |||
| Intuitive interface for crafting prompts, comparing model performance, and adding additional features such as text-to-speech to a chat-based app. | |||
| **4. RAG Pipeline**: | |||
| Extensive RAG capabilities that cover everything from document ingestion to retrieval, with out-of-box support for text extraction from PDFs, PPTs, and other common document formats. | |||
| **4. RAG Pipeline**: | |||
| Extensive RAG capabilities that cover everything from document ingestion to retrieval, with out-of-box support for text extraction from PDFs, PPTs, and other common document formats. | |||
| **5. Agent capabilities**: | |||
| You can define agents based on LLM Function Calling or ReAct, and add pre-built or custom tools for the agent. Dify provides 50+ built-in tools for AI agents, such as Google Search, DALL·E, Stable Diffusion and WolframAlpha. | |||
| **5. Agent capabilities**: | |||
| You can define agents based on LLM Function Calling or ReAct, and add pre-built or custom tools for the agent. Dify provides 50+ built-in tools for AI agents, such as Google Search, DALL·E, Stable Diffusion and WolframAlpha. | |||
| **6. LLMOps**: | |||
| Monitor and analyze application logs and performance over time. You could continuously improve prompts, datasets, and models based on production data and annotations. | |||
| **7. Backend-as-a-Service**: | |||
| All of Dify's offerings come with corresponding APIs, so you could effortlessly integrate Dify into your own business logic. | |||
| **6. LLMOps**: | |||
| Monitor and analyze application logs and performance over time. You could continuously improve prompts, datasets, and models based on production data and annotations. | |||
| **7. Backend-as-a-Service**: | |||
| All of Dify's offerings come with corresponding APIs, so you could effortlessly integrate Dify into your own business logic. | |||
| ## Feature Comparison | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Feature</th> | |||
| @@ -151,16 +150,16 @@ Dify is an open-source LLM app development platform. Its intuitive interface com | |||
| ## Using Dify | |||
| - **Cloud </br>** | |||
| We host a [Dify Cloud](https://dify.ai) service for anyone to try with zero setup. It provides all the capabilities of the self-deployed version, and includes 200 free GPT-4 calls in the sandbox plan. | |||
| We host a [Dify Cloud](https://dify.ai) service for anyone to try with zero setup. It provides all the capabilities of the self-deployed version, and includes 200 free GPT-4 calls in the sandbox plan. | |||
| - **Self-hosting Dify Community Edition</br>** | |||
| Quickly get Dify running in your environment with this [starter guide](#quick-start). | |||
| Use our [documentation](https://docs.dify.ai) for further references and more in-depth instructions. | |||
| Quickly get Dify running in your environment with this [starter guide](#quick-start). | |||
| Use our [documentation](https://docs.dify.ai) for further references and more in-depth instructions. | |||
| - **Dify for Enterprise / Organizations</br>** | |||
| We provide additional enterprise-centric features. [Send us an email](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) to discuss enterprise needs. </br> | |||
| > For startups and small businesses using AWS, check out [Dify Premium on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) and deploy it to your own AWS VPC with one-click. It's an affordable AMI offering with the option to create apps with custom logo and branding. | |||
| We provide additional enterprise-centric features. [Send us an email](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) to discuss enterprise needs. </br> | |||
| > For startups and small businesses using AWS, check out [Dify Premium on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) and deploy it to your own AWS VPC with one-click. It's an affordable AMI offering with the option to create apps with custom logo and branding. | |||
| ## Staying ahead | |||
| @@ -168,13 +167,12 @@ Star Dify on GitHub and be instantly notified of new releases. | |||
|  | |||
| ## Quick Start | |||
| > Before installing Dify, make sure your machine meets the following minimum system requirements: | |||
| > | |||
| >- CPU >= 2 Core | |||
| >- RAM >= 4GB | |||
| > | |||
| > - CPU >= 2 Core | |||
| > - RAM >= 4GB | |||
| </br> | |||
| @@ -208,16 +206,19 @@ If you'd like to configure a highly-available setup, there are community-contrib | |||
| wa'logh nIqHom neH ghun deployment toy'wI' [terraform](https://www.terraform.io/) lo'laH. | |||
| ##### Azure Global | |||
| - [Azure Terraform mung @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform qachlot @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### AWS CDK atorlugh pilersitsineq | |||
| wa'logh nIqHom neH ghun deployment toy'wI' [CDK](https://aws.amazon.com/cdk/) lo'laH. | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK qachlot @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK qachlot @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -233,13 +234,11 @@ wa'logh nIqHom neH ghun deployment toy'wI' [CDK](https://aws.amazon.com/cdk/) lo | |||
| [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) lo'laH Dify AKS 'e' wa'DIch click 'e' Deploy | |||
| ## Contributing | |||
| For those who'd like to contribute code, see our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| For those who'd like to contribute code, see our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| At the same time, please consider supporting Dify by sharing it on social media and at events and conferences. | |||
| > We are looking for contributors to help with translating Dify to languages other than Mandarin or English. If you are interested in helping, please see the [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) for more information, and leave us a comment in the `global-users` channel of our [Discord Community Server](https://discord.gg/8Tpq4AcN9c). | |||
| **Contributors** | |||
| @@ -250,18 +249,18 @@ At the same time, please consider supporting Dify by sharing it on social media | |||
| ## Community & Contact | |||
| * [GitHub Discussion](https://github.com/langgenius/dify/discussions | |||
| - \[GitHub Discussion\](https://github.com/langgenius/dify/discussions | |||
| ). Best for: sharing feedback and asking questions. | |||
| * [GitHub Issues](https://github.com/langgenius/dify/issues). Best for: bugs you encounter using Dify.AI, and feature proposals. See our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Best for: sharing your applications and hanging out with the community. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Best for: sharing your applications and hanging out with the community. | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues). Best for: bugs you encounter using Dify.AI, and feature proposals. See our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Best for: sharing your applications and hanging out with the community. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Best for: sharing your applications and hanging out with the community. | |||
| ## Star History | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## Security Disclosure | |||
| To protect your privacy, please avoid posting security issues on GitHub. Instead, send your questions to security@dify.ai and we will provide you with a more detailed answer. | |||
| @@ -48,34 +48,33 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| Dify는 오픈 소스 LLM 앱 개발 플랫폼입니다. 직관적인 인터페이스를 통해 AI 워크플로우, RAG 파이프라인, 에이전트 기능, 모델 관리, 관찰 기능 등을 결합하여 프로토타입에서 프로덕션까지 빠르게 전환할 수 있습니다. 주요 기능 목록은 다음과 같습니다:</br> </br> | |||
| Dify는 오픈 소스 LLM 앱 개발 플랫폼입니다. 직관적인 인터페이스를 통해 AI 워크플로우, RAG 파이프라인, 에이전트 기능, 모델 관리, 관찰 기능 등을 결합하여 프로토타입에서 프로덕션까지 빠르게 전환할 수 있습니다. 주요 기능 목록은 다음과 같습니다:</br> </br> | |||
| **1. 워크플로우**: | |||
| 다음 기능들을 비롯한 다양한 기능을 활용하여 시각적 캔버스에서 강력한 AI 워크플로우를 구축하고 테스트하세요. | |||
| 다음 기능들을 비롯한 다양한 기능을 활용하여 시각적 캔버스에서 강력한 AI 워크플로우를 구축하고 테스트하세요. | |||
| **2. 포괄적인 모델 지원:**: | |||
| **2. 포괄적인 모델 지원:**: | |||
| 수십 개의 추론 제공업체와 자체 호스팅 솔루션에서 제공하는 수백 개의 독점 및 오픈 소스 LLM과 원활하게 통합되며, GPT, Mistral, Llama3 및 모든 OpenAI API 호환 모델을 포함합니다. 지원되는 모델 제공업체의 전체 목록은 [여기](https://docs.dify.ai/getting-started/readme/model-providers)에서 확인할 수 있습니다. | |||
|  | |||
| **3. 통합 개발환경**: | |||
| 프롬프트를 작성하고, 모델 성능을 비교하며, 텍스트-음성 변환과 같은 추가 기능을 채팅 기반 앱에 추가할 수 있는 직관적인 인터페이스를 제공합니다. | |||
| 프롬프트를 작성하고, 모델 성능을 비교하며, 텍스트-음성 변환과 같은 추가 기능을 채팅 기반 앱에 추가할 수 있는 직관적인 인터페이스를 제공합니다. | |||
| **4. RAG 파이프라인**: | |||
| 문서 수집부터 검색까지 모든 것을 다루며, PDF, PPT 및 기타 일반적인 문서 형식에서 텍스트 추출을 위한 기본 지원이 포함되어 있는 광범위한 RAG 기능을 제공합니다. | |||
| **4. RAG 파이프라인**: | |||
| 문서 수집부터 검색까지 모든 것을 다루며, PDF, PPT 및 기타 일반적인 문서 형식에서 텍스트 추출을 위한 기본 지원이 포함되어 있는 광범위한 RAG 기능을 제공합니다. | |||
| **5. 에이전트 기능**: | |||
| LLM 함수 호출 또는 ReAct를 기반으로 에이전트를 정의하고 에이전트에 대해 사전 구축된 도구나 사용자 정의 도구를 추가할 수 있습니다. Dify는 Google Search, DALL·E, Stable Diffusion, WolframAlpha 등 AI 에이전트를 위한 50개 이상의 내장 도구를 제공합니다. | |||
| LLM 함수 호출 또는 ReAct를 기반으로 에이전트를 정의하고 에이전트에 대해 사전 구축된 도구나 사용자 정의 도구를 추가할 수 있습니다. Dify는 Google Search, DALL·E, Stable Diffusion, WolframAlpha 등 AI 에이전트를 위한 50개 이상의 내장 도구를 제공합니다. | |||
| **6. LLMOps**: | |||
| 시간 경과에 따른 애플리케이션 로그와 성능을 모니터링하고 분석합니다. 생산 데이터와 주석을 기반으로 프롬프트, 데이터세트, 모델을 지속적으로 개선할 수 있습니다. | |||
| 시간 경과에 따른 애플리케이션 로그와 성능을 모니터링하고 분석합니다. 생산 데이터와 주석을 기반으로 프롬프트, 데이터세트, 모델을 지속적으로 개선할 수 있습니다. | |||
| **7. Backend-as-a-Service**: | |||
| Dify의 모든 제품에는 해당 API가 함께 제공되므로 Dify를 자신의 비즈니스 로직에 쉽게 통합할 수 있습니다. | |||
| Dify의 모든 제품에는 해당 API가 함께 제공되므로 Dify를 자신의 비즈니스 로직에 쉽게 통합할 수 있습니다. | |||
| ## 기능 비교 | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">기능</th> | |||
| @@ -148,14 +147,13 @@ | |||
| 우리는 누구나 설정이 필요 없이 사용해 볼 수 있도록 [Dify 클라우드](https://dify.ai) 서비스를 호스팅합니다. 이는 자체 배포 버전의 모든 기능을 제공하며, 샌드박스 플랜에서 무료로 200회의 GPT-4 호출을 포함합니다. | |||
| - **셀프-호스팅 Dify 커뮤니티 에디션</br>** | |||
| 환경에서 Dify를 빠르게 실행하려면 이 [스타터 가이드를](#quick-start) 참조하세요. | |||
| 환경에서 Dify를 빠르게 실행하려면 이 [스타터 가이드를](#quick-start) 참조하세요. | |||
| 추가 참조 및 더 심층적인 지침은 [문서](https://docs.dify.ai)를 사용하세요. | |||
| - **기업 / 조직을 위한 Dify</br>** | |||
| 우리는 추가적인 기업 중심 기능을 제공합니다. 잡거나 [이메일 보내기](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry)를 통해 기업 요구 사항을 논의하십시오. </br> | |||
| > AWS를 사용하는 스타트업 및 중소기업의 경우 [AWS Marketplace에서 Dify Premium](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6)을 확인하고 한 번의 클릭으로 자체 AWS VPC에 배포하십시오. 맞춤형 로고와 브랜딩이 포함된 앱을 생성할 수 있는 옵션이 포함된 저렴한 AMI 제품입니다. | |||
| 우리는 추가적인 기업 중심 기능을 제공합니다. 잡거나 [이메일 보내기](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry)를 통해 기업 요구 사항을 논의하십시오. </br> | |||
| > AWS를 사용하는 스타트업 및 중소기업의 경우 [AWS Marketplace에서 Dify Premium](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6)을 확인하고 한 번의 클릭으로 자체 AWS VPC에 배포하십시오. 맞춤형 로고와 브랜딩이 포함된 앱을 생성할 수 있는 옵션이 포함된 저렴한 AMI 제품입니다. | |||
| ## 앞서가기 | |||
| @@ -163,12 +161,12 @@ GitHub에서 Dify에 별표를 찍어 새로운 릴리스를 즉시 알림 받 | |||
|  | |||
| ## 빠른 시작 | |||
| >Dify를 설치하기 전에 컴퓨터가 다음과 같은 최소 시스템 요구 사항을 충족하는지 확인하세요 : | |||
| >- CPU >= 2 Core | |||
| >- RAM >= 4GB | |||
| > Dify를 설치하기 전에 컴퓨터가 다음과 같은 최소 시스템 요구 사항을 충족하는지 확인하세요 : | |||
| > | |||
| > - CPU >= 2 Core | |||
| > - RAM >= 4GB | |||
| </br> | |||
| @@ -202,16 +200,19 @@ Dify를 Kubernetes에 배포하고 프리미엄 스케일링 설정을 구성했 | |||
| [terraform](https://www.terraform.io/)을 사용하여 단 한 번의 클릭으로 Dify를 클라우드 플랫폼에 배포하십시오 | |||
| ##### Azure Global | |||
| - [nikawang의 Azure Terraform](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [sotazum의 Google Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### AWS CDK를 사용한 배포 | |||
| [CDK](https://aws.amazon.com/cdk/)를 사용하여 AWS에 Dify 배포 | |||
| ##### AWS | |||
| ##### AWS | |||
| - [KevinZhao의 AWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [tmokmss의 AWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -227,14 +228,12 @@ Dify를 Kubernetes에 배포하고 프리미엄 스케일링 설정을 구성했 | |||
| [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)을 사용하여 Dify를 AKS에 원클릭으로 배포 | |||
| ## 기여 | |||
| 코드에 기여하고 싶은 분들은 [기여 가이드](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)를 참조하세요. | |||
| 동시에 Dify를 소셜 미디어와 행사 및 컨퍼런스에 공유하여 지원하는 것을 고려해 주시기 바랍니다. | |||
| > 우리는 Dify를 중국어나 영어 이외의 언어로 번역하는 데 도움을 줄 수 있는 기여자를 찾고 있습니다. 도움을 주고 싶으시다면 [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)에서 더 많은 정보를 확인하시고 [Discord 커뮤니티 서버](https://discord.gg/8Tpq4AcN9c)의 `global-users` 채널에 댓글을 남겨주세요. | |||
| > 우리는 Dify를 중국어나 영어 이외의 언어로 번역하는 데 도움을 줄 수 있는 기여자를 찾고 있습니다. 도움을 주고 싶으시다면 [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)에서 더 많은 정보를 확인하시고 [Discord 커뮤니티 서버](https://discord.gg/8Tpq4AcN9c)의 `global-users` 채널에 댓글을 남겨주세요. | |||
| **기여자** | |||
| @@ -244,17 +243,15 @@ Dify를 Kubernetes에 배포하고 프리미엄 스케일링 설정을 구성했 | |||
| ## 커뮤니티 & 연락처 | |||
| * [GitHub 토론](https://github.com/langgenius/dify/discussions). 피드백 공유 및 질문하기에 적합합니다. | |||
| * [GitHub 이슈](https://github.com/langgenius/dify/issues). Dify.AI 사용 중 발견한 버그와 기능 제안에 적합합니다. [기여 가이드](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)를 참조하세요. | |||
| * [디스코드](https://discord.gg/FngNHpbcY7). 애플리케이션 공유 및 커뮤니티와 소통하기에 적합합니다. | |||
| * [트위터](https://twitter.com/dify_ai). 애플리케이션 공유 및 커뮤니티와 소통하기에 적합합니다. | |||
| - [GitHub 토론](https://github.com/langgenius/dify/discussions). 피드백 공유 및 질문하기에 적합합니다. | |||
| - [GitHub 이슈](https://github.com/langgenius/dify/issues). Dify.AI 사용 중 발견한 버그와 기능 제안에 적합합니다. [기여 가이드](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)를 참조하세요. | |||
| - [디스코드](https://discord.gg/FngNHpbcY7). 애플리케이션 공유 및 커뮤니티와 소통하기에 적합합니다. | |||
| - [트위터](https://twitter.com/dify_ai). 애플리케이션 공유 및 커뮤니티와 소통하기에 적합합니다. | |||
| ## Star 히스토리 | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## 보안 공개 | |||
| 개인정보 보호를 위해 보안 문제를 GitHub에 게시하지 마십시오. 대신 security@dify.ai로 질문을 보내주시면 더 자세한 답변을 드리겠습니다. | |||
| @@ -1,4 +1,5 @@ | |||
|  | |||
| <p align="center"> | |||
| 📌 <a href="https://dify.ai/blog/introducing-dify-workflow-file-upload-a-demo-on-ai-podcast">Introduzindo o Dify Workflow com Upload de Arquivo: Recrie o Podcast Google NotebookLM</a> | |||
| </p> | |||
| @@ -55,32 +56,31 @@ | |||
| Dify é uma plataforma de desenvolvimento de aplicativos LLM de código aberto. Sua interface intuitiva combina workflow de IA, pipeline RAG, capacidades de agente, gerenciamento de modelos, recursos de observabilidade e muito mais, permitindo que você vá rapidamente do protótipo à produção. Aqui está uma lista das principais funcionalidades: | |||
| </br> </br> | |||
| **1. Workflow**: | |||
| Construa e teste workflows poderosos de IA em uma interface visual, aproveitando todos os recursos a seguir e muito mais. | |||
| **1. Workflow**: | |||
| Construa e teste workflows poderosos de IA em uma interface visual, aproveitando todos os recursos a seguir e muito mais. | |||
| **2. Suporte abrangente a modelos**: | |||
| Integração perfeita com centenas de LLMs proprietários e de código aberto de diversas provedoras e soluções auto-hospedadas, abrangendo GPT, Mistral, Llama3 e qualquer modelo compatível com a API da OpenAI. A lista completa de provedores suportados pode ser encontrada [aqui](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **2. Suporte abrangente a modelos**: | |||
| Integração perfeita com centenas de LLMs proprietários e de código aberto de diversas provedoras e soluções auto-hospedadas, abrangendo GPT, Mistral, Llama3 e qualquer modelo compatível com a API da OpenAI. A lista completa de provedores suportados pode ser encontrada [aqui](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. IDE de Prompt**: | |||
| Interface intuitiva para criação de prompts, comparação de desempenho de modelos e adição de recursos como conversão de texto para fala em um aplicativo baseado em chat. | |||
| **3. IDE de Prompt**: | |||
| Interface intuitiva para criação de prompts, comparação de desempenho de modelos e adição de recursos como conversão de texto para fala em um aplicativo baseado em chat. | |||
| **4. Pipeline RAG**: | |||
| Extensas capacidades de RAG que cobrem desde a ingestão de documentos até a recuperação, com suporte nativo para extração de texto de PDFs, PPTs e outros formatos de documentos comuns. | |||
| **4. Pipeline RAG**: | |||
| Extensas capacidades de RAG que cobrem desde a ingestão de documentos até a recuperação, com suporte nativo para extração de texto de PDFs, PPTs e outros formatos de documentos comuns. | |||
| **5. Capacidades de agente**: | |||
| Você pode definir agentes com base em LLM Function Calling ou ReAct e adicionar ferramentas pré-construídas ou personalizadas para o agente. O Dify oferece mais de 50 ferramentas integradas para agentes de IA, como Google Search, DALL·E, Stable Diffusion e WolframAlpha. | |||
| **5. Capacidades de agente**: | |||
| Você pode definir agentes com base em LLM Function Calling ou ReAct e adicionar ferramentas pré-construídas ou personalizadas para o agente. O Dify oferece mais de 50 ferramentas integradas para agentes de IA, como Google Search, DALL·E, Stable Diffusion e WolframAlpha. | |||
| **6. LLMOps**: | |||
| Monitore e analise os registros e o desempenho do aplicativo ao longo do tempo. É possível melhorar continuamente prompts, conjuntos de dados e modelos com base nos dados de produção e anotações. | |||
| **7. Backend como Serviço**: | |||
| Todas os recursos do Dify vêm com APIs correspondentes, permitindo que você integre o Dify sem esforço na lógica de negócios da sua empresa. | |||
| **6. LLMOps**: | |||
| Monitore e analise os registros e o desempenho do aplicativo ao longo do tempo. É possível melhorar continuamente prompts, conjuntos de dados e modelos com base nos dados de produção e anotações. | |||
| **7. Backend como Serviço**: | |||
| Todas os recursos do Dify vêm com APIs correspondentes, permitindo que você integre o Dify sem esforço na lógica de negócios da sua empresa. | |||
| ## Comparação de recursos | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Recurso</th> | |||
| @@ -150,16 +150,16 @@ Dify é uma plataforma de desenvolvimento de aplicativos LLM de código aberto. | |||
| ## Usando o Dify | |||
| - **Nuvem </br>** | |||
| Oferecemos o serviço [Dify Cloud](https://dify.ai) para qualquer pessoa experimentar sem nenhuma configuração. Ele fornece todas as funcionalidades da versão auto-hospedada, incluindo 200 chamadas GPT-4 gratuitas no plano sandbox. | |||
| Oferecemos o serviço [Dify Cloud](https://dify.ai) para qualquer pessoa experimentar sem nenhuma configuração. Ele fornece todas as funcionalidades da versão auto-hospedada, incluindo 200 chamadas GPT-4 gratuitas no plano sandbox. | |||
| - **Auto-hospedagem do Dify Community Edition</br>** | |||
| Configure rapidamente o Dify no seu ambiente com este [guia inicial](#quick-start). | |||
| Use nossa [documentação](https://docs.dify.ai) para referências adicionais e instruções mais detalhadas. | |||
| Configure rapidamente o Dify no seu ambiente com este [guia inicial](#quick-start). | |||
| Use nossa [documentação](https://docs.dify.ai) para referências adicionais e instruções mais detalhadas. | |||
| - **Dify para empresas/organizações</br>** | |||
| Oferecemos recursos adicionais voltados para empresas. [Envie suas perguntas através deste chatbot](https://udify.app/chat/22L1zSxg6yW1cWQg) ou [envie-nos um e-mail](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) para discutir necessidades empresariais. </br> | |||
| > Para startups e pequenas empresas que utilizam AWS, confira o [Dify Premium no AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) e implemente no seu próprio AWS VPC com um clique. É uma oferta AMI acessível com a opção de criar aplicativos com logotipo e marca personalizados. | |||
| Oferecemos recursos adicionais voltados para empresas. [Envie suas perguntas através deste chatbot](https://udify.app/chat/22L1zSxg6yW1cWQg) ou [envie-nos um e-mail](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) para discutir necessidades empresariais. </br> | |||
| > Para startups e pequenas empresas que utilizam AWS, confira o [Dify Premium no AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) e implemente no seu próprio AWS VPC com um clique. É uma oferta AMI acessível com a opção de criar aplicativos com logotipo e marca personalizados. | |||
| ## Mantendo-se atualizado | |||
| @@ -167,13 +167,12 @@ Dê uma estrela no Dify no GitHub e seja notificado imediatamente sobre novos la | |||
|  | |||
| ## Início rápido | |||
| > Antes de instalar o Dify, certifique-se de que sua máquina atenda aos seguintes requisitos mínimos de sistema: | |||
| > | |||
| >- CPU >= 2 Núcleos | |||
| >- RAM >= 4 GiB | |||
| > | |||
| > - CPU >= 2 Núcleos | |||
| > - RAM >= 4 GiB | |||
| </br> | |||
| @@ -207,16 +206,19 @@ Se deseja configurar uma instalação de alta disponibilidade, há [Helm Charts] | |||
| Implante o Dify na Plataforma Cloud com um único clique usando [terraform](https://www.terraform.io/) | |||
| ##### Azure Global | |||
| - [Azure Terraform por @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform por @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### Usando AWS CDK para Implantação | |||
| Implante o Dify na AWS usando [CDK](https://aws.amazon.com/cdk/) | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK por @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK por @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -232,10 +234,9 @@ Implante o Dify na Alibaba Cloud com um clique usando o [Alibaba Cloud Data Mana | |||
| Implante o Dify no AKS com um clique usando [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## Contribuindo | |||
| Para aqueles que desejam contribuir com código, veja nosso [Guia de Contribuição](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| Para aqueles que desejam contribuir com código, veja nosso [Guia de Contribuição](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| Ao mesmo tempo, considere apoiar o Dify compartilhando-o nas redes sociais e em eventos e conferências. | |||
| > Estamos buscando contribuidores para ajudar na tradução do Dify para idiomas além de Mandarim e Inglês. Se você tiver interesse em ajudar, consulte o [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para mais informações e deixe-nos um comentário no canal `global-users` em nosso [Servidor da Comunidade no Discord](https://discord.gg/8Tpq4AcN9c). | |||
| @@ -248,10 +249,10 @@ Ao mesmo tempo, considere apoiar o Dify compartilhando-o nas redes sociais e em | |||
| ## Comunidade e contato | |||
| * [Discussões no GitHub](https://github.com/langgenius/dify/discussions). Melhor para: compartilhar feedback e fazer perguntas. | |||
| * [Problemas no GitHub](https://github.com/langgenius/dify/issues). Melhor para: relatar bugs encontrados no Dify.AI e propor novos recursos. Veja nosso [Guia de Contribuição](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Melhor para: compartilhar suas aplicações e interagir com a comunidade. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Melhor para: compartilhar suas aplicações e interagir com a comunidade. | |||
| - [Discussões no GitHub](https://github.com/langgenius/dify/discussions). Melhor para: compartilhar feedback e fazer perguntas. | |||
| - [Problemas no GitHub](https://github.com/langgenius/dify/issues). Melhor para: relatar bugs encontrados no Dify.AI e propor novos recursos. Veja nosso [Guia de Contribuição](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Melhor para: compartilhar suas aplicações e interagir com a comunidade. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Melhor para: compartilhar suas aplicações e interagir com a comunidade. | |||
| ## Histórico de estrelas | |||
| @@ -50,14 +50,14 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| Dify je odprtokodna platforma za razvoj aplikacij LLM. Njegov intuitivni vmesnik združuje agentski potek dela z umetno inteligenco, cevovod RAG, zmogljivosti agentov, upravljanje modelov, funkcije opazovanja in več, kar vam omogoča hiter prehod od prototipa do proizvodnje. | |||
| Dify je odprtokodna platforma za razvoj aplikacij LLM. Njegov intuitivni vmesnik združuje agentski potek dela z umetno inteligenco, cevovod RAG, zmogljivosti agentov, upravljanje modelov, funkcije opazovanja in več, kar vam omogoča hiter prehod od prototipa do proizvodnje. | |||
| ## Hitri začetek | |||
| > Preden namestite Dify, se prepričajte, da vaša naprava izpolnjuje naslednje minimalne sistemske zahteve: | |||
| > | |||
| >- CPU >= 2 Core | |||
| >- RAM >= 4 GiB | |||
| > | |||
| > - CPU >= 2 Core | |||
| > - RAM >= 4 GiB | |||
| </br> | |||
| @@ -73,34 +73,35 @@ docker compose up -d | |||
| Po zagonu lahko dostopate do nadzorne plošče Dify v brskalniku na [http://localhost/install](http://localhost/install) in začnete postopek inicializacije. | |||
| #### Iskanje pomoči | |||
| Prosimo, glejte naša pogosta vprašanja [FAQ](https://docs.dify.ai/getting-started/install-self-hosted/faqs) če naletite na težave pri nastavitvi Dify. Če imate še vedno težave, se obrnite na [skupnost ali nas](#community--contact). | |||
| > Če želite prispevati k Difyju ali narediti dodaten razvoj, glejte naš vodnik za [uvajanje iz izvorne kode](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code) | |||
| ## Ključne značilnosti | |||
| **1. Potek dela**: | |||
| Zgradite in preizkusite zmogljive poteke dela AI na vizualnem platnu, pri čemer izkoristite vse naslednje funkcije in več. | |||
| **2. Celovita podpora za modele**: | |||
| Brezhibna integracija s stotinami lastniških/odprtokodnih LLM-jev ducatov ponudnikov sklepanja in samostojnih rešitev, ki pokrivajo GPT, Mistral, Llama3 in vse modele, združljive z API-jem OpenAI. Celoten seznam podprtih ponudnikov modelov najdete [tukaj](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **1. Potek dela**: | |||
| Zgradite in preizkusite zmogljive poteke dela AI na vizualnem platnu, pri čemer izkoristite vse naslednje funkcije in več. | |||
|  | |||
| **2. Celovita podpora za modele**: | |||
| Brezhibna integracija s stotinami lastniških/odprtokodnih LLM-jev ducatov ponudnikov sklepanja in samostojnih rešitev, ki pokrivajo GPT, Mistral, Llama3 in vse modele, združljive z API-jem OpenAI. Celoten seznam podprtih ponudnikov modelov najdete [tukaj](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. Prompt IDE**: | |||
| intuitivni vmesnik za ustvarjanje pozivov, primerjavo zmogljivosti modela in dodajanje dodatnih funkcij, kot je pretvorba besedila v govor, aplikaciji, ki temelji na klepetu. | |||
| **3. Prompt IDE**: | |||
| intuitivni vmesnik za ustvarjanje pozivov, primerjavo zmogljivosti modela in dodajanje dodatnih funkcij, kot je pretvorba besedila v govor, aplikaciji, ki temelji na klepetu. | |||
| **4. RAG Pipeline**: | |||
| E Obsežne zmogljivosti RAG, ki pokrivajo vse od vnosa dokumenta do priklica, s podporo za ekstrakcijo besedila iz datotek PDF, PPT in drugih običajnih formatov dokumentov. | |||
| **4. RAG Pipeline**: | |||
| E Obsežne zmogljivosti RAG, ki pokrivajo vse od vnosa dokumenta do priklica, s podporo za ekstrakcijo besedila iz datotek PDF, PPT in drugih običajnih formatov dokumentov. | |||
| **5. Agent capabilities**: | |||
| definirate lahko agente, ki temeljijo na klicanju funkcij LLM ali ReAct, in dodate vnaprej izdelana orodja ali orodja po meri za agenta. Dify ponuja več kot 50 vgrajenih orodij za agente AI, kot so Google Search, DALL·E, Stable Diffusion in WolframAlpha. | |||
| **5. Agent capabilities**: | |||
| definirate lahko agente, ki temeljijo na klicanju funkcij LLM ali ReAct, in dodate vnaprej izdelana orodja ali orodja po meri za agenta. Dify ponuja več kot 50 vgrajenih orodij za agente AI, kot so Google Search, DALL·E, Stable Diffusion in WolframAlpha. | |||
| **6. LLMOps**: | |||
| Spremljajte in analizirajte dnevnike aplikacij in učinkovitost skozi čas. Pozive, nabore podatkov in modele lahko nenehno izboljšujete na podlagi proizvodnih podatkov in opomb. | |||
| **6. LLMOps**: | |||
| Spremljajte in analizirajte dnevnike aplikacij in učinkovitost skozi čas. Pozive, nabore podatkov in modele lahko nenehno izboljšujete na podlagi proizvodnih podatkov in opomb. | |||
| **7. Backend-as-a-Service**: | |||
| AVse ponudbe Difyja so opremljene z ustreznimi API-ji, tako da lahko Dify brez težav integrirate v svojo poslovno logiko. | |||
| **7. Backend-as-a-Service**: | |||
| AVse ponudbe Difyja so opremljene z ustreznimi API-ji, tako da lahko Dify brez težav integrirate v svojo poslovno logiko. | |||
| ## Primerjava Funkcij | |||
| @@ -173,16 +174,15 @@ Prosimo, glejte naša pogosta vprašanja [FAQ](https://docs.dify.ai/getting-star | |||
| ## Uporaba Dify | |||
| - **Cloud </br>** | |||
| Gostimo storitev Dify Cloud za vsakogar, ki jo lahko preizkusite brez nastavitev. Zagotavlja vse zmožnosti različice za samostojno namestitev in vključuje 200 brezplačnih klicev GPT-4 v načrtu peskovnika. | |||
| Gostimo storitev Dify Cloud za vsakogar, ki jo lahko preizkusite brez nastavitev. Zagotavlja vse zmožnosti različice za samostojno namestitev in vključuje 200 brezplačnih klicev GPT-4 v načrtu peskovnika. | |||
| - **Self-hosting Dify Community Edition</br>** | |||
| Hitro zaženite Dify v svojem okolju s tem [začetnim vodnikom](#quick-start) . Za dodatne reference in podrobnejša navodila uporabite našo [dokumentacijo](https://docs.dify.ai) . | |||
| Hitro zaženite Dify v svojem okolju s tem [začetnim vodnikom](#quick-start) . Za dodatne reference in podrobnejša navodila uporabite našo [dokumentacijo](https://docs.dify.ai) . | |||
| - **Dify za podjetja/organizacije</br>** | |||
| Ponujamo dodatne funkcije, osredotočene na podjetja. Zabeležite svoja vprašanja prek tega klepetalnega robota ali nam pošljite e-pošto, da se pogovorimo o potrebah podjetja. </br> | |||
| > Za novoustanovljena podjetja in mala podjetja, ki uporabljajo AWS, si oglejte Dify Premium na AWS Marketplace in ga z enim klikom uvedite v svoj AWS VPC. To je cenovno ugodna ponudba AMI z možnostjo ustvarjanja aplikacij z logotipom in blagovno znamko po meri. | |||
| Ponujamo dodatne funkcije, osredotočene na podjetja. Zabeležite svoja vprašanja prek tega klepetalnega robota ali nam pošljite e-pošto, da se pogovorimo o potrebah podjetja. </br> | |||
| > Za novoustanovljena podjetja in mala podjetja, ki uporabljajo AWS, si oglejte Dify Premium na AWS Marketplace in ga z enim klikom uvedite v svoj AWS VPC. To je cenovno ugodna ponudba AMI z možnostjo ustvarjanja aplikacij z logotipom in blagovno znamko po meri. | |||
| ## Staying ahead | |||
| @@ -190,7 +190,6 @@ Star Dify on GitHub and be instantly notified of new releases. | |||
|  | |||
| ## Napredne nastavitve | |||
| Če morate prilagoditi konfiguracijo, si oglejte komentarje v naši datoteki .env.example in posodobite ustrezne vrednosti v svoji .env datoteki. Poleg tega boste morda morali prilagoditi docker-compose.yamlsamo datoteko, na primer spremeniti različice slike, preslikave vrat ali namestitve nosilca, glede na vaše specifično okolje in zahteve za uvajanje. Po kakršnih koli spremembah ponovno zaženite docker-compose up -d. Celoten seznam razpoložljivih spremenljivk okolja najdete tukaj . | |||
| @@ -208,16 +207,19 @@ Star Dify on GitHub and be instantly notified of new releases. | |||
| namestite Dify v Cloud Platform z enim klikom z uporabo [terraform](https://www.terraform.io/) | |||
| ##### Azure Global | |||
| - [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### Uporaba AWS CDK za uvajanje | |||
| Uvedite Dify v AWS z uporabo [CDK](https://aws.amazon.com/cdk/) | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -233,21 +235,18 @@ Z enim klikom namestite Dify na Alibaba Cloud z [Alibaba Cloud Data Management]( | |||
| Z enim klikom namestite Dify v AKS z uporabo [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## Prispevam | |||
| Za tiste, ki bi radi prispevali kodo, si oglejte naš vodnik za prispevke . Hkrati vas prosimo, da podprete Dify tako, da ga delite na družbenih medijih ter na dogodkih in konferencah. | |||
| Za tiste, ki bi radi prispevali kodo, si oglejte naš vodnik za prispevke . Hkrati vas prosimo, da podprete Dify tako, da ga delite na družbenih medijih ter na dogodkih in konferencah. | |||
| > Iščemo sodelavce za pomoč pri prevajanju Difyja v jezike, ki niso mandarinščina ali angleščina. Če želite pomagati, si oglejte i18n README za več informacij in nam pustite komentar v global-userskanalu našega strežnika skupnosti Discord . | |||
| ## Skupnost in stik | |||
| * [GitHub Discussion](https://github.com/langgenius/dify/discussions). Najboljše za: izmenjavo povratnih informacij in postavljanje vprašanj. | |||
| * [GitHub Issues](https://github.com/langgenius/dify/issues). Najboljše za: hrošče, na katere naletite pri uporabi Dify.AI, in predloge funkcij. Oglejte si naš [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo. | |||
| - [GitHub Discussion](https://github.com/langgenius/dify/discussions). Najboljše za: izmenjavo povratnih informacij in postavljanje vprašanj. | |||
| - [GitHub Issues](https://github.com/langgenius/dify/issues). Najboljše za: hrošče, na katere naletite pri uporabi Dify.AI, in predloge funkcij. Oglejte si naš [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo. | |||
| **Contributors** | |||
| @@ -259,7 +258,6 @@ Za tiste, ki bi radi prispevali kodo, si oglejte naš vodnik za prispevke . Hkra | |||
| [](https://star-history.com/#langgenius/dify&Date) | |||
| ## Varnostno razkritje | |||
| Zaradi zaščite vaše zasebnosti se izogibajte objavljanju varnostnih vprašanj na GitHub. Namesto tega pošljite vprašanja na security@dify.ai in zagotovili vam bomo podrobnejši odgovor. | |||
| @@ -48,11 +48,10 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| Dify, açık kaynaklı bir LLM uygulama geliştirme platformudur. Sezgisel arayüzü, AI iş akışı, RAG pipeline'ı, ajan yetenekleri, model yönetimi, gözlemlenebilirlik özellikleri ve daha fazlasını birleştirerek, prototipten üretime hızlıca geçmenizi sağlar. İşte temel özelliklerin bir listesi: | |||
| </br> </br> | |||
| **1. Workflow**: | |||
| **1. Workflow**: | |||
| Görsel bir arayüz üzerinde güçlü AI iş akışları oluşturun ve test edin, aşağıdaki tüm özellikleri ve daha fazlasını kullanarak. | |||
| **2. Kapsamlı model desteği**: | |||
| @@ -60,24 +59,23 @@ Görsel bir arayüz üzerinde güçlü AI iş akışları oluşturun ve test edi | |||
|  | |||
| **3. Prompt IDE**: | |||
| Komut istemlerini oluşturmak, model performansını karşılaştırmak ve sohbet tabanlı uygulamalara metin-konuşma gibi ek özellikler eklemek için kullanıcı dostu bir arayüz. | |||
| **3. Prompt IDE**: | |||
| Komut istemlerini oluşturmak, model performansını karşılaştırmak ve sohbet tabanlı uygulamalara metin-konuşma gibi ek özellikler eklemek için kullanıcı dostu bir arayüz. | |||
| **4. RAG Pipeline**: | |||
| Belge alımından bilgi çekmeye kadar geniş kapsamlı RAG yetenekleri. PDF'ler, PPT'ler ve diğer yaygın belge formatlarından metin çıkarma için hazır destek sunar. | |||
| **5. Ajan yetenekleri**: | |||
| LLM Fonksiyon Çağırma veya ReAct'a dayalı ajanlar tanımlayabilir ve bu ajanlara önceden hazırlanmış veya özel araçlar ekleyebilirsiniz. Dify, AI ajanları için Google Arama, DALL·E, Stable Diffusion ve WolframAlpha gibi 50'den fazla yerleşik araç sağlar. | |||
| **4. RAG Pipeline**: | |||
| Belge alımından bilgi çekmeye kadar geniş kapsamlı RAG yetenekleri. PDF'ler, PPT'ler ve diğer yaygın belge formatlarından metin çıkarma için hazır destek sunar. | |||
| **6. LLMOps**: | |||
| Uygulama loglarını ve performans metriklerini zaman içinde izleme ve analiz etme imkanı. Üretim ortamından elde edilen verilere ve kullanıcı geri bildirimlerine dayanarak, prompt'ları, veri setlerini ve modelleri sürekli olarak optimize edebilirsiniz. Bu sayede, AI uygulamanızın performansını ve doğruluğunu sürekli olarak artırabilirsiniz. | |||
| **5. Ajan yetenekleri**: | |||
| LLM Fonksiyon Çağırma veya ReAct'a dayalı ajanlar tanımlayabilir ve bu ajanlara önceden hazırlanmış veya özel araçlar ekleyebilirsiniz. Dify, AI ajanları için Google Arama, DALL·E, Stable Diffusion ve WolframAlpha gibi 50'den fazla yerleşik araç sağlar. | |||
| **7. Hizmet Olarak Backend**: | |||
| Dify'ın tüm özellikleri ilgili API'lerle birlikte gelir, böylece Dify'ı kendi iş mantığınıza kolayca entegre edebilirsiniz. | |||
| **6. LLMOps**: | |||
| Uygulama loglarını ve performans metriklerini zaman içinde izleme ve analiz etme imkanı. Üretim ortamından elde edilen verilere ve kullanıcı geri bildirimlerine dayanarak, prompt'ları, veri setlerini ve modelleri sürekli olarak optimize edebilirsiniz. Bu sayede, AI uygulamanızın performansını ve doğruluğunu sürekli olarak artırabilirsiniz. | |||
| **7. Hizmet Olarak Backend**: | |||
| Dify'ın tüm özellikleri ilgili API'lerle birlikte gelir, böylece Dify'ı kendi iş mantığınıza kolayca entegre edebilirsiniz. | |||
| ## Özellik karşılaştırması | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Özellik</th> | |||
| @@ -147,14 +145,15 @@ Görsel bir arayüz üzerinde güçlü AI iş akışları oluşturun ve test edi | |||
| ## Dify'ı Kullanma | |||
| - **Cloud </br>** | |||
| Herkesin sıfır kurulumla denemesi için bir [Dify Cloud](https://dify.ai) hizmeti sunuyoruz. Bu hizmet, kendi kendine dağıtılan versiyonun tüm yeteneklerini sağlar ve sandbox planında 200 ücretsiz GPT-4 çağrısı içerir. | |||
| Herkesin sıfır kurulumla denemesi için bir [Dify Cloud](https://dify.ai) hizmeti sunuyoruz. Bu hizmet, kendi kendine dağıtılan versiyonun tüm yeteneklerini sağlar ve sandbox planında 200 ücretsiz GPT-4 çağrısı içerir. | |||
| - **Dify Topluluk Sürümünü Kendi Sunucunuzda Barındırma</br>** | |||
| Bu [başlangıç kılavuzu](#quick-start) ile Dify'ı kendi ortamınızda hızlıca çalıştırın. | |||
| Daha fazla referans ve detaylı talimatlar için [dokümantasyonumuzu](https://docs.dify.ai) kullanın. | |||
| Bu [başlangıç kılavuzu](#quick-start) ile Dify'ı kendi ortamınızda hızlıca çalıştırın. | |||
| Daha fazla referans ve detaylı talimatlar için [dokümantasyonumuzu](https://docs.dify.ai) kullanın. | |||
| - **Kurumlar / organizasyonlar için Dify</br>** | |||
| Ek kurumsal odaklı özellikler sunuyoruz. Kurumsal ihtiyaçları görüşmek için [bize bir e-posta gönderin](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry). </br> | |||
| Ek kurumsal odaklı özellikler sunuyoruz. Kurumsal ihtiyaçları görüşmek için [bize bir e-posta gönderin](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry). </br> | |||
| > AWS kullanan startuplar ve küçük işletmeler için, [AWS Marketplace'deki Dify Premium'a](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) göz atın ve tek tıklamayla kendi AWS VPC'nize dağıtın. Bu, özel logo ve marka ile uygulamalar oluşturma seçeneğine sahip uygun fiyatlı bir AMI teklifdir. | |||
| ## Güncel Kalma | |||
| @@ -163,13 +162,12 @@ GitHub'da Dify'a yıldız verin ve yeni sürümlerden anında haberdar olun. | |||
|  | |||
| ## Hızlı başlangıç | |||
| > Dify'ı kurmadan önce, makinenizin aşağıdaki minimum sistem gereksinimlerini karşıladığından emin olun: | |||
| > | |||
| >- CPU >= 2 Çekirdek | |||
| >- RAM >= 4GB | |||
| > | |||
| > - CPU >= 2 Çekirdek | |||
| > - RAM >= 4GB | |||
| </br> | |||
| Dify sunucusunu başlatmanın en kolay yolu, [docker-compose.yml](docker/docker-compose.yaml) dosyamızı çalıştırmaktır. Kurulum komutunu çalıştırmadan önce, makinenizde [Docker](https://docs.docker.com/get-docker/) ve [Docker Compose](https://docs.docker.com/compose/install/)'un kurulu olduğundan emin olun: | |||
| @@ -201,16 +199,19 @@ Yüksek kullanılabilirliğe sahip bir kurulum yapılandırmak isterseniz, Dify' | |||
| Dify'ı bulut platformuna tek tıklamayla dağıtın [terraform](https://www.terraform.io/) kullanarak | |||
| ##### Azure Global | |||
| - [Azure Terraform tarafından @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform tarafından @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### AWS CDK ile Dağıtım | |||
| [CDK](https://aws.amazon.com/cdk/) kullanarak Dify'ı AWS'ye dağıtın | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK tarafından @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK tarafından @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| @@ -226,7 +227,6 @@ Dify'ı bulut platformuna tek tıklamayla dağıtın [terraform](https://www.ter | |||
| [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) kullanarak Dify'ı tek tıkla AKS'ye dağıtın | |||
| ## Katkıda Bulunma | |||
| Kod katkısında bulunmak isteyenler için [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakabilirsiniz. | |||
| @@ -242,10 +242,10 @@ Aynı zamanda, lütfen Dify'ı sosyal medyada, etkinliklerde ve konferanslarda p | |||
| ## Topluluk & iletişim | |||
| * [GitHub Tartışmaları](https://github.com/langgenius/dify/discussions). En uygun: geri bildirim paylaşmak ve soru sormak için. | |||
| * [GitHub Sorunları](https://github.com/langgenius/dify/issues). En uygun: Dify.AI kullanırken karşılaştığınız hatalar ve özellik önerileri için. [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakın. | |||
| * [Discord](https://discord.gg/FngNHpbcY7). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. | |||
| - [GitHub Tartışmaları](https://github.com/langgenius/dify/discussions). En uygun: geri bildirim paylaşmak ve soru sormak için. | |||
| - [GitHub Sorunları](https://github.com/langgenius/dify/issues). En uygun: Dify.AI kullanırken karşılaştığınız hatalar ve özellik önerileri için. [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakın. | |||
| - [Discord](https://discord.gg/FngNHpbcY7). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. | |||
| ## Star history | |||
| @@ -180,11 +180,12 @@ Dify 的所有功能都提供相應的 API,因此您可以輕鬆地將 Dify | |||
| 我們提供 [Dify Cloud](https://dify.ai) 服務,任何人都可以零配置嘗試。它提供與自部署版本相同的所有功能,並在沙盒計劃中包含 200 次免費 GPT-4 調用。 | |||
| - **自託管 Dify 社區版</br>** | |||
| 使用這份[快速指南](#快速開始)在您的環境中快速運行 Dify。 | |||
| 使用這份[快速指南](#%E5%BF%AB%E9%80%9F%E9%96%8B%E5%A7%8B)在您的環境中快速運行 Dify。 | |||
| 使用我們的[文檔](https://docs.dify.ai)獲取更多參考和深入指導。 | |||
| - **企業/組織版 Dify</br>** | |||
| 我們提供額外的企業中心功能。[通過這個聊天機器人記錄您的問題](https://udify.app/chat/22L1zSxg6yW1cWQg)或[發送電子郵件給我們](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry)討論企業需求。</br> | |||
| 我們提供額外的企業中心功能。[通過這個聊天機器人記錄您的問題](https://udify.app/chat/22L1zSxg6yW1cWQg)或[發送電子郵件給我們](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry)討論企業需求。</br> | |||
| > 對於使用 AWS 的初創企業和小型企業,請查看 [AWS Marketplace 上的 Dify Premium](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6),並一鍵部署到您自己的 AWS VPC。這是一個經濟實惠的 AMI 產品,可選擇使用自定義徽標和品牌創建應用。 | |||
| ## 保持領先 | |||
| @@ -238,7 +239,6 @@ Dify 的所有功能都提供相應的 API,因此您可以輕鬆地將 Dify | |||
| 使用[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) 將 Dify 一鍵部署到 AKS | |||
| ## 貢獻 | |||
| 對於想要貢獻程式碼的開發者,請參閱我們的[貢獻指南](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)。 | |||
| @@ -48,36 +48,34 @@ | |||
| <a href="./README_BN.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a> | |||
| </p> | |||
| Dify là một nền tảng phát triển ứng dụng LLM mã nguồn mở. Giao diện trực quan kết hợp quy trình làm việc AI, mô hình RAG, khả năng tác nhân, quản lý mô hình, tính năng quan sát và hơn thế nữa, cho phép bạn nhanh chóng chuyển từ nguyên mẫu sang sản phẩm. Đây là danh sách các tính năng cốt lõi: | |||
| </br> </br> | |||
| **1. Quy trình làm việc**: | |||
| Xây dựng và kiểm tra các quy trình làm việc AI mạnh mẽ trên một canvas trực quan, tận dụng tất cả các tính năng sau đây và hơn thế nữa. | |||
| **1. Quy trình làm việc**: | |||
| Xây dựng và kiểm tra các quy trình làm việc AI mạnh mẽ trên một canvas trực quan, tận dụng tất cả các tính năng sau đây và hơn thế nữa. | |||
| **2. Hỗ trợ mô hình toàn diện**: | |||
| Tích hợp liền mạch với hàng trăm mô hình LLM độc quyền / mã nguồn mở từ hàng chục nhà cung cấp suy luận và giải pháp tự lưu trữ, bao gồm GPT, Mistral, Llama3, và bất kỳ mô hình tương thích API OpenAI nào. Danh sách đầy đủ các nhà cung cấp mô hình được hỗ trợ có thể được tìm thấy [tại đây](https://docs.dify.ai/getting-started/readme/model-providers). | |||
| **2. Hỗ trợ mô hình toàn diện**: | |||
| Tích hợp liền mạch với hàng trăm mô hình LLM độc quyền / mã nguồn mở từ hàng chục nhà cung cấp suy luận và giải pháp tự lưu trữ, bao gồm GPT, Mistral, Llama3, và bất kỳ mô hình tương thích API OpenAI nào. Danh sách đầy đủ các nhà cung cấp mô hình được hỗ trợ có thể được tìm thấy [tại đây](https://docs.dify.ai/getting-started/readme/model-providers). | |||
|  | |||
| **3. IDE Prompt**: | |||
| Giao diện trực quan để tạo prompt, so sánh hiệu suất mô hình và thêm các tính năng bổ sung như chuyển văn bản thành giọng nói cho một ứng dụng dựa trên trò chuyện. | |||
| **3. IDE Prompt**: | |||
| Giao diện trực quan để tạo prompt, so sánh hiệu suất mô hình và thêm các tính năng bổ sung như chuyển văn bản thành giọng nói cho một ứng dụng dựa trên trò chuyện. | |||
| **4. Mô hình RAG**: | |||
| Khả năng RAG mở rộng bao gồm mọi thứ từ nhập tài liệu đến truy xuất, với hỗ trợ sẵn có cho việc trích xuất văn bản từ PDF, PPT và các định dạng tài liệu phổ biến khác. | |||
| **4. Mô hình RAG**: | |||
| Khả năng RAG mở rộng bao gồm mọi thứ từ nhập tài liệu đến truy xuất, với hỗ trợ sẵn có cho việc trích xuất văn bản từ PDF, PPT và các định dạng tài liệu phổ biến khác. | |||
| **5. Khả năng tác nhân**: | |||
| Bạn có thể định nghĩa các tác nhân dựa trên LLM Function Calling hoặc ReAct, và thêm các công cụ được xây dựng sẵn hoặc tùy chỉnh cho tác nhân. Dify cung cấp hơn 50 công cụ tích hợp sẵn cho các tác nhân AI, như Google Search, DALL·E, Stable Diffusion và WolframAlpha. | |||
| **5. Khả năng tác nhân**: | |||
| Bạn có thể định nghĩa các tác nhân dựa trên LLM Function Calling hoặc ReAct, và thêm các công cụ được xây dựng sẵn hoặc tùy chỉnh cho tác nhân. Dify cung cấp hơn 50 công cụ tích hợp sẵn cho các tác nhân AI, như Google Search, DALL·E, Stable Diffusion và WolframAlpha. | |||
| **6. LLMOps**: | |||
| Giám sát và phân tích nhật ký và hiệu suất ứng dụng theo thời gian. Bạn có thể liên tục cải thiện prompt, bộ dữ liệu và mô hình dựa trên dữ liệu sản xuất và chú thích. | |||
| **7. Backend-as-a-Service**: | |||
| Tất cả các dịch vụ của Dify đều đi kèm với các API tương ứng, vì vậy bạn có thể dễ dàng tích hợp Dify vào logic kinh doanh của riêng mình. | |||
| **6. LLMOps**: | |||
| Giám sát và phân tích nhật ký và hiệu suất ứng dụng theo thời gian. Bạn có thể liên tục cải thiện prompt, bộ dữ liệu và mô hình dựa trên dữ liệu sản xuất và chú thích. | |||
| **7. Backend-as-a-Service**: | |||
| Tất cả các dịch vụ của Dify đều đi kèm với các API tương ứng, vì vậy bạn có thể dễ dàng tích hợp Dify vào logic kinh doanh của riêng mình. | |||
| ## So sánh tính năng | |||
| <table style="width: 100%;"> | |||
| <tr> | |||
| <th align="center">Tính năng</th> | |||
| @@ -147,16 +145,16 @@ Dify là một nền tảng phát triển ứng dụng LLM mã nguồn mở. Gia | |||
| ## Sử dụng Dify | |||
| - **Cloud </br>** | |||
| Chúng tôi lưu trữ dịch vụ [Dify Cloud](https://dify.ai) cho bất kỳ ai muốn thử mà không cần cài đặt. Nó cung cấp tất cả các khả năng của phiên bản tự triển khai và bao gồm 200 lượt gọi GPT-4 miễn phí trong gói sandbox. | |||
| Chúng tôi lưu trữ dịch vụ [Dify Cloud](https://dify.ai) cho bất kỳ ai muốn thử mà không cần cài đặt. Nó cung cấp tất cả các khả năng của phiên bản tự triển khai và bao gồm 200 lượt gọi GPT-4 miễn phí trong gói sandbox. | |||
| - **Tự triển khai Dify Community Edition</br>** | |||
| Nhanh chóng chạy Dify trong môi trường của bạn với [hướng dẫn bắt đầu](#quick-start) này. | |||
| Sử dụng [tài liệu](https://docs.dify.ai) của chúng tôi để tham khảo thêm và nhận hướng dẫn chi tiết hơn. | |||
| Nhanh chóng chạy Dify trong môi trường của bạn với [hướng dẫn bắt đầu](#quick-start) này. | |||
| Sử dụng [tài liệu](https://docs.dify.ai) của chúng tôi để tham khảo thêm và nhận hướng dẫn chi tiết hơn. | |||
| - **Dify cho doanh nghiệp / tổ chức</br>** | |||
| Chúng tôi cung cấp các tính năng bổ sung tập trung vào doanh nghiệp. [Ghi lại câu hỏi của bạn cho chúng tôi thông qua chatbot này](https://udify.app/chat/22L1zSxg6yW1cWQg) hoặc [gửi email cho chúng tôi](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry) để thảo luận về nhu cầu doanh nghiệp. </br> | |||
| > Đối với các công ty khởi nghiệp và doanh nghiệp nhỏ sử dụng AWS, hãy xem [Dify Premium trên AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) và triển khai nó vào AWS VPC của riêng bạn chỉ với một cú nhấp chuột. Đây là một AMI giá cả phải chăng với tùy chọn tạo ứng dụng với logo và thương hiệu tùy chỉnh. | |||
| Chúng tôi cung cấp các tính năng bổ sung tập trung vào doanh nghiệp. [Ghi lại câu hỏi của bạn cho chúng tôi thông qua chatbot này](https://udify.app/chat/22L1zSxg6yW1cWQg) hoặc [gửi email cho chúng tôi](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) để thảo luận về nhu cầu doanh nghiệp. </br> | |||
| > Đối với các công ty khởi nghiệp và doanh nghiệp nhỏ sử dụng AWS, hãy xem [Dify Premium trên AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) và triển khai nó vào AWS VPC của riêng bạn chỉ với một cú nhấp chuột. Đây là một AMI giá cả phải chăng với tùy chọn tạo ứng dụng với logo và thương hiệu tùy chỉnh. | |||
| ## Luôn cập nhật | |||
| @@ -164,13 +162,12 @@ Yêu thích Dify trên GitHub và được thông báo ngay lập tức về cá | |||
|  | |||
| ## Bắt đầu nhanh | |||
| > Trước khi cài đặt Dify, hãy đảm bảo máy của bạn đáp ứng các yêu cầu hệ thống tối thiểu sau: | |||
| > | |||
| >- CPU >= 2 Core | |||
| >- RAM >= 4GB | |||
| > | |||
| > - CPU >= 2 Core | |||
| > - RAM >= 4GB | |||
| </br> | |||
| @@ -203,20 +200,22 @@ Nếu bạn muốn cấu hình một cài đặt có độ sẵn sàng cao, có | |||
| Triển khai Dify lên nền tảng đám mây với một cú nhấp chuột bằng cách sử dụng [terraform](https://www.terraform.io/) | |||
| ##### Azure Global | |||
| - [Azure Terraform bởi @nikawang](https://github.com/nikawang/dify-azure-terraform) | |||
| ##### Google Cloud | |||
| - [Google Cloud Terraform bởi @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) | |||
| #### Sử dụng AWS CDK để Triển khai | |||
| Triển khai Dify trên AWS bằng [CDK](https://aws.amazon.com/cdk/) | |||
| ##### AWS | |||
| ##### AWS | |||
| - [AWS CDK bởi @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) | |||
| - [AWS CDK bởi @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) | |||
| #### Alibaba Cloud | |||
| [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) | |||
| @@ -229,13 +228,11 @@ Triển khai Dify lên Alibaba Cloud chỉ với một cú nhấp chuột bằng | |||
| Triển khai Dify lên AKS chỉ với một cú nhấp chuột bằng [Azure Devops Pipeline Helm Chart bởi @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) | |||
| ## Đóng góp | |||
| Đối với những người muốn đóng góp mã, xem [Hướng dẫn Đóng góp](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) của chúng tôi. | |||
| Đối với những người muốn đóng góp mã, xem [Hướng dẫn Đóng góp](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) của chúng tôi. | |||
| Đồng thời, vui lòng xem xét hỗ trợ Dify bằng cách chia sẻ nó trên mạng xã hội và tại các sự kiện và hội nghị. | |||
| > Chúng tôi đang tìm kiếm người đóng góp để giúp dịch Dify sang các ngôn ngữ khác ngoài tiếng Trung hoặc tiếng Anh. Nếu bạn quan tâm đến việc giúp đỡ, vui lòng xem [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) để biết thêm thông tin và để lại bình luận cho chúng tôi trong kênh `global-users` của [Máy chủ Cộng đồng Discord](https://discord.gg/8Tpq4AcN9c) của chúng tôi. | |||
| **Người đóng góp** | |||
| @@ -246,10 +243,10 @@ Triển khai Dify lên AKS chỉ với một cú nhấp chuột bằng [Azure De | |||
| ## Cộng đồng & liên hệ | |||
| * [Thảo luận GitHub](https://github.com/langgenius/dify/discussions). Tốt nhất cho: chia sẻ phản hồi và đặt câu hỏi. | |||
| * [Vấn đề GitHub](https://github.com/langgenius/dify/issues). Tốt nhất cho: lỗi bạn gặp phải khi sử dụng Dify.AI và đề xuất tính năng. Xem [Hướng dẫn Đóng góp](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) của chúng tôi. | |||
| * [Discord](https://discord.gg/FngNHpbcY7). Tốt nhất cho: chia sẻ ứng dụng của bạn và giao lưu với cộng đồng. | |||
| * [X(Twitter)](https://twitter.com/dify_ai). Tốt nhất cho: chia sẻ ứng dụng của bạn và giao lưu với cộng đồng. | |||
| - [Thảo luận GitHub](https://github.com/langgenius/dify/discussions). Tốt nhất cho: chia sẻ phản hồi và đặt câu hỏi. | |||
| - [Vấn đề GitHub](https://github.com/langgenius/dify/issues). Tốt nhất cho: lỗi bạn gặp phải khi sử dụng Dify.AI và đề xuất tính năng. Xem [Hướng dẫn Đóng góp](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) của chúng tôi. | |||
| - [Discord](https://discord.gg/FngNHpbcY7). Tốt nhất cho: chia sẻ ứng dụng của bạn và giao lưu với cộng đồng. | |||
| - [X(Twitter)](https://twitter.com/dify_ai). Tốt nhất cho: chia sẻ ứng dụng của bạn và giao lưu với cộng đồng. | |||
| ## Lịch sử Yêu thích | |||
| @@ -3,7 +3,7 @@ | |||
| ## Usage | |||
| > [!IMPORTANT] | |||
| > | |||
| > | |||
| > In the v1.3.0 release, `poetry` has been replaced with | |||
| > [`uv`](https://docs.astral.sh/uv/) as the package manager | |||
| > for Dify API backend service. | |||
| @@ -20,25 +20,29 @@ | |||
| cd ../api | |||
| ``` | |||
| 2. Copy `.env.example` to `.env` | |||
| 1. Copy `.env.example` to `.env` | |||
| ```cli | |||
| cp .env.example .env | |||
| cp .env.example .env | |||
| ``` | |||
| 3. Generate a `SECRET_KEY` in the `.env` file. | |||
| 1. Generate a `SECRET_KEY` in the `.env` file. | |||
| bash for Linux | |||
| ```bash for Linux | |||
| sed -i "/^SECRET_KEY=/c\SECRET_KEY=$(openssl rand -base64 42)" .env | |||
| ``` | |||
| bash for Mac | |||
| ```bash for Mac | |||
| secret_key=$(openssl rand -base64 42) | |||
| sed -i '' "/^SECRET_KEY=/c\\ | |||
| SECRET_KEY=${secret_key}" .env | |||
| ``` | |||
| 4. Create environment. | |||
| 1. Create environment. | |||
| Dify API service uses [UV](https://docs.astral.sh/uv/) to manage dependencies. | |||
| First, you need to add the uv package manager, if you don't have it already. | |||
| @@ -49,13 +53,13 @@ | |||
| brew install uv | |||
| ``` | |||
| 5. Install dependencies | |||
| 1. Install dependencies | |||
| ```bash | |||
| uv sync --dev | |||
| ``` | |||
| 6. Run migrate | |||
| 1. Run migrate | |||
| Before the first launch, migrate the database to the latest version. | |||
| @@ -63,24 +67,27 @@ | |||
| uv run flask db upgrade | |||
| ``` | |||
| 7. Start backend | |||
| 1. Start backend | |||
| ```bash | |||
| uv run flask run --host 0.0.0.0 --port=5001 --debug | |||
| ``` | |||
| 8. Start Dify [web](../web) service. | |||
| 9. Setup your application by visiting `http://localhost:3000`. | |||
| 10. If you need to handle and debug the async tasks (e.g. dataset importing and documents indexing), please start the worker service. | |||
| 1. Start Dify [web](../web) service. | |||
| ```bash | |||
| uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion,plugin,workflow_storage | |||
| ``` | |||
| 1. Setup your application by visiting `http://localhost:3000`. | |||
| Addition, if you want to debug the celery scheduled tasks, you can use the following command in another terminal: | |||
| ```bash | |||
| uv run celery -A app.celery beat | |||
| ``` | |||
| 1. If you need to handle and debug the async tasks (e.g. dataset importing and documents indexing), please start the worker service. | |||
| ```bash | |||
| uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion,plugin,workflow_storage | |||
| ``` | |||
| Addition, if you want to debug the celery scheduled tasks, you can use the following command in another terminal: | |||
| ```bash | |||
| uv run celery -A app.celery beat | |||
| ``` | |||
| ## Testing | |||
| @@ -90,9 +97,8 @@ | |||
| uv sync --dev | |||
| ``` | |||
| 2. Run the tests locally with mocked system environment variables in `tool.pytest_env` section in `pyproject.toml` | |||
| 1. Run the tests locally with mocked system environment variables in `tool.pytest_env` section in `pyproject.toml` | |||
| ```bash | |||
| uv run -P api bash dev/pytest/pytest_all_tests.sh | |||
| ``` | |||
| @@ -1,3 +1,5 @@ | |||
| from datetime import datetime | |||
| import pytz | |||
| from flask import request | |||
| from flask_login import current_user | |||
| @@ -327,6 +329,9 @@ class EducationVerifyApi(Resource): | |||
| class EducationApi(Resource): | |||
| status_fields = { | |||
| "result": fields.Boolean, | |||
| "is_student": fields.Boolean, | |||
| "expire_at": TimestampField, | |||
| "allow_refresh": fields.Boolean, | |||
| } | |||
| @setup_required | |||
| @@ -354,7 +359,11 @@ class EducationApi(Resource): | |||
| def get(self): | |||
| account = current_user | |||
| return BillingService.EducationIdentity.is_active(account.id) | |||
| res = BillingService.EducationIdentity.status(account.id) | |||
| # convert expire_at to UTC timestamp from isoformat | |||
| if res and "expire_at" in res: | |||
| res["expire_at"] = datetime.fromisoformat(res["expire_at"]).astimezone(pytz.utc) | |||
| return res | |||
| class EducationAutoCompleteApi(Resource): | |||
| @@ -1,27 +1,38 @@ | |||
| from flask_restful import ( | |||
| Resource, # type: ignore | |||
| reqparse, | |||
| ) | |||
| from flask_restful import Resource, reqparse | |||
| from controllers.console.wraps import setup_required | |||
| from controllers.inner_api import api | |||
| from controllers.inner_api.wraps import enterprise_inner_api_only | |||
| from services.enterprise.mail_service import DifyMail, EnterpriseMailService | |||
| from controllers.inner_api.wraps import billing_inner_api_only, enterprise_inner_api_only | |||
| from tasks.mail_inner_task import send_inner_email_task | |||
| _mail_parser = reqparse.RequestParser() | |||
| _mail_parser.add_argument("to", type=str, action="append", required=True) | |||
| _mail_parser.add_argument("subject", type=str, required=True) | |||
| _mail_parser.add_argument("body", type=str, required=True) | |||
| _mail_parser.add_argument("substitutions", type=dict, required=False) | |||
| class BaseMail(Resource): | |||
| """Shared logic for sending an inner email.""" | |||
| class EnterpriseMail(Resource): | |||
| @setup_required | |||
| @enterprise_inner_api_only | |||
| def post(self): | |||
| parser = reqparse.RequestParser() | |||
| parser.add_argument("to", type=str, action="append", required=True) | |||
| parser.add_argument("subject", type=str, required=True) | |||
| parser.add_argument("body", type=str, required=True) | |||
| parser.add_argument("substitutions", type=dict, required=False) | |||
| args = parser.parse_args() | |||
| EnterpriseMailService.send_mail(DifyMail(**args)) | |||
| args = _mail_parser.parse_args() | |||
| send_inner_email_task.delay( | |||
| to=args["to"], | |||
| subject=args["subject"], | |||
| body=args["body"], | |||
| substitutions=args["substitutions"], | |||
| ) | |||
| return {"message": "success"}, 200 | |||
| class EnterpriseMail(BaseMail): | |||
| method_decorators = [setup_required, enterprise_inner_api_only] | |||
| class BillingMail(BaseMail): | |||
| method_decorators = [setup_required, billing_inner_api_only] | |||
| api.add_resource(EnterpriseMail, "/enterprise/mail") | |||
| api.add_resource(BillingMail, "/billing/mail") | |||
| @@ -10,6 +10,22 @@ from extensions.ext_database import db | |||
| from models.model import EndUser | |||
| def billing_inner_api_only(view): | |||
| @wraps(view) | |||
| def decorated(*args, **kwargs): | |||
| if not dify_config.INNER_API: | |||
| abort(404) | |||
| # get header 'X-Inner-Api-Key' | |||
| inner_api_key = request.headers.get("X-Inner-Api-Key") | |||
| if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY: | |||
| abort(401) | |||
| return view(*args, **kwargs) | |||
| return decorated | |||
| def enterprise_inner_api_only(view): | |||
| @wraps(view) | |||
| def decorated(*args, **kwargs): | |||
| @@ -30,7 +30,7 @@ from core.rag.splitter.fixed_text_splitter import ( | |||
| FixedRecursiveCharacterTextSplitter, | |||
| ) | |||
| from core.rag.splitter.text_splitter import TextSplitter | |||
| from core.tools.utils.rag_web_reader import get_image_upload_file_ids | |||
| from core.tools.utils.web_reader_tool import get_image_upload_file_ids | |||
| from extensions.ext_database import db | |||
| from extensions.ext_redis import redis_client | |||
| from extensions.ext_storage import storage | |||
| @@ -532,7 +532,7 @@ class LLMGenerator: | |||
| model=model_config.get("name", ""), | |||
| ) | |||
| match node_type: | |||
| case "llm", "agent": | |||
| case "llm" | "agent": | |||
| system_prompt = LLM_MODIFY_PROMPT_SYSTEM | |||
| case "code": | |||
| system_prompt = LLM_MODIFY_CODE_SYSTEM | |||
| @@ -7,7 +7,7 @@ import urllib.parse | |||
| from typing import Optional | |||
| from urllib.parse import urljoin | |||
| import requests | |||
| import httpx | |||
| from pydantic import BaseModel, ValidationError | |||
| from core.mcp.auth.auth_provider import OAuthClientProvider | |||
| @@ -105,18 +105,18 @@ def discover_oauth_metadata(server_url: str, protocol_version: Optional[str] = N | |||
| try: | |||
| headers = {"MCP-Protocol-Version": protocol_version or LATEST_PROTOCOL_VERSION} | |||
| response = requests.get(url, headers=headers) | |||
| response = httpx.get(url, headers=headers) | |||
| if response.status_code == 404: | |||
| return None | |||
| if not response.ok: | |||
| if not response.is_success: | |||
| raise ValueError(f"HTTP {response.status_code} trying to load well-known OAuth metadata") | |||
| return OAuthMetadata.model_validate(response.json()) | |||
| except requests.RequestException as e: | |||
| if isinstance(e, requests.ConnectionError): | |||
| response = requests.get(url) | |||
| except httpx.RequestError as e: | |||
| if isinstance(e, httpx.ConnectError): | |||
| response = httpx.get(url) | |||
| if response.status_code == 404: | |||
| return None | |||
| if not response.ok: | |||
| if not response.is_success: | |||
| raise ValueError(f"HTTP {response.status_code} trying to load well-known OAuth metadata") | |||
| return OAuthMetadata.model_validate(response.json()) | |||
| raise | |||
| @@ -206,8 +206,8 @@ def exchange_authorization( | |||
| if client_information.client_secret: | |||
| params["client_secret"] = client_information.client_secret | |||
| response = requests.post(token_url, data=params) | |||
| if not response.ok: | |||
| response = httpx.post(token_url, data=params) | |||
| if not response.is_success: | |||
| raise ValueError(f"Token exchange failed: HTTP {response.status_code}") | |||
| return OAuthTokens.model_validate(response.json()) | |||
| @@ -237,8 +237,8 @@ def refresh_authorization( | |||
| if client_information.client_secret: | |||
| params["client_secret"] = client_information.client_secret | |||
| response = requests.post(token_url, data=params) | |||
| if not response.ok: | |||
| response = httpx.post(token_url, data=params) | |||
| if not response.is_success: | |||
| raise ValueError(f"Token refresh failed: HTTP {response.status_code}") | |||
| return OAuthTokens.model_validate(response.json()) | |||
| @@ -256,12 +256,12 @@ def register_client( | |||
| else: | |||
| registration_url = urljoin(server_url, "/register") | |||
| response = requests.post( | |||
| response = httpx.post( | |||
| registration_url, | |||
| json=client_metadata.model_dump(), | |||
| headers={"Content-Type": "application/json"}, | |||
| ) | |||
| if not response.ok: | |||
| if not response.is_success: | |||
| response.raise_for_status() | |||
| return OAuthClientInformationFull.model_validate(response.json()) | |||
| @@ -283,7 +283,7 @@ def auth( | |||
| raise ValueError("Existing OAuth client information is required when exchanging an authorization code") | |||
| try: | |||
| full_information = register_client(server_url, metadata, provider.client_metadata) | |||
| except requests.RequestException as e: | |||
| except httpx.RequestError as e: | |||
| raise ValueError(f"Could not register OAuth client: {e}") | |||
| provider.save_client_information(full_information) | |||
| client_information = full_information | |||
| @@ -30,7 +30,7 @@ This module provides the interface for invoking and authenticating various model | |||
| In addition, this list also returns configurable parameter information and rules for LLM, as shown below: | |||
|  | |||
|  | |||
| These parameters are all defined in the backend, allowing different settings for various parameters supported by different models, as detailed in: [Schema](./docs/en_US/schema.md#ParameterRule). | |||
| @@ -60,8 +60,6 @@ Model Runtime is divided into three layers: | |||
| It offers direct invocation of various model types, predefined model configuration information, getting predefined/remote model lists, model credential authentication methods. Different models provide additional special methods, like LLM's pre-computed tokens method, cost information obtaining method, etc., **allowing horizontal expansion** for different models under the same provider (within supported model types). | |||
| ## Next Steps | |||
| - Add new provider configuration: [Link](./docs/en_US/provider_scale_out.md) | |||
| @@ -20,19 +20,19 @@ | |||
|  | |||
| 展示所有已支持的供应商列表,除了返回供应商名称、图标之外,还提供了支持的模型类型列表,预定义模型列表、配置方式以及配置凭据的表单规则等等,规则设计详见:[Schema](./docs/zh_Hans/schema.md)。 | |||
| 展示所有已支持的供应商列表,除了返回供应商名称、图标之外,还提供了支持的模型类型列表,预定义模型列表、配置方式以及配置凭据的表单规则等等,规则设计详见:[Schema](./docs/zh_Hans/schema.md)。 | |||
| - 可选择的模型列表展示 | |||
|  | |||
| 配置供应商/模型凭据后,可在此下拉(应用编排界面/默认模型)查看可用的 LLM 列表,其中灰色的为未配置凭据供应商的预定义模型列表,方便用户查看已支持的模型。 | |||
| 配置供应商/模型凭据后,可在此下拉(应用编排界面/默认模型)查看可用的 LLM 列表,其中灰色的为未配置凭据供应商的预定义模型列表,方便用户查看已支持的模型。 | |||
| 除此之外,该列表还返回了 LLM 可配置的参数信息和规则,如下图: | |||
| 除此之外,该列表还返回了 LLM 可配置的参数信息和规则,如下图: | |||
|  | |||
|  | |||
| 这里的参数均为后端定义,相比之前只有 5 种固定参数,这里可为不同模型设置所支持的各种参数,详见:[Schema](./docs/zh_Hans/schema.md#ParameterRule)。 | |||
| 这里的参数均为后端定义,相比之前只有 5 种固定参数,这里可为不同模型设置所支持的各种参数,详见:[Schema](./docs/zh_Hans/schema.md#ParameterRule)。 | |||
| - 供应商/模型凭据鉴权 | |||
| @@ -40,7 +40,7 @@ | |||
|  | |||
| 供应商列表返回了凭据表单的配置信息,可通过 Runtime 提供的接口对凭据进行鉴权,上图 1 为供应商凭据 DEMO,上图 2 为模型凭据 DEMO。 | |||
| 供应商列表返回了凭据表单的配置信息,可通过 Runtime 提供的接口对凭据进行鉴权,上图 1 为供应商凭据 DEMO,上图 2 为模型凭据 DEMO。 | |||
| ## 结构 | |||
| @@ -57,9 +57,10 @@ Model Runtime 分三层: | |||
| 提供获取当前供应商模型列表、获取模型实例、供应商凭据鉴权、供应商配置规则信息,**可横向扩展**以支持不同的供应商。 | |||
| 对于供应商/模型凭据,有两种情况 | |||
| - 如 OpenAI 这类中心化供应商,需要定义如**api_key**这类的鉴权凭据 | |||
| - 如[**Xinference**](https://github.com/xorbitsai/inference)这类本地部署的供应商,需要定义如**server_url**这类的地址凭据,有时候还需要定义**model_uid**之类的模型类型凭据,就像下面这样,当在供应商层定义了这些凭据后,就可以在前端页面上直接展示,无需修改前端逻辑。 | |||
|  | |||
|  | |||
| 当配置好凭据后,就可以通过 DifyRuntime 的外部接口直接获取到对应供应商所需要的**Schema**(凭据表单规则),从而在可以在不修改前端逻辑的情况下,提供新的供应商/模型的支持。 | |||
| @@ -76,14 +77,17 @@ Model Runtime 分三层: | |||
| ## 下一步 | |||
| ### [增加新的供应商配置 👈🏻](./docs/zh_Hans/provider_scale_out.md) | |||
| 当添加后,这里将会出现一个新的供应商 | |||
|  | |||
| ### [为已存在的供应商新增模型 👈🏻](./docs/zh_Hans/provider_scale_out.md#增加模型) | |||
| ### [为已存在的供应商新增模型 👈🏻](./docs/zh_Hans/provider_scale_out.md#%E5%A2%9E%E5%8A%A0%E6%A8%A1%E5%9E%8B) | |||
| 当添加后,对应供应商的模型列表中将会出现一个新的预定义模型供用户选择,如 GPT-3.5 GPT-4 ChatGLM3-6b 等,而对于支持自定义模型的供应商,则不需要新增模型。 | |||
|  | |||
| ### [接口的具体实现 👈🏻](./docs/zh_Hans/interfaces.md) | |||
| 你可以在这里找到你想要查看的接口的具体实现,以及接口的参数和返回值的具体含义。 | |||
| @@ -56,7 +56,6 @@ provider_credential_schema: | |||
| credential_form_schemas: | |||
| ``` | |||
| Then, we need to determine what credentials are required to define a model in Xinference. | |||
| - Since it supports three different types of models, we need to specify the model_type to denote the model type. Here is how we can define it: | |||
| @@ -191,7 +190,6 @@ def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[Pr | |||
| """ | |||
| ``` | |||
| Sometimes, you might not want to return 0 directly. In such cases, you can use `self._get_num_tokens_by_gpt2(text: str)` to get pre-computed tokens and ensure environment variable `PLUGIN_BASED_TOKEN_COUNTING_ENABLED` is set to `true`, This method is provided by the `AIModel` base class, and it uses GPT2's Tokenizer for calculation. However, it should be noted that this is only a substitute and may not be fully accurate. | |||
| - Model Credentials Validation | |||
| @@ -35,12 +35,11 @@ All models need to uniformly implement the following 2 methods: | |||
| Similar to provider credential verification, this step involves verification for an individual model. | |||
| ```python | |||
| def validate_credentials(self, model: str, credentials: dict) -> None: | |||
| """ | |||
| Validate model credentials | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :return: | |||
| @@ -77,12 +76,12 @@ All models need to uniformly implement the following 2 methods: | |||
| The key is the error type thrown to the caller | |||
| The value is the error type thrown by the model, | |||
| which needs to be converted into a unified error type for the caller. | |||
| :return: Invoke error mapping | |||
| """ | |||
| ``` | |||
| You can refer to OpenAI's `_invoke_error_mapping` for an example. | |||
| You can refer to OpenAI's `_invoke_error_mapping` for an example. | |||
| ### LLM | |||
| @@ -92,7 +91,6 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| Implement the core method for LLM invocation, which can support both streaming and synchronous returns. | |||
| ```python | |||
| def _invoke(self, model: str, credentials: dict, | |||
| prompt_messages: list[PromptMessage], model_parameters: dict, | |||
| @@ -101,7 +99,7 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| -> Union[LLMResult, Generator]: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param prompt_messages: prompt messages | |||
| @@ -122,7 +120,7 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. | |||
| - `prompt_messages` (array[[PromptMessage](#PromptMessage)]) List of prompts | |||
| - `prompt_messages` (array\[[PromptMessage](#PromptMessage)\]) List of prompts | |||
| If the model is of the `Completion` type, the list only needs to include one [UserPromptMessage](#UserPromptMessage) element; | |||
| @@ -132,7 +130,7 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| The model parameters are defined by the `parameter_rules` in the model's YAML configuration. | |||
| - `tools` (array[[PromptMessageTool](#PromptMessageTool)]) [optional] List of tools, equivalent to the `function` in `function calling`. | |||
| - `tools` (array\[[PromptMessageTool](#PromptMessageTool)\]) [optional] List of tools, equivalent to the `function` in `function calling`. | |||
| That is, the tool list for tool calling. | |||
| @@ -142,7 +140,7 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| - `stream` (bool) Whether to output in a streaming manner, default is True | |||
| Streaming output returns Generator[[LLMResultChunk](#LLMResultChunk)], non-streaming output returns [LLMResult](#LLMResult). | |||
| Streaming output returns Generator\[[LLMResultChunk](#LLMResultChunk)\], non-streaming output returns [LLMResult](#LLMResult). | |||
| - `user` (string) [optional] Unique identifier of the user | |||
| @@ -150,7 +148,7 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| - Returns | |||
| Streaming output returns Generator[[LLMResultChunk](#LLMResultChunk)], non-streaming output returns [LLMResult](#LLMResult). | |||
| Streaming output returns Generator\[[LLMResultChunk](#LLMResultChunk)\], non-streaming output returns [LLMResult](#LLMResult). | |||
| - Pre-calculating Input Tokens | |||
| @@ -187,7 +185,6 @@ Inherit the `__base.large_language_model.LargeLanguageModel` base class and impl | |||
| When the provider supports adding custom LLMs, this method can be implemented to allow custom models to fetch model schema. The default return null. | |||
| ### TextEmbedding | |||
| Inherit the `__base.text_embedding_model.TextEmbeddingModel` base class and implement the following interfaces: | |||
| @@ -200,7 +197,7 @@ Inherit the `__base.text_embedding_model.TextEmbeddingModel` base class and impl | |||
| -> TextEmbeddingResult: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param texts: texts to embed | |||
| @@ -256,7 +253,7 @@ Inherit the `__base.rerank_model.RerankModel` base class and implement the follo | |||
| -> RerankResult: | |||
| """ | |||
| Invoke rerank model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param query: search query | |||
| @@ -302,7 +299,7 @@ Inherit the `__base.speech2text_model.Speech2TextModel` base class and implement | |||
| def _invoke(self, model: str, credentials: dict, file: IO[bytes], user: Optional[str] = None) -> str: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param file: audio file | |||
| @@ -339,7 +336,7 @@ Inherit the `__base.text2speech_model.Text2SpeechModel` base class and implement | |||
| def _invoke(self, model: str, credentials: dict, content_text: str, streaming: bool, user: Optional[str] = None): | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param content_text: text content to be translated | |||
| @@ -381,7 +378,7 @@ Inherit the `__base.moderation_model.ModerationModel` base class and implement t | |||
| -> bool: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param text: text to moderate | |||
| @@ -408,11 +405,9 @@ Inherit the `__base.moderation_model.ModerationModel` base class and implement t | |||
| False indicates that the input text is safe, True indicates otherwise. | |||
| ## Entities | |||
| ### PromptMessageRole | |||
| ### PromptMessageRole | |||
| Message role | |||
| @@ -583,7 +578,7 @@ class PromptMessageTool(BaseModel): | |||
| parameters: dict | |||
| ``` | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### LLMResult | |||
| @@ -650,7 +645,7 @@ class LLMUsage(ModelUsage): | |||
| latency: float # Request latency (s) | |||
| ``` | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### TextEmbeddingResult | |||
| @@ -680,7 +675,7 @@ class EmbeddingUsage(ModelUsage): | |||
| latency: float # Request latency (s) | |||
| ``` | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### RerankResult | |||
| @@ -153,8 +153,11 @@ Runtime Errors: | |||
| - `InvokeConnectionError` Connection error | |||
| - `InvokeServerUnavailableError` Service provider unavailable | |||
| - `InvokeRateLimitError` Rate limit reached | |||
| - `InvokeAuthorizationError` Authorization failed | |||
| - `InvokeBadRequestError` Parameter error | |||
| ```python | |||
| @@ -63,6 +63,7 @@ You can also refer to the YAML configuration information under other provider di | |||
| ### Implementing Provider Code | |||
| Providers need to inherit the `__base.model_provider.ModelProvider` base class and implement the `validate_provider_credentials` method for unified provider credential verification. For reference, see [AnthropicProvider](https://github.com/langgenius/dify-runtime/blob/main/lib/model_providers/anthropic/anthropic.py). | |||
| > If the provider is the type of `customizable-model`, there is no need to implement the `validate_provider_credentials` method. | |||
| ```python | |||
| @@ -80,7 +81,7 @@ def validate_provider_credentials(self, credentials: dict) -> None: | |||
| Of course, you can also preliminarily reserve the implementation of `validate_provider_credentials` and directly reuse it after the model credential verification method is implemented. | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### Adding Models | |||
| @@ -166,7 +167,7 @@ In `llm.py`, create an Anthropic LLM class, which we name `AnthropicLargeLanguag | |||
| -> Union[LLMResult, Generator]: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param prompt_messages: prompt messages | |||
| @@ -205,7 +206,7 @@ In `llm.py`, create an Anthropic LLM class, which we name `AnthropicLargeLanguag | |||
| def validate_credentials(self, model: str, credentials: dict) -> None: | |||
| """ | |||
| Validate model credentials | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :return: | |||
| @@ -232,7 +233,7 @@ In `llm.py`, create an Anthropic LLM class, which we name `AnthropicLargeLanguag | |||
| The key is the error type thrown to the caller | |||
| The value is the error type thrown by the model, | |||
| which needs to be converted into a unified error type for the caller. | |||
| :return: Invoke error mapping | |||
| """ | |||
| ``` | |||
| @@ -28,8 +28,8 @@ | |||
| - `url` (object) help link, i18n | |||
| - `zh_Hans` (string) [optional] Chinese link | |||
| - `en_US` (string) English link | |||
| - `supported_model_types` (array[[ModelType](#ModelType)]) Supported model types | |||
| - `configurate_methods` (array[[ConfigurateMethod](#ConfigurateMethod)]) Configuration methods | |||
| - `supported_model_types` (array\[[ModelType](#ModelType)\]) Supported model types | |||
| - `configurate_methods` (array\[[ConfigurateMethod](#ConfigurateMethod)\]) Configuration methods | |||
| - `provider_credential_schema` ([ProviderCredentialSchema](#ProviderCredentialSchema)) Provider credential specification | |||
| - `model_credential_schema` ([ModelCredentialSchema](#ModelCredentialSchema)) Model credential specification | |||
| @@ -40,23 +40,23 @@ | |||
| - `zh_Hans` (string) [optional] Chinese label name | |||
| - `en_US` (string) English label name | |||
| - `model_type` ([ModelType](#ModelType)) Model type | |||
| - `features` (array[[ModelFeature](#ModelFeature)]) [optional] Supported feature list | |||
| - `features` (array\[[ModelFeature](#ModelFeature)\]) [optional] Supported feature list | |||
| - `model_properties` (object) Model properties | |||
| - `mode` ([LLMMode](#LLMMode)) Mode (available for model type `llm`) | |||
| - `context_size` (int) Context size (available for model types `llm`, `text-embedding`) | |||
| - `max_chunks` (int) Maximum number of chunks (available for model types `text-embedding`, `moderation`) | |||
| - `file_upload_limit` (int) Maximum file upload limit, in MB (available for model type `speech2text`) | |||
| - `supported_file_extensions` (string) Supported file extension formats, e.g., mp3, mp4 (available for model type `speech2text`) | |||
| - `default_voice` (string) default voice, e.g.:alloy,echo,fable,onyx,nova,shimmer(available for model type `tts`) | |||
| - `voices` (list) List of available voice.(available for model type `tts`) | |||
| - `mode` (string) voice model.(available for model type `tts`) | |||
| - `name` (string) voice model display name.(available for model type `tts`) | |||
| - `language` (string) the voice model supports languages.(available for model type `tts`) | |||
| - `word_limit` (int) Single conversion word limit, paragraph-wise by default(available for model type `tts`) | |||
| - `audio_type` (string) Support audio file extension format, e.g.:mp3,wav(available for model type `tts`) | |||
| - `max_workers` (int) Number of concurrent workers supporting text and audio conversion(available for model type`tts`) | |||
| - `default_voice` (string) default voice, e.g.:alloy,echo,fable,onyx,nova,shimmer(available for model type `tts`) | |||
| - `voices` (list) List of available voice.(available for model type `tts`) | |||
| - `mode` (string) voice model.(available for model type `tts`) | |||
| - `name` (string) voice model display name.(available for model type `tts`) | |||
| - `language` (string) the voice model supports languages.(available for model type `tts`) | |||
| - `word_limit` (int) Single conversion word limit, paragraph-wise by default(available for model type `tts`) | |||
| - `audio_type` (string) Support audio file extension format, e.g.:mp3,wav(available for model type `tts`) | |||
| - `max_workers` (int) Number of concurrent workers supporting text and audio conversion(available for model type`tts`) | |||
| - `max_characters_per_chunk` (int) Maximum characters per chunk (available for model type `moderation`) | |||
| - `parameter_rules` (array[[ParameterRule](#ParameterRule)]) [optional] Model invocation parameter rules | |||
| - `parameter_rules` (array\[[ParameterRule](#ParameterRule)\]) [optional] Model invocation parameter rules | |||
| - `pricing` ([PriceConfig](#PriceConfig)) [optional] Pricing information | |||
| - `deprecated` (bool) Whether deprecated. If deprecated, the model will no longer be displayed in the list, but those already configured can continue to be used. Default False. | |||
| @@ -74,6 +74,7 @@ | |||
| - `predefined-model` Predefined model | |||
| Indicates that users can use the predefined models under the provider by configuring the unified provider credentials. | |||
| - `customizable-model` Customizable model | |||
| Users need to add credential configuration for each model. | |||
| @@ -103,6 +104,7 @@ | |||
| ### ParameterRule | |||
| - `name` (string) Actual model invocation parameter name | |||
| - `use_template` (string) [optional] Using template | |||
| By default, 5 variable content configuration templates are preset: | |||
| @@ -112,7 +114,7 @@ | |||
| - `frequency_penalty` | |||
| - `presence_penalty` | |||
| - `max_tokens` | |||
| In use_template, you can directly set the template variable name, which will use the default configuration in entities.defaults.PARAMETER_RULE_TEMPLATE | |||
| No need to set any parameters other than `name` and `use_template`. If additional configuration parameters are set, they will override the default configuration. | |||
| Refer to `openai/llm/gpt-3.5-turbo.yaml`. | |||
| @@ -155,7 +157,7 @@ | |||
| ### ProviderCredentialSchema | |||
| - `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) Credential form standard | |||
| - `credential_form_schemas` (array\[[CredentialFormSchema](#CredentialFormSchema)\]) Credential form standard | |||
| ### ModelCredentialSchema | |||
| @@ -166,7 +168,7 @@ | |||
| - `placeholder` (object) Model prompt content | |||
| - `en_US`(string) English | |||
| - `zh_Hans`(string) [optional] Chinese | |||
| - `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) Credential form standard | |||
| - `credential_form_schemas` (array\[[CredentialFormSchema](#CredentialFormSchema)\]) Credential form standard | |||
| ### CredentialFormSchema | |||
| @@ -177,12 +179,12 @@ | |||
| - `type` ([FormType](#FormType)) Form item type | |||
| - `required` (bool) Whether required | |||
| - `default`(string) Default value | |||
| - `options` (array[[FormOption](#FormOption)]) Specific property of form items of type `select` or `radio`, defining dropdown content | |||
| - `options` (array\[[FormOption](#FormOption)\]) Specific property of form items of type `select` or `radio`, defining dropdown content | |||
| - `placeholder`(object) Specific property of form items of type `text-input`, placeholder content | |||
| - `en_US`(string) English | |||
| - `zh_Hans` (string) [optional] Chinese | |||
| - `max_length` (int) Specific property of form items of type `text-input`, defining maximum input length, 0 for no limit. | |||
| - `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) Displayed when other form item values meet certain conditions, displayed always if empty. | |||
| - `show_on` (array\[[FormShowOnObject](#FormShowOnObject)\]) Displayed when other form item values meet certain conditions, displayed always if empty. | |||
| ### FormType | |||
| @@ -198,7 +200,7 @@ | |||
| - `en_US`(string) English | |||
| - `zh_Hans`(string) [optional] Chinese | |||
| - `value` (string) Dropdown option value | |||
| - `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) Displayed when other form item values meet certain conditions, displayed always if empty. | |||
| - `show_on` (array\[[FormShowOnObject](#FormShowOnObject)\]) Displayed when other form item values meet certain conditions, displayed always if empty. | |||
| ### FormShowOnObject | |||
| @@ -10,7 +10,6 @@ | |||
|  | |||
| 在前文中,我们已经知道了供应商无需实现`validate_provider_credential`,Runtime 会自行根据用户在此选择的模型类型和模型名称调用对应的模型层的`validate_credentials`来进行验证。 | |||
| ### 编写供应商 yaml | |||
| @@ -55,6 +54,7 @@ provider_credential_schema: | |||
| 随后,我们需要思考在 Xinference 中定义一个模型需要哪些凭据 | |||
| - 它支持三种不同的模型,因此,我们需要有`model_type`来指定这个模型的类型,它有三种类型,所以我们这么编写 | |||
| ```yaml | |||
| provider_credential_schema: | |||
| credential_form_schemas: | |||
| @@ -76,7 +76,9 @@ provider_credential_schema: | |||
| label: | |||
| en_US: Rerank | |||
| ``` | |||
| - 每一个模型都有自己的名称`model_name`,因此需要在这里定义 | |||
| ```yaml | |||
| - variable: model_name | |||
| type: text-input | |||
| @@ -88,7 +90,9 @@ provider_credential_schema: | |||
| zh_Hans: 填写模型名称 | |||
| en_US: Input model name | |||
| ``` | |||
| - 填写 Xinference 本地部署的地址 | |||
| ```yaml | |||
| - variable: server_url | |||
| label: | |||
| @@ -100,7 +104,9 @@ provider_credential_schema: | |||
| zh_Hans: 在此输入 Xinference 的服务器地址,如 https://example.com/xxx | |||
| en_US: Enter the url of your Xinference, for example https://example.com/xxx | |||
| ``` | |||
| - 每个模型都有唯一的 model_uid,因此需要在这里定义 | |||
| ```yaml | |||
| - variable: model_uid | |||
| label: | |||
| @@ -112,6 +118,7 @@ provider_credential_schema: | |||
| zh_Hans: 在此输入您的 Model UID | |||
| en_US: Enter the model uid | |||
| ``` | |||
| 现在,我们就完成了供应商的基础定义。 | |||
| ### 编写模型代码 | |||
| @@ -132,7 +139,7 @@ provider_credential_schema: | |||
| -> Union[LLMResult, Generator]: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param prompt_messages: prompt messages | |||
| @@ -189,7 +196,7 @@ provider_credential_schema: | |||
| def validate_credentials(self, model: str, credentials: dict) -> None: | |||
| """ | |||
| Validate model credentials | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :return: | |||
| @@ -197,78 +204,78 @@ provider_credential_schema: | |||
| ``` | |||
| - 模型参数 Schema | |||
| 与自定义类型不同,由于没有在 yaml 文件中定义一个模型支持哪些参数,因此,我们需要动态时间模型参数的 Schema。 | |||
| 如 Xinference 支持`max_tokens` `temperature` `top_p` 这三个模型参数。 | |||
| 但是有的供应商根据不同的模型支持不同的参数,如供应商`OpenLLM`支持`top_k`,但是并不是这个供应商提供的所有模型都支持`top_k`,我们这里举例 A 模型支持`top_k`,B 模型不支持`top_k`,那么我们需要在这里动态生成模型参数的 Schema,如下所示: | |||
| ```python | |||
| def get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: | |||
| """ | |||
| used to define customizable model schema | |||
| """ | |||
| rules = [ | |||
| ParameterRule( | |||
| name='temperature', type=ParameterType.FLOAT, | |||
| use_template='temperature', | |||
| label=I18nObject( | |||
| zh_Hans='温度', en_US='Temperature' | |||
| ) | |||
| ), | |||
| ParameterRule( | |||
| name='top_p', type=ParameterType.FLOAT, | |||
| use_template='top_p', | |||
| label=I18nObject( | |||
| zh_Hans='Top P', en_US='Top P' | |||
| ) | |||
| ), | |||
| ParameterRule( | |||
| name='max_tokens', type=ParameterType.INT, | |||
| use_template='max_tokens', | |||
| min=1, | |||
| default=512, | |||
| label=I18nObject( | |||
| zh_Hans='最大生成长度', en_US='Max Tokens' | |||
| ) | |||
| ) | |||
| ] | |||
| # if model is A, add top_k to rules | |||
| if model == 'A': | |||
| rules.append( | |||
| ParameterRule( | |||
| name='top_k', type=ParameterType.INT, | |||
| use_template='top_k', | |||
| min=1, | |||
| default=50, | |||
| label=I18nObject( | |||
| zh_Hans='Top K', en_US='Top K' | |||
| ) | |||
| ) | |||
| ) | |||
| """ | |||
| some NOT IMPORTANT code here | |||
| """ | |||
| entity = AIModelEntity( | |||
| model=model, | |||
| label=I18nObject( | |||
| en_US=model | |||
| ), | |||
| fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, | |||
| model_type=model_type, | |||
| model_properties={ | |||
| ModelPropertyKey.MODE: ModelType.LLM, | |||
| }, | |||
| parameter_rules=rules | |||
| ) | |||
| return entity | |||
| ``` | |||
| ```python | |||
| def get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: | |||
| """ | |||
| used to define customizable model schema | |||
| """ | |||
| rules = [ | |||
| ParameterRule( | |||
| name='temperature', type=ParameterType.FLOAT, | |||
| use_template='temperature', | |||
| label=I18nObject( | |||
| zh_Hans='温度', en_US='Temperature' | |||
| ) | |||
| ), | |||
| ParameterRule( | |||
| name='top_p', type=ParameterType.FLOAT, | |||
| use_template='top_p', | |||
| label=I18nObject( | |||
| zh_Hans='Top P', en_US='Top P' | |||
| ) | |||
| ), | |||
| ParameterRule( | |||
| name='max_tokens', type=ParameterType.INT, | |||
| use_template='max_tokens', | |||
| min=1, | |||
| default=512, | |||
| label=I18nObject( | |||
| zh_Hans='最大生成长度', en_US='Max Tokens' | |||
| ) | |||
| ) | |||
| ] | |||
| # if model is A, add top_k to rules | |||
| if model == 'A': | |||
| rules.append( | |||
| ParameterRule( | |||
| name='top_k', type=ParameterType.INT, | |||
| use_template='top_k', | |||
| min=1, | |||
| default=50, | |||
| label=I18nObject( | |||
| zh_Hans='Top K', en_US='Top K' | |||
| ) | |||
| ) | |||
| ) | |||
| """ | |||
| some NOT IMPORTANT code here | |||
| """ | |||
| entity = AIModelEntity( | |||
| model=model, | |||
| label=I18nObject( | |||
| en_US=model | |||
| ), | |||
| fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, | |||
| model_type=model_type, | |||
| model_properties={ | |||
| ModelPropertyKey.MODE: ModelType.LLM, | |||
| }, | |||
| parameter_rules=rules | |||
| ) | |||
| return entity | |||
| ``` | |||
| - 调用异常错误映射表 | |||
| 当模型调用异常时需要映射到 Runtime 指定的 `InvokeError` 类型,方便 Dify 针对不同错误做不同后续处理。 | |||
| @@ -278,7 +285,7 @@ provider_credential_schema: | |||
| - `InvokeConnectionError` 调用连接错误 | |||
| - `InvokeServerUnavailableError ` 调用服务方不可用 | |||
| - `InvokeRateLimitError ` 调用达到限额 | |||
| - `InvokeAuthorizationError` 调用鉴权失败 | |||
| - `InvokeAuthorizationError` 调用鉴权失败 | |||
| - `InvokeBadRequestError ` 调用传参有误 | |||
| ```python | |||
| @@ -289,7 +296,7 @@ provider_credential_schema: | |||
| The key is the error type thrown to the caller | |||
| The value is the error type thrown by the model, | |||
| which needs to be converted into a unified error type for the caller. | |||
| :return: Invoke error mapping | |||
| """ | |||
| ``` | |||
| @@ -49,7 +49,7 @@ class XinferenceProvider(Provider): | |||
| def validate_credentials(self, model: str, credentials: dict) -> None: | |||
| """ | |||
| Validate model credentials | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :return: | |||
| @@ -75,7 +75,7 @@ class XinferenceProvider(Provider): | |||
| - `InvokeConnectionError` 调用连接错误 | |||
| - `InvokeServerUnavailableError ` 调用服务方不可用 | |||
| - `InvokeRateLimitError ` 调用达到限额 | |||
| - `InvokeAuthorizationError` 调用鉴权失败 | |||
| - `InvokeAuthorizationError` 调用鉴权失败 | |||
| - `InvokeBadRequestError ` 调用传参有误 | |||
| ```python | |||
| @@ -86,36 +86,36 @@ class XinferenceProvider(Provider): | |||
| The key is the error type thrown to the caller | |||
| The value is the error type thrown by the model, | |||
| which needs to be converted into a unified error type for the caller. | |||
| :return: Invoke error mapping | |||
| """ | |||
| ``` | |||
| 也可以直接抛出对应 Errors,并做如下定义,这样在之后的调用中可以直接抛出`InvokeConnectionError`等异常。 | |||
| ```python | |||
| @property | |||
| def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: | |||
| return { | |||
| InvokeConnectionError: [ | |||
| InvokeConnectionError | |||
| ], | |||
| InvokeServerUnavailableError: [ | |||
| InvokeServerUnavailableError | |||
| ], | |||
| InvokeRateLimitError: [ | |||
| InvokeRateLimitError | |||
| ], | |||
| InvokeAuthorizationError: [ | |||
| InvokeAuthorizationError | |||
| ], | |||
| InvokeBadRequestError: [ | |||
| InvokeBadRequestError | |||
| ], | |||
| } | |||
| ``` | |||
| 可参考 OpenAI `_invoke_error_mapping`。 | |||
| ```python | |||
| @property | |||
| def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: | |||
| return { | |||
| InvokeConnectionError: [ | |||
| InvokeConnectionError | |||
| ], | |||
| InvokeServerUnavailableError: [ | |||
| InvokeServerUnavailableError | |||
| ], | |||
| InvokeRateLimitError: [ | |||
| InvokeRateLimitError | |||
| ], | |||
| InvokeAuthorizationError: [ | |||
| InvokeAuthorizationError | |||
| ], | |||
| InvokeBadRequestError: [ | |||
| InvokeBadRequestError | |||
| ], | |||
| } | |||
| ``` | |||
| 可参考 OpenAI `_invoke_error_mapping`。 | |||
| ### LLM | |||
| @@ -133,7 +133,7 @@ class XinferenceProvider(Provider): | |||
| -> Union[LLMResult, Generator]: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param prompt_messages: prompt messages | |||
| @@ -151,38 +151,38 @@ class XinferenceProvider(Provider): | |||
| - `model` (string) 模型名称 | |||
| - `credentials` (object) 凭据信息 | |||
| 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 | |||
| - `prompt_messages` (array[[PromptMessage](#PromptMessage)]) Prompt 列表 | |||
| - `prompt_messages` (array\[[PromptMessage](#PromptMessage)\]) Prompt 列表 | |||
| 若模型为 `Completion` 类型,则列表只需要传入一个 [UserPromptMessage](#UserPromptMessage) 元素即可; | |||
| 若模型为 `Chat` 类型,需要根据消息不同传入 [SystemPromptMessage](#SystemPromptMessage), [UserPromptMessage](#UserPromptMessage), [AssistantPromptMessage](#AssistantPromptMessage), [ToolPromptMessage](#ToolPromptMessage) 元素列表 | |||
| - `model_parameters` (object) 模型参数 | |||
| 模型参数由模型 YAML 配置的 `parameter_rules` 定义。 | |||
| - `tools` (array[[PromptMessageTool](#PromptMessageTool)]) [optional] 工具列表,等同于 `function calling` 中的 `function`。 | |||
| - `tools` (array\[[PromptMessageTool](#PromptMessageTool)\]) [optional] 工具列表,等同于 `function calling` 中的 `function`。 | |||
| 即传入 tool calling 的工具列表。 | |||
| - `stop` (array[string]) [optional] 停止序列 | |||
| 模型返回将在停止序列定义的字符串之前停止输出。 | |||
| - `stream` (bool) 是否流式输出,默认 True | |||
| 流式输出返回 Generator[[LLMResultChunk](#LLMResultChunk)],非流式输出返回 [LLMResult](#LLMResult)。 | |||
| 流式输出返回 Generator\[[LLMResultChunk](#LLMResultChunk)\],非流式输出返回 [LLMResult](#LLMResult)。 | |||
| - `user` (string) [optional] 用户的唯一标识符 | |||
| 可以帮助供应商监控和检测滥用行为。 | |||
| - 返回 | |||
| 流式输出返回 Generator[[LLMResultChunk](#LLMResultChunk)],非流式输出返回 [LLMResult](#LLMResult)。 | |||
| 流式输出返回 Generator\[[LLMResultChunk](#LLMResultChunk)\],非流式输出返回 [LLMResult](#LLMResult)。 | |||
| - 预计算输入 tokens | |||
| @@ -236,7 +236,7 @@ class XinferenceProvider(Provider): | |||
| -> TextEmbeddingResult: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param texts: texts to embed | |||
| @@ -294,7 +294,7 @@ class XinferenceProvider(Provider): | |||
| -> RerankResult: | |||
| """ | |||
| Invoke rerank model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param query: search query | |||
| @@ -342,7 +342,7 @@ class XinferenceProvider(Provider): | |||
| -> str: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param file: audio file | |||
| @@ -379,7 +379,7 @@ class XinferenceProvider(Provider): | |||
| def _invoke(self, model: str, credentials: dict, content_text: str, streaming: bool, user: Optional[str] = None): | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param content_text: text content to be translated | |||
| @@ -421,7 +421,7 @@ class XinferenceProvider(Provider): | |||
| -> bool: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param text: text to moderate | |||
| @@ -448,11 +448,9 @@ class XinferenceProvider(Provider): | |||
| False 代表传入的文本安全,True 则反之。 | |||
| ## 实体 | |||
| ### PromptMessageRole | |||
| ### PromptMessageRole | |||
| 消息角色 | |||
| @@ -623,7 +621,7 @@ class PromptMessageTool(BaseModel): | |||
| parameters: dict # 工具参数 dict | |||
| ``` | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### LLMResult | |||
| @@ -690,7 +688,7 @@ class LLMUsage(ModelUsage): | |||
| latency: float # 请求耗时 (s) | |||
| ``` | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### TextEmbeddingResult | |||
| @@ -720,7 +718,7 @@ class EmbeddingUsage(ModelUsage): | |||
| latency: float # 请求耗时 (s) | |||
| ``` | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### RerankResult | |||
| @@ -62,7 +62,7 @@ pricing: # 价格信息 | |||
| 建议将所有模型配置都准备完毕后再开始模型代码的实现。 | |||
| 同样,也可以参考 `model_providers` 目录下其他供应商对应模型类型目录下的 YAML 配置信息,完整的 YAML 规则见:[Schema](schema.md#aimodelentity)。 | |||
| 同样,也可以参考 `model_providers` 目录下其他供应商对应模型类型目录下的 YAML 配置信息,完整的 YAML 规则见:[Schema](schema.md#aimodelentity)。 | |||
| ### 实现模型调用代码 | |||
| @@ -82,7 +82,7 @@ pricing: # 价格信息 | |||
| -> Union[LLMResult, Generator]: | |||
| """ | |||
| Invoke large language model | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :param prompt_messages: prompt messages | |||
| @@ -137,7 +137,7 @@ pricing: # 价格信息 | |||
| def validate_credentials(self, model: str, credentials: dict) -> None: | |||
| """ | |||
| Validate model credentials | |||
| :param model: model name | |||
| :param credentials: model credentials | |||
| :return: | |||
| @@ -153,7 +153,7 @@ pricing: # 价格信息 | |||
| - `InvokeConnectionError` 调用连接错误 | |||
| - `InvokeServerUnavailableError ` 调用服务方不可用 | |||
| - `InvokeRateLimitError ` 调用达到限额 | |||
| - `InvokeAuthorizationError` 调用鉴权失败 | |||
| - `InvokeAuthorizationError` 调用鉴权失败 | |||
| - `InvokeBadRequestError ` 调用传参有误 | |||
| ```python | |||
| @@ -164,7 +164,7 @@ pricing: # 价格信息 | |||
| The key is the error type thrown to the caller | |||
| The value is the error type thrown by the model, | |||
| which needs to be converted into a unified error type for the caller. | |||
| :return: Invoke error mapping | |||
| """ | |||
| ``` | |||
| @@ -5,7 +5,7 @@ | |||
| - `predefined-model ` 预定义模型 | |||
| 表示用户只需要配置统一的供应商凭据即可使用供应商下的预定义模型。 | |||
| - `customizable-model` 自定义模型 | |||
| 用户需要新增每个模型的凭据配置,如 Xinference,它同时支持 LLM 和 Text Embedding,但是每个模型都有唯一的**model_uid**,如果想要将两者同时接入,就需要为每个模型配置一个**model_uid**。 | |||
| @@ -23,9 +23,11 @@ | |||
| ### 介绍 | |||
| #### 名词解释 | |||
| - `module`: 一个`module`即为一个 Python Package,或者通俗一点,称为一个文件夹,里面包含了一个`__init__.py`文件,以及其他的`.py`文件。 | |||
| - `module`: 一个`module`即为一个 Python Package,或者通俗一点,称为一个文件夹,里面包含了一个`__init__.py`文件,以及其他的`.py`文件。 | |||
| #### 步骤 | |||
| 新增一个供应商主要分为几步,这里简单列出,帮助大家有一个大概的认识,具体的步骤会在下面详细介绍。 | |||
| - 创建供应商 yaml 文件,根据[ProviderSchema](./schema.md#provider)编写 | |||
| @@ -117,7 +119,7 @@ model_credential_schema: | |||
| en_US: Enter your API Base | |||
| ``` | |||
| 也可以参考 `model_providers` 目录下其他供应商目录下的 YAML 配置信息,完整的 YAML 规则见:[Schema](schema.md#provider)。 | |||
| 也可以参考 `model_providers` 目录下其他供应商目录下的 YAML 配置信息,完整的 YAML 规则见:[Schema](schema.md#provider)。 | |||
| #### 实现供应商代码 | |||
| @@ -155,12 +157,14 @@ def validate_provider_credentials(self, credentials: dict) -> None: | |||
| #### 增加模型 | |||
| #### [增加预定义模型 👈🏻](./predefined_model_scale_out.md) | |||
| 对于预定义模型,我们可以通过简单定义一个 yaml,并通过实现调用代码来接入。 | |||
| #### [增加自定义模型 👈🏻](./customizable_model_scale_out.md) | |||
| 对于自定义模型,我们只需要实现调用代码即可接入,但是它需要处理的参数可能会更加复杂。 | |||
| --- | |||
| ______________________________________________________________________ | |||
| ### 测试 | |||
| @@ -16,9 +16,9 @@ | |||
| - `zh_Hans` (string) [optional] 中文描述 | |||
| - `en_US` (string) 英文描述 | |||
| - `icon_small` (string) [optional] 供应商小 ICON,存储在对应供应商实现目录下的 `_assets` 目录,中英文策略同 `label` | |||
| - `zh_Hans` (string) [optional] 中文 ICON | |||
| - `zh_Hans` (string) [optional] 中文 ICON | |||
| - `en_US` (string) 英文 ICON | |||
| - `icon_large` (string) [optional] 供应商大 ICON,存储在对应供应商实现目录下的 _assets 目录,中英文策略同 label | |||
| - `icon_large` (string) [optional] 供应商大 ICON,存储在对应供应商实现目录下的 \_assets 目录,中英文策略同 label | |||
| - `zh_Hans `(string) [optional] 中文 ICON | |||
| - `en_US` (string) 英文 ICON | |||
| - `background` (string) [optional] 背景颜色色值,例:#FFFFFF,为空则展示前端默认色值。 | |||
| @@ -29,8 +29,8 @@ | |||
| - `url` (object) 帮助链接,i18n | |||
| - `zh_Hans` (string) [optional] 中文链接 | |||
| - `en_US` (string) 英文链接 | |||
| - `supported_model_types` (array[[ModelType](#ModelType)]) 支持的模型类型 | |||
| - `configurate_methods` (array[[ConfigurateMethod](#ConfigurateMethod)]) 配置方式 | |||
| - `supported_model_types` (array\[[ModelType](#ModelType)\]) 支持的模型类型 | |||
| - `configurate_methods` (array\[[ConfigurateMethod](#ConfigurateMethod)\]) 配置方式 | |||
| - `provider_credential_schema` ([ProviderCredentialSchema](#ProviderCredentialSchema)) 供应商凭据规格 | |||
| - `model_credential_schema` ([ModelCredentialSchema](#ModelCredentialSchema)) 模型凭据规格 | |||
| @@ -41,23 +41,23 @@ | |||
| - `zh_Hans `(string) [optional] 中文标签名 | |||
| - `en_US` (string) 英文标签名 | |||
| - `model_type` ([ModelType](#ModelType)) 模型类型 | |||
| - `features` (array[[ModelFeature](#ModelFeature)]) [optional] 支持功能列表 | |||
| - `features` (array\[[ModelFeature](#ModelFeature)\]) [optional] 支持功能列表 | |||
| - `model_properties` (object) 模型属性 | |||
| - `mode` ([LLMMode](#LLMMode)) 模式 (模型类型 `llm` 可用) | |||
| - `context_size` (int) 上下文大小 (模型类型 `llm` `text-embedding` 可用) | |||
| - `max_chunks` (int) 最大分块数量 (模型类型 `text-embedding ` `moderation` 可用) | |||
| - `file_upload_limit` (int) 文件最大上传限制,单位:MB。(模型类型 `speech2text` 可用) | |||
| - `supported_file_extensions` (string) 支持文件扩展格式,如:mp3,mp4(模型类型 `speech2text` 可用) | |||
| - `default_voice` (string) 缺省音色,必选:alloy,echo,fable,onyx,nova,shimmer(模型类型 `tts` 可用) | |||
| - `voices` (list) 可选音色列表。 | |||
| - `mode` (string) 音色模型。(模型类型 `tts` 可用) | |||
| - `name` (string) 音色模型显示名称。(模型类型 `tts` 可用) | |||
| - `language` (string) 音色模型支持语言。(模型类型 `tts` 可用) | |||
| - `word_limit` (int) 单次转换字数限制,默认按段落分段(模型类型 `tts` 可用) | |||
| - `audio_type` (string) 支持音频文件扩展格式,如:mp3,wav(模型类型 `tts` 可用) | |||
| - `max_workers` (int) 支持文字音频转换并发任务数(模型类型 `tts` 可用) | |||
| - `max_characters_per_chunk` (int) 每块最大字符数 (模型类型 `moderation` 可用) | |||
| - `parameter_rules` (array[[ParameterRule](#ParameterRule)]) [optional] 模型调用参数规则 | |||
| - `supported_file_extensions` (string) 支持文件扩展格式,如:mp3,mp4(模型类型 `speech2text` 可用) | |||
| - `default_voice` (string) 缺省音色,必选:alloy,echo,fable,onyx,nova,shimmer(模型类型 `tts` 可用) | |||
| - `voices` (list) 可选音色列表。 | |||
| - `mode` (string) 音色模型。(模型类型 `tts` 可用) | |||
| - `name` (string) 音色模型显示名称。(模型类型 `tts` 可用) | |||
| - `language` (string) 音色模型支持语言。(模型类型 `tts` 可用) | |||
| - `word_limit` (int) 单次转换字数限制,默认按段落分段(模型类型 `tts` 可用) | |||
| - `audio_type` (string) 支持音频文件扩展格式,如:mp3,wav(模型类型 `tts` 可用) | |||
| - `max_workers` (int) 支持文字音频转换并发任务数(模型类型 `tts` 可用) | |||
| - `max_characters_per_chunk` (int) 每块最大字符数 (模型类型 `moderation` 可用) | |||
| - `parameter_rules` (array\[[ParameterRule](#ParameterRule)\]) [optional] 模型调用参数规则 | |||
| - `pricing` ([PriceConfig](#PriceConfig)) [optional] 价格信息 | |||
| - `deprecated` (bool) 是否废弃。若废弃,模型列表将不再展示,但已经配置的可以继续使用,默认 False。 | |||
| @@ -75,6 +75,7 @@ | |||
| - `predefined-model ` 预定义模型 | |||
| 表示用户只需要配置统一的供应商凭据即可使用供应商下的预定义模型。 | |||
| - `customizable-model` 自定义模型 | |||
| 用户需要新增每个模型的凭据配置。 | |||
| @@ -106,7 +107,7 @@ | |||
| - `name` (string) 调用模型实际参数名 | |||
| - `use_template` (string) [optional] 使用模板 | |||
| 默认预置了 5 种变量内容配置模板: | |||
| - `temperature` | |||
| @@ -114,7 +115,7 @@ | |||
| - `frequency_penalty` | |||
| - `presence_penalty` | |||
| - `max_tokens` | |||
| 可在 use_template 中直接设置模板变量名,将会使用 entities.defaults.PARAMETER_RULE_TEMPLATE 中的默认配置 | |||
| 不用设置除 `name` 和 `use_template` 之外的所有参数,若设置了额外的配置参数,将覆盖默认配置。 | |||
| 可参考 `openai/llm/gpt-3.5-turbo.yaml`。 | |||
| @@ -157,7 +158,7 @@ | |||
| ### ProviderCredentialSchema | |||
| - `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) 凭据表单规范 | |||
| - `credential_form_schemas` (array\[[CredentialFormSchema](#CredentialFormSchema)\]) 凭据表单规范 | |||
| ### ModelCredentialSchema | |||
| @@ -168,7 +169,7 @@ | |||
| - `placeholder` (object) 模型提示内容 | |||
| - `en_US`(string) 英文 | |||
| - `zh_Hans`(string) [optional] 中文 | |||
| - `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) 凭据表单规范 | |||
| - `credential_form_schemas` (array\[[CredentialFormSchema](#CredentialFormSchema)\]) 凭据表单规范 | |||
| ### CredentialFormSchema | |||
| @@ -179,12 +180,12 @@ | |||
| - `type` ([FormType](#FormType)) 表单项类型 | |||
| - `required` (bool) 是否必填 | |||
| - `default`(string) 默认值 | |||
| - `options` (array[[FormOption](#FormOption)]) 表单项为 `select` 或 `radio` 专有属性,定义下拉内容 | |||
| - `options` (array\[[FormOption](#FormOption)\]) 表单项为 `select` 或 `radio` 专有属性,定义下拉内容 | |||
| - `placeholder`(object) 表单项为 `text-input `专有属性,表单项 PlaceHolder | |||
| - `en_US`(string) 英文 | |||
| - `zh_Hans` (string) [optional] 中文 | |||
| - `max_length` (int) 表单项为`text-input`专有属性,定义输入最大长度,0 为不限制。 | |||
| - `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) 当其他表单项值符合条件时显示,为空则始终显示。 | |||
| - `show_on` (array\[[FormShowOnObject](#FormShowOnObject)\]) 当其他表单项值符合条件时显示,为空则始终显示。 | |||
| ### FormType | |||
| @@ -200,7 +201,7 @@ | |||
| - `en_US`(string) 英文 | |||
| - `zh_Hans`(string) [optional] 中文 | |||
| - `value` (string) 下拉选项值 | |||
| - `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) 当其他表单项值符合条件时显示,为空则始终显示。 | |||
| - `show_on` (array\[[FormShowOnObject](#FormShowOnObject)\]) 当其他表单项值符合条件时显示,为空则始终显示。 | |||
| ### FormShowOnObject | |||
| @@ -98,14 +98,19 @@ class AnalyticdbVectorBySql: | |||
| try: | |||
| cur.execute(f"CREATE DATABASE {self.databaseName}") | |||
| except Exception as e: | |||
| if "already exists" in str(e): | |||
| return | |||
| raise e | |||
| if "already exists" not in str(e): | |||
| raise e | |||
| finally: | |||
| cur.close() | |||
| conn.close() | |||
| self.pool = self._create_connection_pool() | |||
| with self._get_cursor() as cur: | |||
| try: | |||
| cur.execute("CREATE EXTENSION IF NOT EXISTS zhparser;") | |||
| except Exception as e: | |||
| raise RuntimeError( | |||
| "Failed to create zhparser extension. Please ensure it is available in your AnalyticDB." | |||
| ) from e | |||
| try: | |||
| cur.execute("CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser)") | |||
| cur.execute("ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR n,v,a,i,e,l,x WITH simple") | |||
| @@ -92,17 +92,21 @@ Clickzetta supports advanced full-text search with multiple analyzers: | |||
| ### Analyzer Types | |||
| 1. **keyword**: No tokenization, treats the entire string as a single token | |||
| - Best for: Exact matching, IDs, codes | |||
| 2. **english**: Designed for English text | |||
| 1. **english**: Designed for English text | |||
| - Features: Recognizes ASCII letters and numbers, converts to lowercase | |||
| - Best for: English content | |||
| 3. **chinese**: Chinese text tokenizer | |||
| 1. **chinese**: Chinese text tokenizer | |||
| - Features: Recognizes Chinese and English characters, removes punctuation | |||
| - Best for: Chinese or mixed Chinese-English content | |||
| 4. **unicode**: Multi-language tokenizer based on Unicode | |||
| 1. **unicode**: Multi-language tokenizer based on Unicode | |||
| - Features: Recognizes text boundaries in multiple languages | |||
| - Best for: Multi-language content | |||
| @@ -124,21 +128,25 @@ Clickzetta supports advanced full-text search with multiple analyzers: | |||
| ### Vector Search | |||
| 1. **Adjust exploration factor** for accuracy vs speed trade-off: | |||
| ```sql | |||
| SET cz.vector.index.search.ef=64; | |||
| ``` | |||
| 2. **Use appropriate distance functions**: | |||
| 1. **Use appropriate distance functions**: | |||
| - `cosine_distance`: Best for normalized embeddings (e.g., from language models) | |||
| - `l2_distance`: Best for raw feature vectors | |||
| ### Full-Text Search | |||
| 1. **Choose the right analyzer**: | |||
| - Use `keyword` for exact matching | |||
| - Use language-specific analyzers for better tokenization | |||
| 2. **Combine with vector search**: | |||
| 1. **Combine with vector search**: | |||
| - Pre-filter with full-text search for better performance | |||
| - Use hybrid search for improved relevance | |||
| @@ -147,27 +155,30 @@ Clickzetta supports advanced full-text search with multiple analyzers: | |||
| ### Connection Issues | |||
| 1. Verify all 7 required configuration parameters are set | |||
| 2. Check network connectivity to Clickzetta service | |||
| 3. Ensure the user has proper permissions on the schema | |||
| 1. Check network connectivity to Clickzetta service | |||
| 1. Ensure the user has proper permissions on the schema | |||
| ### Search Performance | |||
| 1. Verify vector index exists: | |||
| ```sql | |||
| SHOW INDEX FROM <schema>.<table_name>; | |||
| ``` | |||
| 2. Check if vector index is being used: | |||
| 1. Check if vector index is being used: | |||
| ```sql | |||
| EXPLAIN SELECT ... WHERE l2_distance(...) < threshold; | |||
| ``` | |||
| Look for `vector_index_search_type` in the execution plan. | |||
| ### Full-Text Search Not Working | |||
| 1. Verify inverted index is created | |||
| 2. Check analyzer configuration matches your content language | |||
| 3. Use `TOKENIZE()` function to test tokenization: | |||
| 1. Check analyzer configuration matches your content language | |||
| 1. Use `TOKENIZE()` function to test tokenization: | |||
| ```sql | |||
| SELECT TOKENIZE('your text', map('analyzer', 'chinese', 'mode', 'smart')); | |||
| ``` | |||
| @@ -175,13 +186,13 @@ Clickzetta supports advanced full-text search with multiple analyzers: | |||
| ## Limitations | |||
| 1. Vector operations don't support `ORDER BY` or `GROUP BY` directly on vector columns | |||
| 2. Full-text search relevance scores are not provided by Clickzetta | |||
| 3. Inverted index creation may fail for very large existing tables (continue without error) | |||
| 4. Index naming constraints: | |||
| 1. Full-text search relevance scores are not provided by Clickzetta | |||
| 1. Inverted index creation may fail for very large existing tables (continue without error) | |||
| 1. Index naming constraints: | |||
| - Index names must be unique within a schema | |||
| - Only one vector index can be created per column | |||
| - The implementation uses timestamps to ensure unique index names | |||
| 5. A column can only have one vector index at a time | |||
| 1. A column can only have one vector index at a time | |||
| ## References | |||
| @@ -81,14 +81,11 @@ class ApiTool(Tool): | |||
| return ToolProviderType.API | |||
| def assembling_request(self, parameters: dict[str, Any]) -> dict[str, Any]: | |||
| headers = {} | |||
| if self.runtime is None: | |||
| raise ToolProviderCredentialValidationError("runtime not initialized") | |||
| headers = {} | |||
| if self.runtime is None: | |||
| raise ValueError("runtime is required") | |||
| credentials = self.runtime.credentials or {} | |||
| if "auth_type" not in credentials: | |||
| raise ToolProviderCredentialValidationError("Missing auth_type") | |||
| @@ -62,7 +62,7 @@ class ToolProviderApiEntity(BaseModel): | |||
| parameter.pop("input_schema", None) | |||
| # ------------- | |||
| optional_fields = self.optional_field("server_url", self.server_url) | |||
| if self.type == ToolProviderType.MCP.value: | |||
| if self.type == ToolProviderType.MCP: | |||
| optional_fields.update(self.optional_field("updated_at", self.updated_at)) | |||
| optional_fields.update(self.optional_field("server_identifier", self.server_identifier)) | |||
| return { | |||
| @@ -959,7 +959,7 @@ class ToolManager: | |||
| elif provider_type == ToolProviderType.WORKFLOW: | |||
| return cls.generate_workflow_tool_icon_url(tenant_id, provider_id) | |||
| elif provider_type == ToolProviderType.PLUGIN: | |||
| provider = ToolManager.get_builtin_provider(provider_id, tenant_id) | |||
| provider = ToolManager.get_plugin_provider(provider_id, tenant_id) | |||
| if isinstance(provider, PluginToolProviderController): | |||
| try: | |||
| return cls.generate_plugin_tool_icon_url(tenant_id, provider.entity.identity.icon) | |||
| @@ -1,17 +0,0 @@ | |||
| import re | |||
| def get_image_upload_file_ids(content): | |||
| pattern = r"!\[image\]\((http?://.*?(file-preview|image-preview))\)" | |||
| matches = re.findall(pattern, content) | |||
| image_upload_file_ids = [] | |||
| for match in matches: | |||
| if match[1] == "file-preview": | |||
| content_pattern = r"files/([^/]+)/file-preview" | |||
| else: | |||
| content_pattern = r"files/([^/]+)/image-preview" | |||
| content_match = re.search(content_pattern, match[0]) | |||
| if content_match: | |||
| image_upload_file_id = content_match.group(1) | |||
| image_upload_file_ids.append(image_upload_file_id) | |||
| return image_upload_file_ids | |||
| @@ -80,14 +80,14 @@ def get_url(url: str, user_agent: Optional[str] = None) -> str: | |||
| else: | |||
| content = response.text | |||
| article = extract_using_readabilipy(content) | |||
| article = extract_using_readability(content) | |||
| if not article.text: | |||
| return "" | |||
| res = FULL_TEMPLATE.format( | |||
| title=article.title, | |||
| author=article.auther, | |||
| author=article.author, | |||
| text=article.text, | |||
| ) | |||
| @@ -97,15 +97,15 @@ def get_url(url: str, user_agent: Optional[str] = None) -> str: | |||
| @dataclass | |||
| class Article: | |||
| title: str | |||
| auther: str | |||
| author: str | |||
| text: Sequence[dict] | |||
| def extract_using_readabilipy(html: str): | |||
| def extract_using_readability(html: str): | |||
| json_article: dict[str, Any] = simple_json_from_html_string(html, use_readability=True) | |||
| article = Article( | |||
| title=json_article.get("title") or "", | |||
| auther=json_article.get("byline") or "", | |||
| author=json_article.get("byline") or "", | |||
| text=json_article.get("plain_text") or [], | |||
| ) | |||
| @@ -113,7 +113,7 @@ def extract_using_readabilipy(html: str): | |||
| def get_image_upload_file_ids(content): | |||
| pattern = r"!\[image\]\((http?://.*?(file-preview|image-preview))\)" | |||
| pattern = r"!\[image\]\((https?://.*?(file-preview|image-preview))\)" | |||
| matches = re.findall(pattern, content) | |||
| image_upload_file_ids = [] | |||
| for match in matches: | |||
| @@ -203,9 +203,6 @@ class WorkflowToolProviderController(ToolProviderController): | |||
| raise ValueError("app not found") | |||
| app = db_providers.app | |||
| if not app: | |||
| raise ValueError("can not read app of workflow") | |||
| self.tools = [self._get_db_provider_tool(db_providers, app)] | |||
| return self.tools | |||
| @@ -123,7 +123,7 @@ class BillingService: | |||
| return BillingService._send_request("GET", "/education/verify", params=params) | |||
| @classmethod | |||
| def is_active(cls, account_id: str): | |||
| def status(cls, account_id: str): | |||
| params = {"account_id": account_id} | |||
| return BillingService._send_request("GET", "/education/status", params=params) | |||
| @@ -294,6 +294,11 @@ class DatasetService: | |||
| dataset: Optional[Dataset] = db.session.query(Dataset).filter_by(id=dataset_id).first() | |||
| return dataset | |||
| @staticmethod | |||
| def check_doc_form(dataset: Dataset, doc_form: str): | |||
| if dataset.doc_form and doc_form != dataset.doc_form: | |||
| raise ValueError("doc_form is different from the dataset doc_form.") | |||
| @staticmethod | |||
| def check_dataset_model_setting(dataset): | |||
| if dataset.indexing_technique == "high_quality": | |||
| @@ -1265,6 +1270,8 @@ class DocumentService: | |||
| dataset_process_rule: Optional[DatasetProcessRule] = None, | |||
| created_from: str = "web", | |||
| ): | |||
| # check doc_form | |||
| DatasetService.check_doc_form(dataset, knowledge_config.doc_form) | |||
| # check document limit | |||
| features = FeatureService.get_features(current_user.current_tenant_id) | |||
| @@ -1,18 +0,0 @@ | |||
| from pydantic import BaseModel | |||
| from tasks.mail_enterprise_task import send_enterprise_email_task | |||
| class DifyMail(BaseModel): | |||
| to: list[str] | |||
| subject: str | |||
| body: str | |||
| substitutions: dict[str, str] = {} | |||
| class EnterpriseMailService: | |||
| @classmethod | |||
| def send_mail(cls, mail: DifyMail): | |||
| send_enterprise_email_task.delay( | |||
| to=mail.to, subject=mail.subject, body=mail.body, substitutions=mail.substitutions | |||
| ) | |||
| @@ -5,7 +5,7 @@ import click | |||
| from celery import shared_task # type: ignore | |||
| from core.rag.index_processor.index_processor_factory import IndexProcessorFactory | |||
| from core.tools.utils.rag_web_reader import get_image_upload_file_ids | |||
| from core.tools.utils.web_reader_tool import get_image_upload_file_ids | |||
| from extensions.ext_database import db | |||
| from extensions.ext_storage import storage | |||
| from models.dataset import ( | |||
| @@ -6,7 +6,7 @@ import click | |||
| from celery import shared_task # type: ignore | |||
| from core.rag.index_processor.index_processor_factory import IndexProcessorFactory | |||
| from core.tools.utils.rag_web_reader import get_image_upload_file_ids | |||
| from core.tools.utils.web_reader_tool import get_image_upload_file_ids | |||
| from extensions.ext_database import db | |||
| from extensions.ext_storage import storage | |||
| from models.dataset import Dataset, DatasetMetadataBinding, DocumentSegment | |||
| @@ -11,7 +11,7 @@ from libs.email_i18n import get_email_i18n_service | |||
| @shared_task(queue="mail") | |||
| def send_enterprise_email_task(to: list[str], subject: str, body: str, substitutions: Mapping[str, str]): | |||
| def send_inner_email_task(to: list[str], subject: str, body: str, substitutions: Mapping[str, str]): | |||
| if not mail.is_inited(): | |||
| return | |||
| @@ -0,0 +1,620 @@ | |||
| from unittest.mock import patch | |||
| import pytest | |||
| from faker import Faker | |||
| from models.model import EndUser, Message | |||
| from models.web import SavedMessage | |||
| from services.app_service import AppService | |||
| from services.saved_message_service import SavedMessageService | |||
| class TestSavedMessageService: | |||
| """Integration tests for SavedMessageService using testcontainers.""" | |||
| @pytest.fixture | |||
| def mock_external_service_dependencies(self): | |||
| """Mock setup for external service dependencies.""" | |||
| with ( | |||
| patch("services.account_service.FeatureService") as mock_account_feature_service, | |||
| patch("services.app_service.ModelManager") as mock_model_manager, | |||
| patch("services.saved_message_service.MessageService") as mock_message_service, | |||
| ): | |||
| # Setup default mock returns | |||
| mock_account_feature_service.get_system_features.return_value.is_allow_register = True | |||
| # Mock ModelManager for app creation | |||
| mock_model_instance = mock_model_manager.return_value | |||
| mock_model_instance.get_default_model_instance.return_value = None | |||
| mock_model_instance.get_default_provider_model_name.return_value = ("openai", "gpt-3.5-turbo") | |||
| # Mock MessageService | |||
| mock_message_service.get_message.return_value = None | |||
| mock_message_service.pagination_by_last_id.return_value = None | |||
| yield { | |||
| "account_feature_service": mock_account_feature_service, | |||
| "model_manager": mock_model_manager, | |||
| "message_service": mock_message_service, | |||
| } | |||
| def _create_test_app_and_account(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Helper method to create a test app and account for testing. | |||
| Args: | |||
| db_session_with_containers: Database session from testcontainers infrastructure | |||
| mock_external_service_dependencies: Mock dependencies | |||
| Returns: | |||
| tuple: (app, account) - Created app and account instances | |||
| """ | |||
| fake = Faker() | |||
| # Setup mocks for account creation | |||
| mock_external_service_dependencies[ | |||
| "account_feature_service" | |||
| ].get_system_features.return_value.is_allow_register = True | |||
| # Create account and tenant first | |||
| from services.account_service import AccountService, TenantService | |||
| account = AccountService.create_account( | |||
| email=fake.email(), | |||
| name=fake.name(), | |||
| interface_language="en-US", | |||
| password=fake.password(length=12), | |||
| ) | |||
| TenantService.create_owner_tenant_if_not_exist(account, name=fake.company()) | |||
| tenant = account.current_tenant | |||
| # Create app with realistic data | |||
| app_args = { | |||
| "name": fake.company(), | |||
| "description": fake.text(max_nb_chars=100), | |||
| "mode": "chat", | |||
| "icon_type": "emoji", | |||
| "icon": "🤖", | |||
| "icon_background": "#FF6B6B", | |||
| "api_rph": 100, | |||
| "api_rpm": 10, | |||
| } | |||
| app_service = AppService() | |||
| app = app_service.create_app(tenant.id, app_args, account) | |||
| return app, account | |||
| def _create_test_end_user(self, db_session_with_containers, app): | |||
| """ | |||
| Helper method to create a test end user for testing. | |||
| Args: | |||
| db_session_with_containers: Database session from testcontainers infrastructure | |||
| app: App instance to associate the end user with | |||
| Returns: | |||
| EndUser: Created end user instance | |||
| """ | |||
| fake = Faker() | |||
| end_user = EndUser( | |||
| tenant_id=app.tenant_id, | |||
| app_id=app.id, | |||
| external_user_id=fake.uuid4(), | |||
| name=fake.name(), | |||
| type="normal", | |||
| session_id=fake.uuid4(), | |||
| is_anonymous=False, | |||
| ) | |||
| from extensions.ext_database import db | |||
| db.session.add(end_user) | |||
| db.session.commit() | |||
| return end_user | |||
| def _create_test_message(self, db_session_with_containers, app, user): | |||
| """ | |||
| Helper method to create a test message for testing. | |||
| Args: | |||
| db_session_with_containers: Database session from testcontainers infrastructure | |||
| app: App instance to associate the message with | |||
| user: User instance (Account or EndUser) to associate the message with | |||
| Returns: | |||
| Message: Created message instance | |||
| """ | |||
| fake = Faker() | |||
| # Create a simple conversation first | |||
| from models.model import Conversation | |||
| conversation = Conversation( | |||
| app_id=app.id, | |||
| from_source="account" if hasattr(user, "current_tenant") else "end_user", | |||
| from_end_user_id=user.id if not hasattr(user, "current_tenant") else None, | |||
| from_account_id=user.id if hasattr(user, "current_tenant") else None, | |||
| name=fake.sentence(nb_words=3), | |||
| inputs={}, | |||
| status="normal", | |||
| mode="chat", | |||
| ) | |||
| from extensions.ext_database import db | |||
| db.session.add(conversation) | |||
| db.session.commit() | |||
| # Create message | |||
| message = Message( | |||
| app_id=app.id, | |||
| conversation_id=conversation.id, | |||
| from_source="account" if hasattr(user, "current_tenant") else "end_user", | |||
| from_end_user_id=user.id if not hasattr(user, "current_tenant") else None, | |||
| from_account_id=user.id if hasattr(user, "current_tenant") else None, | |||
| inputs={}, | |||
| query=fake.sentence(nb_words=5), | |||
| message=fake.text(max_nb_chars=100), | |||
| answer=fake.text(max_nb_chars=200), | |||
| message_tokens=50, | |||
| answer_tokens=100, | |||
| message_unit_price=0.001, | |||
| answer_unit_price=0.002, | |||
| total_price=0.003, | |||
| currency="USD", | |||
| status="success", | |||
| ) | |||
| db.session.add(message) | |||
| db.session.commit() | |||
| return message | |||
| def test_pagination_by_last_id_success_with_account_user( | |||
| self, db_session_with_containers, mock_external_service_dependencies | |||
| ): | |||
| """ | |||
| Test successful pagination by last ID with account user. | |||
| This test verifies: | |||
| - Proper pagination with account user | |||
| - Correct filtering by app_id and user | |||
| - Proper role identification for account users | |||
| - MessageService integration | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| # Create test messages | |||
| message1 = self._create_test_message(db_session_with_containers, app, account) | |||
| message2 = self._create_test_message(db_session_with_containers, app, account) | |||
| # Create saved messages | |||
| saved_message1 = SavedMessage( | |||
| app_id=app.id, | |||
| message_id=message1.id, | |||
| created_by_role="account", | |||
| created_by=account.id, | |||
| ) | |||
| saved_message2 = SavedMessage( | |||
| app_id=app.id, | |||
| message_id=message2.id, | |||
| created_by_role="account", | |||
| created_by=account.id, | |||
| ) | |||
| from extensions.ext_database import db | |||
| db.session.add_all([saved_message1, saved_message2]) | |||
| db.session.commit() | |||
| # Mock MessageService.pagination_by_last_id return value | |||
| from libs.infinite_scroll_pagination import InfiniteScrollPagination | |||
| mock_pagination = InfiniteScrollPagination(data=[message1, message2], limit=10, has_more=False) | |||
| mock_external_service_dependencies["message_service"].pagination_by_last_id.return_value = mock_pagination | |||
| # Act: Execute the method under test | |||
| result = SavedMessageService.pagination_by_last_id(app_model=app, user=account, last_id=None, limit=10) | |||
| # Assert: Verify the expected outcomes | |||
| assert result is not None | |||
| assert result.data == [message1, message2] | |||
| assert result.limit == 10 | |||
| assert result.has_more is False | |||
| # Verify MessageService was called with correct parameters | |||
| # Sort the IDs to handle database query order variations | |||
| expected_include_ids = sorted([message1.id, message2.id]) | |||
| actual_call = mock_external_service_dependencies["message_service"].pagination_by_last_id.call_args | |||
| actual_include_ids = sorted(actual_call.kwargs.get("include_ids", [])) | |||
| assert actual_call.kwargs["app_model"] == app | |||
| assert actual_call.kwargs["user"] == account | |||
| assert actual_call.kwargs["last_id"] is None | |||
| assert actual_call.kwargs["limit"] == 10 | |||
| assert actual_include_ids == expected_include_ids | |||
| # Verify database state | |||
| db.session.refresh(saved_message1) | |||
| db.session.refresh(saved_message2) | |||
| assert saved_message1.id is not None | |||
| assert saved_message2.id is not None | |||
| assert saved_message1.created_by_role == "account" | |||
| assert saved_message2.created_by_role == "account" | |||
| def test_pagination_by_last_id_success_with_end_user( | |||
| self, db_session_with_containers, mock_external_service_dependencies | |||
| ): | |||
| """ | |||
| Test successful pagination by last ID with end user. | |||
| This test verifies: | |||
| - Proper pagination with end user | |||
| - Correct filtering by app_id and user | |||
| - Proper role identification for end users | |||
| - MessageService integration | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| end_user = self._create_test_end_user(db_session_with_containers, app) | |||
| # Create test messages | |||
| message1 = self._create_test_message(db_session_with_containers, app, end_user) | |||
| message2 = self._create_test_message(db_session_with_containers, app, end_user) | |||
| # Create saved messages | |||
| saved_message1 = SavedMessage( | |||
| app_id=app.id, | |||
| message_id=message1.id, | |||
| created_by_role="end_user", | |||
| created_by=end_user.id, | |||
| ) | |||
| saved_message2 = SavedMessage( | |||
| app_id=app.id, | |||
| message_id=message2.id, | |||
| created_by_role="end_user", | |||
| created_by=end_user.id, | |||
| ) | |||
| from extensions.ext_database import db | |||
| db.session.add_all([saved_message1, saved_message2]) | |||
| db.session.commit() | |||
| # Mock MessageService.pagination_by_last_id return value | |||
| from libs.infinite_scroll_pagination import InfiniteScrollPagination | |||
| mock_pagination = InfiniteScrollPagination(data=[message1, message2], limit=5, has_more=True) | |||
| mock_external_service_dependencies["message_service"].pagination_by_last_id.return_value = mock_pagination | |||
| # Act: Execute the method under test | |||
| result = SavedMessageService.pagination_by_last_id( | |||
| app_model=app, user=end_user, last_id="test_last_id", limit=5 | |||
| ) | |||
| # Assert: Verify the expected outcomes | |||
| assert result is not None | |||
| assert result.data == [message1, message2] | |||
| assert result.limit == 5 | |||
| assert result.has_more is True | |||
| # Verify MessageService was called with correct parameters | |||
| # Sort the IDs to handle database query order variations | |||
| expected_include_ids = sorted([message1.id, message2.id]) | |||
| actual_call = mock_external_service_dependencies["message_service"].pagination_by_last_id.call_args | |||
| actual_include_ids = sorted(actual_call.kwargs.get("include_ids", [])) | |||
| assert actual_call.kwargs["app_model"] == app | |||
| assert actual_call.kwargs["user"] == end_user | |||
| assert actual_call.kwargs["last_id"] == "test_last_id" | |||
| assert actual_call.kwargs["limit"] == 5 | |||
| assert actual_include_ids == expected_include_ids | |||
| # Verify database state | |||
| db.session.refresh(saved_message1) | |||
| db.session.refresh(saved_message2) | |||
| assert saved_message1.id is not None | |||
| assert saved_message2.id is not None | |||
| assert saved_message1.created_by_role == "end_user" | |||
| assert saved_message2.created_by_role == "end_user" | |||
| def test_save_success_with_new_message(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test successful save of a new message. | |||
| This test verifies: | |||
| - Proper creation of new saved message | |||
| - Correct database state after save | |||
| - Proper relationship establishment | |||
| - MessageService integration for message retrieval | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| message = self._create_test_message(db_session_with_containers, app, account) | |||
| # Mock MessageService.get_message return value | |||
| mock_external_service_dependencies["message_service"].get_message.return_value = message | |||
| # Act: Execute the method under test | |||
| SavedMessageService.save(app_model=app, user=account, message_id=message.id) | |||
| # Assert: Verify the expected outcomes | |||
| # Check if saved message was created in database | |||
| from extensions.ext_database import db | |||
| saved_message = ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| SavedMessage.created_by_role == "account", | |||
| SavedMessage.created_by == account.id, | |||
| ) | |||
| .first() | |||
| ) | |||
| assert saved_message is not None | |||
| assert saved_message.app_id == app.id | |||
| assert saved_message.message_id == message.id | |||
| assert saved_message.created_by_role == "account" | |||
| assert saved_message.created_by == account.id | |||
| assert saved_message.created_at is not None | |||
| # Verify MessageService.get_message was called | |||
| mock_external_service_dependencies["message_service"].get_message.assert_called_once_with( | |||
| app_model=app, user=account, message_id=message.id | |||
| ) | |||
| # Verify database state | |||
| db.session.refresh(saved_message) | |||
| assert saved_message.id is not None | |||
| def test_pagination_by_last_id_error_no_user(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test error handling when no user is provided. | |||
| This test verifies: | |||
| - Proper error handling for missing user | |||
| - ValueError is raised when user is None | |||
| - No database operations are performed | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| # Act & Assert: Verify proper error handling | |||
| with pytest.raises(ValueError) as exc_info: | |||
| SavedMessageService.pagination_by_last_id(app_model=app, user=None, last_id=None, limit=10) | |||
| assert "User is required" in str(exc_info.value) | |||
| # Verify no database operations were performed | |||
| from extensions.ext_database import db | |||
| saved_messages = db.session.query(SavedMessage).all() | |||
| assert len(saved_messages) == 0 | |||
| def test_save_error_no_user(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test error handling when saving message with no user. | |||
| This test verifies: | |||
| - Method returns early when user is None | |||
| - No database operations are performed | |||
| - No exceptions are raised | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| message = self._create_test_message(db_session_with_containers, app, account) | |||
| # Act: Execute the method under test with None user | |||
| result = SavedMessageService.save(app_model=app, user=None, message_id=message.id) | |||
| # Assert: Verify the expected outcomes | |||
| assert result is None | |||
| # Verify no saved message was created | |||
| from extensions.ext_database import db | |||
| saved_message = ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| ) | |||
| .first() | |||
| ) | |||
| assert saved_message is None | |||
| def test_delete_success_existing_message(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test successful deletion of an existing saved message. | |||
| This test verifies: | |||
| - Proper deletion of existing saved message | |||
| - Correct database state after deletion | |||
| - No errors during deletion process | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| message = self._create_test_message(db_session_with_containers, app, account) | |||
| # Create a saved message first | |||
| saved_message = SavedMessage( | |||
| app_id=app.id, | |||
| message_id=message.id, | |||
| created_by_role="account", | |||
| created_by=account.id, | |||
| ) | |||
| from extensions.ext_database import db | |||
| db.session.add(saved_message) | |||
| db.session.commit() | |||
| # Verify saved message exists | |||
| assert ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| SavedMessage.created_by_role == "account", | |||
| SavedMessage.created_by == account.id, | |||
| ) | |||
| .first() | |||
| is not None | |||
| ) | |||
| # Act: Execute the method under test | |||
| SavedMessageService.delete(app_model=app, user=account, message_id=message.id) | |||
| # Assert: Verify the expected outcomes | |||
| # Check if saved message was deleted from database | |||
| deleted_saved_message = ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| SavedMessage.created_by_role == "account", | |||
| SavedMessage.created_by == account.id, | |||
| ) | |||
| .first() | |||
| ) | |||
| assert deleted_saved_message is None | |||
| # Verify database state | |||
| db.session.commit() | |||
| # The message should still exist, only the saved_message should be deleted | |||
| assert db.session.query(Message).where(Message.id == message.id).first() is not None | |||
| def test_pagination_by_last_id_error_no_user(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test error handling when no user is provided. | |||
| This test verifies: | |||
| - Proper error handling for missing user | |||
| - ValueError is raised when user is None | |||
| - No database operations are performed | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| # Act & Assert: Verify proper error handling | |||
| with pytest.raises(ValueError) as exc_info: | |||
| SavedMessageService.pagination_by_last_id(app_model=app, user=None, last_id=None, limit=10) | |||
| assert "User is required" in str(exc_info.value) | |||
| # Verify no database operations were performed for this specific test | |||
| # Note: We don't check total count as other tests may have created data | |||
| # Instead, we verify that the error was properly raised | |||
| pass | |||
| def test_save_error_no_user(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test error handling when saving message with no user. | |||
| This test verifies: | |||
| - Method returns early when user is None | |||
| - No database operations are performed | |||
| - No exceptions are raised | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| message = self._create_test_message(db_session_with_containers, app, account) | |||
| # Act: Execute the method under test with None user | |||
| result = SavedMessageService.save(app_model=app, user=None, message_id=message.id) | |||
| # Assert: Verify the expected outcomes | |||
| assert result is None | |||
| # Verify no saved message was created | |||
| from extensions.ext_database import db | |||
| saved_message = ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| ) | |||
| .first() | |||
| ) | |||
| assert saved_message is None | |||
| def test_delete_success_existing_message(self, db_session_with_containers, mock_external_service_dependencies): | |||
| """ | |||
| Test successful deletion of an existing saved message. | |||
| This test verifies: | |||
| - Proper deletion of existing saved message | |||
| - Correct database state after deletion | |||
| - No errors during deletion process | |||
| """ | |||
| # Arrange: Create test data | |||
| fake = Faker() | |||
| app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) | |||
| message = self._create_test_message(db_session_with_containers, app, account) | |||
| # Create a saved message first | |||
| saved_message = SavedMessage( | |||
| app_id=app.id, | |||
| message_id=message.id, | |||
| created_by_role="account", | |||
| created_by=account.id, | |||
| ) | |||
| from extensions.ext_database import db | |||
| db.session.add(saved_message) | |||
| db.session.commit() | |||
| # Verify saved message exists | |||
| assert ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| SavedMessage.created_by_role == "account", | |||
| SavedMessage.created_by == account.id, | |||
| ) | |||
| .first() | |||
| is not None | |||
| ) | |||
| # Act: Execute the method under test | |||
| SavedMessageService.delete(app_model=app, user=account, message_id=message.id) | |||
| # Assert: Verify the expected outcomes | |||
| # Check if saved message was deleted from database | |||
| deleted_saved_message = ( | |||
| db.session.query(SavedMessage) | |||
| .where( | |||
| SavedMessage.app_id == app.id, | |||
| SavedMessage.message_id == message.id, | |||
| SavedMessage.created_by_role == "account", | |||
| SavedMessage.created_by == account.id, | |||
| ) | |||
| .first() | |||
| ) | |||
| assert deleted_saved_message is None | |||
| # Verify database state | |||
| db.session.commit() | |||
| # The message should still exist, only the saved_message should be deleted | |||
| assert db.session.query(Message).where(Message.id == message.id).first() is not None | |||
| @@ -0,0 +1,25 @@ | |||
| from core.tools.utils.web_reader_tool import get_image_upload_file_ids | |||
| def test_get_image_upload_file_ids(): | |||
| # should extract id from https + file-preview | |||
| content = "" | |||
| assert get_image_upload_file_ids(content) == ["abc123"] | |||
| # should extract id from http + image-preview | |||
| content = "" | |||
| assert get_image_upload_file_ids(content) == ["xyz789"] | |||
| # should not match invalid scheme 'htt://' | |||
| content = "" | |||
| assert get_image_upload_file_ids(content) == [] | |||
| # should extract multiple ids in order | |||
| content = """ | |||
| some text | |||
|  | |||
| middle | |||
|  | |||
| end | |||
| """ | |||
| assert get_image_upload_file_ids(content) == ["id1", "id2"] | |||
| @@ -1,5 +1,5 @@ | |||
| version = 1 | |||
| revision = 2 | |||
| revision = 3 | |||
| requires-python = ">=3.11, <3.13" | |||
| resolution-markers = [ | |||
| "python_full_version >= '3.12.4' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", | |||
| @@ -4,7 +4,7 @@ Welcome to the new `docker` directory for deploying Dify using Docker Compose. T | |||
| ### What's Updated | |||
| - **Certbot Container**: `docker-compose.yaml` now contains `certbot` for managing SSL certificates. This container automatically renews certificates and ensures secure HTTPS connections. | |||
| - **Certbot Container**: `docker-compose.yaml` now contains `certbot` for managing SSL certificates. This container automatically renews certificates and ensures secure HTTPS connections.\ | |||
| For more information, refer `docker/certbot/README.md`. | |||
| - **Persistent Environment Variables**: Environment variables are now managed through a `.env` file, ensuring that your configurations persist across deployments. | |||
| @@ -13,43 +13,44 @@ Welcome to the new `docker` directory for deploying Dify using Docker Compose. T | |||
| > The `.env` file is a crucial component in Docker and Docker Compose environments, serving as a centralized configuration file where you can define environment variables that are accessible to the containers at runtime. This file simplifies the management of environment settings across different stages of development, testing, and production, providing consistency and ease of configuration to deployments. | |||
| - **Unified Vector Database Services**: All vector database services are now managed from a single Docker Compose file `docker-compose.yaml`. You can switch between different vector databases by setting the `VECTOR_STORE` environment variable in your `.env` file. | |||
| - **Mandatory .env File**: A `.env` file is now required to run `docker compose up`. This file is crucial for configuring your deployment and for any custom settings to persist through upgrades. | |||
| ### How to Deploy Dify with `docker-compose.yaml` | |||
| 1. **Prerequisites**: Ensure Docker and Docker Compose are installed on your system. | |||
| 2. **Environment Setup**: | |||
| - Navigate to the `docker` directory. | |||
| - Copy the `.env.example` file to a new file named `.env` by running `cp .env.example .env`. | |||
| - Customize the `.env` file as needed. Refer to the `.env.example` file for detailed configuration options. | |||
| 3. **Running the Services**: | |||
| - Execute `docker compose up` from the `docker` directory to start the services. | |||
| - To specify a vector database, set the `VECTOR_STORE` variable in your `.env` file to your desired vector database service, such as `milvus`, `weaviate`, or `opensearch`. | |||
| 4. **SSL Certificate Setup**: | |||
| - Refer `docker/certbot/README.md` to set up SSL certificates using Certbot. | |||
| 5. **OpenTelemetry Collector Setup**: | |||
| 1. **Environment Setup**: | |||
| - Navigate to the `docker` directory. | |||
| - Copy the `.env.example` file to a new file named `.env` by running `cp .env.example .env`. | |||
| - Customize the `.env` file as needed. Refer to the `.env.example` file for detailed configuration options. | |||
| 1. **Running the Services**: | |||
| - Execute `docker compose up` from the `docker` directory to start the services. | |||
| - To specify a vector database, set the `VECTOR_STORE` variable in your `.env` file to your desired vector database service, such as `milvus`, `weaviate`, or `opensearch`. | |||
| 1. **SSL Certificate Setup**: | |||
| - Refer `docker/certbot/README.md` to set up SSL certificates using Certbot. | |||
| 1. **OpenTelemetry Collector Setup**: | |||
| - Change `ENABLE_OTEL` to `true` in `.env`. | |||
| - Configure `OTLP_BASE_ENDPOINT` properly. | |||
| ### How to Deploy Middleware for Developing Dify | |||
| 1. **Middleware Setup**: | |||
| - Use the `docker-compose.middleware.yaml` for setting up essential middleware services like databases and caches. | |||
| - Navigate to the `docker` directory. | |||
| - Ensure the `middleware.env` file is created by running `cp middleware.env.example middleware.env` (refer to the `middleware.env.example` file). | |||
| 2. **Running Middleware Services**: | |||
| - Navigate to the `docker` directory. | |||
| - Execute `docker compose -f docker-compose.middleware.yaml --profile weaviate -p dify up -d` to start the middleware services. (Change the profile to other vector database if you are not using weaviate) | |||
| - Use the `docker-compose.middleware.yaml` for setting up essential middleware services like databases and caches. | |||
| - Navigate to the `docker` directory. | |||
| - Ensure the `middleware.env` file is created by running `cp middleware.env.example middleware.env` (refer to the `middleware.env.example` file). | |||
| 1. **Running Middleware Services**: | |||
| - Navigate to the `docker` directory. | |||
| - Execute `docker compose -f docker-compose.middleware.yaml --profile weaviate -p dify up -d` to start the middleware services. (Change the profile to other vector database if you are not using weaviate) | |||
| ### Migration for Existing Users | |||
| For users migrating from the `docker-legacy` setup: | |||
| 1. **Review Changes**: Familiarize yourself with the new `.env` configuration and Docker Compose setup. | |||
| 2. **Transfer Customizations**: | |||
| - If you have customized configurations such as `docker-compose.yaml`, `ssrf_proxy/squid.conf`, or `nginx/conf.d/default.conf`, you will need to reflect these changes in the `.env` file you create. | |||
| 3. **Data Migration**: | |||
| - Ensure that data from services like databases and caches is backed up and migrated appropriately to the new structure if necessary. | |||
| 1. **Transfer Customizations**: | |||
| - If you have customized configurations such as `docker-compose.yaml`, `ssrf_proxy/squid.conf`, or `nginx/conf.d/default.conf`, you will need to reflect these changes in the `.env` file you create. | |||
| 1. **Data Migration**: | |||
| - Ensure that data from services like databases and caches is backed up and migrated appropriately to the new structure if necessary. | |||
| ### Overview of `.env` | |||
| @@ -64,39 +65,49 @@ For users migrating from the `docker-legacy` setup: | |||
| The `.env.example` file provided in the Docker setup is extensive and covers a wide range of configuration options. It is structured into several sections, each pertaining to different aspects of the application and its services. Here are some of the key sections and variables: | |||
| 1. **Common Variables**: | |||
| - `CONSOLE_API_URL`, `SERVICE_API_URL`: URLs for different API services. | |||
| - `APP_WEB_URL`: Frontend application URL. | |||
| - `FILES_URL`: Base URL for file downloads and previews. | |||
| 2. **Server Configuration**: | |||
| - `LOG_LEVEL`, `DEBUG`, `FLASK_DEBUG`: Logging and debug settings. | |||
| - `SECRET_KEY`: A key for encrypting session cookies and other sensitive data. | |||
| - `CONSOLE_API_URL`, `SERVICE_API_URL`: URLs for different API services. | |||
| - `APP_WEB_URL`: Frontend application URL. | |||
| - `FILES_URL`: Base URL for file downloads and previews. | |||
| 1. **Server Configuration**: | |||
| - `LOG_LEVEL`, `DEBUG`, `FLASK_DEBUG`: Logging and debug settings. | |||
| - `SECRET_KEY`: A key for encrypting session cookies and other sensitive data. | |||
| 1. **Database Configuration**: | |||
| - `DB_USERNAME`, `DB_PASSWORD`, `DB_HOST`, `DB_PORT`, `DB_DATABASE`: PostgreSQL database credentials and connection details. | |||
| 1. **Redis Configuration**: | |||
| - `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`: Redis server connection settings. | |||
| 1. **Celery Configuration**: | |||
| - `CELERY_BROKER_URL`: Configuration for Celery message broker. | |||
| 1. **Storage Configuration**: | |||
| - `STORAGE_TYPE`, `S3_BUCKET_NAME`, `AZURE_BLOB_ACCOUNT_NAME`: Settings for file storage options like local, S3, Azure Blob, etc. | |||
| 1. **Vector Database Configuration**: | |||
| 3. **Database Configuration**: | |||
| - `DB_USERNAME`, `DB_PASSWORD`, `DB_HOST`, `DB_PORT`, `DB_DATABASE`: PostgreSQL database credentials and connection details. | |||
| - `VECTOR_STORE`: Type of vector database (e.g., `weaviate`, `milvus`). | |||
| - Specific settings for each vector store like `WEAVIATE_ENDPOINT`, `MILVUS_URI`. | |||
| 4. **Redis Configuration**: | |||
| - `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`: Redis server connection settings. | |||
| 1. **CORS Configuration**: | |||
| 5. **Celery Configuration**: | |||
| - `CELERY_BROKER_URL`: Configuration for Celery message broker. | |||
| - `WEB_API_CORS_ALLOW_ORIGINS`, `CONSOLE_CORS_ALLOW_ORIGINS`: Settings for cross-origin resource sharing. | |||
| 6. **Storage Configuration**: | |||
| - `STORAGE_TYPE`, `S3_BUCKET_NAME`, `AZURE_BLOB_ACCOUNT_NAME`: Settings for file storage options like local, S3, Azure Blob, etc. | |||
| 1. **OpenTelemetry Configuration**: | |||
| 7. **Vector Database Configuration**: | |||
| - `VECTOR_STORE`: Type of vector database (e.g., `weaviate`, `milvus`). | |||
| - Specific settings for each vector store like `WEAVIATE_ENDPOINT`, `MILVUS_URI`. | |||
| - `ENABLE_OTEL`: Enable OpenTelemetry collector in api. | |||
| - `OTLP_BASE_ENDPOINT`: Endpoint for your OTLP exporter. | |||
| 8. **CORS Configuration**: | |||
| - `WEB_API_CORS_ALLOW_ORIGINS`, `CONSOLE_CORS_ALLOW_ORIGINS`: Settings for cross-origin resource sharing. | |||
| 1. **Other Service-Specific Environment Variables**: | |||
| 9. **OpenTelemetry Configuration**: | |||
| - `ENABLE_OTEL`: Enable OpenTelemetry collector in api. | |||
| - `OTLP_BASE_ENDPOINT`: Endpoint for your OTLP exporter. | |||
| 10. **Other Service-Specific Environment Variables**: | |||
| - Each service like `nginx`, `redis`, `db`, and vector databases have specific environment variables that are directly referenced in the `docker-compose.yaml`. | |||
| - Each service like `nginx`, `redis`, `db`, and vector databases have specific environment variables that are directly referenced in the `docker-compose.yaml`. | |||
| ### Additional Information | |||
| @@ -2,12 +2,12 @@ | |||
| ## Short description | |||
| docker compose certbot configurations with Backward compatibility (without certbot container). | |||
| docker compose certbot configurations with Backward compatibility (without certbot container).\ | |||
| Use `docker compose --profile certbot up` to use this features. | |||
| ## The simplest way for launching new servers with SSL certificates | |||
| 1. Get letsencrypt certs | |||
| 1. Get letsencrypt certs\ | |||
| set `.env` values | |||
| ```properties | |||
| NGINX_SSL_CERT_FILENAME=fullchain.pem | |||
| @@ -25,7 +25,7 @@ Use `docker compose --profile certbot up` to use this features. | |||
| ```shell | |||
| docker compose exec -it certbot /bin/sh /update-cert.sh | |||
| ``` | |||
| 2. Edit `.env` file and `docker compose --profile certbot up` again. | |||
| 1. Edit `.env` file and `docker compose --profile certbot up` again.\ | |||
| set `.env` value additionally | |||
| ```properties | |||
| NGINX_HTTPS_ENABLED=true | |||
| @@ -34,7 +34,7 @@ Use `docker compose --profile certbot up` to use this features. | |||
| ```shell | |||
| docker compose --profile certbot up -d --no-deps --force-recreate nginx | |||
| ``` | |||
| Then you can access your serve with HTTPS. | |||
| Then you can access your serve with HTTPS.\ | |||
| [https://your_domain.com](https://your_domain.com) | |||
| ## SSL certificates renewal | |||
| @@ -1,12 +1,15 @@ | |||
| # Dify Node.js SDK | |||
| This is the Node.js SDK for the Dify API, which allows you to easily integrate Dify into your Node.js applications. | |||
| ## Install | |||
| ```bash | |||
| npm install dify-client | |||
| ``` | |||
| ## Usage | |||
| After installing the SDK, you can use it in your project like this: | |||
| ```js | |||
| @@ -60,4 +63,5 @@ client.messageFeedback(messageId, rating, user) | |||
| Replace 'your-api-key-here' with your actual Dify API key.Replace 'your-app-id-here' with your actual Dify APP ID. | |||
| ## License | |||
| This SDK is released under the MIT License. | |||
| @@ -11,7 +11,7 @@ This is the PHP SDK for the Dify API, which allows you to easily integrate Dify | |||
| If you want to try the example, you can run `composer install` in this directory. | |||
| In exist project, copy the `dify-client.php` to you project, and merge the following to your `composer.json` file, then run `composer install && composer dump-autoload` to install. Guzzle does not require 7.9, other versions have not been tested, but you can try. | |||
| In exist project, copy the `dify-client.php` to you project, and merge the following to your `composer.json` file, then run `composer install && composer dump-autoload` to install. Guzzle does not require 7.9, other versions have not been tested, but you can try. | |||
| ```json | |||
| { | |||
| @@ -141,8 +141,6 @@ with open(file_path, "rb") as file: | |||
| result = response.json() | |||
| print(f'upload_file_id: {result.get("id")}') | |||
| ``` | |||
| - Others | |||
| @@ -184,7 +182,8 @@ print('[rename result]') | |||
| print(rename_conversation_response.json()) | |||
| ``` | |||
| * Using the Workflow Client | |||
| - Using the Workflow Client | |||
| ```python | |||
| import json | |||
| import requests | |||
| @@ -7,6 +7,7 @@ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next | |||
| ### Run by source code | |||
| Before starting the web frontend service, please make sure the following environment is ready. | |||
| - [Node.js](https://nodejs.org) >= v22.11.x | |||
| - [pnpm](https://pnpm.io) v10.x | |||
| @@ -103,11 +104,9 @@ pnpm run test | |||
| ``` | |||
| If you are not familiar with writing tests, here is some code to refer to: | |||
| * [classnames.spec.ts](./utils/classnames.spec.ts) | |||
| * [index.spec.tsx](./app/components/base/button/index.spec.tsx) | |||
| - [classnames.spec.ts](./utils/classnames.spec.ts) | |||
| - [index.spec.tsx](./app/components/base/button/index.spec.tsx) | |||
| ## Documentation | |||
| @@ -13,12 +13,12 @@ import { useProviderContext } from '@/context/provider-context' | |||
| export default function EducationApply() { | |||
| const router = useRouter() | |||
| const { enableEducationPlan, isEducationAccount } = useProviderContext() | |||
| const { enableEducationPlan } = useProviderContext() | |||
| const searchParams = useSearchParams() | |||
| const token = searchParams.get('token') | |||
| const showEducationApplyPage = useMemo(() => { | |||
| return enableEducationPlan && !isEducationAccount && token | |||
| }, [enableEducationPlan, isEducationAccount, token]) | |||
| return enableEducationPlan && token | |||
| }, [enableEducationPlan, token]) | |||
| useEffect(() => { | |||
| if (!showEducationApplyPage) | |||
| @@ -0,0 +1,4 @@ | |||
| <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> | |||
| <path opacity="0.5" d="M12.5674 1.56341C12.5532 1.43246 12.4469 1.33346 12.3203 1.33333C12.1938 1.3332 12.0873 1.43196 12.0728 1.56288C12.0053 2.1724 11.8316 2.59056 11.5593 2.87418C11.287 3.1578 10.8856 3.33881 10.3004 3.40911C10.1747 3.42421 10.08 3.53514 10.0801 3.66693C10.0802 3.79872 10.1752 3.90944 10.3009 3.92427C10.8762 3.99215 11.2868 4.17312 11.566 4.45869C11.8437 4.74271 12.0207 5.16027 12.0721 5.76368C12.0836 5.89756 12.1913 6.00015 12.3203 6C12.4494 5.99984 12.5569 5.897 12.568 5.7631C12.6174 5.16988 12.7943 4.74291 13.0737 4.45176C13.3533 4.1606 13.7632 3.9763 14.3326 3.92496C14.4612 3.91336 14.56 3.80136 14.5601 3.66696C14.5602 3.53255 14.4617 3.42032 14.3332 3.40842C13.7539 3.35482 13.3531 3.17038 13.0804 2.88113C12.8063 2.5903 12.6325 2.16262 12.5674 1.56341Z" fill="#155AEF"/> | |||
| <path d="M8.15567 3.25831C8.11906 2.92157 7.84578 2.66702 7.52041 2.66667C7.19509 2.66633 6.92124 2.92029 6.88399 3.25695C6.71042 4.8243 6.2636 5.89953 5.56346 6.62885C4.86332 7.35814 3.83109 7.82361 2.32643 8.00441C2.00323 8.04321 1.75943 8.32847 1.75977 8.66734C1.7601 9.00627 2.00446 9.29094 2.32773 9.32907C3.80694 9.50361 4.86268 9.96901 5.58062 10.7033C6.29465 11.4337 6.74997 12.5073 6.88226 14.059C6.91164 14.4033 7.18869 14.6671 7.52047 14.6667C7.85231 14.6663 8.12879 14.4018 8.1574 14.0575C8.28412 12.5321 8.73909 11.4342 9.45781 10.6855C10.1766 9.93681 11.2305 9.46287 12.6949 9.33087C13.0255 9.30107 13.2794 9.01307 13.2798 8.66741C13.2801 8.32181 13.0269 8.03321 12.6964 8.00261C11.2068 7.86481 10.1761 7.39054 9.47497 6.64673C8.77001 5.89887 8.32322 4.79915 8.15567 3.25831Z" fill="#155AEF"/> | |||
| </svg> | |||
| @@ -0,0 +1,36 @@ | |||
| { | |||
| "icon": { | |||
| "type": "element", | |||
| "isRootNode": true, | |||
| "name": "svg", | |||
| "attributes": { | |||
| "width": "16", | |||
| "height": "16", | |||
| "viewBox": "0 0 16 16", | |||
| "fill": "none", | |||
| "xmlns": "http://www.w3.org/2000/svg" | |||
| }, | |||
| "children": [ | |||
| { | |||
| "type": "element", | |||
| "name": "path", | |||
| "attributes": { | |||
| "opacity": "0.5", | |||
| "d": "M12.5674 1.56341C12.5532 1.43246 12.4469 1.33346 12.3203 1.33333C12.1938 1.3332 12.0873 1.43196 12.0728 1.56288C12.0053 2.1724 11.8316 2.59056 11.5593 2.87418C11.287 3.1578 10.8856 3.33881 10.3004 3.40911C10.1747 3.42421 10.08 3.53514 10.0801 3.66693C10.0802 3.79872 10.1752 3.90944 10.3009 3.92427C10.8762 3.99215 11.2868 4.17312 11.566 4.45869C11.8437 4.74271 12.0207 5.16027 12.0721 5.76368C12.0836 5.89756 12.1913 6.00015 12.3203 6C12.4494 5.99984 12.5569 5.897 12.568 5.7631C12.6174 5.16988 12.7943 4.74291 13.0737 4.45176C13.3533 4.1606 13.7632 3.9763 14.3326 3.92496C14.4612 3.91336 14.56 3.80136 14.5601 3.66696C14.5602 3.53255 14.4617 3.42032 14.3332 3.40842C13.7539 3.35482 13.3531 3.17038 13.0804 2.88113C12.8063 2.5903 12.6325 2.16262 12.5674 1.56341Z", | |||
| "fill": "#155AEF" | |||
| }, | |||
| "children": [] | |||
| }, | |||
| { | |||
| "type": "element", | |||
| "name": "path", | |||
| "attributes": { | |||
| "d": "M8.15567 3.25831C8.11906 2.92157 7.84578 2.66702 7.52041 2.66667C7.19509 2.66633 6.92124 2.92029 6.88399 3.25695C6.71042 4.8243 6.2636 5.89953 5.56346 6.62885C4.86332 7.35814 3.83109 7.82361 2.32643 8.00441C2.00323 8.04321 1.75943 8.32847 1.75977 8.66734C1.7601 9.00627 2.00446 9.29094 2.32773 9.32907C3.80694 9.50361 4.86268 9.96901 5.58062 10.7033C6.29465 11.4337 6.74997 12.5073 6.88226 14.059C6.91164 14.4033 7.18869 14.6671 7.52047 14.6667C7.85231 14.6663 8.12879 14.4018 8.1574 14.0575C8.28412 12.5321 8.73909 11.4342 9.45781 10.6855C10.1766 9.93681 11.2305 9.46287 12.6949 9.33087C13.0255 9.30107 13.2794 9.01307 13.2798 8.66741C13.2801 8.32181 13.0269 8.03321 12.6964 8.00261C11.2068 7.86481 10.1761 7.39054 9.47497 6.64673C8.77001 5.89887 8.32322 4.79915 8.15567 3.25831Z", | |||
| "fill": "#155AEF" | |||
| }, | |||
| "children": [] | |||
| } | |||
| ] | |||
| }, | |||
| "name": "SparklesSoftAccent" | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| // GENERATE BY script | |||
| // DON NOT EDIT IT MANUALLY | |||
| import * as React from 'react' | |||
| import data from './SparklesSoftAccent.json' | |||
| import IconBase from '@/app/components/base/icons/IconBase' | |||
| import type { IconData } from '@/app/components/base/icons/IconBase' | |||
| const Icon = ( | |||
| { | |||
| ref, | |||
| ...props | |||
| }: React.SVGProps<SVGSVGElement> & { | |||
| ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>; | |||
| }, | |||
| ) => <IconBase {...props} ref={ref} data={data as IconData} /> | |||
| Icon.displayName = 'SparklesSoftAccent' | |||
| export default Icon | |||
| @@ -12,4 +12,5 @@ export { default as MultiPathRetrieval } from './MultiPathRetrieval' | |||
| export { default as NTo1Retrieval } from './NTo1Retrieval' | |||
| export { default as Notion } from './Notion' | |||
| export { default as Soc2 } from './Soc2' | |||
| export { default as SparklesSoftAccent } from './SparklesSoftAccent' | |||
| export { default as SparklesSoft } from './SparklesSoft' | |||
| @@ -33,7 +33,8 @@ const PlanComp: FC<Props> = ({ | |||
| const { t } = useTranslation() | |||
| const router = useRouter() | |||
| const { userProfile } = useAppContext() | |||
| const { plan, enableEducationPlan, isEducationAccount } = useProviderContext() | |||
| const { plan, enableEducationPlan, allowRefreshEducationVerify, isEducationAccount } = useProviderContext() | |||
| const isAboutToExpire = allowRefreshEducationVerify | |||
| const { | |||
| type, | |||
| } = plan | |||
| @@ -79,7 +80,7 @@ const PlanComp: FC<Props> = ({ | |||
| <div className='system-xs-regular text-util-colors-gray-gray-600'>{t(`billing.plans.${type}.for`)}</div> | |||
| </div> | |||
| <div className='flex shrink-0 items-center gap-1'> | |||
| {enableEducationPlan && !isEducationAccount && ( | |||
| {enableEducationPlan && (!isEducationAccount || isAboutToExpire) && ( | |||
| <Button variant='ghost' onClick={handleVerify}> | |||
| <RiGraduationCapLine className='mr-1 h-4 w-4' /> | |||
| {t('education.toVerified')} | |||
| @@ -59,6 +59,11 @@ export default function AppSelector() { | |||
| localStorage.removeItem('console_token') | |||
| localStorage.removeItem('refresh_token') | |||
| // To avoid use other account's education notice info | |||
| localStorage.removeItem('education-reverify-prev-expire-at') | |||
| localStorage.removeItem('education-reverify-has-noticed') | |||
| localStorage.removeItem('education-expired-has-noticed') | |||
| router.push('/signin') | |||
| } | |||
| @@ -1,2 +1,4 @@ | |||
| export const EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION = 'getEducationVerify' | |||
| export const EDUCATION_VERIFYING_LOCALSTORAGE_ITEM = 'educationVerifying' | |||
| export const EDUCATION_PRICING_SHOW_ACTION = 'educationPricing' | |||
| export const EDUCATION_RE_VERIFY_ACTION = 'educationReVerify' | |||
| @@ -0,0 +1,96 @@ | |||
| 'use client' | |||
| import React from 'react' | |||
| import Button from '@/app/components/base/button' | |||
| import Modal from '@/app/components/base/modal' | |||
| import { useDocLink } from '@/context/i18n' | |||
| import Link from 'next/link' | |||
| import { useTranslation } from 'react-i18next' | |||
| import { RiExternalLinkLine } from '@remixicon/react' | |||
| import { SparklesSoftAccent } from '../components/base/icons/src/public/common' | |||
| import useTimestamp from '@/hooks/use-timestamp' | |||
| import { useModalContextSelector } from '@/context/modal-context' | |||
| import { useEducationVerify } from '@/service/use-education' | |||
| import { useRouter } from 'next/navigation' | |||
| export type ExpireNoticeModalPayloadProps = { | |||
| expireAt: number | |||
| expired: boolean | |||
| } | |||
| export type Props = { | |||
| onClose: () => void | |||
| } & ExpireNoticeModalPayloadProps | |||
| const i18nPrefix = 'education.notice' | |||
| const ExpireNoticeModal: React.FC<Props> = ({ expireAt, expired, onClose }) => { | |||
| const { t } = useTranslation() | |||
| const docLink = useDocLink() | |||
| const eduDocLink = docLink('/getting-started/dify-for-education') | |||
| const { formatTime } = useTimestamp() | |||
| const setShowPricingModal = useModalContextSelector(s => s.setShowPricingModal) | |||
| const { mutateAsync } = useEducationVerify() | |||
| const router = useRouter() | |||
| const handleVerify = async () => { | |||
| const { token } = await mutateAsync() | |||
| if (token) | |||
| router.push(`/education-apply?token=${token}`) | |||
| } | |||
| const handleConfirm = async () => { | |||
| await handleVerify() | |||
| onClose() | |||
| } | |||
| return ( | |||
| <Modal | |||
| isShow | |||
| onClose={onClose} | |||
| title={expired ? t(`${i18nPrefix}.expired.title`) : t(`${i18nPrefix}.isAboutToExpire.title`, { date: formatTime(expireAt, t(`${i18nPrefix}.dateFormat`) as string), interpolation: { escapeValue: false } })} | |||
| closable | |||
| className='max-w-[600px]' | |||
| > | |||
| <div className='body-md-regular mt-5 space-y-5 text-text-secondary'> | |||
| <div> | |||
| {expired ? (<> | |||
| <div>{t(`${i18nPrefix}.expired.summary.line1`)}</div> | |||
| <div>{t(`${i18nPrefix}.expired.summary.line2`)}</div> | |||
| </> | |||
| ) : t(`${i18nPrefix}.isAboutToExpire.summary`)} | |||
| </div> | |||
| <div> | |||
| <strong className='title-md-semi-bold block'>{t(`${i18nPrefix}.stillInEducation.title`)}</strong> | |||
| {t(`${i18nPrefix}.stillInEducation.${expired ? 'expired' : 'isAboutToExpire'}`)} | |||
| </div> | |||
| <div> | |||
| <strong className='title-md-semi-bold block'>{t(`${i18nPrefix}.alreadyGraduated.title`)}</strong> | |||
| {t(`${i18nPrefix}.alreadyGraduated.${expired ? 'expired' : 'isAboutToExpire'}`)} | |||
| </div> | |||
| </div> | |||
| <div className="mt-7 flex items-center justify-between space-x-2"> | |||
| <Link className='system-xs-regular flex items-center space-x-1 text-text-accent' href={eduDocLink} target="_blank" rel="noopener noreferrer"> | |||
| <div>{t('education.learn')}</div> | |||
| <RiExternalLinkLine className='size-3' /> | |||
| </Link> | |||
| <div className='flex space-x-2'> | |||
| {expired ? ( | |||
| <Button onClick={() => { | |||
| onClose() | |||
| setShowPricingModal() | |||
| }} className='flex items-center space-x-1'> | |||
| <SparklesSoftAccent className='size-4' /> | |||
| <div className='text-components-button-secondary-accent-text'>{t(`${i18nPrefix}.action.upgrade`)}</div> | |||
| </Button> | |||
| ) : ( | |||
| <Button onClick={onClose}> | |||
| {t(`${i18nPrefix}.action.dismiss`)} | |||
| </Button> | |||
| )} | |||
| <Button variant='primary' onClick={handleConfirm}> | |||
| {t(`${i18nPrefix}.action.reVerify`)} | |||
| </Button> | |||
| </div> | |||
| </div> | |||
| </Modal> | |||
| ) | |||
| } | |||
| export default React.memo(ExpireNoticeModal) | |||
| @@ -3,16 +3,26 @@ import { | |||
| useEffect, | |||
| useState, | |||
| } from 'react' | |||
| import { useDebounceFn } from 'ahooks' | |||
| import { useDebounceFn, useLocalStorageState } from 'ahooks' | |||
| import { useSearchParams } from 'next/navigation' | |||
| import type { SearchParams } from './types' | |||
| import { | |||
| EDUCATION_PRICING_SHOW_ACTION, | |||
| EDUCATION_RE_VERIFY_ACTION, | |||
| EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, | |||
| EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION, | |||
| } from './constants' | |||
| import { useEducationAutocomplete } from '@/service/use-education' | |||
| import { useEducationAutocomplete, useEducationVerify } from '@/service/use-education' | |||
| import { useModalContextSelector } from '@/context/modal-context' | |||
| import dayjs from 'dayjs' | |||
| import utc from 'dayjs/plugin/utc' | |||
| import timezone from 'dayjs/plugin/timezone' | |||
| import { useAppContext } from '@/context/app-context' | |||
| import { useRouter } from 'next/navigation' | |||
| import { useProviderContext } from '@/context/provider-context' | |||
| dayjs.extend(utc) | |||
| dayjs.extend(timezone) | |||
| export const useEducation = () => { | |||
| const { | |||
| mutateAsync, | |||
| @@ -50,12 +60,99 @@ export const useEducation = () => { | |||
| } | |||
| } | |||
| type useEducationReverifyNoticeParams = { | |||
| onNotice: ({ | |||
| expireAt, | |||
| expired, | |||
| }: { | |||
| expireAt: number | |||
| expired: boolean | |||
| }) => void | |||
| } | |||
| const isExpired = (expireAt?: number, timezone?: string) => { | |||
| if (!expireAt || !timezone) | |||
| return false | |||
| const today = dayjs().tz(timezone).startOf('day') | |||
| const expiredDay = dayjs.unix(expireAt).tz(timezone).startOf('day') | |||
| return today.isSame(expiredDay) || today.isAfter(expiredDay) | |||
| } | |||
| const useEducationReverifyNotice = ({ | |||
| onNotice, | |||
| }: useEducationReverifyNoticeParams) => { | |||
| const { userProfile: { timezone } } = useAppContext() | |||
| // const [educationInfo, setEducationInfo] = useState<{ is_student: boolean, allow_refresh: boolean, expire_at: number | null } | null>(null) | |||
| // const isLoading = !educationInfo | |||
| const { educationAccountExpireAt, allowRefreshEducationVerify, isLoadingEducationAccountInfo: isLoading } = useProviderContext() | |||
| const [prevExpireAt, setPrevExpireAt] = useLocalStorageState<number | undefined>('education-reverify-prev-expire-at', { | |||
| defaultValue: 0, | |||
| }) | |||
| const [reverifyHasNoticed, setReverifyHasNoticed] = useLocalStorageState<boolean | undefined>('education-reverify-has-noticed', { | |||
| defaultValue: false, | |||
| }) | |||
| const [expiredHasNoticed, setExpiredHasNoticed] = useLocalStorageState<boolean | undefined>('education-expired-has-noticed', { | |||
| defaultValue: false, | |||
| }) | |||
| useEffect(() => { | |||
| if (isLoading || !timezone) | |||
| return | |||
| if (allowRefreshEducationVerify) { | |||
| const expired = isExpired(educationAccountExpireAt!, timezone) | |||
| const isExpireAtChanged = prevExpireAt !== educationAccountExpireAt | |||
| if (isExpireAtChanged) { | |||
| setPrevExpireAt(educationAccountExpireAt!) | |||
| setReverifyHasNoticed(false) | |||
| setExpiredHasNoticed(false) | |||
| } | |||
| const shouldNotice = (() => { | |||
| if (isExpireAtChanged) | |||
| return true | |||
| return expired ? !expiredHasNoticed : !reverifyHasNoticed | |||
| })() | |||
| if (shouldNotice) { | |||
| onNotice({ | |||
| expireAt: educationAccountExpireAt!, | |||
| expired, | |||
| }) | |||
| if (expired) | |||
| setExpiredHasNoticed(true) | |||
| else | |||
| setReverifyHasNoticed(true) | |||
| } | |||
| } | |||
| }, [allowRefreshEducationVerify, timezone]) | |||
| return { | |||
| isLoading, | |||
| expireAt: educationAccountExpireAt!, | |||
| expired: isExpired(educationAccountExpireAt!, timezone), | |||
| } | |||
| } | |||
| export const useEducationInit = () => { | |||
| const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal) | |||
| const setShowPricingModal = useModalContextSelector(s => s.setShowPricingModal) | |||
| const setShowEducationExpireNoticeModal = useModalContextSelector(s => s.setShowEducationExpireNoticeModal) | |||
| const educationVerifying = localStorage.getItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM) | |||
| const searchParams = useSearchParams() | |||
| const educationVerifyAction = searchParams.get('action') | |||
| useEducationReverifyNotice({ | |||
| onNotice: (payload) => { | |||
| setShowEducationExpireNoticeModal({ payload }) | |||
| }, | |||
| }) | |||
| const router = useRouter() | |||
| const { mutateAsync } = useEducationVerify() | |||
| const handleVerify = async () => { | |||
| const { token } = await mutateAsync() | |||
| if (token) | |||
| router.push(`/education-apply?token=${token}`) | |||
| } | |||
| useEffect(() => { | |||
| if (educationVerifying === 'yes' || educationVerifyAction === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION) { | |||
| setShowAccountSettingModal({ payload: 'billing' }) | |||
| @@ -63,5 +160,9 @@ export const useEducationInit = () => { | |||
| if (educationVerifyAction === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION) | |||
| localStorage.setItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, 'yes') | |||
| } | |||
| if (educationVerifyAction === EDUCATION_PRICING_SHOW_ACTION) | |||
| setShowPricingModal() | |||
| if (educationVerifyAction === EDUCATION_RE_VERIFY_ACTION) | |||
| handleVerify() | |||
| }, [setShowAccountSettingModal, educationVerifying, educationVerifyAction]) | |||
| } | |||
| @@ -10,7 +10,7 @@ export default function RoutePrefixHandle() { | |||
| const addPrefixToImg = (e: HTMLImageElement) => { | |||
| const url = new URL(e.src) | |||
| const prefix = url.pathname.slice(0, basePath.length) | |||
| if (prefix !== basePath && !url.href.startsWith('blob:') && !url.href.startsWith('data:')) { | |||
| if (prefix !== basePath && !url.href.startsWith('blob:') && !url.href.startsWith('data:') && !url.href.startsWith('http')) { | |||
| url.pathname = basePath + url.pathname | |||
| e.src = url.toString() | |||
| } | |||
| @@ -26,6 +26,7 @@ import type { UpdatePluginPayload } from '@/app/components/plugins/types' | |||
| import { removeSpecificQueryParam } from '@/utils' | |||
| import { noop } from 'lodash-es' | |||
| import dynamic from 'next/dynamic' | |||
| import type { ExpireNoticeModalPayloadProps } from '@/app/education-apply/expire-notice-modal' | |||
| const AccountSetting = dynamic(() => import('@/app/components/header/account-setting'), { | |||
| ssr: false, | |||
| @@ -64,6 +65,10 @@ const UpdatePlugin = dynamic(() => import('@/app/components/plugins/update-plugi | |||
| ssr: false, | |||
| }) | |||
| const ExpireNoticeModal = dynamic(() => import('@/app/education-apply/expire-notice-modal'), { | |||
| ssr: false, | |||
| }) | |||
| export type ModalState<T> = { | |||
| payload: T | |||
| onCancelCallback?: () => void | |||
| @@ -102,6 +107,7 @@ export type ModalContextState = { | |||
| onAutoAddPromptVariable?: (variable: PromptVariable[]) => void | |||
| }> | null>> | |||
| setShowUpdatePluginModal: Dispatch<SetStateAction<ModalState<UpdatePluginPayload> | null>> | |||
| setShowEducationExpireNoticeModal: Dispatch<SetStateAction<ModalState<ExpireNoticeModalPayloadProps> | null>> | |||
| } | |||
| const ModalContext = createContext<ModalContextState>({ | |||
| setShowAccountSettingModal: noop, | |||
| @@ -116,6 +122,7 @@ const ModalContext = createContext<ModalContextState>({ | |||
| setShowModelLoadBalancingEntryModal: noop, | |||
| setShowOpeningModal: noop, | |||
| setShowUpdatePluginModal: noop, | |||
| setShowEducationExpireNoticeModal: noop, | |||
| }) | |||
| export const useModalContext = () => useContext(ModalContext) | |||
| @@ -145,6 +152,7 @@ export const ModalContextProvider = ({ | |||
| onAutoAddPromptVariable?: (variable: PromptVariable[]) => void | |||
| }> | null>(null) | |||
| const [showUpdatePluginModal, setShowUpdatePluginModal] = useState<ModalState<UpdatePluginPayload> | null>(null) | |||
| const [showEducationExpireNoticeModal, setShowEducationExpireNoticeModal] = useState<ModalState<ExpireNoticeModalPayloadProps> | null>(null) | |||
| const searchParams = useSearchParams() | |||
| const router = useRouter() | |||
| @@ -272,6 +280,7 @@ export const ModalContextProvider = ({ | |||
| setShowModelLoadBalancingEntryModal, | |||
| setShowOpeningModal, | |||
| setShowUpdatePluginModal, | |||
| setShowEducationExpireNoticeModal, | |||
| }}> | |||
| <> | |||
| {children} | |||
| @@ -318,7 +327,7 @@ export const ModalContextProvider = ({ | |||
| <Pricing onCancel={() => { | |||
| if (searchParams.get('show-pricing') === '1') | |||
| router.push(location.pathname, { forceOptimisticNavigation: true } as any) | |||
| removeSpecificQueryParam('action') | |||
| setShowPricingModal(false) | |||
| }} /> | |||
| ) | |||
| @@ -398,6 +407,13 @@ export const ModalContextProvider = ({ | |||
| /> | |||
| ) | |||
| } | |||
| { | |||
| !!showEducationExpireNoticeModal && ( | |||
| <ExpireNoticeModal | |||
| {...showEducationExpireNoticeModal.payload} | |||
| onClose={() => setShowEducationExpireNoticeModal(null)} | |||
| /> | |||
| )} | |||
| </> | |||
| </ModalContext.Provider> | |||
| ) | |||
| @@ -48,6 +48,10 @@ type ProviderContextState = { | |||
| enableEducationPlan: boolean | |||
| isEducationWorkspace: boolean | |||
| isEducationAccount: boolean | |||
| allowRefreshEducationVerify: boolean | |||
| educationAccountExpireAt: number | null | |||
| isLoadingEducationAccountInfo: boolean | |||
| isFetchingEducationAccountInfo: boolean | |||
| webappCopyrightEnabled: boolean | |||
| licenseLimit: { | |||
| workspace_members: { | |||
| @@ -91,6 +95,10 @@ const ProviderContext = createContext<ProviderContextState>({ | |||
| enableEducationPlan: false, | |||
| isEducationWorkspace: false, | |||
| isEducationAccount: false, | |||
| allowRefreshEducationVerify: false, | |||
| educationAccountExpireAt: null, | |||
| isLoadingEducationAccountInfo: false, | |||
| isFetchingEducationAccountInfo: false, | |||
| webappCopyrightEnabled: false, | |||
| licenseLimit: { | |||
| workspace_members: { | |||
| @@ -137,7 +145,7 @@ export const ProviderContextProvider = ({ | |||
| const [enableEducationPlan, setEnableEducationPlan] = useState(false) | |||
| const [isEducationWorkspace, setIsEducationWorkspace] = useState(false) | |||
| const { data: isEducationAccount } = useEducationStatus(!enableEducationPlan) | |||
| const { data: educationAccountInfo, isLoading: isLoadingEducationAccountInfo, isFetching: isFetchingEducationAccountInfo } = useEducationStatus(!enableEducationPlan) | |||
| const [isAllowTransferWorkspace, setIsAllowTransferWorkspace] = useState(false) | |||
| const [isAllowPublishAsKnowledgePipeline, setIsAllowPublishAsKnowledgePipeline] = useState(false) | |||
| @@ -228,7 +236,11 @@ export const ProviderContextProvider = ({ | |||
| datasetOperatorEnabled, | |||
| enableEducationPlan, | |||
| isEducationWorkspace, | |||
| isEducationAccount: isEducationAccount?.result || false, | |||
| isEducationAccount: educationAccountInfo?.is_student || false, | |||
| allowRefreshEducationVerify: educationAccountInfo?.allow_refresh || false, | |||
| educationAccountExpireAt: educationAccountInfo?.expire_at || null, | |||
| isLoadingEducationAccountInfo, | |||
| isFetchingEducationAccountInfo, | |||
| webappCopyrightEnabled, | |||
| licenseLimit, | |||
| refreshLicenseLimit: fetchPlan, | |||
| @@ -1,19 +1,18 @@ | |||
| ## library | |||
| * i18next | |||
| * react-i18next | |||
| - i18next | |||
| - react-i18next | |||
| ## hooks | |||
| * useTranslation | |||
| * useGetLanguage | |||
| * useI18N | |||
| * useRenderI18nObject | |||
| - useTranslation | |||
| - useGetLanguage | |||
| - useI18N | |||
| - useRenderI18nObject | |||
| ## impl | |||
| * App Boot | |||
| - App Boot | |||
| - app/layout.tsx load i18n and init context | |||
| - use `<I18nServer/>` | |||
| - read locale with `getLocaleOnServer` (in node.js) | |||
| @@ -23,9 +22,9 @@ | |||
| - init i18n context | |||
| - `setLocaleOnClient` | |||
| - `changeLanguage` (defined in i18n/i18next-config, also init i18n resources (side effects)) | |||
| * is `i18next.changeLanguage` | |||
| * all languages text is merge & load in FrontEnd as .js (see i18n/i18next-config) | |||
| * i18n context | |||
| - is `i18next.changeLanguage` | |||
| - all languages text is merge & load in FrontEnd as .js (see i18n/i18next-config) | |||
| - i18n context | |||
| - `locale` - current locale code (ex `eu-US`, `zh-Hans`) | |||
| - `i18n` - useless | |||
| - `setLocaleOnClient` - used by App Boot and user change language | |||
| @@ -33,17 +32,17 @@ | |||
| ### load i18n resources | |||
| - client: i18n/i18next-config.ts | |||
| * ns = camalCase(filename) | |||
| * ex: `app/components/datasets/create/embedding-process/index.tsx` | |||
| * `t('datasetSettings.form.retrievalSetting.title')` | |||
| - ns = camalCase(filename) | |||
| - ex: `app/components/datasets/create/embedding-process/index.tsx` | |||
| - `t('datasetSettings.form.retrievalSetting.title')` | |||
| - server: i18n/server.ts | |||
| * ns = filename | |||
| * ex: `app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/settings/page.tsx` | |||
| * `translate(locale, 'dataset-settings')` | |||
| - ns = filename | |||
| - ex: `app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/settings/page.tsx` | |||
| - `translate(locale, 'dataset-settings')` | |||
| ## TODO | |||
| * [ ] ts docs for useGetLanguage | |||
| * [ ] ts docs for useI18N | |||
| * [ ] client docs for i18n | |||
| * [ ] server docs for i18n | |||
| - [ ] ts docs for useGetLanguage | |||
| - [ ] ts docs for useI18N | |||
| - [ ] client docs for i18n | |||
| - [ ] server docs for i18n | |||
| @@ -53,7 +53,7 @@ cp -r en-US fr-FR | |||
| 2. Modify the translation files in the new folder. | |||
| 3. Add type to new language in the `language.ts` file. | |||
| 1. Add type to new language in the `language.ts` file. | |||
| ```typescript | |||
| export type I18nText = { | |||
| @@ -163,10 +163,8 @@ export const languages = [ | |||
| 5. Don't forget to mark the supported field as `true` if the language is supported. | |||
| 6. Sometime you might need to do some changes in the server side. Please change this file as well. 👇 | |||
| https://github.com/langgenius/dify/blob/61e4bbabaf2758354db4073cbea09fdd21a5bec1/api/constants/languages.py#L5 | |||
| 1. Sometime you might need to do some changes in the server side. Please change this file as well. 👇 | |||
| https://github.com/langgenius/dify/blob/61e4bbabaf2758354db4073cbea09fdd21a5bec1/api/constants/languages.py#L5 | |||
| ## Clean Up | |||
| @@ -2,6 +2,7 @@ const translation = { | |||
| title: 'Protokolle', | |||
| description: 'Die Protokolle zeichnen den Betriebsstatus der Anwendung auf, einschließlich Benutzereingaben und KI-Antworten.', | |||
| dateTimeFormat: 'MM/DD/YYYY hh:mm A', | |||
| dateFormat: 'MM/DD/YYYY', | |||
| table: { | |||
| header: { | |||
| updatedTime: 'Aktualisierungszeit', | |||
| @@ -42,6 +42,34 @@ const translation = { | |||
| learn: 'Erfahren Sie, wie Sie Ihre Ausbildung überprüfen lassen.', | |||
| emailLabel: 'Ihre aktuelle E-Mail', | |||
| successTitle: 'Sie haben die Dify-Ausbildung verifiziert', | |||
| notice: { | |||
| expired: { | |||
| summary: { | |||
| line1: 'Sie können weiterhin auf Dify zugreifen und es nutzen.', | |||
| line2: 'Allerdings sind Sie nicht mehr berechtigt, neue Bildungsgutscheine zu erhalten.', | |||
| }, | |||
| title: 'Ihr Bildungsstatus ist abgelaufen.', | |||
| }, | |||
| isAboutToExpire: { | |||
| summary: 'Keine Sorge - das wird sich nicht auf Ihr aktuelles Abonnement auswirken, aber Sie werden den Bildungspreis beim nächsten Verzicht nicht erhalten, es sei denn, Sie überprüfen Ihren Status erneut.', | |||
| }, | |||
| stillInEducation: { | |||
| title: 'Immer noch in der Ausbildung?', | |||
| isAboutToExpire: 'Überprüfen Sie jetzt erneut, um einen neuen Gutschein für das kommende Studienjahr zu erhalten. Er wird in Ihrem Konto gespeichert und ist bereit zur Nutzung bei Ihrer nächsten Verlängerung.', | |||
| expired: 'Überprüfen Sie jetzt erneut, um einen neuen Gutschein für das kommende akademische Jahr zu erhalten. Wir fügen ihn Ihrem Konto hinzu und Sie können ihn für das nächste Upgrade verwenden.', | |||
| }, | |||
| alreadyGraduated: { | |||
| title: 'Bereits abgeschlossen?', | |||
| expired: 'Fühlen Sie sich frei, jederzeit ein Upgrade durchzuführen, um vollen Zugriff auf die kostenpflichtigen Funktionen zu erhalten.', | |||
| isAboutToExpire: 'Ihr aktuelles Abonnement bleibt weiterhin aktiv. Wenn es endet, werden Sie auf den Sandbox-Plan umgestellt, oder Sie können jederzeit upgraden, um den vollen Zugang zu den kostenpflichtigen Funktionen wiederherzustellen.', | |||
| }, | |||
| action: { | |||
| dismiss: 'Ablehnen', | |||
| upgrade: 'Upgrade', | |||
| reVerify: 'Überprüfen Sie es erneut', | |||
| }, | |||
| dateFormat: 'MM/TT/JJJJ', | |||
| }, | |||
| } | |||
| export default translation | |||
| @@ -2,6 +2,7 @@ const translation = { | |||
| title: 'Logs', | |||
| description: 'The logs record the running status of the application, including user inputs and AI replies.', | |||
| dateTimeFormat: 'MM/DD/YYYY hh:mm A', | |||
| dateFormat: 'MM/DD/YYYY', | |||
| table: { | |||
| header: { | |||
| updatedTime: 'Updated time', | |||
| @@ -42,6 +42,35 @@ const translation = { | |||
| rejectTitle: 'Your Dify Educational Verification Has Been Rejected', | |||
| rejectContent: 'Unfortunately, you are not eligible for Education Verified status and therefore cannot receive the exclusive 100% coupon for the Dify Professional Plan if you use this email address.', | |||
| emailLabel: 'Your current email', | |||
| notice: { | |||
| dateFormat: 'MM/DD/YYYY', | |||
| expired: { | |||
| title: 'Your education status has expired', | |||
| summary: { | |||
| line1: 'You can still access and use Dify. ', | |||
| line2: 'However, you\'re no longer eligible for new education discount coupons.', | |||
| }, | |||
| }, | |||
| isAboutToExpire: { | |||
| title: 'Your education status will expire on {{date}}', | |||
| summary: 'Don\'t worry — this won\'t affect your current subscription, but you won\'t get the education discount when it renews unless you verify your status again.', | |||
| }, | |||
| stillInEducation: { | |||
| title: 'Still in education?', | |||
| expired: 'Re-verify now to get a new coupon for the upcoming academic year. We\'ll add it to your account and you can use it for the next upgrade.', | |||
| isAboutToExpire: 'Re-verify now to get a new coupon for the upcoming academic year. It\'ll be saved to your account and ready to use at your next renewal.', | |||
| }, | |||
| alreadyGraduated: { | |||
| title: 'Already graduated?', | |||
| expired: 'Feel free to upgrade anytime to get full access to paid features.', | |||
| isAboutToExpire: 'Your current subscription will still remain active. When it ends, you\'ll be moved to the Sandbox plan, or you can upgrade anytime to restore full access to paid features.', | |||
| }, | |||
| action: { | |||
| dismiss: 'Dismiss', | |||
| upgrade: 'Upgrade', | |||
| reVerify: 'Re-verify', | |||
| }, | |||
| }, | |||
| } | |||
| export default translation | |||
| @@ -93,6 +93,7 @@ const translation = { | |||
| iteration: 'Iteración', | |||
| finalProcessing: 'Procesamiento Final', | |||
| }, | |||
| dateFormat: 'DD/MM/YYYY', | |||
| } | |||
| export default translation | |||
| @@ -42,6 +42,34 @@ const translation = { | |||
| rejectTitle: 'Su verificación educativa de Dify ha sido rechazada.', | |||
| currentSigned: 'ACTUALMENTE CONECTADO COMO', | |||
| rejectContent: 'Desafortunadamente, no eres elegible para el estado de Educación Verificada y, por lo tanto, no puedes recibir el exclusivo cupón del 100% para el Plan Profesional de Dify si utilizas esta dirección de correo electrónico.', | |||
| notice: { | |||
| expired: { | |||
| summary: { | |||
| line1: 'Todavía puedes acceder y usar Dify.', | |||
| line2: 'Sin embargo, ya no eres elegible para nuevos cupones de descuento educativo.', | |||
| }, | |||
| title: 'Tu estado de educación ha expirado', | |||
| }, | |||
| isAboutToExpire: { | |||
| summary: 'No te preocupes, esto no afectará tu suscripción actual, pero no obtendrás el descuento educativo cuando se renueve a menos que verifiques tu estado nuevamente.', | |||
| }, | |||
| stillInEducation: { | |||
| title: '¿Aún en educación?', | |||
| expired: 'Verifica de nuevo ahora para obtener un nuevo cupón para el próximo año académico. Lo añadiremos a tu cuenta y podrás usarlo para la próxima actualización.', | |||
| isAboutToExpire: 'Verifica de nuevo ahora para obtener un nuevo cupón para el próximo año académico. Se guardará en tu cuenta y estará listo para usar en tu próxima renovación.', | |||
| }, | |||
| alreadyGraduated: { | |||
| title: '¿Ya te has graduado?', | |||
| isAboutToExpire: 'Tu suscripción actual seguirá activa. Cuando termine, serás trasladado al plan Sandbox, o puedes actualizar en cualquier momento para restaurar el acceso completo a las funciones de pago.', | |||
| expired: 'Siéntete libre de actualizar en cualquier momento para obtener acceso completo a las funciones de pago.', | |||
| }, | |||
| action: { | |||
| reVerify: 'Re-verificar', | |||
| upgrade: 'Actualizar', | |||
| dismiss: 'Descartar', | |||
| }, | |||
| dateFormat: 'DD/MM/YYYY', | |||
| }, | |||
| } | |||
| export default translation | |||
| @@ -93,6 +93,7 @@ const translation = { | |||
| iteration: 'تکرار', | |||
| finalProcessing: 'پردازش نهایی', | |||
| }, | |||
| dateFormat: 'MM/DD/YYYY', | |||
| } | |||
| export default translation | |||
| @@ -42,6 +42,34 @@ const translation = { | |||
| rejectTitle: 'تأییدیه آموزشی دیفی شما رد شده است', | |||
| submit: 'ارسال', | |||
| successTitle: 'شما آموزش دیفی تأیید شده دارید', | |||
| notice: { | |||
| expired: { | |||
| summary: { | |||
| line1: 'شما هنوز میتوانید به دیفی دسترسی داشته باشید و از آن استفاده کنید.', | |||
| line2: 'با این حال، شما دیگر واجد شرایط برای دریافت کوپنهای تخفیف آموزشی جدید نیستید.', | |||
| }, | |||
| title: 'وضعیت تحصیلی شما منقضی شده است', | |||
| }, | |||
| isAboutToExpire: { | |||
| summary: 'نگران نباشید — این بر اشتراک فعلی شما تأثیر نخواهد گذاشت، اما زمانیکه تمدید شود، شما تخفیف آموزشی را دریافت نخواهید کرد مگر اینکه وضعیت خود را دوباره تأیید کنید.', | |||
| }, | |||
| stillInEducation: { | |||
| title: 'آیا هنوز در حال تحصیل هستید؟', | |||
| expired: 'هماکنون دوباره تأیید کنید تا یک کوپن جدید برای سال تحصیلی آینده دریافت کنید. ما آن را به حساب شما اضافه خواهیم کرد و میتوانید از آن برای ارتقاء بعدی استفاده کنید.', | |||
| isAboutToExpire: 'در حال حاضر دوباره تأیید کنید تا یک کوپن جدید برای سال تحصیلی آینده دریافت کنید. این کوپن به حساب شما ذخیره خواهد شد و در زمان تمدید بعدی شما آماده استفاده است.', | |||
| }, | |||
| alreadyGraduated: { | |||
| title: 'قبلاً فارغالتحصیل شدهای؟', | |||
| expired: 'هر زمان که بخواهید میتوانید ارتقا دهید تا دسترسی کامل به ویژگیهای پرداختی داشته باشید.', | |||
| isAboutToExpire: 'اشتراک فعلی شما همچنان فعال خواهد ماند. وقتی که به پایان رسید، به طرح Sandbox منتقل خواهید شد، یا میتوانید هر زمان به منظور بازگرداندن دسترسی کامل به ویژگیهای پرداختی، ارتقا دهید.', | |||
| }, | |||
| action: { | |||
| dismiss: 'رد کردن', | |||
| upgrade: 'ارتقاء', | |||
| reVerify: 'دوباره تأیید کنید', | |||
| }, | |||
| dateFormat: 'MM/DD/YYYY', | |||
| }, | |||
| } | |||
| export default translation | |||
| @@ -93,6 +93,7 @@ const translation = { | |||
| iteration: 'Itération', | |||
| finalProcessing: 'Traitement final', | |||
| }, | |||
| dateFormat: 'JJ/MM/YYYY', | |||
| } | |||
| export default translation | |||