This commit is contained in:
@@ -146,6 +146,22 @@ def test_ai_planner_forwards_tools_screenshot_and_timeout_to_client() -> None:
|
||||
assert "send a message" in call["user_prompt"]
|
||||
|
||||
|
||||
def test_ai_planner_includes_device_platform_from_task_context() -> None:
|
||||
client = FakeToolCallingClient(
|
||||
ToolCallDecision(tool_name="tap", arguments={"x": 1, "y": 2})
|
||||
)
|
||||
planner = AIPlanner(client=client)
|
||||
context = TaskContext(
|
||||
task_id="task-1",
|
||||
goal="send a message",
|
||||
device_platform="android",
|
||||
)
|
||||
|
||||
planner.plan(goal="send a message", scene=_scene(), context=context)
|
||||
|
||||
assert "Device type: android" in client.calls[0]["user_prompt"]
|
||||
|
||||
|
||||
def test_ai_planner_populates_step_prompt_from_user_prompt() -> None:
|
||||
"""PlannedStep.prompt should carry the actual user prompt sent to the LLM,
|
||||
not the bare task goal."""
|
||||
|
||||
@@ -46,9 +46,11 @@ class NarrowSignaturePlanner(Planner):
|
||||
class ScreenshotRecordingPlanner(Planner):
|
||||
def __init__(self) -> None:
|
||||
self.screenshots: list[bytes | None] = []
|
||||
self.device_platforms: list[str | None] = []
|
||||
|
||||
def plan(self, *, goal, scene, context, screenshot=None):
|
||||
self.screenshots.append(screenshot)
|
||||
self.device_platforms.append(context.device_platform)
|
||||
if context.step_results:
|
||||
return []
|
||||
return [PlannedStep(action="tap", description="tap")]
|
||||
@@ -69,7 +71,9 @@ def _scene() -> Scene:
|
||||
)
|
||||
|
||||
|
||||
def _runner(*, planner=None, planner_config=None, observer=None) -> TaskRunner:
|
||||
def _runner(
|
||||
*, planner=None, planner_config=None, observer=None, device_platform_provider=None
|
||||
) -> TaskRunner:
|
||||
return TaskRunner(
|
||||
planner=planner,
|
||||
planner_config=planner_config,
|
||||
@@ -80,6 +84,7 @@ def _runner(*, planner=None, planner_config=None, observer=None) -> TaskRunner:
|
||||
config=TaskRunnerConfig(max_steps=5),
|
||||
observer=observer or (lambda device_id: _scene()),
|
||||
screenshot_provider=lambda device_id: PNG_10X20,
|
||||
device_platform_provider=device_platform_provider,
|
||||
)
|
||||
|
||||
|
||||
@@ -126,6 +131,19 @@ def test_task_runner_passes_screenshot_to_planner_that_declares_it() -> None:
|
||||
assert planner.screenshots == [PNG_10X20, PNG_10X20]
|
||||
|
||||
|
||||
def test_task_runner_passes_configured_device_platform_to_planner_context() -> None:
|
||||
planner = ScreenshotRecordingPlanner()
|
||||
runner = _runner(
|
||||
planner=planner,
|
||||
device_platform_provider=lambda device_id: "ios",
|
||||
)
|
||||
|
||||
result = runner.run(Task(goal="inspect", device_id="phone"))
|
||||
|
||||
assert result.status == "completed"
|
||||
assert planner.device_platforms == ["ios", "ios"]
|
||||
|
||||
|
||||
def test_task_runner_default_planner_is_stub_when_ai_planner_disabled() -> None:
|
||||
runner = _runner(planner=None, planner_config=PlannerConfig(enabled=False))
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
from runtime.planner_prompts import planner_user_prompt
|
||||
|
||||
|
||||
def test_planner_user_prompt_includes_time_zone_and_configured_device_type() -> None:
|
||||
prompt = planner_user_prompt(
|
||||
goal="open settings",
|
||||
scene_json={"screen": {"width": 1, "height": 1}, "elements": []},
|
||||
history_summary=[],
|
||||
device_platform="ios",
|
||||
now=datetime(
|
||||
2026,
|
||||
7,
|
||||
16,
|
||||
9,
|
||||
8,
|
||||
7,
|
||||
tzinfo=timezone(timedelta(hours=8), "Asia/Shanghai"),
|
||||
),
|
||||
)
|
||||
|
||||
assert "Current date and time: 2026-07-16T09:08:07+08:00" in prompt
|
||||
assert "Time zone: Asia/Shanghai" in prompt
|
||||
assert "Device type: ios" in prompt
|
||||
|
||||
|
||||
def test_planner_user_prompt_uses_scene_platform_when_context_is_unavailable() -> None:
|
||||
prompt = planner_user_prompt(
|
||||
goal="open settings",
|
||||
scene_json={
|
||||
"screen": {"width": 1, "height": 1},
|
||||
"elements": [],
|
||||
"app": {"platform": "android"},
|
||||
},
|
||||
history_summary=[],
|
||||
now=datetime(2026, 7, 16, tzinfo=timezone.utc),
|
||||
)
|
||||
|
||||
assert "Device type: android" in prompt
|
||||
Reference in New Issue
Block a user