fix: 修正 OpenAI/Anthropic Provider 初始化参数顺序

修复 manager.go 中两处调用 NewOpenAIProvider 和 NewAnthropicProvider
时参数顺序错误的问题。原代码将 baseURL 和 apiKey 参数传反,导致
API key 被当作 URL 使用,引发 "unsupported protocol scheme" 错误。

Changed:
- LoadProvidersFromDB: 调整参数顺序为 (apiKey, baseURL, "")
- GetActiveProvider: 调整参数顺序为 (apiKey, baseURL, "")
This commit is contained in:
selfrelease
2026-06-22 18:02:23 +08:00
parent 56401ec7ee
commit fe2c6fb2e4
7 changed files with 329 additions and 18 deletions
+20 -2
View File
@@ -19,13 +19,23 @@ import (
type AnalysisTemplateHandler struct {
pool *pgxpool.Pool
manager *llm.Manager
provider string
provider string // 保留作为 fallback
}
func NewAnalysisTemplateHandler(pool *pgxpool.Pool, manager *llm.Manager, provider string) *AnalysisTemplateHandler {
manager.SetPool(pool)
return &AnalysisTemplateHandler{pool: pool, manager: manager, provider: provider}
}
// getProvider 获取当前激活的 provider
func (h *AnalysisTemplateHandler) getProvider(ctx context.Context) (llm.Provider, error) {
provider, err := h.manager.GetActiveProvider(ctx)
if err == nil {
return provider, nil
}
return h.manager.GetProvider(h.provider)
}
func (h *AnalysisTemplateHandler) ListTemplates(w http.ResponseWriter, r *http.Request) {
orgID := r.URL.Query().Get("org_id")
query := `SELECT id, name, report_type, COALESCE(description,''), COALESCE(icon,''), steps, sort_order
@@ -236,7 +246,15 @@ func (h *AnalysisTemplateHandler) GenerateReport(w http.ResponseWriter, r *http.
}
startTime := time.Now()
body, err := h.manager.ChatStream(r.Context(), h.provider, llmReq)
// 获取激活的 provider
provider, err := h.getProvider(r.Context())
if err != nil {
response.InternalError(w, "获取模型提供商失败")
return
}
body, err := h.manager.ChatStream(r.Context(), provider, llmReq)
if err != nil {
response.Error(w, http.StatusBadGateway, 50202, "模型服务不可用: "+err.Error())
return
+40 -4
View File
@@ -22,16 +22,30 @@ import (
type LLMChatHandler struct {
pool *pgxpool.Pool
manager *llm.Manager
provider string
provider string // 保留作为 fallback,当数据库查询失败时使用
rdb *redis.Client
workerURL string
embedder *embedding.Client
}
func NewLLMChatHandler(pool *pgxpool.Pool, manager *llm.Manager, defaultProvider string, rdb *redis.Client, workerURL string, embedder *embedding.Client) *LLMChatHandler {
// 设置数据库连接池到 manager,让它可以从数据库读取 providers
manager.SetPool(pool)
return &LLMChatHandler{pool: pool, manager: manager, provider: defaultProvider, rdb: rdb, workerURL: workerURL, embedder: embedder}
}
// getProvider 获取当前激活的 provider,优先从数据库读取
func (h *LLMChatHandler) getProvider(ctx context.Context) (llm.Provider, error) {
// 尝试从数据库获取激活的 provider
provider, err := h.manager.GetActiveProvider(ctx)
if err == nil {
return provider, nil
}
// 降级到配置的 fallback provider
return h.manager.GetProvider(h.provider)
}
type llmChatRequest struct {
Message string `json:"message"`
ConversationID string `json:"conversation_id,omitempty"`
@@ -563,7 +577,15 @@ func (h *LLMChatHandler) Chat(w http.ResponseWriter, r *http.Request) {
}
startTime := time.Now()
body, err := h.manager.ChatStream(r.Context(), h.provider, llmReq)
// 获取激活的 provider
provider, err := h.getProvider(r.Context())
if err != nil {
response.InternalError(w, "获取模型提供商失败")
return
}
body, err := h.manager.ChatStream(r.Context(), provider, llmReq)
if err != nil {
response.Error(w, http.StatusBadGateway, 50202, "模型服务不可用: "+err.Error())
return
@@ -662,7 +684,14 @@ func (h *LLMChatHandler) Completion(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
convID := uuid.New().String()
body, err := h.manager.ChatStream(r.Context(), h.provider, llmReq)
// 获取激活的 provider
provider, err := h.getProvider(r.Context())
if err != nil {
response.InternalError(w, "获取模型提供商失败")
return
}
body, err := h.manager.ChatStream(r.Context(), provider, llmReq)
if err != nil {
response.Error(w, http.StatusBadGateway, 50202, "模型服务不可用: "+err.Error())
return
@@ -1147,7 +1176,14 @@ func (h *LLMChatHandler) generateConversationName(appID, userID, convID, userMes
Stream: false,
}
result, err := h.manager.Chat(ctx, h.provider, nameReq)
// 获取激活的 provider
provider, err := h.getProvider(ctx)
if err != nil {
log.Warn().Err(err).Msg("get provider for title generation failed")
return
}
result, err := h.manager.Chat(ctx, provider, nameReq)
if err != nil {
return
}
+20 -2
View File
@@ -19,13 +19,23 @@ import (
type DocTemplateHandler struct {
pool *pgxpool.Pool
manager *llm.Manager
provider string
provider string // 保留作为 fallback
}
func NewDocTemplateHandler(pool *pgxpool.Pool, manager *llm.Manager, provider string) *DocTemplateHandler {
manager.SetPool(pool)
return &DocTemplateHandler{pool: pool, manager: manager, provider: provider}
}
// getProvider 获取当前激活的 provider
func (h *DocTemplateHandler) getProvider(ctx context.Context) (llm.Provider, error) {
provider, err := h.manager.GetActiveProvider(ctx)
if err == nil {
return provider, nil
}
return h.manager.GetProvider(h.provider)
}
func (h *DocTemplateHandler) ListTemplates(w http.ResponseWriter, r *http.Request) {
orgID := r.URL.Query().Get("org_id")
query := `SELECT id, name, doc_type, COALESCE(description,''), COALESCE(icon,''), fields, sort_order
@@ -173,7 +183,15 @@ func (h *DocTemplateHandler) GenerateDocument(w http.ResponseWriter, r *http.Req
}
startTime := time.Now()
body, err := h.manager.ChatStream(r.Context(), h.provider, llmReq)
// 获取激活的 provider
provider, err := h.getProvider(r.Context())
if err != nil {
response.InternalError(w, "获取模型提供商失败")
return
}
body, err := h.manager.ChatStream(r.Context(), provider, llmReq)
if err != nil {
response.Error(w, http.StatusBadGateway, 50202, "模型服务不可用: "+err.Error())
return