Skip to main content
LibreChat is joining ClickHouse to power the open-source Agentic Data Stack 🎉 Learn more
LibreChat

Cấu trúc đối tượng Custom Endpoint

Mỗi endpoint trong mảng custom phải có cấu trúc như sau:

Ví dụ

endpoints:
  custom:
    # Example using Mistral AI API
    - name: 'Mistral'
      apiKey: '${YOUR_ENV_VAR_KEY}'
      baseURL: 'https://api.mistral.ai/v1'
      models:
        default: ['mistral-tiny', 'mistral-small', 'mistral-medium', 'mistral-large-latest']
      titleConvo: true
      titleTiming: 'immediate'
      titleModel: 'mistral-tiny'
      modelDisplayLabel: 'Mistral'
      # customParams:
      #   reasoningFormat: reasoning_object
      #   reasoningKey: reasoning_content
      # tokenConfig:
      #   mistral-large-latest:
      #     prompt: 2
      #     completion: 6
      #     context: 128000
      # addParams:
      #   safe_prompt: true # Mistral specific value for moderating messages
      # NOTE: For Mistral, it is necessary to drop the following parameters or you will encounter a 422 Error:
      dropParams: ['stop', 'user', 'frequency_penalty', 'presence_penalty']

    # Example using the native Anthropic Messages API
    - name: 'Claude-Compatible'
      provider: 'anthropic'
      apiKey: '${ANTHROPIC_API_KEY}'
      baseURL: 'https://api.anthropic.com'
      headers:
        anthropic-version: '2023-06-01'
      models:
        default: ['claude-sonnet-4-5', 'claude-opus-4-5']
        fetch: false
      titleConvo: true
      titleModel: 'claude-sonnet-4-5'
      modelDisplayLabel: 'Claude (Compatible)'

name

Khóa:

KeyTypeDescriptionExample
nameStringMột tên duy nhất cho endpoint.Will be used as the "title" in the Endpoints Selector

Bắt buộc

Ví dụ:

name: 'Mistral'

apiKey

Khóa:

KeyTypeDescriptionExample
apiKeyString (apiKey | "user_provided")Khóa API của bạn cho dịch vụ này. Có thể tham chiếu đến một biến môi trường hoặc cho phép người dùng cung cấp giá trị.It's highly recommended to use the env. variable reference for this field, i.e. `${YOUR_VARIABLE}`

Bắt buộc

Ví dụ:

apiKey: '${MISTRAL_API_KEY}'

hoặc

apiKey: 'your_api_key'

hoặc

apiKey: 'user_provided'

baseURL

Khóa:

KeyTypeDescriptionExample
baseURLString (baseURL | "user_provided")URL cơ sở cho API. Có thể tham chiếu đến một biến môi trường hoặc cho phép người dùng cung cấp giá trị.It's highly recommended to use the env. variable reference for this field, i.e. `${YOUR_VARIABLE}`

Bắt buộc

Ví dụ:

baseURL: 'https://api.mistral.ai/v1'

hoặc

baseURL: '${MISTRAL_BASE_URL}'

hoặc

baseURL: 'user_provided'

Ghi chú:

  • Nếu baseURL bạn thiết lập là endpoint hoàn chỉnh cho các completions, bạn có thể đặt trường directEndpoint thành true để sử dụng trực tiếp.
    • Điều này là cần thiết vì ứng dụng sẽ tự động thêm "/chat/completions" hoặc "/completion" vào baseURL theo mặc định.
  • Khi sử dụng provider: anthropic, hãy đặt baseURL thành gốc API mà SDK Anthropic sẽ gọi, chẳng hạn như https://api.anthropic.com hoặc gốc gateway của bạn. LibreChat sử dụng đường dẫn /v1/messages gốc của Anthropic cho provider đó.

provider

Khóa:

KeyTypeDescriptionExample
providerStringĐịnh tuyến một endpoint tùy chỉnh thông qua một client nhà cung cấp gốc thay vì client tương thích với OpenAI mặc định.Currently supports `anthropic`.

Mặc định: bị bỏ qua, sử dụng đường dẫn endpoint tùy chỉnh tương thích với OpenAI.

Các giá trị được hỗ trợ:

  • "anthropic" - Sử dụng client /v1/messages gốc của Anthropic với baseURL, apiKey, headers, addParams, dropParamscustomParams.paramDefinitions của endpoint này.

Ví dụ:

endpoints:
  custom:
    - name: 'Claude-Compatible'
      provider: 'anthropic'
      apiKey: '${ANTHROPIC_API_KEY}'
      baseURL: 'https://api.anthropic.com'
      headers:
        anthropic-version: '2023-06-01'
      models:
        default:
          - 'claude-sonnet-4-5'
          - 'claude-opus-4-5'
        fetch: false
      titleConvo: true
      titleModel: 'claude-sonnet-4-5'
      modelDisplayLabel: 'Claude (Compatible)'

Ghi chú:

  • Sử dụng provider: anthropic cho chính Anthropic hoặc các cổng kết nối tương thích với Anthropic sử dụng Messages API gốc.
  • Liệt kê các model một cách rõ ràng trong models.default; models.fetch theo kiểu OpenAI không được sử dụng cho các endpoint tùy chỉnh của Anthropic.
  • Nhà cung cấp này ngụ ý các tham số giao diện Anthropic trừ khi bạn đặt rõ ràng một customParams.defaultParamsEndpoint khác.
  • Các endpoint không có provider vẫn giữ hành vi tương thích với OpenAI.

iconURL

Khóa:

KeyTypeDescriptionExample
iconURLStringURL hình ảnh, đường dẫn tài sản công khai hoặc khóa biểu tượng endpoint tích hợp để sử dụng làm biểu tượng endpoint.

Mặc định: ""

Ví dụ:

iconURL: https://github.com/danny-avila/LibreChat/raw/main/docs/assets/LibreChat.svg

hoặc sử dụng lại biểu tượng endpoint có sẵn:

iconURL: openAI

Ghi chú:

  • Không đặt name của endpoint tùy chỉnh trùng với tên của endpoint tích hợp sẵn chỉ để sử dụng lại biểu tượng. Tên của endpoint tùy chỉnh phải là duy nhất và không được sử dụng các giá trị endpoint mặc định như:
    • "openAI" | "azureOpenAI" | "google" | "anthropic" | "assistants" | "azureAssistants" | "agents" | "bedrock"
  • Để sử dụng biểu tượng endpoint có sẵn trong dự án, hãy giữ cho name của endpoint tùy chỉnh là duy nhất và thay vào đó hãy đặt iconURL thành một trong các khóa endpoint tích hợp sẵn.
    • "openAI" | "azureOpenAI" | "google" | "anthropic" | "assistants" | "azureAssistants" | "agents" | "bedrock"
  • Để sử dụng hình ảnh tùy chỉnh, hãy đặt iconURL thành một URL hình ảnh hoặc một đường dẫn được phục vụ bởi LibreChat, chẳng hạn như /assets/my-icon.svg.
  • Ngoài ra còn có các "known endpoints" (không phân biệt chữ hoa chữ thường), vốn đã được cung cấp sẵn biểu tượng. Nếu name của endpoint của bạn khớp với các tên sau đây, bạn nên bỏ qua trường này:
    • Anyscale
    • APIpie
    • Cohere
    • Deepseek
    • Pháo hoa
    • groq
    • Helicone
    • Huggingface
    • Mistral
    • MLX
    • Moonshot
    • ollama
    • OpenRouter
    • Perplexity
    • Qwen
    • ShuttleAI
    • together.ai
    • Hợp nhất
    • xai

models

Khóa:

KeyTypeDescriptionExample
modelsObjectCấu hình cho các model.

Bắt buộc

Các thuộc tính:

default

Khóa:

KeyTypeDescriptionExample
defaultArray of StringsMột mảng các chuỗi ký tự chỉ định các model mặc định sẽ được sử dụng.If fetching models fails, these defaults are used as a fallback.

Bắt buộc

Ví dụ:

default:
  - 'mistral-tiny'
  - 'mistral-small'
  - 'mistral-medium'

fetch

Khóa:

KeyTypeDescriptionExample
fetchBooleanKhi được đặt thành `true`, sẽ cố gắng tìm nạp danh sách các model từ API.May cause slowdowns during initial use of the app if the response is delayed. Defaults to `false`.

Mặc định: false

Ví dụ:

fetch: true

userIdQuery

Khóa:

KeyTypeDescriptionExample
userIdQueryBooleanKhi được đặt thành `true`, sẽ thêm ID người dùng LibreChat dưới dạng tham số truy vấn vào yêu cầu API models.

Mặc định: false

Ví dụ:

userIdQuery: true

titleConvo

Khóa:

KeyTypeDescriptionExample
titleConvoBooleanCho phép đặt tiêu đề hội thoại khi được đặt thành `true`.

Mặc định: false

Ví dụ:

titleConvo: true

titleTiming

Khóa:

KeyTypeDescriptionExample
titleTimingStringKiểm soát thời điểm tạo tiêu đề cuộc trò chuyện. Các giá trị hợp lệ: "immediate" hoặc "final".Defaults to "immediate".

Mặc định: "immediate"

Các giá trị khả dụng:

  • "immediate" - Tạo tiêu đề ngay khi yêu cầu bắt đầu, song song với phản hồi của mô hình, sử dụng tin nhắn đầu tiên của người dùng.
  • "final" - Trì hoãn việc tạo tiêu đề cho đến khi phản hồi hoàn tất. Điều này bảo toàn hành vi cũ.

Ví dụ:

titleTiming: 'final'

titleMethod

Khóa:

KeyTypeDescriptionExample
titleMethodStringKiểm soát phương thức được sử dụng để tạo tiêu đề cuộc trò chuyện.Valid values: "completion" (default), "structured", "functions" (legacy alias for "structured")

Mặc định: "completion"

Các phương thức khả dụng:

  • "completion" - Sử dụng API hoàn thành (completion) tiêu chuẩn mà không có công cụ/hàm. Tương thích với hầu hết các LLM.
  • "structured" - Sử dụng đầu ra có cấu trúc để tạo tiêu đề. Yêu cầu sự hỗ trợ từ nhà cung cấp/model.
  • "functions" - Bí danh cũ cho "structured". Có chức năng giống hệt nhau.

Ví dụ:

titleMethod: 'completion'

titleModel

Khóa:

KeyTypeDescriptionExample
titleModelStringChỉ định model được sử dụng cho tiêu đề.Defaults to "gpt-3.5-turbo" if omitted. May cause issues if "gpt-3.5-turbo" is not available. You can also dynamically use the current conversation model by setting it to "current_model".

Mặc định: "gpt-3.5-turbo"

Ví dụ:

titleModel: 'mistral-tiny'
titleModel: 'current_model'

titlePrompt

Khóa:

KeyTypeDescriptionExample
titlePromptStringLời nhắc tùy chỉnh để tạo tiêu đề. Phải bao gồm trình giữ chỗ {convo}.Allows full control over how titles are generated.

Mặc định:

Analyze this conversation and provide:
1. The detected language of the conversation
2. A concise title in the detected language (5 words or less, no punctuation or quotation)

{convo}

Ghi chú:

  • Phải luôn bao gồm trình giữ chỗ {convo}
  • Trình giữ chỗ {convo} sẽ được thay thế bằng cuộc trò chuyện đã được định dạng

Ví dụ:

titlePrompt: "Create a brief, descriptive title for the following conversation:\n\n{convo}\n\nTitle:"

titlePromptTemplate

Khóa:

KeyTypeDescriptionExample
titlePromptTemplateStringMẫu định dạng nội dung cuộc trò chuyện thay thế cho {convo} trong titlePrompt.Must include {input} and {output} placeholders.

Mặc định: "User: {input}\nAI: {output}"

Ghi chú:

  • Phải bao gồm cả hai trình giữ chỗ {input}{output}
  • Kiểm soát cách định dạng cuộc trò chuyện khi được chèn vào titlePrompt

Ví dụ:

titlePromptTemplate: "Human: {input}\n\nAssistant: {output}"

titleEndpoint

Khóa:

KeyTypeDescriptionExample
titleEndpointStringChỉ định một endpoint thay thế để sử dụng cho việc tạo tiêu đề.Allows using a different model/endpoint for titles.

Mặc định: Sử dụng endpoint tùy chỉnh hiện tại

Các giá trị được chấp nhận:

  • openAI
  • azureOpenAI
  • google
  • anthropic
  • bedrock
  • Một tên endpoint tùy chỉnh khác

Ví dụ:

# Use a different custom endpoint for titles
endpoints:
  custom:
    - name: 'my-chat-endpoint'
      apiKey: '${CHAT_API_KEY}'
      baseURL: 'https://api.example.com/v1/chat'
      models:
        default: ['gpt-4']
      titleEndpoint: 'my-title-endpoint'

    - name: 'my-title-endpoint'
      apiKey: '${TITLE_API_KEY}'
      baseURL: 'https://api.example.com/v1/title'
      models:
        default: ['gpt-3.5-turbo']

modelDisplayLabel

Khóa:

KeyTypeDescriptionExample
modelDisplayLabelStringNhãn được hiển thị trong các tin nhắn bên cạnh Biểu tượng cho mô hình AI hiện tại.The display order is: 1. Custom name set via preset (if available), 2. Label derived from the model name (if applicable), 3. This value is used if the above are not specified. Defaults to "AI".

Mặc định: "AI"

Ví dụ:

modelDisplayLabel: 'Mistral'

addParams

Khóa:

KeyTypeDescriptionExample
addParamsObject/DictionaryThêm các tham số bổ sung vào các yêu cầu. Các giá trị có thể là chuỗi, số, boolean, mảng hoặc các đối tượng lồng nhau. Hỗ trợ các nút chuyển đổi công cụ của nhà cung cấp như `web_search: true` và `url_context: true` của Google.Adds/Overrides parameters. Useful for specifying API-specific options.

Ví dụ:

addParams:
  safe_prompt: true
  max_tokens: 2048

Ghi chú:

  • Trường addParams cho phép bạn bao gồm các tham số bổ sung không nằm trong payload mặc định (xem phần "Default Parameters"). Điều này đặc biệt hữu ích cho các tùy chọn dành riêng cho API.

dropParams

Khóa:

KeyTypeDescriptionExample
dropParamsArray/List of StringsLoại bỏ các tham số mặc định khỏi các yêu cầu.Excludes specified default parameters. Useful for APIs that do not accept or recognize certain parameters.

Ví dụ:

dropParams:
  - 'stop'
  - 'user'
  - 'frequency_penalty'
  - 'presence_penalty'

Lưu ý:

  • Trường dropParams cho phép bạn xóa các "Default Parameters" được gửi kèm với mọi yêu cầu. Điều này hữu ích khi làm việc với các API không chấp nhận hoặc không nhận diện được một số tham số nhất định.

customParams

Khóa:

KeyTypeDescriptionExample
customParamsObject/DictionaryXác định hành vi endpoint tùy chỉnh và siêu dữ liệu cài đặt không nằm trong phần thân yêu cầu của nhà cung cấp.Used for endpoint-specific configuration such as reasoning parameter shape.

Các khóa phụ:

KeyTypeDescriptionExample
defaultParamsEndpointStringCác giá trị mặc định của endpoint được sử dụng cho siêu dữ liệu tham số yêu cầu. Mặc định là `custom`. Khi `provider: anthropic` được thiết lập và trường này bị bỏ qua, LibreChat sẽ sử dụng tập tham số của Anthropic.defaultParamsEndpoint: custom
reasoningFormatStringKiểm soát cách các tham số suy luận được gửi đến các endpoint tùy chỉnh tương thích với OpenAI. Các giá trị hợp lệ: `reasoning_effort`, `reasoning_object`, `disabled`.reasoningFormat: reasoning_object
reasoningKeyStringKiểm soát khóa phản hồi nào được đọc cho nội dung lập luận của nhà cung cấp. Các giá trị hợp lệ: `reasoning` hoặc `reasoning_content`.reasoningKey: reasoning_content
includeReasoningContentBooleanPhát lại `reasoning_content` của nhà cung cấp trong các lượt gọi công cụ cho các endpoint tùy chỉnh tương thích với OpenAI yêu cầu điều đó.includeReasoningContent: true
includeReasoningHistoryBooleanTái tạo `reasoning_content` từ lịch sử hội thoại đã lưu qua các lượt. Ngụ ý `includeReasoningContent`.includeReasoningHistory: true
paramDefinitionsArray/ListCác định nghĩa cài đặt tùy chỉnh cho endpoint này.See default parameter definitions.

Định dạng suy luận:

  • reasoning_effort - Gửi tham số reasoning_effort cũ.
  • reasoning_object - Gửi một đối tượng reasoning, ví dụ như { effort, summary }, cho các nhà cung cấp tuân theo định dạng tương thích với OpenAI mới hơn.
  • disabled - Loại bỏ các tham số suy luận ngay cả khi người dùng hoặc Model Specs chọn tính năng suy luận.

Phát lại suy luận:

  • Sử dụng includeReasoningContent: true cho các nhà cung cấp tương thích với OpenAI yêu cầu reasoning_content của trợ lý phải được phát lại trong các lượt gọi công cụ (tool-call).
  • Chỉ sử dụng includeReasoningHistory: true cho các nhà cung cấp cũng yêu cầu reasoning_content được tái tạo từ lịch sử đã lưu trữ qua các lượt hội thoại sau này, chẳng hạn như một số cổng kết nối tương thích với Xiaomi MiMo hoặc Kimi.

Lưu ý về nhà cung cấp Anthropic:

Sử dụng provider: anthropic khi custom endpoint cần sử dụng Anthropic Messages API gốc. Chỉ sử dụng customParams.defaultParamsEndpoint: anthropic mà không có provider khi bạn vẫn cần đường dẫn custom endpoint tương thích với OpenAI nhưng muốn sử dụng siêu dữ liệu tham số và khả năng điều chỉnh yêu cầu theo kiểu Anthropic.

Ví dụ:

customParams:
  reasoningFormat: reasoning_object
  reasoningKey: reasoning_content
  includeReasoningContent: true

tokenConfig

Khóa:

KeyTypeDescriptionExample
tokenConfigObject/DictionaryXác định các cửa sổ ngữ cảnh cụ thể cho mô hình và mức phí trên mỗi triệu token cho endpoint tùy chỉnh này.Used by context usage, visible cost breakdowns, balance transactions, and multi-endpoint agent billing.

Mỗi khóa là một tên model. Mỗi mục model hỗ trợ:

KeyTypeDescriptionExample
promptNumberTỷ lệ token prompt/đầu vào trên mỗi triệu token.Required
completionNumberTỷ lệ token hoàn thành/đầu ra trên mỗi triệu token.Required
contextNumberCửa sổ ngữ cảnh tối đa cho model.Required
cacheReadNumberTốc độ đọc đầu vào được lưu trong bộ nhớ đệm trên mỗi triệu token.Optional
cacheWriteNumberTốc độ ghi đầu vào được lưu trong bộ nhớ đệm trên mỗi triệu token.Optional

Ví dụ:

tokenConfig:
  gpt-4o-mini:
    prompt: 0.15
    completion: 0.6
    context: 128000
    cacheRead: 0.075
    cacheWrite: 0.15

Ghi chú:

  • Tỷ giá được tính trên mỗi triệu token bằng USD trước khi bất kỳ chuyển đổi interface.currency nào được áp dụng để hiển thị.
  • Tên model phải khớp với giá trị model được gửi thông qua endpoint tùy chỉnh.
  • Đối với các Agent sử dụng nhiều endpoint, cấu hình token của endpoint/model khớp với nhau sẽ được sử dụng khi ghi lại mức sử dụng và chi phí.

headers

Khóa:

KeyTypeDescriptionExample
headersObject/DictionaryThêm các tiêu đề bổ sung vào các yêu cầu. Tất cả các giá trị tiêu đề phải là chuỗi. Hỗ trợ thay thế trường người dùng động với `{{LIBRECHAT_USER_*}}`, các trình giữ chỗ nội dung yêu cầu với `{{LIBRECHAT_BODY_*}}` và các biến môi trường với `${ENV_VAR}`.The `headers` object specifies custom headers for requests. Useful for authentication and setting content types.

Ví dụ:

headers:
  x-api-key: '${ENVIRONMENT_VARIABLE}'
  Content-Type: 'application/json'
  X-User-ID: '{{LIBRECHAT_USER_ID}}'
  X-User-Email: '{{LIBRECHAT_USER_EMAIL}}'

Lưu ý: Hỗ trợ các giá trị biến môi trường động, sử dụng định dạng: "${VARIABLE_NAME}".

Khi models.fetch: true được sử dụng, các tiêu đề (header) này cũng được phân giải và chuyển tiếp đến yêu cầu danh sách mô hình (model-list) cho các URL cơ sở do quản trị viên kiểm soát. Tiêu đề Authorization được định cấu hình sẽ được ưu tiên hơn so với dự phòng apiKey của endpoint, điều này hữu ích cho các proxy nhận biết xác thực (auth-aware) trả về danh sách mô hình theo từng người dùng. Nếu baseURL: "user_provided" được định cấu hình, LibreChat sẽ không chuyển tiếp các mẫu tiêu đề đã định cấu hình đến đích do người dùng cung cấp. Đối với provider: anthropic, các tiêu đề được chuyển tiếp thông qua client Anthropic gốc thay vì client tương thích với OpenAI.

Các trình giữ chỗ trường người dùng khả dụng:

PlaceholderUser FieldTypeDescription
{{LIBRECHAT_USER_ID}}idStringĐịnh danh duy nhất của người dùng
{{LIBRECHAT_USER_NAME}}nameStringTên hiển thị của người dùng
{{LIBRECHAT_USER_USERNAME}}usernameStringTên người dùng (username)
{{LIBRECHAT_USER_EMAIL}}emailStringĐịa chỉ email của người dùng
{{LIBRECHAT_USER_PROVIDER}}providerStringNhà cung cấp xác thực (ví dụ: "email", "google", "github")
{{LIBRECHAT_USER_ROLE}}roleStringVai trò của người dùng (ví dụ: "user", "admin")
{{LIBRECHAT_USER_GOOGLEID}}googleIdStringID tài khoản Google
{{LIBRECHAT_USER_FACEBOOKID}}facebookIdStringID tài khoản Facebook
{{LIBRECHAT_USER_OPENIDID}}openidIdStringID tài khoản OpenID
{{LIBRECHAT_USER_SAMLID}}samlIdStringID tài khoản SAML
{{LIBRECHAT_USER_LDAPID}}ldapIdStringID tài khoản LDAP
{{LIBRECHAT_USER_GITHUBID}}githubIdStringID tài khoản GitHub
{{LIBRECHAT_USER_DISCORDID}}discordIdStringID tài khoản Discord
{{LIBRECHAT_USER_APPLEID}}appleIdStringID tài khoản Apple
{{LIBRECHAT_USER_EMAILVERIFIED}}emailVerifiedBoolean → StringTrạng thái xác minh email ("true" hoặc "false")
{{LIBRECHAT_USER_TWOFACTORENABLED}}twoFactorEnabledBoolean → StringTrạng thái 2FA ("true" hoặc "false")
{{LIBRECHAT_USER_TERMSACCEPTED}}termsAcceptedBoolean → StringTrạng thái chấp nhận điều khoản ("true" hoặc "false")

Các Placeholder cho Request Body khả dụng:

PlaceholderBody FieldTypeMô tả
{{LIBRECHAT_BODY_CONVERSATIONID}}conversationIdStringĐịnh danh cuộc trò chuyện hiện tại
{{LIBRECHAT_BODY_PARENTMESSAGEID}}parentMessageIdStringĐịnh danh tin nhắn cha
{{LIBRECHAT_BODY_MESSAGEID}}messageIdStringĐịnh danh tin nhắn hiện tại

Ví dụ sử dụng các trình giữ chỗ (placeholders) trong phần thân yêu cầu (request body):

headers:
  X-Conversation-ID: '{{LIBRECHAT_BODY_CONVERSATIONID}}'
  X-Parent-Message-ID: '{{LIBRECHAT_BODY_PARENTMESSAGEID}}'
  X-Message-ID: '{{LIBRECHAT_BODY_MESSAGEID}}'

directEndpoint

Khóa:

KeyTypeDescriptionExample
directEndpointBooleanKhi được đặt thành `true`, coi `baseURL` đã cấu hình là endpoint completions sẽ được sử dụng

Mặc định: false

Ví dụ:

directEndpoint: true

titleMessageRole

  • Các tùy chọn: "system" | "user" | "assistant"

Khóa:

KeyTypeDescriptionExample
titleMessageRoleStringChỉ định giá trị vai trò sẽ sử dụng trong payload tin nhắn để tạo tiêu đề. Phải là một trong các giá trị: `"system"`, `"user"`, `"assistant"`.Defaults to "system" if omitted. May cause issues if "system" is not a valid value, which is sometimes the case for single message payloads, as it is for title generation.

Mặc định: "system"

Ví dụ:

titleMessageRole: 'user'

Hướng dẫn này thế nào?