Files
Atlas/internal/provider/router.go
T
renjue f26f334a2d
CI / docker (push) Failing after 2m7s
实现 Atlas AI 平台一期能力并完成品牌化改造。
引入用户端对话/生图与管理端 Provider 配置,统一 invoke 编排、Gateway、请求日志与模型管理;前端按设计规范拆分布局,Go module 更名为 github.com/rose_cat707/Atlas;生图长任务进度改为 SSE 推送,后端仍轮询上游。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 20:18:37 +08:00

96 lines
2.1 KiB
Go

package provider
import (
"context"
"fmt"
"net/http"
"strings"
"time"
"github.com/rose_cat707/Atlas/internal/service/reqlog"
"github.com/rose_cat707/Atlas/internal/store"
)
type Config struct {
ID int64
Name string
Protocol string
BaseURL string
APIKey string
ServiceType string
ExtraJSON string
}
type Router struct {
store *store.Store
client *http.Client
streamClient *http.Client
logger *reqlog.Logger
}
func NewRouter(st *store.Store, logger *reqlog.Logger) *Router {
return &Router{
store: st,
client: &http.Client{
Timeout: 120 * time.Second,
},
streamClient: &http.Client{},
logger: logger,
}
}
func (r *Router) Resolve(ctx context.Context, serviceType string, providerID int64) (*Config, error) {
var p *store.Provider
var err error
if providerID > 0 {
p, err = r.store.GetProvider(ctx, providerID)
} else {
p, err = r.store.DefaultProvider(ctx, serviceType)
}
if err != nil {
return nil, fmt.Errorf("no provider for %s: %w", serviceType, err)
}
return r.providerToConfig(p)
}
func (r *Router) ResolveByProtocol(ctx context.Context, serviceType, protocol string, providerID int64) (*Config, error) {
if providerID > 0 {
p, err := r.store.GetProvider(ctx, providerID)
if err != nil {
return nil, err
}
return r.providerToConfig(p)
}
providers, err := r.store.ListProviders(ctx, serviceType, true)
if err != nil {
return nil, err
}
for _, p := range providers {
if protocol == "" || p.Protocol == protocol {
return r.providerToConfig(&p)
}
}
return nil, fmt.Errorf("no provider for %s/%s", serviceType, protocol)
}
func (r *Router) providerToConfig(p *store.Provider) (*Config, error) {
if !p.Enabled {
return nil, fmt.Errorf("provider %d disabled", p.ID)
}
return &Config{
ID: p.ID,
Name: p.Name,
Protocol: p.Protocol,
BaseURL: strings.TrimRight(p.BaseURL, "/"),
APIKey: p.APIKey,
ServiceType: p.ServiceType,
ExtraJSON: p.ExtraJSON,
}, nil
}
type ProxyResult struct {
StatusCode int
Body []byte
Headers http.Header
}