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:
co-authored by
Claude Sonnet 5
parent
b0c7439c01
commit
d0e31b198f
@@ -0,0 +1,34 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// ModelsHandler serves GET /v1/models (OpenAI-style list).
|
||||
type ModelsHandler struct {
|
||||
db *gorm.DB
|
||||
gw *Gateway
|
||||
}
|
||||
|
||||
func NewModelsHandler(db *gorm.DB, gw *Gateway) *ModelsHandler {
|
||||
return &ModelsHandler{db: db, gw: gw}
|
||||
}
|
||||
|
||||
func (h *ModelsHandler) List(c *gin.Context) {
|
||||
models, err := h.gw.channel.ListEnabledModels()
|
||||
if err != nil {
|
||||
c.JSON(502, gin.H{"error": gin.H{"message": "list models failed", "type": "api_error"}})
|
||||
return
|
||||
}
|
||||
data := make([]gin.H, 0, len(models))
|
||||
for _, m := range models {
|
||||
data = append(data, gin.H{
|
||||
"id": m.Name,
|
||||
"object": "model",
|
||||
"created": m.CreatedAt.Unix(),
|
||||
"owned_by": "openteam",
|
||||
})
|
||||
}
|
||||
c.JSON(200, gin.H{"object": "list", "data": data})
|
||||
}
|
||||
Reference in New Issue
Block a user