feat(android): add native controls and continuous multi-touch

This commit is contained in:
chenmingxuan committed 2026-11-02 21:33:45 +08:00
1 parent 3dd96078db
commit 4b12ae7728
70 files changed
+13105 -179

No files matched your search

+39 -2
View File
@@ -35,6 +35,7 @@ from langchain_core.messages import AIMessage, HumanMessage, SystemMessage, Tool
from artemis.agents.operator.operator import OperatorNode
from artemis.agents.operator.prompts import load_operator_prompts
from artemis.agents.operator.prompts import (
OPERATOR_PROMPT_TOOLSET,
PLAN_HISTORY_STATIC_POINTER,
PLAN_HISTORY_TEMPLATE_SECTION,
PromptBuilder,
@@ -54,8 +55,8 @@ from artemis.memory.transcript import (
# SHA-256 snapshots of the legacy system message with the fixed inputs below.
# Update these when an intentional template change alters the rendered prompt.
GOLDEN_EMPTY_PLAN = "23c3d6b5fc3694275e7015f7bd0901bde54aae54fec7a8c68d4f8529c65ef4bc"
GOLDEN_SENTINEL_PLAN = "370c53f1d088a4120c63fbaea6d895f121c683b8d3c8cc7d61105d6e1d223128"
GOLDEN_EMPTY_PLAN = "f5ee50f4923fed4cb943cb80087d39ffffe66f259cfae4a54f27a244d7b06453"
GOLDEN_SENTINEL_PLAN = "bb725e2d096f6aa0cf1773809b2d0e672475589782b9c72348d9eaf8481230b9"
SCREENSHOT_B64 = base64.b64encode(b"fake-jpeg-bytes").decode("utf-8")
@@ -84,6 +85,42 @@ async def test_legacy_prompt_bytes_match_chinese_prompt_golden():
assert hashlib.sha256(sentinel.encode("utf-8")).hexdigest() == GOLDEN_SENTINEL_PLAN
@pytest.mark.asyncio
@pytest.mark.parametrize("transcript", [False, True])
async def test_legacy_and_transcript_prompts_omit_all_unavailable_native_capabilities(transcript):
native_tools = {
"pinch",
"touch_gesture",
"read_control",
"control_action",
"wait_until",
"scroll_to",
}
available_tools = OPERATOR_PROMPT_TOOLSET - native_tools
ctx = SimpleNamespace(
execution_setup=None,
actuator=SimpleNamespace(capabilities=lambda: available_tools),
data_engine=None,
)
state = SimpleNamespace(initial_goal="FILTERED_FIXED_GOAL")
if transcript:
system = render_transcript_static_system(load_operator_prompts(), ctx, state)
else:
builder = PromptBuilder()
await TemplatePromptComponent()(
builder,
state,
ctx,
prompts=load_operator_prompts(),
template_name="main_template",
)
system = "".join(builder.system_parts)
assert "FILTERED_FIXED_GOAL" in system
assert "`click`" in system and "`drag`" in system
for tool in native_tools:
assert tool not in system
def test_main_template_contains_exactly_one_plan_history_section():
template = load_operator_prompts()["main_template"]
assert template.count(PLAN_HISTORY_TEMPLATE_SECTION) == 1