CNBDify

基于 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 开销的极致性能