feat: 优化 Model 连接测试,支持阿里云 DashScope
- 添加阿里云 provider 支持 - 添加连接超时 (10s) - 优化 URL 构建逻辑 - 默认状态改为 inactive - 添加详细日志 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -170,11 +170,11 @@ func main() {
|
||||
modelGroup := r.Group("/model")
|
||||
{
|
||||
modelGroup.GET("/list", modelHandler.List)
|
||||
modelGroup.GET("/:id", modelHandler.GetByID)
|
||||
modelGroup.POST("/test", modelHandler.Test)
|
||||
modelGroup.POST("/add", modelHandler.Create)
|
||||
modelGroup.GET("/:id", modelHandler.GetByID)
|
||||
modelGroup.PUT("/:id", modelHandler.Update)
|
||||
modelGroup.DELETE("/:id", modelHandler.Delete)
|
||||
modelGroup.POST("/test", modelHandler.Test)
|
||||
}
|
||||
|
||||
// 系统信息模块
|
||||
|
||||
@@ -39,6 +39,7 @@ type CreateModelRequest struct {
|
||||
APIKey string `json:"api_key" binding:"required"`
|
||||
BaseURL string `json:"base_url" binding:"required"`
|
||||
APIEndpoint string `json:"api_endpoint"`
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
// UpdateModelRequest 更新模型请求
|
||||
|
||||
@@ -5,7 +5,10 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
"x-agents/server/internal/model"
|
||||
"x-agents/server/internal/repository"
|
||||
|
||||
@@ -33,6 +36,12 @@ func (s *ModelService) GetByID(id string) (*model.ModelInfo, error) {
|
||||
|
||||
// Create 创建模型
|
||||
func (s *ModelService) Create(req model.CreateModelRequest) (*model.ModelInfo, error) {
|
||||
// 如果没有提供状态,默认设置为 inactive
|
||||
status := req.Status
|
||||
if status == "" {
|
||||
status = "inactive"
|
||||
}
|
||||
|
||||
info := &model.ModelInfo{
|
||||
ID: uuid.New().String(),
|
||||
Name: req.Name,
|
||||
@@ -42,7 +51,7 @@ func (s *ModelService) Create(req model.CreateModelRequest) (*model.ModelInfo, e
|
||||
APIKey: req.APIKey,
|
||||
BaseURL: req.BaseURL,
|
||||
APIEndpoint: req.APIEndpoint,
|
||||
Status: "active",
|
||||
Status: status,
|
||||
}
|
||||
|
||||
if err := s.repo.Create(info); err != nil {
|
||||
@@ -105,20 +114,36 @@ func (s *ModelService) Delete(id string) error {
|
||||
|
||||
// TestConnection 测试模型连接
|
||||
func (s *ModelService) TestConnection(req model.TestModelRequest) (*model.TestModelResponse, error) {
|
||||
log.Printf("[TestConnection] 开始测试连接: provider=%s, model=%s, base_url=%s, api_endpoint=%s", req.Provider, req.Model, req.BaseURL, req.APIEndpoint)
|
||||
|
||||
// 构建请求 URL
|
||||
baseURL := req.BaseURL
|
||||
// 去掉 base_url 末尾的斜杠
|
||||
baseURL = strings.TrimRight(baseURL, "/")
|
||||
|
||||
if req.APIEndpoint != "" {
|
||||
baseURL = baseURL + req.APIEndpoint
|
||||
// 去掉 api_endpoint 开头的斜杠
|
||||
apiEndpoint := strings.TrimLeft(req.APIEndpoint, "/")
|
||||
baseURL = baseURL + "/" + apiEndpoint
|
||||
} else {
|
||||
// 默认端点
|
||||
// 默认端点 - 根据不同 provider 设置
|
||||
switch req.Provider {
|
||||
case "OpenAI":
|
||||
baseURL = baseURL + "/v1/chat/completions"
|
||||
case "Ollama":
|
||||
baseURL = baseURL + "/api/chat"
|
||||
case "ali", "Ali", "aliyun", "Aliyun":
|
||||
// 阿里云 DashScope 兼容 OpenAI 格式,需要添加 /chat/completions
|
||||
// base_url 格式: https://dashscope.aliyuncs.com/compatible-mode/v1
|
||||
baseURL = baseURL + "/chat/completions"
|
||||
default:
|
||||
// 默认使用 OpenAI 兼容格式
|
||||
baseURL = baseURL + "/v1/chat/completions"
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("[TestConnection] 请求 URL: %s", baseURL)
|
||||
|
||||
// 构建请求体
|
||||
requestBody := map[string]interface{}{
|
||||
"model": req.Model,
|
||||
@@ -141,11 +166,19 @@ func (s *ModelService) TestConnection(req model.TestModelRequest) (*model.TestMo
|
||||
|
||||
httpReq.Header.Set("Content-Type", "application/json")
|
||||
if req.APIKey != "" {
|
||||
httpReq.Header.Set("Authorization", "Bearer "+req.APIKey)
|
||||
// 根据不同 provider 使用不同的认证方式
|
||||
switch req.Provider {
|
||||
case "ali", "Ali", "aliyun", "Aliyun":
|
||||
// 阿里云使用 x-api-key 头部
|
||||
httpReq.Header.Set("Authorization", "Bearer "+req.APIKey)
|
||||
httpReq.Header.Set("x-api-key", req.APIKey)
|
||||
default:
|
||||
httpReq.Header.Set("Authorization", "Bearer "+req.APIKey)
|
||||
}
|
||||
}
|
||||
|
||||
// 发送请求
|
||||
client := &http.Client{}
|
||||
// 发送请求,设置 10 秒超时
|
||||
client := &http.Client{Timeout: 10 * time.Second}
|
||||
resp, err := client.Do(httpReq)
|
||||
if err != nil {
|
||||
return &model.TestModelResponse{Success: false, Message: err.Error()}, nil
|
||||
@@ -158,6 +191,8 @@ func (s *ModelService) TestConnection(req model.TestModelRequest) (*model.TestMo
|
||||
return &model.TestModelResponse{Success: false, Message: err.Error()}, nil
|
||||
}
|
||||
|
||||
log.Printf("[TestConnection] 响应状态码: %d, 响应体: %s", resp.StatusCode, string(respBody))
|
||||
|
||||
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
|
||||
return &model.TestModelResponse{Success: true, Message: "Connection successful"}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user