compress wip

This commit is contained in:
2026-01-29 22:58:41 +03:00
parent 9be2ad1fd9
commit c3b7192516
5 changed files with 129 additions and 8 deletions

View File

@@ -36,11 +36,15 @@ type RPSetting struct {
type RPUser struct { type RPUser struct {
UserID int64 `db:"user_id"` UserID int64 `db:"user_id"`
UserPrompt string `db:"user_prompt"` UserPrompt string `db:"user_prompt"`
UsedTokens int64 `db:"used_tokens"`
SelectedPreset string `db:"selected_preset"` SelectedPreset string `db:"selected_preset"`
Preset *RPPreset Preset *RPPreset
SelectedModel string `db:"selected_model"` SelectedModel string `db:"selected_model"`
Model *RPModel Model *RPModel
UsedTokens int64 `db:"used_tokens"`
CompressMethod string `db:"compress_method"`
CompressLimit int `db:"compress_limit"`
} }
type RPRepository struct { type RPRepository struct {
@@ -150,3 +154,16 @@ func (rep *RPRepository) GetSetting(id int) (*RPSetting, error) {
err := rep.db.Get(setting, "SELECT * FROM rp_settings WHERE id=$1;", id) err := rep.db.Get(setting, "SELECT * FROM rp_settings WHERE id=$1;", id)
return setting, err return setting, err
} }
func (rep *RPRepository) UpdateUserCompressSettings(user *RPUser) (*RPUser, error) {
query, args, err := sqlx.In(
"UPDATE rp_users SET compress_method=?, compress_limit=? WHERE user_id=?;",
user.CompressMethod, user.CompressLimit, user.UserID,
)
if err != nil {
return user, err
}
query = rep.db.Rebind(query)
_, err = rep.db.Exec(query, args...)
return user, err
}

2
go.mod
View File

@@ -7,7 +7,7 @@ require (
git.nix13.pw/scuroneko/slog v1.0.2 git.nix13.pw/scuroneko/slog v1.0.2
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/joho/godotenv v1.5.1 github.com/joho/godotenv v1.5.1
github.com/lib/pq v1.11.0 github.com/lib/pq v1.11.1
github.com/redis/go-redis/v9 v9.17.3 github.com/redis/go-redis/v9 v9.17.3
github.com/shopspring/decimal v1.4.0 github.com/shopspring/decimal v1.4.0
github.com/vinovest/sqlx v1.7.1 github.com/vinovest/sqlx v1.7.1

4
go.sum
View File

@@ -26,8 +26,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw=
github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
github.com/lib/pq v1.11.0 h1:aJpnw24caDH5XfSwI/tSUnN8RJRNqbNyArYazaGulzw= github.com/lib/pq v1.11.1 h1:wuChtj2hfsGmmx3nf1m7xC2XpK6OtelS2shMY+bGMtI=
github.com/lib/pq v1.11.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/lib/pq v1.11.1/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=

View File

@@ -36,6 +36,10 @@ func RegisterRP(bot *laniakea.Bot) {
rp.Command(generate, "g", "gen", "г") rp.Command(generate, "g", "gen", "г")
rp.Payload(compress, "rp.compress_chat") rp.Payload(compress, "rp.compress_chat")
rp.Payload(compressSettingStage1, "rp.compress_setting_s1")
rp.Payload(compressSettingStage2, "rp.compress_setting_s2")
rp.Payload(compressSetting, "rp.compress_setting")
bot.AddPlugins(rp.Build()) bot.AddPlugins(rp.Build())
} }
@@ -85,11 +89,17 @@ func rpInfo(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
ctx.Error(err) ctx.Error(err)
} }
} }
compressText := "сообщений"
if rpUser.CompressMethod == "tokens" {
compressText = "токенов"
}
out := []string{ out := []string{
fmt.Sprintf("Привет, %s!", ctx.From.FirstName), fmt.Sprintf("Привет, %s!", ctx.From.FirstName),
fmt.Sprintf("*Выбранная вайфу*: %s", waifu.Name), fmt.Sprintf("*Выбранная вайфу*: %s", waifu.Name),
fmt.Sprintf("*Выбранный пресет*: %s", laniakea.EscapeMarkdown(rpUser.Preset.Name)), fmt.Sprintf("*Выбранный пресет*: %s", laniakea.EscapeMarkdown(rpUser.Preset.Name)),
fmt.Sprintf("*Выбранная модель*: %s", rpUser.Model.Name), fmt.Sprintf("*Выбранная модель*: %s", rpUser.Model.Name),
fmt.Sprintf("*Использовано токенов*: %d", rpUser.UsedTokens),
fmt.Sprintf("*Настройки сжатия*: %d %s", rpUser.CompressLimit, compressText),
fmt.Sprintf("*Твоё описание персонажа*: %s", rpUser.UserPrompt), fmt.Sprintf("*Твоё описание персонажа*: %s", rpUser.UserPrompt),
} }
@@ -100,6 +110,7 @@ func rpInfo(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
kb.AddCallbackButton("Сменить модель", "rp.model_list") kb.AddCallbackButton("Сменить модель", "rp.model_list")
kb.AddCallbackButton("Список сценариев", "rp.scenario_list") kb.AddCallbackButton("Список сценариев", "rp.scenario_list")
kb.AddCallbackButton("Список сеттингов", "rp.setting_list") kb.AddCallbackButton("Список сеттингов", "rp.setting_list")
kb.AddCallbackButton("Настройки сжатия", "rp.compress_setting_s1")
kb.AddCallbackButton("Новый чат", "rp.new_chat_s1") kb.AddCallbackButton("Новый чат", "rp.new_chat_s1")
kb.AddLine() kb.AddLine()
kb.AddCallbackButton("Закрыть", "general.close") kb.AddCallbackButton("Закрыть", "general.close")
@@ -567,19 +578,37 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
} }
rpUser.UsedTokens = rpUser.UsedTokens + int64(len(userMessage)) + int64(len(answerContent)) rpUser.UsedTokens = rpUser.UsedTokens + int64(len(userMessage)) + int64(len(answerContent))
err = rpRep.UpdateUser(rpUser)
if err != nil {
ctx.Error(err)
}
tokens := redisRpRep.GetChatTokens(ctx.FromID, waifuId) tokens := redisRpRep.GetChatTokens(ctx.FromID, waifuId)
tokens += len(userMessage) + len(answerContent) tokens += len(userMessage) + len(answerContent)
err = redisRpRep.SetChatTokens(ctx.FromID, waifuId, tokens) err = redisRpRep.SetChatTokens(ctx.FromID, waifuId, tokens)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
} }
err = rpRep.UpdateUser(rpUser) counter := redisRpRep.GetCounter(ctx.FromID, waifuId)
err = redisRpRep.SetCounter(ctx.FromID, waifuId, counter+2)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
} }
m.Delete() m.Delete()
ctx.Answer(laniakea.EscapeMarkdown(answerContent)) ctx.Answer(laniakea.EscapeMarkdown(answerContent))
// Auto compress
compressMethod := rpUser.CompressMethod
if compressMethod == "messages" {
if counter+2 >= rpUser.CompressLimit {
compress(ctx, db)
}
} else if compressMethod == "token" {
if tokens >= rpUser.CompressLimit*1000 {
compress(ctx, db)
}
}
} }
func compress(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) { func compress(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
@@ -650,3 +679,76 @@ func compress(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
kb = kb.AddCallbackButton("На главную", "rp.info") kb = kb.AddCallbackButton("На главную", "rp.info")
ctx.EditCallback("Сжатие завершено", kb) ctx.EditCallback("Сжатие завершено", kb)
} }
var messagesMethodCount = []int{
20, 50, 100, 200, 500,
}
var tokenMethodCount = []int{
16, 32, 64, 128, 256,
}
func compressSettingStage1(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
kb := laniakea.NewInlineKeyboard(2)
kb.AddCallbackButton("По сообщениям", "rp.compress_setting_s2", "messages")
kb.AddCallbackButton("По токенам", "rp.compress_setting_s2", "tokens")
kb.AddLine().AddCallbackButton("На главную", "rp.info")
out := []string{
"Выбери метод для определения сжатия",
"*По сообщениям* — чат будет сжиматься после достижения определенного кол-ва сообщений в нём",
"*По токенам* — чат будет сжиматься после достижения определенного кол-ва токенов в нём",
}
ctx.EditCallback(strings.Join(out, "\n"), kb)
}
func compressSettingStage2(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
if len(ctx.Args) == 0 {
return
}
method := ctx.Args[0]
out := []string{
"При выборе маленьких значений, чат будет сжиматься чаще, что замедляет вывод сообщений.",
"При выборе слишком больших значений, некоторые детали могут теряться.",
}
kb := laniakea.NewInlineKeyboard(3)
if method == "messages" {
out = append(out, "Выбери количество сообщений, после которых будет происходить сжатие чата")
for _, i := range messagesMethodCount {
kb.AddCallbackButton(strconv.Itoa(i), "rp.compress_setting", method, i)
}
} else if method == "tokens" {
out = append(out, "Выбери количество токенов, после которых будет происходить сжатие чата")
for _, i := range tokenMethodCount {
kb.AddCallbackButton(strconv.Itoa(i), "rp.compress_setting", method, i)
}
}
kb.AddLine().AddCallbackButton("Назад", "rp.compress_setting_s1", method)
kb.AddCallbackButton("На главную", "rp.info")
ctx.EditCallback(strings.Join(out, "\n"), kb)
}
func compressSetting(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
rep := psql.NewRPRepository(db)
user, err := rep.GetUser(int64(ctx.FromID))
if err != nil {
ctx.Error(err)
return
}
if len(ctx.Args) != 2 {
return
}
method := ctx.Args[0]
count, err := strconv.Atoi(ctx.Args[1])
if err != nil {
return
}
user.CompressMethod = method
user.CompressLimit = count
_, err = rep.UpdateUserCompressSettings(user)
if err != nil {
ctx.Error(err)
}
kb := laniakea.NewInlineKeyboard(1).AddCallbackButton("На главную", "rp.info")
ctx.EditCallback("Настройки сжатия были обновлены", kb)
}

View File

@@ -39,7 +39,9 @@ CREATE TABLE rp_users(
user_prompt text NOT NULL DEFAULT '', user_prompt text NOT NULL DEFAULT '',
selected_preset text REFERENCES rp_presets(id) DEFAULT 'soft', selected_preset text REFERENCES rp_presets(id) DEFAULT 'soft',
selected_model text REFERENCES rp_models(id) DEFAULT 'deepseek3.1', selected_model text REFERENCES rp_models(id) DEFAULT 'deepseek3.1',
used_tokens int8 NOT NULL DEFAULT 0 used_tokens int8 NOT NULL DEFAULT 0,
compress_method text NOT NULL DEFAULT 'messages',
compress_limit integer NOT NULL DEFAULT 100
); );
CREATE UNIQUE INDEX rp_users_uindex ON rp_users(user_id); CREATE UNIQUE INDEX rp_users_uindex ON rp_users(user_id);