背景

Dify 本身不带模型,靠接入外部 API 跑起来。官方支持 OpenAI、Anthropic、Google 这些主流 Provider,填 Key 就能用,入门很方便。
但实际用下来有几个麻烦:国内直连这些端点基本不稳定;项目里同时用几个模型的话,要管好几套 Key、好几套配额;每次想换个模型测测效果,得去对应 Provider 的控制台折腾一圈。
后来了解到 Dify 的 OpenAI-API-compatible 通道可以接任何兼容 OpenAI 协议的端点,不限于官方 Provider。这就意味着可以用一个聚合端点把多家模型收进来,Dify 里只配一次,Key 也只管一个。本文记录用 ai.tikhub.io 做这件事的完整过程,其他兼容端点配法一样。


第一步:先确认端点能通

在 Dify 里配之前,先单独测一下端点,这步省不了——出问题的时候不知道是端点的问题还是 Dify 配置的问题,排查很费时间。

curl https://ai.tikhub.io/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "ping"}]
  }'

返回正常的 JSON 响应就可以继续。如果报 401,检查 Key;报 404,检查 URL 末尾有没有多余的 /


第二步:在 Dify 里配置模型

Dify 通过 OpenAI-API-compatible 通道接入任何兼容 OpenAI 协议的端点。

路径:设置 → 模型供应商 → 找到「OpenAI-API-compatible」→ 添加模型

每个模型单独添加一条记录,字段填法如下:

字段 填写内容
模型名称 gpt-4o(或其他模型 ID,直接用官方名)
API Key 你的 TikHub API Key
API endpoint URL https://ai.tikhub.io/v1
模型类型 LLM
上下文长度 按模型填,GPT-4o 填 128000,Claude Sonnet 填 200000

几个常用模型的配置参考:

gpt-4o          上下文 128000   适合通用任务
gpt-4o-mini     上下文 128000   适合高频低成本任务
claude-sonnet-4-20250514  上下文 200000   适合代码、长文
gemini-2.5-pro  上下文 1000000  适合超长文档

上下文长度如果不填或者填小了,Dify 在构造 prompt 时会过早截断历史消息,长对话容易出问题。建议每个模型都按实际值填。

填完之后点「测试」,能收到响应就配置成功了。


第三步:设置默认模型

配好之后在 设置 → 模型供应商 → 系统模型设置 里指定默认模型。

建议按用途分开设置:

  • 推理模型gpt-4oclaude-sonnet-4-20250514
  • Embedding 模型text-embedding-3-small(同样走 OpenAI-API-compatible 通道添加,模型类型选 Text Embedding)
  • 重排模型:可选,RAG 场景下开启能提升检索质量

Embedding 模型容易漏配——如果你要用知识库功能,这个必须单独加,不加的话知识库索引会报错。


三个实际用法

用法一:搭一个多模型对比的 Chatflow

调试提示词的时候经常需要对比不同模型的输出。在 Dify 的 Chatflow 里可以并行跑多个 LLM 节点,最后汇总结果:

[用户输入]
    ↓
[并行分支]
├── LLM 节点 A(模型:gpt-4o)
├── LLM 节点 B(模型:claude-sonnet-4-20250514)
└── LLM 节点 C(模型:gemini-2.5-pro)
    ↓
[模板合并节点]
    ↓
[输出对比结果]

合并节点里用模板把三个输出拼在一起:

## GPT-4o
{{node_a.output}}

## Claude Sonnet
{{node_b.output}}

## Gemini 2.5 Pro
{{node_c.output}}

这个用法在迭代系统提示词时很实用,不用来回切模型手动对比。


用法二:RAG 知识库问答

RAG 场景需要两个模型配合:Embedding 模型负责向量化,LLM 负责生成回答。

先通过 API 测试 Embedding 接口:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["YOUR_API_KEY"],
    base_url="https://ai.tikhub.io/v1"
)

resp = client.embeddings.create(
    model="text-embedding-3-small",
    input="测试文本"
)
print(f"向量维度:{len(resp.data[0].embedding)}")  # 应该输出 1536

确认 Embedding 接口正常后,在 Dify 知识库里:

  1. 新建知识库,上传文档
  2. 索引方式选「高质量」,Embedding 模型选刚才配好的 text-embedding-3-small
  3. 在 Chatflow 里添加「知识检索」节点,连接到 LLM 节点

知识检索节点的 prompt 模板参考:

根据以下参考资料回答用户问题。如果参考资料中没有相关信息,直接说不知道,不要编造。

参考资料:
{{context}}

用户问题:{{query}}

用法三:通过 Dify API 在外部程序里调用工作流

Dify 发布应用后会提供一个 API,可以在外部程序里直接调用,适合把 Dify 搭的工作流集成到自己的项目里。

# call_dify_workflow.py
import os
import requests

DIFY_API_KEY = os.environ["DIFY_APP_API_KEY"]  # 从 Dify 应用的 API 页面获取
DIFY_BASE_URL = "https://api.dify.ai/v1"       # 自部署的话换成自己的地址

def run_workflow(inputs: dict, user_id: str = "user-001") -> str:
    """调用 Dify 工作流并返回结果"""
    resp = requests.post(
        f"{DIFY_BASE_URL}/workflows/run",
        headers={
            "Authorization": f"Bearer {DIFY_API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "inputs": inputs,
            "response_mode": "blocking",
            "user": user_id
        }
    )
    resp.raise_for_status()
    data = resp.json()
    return data["data"]["outputs"]


def chat_with_app(query: str, conversation_id: str = "") -> dict:
    """调用 Dify 聊天应用"""
    resp = requests.post(
        f"{DIFY_BASE_URL}/chat-messages",
        headers={
            "Authorization": f"Bearer {DIFY_API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "query": query,
            "conversation_id": conversation_id,  # 传入可续接上下文
            "response_mode": "blocking",
            "user": "user-001"
        }
    )
    resp.raise_for_status()
    data = resp.json()
    return {
        "answer": data["answer"],
        "conversation_id": data["conversation_id"]  # 保存下来下次继续对话
    }


if __name__ == "__main__":
    # 调用工作流示例
    result = run_workflow({"article": "你的文章内容..."})
    print(result)

    # 调用聊天应用示例(多轮对话)
    r1 = chat_with_app("用 Python 写一个快排")
    print(r1["answer"])

    r2 = chat_with_app("刚才的代码加上单元测试", r1["conversation_id"])
    print(r2["answer"])

conversation_id 传入上次返回的值就能续接上下文,不传则开启新对话。


注意事项

API endpoint URL 末尾不要加 /:正确是 https://ai.tikhub.io/v1,加了斜杠部分版本的 Dify 会拼接出错误的请求路径。

Embedding 模型要单独配:用知识库功能必须在 OpenAI-API-compatible 通道里单独添加一条 Text Embedding 类型的记录,不配的话知识库建索引会直接报错,这个坑很多人第一次上手都踩。

上下文长度填实际值:尤其是 Claude 和 Gemini 这类大上下文窗口的模型,如果填了默认的 4096,长文档的 RAG 效果会很差。

模型名称用官方 ID:直接填 gpt-4oclaude-sonnet-4-20250514 这种官方格式,中转层自己处理路由,不需要加前缀。


整体来说 Dify 接自定义端点的配置量不大,主要就是 OpenAI-API-compatible 通道,把需要的模型逐个加进去。配好之后在 Dify 里切换模型和在代码里改一个参数一样简单。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐