package ai import ( "encoding/json" "fmt" "net/http" "github.com/youruser/base/internal/logic/ai" "github.com/youruser/base/internal/svc" "github.com/youruser/base/internal/types" "github.com/zeromicro/go-zero/rest/httpx" ) func AiChatCompletionsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req types.AIChatCompletionRequest if err := httpx.ParseJsonBody(r, &req); err != nil { httpx.ErrorCtx(r.Context(), w, err) return } l := ai.NewAiChatCompletionsLogic(r.Context(), svcCtx) if req.Stream { // SSE streaming mode w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("Access-Control-Allow-Origin", "*") flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "streaming not supported", http.StatusInternalServerError) return } streamChan, err := l.ChatStream(&req) if err != nil { errData, _ := json.Marshal(map[string]string{"error": err.Error()}) fmt.Fprintf(w, "data: %s\n\n", errData) flusher.Flush() return } for chunk := range streamChan { data, _ := json.Marshal(chunk) fmt.Fprintf(w, "data: %s\n\n", data) flusher.Flush() } fmt.Fprintf(w, "data: [DONE]\n\n") flusher.Flush() } else { // Normal (non-streaming) mode resp, err := l.Chat(&req) if err != nil { httpx.ErrorCtx(r.Context(), w, err) } else { httpx.OkJsonCtx(r.Context(), w, resp) } } } }