ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° WhatsApp GPT Bot Go#

License Go Reference Go Report Card

БоврСмСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для создания WhatsApp-Π±ΠΎΡ‚Π° с ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ OpenAI GPT, построСнная Π½Π° Π±Π°Π·Π΅ GREEN-API.

API#

ДокумСнтация ΠΊ REST API находится ΠΏΠΎ ссылкС. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° являСтся ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΎΠΉ ΠΊ REST API, поэтому докумСнтация ΠΏΠΎ ссылкС Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΈ ΠΊ самой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅.

Авторизация#

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ GREEN-API, Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ WhatsApp Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии. Для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ инстанса ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚ ΠΈ сканируйтС QR-ΠΊΠΎΠ΄ с использованиСм прилоТСния WhatsApp.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ#

  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с модСлями OpenAI GPT для ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ GPT (GPT-3.5, GPT-4, GPT-4o, o1)
  • ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
  • Вранскрипция голосовых сообщСний
  • КомплСксная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний WhatsApp
  • АрхитСктура ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО (middleware) для настройки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
  • ВстроСнноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ историСй Π΄ΠΈΠ°Π»ΠΎΠ³Π°

Установка#

go get github.com/green-api/whatsapp-chatgpt-go

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ установит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ зависимости:

  • github.com/green-api/whatsapp-chatbot-golang
  • github.com/sashabaranov/go-openai

Быстрый старт#

package main

import (
    "log"
    "os"
    "os/signal"
    "syscall"

    "github.com/green-api/whatsapp-chatgpt-go"
)

func main() {
    // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π±ΠΎΡ‚Π°
    bot := whatsapp_chatgpt_go.NewWhatsappGptBot(whatsapp_chatgpt_go.GPTBotConfig{
        IDInstance:       "your-instance-id",
        APITokenInstance: "your-token",
        OpenAIApiKey:     "your-openai-api-key",
        Model:            whatsapp_chatgpt_go.ModelGPT4o,
        SystemMessage:    "Π’Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ассистСнт.",
    })

    // Настройка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ
    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

    // Запуск Π±ΠΎΡ‚Π° Π² Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π΅
    go func() {
        log.Println("Запуск WhatsApp GPT Π±ΠΎΡ‚Π°...")
        bot.StartReceivingNotifications()
    }()

    // ОТиданиС сигнала Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ
    <-sigChan

    // Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹
    log.Println("Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±ΠΎΡ‚Π°...")
    bot.StopReceivingNotifications()
    log.Println("Π‘ΠΎΡ‚ остановлСн.")
}

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования#

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования Π² зависимости ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… потрСбностСй:

1. Π‘Π°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±ΠΎΡ‚#

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Π° ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния WhatsApp:

bot := whatsapp_chatgpt_go.NewWhatsappGptBot(whatsapp_chatgpt_go.GPTBotConfig{
    IDInstance:       "your-instance-id",
    APITokenInstance: "your-token",
    OpenAIApiKey:     "your-openai-api-key",
    Model:            whatsapp_chatgpt_go.ModelGPT4o,
    SystemMessage:    "Π’Ρ‹ - ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ассистСнт.",
})

// ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний
bot.StartReceivingNotifications()

2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний#

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΡ‚Π° ΠΊΠ°ΠΊ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний Π² вашСм собствСнном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:

gptBot := whatsapp_chatgpt_go.NewWhatsappGptBot(whatsapp_chatgpt_go.GPTBotConfig{
    IDInstance:       "your-instance-id",
    APITokenInstance: "your-token",
    OpenAIApiKey:     "your-openai-api-key",
    Model:            whatsapp_chatgpt_go.ModelGPT4o,
    SystemMessage:    "Π’Ρ‹ - ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ассистСнт.",
})

// НС Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ StartReceivingNotifications - просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ProcessMessage ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ
response, updatedSessionData, err := gptBot.ProcessMessage(
    ctx, 
    notification,  // Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈΠ· вашСго ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ²
    sessionData    // Π’Π°ΡˆΠΈ собствСнныС Π΄Π°Π½Π½Ρ‹Π΅ сСссии
)
if err != nil {
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибки
}

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ своим способом
// Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ сСссии Π² своСй систСмС состояний

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹#

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π±ΠΎΡ‚Π°#

ΠŸΠΎΠ»Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для WhatsappGptBot:

type GPTBotConfig struct {
    // API-ΠΊΠ»ΡŽΡ‡ OpenAI
    OpenAIApiKey string

    // МодСль для использования (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: gpt-4o)
    Model OpenAIModel

    // МаксимальноС количСство сообщСний для хранСния Π² истории (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 10)
    MaxHistoryLength int

    // БистСмноС сообщСниС для установки повСдСния Π±ΠΎΡ‚Π°
    SystemMessage string

    // Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 0.5)
    Temperature float32

    // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС для отобраТСния ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ
    ErrorMessage string

    // ID инстанса GREEN-API
    IDInstance string

    // API Ρ‚ΠΎΠΊΠ΅Π½ инстанса GREEN-API
    APITokenInstance string

    // Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π»ΠΈ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ² ΠΏΡ€ΠΈ запускС
    ClearWebhookQueueOnStart bool
}

WhatsappGptBot#

Основная структура для создания ΠΈ управлСния вашим WhatsApp-Π±ΠΎΡ‚ΠΎΠΌ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ OpenAI:

bot := whatsapp_chatgpt_go.NewWhatsappGptBot(whatsapp_chatgpt_go.GPTBotConfig{
    // ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
    IDInstance:       "your-instance-id",
    APITokenInstance: "your-token",
    OpenAIApiKey:     "your-openai-api-key",

    // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ GPT-спСцифичСскиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
    Model:            whatsapp_chatgpt_go.ModelGPT4o,
    MaxHistoryLength: 15,
    SystemMessage:    "Π’Ρ‹ - ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ассистСнт, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².",
    Temperature:      0.7,
    ErrorMessage:     "Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, я Π½Π΅ смог ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ваш запрос. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ снова.",

    // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ повСдСния
    ClearWebhookQueueOnStart: true,
})

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний#

Π‘ΠΎΡ‚ автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ сообщСний WhatsApp ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΈΡ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, понятный модСлям OpenAI.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ сообщСний#

  • ВСкст
  • Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ
  • Аудио
  • Π’ΠΈΠ΄Π΅ΠΎ
  • Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹
  • ΠžΠΏΡ€ΠΎΡΡ‹
  • ГСолокация
  • ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹

РССстр ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний#

Π‘ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ рССстр ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний:

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сообщСний
type CustomMessageHandler struct{}

func (h *CustomMessageHandler) CanHandle(notification *whatsapp_chatbot_golang.Notification) bool {
    // Π›ΠΎΠ³ΠΈΠΊΠ° для опрСдСлСния, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС
    return true
}

func (h *CustomMessageHandler) ProcessMessage(
    notification *whatsapp_chatbot_golang.Notification,
    client *openai.Client,
    model whatsapp_chatgpt_go.OpenAIModel,
) (interface{}, error) {
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния
    return "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚", nil
}

// РСгистрация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
bot.RegisterMessageHandler(&CustomMessageHandler{})

БистСма ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО (Middleware)#

БистСма ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π² GPT ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО для сообщСний#

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π² GPT
bot.AddMessageMiddleware(func(
    notification *whatsapp_chatbot_golang.Notification,
    messageContent interface{},
    messages []openai.ChatCompletionMessage,
    sessionData *whatsapp_chatgpt_go.GPTSessionData,
) (interface{}, []openai.ChatCompletionMessage, error) {
    // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ контСкста ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сообщСния
    sender, _ := notification.Sender()
    log.Printf("ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния ΠΎΡ‚ %s: %v", sender, messageContent)

    return messageContent, messages, nil
})

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО для ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²#

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² GPT ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ
bot.AddResponseMiddleware(func(
    response string,
    messages []openai.ChatCompletionMessage,
    sessionData *whatsapp_chatgpt_go.GPTSessionData,
) (string, []openai.ChatCompletionMessage, error) {
    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π°
    formattedResponse := response + "\n\n_Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° GREEN-API_"

    return formattedResponse, messages, nil
})

Π”Π°Π½Π½Ρ‹Π΅ сСссии#

GPT-Π±ΠΎΡ‚ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ сСссии:

type GPTSessionData struct {
    // БообщСния Π² Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π΅
    Messages []openai.ChatCompletionMessage `json:"messages"`

    // ВрСмСнная ΠΌΠ΅Ρ‚ΠΊΠ° послСднСй активности
    LastActivity int64 `json:"lastActivity"`

    // ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅
    UserData map[string]interface{} `json:"userData,omitempty"`

    // ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°
    Context map[string]interface{} `json:"context,omitempty"`
}

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ Π² вашСм ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΌ ПО ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· доступныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ OpenAI#

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ OpenAI:

МодСли GPT-4#

  • ModelGPT4 ("gpt-4")
  • ModelGPT4Turbo ("gpt-4-turbo")
  • ModelGPT4TurboPreview ("gpt-4-turbo-preview")
  • ModelGPT41106Preview ("gpt-4-1106-preview")
  • ModelGPT40125Preview ("gpt-4-0125-preview")
  • ModelGPT432k ("gpt-4-32k")

МодСли GPT-4o#

  • ModelGPT4o ("gpt-4o") - ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
  • ModelGPT4oMini ("gpt-4o-mini")

МодСли GPT-3.5#

  • ModelGPT35Turbo ("gpt-3.5-turbo")
  • ModelGPT35Turbo16k ("gpt-3.5-turbo-16k")
  • ModelGPT35Turbo1106 ("gpt-3.5-turbo-1106")
  • ModelGPT35Turbo0125 ("gpt-3.5-turbo-0125")

МодСли o1#

  • ModelO1 ("o1")
  • ModelO1Mini ("o1-mini")
  • ModelO1Preview ("o1-preview")

МодСли с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ#

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ изобраТСния:

  • ModelGPT4o ("gpt-4o")
  • ModelGPT4oMini ("gpt-4o-mini")
  • ModelGPT4Turbo ("gpt-4-turbo")

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ модСль изобраТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ:

if whatsapp_chatgpt_go.SupportsImages(bot.GetModel()) {
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ процСсса Π½Π° основС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
}

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΡ‚Π° с ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ ПО#

package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"
    "syscall"

    "github.com/green-api/whatsapp-chatbot-golang"
    "github.com/green-api/whatsapp-chatgpt-go"
    "github.com/joho/godotenv"
    "github.com/sashabaranov/go-openai"
)

func truncateString(s string, length int) string {
    if len(s) > length {
        return s[:length] + "..."
    }
    return s
}

func main() {
    err := godotenv.Load()
    if err != nil {
        log.Println("ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Ошибка Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° .env:", err)
    }

    idInstance := os.Getenv("GREEN_API_ID_INSTANCE")
    apiTokenInstance := os.Getenv("GREEN_API_TOKEN_INSTANCE")
    openaiToken := os.Getenv("OPENAI_API_KEY")

    if idInstance == "" || apiTokenInstance == "" || openaiToken == "" {
        log.Fatalf("ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния: GREEN_API_ID_INSTANCE, GREEN_API_TOKEN_INSTANCE, OPENAI_API_KEY")
    }

    config := whatsapp_chatgpt_go.GPTBotConfig{
        IDInstance:               idInstance,
        APITokenInstance:         apiTokenInstance,
        OpenAIApiKey:             openaiToken,
        Model:                    whatsapp_chatgpt_go.ModelGPT4o,
        MaxHistoryLength:         10,
        SystemMessage:            "Π’Ρ‹ ассистСнт, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· WhatsApp.",
        Temperature:              0.7,
        ErrorMessage:             "Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, я столкнулся с ошибкой ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ вашСго сообщСния.",
        ClearWebhookQueueOnStart: true,
    }

    bot := whatsapp_chatgpt_go.NewWhatsappGptBot(config)

    // ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО: Π›ΠΎΠ³ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎ входящих сообщСниях.
    bot.AddMessageMiddleware(func(notification *whatsapp_chatbot_golang.Notification,
        messageContent interface{},
        messages []openai.ChatCompletionMessage,
        sessionData *whatsapp_chatgpt_go.GPTSessionData) (interface{}, []openai.ChatCompletionMessage, error) {

        sender, _ := notification.Sender()

        var contentLog string
        if parts, ok := messageContent.([]openai.ChatMessagePart); ok {
            contentLog = "Части ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°: ["
            for i, p := range parts {
                if i > 0 {
                    contentLog += ", "
                }
                contentLog += fmt.Sprintf("{Π’ΠΈΠΏ: %s, ", p.Type)
                if p.Type == openai.ChatMessagePartTypeText {
                    contentLog += fmt.Sprintf("ВСкст: '%s'", p.Text)
                } else if p.Type == openai.ChatMessagePartTypeImageURL && p.ImageURL != nil {
                    urlStr := p.ImageURL.URL
                    if len(urlStr) > 50 {
                        urlStr = urlStr[:47] + "..."
                    }
                    contentLog += fmt.Sprintf("URL изобраТСния: %s", urlStr)
                } else {
                    contentLog += "Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅"
                }
                contentLog += "}"
            }
            contentLog += "]"
        } else {
            contentLog = fmt.Sprintf("ВСкстовый ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚: '%s'", truncateString(fmt.Sprintf("%v", messageContent), 100))
        }
        log.Printf("--> MID: ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΎΡ‚ %s: %s", sender, contentLog)
        log.Printf("--> MID: Π˜ΡΡ‚ΠΎΡ€ΠΈΡ содСрТит %d сообщСний ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ.", len(messages))

        return messageContent, messages, nil
    })

    // ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО: Π›ΠΎΠ³ΠΈΡ€ΡƒΠ΅Ρ‚ отправляСмый ΠΎΡ‚Π²Π΅Ρ‚.
    bot.AddResponseMiddleware(func(response string,
        messages []openai.ChatCompletionMessage,
        sessionData *whatsapp_chatgpt_go.GPTSessionData) (string, []openai.ChatCompletionMessage, error) {

        log.Printf("<-- MID: ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚Π°: %s", truncateString(response, 100))
        log.Printf("<-- MID: Π˜ΡΡ‚ΠΎΡ€ΠΈΡ содСрТит %d сообщСний послС добавлСния ΠΎΡ‚Π²Π΅Ρ‚Π° ассистСнта.", len(messages))
        return response, messages, nil
    })

    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        log.Println("Запуск WhatsApp GPT Π±ΠΎΡ‚Π°...")
        bot.StartReceivingNotifications()
        log.Println("Π¦ΠΈΠΊΠ» получСния ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ остановлСн.")
    }()

    <-sigChan

    log.Println("Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±ΠΎΡ‚Π°...")
    bot.StopReceivingNotifications()
    log.Println("Π‘ΠΎΡ‚ остановлСн.")
}

ДоступныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹#

WhatsappGptBot#

  • NewWhatsappGptBot(config GPTBotConfig) *WhatsappGptBot - Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ WhatsApp-Π±ΠΎΡ‚ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ GPT
  • StartReceivingNotifications() - НачинаСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ webhook-ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
  • StopReceivingNotifications() - ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
  • ProcessMessage(ctx context.Context, notification *whatsapp_chatbot_golang.Notification, sessionData *GPTSessionData) (string, *GPTSessionData, error) - ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСниС Π±Π΅Π· использования Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° состояний Π±ΠΎΡ‚Π°
  • AddMessageMiddleware(middleware ProcessMessageMiddleware) - РСгистрируСт ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ входящих сообщСний
  • AddResponseMiddleware(middleware ProcessResponseMiddleware) - РСгистрируСт ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² GPT
  • RegisterMessageHandler(handler MessageHandler) - ДобавляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний
  • GetOpenAI() *openai.Client - Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° OpenAI
  • GetModel() OpenAIModel - Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ настроСнной ΠΌΠΎΠ΄Π΅Π»ΠΈ OpenAI
  • GetSystemMessage() string - Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ настроСнноС систСмноС сообщСниС
  • SupportsImages() bool - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ тСкущая настроСнная модСль ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
  • Methods() - Доступ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний ΠΈ Ρ‚.Π΄.

ЛицСнзия#

Π›ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° условиях MIT.