compress wip
This commit is contained in:
@@ -34,13 +34,17 @@ type RPSetting struct {
|
|||||||
Prompt string
|
Prompt string
|
||||||
}
|
}
|
||||||
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
2
go.mod
@@ -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
4
go.sum
@@ -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=
|
||||||
|
|||||||
104
plugins/rp.go
104
plugins/rp.go
@@ -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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user