fix: correct task scheduling and simplify agent internals

Fix queue cancellation, concurrency limits and worker status updates.

Use direct Explorer imports, split the Diagnoser loop into helpers and remove unused tool registration and prompt-builder code.

Correct model caching, endpoint selection and retry handling.
This commit is contained in:
somew1nd committed 2026-09-02 22:58:00 -07:00
1 parent 67248c887e
commit 12d7902a82
92 files changed
+1085 -1763

No files matched your search

+28 -28
View File
@@ -106,7 +106,7 @@ async def test_explorer_run():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("pathlib.Path.exists", return_value=True),
@@ -193,7 +193,7 @@ async def test_explorer_submit_answer():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("pathlib.Path.exists", return_value=True),
@@ -339,7 +339,7 @@ async def test_explorer_submit_answer_self_correction():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("pathlib.Path.exists", return_value=True),
@@ -427,10 +427,10 @@ async def test_explorer_initial_visual_marking():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("artemis.agents.explorer.explorer.draw_dots") as mock_draw_dots,
patch("artemis.agents.explorer.run_setup.draw_dots") as mock_draw_dots,
patch("pathlib.Path.exists", return_value=True),
patch("pathlib.Path.read_text", return_value=mock_prompt),
patch("builtins.open", custom_open),
@@ -518,10 +518,10 @@ async def test_explorer_initial_visual_marking_previous_screenshot():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("artemis.agents.explorer.explorer.draw_dots") as mock_draw_dots,
patch("artemis.agents.explorer.run_setup.draw_dots") as mock_draw_dots,
patch("pathlib.Path.exists", return_value=True),
patch("pathlib.Path.read_text", return_value=mock_prompt),
patch("builtins.open", custom_open),
@@ -606,10 +606,10 @@ async def test_explorer_initial_visual_marking_previous_screenshot_no_ui_tree():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("artemis.agents.explorer.explorer.draw_dots") as mock_draw_dots,
patch("artemis.agents.explorer.run_setup.draw_dots") as mock_draw_dots,
patch("pathlib.Path.exists", return_value=True),
patch("pathlib.Path.read_text", return_value=mock_prompt),
patch("builtins.open", custom_open),
@@ -704,10 +704,10 @@ async def test_explorer_initial_visual_marking_previous_screenshot_ocr_fusion():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("artemis.agents.explorer.explorer.draw_dots") as mock_draw_dots,
patch("artemis.agents.explorer.run_setup.draw_dots") as mock_draw_dots,
patch("pathlib.Path.exists", return_value=True),
patch("pathlib.Path.read_text", return_value=mock_prompt),
patch("builtins.open", custom_open),
@@ -808,19 +808,19 @@ async def test_explorer_initial_visual_marking_previous_screenshot_on_the_fly_oc
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch(
"artemis.agents.explorer.explorer.perform_ocr",
"artemis.agents.explorer.run_setup.perform_ocr",
new_callable=AsyncMock,
return_value=mock_ocr_result,
) as mock_perform_ocr,
patch(
"artemis.agents.explorer.explorer.is_ocr_configured",
"artemis.agents.explorer.run_setup.is_ocr_configured",
return_value=True,
),
patch("artemis.agents.explorer.explorer.draw_dots") as mock_draw_dots,
patch("artemis.agents.explorer.run_setup.draw_dots") as mock_draw_dots,
patch("pathlib.Path.exists", return_value=True),
patch("pathlib.Path.read_text", return_value=mock_prompt),
patch("builtins.open", custom_open),
@@ -933,7 +933,7 @@ async def test_explorer_denylisted_tool():
return_value=mock_client,
),
patch(
"artemis.agents.explorer.explorer.StorageManager",
"artemis.agents.explorer.run_setup.StorageManager",
return_value=mock_storage,
),
patch("pathlib.Path.exists", return_value=True),
@@ -1014,7 +1014,7 @@ async def test_explorer_inspect_region():
patch("cv2.imwrite", return_value=True) as mock_imwrite,
patch("pathlib.Path.mkdir") as mock_mkdir,
patch("glob.glob", return_value=[]),
patch("artemis.agents.explorer.explorer.settings") as mock_settings,
patch("artemis.agents.explorer.perception_tools.settings") as mock_settings,
):
mock_settings.TRACES_PATH = pathlib.Path("/tmp/traces")
res = await explorer.exec_inspect_region(
@@ -1181,12 +1181,12 @@ async def test_explorer_ask_perception_tool():
mock_draw_dots = MagicMock()
with (
patch("artemis.agents.explorer.explorer.StorageManager") as storage_cls,
patch("artemis.agents.explorer.run_setup.StorageManager") as storage_cls,
patch(
"artemis.agents.explorer.explorer._run_object_detection",
"artemis.agents.explorer.perception_tools._run_object_detection",
return_value=mock_detector_res,
),
patch("artemis.agents.explorer.explorer.draw_dots", mock_draw_dots),
patch("artemis.agents.explorer.perception_tools.draw_dots", mock_draw_dots),
patch("artemis.utils.visualization.draw_dots", mock_draw_dots),
patch("pathlib.Path.mkdir"),
patch("glob.glob", return_value=[]),
@@ -1277,7 +1277,7 @@ class _FakeGenaiError(Exception):
@pytest.mark.asyncio
async def test_generate_content_reliability_permanent_error_is_not_retried():
from artemis.agents.explorer.explorer import _generate_content_with_reliability
from artemis.agents.explorer.native_runner import _generate_content_with_reliability
from artemis.llm.reliability import LLMPermanentError
calls = 0
@@ -1296,7 +1296,7 @@ async def test_generate_content_reliability_permanent_error_is_not_retried():
@pytest.mark.asyncio
async def test_generate_content_reliability_bad_request_is_not_retried():
from artemis.agents.explorer.explorer import _generate_content_with_reliability
from artemis.agents.explorer.native_runner import _generate_content_with_reliability
from artemis.llm.reliability import LLMPermanentError
calls = 0
@@ -1314,7 +1314,7 @@ async def test_generate_content_reliability_bad_request_is_not_retried():
@pytest.mark.asyncio
async def test_generate_content_reliability_retries_transient_then_succeeds():
from artemis.agents.explorer import explorer as explorer_module
from artemis.agents.explorer import native_runner as native_runner_module
calls = 0
sentinel = object()
@@ -1326,8 +1326,8 @@ async def test_generate_content_reliability_retries_transient_then_succeeds():
raise _FakeGenaiError("429 rate limit exceeded", code=429)
return sentinel
with patch.object(explorer_module.asyncio, "sleep", new=AsyncMock()) as sleep_mock:
result = await explorer_module._generate_content_with_reliability(op)
with patch.object(native_runner_module.asyncio, "sleep", new=AsyncMock()) as sleep_mock:
result = await native_runner_module._generate_content_with_reliability(op)
assert result is sentinel
assert calls == 2
assert sleep_mock.await_count == 1
@@ -1335,7 +1335,7 @@ async def test_generate_content_reliability_retries_transient_then_succeeds():
@pytest.mark.asyncio
async def test_generate_content_reliability_exhausts_to_typed_error():
from artemis.agents.explorer import explorer as explorer_module
from artemis.agents.explorer import native_runner as native_runner_module
from artemis.llm.reliability import (
FailureCategory,
LLMExhaustedError,
@@ -1349,9 +1349,9 @@ async def test_generate_content_reliability_exhausts_to_typed_error():
calls += 1
raise _FakeGenaiError("503 service unavailable", code=503)
with patch.object(explorer_module.asyncio, "sleep", new=AsyncMock()):
with patch.object(native_runner_module.asyncio, "sleep", new=AsyncMock()):
with pytest.raises(LLMExhaustedError) as exc_info:
await explorer_module._generate_content_with_reliability(op)
await native_runner_module._generate_content_with_reliability(op)
assert calls == retry_policy_for(FailureCategory.PROVIDER_UNAVAILABLE).max_attempts
assert exc_info.value.failure.category.value == "provider_unavailable"
assert isinstance(exc_info.value.__cause__, _FakeGenaiError)
@@ -37,7 +37,7 @@ def _perception_host() -> PerceptionToolsMixin:
async def test_get_ocr_list_reads_the_screen_index_without_storage() -> None:
host = _perception_host()
with patch("artemis.agents.explorer.explorer.StorageManager") as storage_cls:
with patch("artemis.agents.explorer.run_setup.StorageManager") as storage_cls:
result = await host.exec_get_ocr_list()
assert result == {
+16 -13
View File
@@ -25,7 +25,8 @@ from artemis.agents.explorer.screen_index import ScreenElement, ScreenIndex
from artemis.context import ArtemisContext
from artemis.graph.state import State
FACADE = "artemis.agents.explorer.explorer"
RUN_SETUP = "artemis.agents.explorer.run_setup"
PERCEPTION_TOOLS = "artemis.agents.explorer.perception_tools"
W, H = 1080, 2400
#: One "Settings" button, two "Send" buttons and two OCR-only texts.
@@ -108,8 +109,10 @@ def screenshot(tmp_path):
@pytest.fixture
def no_drawing():
"""Keeps the annotation helpers away from the file system."""
draw_dots = MagicMock()
with (
patch(f"{FACADE}.draw_dots") as draw_dots,
patch(f"{RUN_SETUP}.draw_dots", draw_dots),
patch(f"{PERCEPTION_TOOLS}.draw_dots", draw_dots),
patch("pathlib.Path.mkdir"),
patch("glob.glob", return_value=[]),
):
@@ -127,8 +130,8 @@ async def test_index_is_built_from_state_hierarchy_when_record_is_missing(screen
explorer._run_flash = AsyncMock(return_value=_outcome(fallback="nothing"))
with (
patch(f"{FACADE}.StorageManager", return_value=_storage(None)),
patch(f"{FACADE}.perform_ocr", new_callable=AsyncMock) as perform_ocr,
patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(None)),
patch(f"{RUN_SETUP}.perform_ocr", new_callable=AsyncMock) as perform_ocr,
):
await explorer.run("gear icon", "", screenshot, _state(screenshot), version="flash")
text = (await explorer._search_ui_helper("Settings", prefix="X"))["text"]
@@ -145,7 +148,7 @@ async def test_index_ignores_state_hierarchy_for_another_screenshot(screenshot):
explorer._run_flash = AsyncMock(return_value=_outcome())
state = _state("/tmp/other.jpg")
with patch(f"{FACADE}.StorageManager", return_value=_storage(None)):
with patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(None)):
await explorer.run("Settings", "", screenshot, state, version="flash")
assert len(explorer.screen_index) == 0
@@ -224,7 +227,7 @@ async def test_search_by_coords_helper_reports_innermost_first(no_drawing):
async def test_get_ocr_list_reads_the_index(no_drawing):
explorer = _indexed_explorer()
with patch(f"{FACADE}.StorageManager") as storage_cls:
with patch(f"{RUN_SETUP}.StorageManager") as storage_cls:
result = await explorer.exec_get_ocr_list()
storage_cls.assert_not_called()
@@ -369,7 +372,7 @@ async def test_prepass_answers_unique_exact_match_without_the_engine(screenshot,
explorer._run_flash = AsyncMock()
explorer._run_loop = AsyncMock()
with patch(f"{FACADE}.StorageManager", return_value=_storage(None)):
with patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(None)):
raw = await explorer.run(" settings ", "", screenshot, _state(screenshot), version=version)
explorer._run_flash.assert_not_called()
@@ -395,7 +398,7 @@ async def test_prepass_leaves_ambiguous_matches_to_the_engine(screenshot):
engine = _outcome([{"label": "D1", "coords": [185, 854], "description": "Send"}])
explorer._run_flash = AsyncMock(return_value=engine)
with patch(f"{FACADE}.StorageManager", return_value=_storage(None)):
with patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(None)):
raw = await explorer.run("Send", "", screenshot, _state(screenshot), version="flash")
explorer._run_flash.assert_awaited_once_with("Send", screenshot)
@@ -408,7 +411,7 @@ async def test_prepass_without_pipe_or_match_passes_the_query_through(screenshot
engine = _outcome(fallback="Failed to detect: gear icon")
explorer._run_flash = AsyncMock(return_value=engine)
with patch(f"{FACADE}.StorageManager", return_value=_storage(None)):
with patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(None)):
raw = await explorer.run("gear icon", "", screenshot, _state(screenshot), version="flash")
explorer._run_flash.assert_awaited_once_with("gear icon", screenshot)
@@ -421,7 +424,7 @@ async def test_prepass_merges_partial_results_with_the_engine_outcome(screenshot
detected = {"label": "D1", "coords": [185, 854], "description": "Send"}
explorer._run_loop = AsyncMock(return_value=_outcome([detected], fallback="two Send buttons"))
with patch(f"{FACADE}.StorageManager", return_value=_storage(None)):
with patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(None)):
raw = await explorer.run(
"Settings | Send | Welcome", "", screenshot, _state(screenshot), version="pro"
)
@@ -451,9 +454,9 @@ async def test_prepass_never_runs_on_the_fly_ocr_for_flash(screenshot):
explorer._run_loop = AsyncMock(return_value=_outcome())
with (
patch(f"{FACADE}.StorageManager", return_value=_storage(record)),
patch(f"{FACADE}.is_ocr_configured", return_value=True),
patch(f"{FACADE}.perform_ocr", new_callable=AsyncMock, return_value=[]) as perform_ocr,
patch(f"{RUN_SETUP}.StorageManager", return_value=_storage(record)),
patch(f"{RUN_SETUP}.is_ocr_configured", return_value=True),
patch(f"{RUN_SETUP}.perform_ocr", new_callable=AsyncMock, return_value=[]) as perform_ocr,
):
await explorer.run("gear icon", "", screenshot, _state(screenshot, []), version="flash")
perform_ocr.assert_not_awaited()
+21 -19
View File
@@ -28,7 +28,9 @@ from artemis.config import settings
from artemis.context import ArtemisContext
from artemis.graph.state import State
FACADE = "artemis.agents.explorer.explorer"
EXPLORER = "artemis.agents.explorer.explorer"
RUN_SETUP = "artemis.agents.explorer.run_setup"
UNIVERSAL_RUNNER = "artemis.agents.explorer.universal_runner"
def _context(model: str = "gemini-3.8-flash", denylist: list[str] | None = None) -> MagicMock:
@@ -108,7 +110,7 @@ def _isolated_env(monkeypatch):
def test_construction_creates_no_genai_client():
with patch(f"{FACADE}.genai.Client") as client_cls:
with patch(f"{EXPLORER}.genai.Client") as client_cls:
explorer = Explorer(_context())
client_cls.assert_not_called()
assert explorer.client is None
@@ -124,7 +126,7 @@ def test_construction_creates_no_genai_client():
)
def test_tier_sets_turn_budget_and_exposed_tools(version, max_turns, expected_tools):
explorer = Explorer(_context())
with patch(f"{FACADE}.is_ocr_configured", return_value=True):
with patch(f"{EXPLORER}.is_ocr_configured", return_value=True):
explorer._apply_tier(get_tier(version))
native_names = {t.name for t in explorer.get_exposed_tools()}
universal_names = {t["function"]["name"] for t in explorer._universal_exposed_tools()}
@@ -137,7 +139,7 @@ def test_tier_sets_turn_budget_and_exposed_tools(version, max_turns, expected_to
def test_unconfigured_ocr_and_user_denylist_hide_tools_on_ultra():
explorer = Explorer(_context(denylist=["inspect_region"]))
with patch(f"{FACADE}.is_ocr_configured", return_value=False):
with patch(f"{EXPLORER}.is_ocr_configured", return_value=False):
explorer._apply_tier(get_tier("ultra"))
names = {t.name for t in explorer.get_exposed_tools()}
assert "get_ocr_list" not in names
@@ -190,9 +192,9 @@ async def test_universal_run_without_google_key_never_touches_genai(screenshot):
with (
patch.object(settings, "GOOGLE_API_KEY", None),
patch(f"{FACADE}.genai.Client") as client_cls,
patch(f"{FACADE}.get_llm", return_value=llm),
patch(f"{FACADE}.StorageManager", return_value=storage),
patch(f"{EXPLORER}.genai.Client") as client_cls,
patch(f"{UNIVERSAL_RUNNER}.get_llm", return_value=llm),
patch(f"{RUN_SETUP}.StorageManager", return_value=storage),
):
explorer = Explorer(ctx)
raw = await explorer.run("find it", "", screenshot, _state(screenshot), version="pro")
@@ -342,7 +344,7 @@ def test_pro_prompt_only_describes_exposed_tools():
def test_ultra_prompt_describes_all_tools():
explorer = Explorer(_context())
with patch(f"{FACADE}.is_ocr_configured", return_value=True):
with patch(f"{EXPLORER}.is_ocr_configured", return_value=True):
explorer._apply_tier(get_tier("ultra"))
prompt, error = explorer._build_prompt_template(get_tier("ultra"))
assert error is None
@@ -355,7 +357,7 @@ def test_ultra_prompt_describes_all_tools():
def test_prompt_denylist_section_only_for_user_denied_tier_tools():
explorer = Explorer(_context(denylist=["inspect_region", "search_xml_ocr"]))
with patch(f"{FACADE}.is_ocr_configured", return_value=True):
with patch(f"{EXPLORER}.is_ocr_configured", return_value=True):
explorer._apply_tier(get_tier("ultra"))
ultra_prompt, _ = explorer._build_prompt_template(get_tier("ultra"))
explorer._apply_tier(get_tier("pro"))
@@ -399,8 +401,8 @@ async def test_flash_run_returns_detected_candidates(screenshot):
}
)
with (
patch(f"{FACADE}._run_object_detection", detection),
patch(f"{FACADE}.genai.Client") as client_cls,
patch(f"{RUN_SETUP}._run_object_detection", detection),
patch(f"{EXPLORER}.genai.Client") as client_cls,
):
explorer = Explorer(_context())
raw = await explorer.run(
@@ -421,7 +423,7 @@ async def test_flash_run_returns_detected_candidates(screenshot):
@pytest.mark.asyncio
async def test_flash_run_reports_missing_detection(screenshot):
with patch(f"{FACADE}._run_object_detection", AsyncMock(return_value={"detected": []})):
with patch(f"{RUN_SETUP}._run_object_detection", AsyncMock(return_value={"detected": []})):
raw = await Explorer(_context()).run(
"ghost", "", screenshot, _state(screenshot), version="flash"
)
@@ -442,8 +444,8 @@ async def test_native_ultra_run_uses_async_cache_api(screenshot):
storage.get_image.return_value = None
with (
patch(f"{FACADE}.genai.Client") as client_cls,
patch(f"{FACADE}.StorageManager", return_value=storage),
patch(f"{EXPLORER}.genai.Client") as client_cls,
patch(f"{RUN_SETUP}.StorageManager", return_value=storage),
patch.object(settings, "EXPLORER_CACHING", None),
):
explorer = Explorer(ctx)
@@ -466,7 +468,7 @@ async def test_native_pro_run_skips_cache_by_default(screenshot):
storage.get_image.return_value = None
with (
patch(f"{FACADE}.StorageManager", return_value=storage),
patch(f"{RUN_SETUP}.StorageManager", return_value=storage),
patch.object(settings, "EXPLORER_CACHING", None),
):
await Explorer(ctx).run("target", "", screenshot, _state(screenshot), version="pro")
@@ -489,7 +491,7 @@ async def test_native_file_api_uploads_and_deletes_asynchronously(screenshot, mo
storage = MagicMock()
storage.get_image.return_value = None
with patch(f"{FACADE}.StorageManager", return_value=storage):
with patch(f"{RUN_SETUP}.StorageManager", return_value=storage):
await Explorer(ctx).run("target", "", screenshot, _state(screenshot), version="pro")
client.aio.files.upload.assert_awaited_once_with(file=screenshot)
@@ -507,7 +509,7 @@ async def test_run_closes_http_client_on_both_engines(screenshot):
ctx._genai_client = client
native = Explorer(ctx)
native.http_client = SimpleNamespace(aclose=AsyncMock())
with patch(f"{FACADE}.StorageManager", return_value=storage):
with patch(f"{RUN_SETUP}.StorageManager", return_value=storage):
await native.run("t", "", screenshot, _state(screenshot), version="pro")
native_close = native.http_client # already reset
assert native_close is None
@@ -519,8 +521,8 @@ async def test_run_closes_http_client_on_both_engines(screenshot):
http_client = SimpleNamespace(aclose=AsyncMock())
universal.http_client = http_client
with (
patch(f"{FACADE}.StorageManager", return_value=storage),
patch(f"{FACADE}.get_llm", return_value=llm),
patch(f"{RUN_SETUP}.StorageManager", return_value=storage),
patch(f"{UNIVERSAL_RUNNER}.get_llm", return_value=llm),
pytest.raises(RuntimeError),
):
await universal.run("t", "", screenshot, _state(screenshot), version="pro")
+3 -5
View File
@@ -20,10 +20,8 @@ from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from langchain_core.messages import AIMessage
from artemis.agents.explorer.explorer import (
UNIVERSAL_EXPLORER_TOOLS,
Explorer,
)
from artemis.agents.explorer.explorer import Explorer
from artemis.agents.explorer.tool_declarations import UNIVERSAL_EXPLORER_TOOLS
from artemis.config import settings
from artemis.context import ArtemisContext
from artemis.graph.state import State
@@ -106,7 +104,7 @@ async def test_run_universal_explorer_success(mock_context, tmp_path):
mock_llm.bind_tools.return_value = mock_bound
with patch(
"artemis.agents.explorer.explorer.get_llm",
"artemis.agents.explorer.universal_runner.get_llm",
return_value=mock_llm,
):
mock_state = Mock(spec=State)
+3 -5
View File
@@ -12,11 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from artemis.agents.operator.prompt_builder import (
OperatorPromptBuilder,
from artemis.agents.operator.prompts import (
apply_operator_prompt_contract,
load_operator_prompts,
)
from artemis.agents.operator.prompts import apply_operator_prompt_contract
def test_operator_prompt_contract_matches_note_runtime_semantics():
@@ -68,9 +67,8 @@ def test_operator_prompt_keeps_large_list_traversal_single_pass_until_boundary()
assert "Terminate exploration when a definitive boundary is reached" not in prompt
def test_compatibility_builder_uses_canonical_operator_template():
def test_contract_strips_legacy_tool_literals():
expected = apply_operator_prompt_contract(load_operator_prompts()["main_template"])
assert OperatorPromptBuilder.build_system_message() == expected
assert "wait_for_delay(seconds=" not in expected
assert 'press_key(key="home"' not in expected
@@ -33,7 +33,7 @@ import pytest
from langchain_core.messages import HumanMessage, SystemMessage
from artemis.agents.operator.operator import OperatorNode
from artemis.agents.operator.prompt_builder import load_operator_prompts
from artemis.agents.operator.prompts import load_operator_prompts
from artemis.agents.operator.prompts import (
PLAN_HISTORY_STATIC_POINTER,
PLAN_HISTORY_TEMPLATE_SECTION,
+1 -1
View File
@@ -20,7 +20,7 @@ import re
from jinja2 import Template
import pytest
from artemis.agents.operator.prompt_builder import load_operator_prompts
from artemis.agents.operator.prompts import load_operator_prompts
from artemis.agents.operator.prompts import (
OPERATOR_PROMPT_TOOLSET,
apply_operator_prompt_contract,