Skip to main content

A custom model is an LLM that you deploy or configure yourself. This guide uses Xinference as an example to show how to integrate a custom model into your model plugin.

By default, a custom model automatically includes two parameters, its model type and model name, so the provider YAML file needs no additional definitions.

You do not need to implement validate_provider_credential in your provider configuration file. At runtime, Dify calls the corresponding model layer’s validate_credentials method based on the model type and model name the user selects.

Integrate a Custom Model Plugin#

Integrating a custom model takes four steps:

  1. Create a model provider file: Identify the model types your custom model will include.
  2. Create code files by model type: Create separate code files for each model type (e.g., llm or text_embedding). Keeping each model type in its own logical layer simplifies maintenance and future expansion.
  3. Develop the model invocation logic: Within each model-type module, create a Python file named for that model type (for example, llm.py). Define a class in the file that implements the model logic, conforming to the system’s model interface specifications.
  4. Debug the plugin: Write unit and integration tests for the new provider functionality, ensuring that all components work as intended.

1. Create the Model Provider File#

In your plugin’s /provider directory, create a xinference.yaml file.

The Xinference family of models supports LLM, Text Embedding, and Rerank model types, so your xinference.yaml must include all three.

Example:

Next, define the provider_credential_schema. Since Xinference supports text-generation, embeddings, and reranking models, you can configure it as follows:

Every model in Xinference requires a model_name:

Because Xinference is locally deployed, users must also supply the server address (server_url) and model UID:

This completes the YAML configuration for your custom model provider. Next, create the code files for each model defined in the configuration.

2. Develop the Model Code#

Xinference supports llm, rerank, speech2text, and tts, so create a corresponding directory under /models for each type, each containing its feature code.

Below is an example for an llm type model. Create a file named llm.py, then define a class such as XinferenceAILargeLanguageModel that extends __base.large_language_model.LargeLanguageModel. The class must implement the following methods.

LLM Invocation#

The core method for invoking the LLM, supporting both streaming and synchronous responses:

Implement streaming and synchronous responses as separate functions. Python treats any function containing yield as a generator that returns Generator, so splitting them keeps the return types clean:

Pre-calculate Input Tokens#

If your model doesn’t provide a token-counting interface, return 0:

Alternatively, you can call self._get_num_tokens_by_gpt2(text: str) from the AIModel base class, which uses a GPT-2 tokenizer. Remember this is an approximation and may not match your model exactly.

Validate Model Credentials#

Similar to provider-level credential checks, but scoped to a single model:

Dynamic Model Parameters Schema#

Unlike predefined models, no YAML file defines which parameters a model supports, so you must generate the parameter schema dynamically.

For example, Xinference supports max_tokens, temperature, and top_p. Other providers (e.g., OpenLLM) may support parameters like top_k only for certain models, so the schema must adapt to each model’s capabilities:

Error Mapping#

When an error occurs during model invocation, map it to one of the runtime’s InvokeError types so Dify can handle different errors consistently:

  • InvokeConnectionError
  • InvokeServerUnavailableError
  • InvokeRateLimitError
  • InvokeAuthorizationError
  • InvokeBadRequestError

For more details on interface methods, see the Model Documentation.

For the complete code files discussed in this guide, see the GitHub repository.

3. Debug the Plugin#

After development, test the plugin to make sure it runs correctly. For details, see:

Debug Plugin

4. Publish the Plugin#

To list the plugin on the Dify Marketplace, see Publish to Dify Marketplace.

Explore More#

Quick Start:

Plugins Endpoint Docs: