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:
Last modified on June 24, 2026