diff --git a/anthropic.go b/anthropic.go index bcca490..7710209 100644 --- a/anthropic.go +++ b/anthropic.go @@ -90,7 +90,7 @@ func (b *Bot) getAnthropicResponse(ctx context.Context, messages []anthropic.Mes for i, msg := range messages { for _, content := range msg.Content { if content.Type == anthropic.MessagesContentTypeText { - InfoLogger.Printf("Message %d: Role=%v, Text=%v", i, msg.Role, content.Text) + InfoLogger.Printf("Message %d: Role=%v, Text=%v", i, msg.Role, *content.Text) } } } diff --git a/bot.go b/bot.go index bf68a5d..bdc1074 100644 --- a/bot.go +++ b/bot.go @@ -15,10 +15,10 @@ import ( ) type Bot struct { - tgBot TelegramClient - db *gorm.DB - anthropicClient *anthropic.Client - chatMemories map[int64]*ChatMemory + tgBot TelegramClient + db *gorm.DB + anthropicClient *anthropic.Client + chatMemories map[int64]*ChatMemory memorySize int chatMemoriesMu sync.RWMutex config BotConfig @@ -84,8 +84,8 @@ func NewBot(db *gorm.DB, config BotConfig, clock Clock, tgClient TelegramClient) anthropicClient := anthropic.NewClient(config.AnthropicAPIKey) b := &Bot{ - db: db, - anthropicClient: anthropicClient, + db: db, + anthropicClient: anthropicClient, chatMemories: make(map[int64]*ChatMemory), memorySize: config.MemorySize, config: config, diff --git a/config.go b/config.go index 122c1b0..6bd994b 100644 --- a/config.go +++ b/config.go @@ -11,23 +11,23 @@ import ( ) type BotConfig struct { - ID string `json:"id"` - TelegramToken string `json:"telegram_token"` - MemorySize int `json:"memory_size"` - MessagePerHour int `json:"messages_per_hour"` - MessagePerDay int `json:"messages_per_day"` - TempBanDuration string `json:"temp_ban_duration"` - Model anthropic.Model `json:"model"` - Temperature *float32 `json:"temperature,omitempty"` // Controls creativity vs determinism (0.0-1.0) - SystemPrompts map[string]string `json:"system_prompts"` - Active bool `json:"active"` - OwnerTelegramID int64 `json:"owner_telegram_id"` - AnthropicAPIKey string `json:"anthropic_api_key"` + ID string `json:"id"` + TelegramToken string `json:"telegram_token"` + MemorySize int `json:"memory_size"` + MessagePerHour int `json:"messages_per_hour"` + MessagePerDay int `json:"messages_per_day"` + TempBanDuration string `json:"temp_ban_duration"` + Model anthropic.Model `json:"model"` + Temperature *float32 `json:"temperature,omitempty"` // Controls creativity vs determinism (0.0-1.0) + SystemPrompts map[string]string `json:"system_prompts"` + Active bool `json:"active"` + OwnerTelegramID int64 `json:"owner_telegram_id"` + AnthropicAPIKey string `json:"anthropic_api_key"` ElevenLabsAPIKey string `json:"elevenlabs_api_key"` ElevenLabsVoiceID string `json:"elevenlabs_voice_id"` ElevenLabsModel string `json:"elevenlabs_model"` DebugScreening bool `json:"debug_screening"` // Enable detailed screening logs - ConfigFilePath string `json:"-"` // Set at load time; not serialized + ConfigFilePath string `json:"-"` // Set at load time; not serialized } // Custom unmarshalling to handle anthropic.Model diff --git a/config/default.json b/config/default.json index 62c2d91..1065d94 100644 --- a/config/default.json +++ b/config/default.json @@ -16,7 +16,7 @@ "debug_screening": false, "system_prompts": { "default": "You are a helpful assistant.", - "custom_instructions": "You are texting through a limited Telegram interface with 15-word maximum. Write like texting a friend - use shorthand, skip grammar, use slang/abbreviations. System cuts off anything longer than 15 words.\n\n- Your name is Atom.\n- The user you're talking to has username '{username}' and display name '{firstname} {lastname}'.\n- User's language preference: '{language}'\n- User is a {premium_status}\n- It's currently {time_context} in your timezone. Use appropriate time-based greetings and address the user by name.\n- If a user asks about buying apples, inform them that we don't sell apples.\n- When asked for a joke, tell a clean, family-friendly joke about programming or technology.\n- If someone inquires about our services, explain that we offer AI-powered chatbot solutions.\n- For any questions about pricing, direct users to contact our sales team at sales@example.com.\n- If asked about your capabilities, be honest about what you can and cannot do.\nAlways maintain a friendly and professional tone.", + "custom_instructions": "You are texting through a limited Telegram interface with 15-word maximum. Write like texting a friend - use shorthand, skip grammar, use slang/abbreviations. System cuts off anything longer than 15 words.\n\n- Your name is Atom.\n- The user you're talking to has username '{username}' and display name '{firstname} {lastname}'.\n- User's language preference: '{language}'. Prefer replying in this language when talking to '{username}'.\n- User is a {premium_status}\n- It's currently {time_context} in your timezone. Use appropriate time-based greetings and address the user by name.\n- If a user asks about buying apples, inform them that we don't sell apples.\n- When asked for a joke, tell a clean, family-friendly joke about programming or technology.\n- If someone inquires about our services, explain that we offer AI-powered chatbot solutions.\n- For any questions about pricing, direct users to contact our sales team at sales@example.com.\n- If asked about your capabilities, be honest about what you can and cannot do.\nAlways maintain a friendly and professional tone.", "continue_conversation": "Continuing our conversation. Remember previous context if relevant.", "avoid_sensitive": "Avoid discussing sensitive topics or providing harmful information.", "respond_with_emojis": "Since the user sent only emojis, respond using emojis only." diff --git a/elevenlabs.go b/elevenlabs.go index 4185a1d..60a13d5 100644 --- a/elevenlabs.go +++ b/elevenlabs.go @@ -13,8 +13,8 @@ import ( ) const ( - elevenLabsTTSURL = "https://api.elevenlabs.io/v1/text-to-speech/" - elevenLabsSTTURL = "https://api.elevenlabs.io/v1/speech-to-text" + elevenLabsTTSURL = "https://api.elevenlabs.io/v1/text-to-speech/" + elevenLabsSTTURL = "https://api.elevenlabs.io/v1/speech-to-text" elevenLabsDefaultModel = "eleven_multilingual_v2" ) diff --git a/go-telegram-bot.exe b/go-telegram-bot.exe index 0621d50..226706f 100644 Binary files a/go-telegram-bot.exe and b/go-telegram-bot.exe differ diff --git a/go.mod b/go.mod index 4d34ca6..2bbca27 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/HugeFrog24/go-telegram-bot go 1.26.0 require ( - github.com/go-telegram/bot v1.19.0 - github.com/liushuangls/go-anthropic/v2 v2.17.1 + github.com/go-telegram/bot v1.20.0 + github.com/liushuangls/go-anthropic/v2 v2.19.0 github.com/stretchr/testify v1.11.1 - golang.org/x/time v0.14.0 + golang.org/x/time v0.15.0 gorm.io/driver/sqlite v1.6.0 gorm.io/gorm v1.31.1 ) @@ -16,11 +16,11 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/mattn/go-sqlite3 v1.14.34 // indirect + github.com/mattn/go-sqlite3 v1.14.44 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/stretchr/objx v0.5.3 // indirect - golang.org/x/text v0.34.0 // indirect + golang.org/x/text v0.36.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index edf22cd..fa8f56f 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-telegram/bot v1.19.0 h1:tuvTQhgNietHFRN0HUDhuXsgfgkGSaO8WWwZQW3DMQg= -github.com/go-telegram/bot v1.19.0/go.mod h1:i2TRs7fXWIeaceF3z7KzsMt/he0TwkVC680mvdTFYeM= +github.com/go-telegram/bot v1.20.0 h1:4Pea/qTidSspr4WBJw9FbHUMNhYeqszBqQUfsQEyFbc= +github.com/go-telegram/bot v1.20.0/go.mod h1:i2TRs7fXWIeaceF3z7KzsMt/he0TwkVC680mvdTFYeM= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -14,10 +14,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/liushuangls/go-anthropic/v2 v2.17.1 h1:ca3oFzgQHs9/mJr+xx2XFQIYcQLM2rDCqieUx0g+8p4= -github.com/liushuangls/go-anthropic/v2 v2.17.1/go.mod h1:a550cJXPoTG2FL3DvfKG2zzD5O2vjgvo4tHtoGPzFLU= -github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= -github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/liushuangls/go-anthropic/v2 v2.19.0 h1:CpDSGzRUmlONfAQh8MrBiNupCDAyGpVoQIJkcAx77h8= +github.com/liushuangls/go-anthropic/v2 v2.19.0/go.mod h1:a550cJXPoTG2FL3DvfKG2zzD5O2vjgvo4tHtoGPzFLU= +github.com/mattn/go-sqlite3 v1.14.44 h1:3VSe+xafpbzsLbdr2AWlAZk9yRHiBhTBakioXaCKTF8= +github.com/mattn/go-sqlite3 v1.14.44/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -28,10 +28,10 @@ github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4= github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=