Dify工作流搭建

First Post:

Last Update:

解决Dify与本地模型兼容性问题的最优解之一,彻底绕过原生节点的model.mode校验限制,同时规避你之前遇到的ASCII编码错误。以下是具体操作细节和注意事项:


一、方案核心逻辑

原生问题分类器节点强制要求model.mode字段,而本地模型(如通过stvlynn/lms接入的)可能未被Dify正确识别为chat模式。用HTTP请求节点直接调用本地模型API,完全脱离Dify的原生模型封装层,从根源解决问题。


二、操作步骤细化

  1. 删除原问题分类器节点:避免原生节点的校验逻辑干扰。

  2. 配置HTTP请求节点

    • URL:填写本地模型API地址(如http://localhost:8000/v1/chat/completions;若Dify是Docker部署,需用http://host.docker.internal:8000/v1/chat/completions访问宿主机服务)。

    • Headers:必须添加Content-Type: application/json; charset=utf-8(解决你之前的ASCII编码错误,确保中文Prompt能被正确序列化)。

    • Body:严格遵循OpenAI规范(示例):
      {

       "model": "your-local-model",
       "messages": [
         {"role": "system", "content": "你是一个分类器,请将用户输入分为:A. 闲聊 B. 查知识库 C. 写代码。只返回字母。"},
         {"role": "user", "content": "{{#start.user_input#}}"}
       ],
       "max_tokens": 5,
       "temperature": 0.1
      

      }

  3. 添加条件分支节点:解析HTTP返回的choices[0].message.content(如”A”/“B”/“C”),根据结果路由到不同下游链路(如闲聊走聊天模型,查知识库走RAG流程)。

这是解决Dify与本地模型兼容性问题的最优解之一,彻底绕过原生节点的model.mode校验限制,同时规避你之前遇到的ASCII编码错误。以下是具体操作细节和注意事项:


一、方案核心逻辑

原生问题分类器节点强制要求model.mode字段,而本地模型(如通过stvlynn/lms接入的)可能未被Dify正确识别为chat模式。用HTTP请求节点直接调用本地模型API,完全脱离Dify的原生模型封装层,从根源解决问题。


二、操作步骤细化

  1. 删除原问题分类器节点:避免原生节点的校验逻辑干扰。

  2. 配置HTTP请求节点

    • URL:填写本地模型API地址(如http://localhost:8000/v1/chat/completions;若Dify是Docker部署,需用http://host.docker.internal:8000/v1/chat/completions访问宿主机服务)。

    • Headers:必须添加Content-Type: application/json; charset=utf-8(解决你之前的ASCII编码错误,确保中文Prompt能被正确序列化)。

    • Body:严格遵循OpenAI规范(示例):
      {

       {
        "model": "qwen/qwen3.5-9b@q4_k_m",
        "input": "你是一个分类器,请将用户输入分为:A. 闲聊 B. 查知识库 C. 写代码。只返回字母。\n\n用户输入:{{#start.user_input#}}",
        "temperature": 0.1
      }
      

      }

  3. 添加条件分支节点:解析HTTP返回的choices[0].message.content(如”A”/“B”/“C”),根据结果路由到不同下游链路(如闲聊走聊天模型,查知识库走RAG流程)。


三、方案优势

优势 说明
彻底解耦 不依赖Dify的原生模型适配,只要本地模型支持OpenAI格式API就能用。
避免编码错误 手动控制Body编码为UTF-8,解决你之前遇到的'ascii' codec can't encode问题。
性能提升 省去Dify原生节点的封装层消耗,响应速度更快。
灵活性强 可自定义Headers(如鉴权)、调整请求参数(如max_tokens),适配任何本地模型。

四、注意事项

  • 若本地模型需要鉴权,在Headers中添加Authorization: Bearer YOUR_TOKEN

  • 测试时先用手动输入(如{"content": "你好"})验证API连通性,再接入Dify变量。

  • 若HTTP请求仍报错,检查本地模型日志(如FastAPI/Uvicorn日志),确认是否接收到正确请求。

在 Dify 的 HTTP 请求节点​ 中,Params​ 通常指的是 URL Query Parameters(URL 参数,即 ?key=value的部分)。

针对你正在配置的 本地模型分类器,绝大多数情况下:

✅ 结论:Params 留空(不需要填)

因为你的请求体(Body)已经是标准的 JSON 格式,参数主要通过 Body 传递。

📋 正确的填写姿势

1. Params 栏(通常留空)

Key Value 说明
(空) (空) 直接留空

只有在你的本地模型 API 强制要求​ URL 参数时才填,例如:
http://192.168.153.1:1234/api/v1/chat?api_key=xxx

这种情况下:

  • Key: api_key

  • Value: xxx


2. Headers 栏(必须填)

这是最容易出错的地方,一定要填:

Key Value
Content-Type application/json; charset=utf-8

⚠️ 特别注意

charset=utf-8是解决你之前 'ascii' codec can't encode错误的关键


3. Body 栏(核心逻辑)

选择 Raw,填入 JSON:
{
“model”: “http://192.168.153.1:1234/api/v1/chat“,
“messages”: [
{
“role”: “system”,
“content”: “你是一个分类器,请将用户输入分为:A. 闲聊 B. 查知识库 C. 写代码。只返回字母。”
},
{
“role”: “user”,
“content”: “{{#start.user_input#}}”
}
],
“max_tokens”: 5,
“temperature”: 0.1
}

这是因为:

  • Dify 默认用 ASCII 编码序列化 HTTP Body

  • 你的 Prompt 包含中文

  • 没有显式声明 charset=utf-8

✅ 加上 Content-Type: application/json; charset=utf-8后,问题会消失。


✅ 最终 Checklist(100% 可用)

Method POST
URL http://192.168.153.1:1234/api/v1/chat
Headers Content-Type: application/json; charset=utf-8
Body ✅ JSON
model 真实模型名
input ✅ 字符串
max_tokens ❌ 删除