diff --git a/db/migrations/0001_init.up.sql b/db/migrations/0001_init.up.sql index f1910b94..25c8772a 100644 --- a/db/migrations/0001_init.up.sql +++ b/db/migrations/0001_init.up.sql @@ -155,7 +155,6 @@ CREATE TABLE IF NOT EXISTS bots ( discuss_probe_model_id UUID REFERENCES models(id) ON DELETE SET NULL, tts_model_id UUID REFERENCES models(id) ON DELETE SET NULL, browser_context_id UUID REFERENCES browser_contexts(id) ON DELETE SET NULL, - context_token_budget INTEGER, persist_full_tool_results BOOLEAN NOT NULL DEFAULT false, metadata JSONB NOT NULL DEFAULT '{}'::jsonb, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), diff --git a/db/migrations/0067_drop_context_token_budget.down.sql b/db/migrations/0067_drop_context_token_budget.down.sql new file mode 100644 index 00000000..80881a21 --- /dev/null +++ b/db/migrations/0067_drop_context_token_budget.down.sql @@ -0,0 +1,4 @@ +-- 0067_drop_context_token_budget (down) +-- Restore the context_token_budget column. + +ALTER TABLE bots ADD COLUMN IF NOT EXISTS context_token_budget INTEGER; diff --git a/db/migrations/0067_drop_context_token_budget.up.sql b/db/migrations/0067_drop_context_token_budget.up.sql new file mode 100644 index 00000000..6e84045c --- /dev/null +++ b/db/migrations/0067_drop_context_token_budget.up.sql @@ -0,0 +1,5 @@ +-- 0067_drop_context_token_budget +-- Remove the unused context_token_budget column from bots table. +-- Context trimming now derives the budget from the chat model's context_window. + +ALTER TABLE bots DROP COLUMN IF EXISTS context_token_budget; diff --git a/db/queries/settings.sql b/db/queries/settings.sql index 5dd52dfa..2d74994e 100644 --- a/db/queries/settings.sql +++ b/db/queries/settings.sql @@ -20,7 +20,6 @@ SELECT image_models.id AS image_model_id, tts_models.id AS tts_model_id, browser_contexts.id AS browser_context_id, - bots.context_token_budget, bots.persist_full_tool_results FROM bots LEFT JOIN models AS chat_models ON chat_models.id = bots.chat_model_id @@ -56,11 +55,10 @@ WITH updated AS ( image_model_id = COALESCE(sqlc.narg(image_model_id)::uuid, bots.image_model_id), tts_model_id = COALESCE(sqlc.narg(tts_model_id)::uuid, bots.tts_model_id), browser_context_id = COALESCE(sqlc.narg(browser_context_id)::uuid, bots.browser_context_id), - context_token_budget = COALESCE(sqlc.narg(context_token_budget)::integer, bots.context_token_budget), persist_full_tool_results = sqlc.arg(persist_full_tool_results), updated_at = now() WHERE bots.id = sqlc.arg(id) - RETURNING bots.id, bots.language, bots.reasoning_enabled, bots.reasoning_effort, bots.heartbeat_enabled, bots.heartbeat_interval, bots.heartbeat_prompt, bots.compaction_enabled, bots.compaction_threshold, bots.compaction_ratio, bots.timezone, bots.chat_model_id, bots.heartbeat_model_id, bots.compaction_model_id, bots.title_model_id, bots.image_model_id, bots.search_provider_id, bots.memory_provider_id, bots.tts_model_id, bots.browser_context_id, bots.context_token_budget, bots.persist_full_tool_results + RETURNING bots.id, bots.language, bots.reasoning_enabled, bots.reasoning_effort, bots.heartbeat_enabled, bots.heartbeat_interval, bots.heartbeat_prompt, bots.compaction_enabled, bots.compaction_threshold, bots.compaction_ratio, bots.timezone, bots.chat_model_id, bots.heartbeat_model_id, bots.compaction_model_id, bots.title_model_id, bots.image_model_id, bots.search_provider_id, bots.memory_provider_id, bots.tts_model_id, bots.browser_context_id, bots.persist_full_tool_results ) SELECT updated.id AS bot_id, @@ -83,7 +81,6 @@ SELECT image_models.id AS image_model_id, tts_models.id AS tts_model_id, browser_contexts.id AS browser_context_id, - updated.context_token_budget, updated.persist_full_tool_results FROM updated LEFT JOIN models AS chat_models ON chat_models.id = updated.chat_model_id @@ -116,7 +113,6 @@ SET language = 'auto', memory_provider_id = NULL, tts_model_id = NULL, browser_context_id = NULL, - context_token_budget = NULL, persist_full_tool_results = false, updated_at = now() WHERE id = $1; diff --git a/internal/conversation/flow/resolver.go b/internal/conversation/flow/resolver.go index 022830c0..b94d6f8f 100644 --- a/internal/conversation/flow/resolver.go +++ b/internal/conversation/flow/resolver.go @@ -287,10 +287,9 @@ func (r *Resolver) resolve(ctx context.Context, req conversation.ChatRequest) (r } } - botSettings, _ := r.loadBotSettings(ctx, req.BotID) contextTokenBudget := 0 - if botSettings.ContextTokenBudget > 0 { - contextTokenBudget = botSettings.ContextTokenBudget + if chatModel.Config.ContextWindow != nil && *chatModel.Config.ContextWindow > 0 { + contextTokenBudget = *chatModel.Config.ContextWindow } var messages []conversation.ModelMessage diff --git a/internal/db/sqlc/conversations.sql.go b/internal/db/sqlc/conversations.sql.go index ac962a20..838b7a39 100644 --- a/internal/db/sqlc/conversations.sql.go +++ b/internal/db/sqlc/conversations.sql.go @@ -511,7 +511,7 @@ WITH updated AS ( SET display_name = $1, updated_at = now() WHERE bots.id = $2 - RETURNING id, owner_user_id, display_name, avatar_url, timezone, is_active, status, language, reasoning_enabled, reasoning_effort, chat_model_id, search_provider_id, memory_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, heartbeat_model_id, compaction_enabled, compaction_threshold, compaction_ratio, compaction_model_id, title_model_id, image_model_id, discuss_probe_model_id, tts_model_id, browser_context_id, context_token_budget, persist_full_tool_results, metadata, created_at, updated_at, acl_default_effect + RETURNING id, owner_user_id, display_name, avatar_url, timezone, is_active, status, language, reasoning_enabled, reasoning_effort, chat_model_id, search_provider_id, memory_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, heartbeat_model_id, compaction_enabled, compaction_threshold, compaction_ratio, compaction_model_id, title_model_id, image_model_id, discuss_probe_model_id, tts_model_id, browser_context_id, persist_full_tool_results, metadata, created_at, updated_at, acl_default_effect ) SELECT updated.id AS id, diff --git a/internal/db/sqlc/models.go b/internal/db/sqlc/models.go index 8149135c..b1f14174 100644 --- a/internal/db/sqlc/models.go +++ b/internal/db/sqlc/models.go @@ -35,7 +35,6 @@ type Bot struct { DiscussProbeModelID pgtype.UUID `json:"discuss_probe_model_id"` TtsModelID pgtype.UUID `json:"tts_model_id"` BrowserContextID pgtype.UUID `json:"browser_context_id"` - ContextTokenBudget pgtype.Int4 `json:"context_token_budget"` PersistFullToolResults bool `json:"persist_full_tool_results"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` diff --git a/internal/db/sqlc/settings.sql.go b/internal/db/sqlc/settings.sql.go index beb1fecb..ccf44284 100644 --- a/internal/db/sqlc/settings.sql.go +++ b/internal/db/sqlc/settings.sql.go @@ -31,7 +31,6 @@ SET language = 'auto', memory_provider_id = NULL, tts_model_id = NULL, browser_context_id = NULL, - context_token_budget = NULL, persist_full_tool_results = false, updated_at = now() WHERE id = $1 @@ -64,7 +63,6 @@ SELECT image_models.id AS image_model_id, tts_models.id AS tts_model_id, browser_contexts.id AS browser_context_id, - bots.context_token_budget, bots.persist_full_tool_results FROM bots LEFT JOIN models AS chat_models ON chat_models.id = bots.chat_model_id @@ -100,7 +98,6 @@ type GetSettingsByBotIDRow struct { ImageModelID pgtype.UUID `json:"image_model_id"` TtsModelID pgtype.UUID `json:"tts_model_id"` BrowserContextID pgtype.UUID `json:"browser_context_id"` - ContextTokenBudget pgtype.Int4 `json:"context_token_budget"` PersistFullToolResults bool `json:"persist_full_tool_results"` } @@ -128,7 +125,6 @@ func (q *Queries) GetSettingsByBotID(ctx context.Context, id pgtype.UUID) (GetSe &i.ImageModelID, &i.TtsModelID, &i.BrowserContextID, - &i.ContextTokenBudget, &i.PersistFullToolResults, ) return i, err @@ -156,11 +152,10 @@ WITH updated AS ( image_model_id = COALESCE($17::uuid, bots.image_model_id), tts_model_id = COALESCE($18::uuid, bots.tts_model_id), browser_context_id = COALESCE($19::uuid, bots.browser_context_id), - context_token_budget = COALESCE($20::integer, bots.context_token_budget), - persist_full_tool_results = $21, + persist_full_tool_results = $20, updated_at = now() - WHERE bots.id = $22 - RETURNING bots.id, bots.language, bots.reasoning_enabled, bots.reasoning_effort, bots.heartbeat_enabled, bots.heartbeat_interval, bots.heartbeat_prompt, bots.compaction_enabled, bots.compaction_threshold, bots.compaction_ratio, bots.timezone, bots.chat_model_id, bots.heartbeat_model_id, bots.compaction_model_id, bots.title_model_id, bots.image_model_id, bots.search_provider_id, bots.memory_provider_id, bots.tts_model_id, bots.browser_context_id, bots.context_token_budget, bots.persist_full_tool_results + WHERE bots.id = $21 + RETURNING bots.id, bots.language, bots.reasoning_enabled, bots.reasoning_effort, bots.heartbeat_enabled, bots.heartbeat_interval, bots.heartbeat_prompt, bots.compaction_enabled, bots.compaction_threshold, bots.compaction_ratio, bots.timezone, bots.chat_model_id, bots.heartbeat_model_id, bots.compaction_model_id, bots.title_model_id, bots.image_model_id, bots.search_provider_id, bots.memory_provider_id, bots.tts_model_id, bots.browser_context_id, bots.persist_full_tool_results ) SELECT updated.id AS bot_id, @@ -183,7 +178,6 @@ SELECT image_models.id AS image_model_id, tts_models.id AS tts_model_id, browser_contexts.id AS browser_context_id, - updated.context_token_budget, updated.persist_full_tool_results FROM updated LEFT JOIN models AS chat_models ON chat_models.id = updated.chat_model_id @@ -217,7 +211,6 @@ type UpsertBotSettingsParams struct { ImageModelID pgtype.UUID `json:"image_model_id"` TtsModelID pgtype.UUID `json:"tts_model_id"` BrowserContextID pgtype.UUID `json:"browser_context_id"` - ContextTokenBudget pgtype.Int4 `json:"context_token_budget"` PersistFullToolResults bool `json:"persist_full_tool_results"` ID pgtype.UUID `json:"id"` } @@ -243,7 +236,6 @@ type UpsertBotSettingsRow struct { ImageModelID pgtype.UUID `json:"image_model_id"` TtsModelID pgtype.UUID `json:"tts_model_id"` BrowserContextID pgtype.UUID `json:"browser_context_id"` - ContextTokenBudget pgtype.Int4 `json:"context_token_budget"` PersistFullToolResults bool `json:"persist_full_tool_results"` } @@ -268,7 +260,6 @@ func (q *Queries) UpsertBotSettings(ctx context.Context, arg UpsertBotSettingsPa arg.ImageModelID, arg.TtsModelID, arg.BrowserContextID, - arg.ContextTokenBudget, arg.PersistFullToolResults, arg.ID, ) @@ -294,7 +285,6 @@ func (q *Queries) UpsertBotSettings(ctx context.Context, arg UpsertBotSettingsPa &i.ImageModelID, &i.TtsModelID, &i.BrowserContextID, - &i.ContextTokenBudget, &i.PersistFullToolResults, ) return i, err diff --git a/internal/settings/service.go b/internal/settings/service.go index f5f230aa..189a80bd 100644 --- a/internal/settings/service.go +++ b/internal/settings/service.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "log/slog" - "math" "strings" "github.com/google/uuid" @@ -184,14 +183,6 @@ func (s *Service) UpsertBot(ctx context.Context, botID string, req UpsertRequest } browserContextUUID = ctxID } - contextTokenBudgetValue := pgtype.Int4{} - if req.ContextTokenBudget != nil && *req.ContextTokenBudget >= 0 { - v := *req.ContextTokenBudget - if v > math.MaxInt32 { - v = math.MaxInt32 - } - contextTokenBudgetValue = pgtype.Int4{Int32: int32(v), Valid: true} //nolint:gosec // G115: clamped above - } updated, err := s.queries.UpsertBotSettings(ctx, sqlc.UpsertBotSettingsParams{ ID: pgID, @@ -214,7 +205,6 @@ func (s *Service) UpsertBot(ctx context.Context, botID string, req UpsertRequest MemoryProviderID: memoryProviderUUID, TtsModelID: ttsModelUUID, BrowserContextID: browserContextUUID, - ContextTokenBudget: contextTokenBudgetValue, PersistFullToolResults: current.PersistFullToolResults, }) if err != nil { @@ -309,7 +299,6 @@ func normalizeBotSettingsReadRow(row sqlc.GetSettingsByBotIDRow) Settings { row.MemoryProviderID, row.TtsModelID, row.BrowserContextID, - row.ContextTokenBudget, row.PersistFullToolResults, ) } @@ -334,7 +323,6 @@ func normalizeBotSettingsWriteRow(row sqlc.UpsertBotSettingsRow) Settings { row.MemoryProviderID, row.TtsModelID, row.BrowserContextID, - row.ContextTokenBudget, row.PersistFullToolResults, ) } @@ -358,7 +346,6 @@ func normalizeBotSettingsFields( memoryProviderID pgtype.UUID, ttsModelID pgtype.UUID, browserContextID pgtype.UUID, - contextTokenBudget pgtype.Int4, persistFullToolResults bool, ) Settings { settings := normalizeBotSetting(language, "", reasoningEnabled, reasoningEffort, heartbeatEnabled, heartbeatInterval, compactionEnabled, compactionThreshold, compactionRatio) @@ -392,9 +379,6 @@ func normalizeBotSettingsFields( if browserContextID.Valid { settings.BrowserContextID = uuid.UUID(browserContextID.Bytes).String() } - if contextTokenBudget.Valid { - settings.ContextTokenBudget = int(contextTokenBudget.Int32) - } settings.PersistFullToolResults = persistFullToolResults return settings } diff --git a/internal/settings/types.go b/internal/settings/types.go index ecb46a6f..45c82065 100644 --- a/internal/settings/types.go +++ b/internal/settings/types.go @@ -27,7 +27,6 @@ type Settings struct { CompactionRatio int `json:"compaction_ratio"` CompactionModelID string `json:"compaction_model_id,omitempty"` DiscussProbeModelID string `json:"discuss_probe_model_id,omitempty"` - ContextTokenBudget int `json:"context_token_budget"` PersistFullToolResults bool `json:"persist_full_tool_results"` } @@ -52,6 +51,5 @@ type UpsertRequest struct { CompactionRatio *int `json:"compaction_ratio,omitempty"` CompactionModelID *string `json:"compaction_model_id,omitempty"` DiscussProbeModelID string `json:"discuss_probe_model_id,omitempty"` - ContextTokenBudget *int `json:"context_token_budget,omitempty"` PersistFullToolResults *bool `json:"persist_full_tool_results,omitempty"` }