下面是我弄完了以后让AI总结的步骤和实现方法,如果有类似的需求可以暂时先参考一下。等作者更新适配其它的模型。希望对大家有所帮助。
一、起点:发现 MiniMax API 不是 OpenAI 兼容
第一次尝试(失败):我以为 MiniMax 的 /v1/embeddings 跟 OpenAI 兼容,只是在 embedder.go 加了 provider 分支复用 einoembedopenai。结果你测试时报了两个错误:
- 404 page not found — 因为你在 UI 里 base URL 填了 https://api.minimax.cn/v1/embeddings(多带了 /embeddings),后端代码会在末尾自动拼 /embeddings,最终请求是 /embeddings/embeddings。
- 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 个文件)
- 新增 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 但业务失败
- 修改 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
- 修改 internal/app/app.go 两处
在 embedder 创建后、retriever/indexer 创建前分别切换 type:
embedder.SetEmbeddingType("query") // ← 给 retriever 用
knowledgeRetriever = NewRetriever(...)
embedder.SetEmbeddingType("db") // ← 给 indexer 用
knowledgeIndexer = NewIndexer(...)
因为 db/query 两种向量不同,必须严格按场景切换,否则检索时算相似度会全部失败。
- 前端 web/templates/index.html
在 embedding provider 下拉菜单里加一行 MiniMax。
下面是我弄完了以后让AI总结的步骤和实现方法,如果有类似的需求可以暂时先参考一下。等作者更新适配其它的模型。希望对大家有所帮助。
一、起点:发现 MiniMax API 不是 OpenAI 兼容
第一次尝试(失败):我以为 MiniMax 的 /v1/embeddings 跟 OpenAI 兼容,只是在 embedder.go 加了 provider 分支复用 einoembedopenai。结果你测试时报了两个错误:
所以我去用 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 个文件)
完全绕开 OpenAI 客户端,直接 http.Post + 手写 JSON marshal/unmarshal:
在 embedder 创建后、retriever/indexer 创建前分别切换 type:
embedder.SetEmbeddingType("query") // ← 给 retriever 用
knowledgeRetriever = NewRetriever(...)
embedder.SetEmbeddingType("db") // ← 给 indexer 用
knowledgeIndexer = NewIndexer(...)
因为 db/query 两种向量不同,必须严格按场景切换,否则检索时算相似度会全部失败。
在 embedding provider 下拉菜单里加一行 MiniMax。