User: Давай писать функцию
func handleAiSearch(w http.ResponseWriter, r *http.Request) {
	log.Printf("Received request: %s %s\n", r.Method, r.URL.Path)
	deviceData := r.URL.Query().Get("deviceid")
	queryAI := r.URL.Query().Get("query")
	if deviceData == "" && queryAI == "" {
		http.Error(w, "Ошибка.", http.StatusInternalServerError)
		return
	}
	log.Printf("Requested deviceID: %s\n", deviceData)
	log.Printf("Requested queryAI: %s\n", queryAI)
	var exists bool
	err := db.QueryRow("SELECT EXISTS(SELECT 1 FROM devices WHERE device_id = $1)", deviceData).Scan(&exists)
	if err != nil {
		fmt.Printf("Ошибка при проверке существования записей: %v\n", err)
		http.Error(w, "Ошибка при проверке существования записей", http.StatusInternalServerError)
		return
	}
	if exists {
		gptContent := fmt.Sprintf(
			"Порекомендуй список из 40 элементов по Теме из \"Запрос пользователя\" и обязательно разбей по категориям (10 штук на категорию!): фильмы, сериалы, мультфильмы и аниме\n"+
				"Твой ответ должен быть такой (в {} динамичные данные, без {} статичные) (названия должны быть реальными!!)(за другой буду ругать!) {number}; ru_name - {RU_NAME}; en_name - {EN_NAME}; orig_name - {ORIG_NAME}; date - {realise_date}; media_type - {movie,tv}; category - {category}\n"+
				"Запрос пользователя: %s", queryAI)
		gptUrl := os.Getenv("AI_QUERY")
	} else {
		fmt.Printf("Устройство не найдено, доступ запрещен\n")
		http.Error(w, "Устройство не найдено, доступ запрещен", http.StatusInternalServerError)
		return
	}
}
в if exists нужно отправить POST запрос на gptUrl с телом
{
  "messages": [
    {
      "role": "user",
      "content": gptContent
    }
  ],
  "model": "gpt-4o",
  "provider": "NexraChatGPT",
  "web_search": false
}
Content-Type будет либо application/json либо text/event-stream; charset=utf-8
нужно принтануть ответ в лог
Assistant: Для того чтобы отправить POST запрос к GPT API и обработать ответ, необходимо использовать стандартные пакеты, такие как `net/http` для отправки HTTP-запросов и `encoding/json` для работы с JSON. Ниже приведён пример того, как можно изменить вашу функцию `handleAiSearch`, чтобы это реализовать:

```go
package main

import (
        "bytes"
        "encoding/json"
        "fmt"
        "log"
        "net/http"
        "os"

        _ "github.com/lib/pq"
)

func handleAiSearch(w http.ResponseWriter, r *http.Request) {
        log.Printf("Received request: %s %s\n", r.Method, r.URL.Path)
        deviceData := r.URL.Query().Get("deviceid")
        queryAI := r.URL.Query().Get("query")
        if deviceData == "" && queryAI == "" {
                http.Error(w, "Ошибка.", http.StatusInternalServerError)
                return
        }
        log.Printf("Requested deviceID: %s\n", deviceData)
        log.Printf("Requested queryAI: %s\n", queryAI)

        var exists bool
        err := db.QueryRow("SELECT EXISTS(SELECT 1 FROM devices WHERE device_id = $1)", deviceData).Scan(&exists)
        if err != nil {
                log.Printf("Ошибка при проверке существования записей: %v\n", err)
                http.Error(w, "Ошибка при проверке существования записей", http.StatusInternalServerError)
                return
        }

        if exists {
                gptContent := fmt.Sprintf(
                        "Порекомендуй список из 40 элементов по Теме из \"Запрос пользователя\" и обязательно разбей по категориям (10 штук на категорию!): фильмы, сериалы, мультфильмы и аниме\n"+
                                "Твой ответ должен быть такой (в {} динамичные данные, без {} статичные) (названия должны быть реальными!!)(за другой буду ругать!) {number}; ru_name - {RU_NAME}; en_name - {EN_NAME}; orig_name - {ORIG_NAME}; date - {realise_date}; media_type - {movie,tv}; category - {category}\n"+
                                "Запрос пользователя: %s", queryAI)

                gptUrl := os.Getenv("AI_QUERY")

                // Создание запроса
                payload := map[string]interface{}{
                        "messages": []map[string]string{
                                {
                                        "role":    "user",
                                        "content": gptContent,
                                },
                        },
                        "model":     "gpt-4o",
                        "provider":  "NexraChatGPT",
                        "web_search": false,
                }
                payloadBytes, err := json.Marshal(payload)
                if err != nil {
                        log.Printf("Ошибка при сериализации запроса: %v\n", err)
                        http.Error(w, "Ошибка при обработке запроса", http.StatusInternalServerError)
                        return
                }

                // Отправка POST запроса
                resp, err := http.Post(gptUrl, "application/json", bytes.NewBuffer(payloadBytes))
                if err != nil {
                        log.Printf("Ошибка при отправке запроса к API: %v\n", err)
                        http.Error(w, "Ошибка при отправке запроса", http.StatusInternalServerError)
                        return
                }
                defer resp.Body.Close()

                // Чтение ответа
                respBody, err := io.ReadAll(resp.Body)
                if err != nil {
                        log.Printf("Ошибка при чтении ответа: %v\n", err)
                        http.Error(w, "Ошибка при чтении ответа от API", http.StatusInternalServerError)
                        return
                }

                // Принт ответа в лог
                log.Printf("Ответ от GPT API: %s\n", respBody)

                // Отправка ответа пользователю
                w.Write(respBody)

        } else {
                log.Printf("Устройство не найдено, доступ запрещен\n")
                http.Error(w, "Устройство не найдено, доступ запрещен", http.StatusInternalServerError)
                return
        }
}
```

В этом коде кроме изменений в логике обработки `exists`, мы также добавили:

1. **Сериализацию** вашего запроса в JSON с помощью `json.Marshal`.
2. **Отправку POST запроса** к `gptUrl`.
3. **Чтение и логирование** ответа от API.
4. **Отправка ответа** от GPT обратно в `http.ResponseWriter`.

Не забудьте импортировать дополнительные пакеты `io` для чтения ответа от API и убедитесь, что у вас правильно настроены зависимости для работы с HTTP и JSON в вашем проекте на Go.
User: а у нас не будет проблем с ответом text/event-stream; charset=utf-8?
Assistant: