f26f334a2d
CI / docker (push) Failing after 2m7s
引入用户端对话/生图与管理端 Provider 配置,统一 invoke 编排、Gateway、请求日志与模型管理;前端按设计规范拆分布局,Go module 更名为 github.com/rose_cat707/Atlas;生图长任务进度改为 SSE 推送,后端仍轮询上游。 Co-authored-by: Cursor <cursoragent@cursor.com>
96 lines
2.1 KiB
Go
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
|
|
}
|