Skip to content

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

Description

@n0body1010

下面是我弄完了以后让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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions