Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions frontend/snapshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5395,13 +5395,13 @@ snapshots:
scenes-app-customer-analytics-dashboard--b-2-c-mode--light:
hash: v1.k794b7964.ff25e11868464e00df352180254dbe0a1017cd1d8c7c4f4c7d6995068e80e2dc.m0XFOZVPCdSaCLaPQ6XTePvkZJ1I11QI2KARZi9QpWs
scenes-app-customer-analytics-dashboard--gated-with-feature-toggle--dark:
hash: v1.k794b7964.f07be6c5a9a602a1b2de2e07ff8329cf79022a86359c8592ec0ffa997e06815e.4p0ObyV8dflPFp4eV8-iGtIyPw-H4rNRImtZ98MUaq0
hash: v1.k794b7964.731394bccab76141d6dc494f99dd56cc85e18b3f787977f8edd5c1a50c5564c8.9z2bNOo-dAM0tEyxcqStccQSV7X6iHbKnJdqAgvNapU
scenes-app-customer-analytics-dashboard--gated-with-feature-toggle--light:
hash: v1.k794b7964.c08ac439ce99c1885784bb01585643983c42e334ee9b66dc4fdca3a200f49aa8.1nfQJfx8u9E46SodXwq0FKkEXnMgRERGpZ3LrS7lsgk
hash: v1.k794b7964.d4a3f7e666d9788b86e4e35e6e976dc048f50189129b316352f60e389916e740.XNraHFrJz2oo-ioKjtSG3b53aSd7SUozc4GkGnRUVPw
scenes-app-customer-analytics-dashboard--gated-without-matching-early-access-feature--dark:
hash: v1.k794b7964.df78ad055d2df40bd8f7291c6be67f5186e055f66f8d642e54f4493bfea8dee4.ZN0UYUnaFqZlJQb_8eCa8a74QdPPt4v9VBEQNfMT5Dw
hash: v1.k794b7964.212105add8f003ebda9493c4f1324aa86a9ea9d4f078a9202f746125bc188ee0.mcCJ4cjTJAjHr9-eqJV3Vki9l2-kPcGcbCkwbnXGGNI
scenes-app-customer-analytics-dashboard--gated-without-matching-early-access-feature--light:
hash: v1.k794b7964.261496c85d5d04af3eb5e766063ec3e1783ea9ba2d54f82bb9c7d4b0f1cc28a0.5Gacg7ZDoAp-d35eiCG9-Jp2vYDw-4uvGAJsL5U4uiI
hash: v1.k794b7964.c17e8855ba266d7d7732b79d59cbe6996e34469b95aaf820146a2ec098d4c1cd.xHHIXeNzT7uaxywPDDglLPD96SXg9n66LgqmXi677J0
scenes-app-customer-analytics-journey-builder--new-journey--dark:
hash: v1.k794b7964.5e2f6c51e7e4db5d5d8bed07edeb90f8e71b6dbe9e4aa7042ce9337e407ff3bb.qbiM7NeFkMfNbY374tsbc_nZloshk9lmHLFgIPx5-ow
scenes-app-customer-analytics-journey-builder--new-journey--light:
Expand Down
12 changes: 11 additions & 1 deletion products/posthog_ai/frontend/utils/composerModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const EFFORT_LABELS: Record<ReasoningEffortEnumApi, string> = {
[ReasoningEffortEnumApi.High]: 'High',
[ReasoningEffortEnumApi.Xhigh]: 'Extra high',
[ReasoningEffortEnumApi.Max]: 'Max',
[ReasoningEffortEnumApi.Ultracode]: 'Ultracode',
}

// Mirrors backend CLAUDE_REASONING_EFFORTS_BY_MODEL (products/tasks/backend/temporal/process_task/utils.py):
Expand All @@ -38,15 +39,24 @@ const EFFORTS_BY_MODEL: Record<string, ReasoningEffortEnumApi[]> = {
ReasoningEffortEnumApi.High,
ReasoningEffortEnumApi.Xhigh,
ReasoningEffortEnumApi.Max,
ReasoningEffortEnumApi.Ultracode,
],
'claude-opus-5': [
ReasoningEffortEnumApi.Low,
ReasoningEffortEnumApi.Medium,
ReasoningEffortEnumApi.High,
ReasoningEffortEnumApi.Xhigh,
ReasoningEffortEnumApi.Max,
ReasoningEffortEnumApi.Ultracode,
],
'claude-sonnet-5': [
ReasoningEffortEnumApi.Low,
ReasoningEffortEnumApi.Medium,
ReasoningEffortEnumApi.High,
ReasoningEffortEnumApi.Xhigh,
ReasoningEffortEnumApi.Max,
ReasoningEffortEnumApi.Ultracode,
],
'claude-sonnet-5': [ReasoningEffortEnumApi.Low, ReasoningEffortEnumApi.Medium, ReasoningEffortEnumApi.High],
}

const FALLBACK_EFFORTS: ReasoningEffortEnumApi[] = [
Expand Down
16 changes: 16 additions & 0 deletions products/tasks/backend/facade/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3086,6 +3086,8 @@ def bootstrap_task_run(
runtime_adapter = validated_data.get("runtime_adapter")
model = validated_data.get("model")
reasoning_effort = validated_data.get("reasoning_effort")
context_window = validated_data.get("context_window")
fast_mode = validated_data.get("fast_mode")
github_user_token = validated_data.get("github_user_token")
initial_permission_mode = validated_data.get("initial_permission_mode")
imported_mcp_servers = validated_data.get("imported_mcp_servers")
Expand All @@ -3108,6 +3110,8 @@ def bootstrap_task_run(
"provider": provider,
"model": model,
"reasoning_effort": reasoning_effort,
"context_window": context_window,
"fast_mode": fast_mode,
"rtk_enabled": validated_data.get("rtk_enabled"),
}.items():
if value is not None:
Expand Down Expand Up @@ -4399,12 +4403,16 @@ def run_task(
warm_state.get("runtime_adapter") or None,
warm_state.get("model") or None,
warm_state.get("reasoning_effort") or None,
warm_state.get("context_window") or None,
warm_state.get("fast_mode") or None,
warm_state.get("sandbox_environment_id") or None,
warm_state.get("custom_image_id") or None,
) == (
validated_data.get("runtime_adapter") or None,
validated_data.get("model") or None,
validated_data.get("reasoning_effort") or None,
validated_data.get("context_window") or None,
validated_data.get("fast_mode") or None,
str(validated_data["sandbox_environment_id"]) if validated_data.get("sandbox_environment_id") else None,
str(validated_data["custom_image_id"]) if validated_data.get("custom_image_id") else None,
)
Expand Down Expand Up @@ -4448,6 +4456,8 @@ def run_task(
runtime_adapter = validated_data.get("runtime_adapter")
model = validated_data.get("model")
reasoning_effort = validated_data.get("reasoning_effort")
context_window = validated_data.get("context_window")
fast_mode = validated_data.get("fast_mode")
Comment thread
charlesvien marked this conversation as resolved.
github_user_token = validated_data.get("github_user_token")
initial_permission_mode = validated_data.get("initial_permission_mode")
imported_mcp_servers = validated_data.get("imported_mcp_servers")
Expand All @@ -4463,6 +4473,8 @@ def run_task(
"runtime_adapter": runtime_adapter,
"model": model,
"reasoning_effort": reasoning_effort,
"context_window": context_window,
"fast_mode": fast_mode,
}

extra_state: dict | None = None
Expand Down Expand Up @@ -4521,6 +4533,8 @@ def run_task(
runtime_adapter = runtime_state_fields["runtime_adapter"]
model = runtime_state_fields["model"]
reasoning_effort = runtime_state_fields["reasoning_effort"]
context_window = runtime_state_fields["context_window"]
fast_mode = runtime_state_fields["fast_mode"]
if branch is None and prev_state.pr_base_branch is not None:
branch = prev_state.pr_base_branch

Expand All @@ -4536,6 +4550,8 @@ def run_task(
"provider": provider,
"model": model,
"reasoning_effort": reasoning_effort,
"context_window": context_window,
"fast_mode": fast_mode,
Comment thread
charlesvien marked this conversation as resolved.
}.items():
if value is not None:
extra_state = extra_state or {}
Expand Down
2 changes: 2 additions & 0 deletions products/tasks/backend/facade/run_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
# so presentation builds serializer choices without importing the ORM model directly.
from products.tasks.backend.models import TaskArtifact as _TaskArtifact
from products.tasks.backend.temporal.process_task.utils import (
CONTEXT_WINDOW_CHOICES,
PUBLIC_REASONING_EFFORTS,
GitHubCredentialSource,
LLMProvider,
Expand All @@ -44,6 +45,7 @@
__all__ = [
"ALL_INITIAL_PERMISSION_MODE_CHOICES",
"CODEX_INITIAL_PERMISSION_MODE_CHOICES",
"CONTEXT_WINDOW_CHOICES",
"INITIAL_PERMISSION_MODE_CHOICES",
"InitialPermissionMode",
"PUBLIC_REASONING_EFFORTS",
Expand Down
16 changes: 13 additions & 3 deletions products/tasks/backend/logic/services/docker_sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,8 @@ def _build_agent_server_command(
provider: str | None = None,
model: str | None = None,
reasoning_effort: str | None = None,
context_window: str | None = None,
fast_mode: bool | None = None,
initial_permission_mode: str | None = None,
mcp_servers_arg: str = "",
relay_mcp_servers_arg: str = "",
Expand All @@ -815,6 +817,8 @@ def _build_agent_server_command(
provider=provider,
model=model,
reasoning_effort=reasoning_effort,
context_window=context_window,
fast_mode=fast_mode,
initial_permission_mode=initial_permission_mode,
event_ingest_token=event_ingest_token,
event_ingest_url=event_ingest_url,
Expand Down Expand Up @@ -899,6 +903,8 @@ def start_agent_server(
provider: str | None = None,
model: str | None = None,
reasoning_effort: str | None = None,
context_window: str | None = None,
fast_mode: bool | None = None,
initial_permission_mode: str | None = None,
mcp_configs: list[McpServerConfig] | None = None,
relayed_mcp_servers: list[str] | None = None,
Expand Down Expand Up @@ -970,9 +976,11 @@ def start_agent_server(
provider,
model,
reasoning_effort,
initial_permission_mode,
mcp_servers_arg,
relay_mcp_servers_arg,
context_window=context_window,
fast_mode=fast_mode,
initial_permission_mode=initial_permission_mode,
mcp_servers_arg=mcp_servers_arg,
relay_mcp_servers_arg=relay_mcp_servers_arg,
allowed_domains=allowed_domains,
event_ingest_token=event_ingest_token,
event_ingest_url=event_ingest_url,
Expand Down Expand Up @@ -1021,6 +1029,8 @@ def start_agent_server(
provider=provider,
model=model,
reasoning_effort=reasoning_effort,
context_window=context_window,
fast_mode=fast_mode,
initial_permission_mode=initial_permission_mode,
mcp_servers_arg=mcp_servers_arg,
relay_mcp_servers_arg=relay_mcp_servers_arg,
Expand Down
14 changes: 11 additions & 3 deletions products/tasks/backend/logic/services/modal_sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -949,6 +949,8 @@ def _build_agent_server_command(
provider: str | None = None,
model: str | None = None,
reasoning_effort: str | None = None,
context_window: str | None = None,
fast_mode: bool | None = None,
initial_permission_mode: str | None = None,
mcp_servers_arg: str = "",
relay_mcp_servers_arg: str = "",
Expand All @@ -966,6 +968,8 @@ def _build_agent_server_command(
provider=provider,
model=model,
reasoning_effort=reasoning_effort,
context_window=context_window,
fast_mode=fast_mode,
initial_permission_mode=initial_permission_mode,
event_ingest_token=event_ingest_token,
event_ingest_url=event_ingest_url,
Expand Down Expand Up @@ -1076,6 +1080,8 @@ def start_agent_server(
provider: str | None = None,
model: str | None = None,
reasoning_effort: str | None = None,
context_window: str | None = None,
fast_mode: bool | None = None,
initial_permission_mode: str | None = None,
mcp_configs: list[McpServerConfig] | None = None,
relayed_mcp_servers: list[str] | None = None,
Expand Down Expand Up @@ -1150,9 +1156,11 @@ def start_agent_server(
provider,
model,
reasoning_effort,
initial_permission_mode,
mcp_servers_arg,
relay_mcp_servers_arg,
context_window=context_window,
fast_mode=fast_mode,
initial_permission_mode=initial_permission_mode,
mcp_servers_arg=mcp_servers_arg,
relay_mcp_servers_arg=relay_mcp_servers_arg,
allowed_domains=allowed_domains,
event_ingest_token=event_ingest_token,
event_ingest_url=event_ingest_url,
Expand Down
7 changes: 7 additions & 0 deletions products/tasks/backend/logic/services/sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ def build_agent_runtime_env_prefix(
provider: str | None = None,
model: str | None = None,
reasoning_effort: str | None = None,
context_window: str | None = None,
fast_mode: bool | None = None,
initial_permission_mode: str | None = None,
event_ingest_token: str | None = None,
event_ingest_url: str | None = None,
Expand All @@ -183,6 +185,9 @@ def build_agent_runtime_env_prefix(
"POSTHOG_CODE_PROVIDER": provider,
"POSTHOG_CODE_MODEL": model,
"POSTHOG_CODE_REASONING_EFFORT": reasoning_effort,
"POSTHOG_CODE_CONTEXT_WINDOW": context_window,
# Explicit false pins fast mode off even if a stale env value survives in a resumed sandbox.
"POSTHOG_CODE_FAST_MODE": None if fast_mode is None else ("true" if fast_mode else "false"),
"POSTHOG_CODE_INITIAL_PERMISSION_MODE": initial_permission_mode,
"POSTHOG_TASK_RUN_EVENT_INGEST_TOKEN": event_ingest_token,
"POSTHOG_TASK_RUN_EVENT_INGEST_URL": event_ingest_url,
Expand Down Expand Up @@ -333,6 +338,8 @@ def start_agent_server(
provider: str | None = None,
model: str | None = None,
reasoning_effort: str | None = None,
context_window: str | None = None,
fast_mode: bool | None = None,
initial_permission_mode: str | None = None,
mcp_configs: list[McpServerConfig] | None = None,
relayed_mcp_servers: list[str] | None = None,
Expand Down
35 changes: 35 additions & 0 deletions products/tasks/backend/logic/services/test_docker_sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,8 @@ def test_start_agent_server_includes_runtime_environment_variables(self):
provider="openai",
model="gpt-5.3-codex",
reasoning_effort="medium",
context_window="1m",
fast_mode=True,
initial_permission_mode="plan",
event_ingest_token="ingest-token",
event_ingest_url="http://localhost:8003",
Expand All @@ -600,11 +602,44 @@ def test_start_agent_server_includes_runtime_environment_variables(self):
assert "POSTHOG_CODE_PROVIDER=openai" in command
assert "POSTHOG_CODE_MODEL=gpt-5.3-codex" in command
assert "POSTHOG_CODE_REASONING_EFFORT=medium" in command
assert "POSTHOG_CODE_CONTEXT_WINDOW=1m" in command
assert "POSTHOG_CODE_FAST_MODE=true" in command
assert "POSTHOG_CODE_INITIAL_PERMISSION_MODE=plan" in command
assert "POSTHOG_TASK_RUN_EVENT_INGEST_TOKEN=ingest-token" in command
# The host proxy URL is rewritten so it resolves from inside the container.
assert "POSTHOG_TASK_RUN_EVENT_INGEST_URL=http://host.docker.internal:8003" in command

@pytest.mark.parametrize(
"fast_mode, expected_env",
[
(False, "POSTHOG_CODE_FAST_MODE=false"),
(None, None),
],
)
def test_start_agent_server_fast_mode_env(self, fast_mode, expected_env):
sandbox = DockerSandbox.__new__(DockerSandbox)
sandbox._container_id = "abc123"
sandbox.id = "abc123"
sandbox.config = SandboxConfig(name="test")
sandbox._host_port = 12345

with patch.object(sandbox, "is_running", return_value=True):
with patch.object(sandbox, "execute") as mock_execute:
mock_execute.return_value = ExecutionResult(stdout="ok:1", stderr="", exit_code=0, error=None)
sandbox.start_agent_server(
"posthog/posthog",
"task-123",
"run-456",
"background",
fast_mode=fast_mode,
)

command = _agent_server_launch_command(mock_execute)
if expected_env is not None:
assert expected_env in command
else:
assert "POSTHOG_CODE_FAST_MODE" not in command

@pytest.mark.parametrize(
"keep_stream_open, expected_env_present",
[
Expand Down
30 changes: 30 additions & 0 deletions products/tasks/backend/logic/services/tests/test_modal_sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,8 @@ def test_start_agent_server_includes_runtime_environment_variables(self, mock_sa
provider="openai",
model="gpt-5.3-codex",
reasoning_effort="high",
context_window="1m",
fast_mode=True,
initial_permission_mode="plan",
event_ingest_token="ingest-token",
event_ingest_url="https://agent-proxy.example.com",
Expand All @@ -559,12 +561,40 @@ def test_start_agent_server_includes_runtime_environment_variables(self, mock_sa
assert "POSTHOG_CODE_PROVIDER=openai" in command
assert "POSTHOG_CODE_MODEL=gpt-5.3-codex" in command
assert "POSTHOG_CODE_REASONING_EFFORT=high" in command
assert "POSTHOG_CODE_CONTEXT_WINDOW=1m" in command
assert "POSTHOG_CODE_FAST_MODE=true" in command
assert "POSTHOG_CODE_INITIAL_PERMISSION_MODE=plan" in command
assert "POSTHOG_TASK_RUN_EVENT_INGEST_TOKEN=ingest-token" in command
# Modal sandboxes reach the proxy by its real URL, no Docker-host rewrite.
assert "POSTHOG_TASK_RUN_EVENT_INGEST_URL=https://agent-proxy.example.com" in command
assert "POSTHOG_RTK=1" in command

@pytest.mark.parametrize(
"fast_mode, expected_env",
[
(False, "POSTHOG_CODE_FAST_MODE=false"),
(None, None),
],
)
def test_start_agent_server_fast_mode_env(self, mock_sandbox: Any, fast_mode, expected_env):
mock_sandbox.execute = MagicMock(
return_value=ExecutionResult(stdout="ok:1", stderr="", exit_code=0, error=None),
)

mock_sandbox.start_agent_server(
repository="posthog/posthog",
task_id="task-123",
run_id="run-456",
mode="background",
fast_mode=fast_mode,
)

command = _agent_server_launch_command(mock_sandbox.execute)
if expected_env is not None:
assert expected_env in command
else:
assert "POSTHOG_CODE_FAST_MODE" not in command

@pytest.mark.parametrize(
"rtk_enabled, expected_env",
[
Expand Down
Loading
Loading