Skip to content

Commit 49f8eff

Browse files
author
liq
committed
Merge remote-tracking branch 'upstream/main' into dev
# Conflicts: # web/app/components/app/configuration/config/agent/agent-tools/index.tsx
2 parents 7d4a34f + b7ff98d commit 49f8eff

File tree

716 files changed

+17244
-16634
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

716 files changed

+17244
-16634
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,4 @@ pyrightconfig.json
178178
api/.vscode
179179

180180
.idea/
181+
.vscode

CONTRIBUTING_VI.md

+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
Thật tuyệt vời khi bạn muốn đóng góp cho Dify! Chúng tôi rất mong chờ được thấy những gì bạn sẽ làm. Là một startup với nguồn nhân lực và tài chính hạn chế, chúng tôi có tham vọng lớn là thiết kế quy trình trực quan nhất để xây dựng và quản lý các ứng dụng LLM. Mọi sự giúp đỡ từ cộng đồng đều rất quý giá đối với chúng tôi.
2+
3+
Chúng tôi cần linh hoạt và làm việc nhanh chóng, nhưng đồng thời cũng muốn đảm bảo các cộng tác viên như bạn có trải nghiệm đóng góp thuận lợi nhất có thể. Chúng tôi đã tạo ra hướng dẫn đóng góp này nhằm giúp bạn làm quen với codebase và cách chúng tôi làm việc với các cộng tác viên, để bạn có thể nhanh chóng bắt tay vào phần thú vị.
4+
5+
Hướng dẫn này, cũng như bản thân Dify, đang trong quá trình cải tiến liên tục. Chúng tôi rất cảm kích sự thông cảm của bạn nếu đôi khi nó không theo kịp dự án thực tế, và chúng tôi luôn hoan nghênh mọi phản hồi để cải thiện.
6+
7+
Về vấn đề cấp phép, xin vui lòng dành chút thời gian đọc qua [Thỏa thuận Cấp phép và Đóng góp](./LICENSE) ngắn gọn của chúng tôi. Cộng đồng cũng tuân thủ [quy tắc ứng xử](https://github.com/langgenius/.github/blob/main/CODE_OF_CONDUCT.md).
8+
9+
## Trước khi bắt đầu
10+
11+
[Tìm kiếm](https://github.com/langgenius/dify/issues?q=is:issue+is:closed) một vấn đề hiện có, hoặc [tạo mới](https://github.com/langgenius/dify/issues/new/choose) một vấn đề. Chúng tôi phân loại các vấn đề thành 2 loại:
12+
13+
### Yêu cầu tính năng:
14+
15+
* Nếu bạn đang tạo một yêu cầu tính năng mới, chúng tôi muốn bạn giải thích tính năng đề xuất sẽ đạt được điều gì và cung cấp càng nhiều thông tin chi tiết càng tốt. [@perzeusss](https://github.com/perzeuss) đã tạo một [Trợ lý Yêu cầu Tính năng](https://udify.app/chat/MK2kVSnw1gakVwMX) rất hữu ích để giúp bạn soạn thảo nhu cầu của mình. Hãy thử dùng nó nhé.
16+
17+
* Nếu bạn muốn chọn một vấn đề từ danh sách hiện có, chỉ cần để lại bình luận dưới vấn đề đó nói rằng bạn sẽ làm.
18+
19+
Một thành viên trong nhóm làm việc trong lĩnh vực liên quan sẽ được thông báo. Nếu mọi thứ ổn, họ sẽ cho phép bạn bắt đầu code. Chúng tôi yêu cầu bạn chờ đợi cho đến lúc đó trước khi bắt tay vào làm tính năng, để không lãng phí công sức của bạn nếu chúng tôi đề xuất thay đổi.
20+
21+
Tùy thuộc vào lĩnh vực mà tính năng đề xuất thuộc về, bạn có thể nói chuyện với các thành viên khác nhau trong nhóm. Dưới đây là danh sách các lĩnh vực mà các thành viên trong nhóm chúng tôi đang làm việc hiện tại:
22+
23+
| Thành viên | Phạm vi |
24+
| ------------------------------------------------------------ | ---------------------------------------------------- |
25+
| [@yeuoly](https://github.com/Yeuoly) | Thiết kế kiến trúc Agents |
26+
| [@jyong](https://github.com/JohnJyong) | Thiết kế quy trình RAG |
27+
| [@GarfieldDai](https://github.com/GarfieldDai) | Xây dựng quy trình làm việc |
28+
| [@iamjoel](https://github.com/iamjoel) & [@zxhlyh](https://github.com/zxhlyh) | Làm cho giao diện người dùng dễ sử dụng |
29+
| [@guchenhe](https://github.com/guchenhe) & [@crazywoola](https://github.com/crazywoola) | Trải nghiệm nhà phát triển, đầu mối liên hệ cho mọi vấn đề |
30+
| [@takatost](https://github.com/takatost) | Định hướng và kiến trúc tổng thể sản phẩm |
31+
32+
Cách chúng tôi ưu tiên:
33+
34+
| Loại tính năng | Mức độ ưu tiên |
35+
| ------------------------------------------------------------ | -------------- |
36+
| Tính năng ưu tiên cao được gắn nhãn bởi thành viên trong nhóm | Ưu tiên cao |
37+
| 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) của chúng tôi | Ưu tiên trung bình |
38+
| Tính năng không quan trọng và cải tiến nhỏ | Ưu tiên thấp |
39+
| Có giá trị nhưng không cấp bách | Tính năng tương lai |
40+
41+
### Những vấn đề khác (ví dụ: báo cáo lỗi, tối ưu hiệu suất, sửa lỗi chính tả):
42+
43+
* Bắt đầu code ngay lập tức.
44+
45+
Cách chúng tôi ưu tiên:
46+
47+
| Loại vấn đề | Mức độ ưu tiên |
48+
| ------------------------------------------------------------ | -------------- |
49+
| Lỗi trong các chức năng chính (không thể đăng nhập, ứng dụng không hoạt động, lỗ hổng bảo mật) | Nghiêm trọng |
50+
| Lỗi không quan trọng, cải thiện hiệu suất | Ưu tiên trung bình |
51+
| Sửa lỗi nhỏ (lỗi chính tả, giao diện người dùng gây nhầm lẫn nhưng vẫn hoạt động) | Ưu tiên thấp |
52+
53+
54+
## Cài đặt
55+
56+
Dưới đây là các bước để thiết lập Dify cho việc phát triển:
57+
58+
### 1. Fork repository này
59+
60+
### 2. Clone repository
61+
62+
Clone repository đã fork từ terminal của bạn:
63+
64+
```
65+
git clone [email protected]:<tên_người_dùng_github>/dify.git
66+
```
67+
68+
### 3. Kiểm tra các phụ thuộc
69+
70+
Dify yêu cầu các phụ thuộc sau để build, hãy đảm bảo chúng đã được cài đặt trên hệ thống của bạn:
71+
72+
- [Docker](https://www.docker.com/)
73+
- [Docker Compose](https://docs.docker.com/compose/install/)
74+
- [Node.js v18.x (LTS)](http://nodejs.org)
75+
- [npm](https://www.npmjs.com/) phiên bản 8.x.x hoặc [Yarn](https://yarnpkg.com/)
76+
- [Python](https://www.python.org/) phiên bản 3.10.x
77+
78+
### 4. Cài đặt
79+
80+
Dify bao gồm một backend và một frontend. Đi đến thư mục backend bằng lệnh `cd api/`, sau đó làm theo hướng dẫn trong [README của Backend](api/README.md) để cài đặt. Trong một terminal khác, đi đến thư mục frontend bằng lệnh `cd web/`, sau đó làm theo hướng dẫn trong [README của Frontend](web/README.md) để cài đặt.
81+
82+
Kiểm tra [FAQ về cài đặt](https://docs.dify.ai/learn-more/faq/self-host-faq) để xem danh sách các vấn đề thường gặp và các bước khắc phục.
83+
84+
### 5. Truy cập Dify trong trình duyệt của bạn
85+
86+
Để xác nhận cài đặt của bạn, hãy truy cập [http://localhost:3000](http://localhost:3000) (địa chỉ mặc định, hoặc URL và cổng bạn đã cấu hình) trong trình duyệt. Bạn sẽ thấy Dify đang chạy.
87+
88+
## Phát triển
89+
90+
Nếu bạn đang thêm một nhà cung cấp mô hình, [hướng dẫn này](https://github.com/langgenius/dify/blob/main/api/core/model_runtime/README.md) dành cho bạn.
91+
92+
Nếu bạn đang thêm một nhà cung cấp công cụ cho Agent hoặc Workflow, [hướng dẫn này](./api/core/tools/README.md) dành cho bạn.
93+
94+
Để giúp bạn nhanh chóng định hướng phần đóng góp của mình, dưới đây là một bản phác thảo ngắn gọn về cấu trúc backend & frontend của Dify:
95+
96+
### Backend
97+
98+
Backend của Dify được viết bằng Python sử dụng [Flask](https://flask.palletsprojects.com/en/3.0.x/). Nó sử dụng [SQLAlchemy](https://www.sqlalchemy.org/) cho ORM và [Celery](https://docs.celeryq.dev/en/stable/getting-started/introduction.html) cho hàng đợi tác vụ. Logic xác thực được thực hiện thông qua Flask-login.
99+
100+
```
101+
[api/]
102+
├── constants // Các cài đặt hằng số được sử dụng trong toàn bộ codebase.
103+
├── controllers // Định nghĩa các route API và logic xử lý yêu cầu.
104+
├── core // Điều phối ứng dụng cốt lõi, tích hợp mô hình và công cụ.
105+
├── docker // Cấu hình liên quan đến Docker & containerization.
106+
├── events // Xử lý và xử lý sự kiện
107+
├── extensions // Mở rộng với các framework/nền tảng bên thứ 3.
108+
├── fields // Định nghĩa trường cho serialization/marshalling.
109+
├── libs // Thư viện và tiện ích có thể tái sử dụng.
110+
├── migrations // Script cho việc di chuyển cơ sở dữ liệu.
111+
├── models // Mô hình cơ sở dữ liệu & định nghĩa schema.
112+
├── services // Xác định logic nghiệp vụ.
113+
├── storage // Lưu trữ khóa riêng tư.
114+
├── tasks // Xử lý các tác vụ bất đồng bộ và công việc nền.
115+
└── tests
116+
```
117+
118+
### Frontend
119+
120+
Website được khởi tạo trên boilerplate [Next.js](https://nextjs.org/) bằng Typescript và sử dụng [Tailwind CSS](https://tailwindcss.com/) cho styling. [React-i18next](https://react.i18next.com/) được sử dụng cho việc quốc tế hóa.
121+
122+
```
123+
[web/]
124+
├── app // layouts, pages và components
125+
│ ├── (commonLayout) // layout chung được sử dụng trong toàn bộ ứng dụng
126+
│ ├── (shareLayout) // layouts được chia sẻ cụ thể cho các phiên dựa trên token
127+
│ ├── activate // trang kích hoạt
128+
│ ├── components // được chia sẻ bởi các trang và layouts
129+
│ ├── install // trang cài đặt
130+
│ ├── signin // trang đăng nhập
131+
│ └── styles // styles được chia sẻ toàn cục
132+
├── assets // Tài nguyên tĩnh
133+
├── bin // scripts chạy ở bước build
134+
├── config // cài đặt và tùy chọn có thể điều chỉnh
135+
├── context // contexts được chia sẻ bởi các phần khác nhau của ứng dụng
136+
├── dictionaries // File dịch cho từng ngôn ngữ
137+
├── docker // cấu hình container
138+
├── hooks // Hooks có thể tái sử dụng
139+
├── i18n // Cấu hình quốc tế hóa
140+
├── models // mô tả các mô hình dữ liệu & hình dạng của phản hồi API
141+
├── public // tài nguyên meta như favicon
142+
├── service // xác định hình dạng của các hành động API
143+
├── test
144+
├── types // mô tả các tham số hàm và giá trị trả về
145+
└── utils // Các hàm tiện ích được chia sẻ
146+
```
147+
148+
## Gửi PR của bạn
149+
150+
Cuối cùng, đã đến lúc mở một pull request (PR) đến repository của chúng tôi. Đối với các tính năng lớn, chúng tôi sẽ merge chúng vào nhánh `deploy/dev` để kiểm tra trước khi đưa vào nhánh `main`. Nếu bạn gặp vấn đề như xung đột merge hoặc không biết cách mở pull request, hãy xem [hướng dẫn về pull request của GitHub](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests).
151+
152+
Và thế là xong! Khi PR của bạn được merge, bạn sẽ được giới thiệu là một người đóng góp trong [README](https://github.com/langgenius/dify/blob/main/README.md) của chúng tôi.
153+
154+
## Nhận trợ giúp
155+
156+
Nếu bạn gặp khó khăn hoặc có câu hỏi cấp bách trong quá trình đóng góp, hãy đặt câu hỏi của bạn trong vấn đề GitHub liên quan, hoặc tham gia [Discord](https://discord.gg/8Tpq4AcN9c) của chúng tôi để trò chuyện nhanh chóng.

api/.env.example

+12-3
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,8 @@ API_TOOL_DEFAULT_READ_TIMEOUT=60
247247
HTTP_REQUEST_MAX_CONNECT_TIMEOUT=300
248248
HTTP_REQUEST_MAX_READ_TIMEOUT=600
249249
HTTP_REQUEST_MAX_WRITE_TIMEOUT=600
250-
HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760 # 10MB
251-
HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576 # 1MB
250+
HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760
251+
HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576
252252

253253
# Log file path
254254
LOG_FILE=
@@ -267,4 +267,13 @@ APP_MAX_ACTIVE_REQUESTS=0
267267

268268

269269
# Celery beat configuration
270-
CELERY_BEAT_SCHEDULER_TIME=1
270+
CELERY_BEAT_SCHEDULER_TIME=1
271+
272+
# Position configuration
273+
POSITION_TOOL_PINS=
274+
POSITION_TOOL_INCLUDES=
275+
POSITION_TOOL_EXCLUDES=
276+
277+
POSITION_PROVIDER_PINS=
278+
POSITION_PROVIDER_INCLUDES=
279+
POSITION_PROVIDER_EXCLUDES=

.idea/icon.png api/.idea/icon.png

File renamed without changes.

.idea/vcs.xml api/.idea/vcs.xml

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.vscode/launch.json api/.vscode/launch.json.example

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"name": "Python: Flask",
66
"type": "debugpy",
77
"request": "launch",
8-
"python": "${workspaceFolder}/api/.venv/bin/python",
9-
"cwd": "${workspaceFolder}/api",
8+
"python": "${workspaceFolder}/.venv/bin/python",
9+
"cwd": "${workspaceFolder}",
1010
"envFile": ".env",
1111
"module": "flask",
1212
"justMyCode": true,
@@ -18,15 +18,15 @@
1818
"args": [
1919
"run",
2020
"--host=0.0.0.0",
21-
"--port=5001",
21+
"--port=5001"
2222
]
2323
},
2424
{
2525
"name": "Python: Celery",
2626
"type": "debugpy",
2727
"request": "launch",
28-
"python": "${workspaceFolder}/api/.venv/bin/python",
29-
"cwd": "${workspaceFolder}/api",
28+
"python": "${workspaceFolder}/.venv/bin/python",
29+
"cwd": "${workspaceFolder}",
3030
"module": "celery",
3131
"justMyCode": true,
3232
"envFile": ".env",

api/Dockerfile

+10-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ WORKDIR /app/api
55

66
# Install Poetry
77
ENV POETRY_VERSION=1.8.3
8+
9+
# if you located in China, you can use aliyun mirror to speed up
10+
# RUN pip install --no-cache-dir poetry==${POETRY_VERSION} -i https://mirrors.aliyun.com/pypi/simple/
11+
812
RUN pip install --no-cache-dir poetry==${POETRY_VERSION}
913

1014
# Configure Poetry
@@ -16,6 +20,9 @@ ENV POETRY_REQUESTS_TIMEOUT=15
1620

1721
FROM base AS packages
1822

23+
# if you located in China, you can use aliyun mirror to speed up
24+
# RUN sed -i '[email protected]@mirrors.aliyun.com@g' /etc/apt/sources.list.d/debian.sources
25+
1926
RUN apt-get update \
2027
&& apt-get install -y --no-install-recommends gcc g++ libc-dev libffi-dev libgmp-dev libmpfr-dev libmpc-dev
2128

@@ -43,6 +50,8 @@ WORKDIR /app/api
4350

4451
RUN apt-get update \
4552
&& apt-get install -y --no-install-recommends curl nodejs libgmp-dev libmpfr-dev libmpc-dev \
53+
# if you located in China, you can use aliyun mirror to speed up
54+
# && echo "deb http://mirrors.aliyun.com/debian testing main" > /etc/apt/sources.list \
4655
&& echo "deb http://deb.debian.org/debian testing main" > /etc/apt/sources.list \
4756
&& apt-get update \
4857
# For Security
@@ -56,7 +65,7 @@ COPY --from=packages ${VIRTUAL_ENV} ${VIRTUAL_ENV}
5665
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
5766

5867
# Download nltk data
59-
RUN python -c "import nltk; nltk.download('punkt')"
68+
RUN python -c "import nltk; nltk.download('punkt'); nltk.download('averaged_perceptron_tagger')"
6069

6170
# Copy source code
6271
COPY . /app/api/

api/configs/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from .app_config import DifyConfig
22

3-
dify_config = DifyConfig()
3+
dify_config = DifyConfig()

api/configs/app_config.py

+7-34
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from pydantic import Field, computed_field
21
from pydantic_settings import SettingsConfigDict
32

43
from configs.deploy import DeploymentConfig
@@ -24,42 +23,16 @@ class DifyConfig(
2423
# **Before using, please contact [email protected] by email to inquire about licensing matters.**
2524
EnterpriseFeatureConfig,
2625
):
27-
DEBUG: bool = Field(default=False, description='whether to enable debug mode.')
28-
2926
model_config = SettingsConfigDict(
3027
# read from dotenv format config file
31-
env_file='.env',
32-
env_file_encoding='utf-8',
28+
env_file=".env",
29+
env_file_encoding="utf-8",
3330
frozen=True,
3431
# ignore extra attributes
35-
extra='ignore',
32+
extra="ignore",
3633
)
3734

38-
CODE_MAX_NUMBER: int = 9223372036854775807
39-
CODE_MIN_NUMBER: int = -9223372036854775808
40-
CODE_MAX_STRING_LENGTH: int = 80000
41-
CODE_MAX_STRING_ARRAY_LENGTH: int = 30
42-
CODE_MAX_OBJECT_ARRAY_LENGTH: int = 30
43-
CODE_MAX_NUMBER_ARRAY_LENGTH: int = 1000
44-
45-
HTTP_REQUEST_MAX_CONNECT_TIMEOUT: int = 300
46-
HTTP_REQUEST_MAX_READ_TIMEOUT: int = 600
47-
HTTP_REQUEST_MAX_WRITE_TIMEOUT: int = 600
48-
HTTP_REQUEST_NODE_MAX_BINARY_SIZE: int = 1024 * 1024 * 10
49-
50-
@computed_field
51-
def HTTP_REQUEST_NODE_READABLE_MAX_BINARY_SIZE(self) -> str:
52-
return f'{self.HTTP_REQUEST_NODE_MAX_BINARY_SIZE / 1024 / 1024:.2f}MB'
53-
54-
HTTP_REQUEST_NODE_MAX_TEXT_SIZE: int = 1024 * 1024
55-
56-
@computed_field
57-
def HTTP_REQUEST_NODE_READABLE_MAX_TEXT_SIZE(self) -> str:
58-
return f'{self.HTTP_REQUEST_NODE_MAX_TEXT_SIZE / 1024 / 1024:.2f}MB'
59-
60-
SSRF_PROXY_HTTP_URL: str | None = None
61-
SSRF_PROXY_HTTPS_URL: str | None = None
62-
63-
MODERATION_BUFFER_SIZE: int = Field(default=300, description='The buffer size for moderation.')
64-
65-
MAX_VARIABLE_SIZE: int = Field(default=5 * 1024, description='The maximum size of a variable. default is 5KB.')
35+
# Before adding any config,
36+
# please consider to arrange it in the proper config group of existed or added
37+
# for better readability and maintainability.
38+
# Thanks for your concentration and consideration.

api/configs/deploy/__init__.py

+13-7
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,28 @@ class DeploymentConfig(BaseSettings):
66
"""
77
Deployment configs
88
"""
9+
910
APPLICATION_NAME: str = Field(
10-
description='application name',
11-
default='langgenius/dify',
11+
description="application name",
12+
default="langgenius/dify",
13+
)
14+
15+
DEBUG: bool = Field(
16+
description="whether to enable debug mode.",
17+
default=False,
1218
)
1319

1420
TESTING: bool = Field(
15-
description='',
21+
description="",
1622
default=False,
1723
)
1824

1925
EDITION: str = Field(
20-
description='deployment edition',
21-
default='SELF_HOSTED',
26+
description="deployment edition",
27+
default="SELF_HOSTED",
2228
)
2329

2430
DEPLOY_ENV: str = Field(
25-
description='deployment environment, default to PRODUCTION.',
26-
default='PRODUCTION',
31+
description="deployment environment, default to PRODUCTION.",
32+
default="PRODUCTION",
2733
)

api/configs/enterprise/__init__.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ class EnterpriseFeatureConfig(BaseSettings):
77
Enterprise feature configs.
88
**Before using, please contact [email protected] by email to inquire about licensing matters.**
99
"""
10+
1011
ENTERPRISE_ENABLED: bool = Field(
11-
description='whether to enable enterprise features.'
12-
'Before using, please contact [email protected] by email to inquire about licensing matters.',
12+
description="whether to enable enterprise features."
13+
"Before using, please contact [email protected] by email to inquire about licensing matters.",
1314
default=False,
1415
)
1516

1617
CAN_REPLACE_LOGO: bool = Field(
17-
description='whether to allow replacing enterprise logo.',
18+
description="whether to allow replacing enterprise logo.",
1819
default=False,
1920
)

0 commit comments

Comments
 (0)