12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package openai
- import (
- "net/http"
- "sync"
- "time"
- "github.com/0xJacky/Nginx-UI/api"
- "github.com/0xJacky/Nginx-UI/internal/helper"
- "github.com/0xJacky/Nginx-UI/internal/llm"
- "github.com/0xJacky/Nginx-UI/settings"
- "github.com/gin-gonic/gin"
- "github.com/gorilla/websocket"
- "github.com/uozi-tech/cosy"
- "github.com/uozi-tech/cosy/logger"
- )
- var mutex sync.Mutex
- // CodeCompletion handles code completion requests
- func CodeCompletion(c *gin.Context) {
- if !settings.OpenAISettings.EnableCodeCompletion {
- cosy.ErrHandler(c, llm.ErrCodeCompletionNotEnabled)
- return
- }
- var upgrader = websocket.Upgrader{
- CheckOrigin: func(r *http.Request) bool {
- return true
- },
- }
- ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
- if err != nil {
- cosy.ErrHandler(c, err)
- return
- }
- defer ws.Close()
- for {
- var codeCompletionRequest llm.CodeCompletionRequest
- err := ws.ReadJSON(&codeCompletionRequest)
- if err != nil {
- if helper.IsUnexpectedWebsocketError(err) {
- logger.Errorf("Error reading JSON: %v", err)
- }
- return
- }
- codeCompletionRequest.UserID = api.CurrentUser(c).ID
- go func() {
- start := time.Now()
- completedCode, err := codeCompletionRequest.Send()
- if err != nil {
- logger.Errorf("Error sending code completion request: %v", err)
- return
- }
- elapsed := time.Since(start)
- mutex.Lock()
- defer mutex.Unlock()
- err = ws.WriteJSON(gin.H{
- "code": completedCode,
- "request_id": codeCompletionRequest.RequestID,
- "completion_ms": elapsed.Milliseconds(),
- })
- if err != nil {
- if helper.IsUnexpectedWebsocketError(err) {
- logger.Errorf("Error writing JSON: %v", err)
- }
- return
- }
- }()
- }
- }
- func GetCodeCompletionEnabledStatus(c *gin.Context) {
- c.JSON(http.StatusOK, gin.H{
- "enabled": settings.OpenAISettings.EnableCodeCompletion,
- })
- }
|