feat(server): API relay gateway backend M0-M4

Gin + GORM + pure-Go SQLite. Users/auth (JWT), API key management with
quotas, proxy gateway with weighted channel failover and health checks,
usage/billing ledger, cross-protocol conversion (Anthropic Messages /
OpenAI Chat Completions / OpenAI Responses), and channel/model admin API.
Channels declare native API formats and auto-convert the rest.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Sakurasan
2026-08-15 21:05:02 +08:00
co-authored by Claude Sonnet 5
parent b0c7439c01
commit d0e31b198f
45 changed files with 6222 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
package store
import (
"fmt"
"os"
"path/filepath"
"github.com/glebarez/sqlite"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
func Open(driver, dsn string, debug bool) (*gorm.DB, error) {
cfg := &gorm.Config{}
if debug {
cfg.Logger = logger.Default.LogMode(logger.Info)
} else {
cfg.Logger = logger.Default.LogMode(logger.Warn)
}
var dialector gorm.Dialector
switch driver {
case "postgres":
dialector = postgres.Open(dsn)
default:
if err := os.MkdirAll(filepath.Dir(dsn), 0o755); err != nil {
return nil, fmt.Errorf("create data dir: %w", err)
}
dialector = sqlite.Open(dsn)
}
db, err := gorm.Open(dialector, cfg)
if err != nil {
return nil, err
}
sqlDB, err := db.DB()
if err != nil {
return nil, err
}
sqlDB.SetMaxOpenConns(20)
sqlDB.SetMaxIdleConns(5)
return db, nil
}