CNB → Dify
基于 HttpRouter 的知识库网关, 将 CNB 知识库 API 转换为 Dify 外部知识库 API 规范,即插即用。
网关配置
API 端点
GET/health
健康检查,无需认证
POST/retrieval
Dify 外部知识库检索接口,需要 Bearer Token 认证
Request Body(根据上方配置生成):
{
"knowledge_id": "hzwxkf/qa-knowledge-base",
"query": "导购恶意积分怎么办",
"retrieval_setting": {
"top_k": 3,
"score_threshold": 0
}
}⚠ 未设置 Token,请求可能被拒绝(401/403)
cloud-functions/api.go — 网关核心代码
package main
import (
"encoding/json"
"net/http"
"os"
"strings"
"github.com/julienschmidt/httprouter"
"cnb-dify-knowledge-gateway/internal/cnb"
"cnb-dify-knowledge-gateway/internal/dify"
)
// Gateway — CNB 知识库 → Dify 外部知识库 桥梁
type Gateway struct {
gatewayAPIKey string
cnbClient *cnb.Client
}
// Bearer Token 认证中间件
func (g *Gateway) authMiddleware(next httprouter.Handle) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
authHeader := r.Header.Get("Authorization")
parts := strings.SplitN(authHeader, " ", 2)
if len(parts) != 2 || parts[1] != g.gatewayAPIKey {
writeError(w, http.StatusForbidden, 1002, "API Key 无效")
return
}
next(w, r, ps)
}
}
// POST /retrieval — Dify 检索接口
func (g *Gateway) handleRetrieval(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
var req dify.RetrievalRequest
json.NewDecoder(r.Body).Decode(&req)
// knowledge_id 即 CNB 仓库路径
chunks, _ := g.cnbClient.Query(req.KnowledgeID, cnb.QueryOptions{
Query: req.Query,
TopK: req.RetrievalSetting.TopK,
ScoreThreshold: req.RetrievalSetting.ScoreThreshold,
})
// 转换为 Dify 规范格式
records := convertChunks(chunks)
writeJSON(w, http.StatusOK, dify.RetrievalResponse{Records: records})
}
func main() {
gw, _ := NewGateway()
router := httprouter.New()
router.GET("/health", gw.handleHealth)
router.POST("/retrieval", gw.authMiddleware(gw.handleRetrieval))
log.Fatal(http.ListenAndServe(":9000", router))
}CNB 知识库直连
knowledge_id 即 CNB 仓库路径,支持多仓库动态查询,零配置映射
Dify API 兼容
完全符合 Dify 外部知识库 API 规范,Bearer Token 认证,即插即用
HttpRouter 零分配
基于 Radix Tree 的高性能路由,零 GC 开销的极致性能