| | package handler
|
| |
|
| | import (
|
| | "crypto/rand"
|
| | "encoding/hex"
|
| | "errors"
|
| | "fmt"
|
| | "io"
|
| | "net/http"
|
| |
|
| | "zencoder-2api/internal/service"
|
| |
|
| | "github.com/gin-gonic/gin"
|
| | )
|
| |
|
| | type GrokHandler struct {
|
| | svc *service.GrokService
|
| | }
|
| |
|
| | func NewGrokHandler() *GrokHandler {
|
| | return &GrokHandler{svc: service.NewGrokService()}
|
| | }
|
| |
|
| |
|
| | func generateGrokTraceID() string {
|
| | b := make([]byte, 16)
|
| | rand.Read(b)
|
| | return hex.EncodeToString(b)
|
| | }
|
| |
|
| |
|
| | func (h *GrokHandler) ChatCompletions(c *gin.Context) {
|
| | body, err := io.ReadAll(c.Request.Body)
|
| | if err != nil {
|
| | c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
| | return
|
| | }
|
| |
|
| | if err := h.svc.ChatCompletionsProxy(c.Request.Context(), c.Writer, body); err != nil {
|
| | h.handleError(c, err)
|
| | }
|
| | }
|
| |
|
| |
|
| | func (h *GrokHandler) handleError(c *gin.Context, err error) {
|
| | if errors.Is(err, service.ErrNoAvailableAccount) || errors.Is(err, service.ErrNoPermission) {
|
| | traceID := generateGrokTraceID()
|
| | errMsg := fmt.Sprintf("没有可用token(traceid: %s)", traceID)
|
| | c.JSON(http.StatusServiceUnavailable, gin.H{"error": errMsg})
|
| | return
|
| | }
|
| | c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
| | }
|
| |
|