展开本页目录
开始前准备什么
- 拥有 Dify 工作区管理员或所有者权限,能安装模型供应商插件。
- 已在 apizt 创建自己的 API Key,账户余额与模型权限可用。
- Dify 服务端能访问 api.apizt.com;浏览器能打开网站不能替代服务端网络检查。
- 检查模型与 API
- 添加供应商
- 运行短工作流
- 核对结果与费用
2026-10-23 核验材料;实际执行范围、结果与限制见下方记录。
补充:原有练习资料与下载
Python 标准库;Key 从环境变量读取,默认不重试。
真实接入检查:插件协议通过,测试Key分组429
官方插件本地协议验证通过;使用现有Key向apizt真实调用时,该测试分组HTTP429上游饱和,未完成文本生成,不代表全站故障。
· 未改动官方Dify插件在本机协议fixture成功;另用授权现有Key向apizt HTTPS真实invoke,当前测试Key分组返回HTTP429上游饱和,插件随后报list index out of range。没有真实文本输出,未验证完整Dify UI/工作流,不能扩为全站故障。另一次validate因临时进程SSL导入递归在本地失败,未取得HTTP状态且未重投。
已取得下列真实结果;仍有内容质量或功能范围需要按本页检查项复核。
- 运行环境
- 0.0.68 / dify-plugin SDK0.10.2;macOS arm64,本地独立运行目录;无私人素材、无付费API调用
1. 在Dify工作区由owner/admin进入Integrations→Model Pro
在Dify工作区由owner/admin进入Integrations→Model Provider,安装OpenAI-API-compatible;先记录插件版本。
2. Add Model中选择LLM与Chat模式;API Base URL填服务商完整基础地
Add Model中选择LLM与Chat模式;API Base URL填服务商完整基础地址(apizt示例https://api.apizt.com/v1),不要填完整/chat/completions。
3. Model Name/显示名称可用于界面识别;API endpoint中的模型名称填当前
Model Name/显示名称可用于界面识别;API endpoint中的模型名称填当前模型广场准确调用ID;Key必须属于相同服务和可用分组。
4. 按上游能力选择Chat Completions或Responses;先使用普通文字、关闭
按上游能力选择Chat Completions或Responses;先使用普通文字、关闭未经验证的工具、视觉、额外thinking参数。保存验证会发真实ping请求,可能计费。
5. 新建最小工作流Start→LLM→End,LLM选择刚添加模型,输入一条固定问题,Run
新建最小工作流Start→LLM→End,LLM选择刚添加模型,输入一条固定问题,Run后核对输出和请求日志;知识库embedding和rerank需另外配置。
6. 本次离线真实插件实测:Base URL=/v1时请求/v1/chat/completio
本次离线真实插件实测:Base URL=/v1时请求/v1/chat/completions,endpoint_model_name覆盖显示名,正确解析LOCAL_PROTOCOL_FIXTURE_OK;误填完整endpoint时产生双重/chat/completions并404。离线fixture只证明协议路径,不能证明服务商真实可用。
bashpython fetch-official-source.py python run-dify-plugin.py7. 若启用流式再核对stream_options/include_usage和实际usage
若启用流式再核对stream_options/include_usage和实际usage;Dify估算价/fixture token数不等于apizt真实扣费。
8. 按HTTP429响应定位当前分组阻点
本次真实Key调用返回分组上游饱和。记录时间、请求ID、所用Key分组和HTTP状态;先处理对应分组,不把它扩成全站故障,也不连续点Run或机械切换模型。插件的list index out of range是后续症状。
这次实际得到什么
- 官方插件0.0.68、SDK0.10.2,插件源码commit a499463382018a15fdd73fe089e5d69a99feab70。
- 真实validate_credentials发出ping;真实invoke解析本地固定fixture返回LOCAL_PROTOCOL_FIXTURE_OK。
- API基础地址为/v1时请求/v1/chat/completions;误填完整endpoint则请求双重路径并404。
- 接口中的endpoint_model_name=tutorial-fixture覆盖界面显示名;仅离线协议验证,未验证真实模型、Dify UI或账单。
- 真实POST使用gemini-2.5-flash-lite,HTTP429:Current group upstream load is saturated。
- 范围仅本次测试Key所属分组;429后没有继续切模型或重发。
- 插件随后报list index out of range,实际阻点须以HTTP状态和响应正文为准;没有真实输出文本。
使用这份结果时注意
- 未改动官方Dify插件在本机协议fixture成功;另用授权现有Key向apizt HTTPS真实invoke,当前测试Key分组返回HTTP429上游饱和,插件随后报list index out of range。没有真实文本输出,未验证完整Dify UI/工作流,不能扩为全站故障。另一次validate因临时进程SSL导入递归在本地失败,未取得HTTP状态且未重投。
- 最初测试程序未遍历SDK0.10.2的invoke生成器,无法读取result;修正测试程序消费所有真实chunk后成功,官方插件源码未改变。
- 真实网关invoke:本次测试Key分组HTTP429,上游负载饱和;不代表所有Key/模型或网站不可用。停止后续生成。
- 插件在429响应后出现list index out of range,应先查看HTTP状态/响应正文和request id,不能把本地Python异常当成根因。
- 补充validate本地SSL递归错误未取得HTTP状态,未重投。
选对插件,按模型添加
新版进入 Integrations → Model Provider;旧版位于设置 → 模型供应商。若列表中没有 OpenAI-API-compatible,先从 Marketplace 安装发布者为 langgenius 的供应商插件。这里配置的是模型供应商,不是名称相似的 OpenAI 图片工具插件。
界面字段可能随插件版本变化。下面给出文字模型的保守起点;插件提供能力开关,不表示当前网关已经支持所有能力。
| 字段 | 填写值 | 核对要点 |
|---|---|---|
| Model Type | LLM | Embedding、Rerank 需要各自模型,不用 glm-5.3 代替。 |
| Model Name | glm-5.3 | 填写调用 ID;显示名称可以另取。 |
| API Key | 自己的 apizt Key | 保存在供应商凭据中,不放进提示词。 |
| API Base URL | https://api.apizt.com/v1 | 这是前缀,不追加 /chat/completions。 |
| Completion mode | Chat | 对应文字对话端点。 |
| Context size / Max tokens | 当前通道已确认的限制 | 插件默认值不等于所选型号的官方最大规格。 |
| Vision / Function Call / Web Search | 先关闭,验证后开启 | 工具、图片和联网各自检查,不按品牌统一开启。 |
- 字段
- Model Type
- 填写值
- LLM
- 核对要点
- Embedding、Rerank 需要各自模型,不用 glm-5.3 代替。
- 字段
- Model Name
- 填写值
- glm-5.3
- 核对要点
- 填写调用 ID;显示名称可以另取。
- 字段
- API Key
- 填写值
- 自己的 apizt Key
- 核对要点
- 保存在供应商凭据中,不放进提示词。
- 字段
- API Base URL
- 填写值
- https://api.apizt.com/v1
- 核对要点
- 这是前缀,不追加 /chat/completions。
- 字段
- Completion mode
- 填写值
- Chat
- 核对要点
- 对应文字对话端点。
- 字段
- Context size / Max tokens
- 填写值
- 当前通道已确认的限制
- 核对要点
- 插件默认值不等于所选型号的官方最大规格。
- 字段
- Vision / Function Call / Web Search
- 填写值
- 先关闭,验证后开启
- 核对要点
- 工具、图片和联网各自检查,不按品牌统一开启。
先把 API 与 Dify 问题分开
下载探测脚本,用 Python 3 运行一次同样的文字模型请求。它仅调用 /chat/completions,不读取你的 Dify 设置,也不自动重试。使用环境变量提供 Key,可选 tokenba_MODEL 更换精确型号。
运行 python3 framework-dify-probe.py 后,检查 answer 是否非空、finish_reason 是否为 length,以及 usage 和请求记录。如果基础请求已失败,先处理 Key、余额、模型权限或网络。脚本通过仍需继续验证 Dify 内的实际工作流。
framework-dify-probe.py
import json
import os
import sys
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen
def main():
key = os.environ["tokenba_API_KEY"]
base = os.getenv("tokenba_BASE_URL", "https://api.apizt.com/v1").rstrip("/")
model = os.getenv("tokenba_MODEL", "glm-5.3")
payload = {
"model": model,
"messages": [{"role": "user", "content": "用一句话解释 API Base URL。"}],
"max_tokens": 1024,
"stream": False,
}
request = Request(
base + "/chat/completions",
data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
headers={"Authorization": "Bearer " + key, "Content-Type": "application/json"},
method="POST",
)
try:
with urlopen(request, timeout=60) as response:
data = json.load(response)
request_id = response.headers.get("x-request-id")
except HTTPError as error:
print("HTTP:", error.code, "request_id:", error.headers.get("x-request-id"), file=sys.stderr)
raise SystemExit(1) from None
except (URLError, TimeoutError):
print("连接失败或读取超时;检查证书与网络,再查调用记录,不自动重发。", file=sys.stderr)
raise SystemExit(1) from None
choices = data.get("choices") or []
if not choices:
raise SystemExit("缺少 choices;检查当前模型与接口。")
choice = choices[0]
answer = choice.get("message", {}).get("content")
print("model:", data.get("model"))
print("request_id:", request_id)
print("answer:", answer)
print("finish_reason:", choice.get("finish_reason"))
print("usage:", json.dumps(data.get("usage"), ensure_ascii=False))
if not isinstance(answer, str) or not answer.strip() or choice.get("finish_reason") == "length":
raise SystemExit("输出为空或被截断;调整参数前先核对本次调用记录。")
if __name__ == "__main__":
main()用一条工作流验证模型
把「供应商验证成功」与「你的工作流运行成功」分别验收。保存供应商时也可能发出验证请求,统计试用费用时应包含这些请求。
- 新建 Workflow,Start 节点增加短文本输入 text。
- 添加 LLM 节点,选择刚保存的供应商与 glm-5.3。用户消息引用 Start.text,系统提示要求仅回答给定问题。
- End 节点输出 LLM.text;先不要连接知识库、Agent 或外部写入节点。
- 输入「用两条要点解释 API Key 与 Base URL 的区别」,执行一次并保存 Dify 的运行记录。
- 核对实际回答、运行结束状态与控制台扣费,再发布为应用。
知识库需要独立的检索配置
文字模型负责生成回答,Embedding 模型负责把资料和查询转换为向量。使用知识库时,单独添加已确认可用的 Embedding 型号,核对维度、批量大小和索引方式。更换 Embedding 型号或维度后通常需要重新建立索引。
先准备一段能人工核对的制度说明,测试一个资料中有答案的问题和一个没有答案的问题。答案要引用来源片段;没有依据时应说明无法确认。把召回数量、片段长度与对话历史一起计入输入预算。
流式与 Agent 分开验收
| 想使用的能力 | 追加的验收 | 不能据此推断 |
|---|---|---|
| 流式文字 | 首段文字、完整结束、最终 usage;必要时查看 SSE 事件 | 收到首段不代表整次任务已完成。 |
| 工具调用 | 工具名称与参数、执行结果、工具结果回传后的最终答案 | 模型发出 tool_calls 不代表业务函数已执行。 |
| 结构化输出 | 服务端接受 Schema,客户端校验字段与类型 | 提示词要求 JSON 不是 JSON Schema 强制约束。 |
| 图片或 PDF | 按所选型号和插件检查输入格式、大小与通道能力 | LLM 配置成功不代表文件上传、视觉或 OCR 可用。 |
- 想使用的能力
- 流式文字
- 追加的验收
- 首段文字、完整结束、最终 usage;必要时查看 SSE 事件
- 不能据此推断
- 收到首段不代表整次任务已完成。
- 想使用的能力
- 工具调用
- 追加的验收
- 工具名称与参数、执行结果、工具结果回传后的最终答案
- 不能据此推断
- 模型发出 tool_calls 不代表业务函数已执行。
- 想使用的能力
- 结构化输出
- 追加的验收
- 服务端接受 Schema,客户端校验字段与类型
- 不能据此推断
- 提示词要求 JSON 不是 JSON Schema 强制约束。
- 想使用的能力
- 图片或 PDF
- 追加的验收
- 按所选型号和插件检查输入格式、大小与通道能力
- 不能据此推断
- LLM 配置成功不代表文件上传、视觉或 OCR 可用。
从失败位置定位,而不是反复换 Key
| 现象 | 优先检查 | 下一步 |
|---|---|---|
| 插件卡片缺失 | 插件是否安装、管理员权限与版本 | 确认发布者,刷新供应商列表。 |
| 保存时报 401 | Key 是否来自 apizt,是否有多余空格 | 重新绑定凭据;不把官方账户 Key 与中转 Key 混用。 |
| 404 / model not found | Base URL 与精确调用 ID | 保持 /v1 前缀,去掉复制来的品牌展示名。 |
| unsupported parameter | 插件发送的参数与通道支持 | 记录原始错误,逐项关闭可选字段,不同时改所有设置。 |
| curl 成功,Dify 失败 | Dify 所在服务器的网络、插件字段与协议 | 从服务器侧复现同一请求,核对实际目标地址。 |
| 超时或仅部分文字 | 服务端记录、输出预算、Dify 超时配置 | 先查调用记录;不要自动重跑整条工作流。 |
- 现象
- 插件卡片缺失
- 优先检查
- 插件是否安装、管理员权限与版本
- 下一步
- 确认发布者,刷新供应商列表。
- 现象
- 保存时报 401
- 优先检查
- Key 是否来自 apizt,是否有多余空格
- 下一步
- 重新绑定凭据;不把官方账户 Key 与中转 Key 混用。
- 现象
- 404 / model not found
- 优先检查
- Base URL 与精确调用 ID
- 下一步
- 保持 /v1 前缀,去掉复制来的品牌展示名。
- 现象
- unsupported parameter
- 优先检查
- 插件发送的参数与通道支持
- 下一步
- 记录原始错误,逐项关闭可选字段,不同时改所有设置。
- 现象
- curl 成功,Dify 失败
- 优先检查
- Dify 所在服务器的网络、插件字段与协议
- 下一步
- 从服务器侧复现同一请求,核对实际目标地址。
- 现象
- 超时或仅部分文字
- 优先检查
- 服务端记录、输出预算、Dify 超时配置
- 下一步
- 先查调用记录;不要自动重跑整条工作流。
本次补测:先完成搜索要解决的问题,再进入下一步
供应商验证成功不代表知识库回答有正确引用。
新增样例是 API 引用流程,不是 Dify 内的索引、Embedding 或检索运行证明。
- 先完成 OpenAI-API-compatible 插件的小请求验证。
- 把资料片段绑定稳定来源ID和原文件,再让模型输出结论及source_ids。
- 用程序将引用映射回输入文件,拒绝不存在或不支持结论的来源。
新增补测结果;与原有原生工具记录分别保存
{
"answer": "DEMO-KETTLE的保修期为2年。清洗时底座不可浸水。",
"source_ids": [
"manual-1",
"manual-2"
]
}怎样确认已经完成
- 供应商保存成功后,最小文字工作流也实际完成。
- 回答可读且未被截断,实际型号和模型权限一致。
- 记录验证请求与工作流请求的 usage,并对照控制台实扣。
- 工具、文件和知识库分别测试,未测试的能力不向用户承诺。
常见问题
Dify 添加一个供应商会自动显示所有 apizt 模型吗?
自定义供应商通常逐模型添加。按当前模型广场的调用 ID 创建条目,再选择用于具体应用;不要把约 370 个目录型号全部当成已验证的 Dify 能力。
可以直接用 Dify 的 OpenAI 插件改 Base URL 吗?
部分版本的 OpenAI 插件支持自定义地址,但它有自己的模型列表、协议选择和参数逻辑。本页采用可自定义型号的 OpenAI-API-compatible 路径;若使用其他插件,重新核对字段和真实请求。
Dify 显示的 token 数就是最终账单吗?
不一定。插件可能使用估算,流式 usage 也可能缺失。记录 API 返回的 usage、全部请求次数,再对照 apizt 控制台实扣。

