Files
renjue 76ba500417
CI / docker (push) Successful in 2m4s
Initial commit: Luminary AI Gateway
OpenAI-compatible AI gateway with Vue admin UI, multi-provider egress,
ingress key governance, monitoring, and security controls.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 21:46:16 +08:00

91 lines
1.8 KiB
Go

package gateway
import (
"encoding/json"
"fmt"
"strings"
"github.com/rose_cat707/luminary/internal/provider"
)
const maxLogBodyBytes = 16384
func truncateLogBody(b []byte) string {
if len(b) == 0 {
return ""
}
if len(b) <= maxLogBodyBytes {
return string(b)
}
return string(b[:maxLogBodyBytes]) + "\n...(truncated)"
}
func extractModelName(body []byte) string {
if len(body) == 0 {
return ""
}
var payload struct {
Model string `json:"model"`
}
if err := json.Unmarshal(body, &payload); err != nil {
return ""
}
return payload.Model
}
func describeForwardError(err error, resp *provider.ChatResponse) string {
if err != nil {
return err.Error()
}
if resp == nil {
return "unknown error"
}
if resp.StatusCode < 400 {
return ""
}
if msg := extractAPIErrorMessage(resp.Body); msg != "" {
return fmt.Sprintf("status %d: %s", resp.StatusCode, msg)
}
if len(resp.Body) > 0 {
return fmt.Sprintf("status %d: %s", resp.StatusCode, truncateLogBody(resp.Body))
}
return fmt.Sprintf("status %d", resp.StatusCode)
}
func extractAPIErrorMessage(body []byte) string {
if len(body) == 0 {
return ""
}
var openAI struct {
Error struct {
Message string `json:"message"`
Type string `json:"type"`
} `json:"error"`
}
if err := json.Unmarshal(body, &openAI); err == nil {
if openAI.Error.Message != "" {
if openAI.Error.Type != "" {
return openAI.Error.Type + ": " + openAI.Error.Message
}
return openAI.Error.Message
}
}
var simple struct {
Message string `json:"message"`
Error string `json:"error"`
}
if err := json.Unmarshal(body, &simple); err == nil {
if simple.Message != "" {
return simple.Message
}
if simple.Error != "" {
return simple.Error
}
}
s := strings.TrimSpace(string(body))
if len(s) > 240 {
return s[:240] + "..."
}
return s
}