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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user