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>
35 lines
780 B
Go
35 lines
780 B
Go
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})
|
|
}
|