Bump condenser defaults: max_size 120->240 (#12267)

Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
Xingyao Wang
2026-01-06 16:43:23 -05:00
committed by GitHub
parent 1907ebeaa8
commit af5c22700c
6 changed files with 71 additions and 10 deletions

View File

@@ -0,0 +1,61 @@
"""bump condenser defaults: max_size 120->240
Revision ID: 086
Revises: 085
Create Date: 2026-01-05
"""
from typing import Sequence, Union
import sqlalchemy as sa
from alembic import op
from sqlalchemy.sql import column, table
# revision identifiers, used by Alembic.
revision: str = '086'
down_revision: Union[str, None] = '085'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema.
Update existing users with condenser_max_size=120 or NULL to 240.
This covers both users who had the old default (120) explicitly set
and users who had NULL (which defaulted to 120 in the application code).
The SDK default for keep_first will be used automatically.
"""
user_settings_table = table(
'user_settings',
column('condenser_max_size', sa.Integer),
)
# Update users with explicit 120 value
op.execute(
user_settings_table.update()
.where(user_settings_table.c.condenser_max_size == 120)
.values(condenser_max_size=240)
)
# Update users with NULL value (which defaulted to 120 in application code)
op.execute(
user_settings_table.update()
.where(user_settings_table.c.condenser_max_size.is_(None))
.values(condenser_max_size=240)
)
def downgrade() -> None:
"""Downgrade schema.
Note: This sets all 240 values back to NULL (not 120) since we can't
distinguish between users who had 120 vs NULL before the upgrade.
"""
user_settings_table = table(
'user_settings', column('condenser_max_size', sa.Integer)
)
op.execute(
user_settings_table.update()
.where(user_settings_table.c.condenser_max_size == 240)
.values(condenser_max_size=None)
)

View File

@@ -15,7 +15,7 @@ export const DEFAULT_SETTINGS: Settings = {
remote_runtime_resource_factor: 1,
provider_tokens_set: {},
enable_default_condenser: true,
condenser_max_size: 120,
condenser_max_size: 240,
enable_sound_notifications: false,
user_consents_to_analytics: false,
enable_proactive_conversation_starters: false,

View File

@@ -27,7 +27,7 @@ export const hasAdvancedSettingsSet = (
settings.agent !== undefined && settings.agent !== DEFAULT_SETTINGS.agent;
// Default is true, so only check if explicitly disabled
const hasDisabledCondenser = settings.enable_default_condenser === false;
// Check if condenser size differs from default (default is 120)
// Check if condenser size differs from default (default is 240)
const hasCustomCondenserSize =
settings.condenser_max_size !== undefined &&
settings.condenser_max_size !== null &&

View File

@@ -380,7 +380,7 @@ class AppConversationServiceBase(AppConversationService, ABC):
Returns:
Configured LLMSummarizingCondenser instance
"""
# LLMSummarizingCondenser has defaults: max_size=120, keep_first=4
# LLMSummarizingCondenser SDK defaults: max_size=240, keep_first=2
condenser_kwargs = {
'llm': llm.model_copy(
update={

View File

@@ -234,7 +234,7 @@ class WebSession:
# The order matters: with the browser output first, the summarizer
# will only see the most recent browser output, which should keep
# the summarization cost down.
max_events_for_condenser = settings.condenser_max_size or 120
max_events_for_condenser = settings.condenser_max_size or 240
default_condenser_config = CondenserPipelineConfig(
condensers=[
ConversationWindowCondenserConfig(),

View File

@@ -320,9 +320,9 @@ def test_create_condenser_default_agent_with_none_max_size(mock_condenser_class)
# Assert
mock_condenser_class.assert_called_once()
call_kwargs = mock_condenser_class.call_args[1]
# When condenser_max_size is None, max_size should not be passed (uses SDK default of 120)
# When condenser_max_size is None, max_size should not be passed (uses SDK default of 240)
assert 'max_size' not in call_kwargs
# keep_first is never passed (uses SDK default of 4)
# keep_first is never passed (uses SDK default of 2)
assert 'keep_first' not in call_kwargs
assert call_kwargs['llm'].usage_id == 'condenser'
mock_llm.model_copy.assert_called_once()
@@ -358,7 +358,7 @@ def test_create_condenser_default_agent_with_custom_max_size(mock_condenser_clas
mock_condenser_class.assert_called_once()
call_kwargs = mock_condenser_class.call_args[1]
assert call_kwargs['max_size'] == 150 # Custom value should be used
# keep_first is never passed (uses SDK default of 4)
# keep_first is never passed (uses SDK default of 2)
assert 'keep_first' not in call_kwargs
assert call_kwargs['llm'].usage_id == 'condenser'
mock_llm.model_copy.assert_called_once()
@@ -393,9 +393,9 @@ def test_create_condenser_plan_agent_with_none_max_size(mock_condenser_class):
# Assert
mock_condenser_class.assert_called_once()
call_kwargs = mock_condenser_class.call_args[1]
# When condenser_max_size is None, max_size should not be passed (uses SDK default of 120)
# When condenser_max_size is None, max_size should not be passed (uses SDK default of 240)
assert 'max_size' not in call_kwargs
# keep_first is never passed (uses SDK default of 4)
# keep_first is never passed (uses SDK default of 2)
assert 'keep_first' not in call_kwargs
assert call_kwargs['llm'].usage_id == 'planning_condenser'
mock_llm.model_copy.assert_called_once()
@@ -431,7 +431,7 @@ def test_create_condenser_plan_agent_with_custom_max_size(mock_condenser_class):
mock_condenser_class.assert_called_once()
call_kwargs = mock_condenser_class.call_args[1]
assert call_kwargs['max_size'] == 200 # Custom value should be used
# keep_first is never passed (uses SDK default of 4)
# keep_first is never passed (uses SDK default of 2)
assert 'keep_first' not in call_kwargs
assert call_kwargs['llm'].usage_id == 'planning_condenser'
mock_llm.model_copy.assert_called_once()