1
0
mirror of https://github.com/ManyakRus/starter.git synced 2025-11-25 23:02:22 +02:00
Files
starter/chatgpt_connect/chatgpt_connect.go

253 lines
6.3 KiB
Go
Raw Normal View History

2023-03-17 11:20:09 +03:00
package chatgpt_connect
import (
"context"
"errors"
2023-05-02 09:51:50 +03:00
"github.com/ManyakRus/starter/logger"
2024-06-13 18:00:21 +03:00
"github.com/rugatling/go-openai"
2023-03-17 11:20:09 +03:00
"time"
//"github.com/jackc/pgconn"
"os"
"sync"
//"time"
2023-05-02 09:51:50 +03:00
"github.com/ManyakRus/starter/contextmain"
"github.com/ManyakRus/starter/stopapp"
2023-03-17 11:20:09 +03:00
2023-05-02 09:44:46 +03:00
gogpt "github.com/sashabaranov/go-openai"
2023-03-17 11:20:09 +03:00
)
// Conn - соединение к CHAT GPT
// var Conn *gogpt.CompletionStream
var Conn *gogpt.Client
// log - глобальный логгер
var log = logger.GetLog()
// mutexReconnect - защита от многопоточности Reconnect()
var mutexReconnect = &sync.Mutex{}
// Settings хранит все нужные переменные окружения
var Settings SettingsINI
// SettingsINI - структура для хранения всех нужных переменных окружения
type SettingsINI struct {
2024-06-10 17:47:11 +03:00
CHATGPT_API_KEY string
CHATGPT_NAME string
CHATGPT_START_TEXT string
CHATGPT_END_TEXT string
CHATGPT_PROXY_API_URL string
CHATGPT_PROXY_API_KEY string
2023-03-17 11:20:09 +03:00
}
// Connect_err - подключается к базе данных
func Connect() {
err := Connect_err()
2024-09-27 16:32:56 +03:00
LogInfo_Connected(err)
}
// LogInfo_Connected - выводит сообщение в Лог, или паника при ошибке
func LogInfo_Connected(err error) {
2023-03-17 11:20:09 +03:00
if err != nil {
log.Panicln("ChatGPT Connect_err() api_key: ", Settings.CHATGPT_API_KEY, " Error: ", err)
} else {
log.Info("ChatGPT connected. api_key: ", Settings.CHATGPT_API_KEY)
}
}
2024-06-14 13:46:46 +03:00
// NewClient_proxy creates new OpenAI API client with another base URL ("https://api.proxyapi.ru/openai/v1")
2024-06-11 15:46:35 +03:00
func NewClient_proxy(authToken string) *gogpt.Client {
config := gogpt.DefaultConfig(authToken)
config.BaseURL = Settings.CHATGPT_PROXY_API_URL
return gogpt.NewClientWithConfig(config)
}
2023-03-17 11:20:09 +03:00
// Connect_err - подключается к базе данных
func Connect_err() error {
var err error
2024-06-14 13:46:46 +03:00
if Settings.CHATGPT_API_KEY == "" && Settings.CHATGPT_PROXY_API_KEY == "" {
2023-03-17 11:20:09 +03:00
FillSettings()
}
2024-06-10 17:47:11 +03:00
if Settings.CHATGPT_PROXY_API_KEY != "" {
2024-06-11 15:46:35 +03:00
Conn = NewClient_proxy(Settings.CHATGPT_PROXY_API_KEY)
2024-06-10 17:47:11 +03:00
} else {
Conn = gogpt.NewClient(Settings.CHATGPT_API_KEY)
}
2023-03-17 11:20:09 +03:00
//req := gogpt.CompletionRequest{
// Model: gogpt.GPT3Ada,
// MaxTokens: 5,
// Prompt: Settings.CHATGPT_NAME,
// Stream: true,
//}
//ctx := contextmain.GetContext()
//stream, err := Conn.CreateCompletionStream(ctx, req)
//if err != nil {
// return err
//}
return err
}
// CloseConnection - закрытие соединения с базой данных
func CloseConnection() error {
if Conn == nil {
return nil
}
err := CloseConnection_err()
if err != nil {
log.Error("ChatGPT CloseConnection() error: ", err)
} else {
log.Debug("ChatGPT connection closed")
}
return err
}
// CloseConnection - закрытие соединения с базой данных
func CloseConnection_err() error {
var err error
if Conn == nil {
return nil
}
//ctx := contextmain.GetContext()
//ctx := context.Background()
//Conn.Close()
return err
}
2023-06-06 18:05:30 +03:00
// WaitStop - ожидает отмену глобального контекста
2023-03-17 11:20:09 +03:00
func WaitStop() {
select {
case <-contextmain.GetContext().Done():
log.Warn("Context app is canceled.")
}
//
stopapp.WaitTotalMessagesSendingNow("ChatGPT")
//
err := CloseConnection()
if err != nil {
log.Error("CloseConnection() error: ", err)
}
stopapp.GetWaitGroup_Main().Done()
}
2024-09-27 15:04:30 +03:00
// Start - необходимые процедуры для подключения к серверу ChatGPT
2023-03-17 11:20:09 +03:00
func Start() {
2024-09-27 16:32:56 +03:00
var err error
2023-03-17 11:20:09 +03:00
2024-09-27 16:32:56 +03:00
ctx := contextmain.GetContext()
WaitGroup := stopapp.GetWaitGroup_Main()
err = Start_ctx(&ctx, WaitGroup)
LogInfo_Connected(err)
2023-03-17 11:20:09 +03:00
}
2024-09-27 15:04:30 +03:00
// Start_ctx - необходимые процедуры для подключения к серверу ChatGPT
// Свой контекст и WaitGroup нужны для остановки работы сервиса Graceful shutdown
// Для тех кто пользуется этим репозиторием для старта и останова сервиса можно просто StartCamunda()
func Start_ctx(ctx *context.Context, WaitGroup *sync.WaitGroup) error {
var err error
//запомним к себе контекст и WaitGroup
contextmain.Ctx = ctx
stopapp.SetWaitGroup_Main(WaitGroup)
//
2024-09-27 15:36:29 +03:00
err = Connect_err()
if err != nil {
return err
}
stopapp.GetWaitGroup_Main().Add(1)
go WaitStop()
2024-09-27 15:04:30 +03:00
return err
}
2023-03-17 11:20:09 +03:00
// FillSettings загружает переменные окружения в структуру из файла или из переменных окружения
func FillSettings() {
Settings = SettingsINI{}
Settings.CHATGPT_API_KEY = os.Getenv("CHATGPT_API_KEY")
Settings.CHATGPT_NAME = os.Getenv("CHATGPT_NAME")
Settings.CHATGPT_START_TEXT = os.Getenv("CHATGPT_START_TEXT")
Settings.CHATGPT_END_TEXT = os.Getenv("CHATGPT_END_TEXT")
2024-06-10 17:47:11 +03:00
Settings.CHATGPT_PROXY_API_URL = os.Getenv("CHATGPT_PROXY_API_URL")
Settings.CHATGPT_PROXY_API_KEY = os.Getenv("CHATGPT_PROXY_API_KEY")
2023-03-17 11:20:09 +03:00
if Settings.CHATGPT_API_KEY == "" {
log.Panicln("Need fill CHATGPT_API_KEY ! in os .env ")
}
if Settings.CHATGPT_NAME == "" {
log.Warnln("Need fill CHATGPT_NAME ! in os .env ")
}
if Settings.CHATGPT_START_TEXT == "" {
//log.Warnln("Need fill CHATGPT_NAME ! in os .env ")
}
if Settings.CHATGPT_END_TEXT == "" {
//log.Warnln("Need fill CHATGPT_NAME ! in os .env ")
}
//
}
func SendMessage(Text string, user string) (string, error) {
var Otvet = ""
var err error
if Conn == nil {
Connect()
}
if Settings.CHATGPT_START_TEXT != "" {
Text = Settings.CHATGPT_START_TEXT + Text
}
if Settings.CHATGPT_END_TEXT != "" {
Text = Text + Settings.CHATGPT_END_TEXT
}
ctxMain := context.Background()
ctx, cancel := context.WithTimeout(ctxMain, 600*time.Second)
defer cancel()
2024-06-13 18:00:21 +03:00
Messages := []gogpt.ChatCompletionMessage{
{
Content: Text,
Role: openai.ChatMessageRoleSystem,
},
}
2024-06-11 09:15:16 +03:00
req := gogpt.ChatCompletionRequest{
2024-06-11 09:04:53 +03:00
Model: gogpt.GPT4o, //надо gogpt.GPT3TextDavinci003
2023-03-17 11:20:09 +03:00
MaxTokens: 2048,
2024-06-13 18:00:21 +03:00
Messages: Messages,
User: user,
2023-03-17 11:20:09 +03:00
}
2024-06-11 09:15:16 +03:00
resp, err := Conn.CreateChatCompletion(ctx, req)
2023-03-17 11:20:09 +03:00
if err != nil {
log.Debug("ChatGPT CreateCompletion() error: ", err)
return Otvet, err
}
if len(resp.Choices) > 0 {
2024-06-11 09:15:16 +03:00
Otvet = resp.Choices[0].Message.Content
2023-03-17 11:20:09 +03:00
} else {
err = errors.New("error: no response")
}
return Otvet, err
}