#293

知识库功能似乎原本不支持minimax模型,我用AI修改了一下,现在我能用minimax了,希望作者能更新一下,支持更多模型的api就好了

Openn0body1010opened 2mo ago

下面是我弄完了以后让AI总结的步骤和实现方法,如果有类似的需求可以暂时先参考一下。等作者更新适配其它的模型。希望对大家有所帮助。

一、起点:发现 MiniMax API 不是 OpenAI 兼容

第一次尝试(失败):我以为 MiniMax 的 /v1/embeddings 跟 OpenAI 兼容,只是在 embedder.go 加了 provider 分支复用 einoembedopenai。结果你测试时报了两个错误:

  1. 404 page not found — 因为你在 UI 里 base URL 填了 https://api.minimax.cn/v1/embeddings(多带了 /embeddings),后端代码会在末尾自动拼 /embeddings,最终请求是 /embeddings/embeddings。
  2. invalid character 'p' — 即使 base URL 改对了,去掉 /embeddings 后仍然报 "404 Not Found" 的 body 不是 JSON(HTML)。

所以我去用 curl 实际探测了 MiniMax 的真实 API 格式(用你提供的 API key),发现了关键差异。

二、用 curl 摸清 MiniMax API 的真实格式

┌───────────┬──────────────────┬────────────────────────────────────────────┐ │ 维度 │ OpenAI │ MiniMax 实际 │ ├───────────┼──────────────────┼────────────────────────────────────────────┤ │ 请求字段 │ input │ texts(数组) │ ├───────────┼──────────────────┼────────────────────────────────────────────┤ │ 必填参数 │ model, input │ model, texts, type │ ├───────────┼──────────────────┼────────────────────────────────────────────┤ │ type 取值 │ — │ db(建索引)/ query(检索) │ ├───────────┼──────────────────┼────────────────────────────────────────────┤ │ 响应字段 │ data[].embedding │ vectors(二维数组直接放) │ ├───────────┼──────────────────┼────────────────────────────────────────────┤ │ 维度 │ 1536 │ 1536 ✅ │ ├───────────┼──────────────────┼────────────────────────────────────────────┤ │ 域名 │ api.openai.com │ 国内 api.minimax.cn、国际 api.minimaxi.com │ └───────────┴──────────────────┴────────────────────────────────────────────┘

最关键的发现:db 和 query 两种 type 对同一文本返回完全不同的向量(L1 差 17.58),意味着不能用一个固定 type — 调用方必须区分场景。

三、改源码(3 个文件)

  1. 新增 internal/knowledge/minimax_embedder.go(核心)

完全绕开 OpenAI 客户端,直接 http.Post + 手写 JSON marshal/unmarshal:

  • 请求 body:{"model":"embo-01","texts":[...],"type":"db|query"}
  • 响应解析:vectors[][]float64
  • 校验 base_resp.status_code == 0 防止 HTTP 200 但业务失败
  1. 修改 internal/knowledge/embedder.go
  • 加 provider 字段记录当前是哪个 provider
  • 加 SetEmbeddingType(t string) 方法:MiniMax provider 时切换 embedder 的 type 字段;其他 provider 是 no-op
  • 默认 base URL 从错的 api.minimaxi.com(国际)改成 api.minimaxi.cn(国内)
  • provider 分发:minimax 用新定制 embedder,其他(openai)继续用 einoembedopenai
  1. 修改 internal/app/app.go 两处

在 embedder 创建后、retriever/indexer 创建前分别切换 type:

embedder.SetEmbeddingType("query") // ← 给 retriever 用 knowledgeRetriever = NewRetriever(...)

embedder.SetEmbeddingType("db") // ← 给 indexer 用 knowledgeIndexer = NewIndexer(...)

因为 db/query 两种向量不同,必须严格按场景切换,否则检索时算相似度会全部失败。

  1. 前端 web/templates/index.html

在 embedding provider 下拉菜单里加一行 MiniMax。

Activity

0

No activity yet.