code_completion.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package openai
  2. import (
  3. "net/http"
  4. "sync"
  5. "time"
  6. "github.com/0xJacky/Nginx-UI/api"
  7. "github.com/0xJacky/Nginx-UI/internal/helper"
  8. "github.com/0xJacky/Nginx-UI/internal/llm"
  9. "github.com/0xJacky/Nginx-UI/settings"
  10. "github.com/gin-gonic/gin"
  11. "github.com/gorilla/websocket"
  12. "github.com/uozi-tech/cosy"
  13. "github.com/uozi-tech/cosy/logger"
  14. )
  15. var mutex sync.Mutex
  16. // CodeCompletion handles code completion requests
  17. func CodeCompletion(c *gin.Context) {
  18. if !settings.OpenAISettings.EnableCodeCompletion {
  19. cosy.ErrHandler(c, llm.ErrCodeCompletionNotEnabled)
  20. return
  21. }
  22. var upgrader = websocket.Upgrader{
  23. CheckOrigin: func(r *http.Request) bool {
  24. return true
  25. },
  26. }
  27. ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
  28. if err != nil {
  29. cosy.ErrHandler(c, err)
  30. return
  31. }
  32. defer ws.Close()
  33. for {
  34. var codeCompletionRequest llm.CodeCompletionRequest
  35. err := ws.ReadJSON(&codeCompletionRequest)
  36. if err != nil {
  37. if helper.IsUnexpectedWebsocketError(err) {
  38. logger.Errorf("Error reading JSON: %v", err)
  39. }
  40. return
  41. }
  42. codeCompletionRequest.UserID = api.CurrentUser(c).ID
  43. go func() {
  44. start := time.Now()
  45. completedCode, err := codeCompletionRequest.Send()
  46. if err != nil {
  47. logger.Errorf("Error sending code completion request: %v", err)
  48. return
  49. }
  50. elapsed := time.Since(start)
  51. mutex.Lock()
  52. defer mutex.Unlock()
  53. err = ws.WriteJSON(gin.H{
  54. "code": completedCode,
  55. "request_id": codeCompletionRequest.RequestID,
  56. "completion_ms": elapsed.Milliseconds(),
  57. })
  58. if err != nil {
  59. if helper.IsUnexpectedWebsocketError(err) {
  60. logger.Errorf("Error writing JSON: %v", err)
  61. }
  62. return
  63. }
  64. }()
  65. }
  66. }
  67. func GetCodeCompletionEnabledStatus(c *gin.Context) {
  68. c.JSON(http.StatusOK, gin.H{
  69. "enabled": settings.OpenAISettings.EnableCodeCompletion,
  70. })
  71. }