# Hướng dẫn đóng góp

Vậy bạn đang muốn đóng góp cho ChatX - thật tuyệt vời, chúng tôi rất mong chờ những gì bạn sẽ làm. Là một startup với nguồn nhân lực và kinh phí hạn chế, chúng tôi có những tham vọng lớn để thiết kế quy trình làm việc trực quan nhất cho việc 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á, thật sự.

Chúng tôi cần phải linh hoạt và phát hành nhanh chóng dựa trên tình hình hiện tại, nhưng chúng tôi cũng muốn đảm bảo rằng những người đóng góp như bạn có trải nghiệm mượt mà nhất có thể khi đóng góp. Chúng tôi đã tập hợp hướng dẫn đóng góp này với mục đích giúp bạn làm quen với mã nguồn và cách chúng tôi làm việc với những người đóng góp, để bạn có thể nhanh chóng bắt đầu với phần thú vị.

Hướng dẫn này, giống như ChatX, luôn là một công trình đang trong quá trình hoàn thiện. Chúng tôi rất cảm kích sự thông cảm của bạn nếu đôi khi nó chưa kịp cập nhật với dự án thực tế, và hoan nghênh bất kỳ phản hồi nào để chúng tôi cải thiện.

Về mặt cấp phép, vui lòng dành một chút thời gian để đọc giấy phép và thỏa thuận đóng góp ngắ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).

## Trước khi bạn bắt đầu

[Tìm](https://github.com/langgenius/dify/issues?q=is:issue+is:closed) một vấn đề hiện có, hoặc [mở](https://github.com/langgenius/dify/issues/new/choose) một vấn đề mới. Chúng tôi phân loại vấn đề thành 2 loại:

### **Yêu cầu tính năng:**

* Nếu bạn mở 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 được đề xuất đạt được những gì và bao gồm càng nhiều bối cảnh càng tốt. [@perzeusss](https://github.com/perzeuss) đã tạo ra một [Feature Request Copilot](https://udify.app/chat/MK2kVSnw1gakVwMX) mạnh mẽ giúp bạn soạn thảo yêu cầu của mình. Hãy thoải mái thử nó.
* Nếu bạn muốn chọn một yêu cầu từ các vấn đề hiện có, chỉ cần để lại một bình luận bên dưới.

  Một thành viên trong nhóm làm việc trong hướng liên quan sẽ được đưa vào vòng. Nếu mọi thứ đều ổn, họ sẽ cho phép bạn bắt đầu viết mã. Chúng tôi yêu cầu bạn tạm dừng công việc cho đến khi nhận được sự chấp thuận, để tránh lãng phí công sức của bạn trong trường hợp chúng tôi đề xuất thay đổi.

  Tùy thuộc vào lĩnh vực mà tính năng đề xuất thuộc về, bạn có thể trò chuyện với các thành viên khác nhau trong nhóm. Dưới đây là bản tóm tắt về các lĩnh vực mà các thành viên trong nhóm của chúng tôi đang làm việc vào lúc này:

  | Thành viên                                                                              | Phạm vi                                                  |
  | --------------------------------------------------------------------------------------- | -------------------------------------------------------- |
  | [@yeuoly](https://github.com/Yeuoly)                                                    | Kiến trúc các tác nhân                                   |
  | [@jyong](https://github.com/JohnJyong)                                                  | Thiết kế đường dẫn RAG                                   |
  | [@GarfieldDai](https://github.com/GarfieldDai)                                          | Xây dựng điều phối quy trình                             |
  | [@iamjoel](https://github.com/iamjoel) & [@zxhlyh](https://github.com/zxhlyh)           | Tạo frontend dễ sử dụng                                  |
  | [@guchenhe](https://github.com/guchenhe) & [@crazywoola](https://github.com/crazywoola) | Trải nghiệm nhà phát triển, liên hệ cho bất kỳ vấn đề gì |
  | [@takatost](https://github.com/takatost)                                                | Hướng dẫn và kiến trúc sản phẩm tổng thể                 |

  #### Cách chúng tôi ưu tiên:

  | Loại Tính năng                                                                                                      | Ưu tiên             |
  | ------------------------------------------------------------------------------------------------------------------- | ------------------- |
  | Tính năng ưu tiên cao do thành viên đánh dấu                                                                        | Ưu tiên cao         |
  | Yêu cầu tính năng phổ biến từ [phản hồi cộng đồng](https://github.com/langgenius/dify/discussions/categories/ideas) | Ư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        |
  | Tính năng có giá trị nhưng không cấp bách                                                                           | Tính năng tương lai |

**Bất kỳ vấn đề nào khác (ví dụ: báo cáo lỗi, tối ưu hóa hiệu suất, sửa lỗi chính tả):**

* Bắt đầu viết mã ngay lập tức.

  #### Cách chúng tôi ưu tiên:

  | Loại Lỗi                                                                                         | Ưu tiên            |
  | ------------------------------------------------------------------------------------------------ | ------------------ |
  | Lỗi trong các chức năng cốt lõi (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 quan trọng, tăng hiệu suất                                                             | Ưu tiên trung bình |
  | Sửa lỗi nhỏ (lỗi chính tả, giao diện gây nhầm lẫn nhưng vẫn hoạt động)                           | Ưu tiên thấp       |

## Cài đặt

Dưới đây là các bước để thiết lập ChatX cho phát triển:

### **1. Fork kho lưu trữ này**

### **2. Clone kho lưu trữ**

Clone kho lưu trữ đã fork từ terminal của bạn:

```
git clone git@github.com:<github_username>/dify.git
```

### **3. Xác minh các phụ thuộc**

ChatX yêu cầu các phụ thuộc sau để xây dựng, đảm bảo chúng đã được cài đặt trên hệ thống của bạn:

* [Docker](https://www.docker.com/)
* [Docker Compose](https://docs.docker.com/compose/install/)
* [Node.js v18.x (LTS)](http://nodejs.org/)
* [npm](https://www.npmjs.com/) version 8.x.x or [Yarn](https://yarnpkg.com/)
* [Python](https://www.python.org/) version 3.10.x

### **4. Cài đặt**

ChatX bao gồm backend và frontend. Điều hướng đến thư mục backend bằng lệnh `cd api/`, sau đó làm theo README của Backend để cài đặt. Trong một terminal khác, điều hướng đến thư mục frontend bằng lệnh `cd web/`, sau đó làm theo README của Frontend để cài đặt.

Kiểm tra [FAQ cài đặt](https://developer.chatx.vn/document-chatx/bat-dau/cai-dat-tu-luu-tru/cau-hoi-thuong-gap) để biết danh sách các vấn đề phổ biến và các bước khắc phục sự cố.

**5. Truy cập ChatX trong trình duyệt của bạn**

Để xác nhận thiết lập của bạn, truy cập vào [http://localhost:3000](http://localhost:3000/) (mặc định, hoặc URL và cổng bạn tự cấu hình) trong trình duyệt của bạn. Bạn sẽ thấy ChatX hoạt động.

## Phát triển

Nếu bạn đang thêm 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.

Để giúp bạn nhanh chóng điều hướng và tìm nơi đóng góp của bạn, dưới đây là một bản phác thảo ngắn gọn về backend & frontend của ChatX:

**Backend**

Backend của ChatX đượ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 nhiệm vụ. Logic ủy quyền đi qua Flask-login.

```
[api/]
├── constants             // Constant settings used throughout code base.
├── controllers           // API route definitions and request handling logic.           
├── core                  // Core application orchestration, model integrations, and tools.
├── docker                // Docker & containerization related configurations.
├── events                // Event handling and processing
├── extensions            // Extensions with 3rd party frameworks/platforms.
├── fields                // field definitions for serialization/marshalling.
├── libs                  // Reusable libraries and helpers.
├── migrations            // Scripts for database migration.
├── models                // Database models & schema definitions.
├── services              // Specifies business logic.
├── storage               // Private key storage.      
├── tasks                 // Handling of async tasks and background jobs.
└── tests
```

**Frontend**

Trang web được khởi tạo trên [Next.js](https://nextjs.org/) boilerplate bằng Typescript và sử dụng [Tailwind CSS](https://tailwindcss.com/) để tạo kiểu. [React-i18next](https://react.i18next.com/) được sử dụng để quốc tế hóa.

```
[web/]
├── app                   // layouts, pages, and components
│   ├── (commonLayout)    // common layout used throughout the app
│   ├── (shareLayout)     // layouts specifically shared across token-specific sessions 
│   ├── activate          // activate page
│   ├── components        // shared by pages and layouts
│   ├── install           // install page
│   ├── signin            // signin page
│   └── styles            // globally shared styles
├── assets                // Static assets
├── bin                   // scripts ran at build step
├── config                // adjustable settings and options 
├── context               // shared contexts used by different portions of the app
├── dictionaries          // Language-specific translate files 
├── docker                // container configurations
├── hooks                 // Reusable hooks
├── i18n                  // Internationalization configuration
├── models                // describes data models & shapes of API responses
├── public                // meta assets like favicon
├── service               // specifies shapes of API actions
├── test                  
├── types                 // descriptions of function params and return values
└── utils                 // Shared utility functions
```

## Gửi PR của bạn

Cuối cùng, đã đến lúc mở một pull request (PR) đến kho lưu trữ của chúng tôi. Đối với các tính năng lớn, trước tiên chúng tôi sẽ gộp chúng vào nhánh `deploy/dev` để kiểm tra, trước khi đưa chúng vào `nhánh chính`. Nếu bạn gặp phải các vấn đề như xung đột merge hoặc không biết cách mở pull request, hãy xem [hướng dẫn pull request của GitHub](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests).

Và đó là tất cả! Khi PR của bạn được gộp, bạn sẽ được xuất hiện như một người đóng góp trong [README](https://github.com/langgenius/dify/blob/main/README.md) của chúng tôi.

## Nhận trợ giúp

Nếu bạn gặp bất kỳ khó khăn nào hoặc có câu hỏi trong quá trình đóng góp, hãy gửi câu hỏi của bạn qua vấn đề liên quan trên GitHub, hoặc tham gia vào [Discord](https://discord.gg/AhzKf7dNgk) của chúng tôi để trò chuyện nhanh.
