committtttt

This commit is contained in:
Dev
2025-09-13 06:48:55 +03:00
commit 2d49f69be6
32 changed files with 6478 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
package handlers
import (
"context"
"net/http"
"github.com/gin-gonic/gin"
"customer-support-system/internal/ai"
"customer-support-system/internal/models"
"customer-support-system/pkg/logger"
)
// AIHandler handles AI-related HTTP requests
type AIHandler struct {
aiService *ai.AIService
}
// NewAIHandler creates a new AI handler
func NewAIHandler() *AIHandler {
return &AIHandler{
aiService: ai.NewAIService(),
}
}
// QueryAI handles querying the AI service
func (h *AIHandler) QueryAI(c *gin.Context) {
// Check if user is authenticated
_, exists := c.Get("userID")
if !exists {
logger.Error("Failed to get user ID from context")
c.JSON(http.StatusUnauthorized, gin.H{
"success": false,
"message": "Unauthorized",
})
return
}
var req struct {
Prompt string `json:"prompt" binding:"required"`
ConversationHistory []models.Message `json:"conversationHistory"`
Complexity int `json:"complexity"`
}
if err := c.ShouldBindJSON(&req); err != nil {
logger.WithError(err).Error("Failed to parse query AI request")
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"message": "Invalid request body",
})
return
}
// If complexity is not provided, analyze it
if req.Complexity == 0 {
req.Complexity = h.aiService.AnalyzeComplexity(req.Prompt)
}
// Query AI
ctx := context.Background()
response, err := h.aiService.Query(ctx, req.Prompt, req.ConversationHistory, req.Complexity)
if err != nil {
logger.WithError(err).Error("Failed to query AI")
c.JSON(http.StatusInternalServerError, gin.H{
"success": false,
"message": "Failed to query AI",
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "AI query successful",
"data": gin.H{
"response": response,
"complexity": req.Complexity,
},
})
}
// AnalyzeComplexity handles analyzing the complexity of a prompt
func (h *AIHandler) AnalyzeComplexity(c *gin.Context) {
var req struct {
Prompt string `json:"prompt" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
logger.WithError(err).Error("Failed to parse analyze complexity request")
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"message": "Invalid request body",
})
return
}
// Analyze complexity
complexity := h.aiService.AnalyzeComplexity(req.Prompt)
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "Complexity analysis successful",
"data": gin.H{
"complexity": complexity,
},
})
}
// GetAvailableModels handles getting available AI models
func (h *AIHandler) GetAvailableModels(c *gin.Context) {
// Get available models
models := h.aiService.GetAvailableModels()
c.JSON(http.StatusOK, gin.H{
"success": true,
"data": gin.H{
"models": models,
},
})
}
// QueryOpenAI handles querying the OpenAI API
func (h *AIHandler) QueryOpenAI(c *gin.Context) {
// Check if user is authenticated
_, exists := c.Get("userID")
if !exists {
logger.Error("Failed to get user ID from context")
c.JSON(http.StatusUnauthorized, gin.H{
"success": false,
"message": "Unauthorized",
})
return
}
var req struct {
Prompt string `json:"prompt" binding:"required"`
ConversationHistory []models.Message `json:"conversationHistory"`
}
if err := c.ShouldBindJSON(&req); err != nil {
logger.WithError(err).Error("Failed to parse query OpenAI request")
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"message": "Invalid request body",
})
return
}
// Query OpenAI
ctx := context.Background()
response, err := h.aiService.QueryOpenAI(ctx, req.Prompt, req.ConversationHistory)
if err != nil {
logger.WithError(err).Error("Failed to query OpenAI")
c.JSON(http.StatusInternalServerError, gin.H{
"success": false,
"message": "Failed to query OpenAI",
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "OpenAI query successful",
"data": gin.H{
"response": response,
},
})
}
// QueryOllama handles querying the Ollama API
func (h *AIHandler) QueryOllama(c *gin.Context) {
// Check if user is authenticated
_, exists := c.Get("userID")
if !exists {
logger.Error("Failed to get user ID from context")
c.JSON(http.StatusUnauthorized, gin.H{
"success": false,
"message": "Unauthorized",
})
return
}
var req struct {
Prompt string `json:"prompt" binding:"required"`
ConversationHistory []models.Message `json:"conversationHistory"`
}
if err := c.ShouldBindJSON(&req); err != nil {
logger.WithError(err).Error("Failed to parse query Ollama request")
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"message": "Invalid request body",
})
return
}
// Query Ollama
ctx := context.Background()
response, err := h.aiService.QueryOllama(ctx, req.Prompt, req.ConversationHistory)
if err != nil {
logger.WithError(err).Error("Failed to query Ollama")
c.JSON(http.StatusInternalServerError, gin.H{
"success": false,
"message": "Failed to query Ollama",
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "Ollama query successful",
"data": gin.H{
"response": response,
},
})
}