android-midscene-automation 0.2.4 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +159 -29
- package/artemis-main/.dockerignore +15 -0
- package/artemis-main/.env.example +34 -0
- package/artemis-main/CONTRIBUTING.md +35 -0
- package/artemis-main/Dockerfile +68 -0
- package/artemis-main/LICENSE +202 -0
- package/artemis-main/Makefile +115 -0
- package/artemis-main/README.md +322 -0
- package/artemis-main/README_CN.md +320 -0
- package/artemis-main/apps/__init__.py +15 -0
- package/artemis-main/apps/admin_console/__init__.py +19 -0
- package/artemis-main/apps/admin_console/core/__init__.py +13 -0
- package/artemis-main/apps/admin_console/core/config.py +43 -0
- package/artemis-main/apps/admin_console/core/security.py +178 -0
- package/artemis-main/apps/admin_console/core/state.py +243 -0
- package/artemis-main/apps/admin_console/database/__init__.py +13 -0
- package/artemis-main/apps/admin_console/database/connection.py +60 -0
- package/artemis-main/apps/admin_console/database/repositories/__init__.py +13 -0
- package/artemis-main/apps/admin_console/database/repositories/session_repository.py +564 -0
- package/artemis-main/apps/admin_console/database/repositories/step_repository.py +512 -0
- package/artemis-main/apps/admin_console/database/repositories/trace_repository.py +133 -0
- package/artemis-main/apps/admin_console/index.html +3787 -0
- package/artemis-main/apps/admin_console/replay_manager.py +2585 -0
- package/artemis-main/apps/admin_console/routers/__init__.py +13 -0
- package/artemis-main/apps/admin_console/routers/media.py +198 -0
- package/artemis-main/apps/admin_console/routers/replay.py +91 -0
- package/artemis-main/apps/admin_console/routers/sessions.py +239 -0
- package/artemis-main/apps/admin_console/routers/steps.py +109 -0
- package/artemis-main/apps/admin_console/routers/stream.py +56 -0
- package/artemis-main/apps/admin_console/routers/system.py +761 -0
- package/artemis-main/apps/admin_console/routers/tasks.py +517 -0
- package/artemis-main/apps/admin_console/schemas/__init__.py +13 -0
- package/artemis-main/apps/admin_console/schemas/task_schema.py +47 -0
- package/artemis-main/apps/admin_console/server.py +508 -0
- package/artemis-main/apps/admin_console/services/__init__.py +13 -0
- package/artemis-main/apps/admin_console/services/device_stream_service.py +137 -0
- package/artemis-main/apps/admin_console/services/ipc_service.py +262 -0
- package/artemis-main/apps/admin_console/services/media_service.py +623 -0
- package/artemis-main/apps/admin_console/services/model_service.py +148 -0
- package/artemis-main/apps/admin_console/services/task_preset_catalog.py +514 -0
- package/artemis-main/apps/admin_console/services/task_queue_service.py +1719 -0
- package/artemis-main/apps/admin_console/services/worker_process_io.py +144 -0
- package/artemis-main/apps/showcase_ui/README.md +31 -0
- package/artemis-main/apps/showcase_ui/angular.json +132 -0
- package/artemis-main/apps/showcase_ui/package-lock.json +9472 -0
- package/artemis-main/apps/showcase_ui/package.json +39 -0
- package/artemis-main/apps/showcase_ui/proxy.conf.json +23 -0
- package/artemis-main/apps/showcase_ui/public/favicon.ico +0 -0
- package/artemis-main/apps/showcase_ui/public/logo.png +0 -0
- package/artemis-main/apps/showcase_ui/public/logo.svg +56 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.html +24 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.scss +49 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.spec.ts +42 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.ts +32 -0
- package/artemis-main/apps/showcase_ui/src/app/app.config.ts +29 -0
- package/artemis-main/apps/showcase_ui/src/app/app.routes.ts +27 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream-startup.spec.ts +108 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.html +1436 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.scss +3973 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.ts +2235 -0
- package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.html +380 -0
- package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.scss +1171 -0
- package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.ts +270 -0
- package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.html +433 -0
- package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.scss +987 -0
- package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.ts +632 -0
- package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.html +130 -0
- package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.scss +406 -0
- package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.ts +74 -0
- package/artemis-main/apps/showcase_ui/src/app/components/nav-switcher/nav-switcher.component.scss +115 -0
- package/artemis-main/apps/showcase_ui/src/app/components/nav-switcher/nav-switcher.component.ts +52 -0
- package/artemis-main/apps/showcase_ui/src/app/core/data/smart-tasks.data.ts +334 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/language.service.spec.ts +55 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/language.service.ts +61 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/translate.pipe.ts +11 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/zh-cn.ts +651 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/markdown.model.ts +43 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/pro-tuning.model.spec.ts +47 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/pro-tuning.model.ts +165 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/session.model.ts +85 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/stream.model.ts +246 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/system.model.ts +118 -0
- package/artemis-main/apps/showcase_ui/src/app/core/services/task-recommendation.service.ts +111 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.html +2130 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.scss +5204 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.ts +1189 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.html +39 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.scss +151 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.ts +58 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.html +201 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.scss +886 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.ts +324 -0
- package/artemis-main/apps/showcase_ui/src/app/services/agent.service.spec.ts +418 -0
- package/artemis-main/apps/showcase_ui/src/app/services/agent.service.ts +2012 -0
- package/artemis-main/apps/showcase_ui/src/app/services/system.service.spec.ts +173 -0
- package/artemis-main/apps/showcase_ui/src/app/services/system.service.ts +620 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/action-formatter.util.spec.ts +513 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/action-formatter.util.ts +1015 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/image-overlay.util.spec.ts +85 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/image-overlay.util.ts +662 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/markdown-parser.util.spec.ts +70 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/markdown-parser.util.ts +383 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/recording-timeline.util.spec.ts +107 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/recording-timeline.util.ts +123 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/run-info.util.spec.ts +92 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/run-info.util.ts +116 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/stream-aggregator.util.spec.ts +640 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/stream-aggregator.util.ts +1021 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/tool-formatter.util.spec.ts +375 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/tool-formatter.util.ts +1419 -0
- package/artemis-main/apps/showcase_ui/src/index.html +37 -0
- package/artemis-main/apps/showcase_ui/src/main.ts +22 -0
- package/artemis-main/apps/showcase_ui/src/styles.scss +60 -0
- package/artemis-main/apps/showcase_ui/tsconfig.app.json +23 -0
- package/artemis-main/apps/showcase_ui/tsconfig.json +27 -0
- package/artemis-main/apps/showcase_ui/tsconfig.spec.json +23 -0
- package/artemis-main/artemis/__init__.py +44 -0
- package/artemis-main/artemis/__main__.py +18 -0
- package/artemis-main/artemis/_legacy_imports.py +94 -0
- package/artemis-main/artemis/_version.py +30 -0
- package/artemis-main/artemis/agents/__init__.py +17 -0
- package/artemis-main/artemis/agents/checker/checker.json +9 -0
- package/artemis-main/artemis/agents/checker/checker.py +859 -0
- package/artemis-main/artemis/agents/diagnoser/diagnoser.json +23 -0
- package/artemis-main/artemis/agents/diagnoser/diagnoser.py +608 -0
- package/artemis-main/artemis/agents/explorer/constants.py +52 -0
- package/artemis-main/artemis/agents/explorer/explorer.json +57 -0
- package/artemis-main/artemis/agents/explorer/explorer.py +473 -0
- package/artemis-main/artemis/agents/explorer/geometry.py +73 -0
- package/artemis-main/artemis/agents/explorer/native_runner.py +878 -0
- package/artemis-main/artemis/agents/explorer/perception_tools.py +632 -0
- package/artemis-main/artemis/agents/explorer/run_setup.py +403 -0
- package/artemis-main/artemis/agents/explorer/screen_index.py +266 -0
- package/artemis-main/artemis/agents/explorer/tiers.py +110 -0
- package/artemis-main/artemis/agents/explorer/tool_declarations.py +394 -0
- package/artemis-main/artemis/agents/explorer/universal_runner.py +317 -0
- package/artemis-main/artemis/agents/flash/context_compressor.py +452 -0
- package/artemis-main/artemis/agents/flash/flash_runner.md +51 -0
- package/artemis-main/artemis/agents/flash/flash_summarizer.md +53 -0
- package/artemis-main/artemis/agents/flash/flash_summarizer_single.md +54 -0
- package/artemis-main/artemis/agents/flash/runner.py +1167 -0
- package/artemis-main/artemis/agents/flash/summarizer.py +511 -0
- package/artemis-main/artemis/agents/history_analyzer/history_analyzer.md +8 -0
- package/artemis-main/artemis/agents/history_analyzer/history_analyzer.py +182 -0
- package/artemis-main/artemis/agents/image_processor/image_processor.md +74 -0
- package/artemis-main/artemis/agents/image_processor/image_processor.py +322 -0
- package/artemis-main/artemis/agents/log_analyzer/log_analyzer.md +15 -0
- package/artemis-main/artemis/agents/log_analyzer/log_analyzer.py +403 -0
- package/artemis-main/artemis/agents/log_analyzer/log_reader_sub_agent.md +8 -0
- package/artemis-main/artemis/agents/log_analyzer/output_analyzer.md +11 -0
- package/artemis-main/artemis/agents/log_analyzer/output_analyzer.py +163 -0
- package/artemis-main/artemis/agents/object_detector/object_detector.json +9 -0
- package/artemis-main/artemis/agents/object_detector/object_detector.py +211 -0
- package/artemis-main/artemis/agents/operator/operator.json +3 -0
- package/artemis-main/artemis/agents/operator/operator.py +1394 -0
- package/artemis-main/artemis/agents/operator/prompts.py +1064 -0
- package/artemis-main/artemis/agents/outputter/outputter.md +36 -0
- package/artemis-main/artemis/agents/outputter/outputter.py +552 -0
- package/artemis-main/artemis/agents/planner/planner.json +32 -0
- package/artemis-main/artemis/agents/planner/planner.py +436 -0
- package/artemis-main/artemis/agents/prompt_assembly.py +79 -0
- package/artemis-main/artemis/agents/summarizer/summarizer.py +190 -0
- package/artemis-main/artemis/agents/validator/action_execution.py +98 -0
- package/artemis-main/artemis/agents/validator/categories.py +33 -0
- package/artemis-main/artemis/agents/validator/execution_loop.py +488 -0
- package/artemis-main/artemis/agents/validator/incidents.py +120 -0
- package/artemis-main/artemis/agents/validator/pixel_safety_net.md +15 -0
- package/artemis-main/artemis/agents/validator/precondition_pixel.py +320 -0
- package/artemis-main/artemis/agents/validator/precondition_xml.py +672 -0
- package/artemis-main/artemis/agents/validator/tool_declarations.py +332 -0
- package/artemis-main/artemis/agents/validator/validator.py +188 -0
- package/artemis-main/artemis/agents/video_analyzer/__init__.py +15 -0
- package/artemis-main/artemis/agents/video_analyzer/audio_native.py +543 -0
- package/artemis-main/artemis/agents/video_analyzer/blackboard.py +821 -0
- package/artemis-main/artemis/agents/video_analyzer/chunk_agentic.py +455 -0
- package/artemis-main/artemis/agents/video_analyzer/chunk_conversation.py +491 -0
- package/artemis-main/artemis/agents/video_analyzer/chunk_native.py +437 -0
- package/artemis-main/artemis/agents/video_analyzer/conflict_resolution.py +137 -0
- package/artemis-main/artemis/agents/video_analyzer/gemini_files.py +162 -0
- package/artemis-main/artemis/agents/video_analyzer/native_coordinator.py +541 -0
- package/artemis-main/artemis/agents/video_analyzer/reliability.py +128 -0
- package/artemis-main/artemis/agents/video_analyzer/universal_engine.py +487 -0
- package/artemis-main/artemis/agents/video_analyzer/universal_tools.py +323 -0
- package/artemis-main/artemis/agents/video_analyzer/video_analyzer.md +51 -0
- package/artemis-main/artemis/agents/video_analyzer/video_analyzer.py +875 -0
- package/artemis-main/artemis/agents/video_analyzer/video_sub_agent.md +15 -0
- package/artemis-main/artemis/agents/video_analyzer/video_sub_agent_audio.md +12 -0
- package/artemis-main/artemis/clients/accessibility_client.py +438 -0
- package/artemis-main/artemis/clients/screen_client_factory.py +403 -0
- package/artemis-main/artemis/config/__init__.py +309 -0
- package/artemis-main/artemis/config/agent.py +1098 -0
- package/artemis-main/artemis/config/constants.py +151 -0
- package/artemis-main/artemis/config/core/__init__.py +24 -0
- package/artemis-main/artemis/config/core/engine.py +118 -0
- package/artemis-main/artemis/config/core/interpolator.py +78 -0
- package/artemis-main/artemis/config/llm.py +267 -0
- package/artemis-main/artemis/config/paths.py +244 -0
- package/artemis-main/artemis/config/runtime.py +197 -0
- package/artemis-main/artemis/config/settings.py +315 -0
- package/artemis-main/artemis/constants.py +47 -0
- package/artemis-main/artemis/context.py +289 -0
- package/artemis-main/artemis/controllers/__init__.py +41 -0
- package/artemis-main/artemis/controllers/controller_factory.py +41 -0
- package/artemis-main/artemis/controllers/device_controller.py +29 -0
- package/artemis-main/artemis/controllers/types.py +37 -0
- package/artemis-main/artemis/controllers/unified_controller.py +649 -0
- package/artemis-main/artemis/core/__init__.py +21 -0
- package/artemis-main/artemis/core/diagnostics/__init__.py +90 -0
- package/artemis-main/artemis/core/diagnostics/adb_keys.py +270 -0
- package/artemis-main/artemis/core/diagnostics/adb_server_connection.py +330 -0
- package/artemis-main/artemis/core/diagnostics/device_smoke.py +364 -0
- package/artemis-main/artemis/core/diagnostics/emulator_manager.py +501 -0
- package/artemis-main/artemis/core/diagnostics/engine.py +438 -0
- package/artemis-main/artemis/core/diagnostics/hierarchy_parity.py +216 -0
- package/artemis-main/artemis/core/diagnostics/probes/adb_probe.py +887 -0
- package/artemis-main/artemis/core/diagnostics/probes/base.py +45 -0
- package/artemis-main/artemis/core/diagnostics/probes/credentials_probe.py +296 -0
- package/artemis-main/artemis/core/diagnostics/probes/host_probe.py +427 -0
- package/artemis-main/artemis/core/diagnostics/probes/runtime_probe.py +169 -0
- package/artemis-main/artemis/core/diagnostics/probes/toolchain_probe.py +139 -0
- package/artemis-main/artemis/core/diagnostics/readiness.py +83 -0
- package/artemis-main/artemis/core/diagnostics/schema.py +118 -0
- package/artemis-main/artemis/core/tool_declaration.py +43 -0
- package/artemis-main/artemis/core/tool_failure.py +56 -0
- package/artemis-main/artemis/data_engine/context_vars.py +24 -0
- package/artemis-main/artemis/data_engine/engine.py +1615 -0
- package/artemis-main/artemis/data_engine/history_reader.py +142 -0
- package/artemis-main/artemis/data_engine/models.py +131 -0
- package/artemis-main/artemis/data_engine/storage.py +1245 -0
- package/artemis-main/artemis/data_engine/trace.py +727 -0
- package/artemis-main/artemis/drivers/__init__.py +48 -0
- package/artemis-main/artemis/drivers/android/adb_driver.py +507 -0
- package/artemis-main/artemis/drivers/android/hierarchy.py +64 -0
- package/artemis-main/artemis/drivers/android/input_ime.py +120 -0
- package/artemis-main/artemis/drivers/android/recorder.py +57 -0
- package/artemis-main/artemis/drivers/base.py +290 -0
- package/artemis-main/artemis/drivers/cloud/cloud_driver.py +117 -0
- package/artemis-main/artemis/drivers/factory.py +80 -0
- package/artemis-main/artemis/drivers/mock/mock_driver.py +198 -0
- package/artemis-main/artemis/drivers/types.py +67 -0
- package/artemis-main/artemis/graph/checkpoints.py +1243 -0
- package/artemis-main/artemis/graph/graph.py +1055 -0
- package/artemis-main/artemis/graph/perception.py +234 -0
- package/artemis-main/artemis/graph/state.py +151 -0
- package/artemis-main/artemis/graph/visibility.py +238 -0
- package/artemis-main/artemis/interfaces/cli/__init__.py +19 -0
- package/artemis-main/artemis/interfaces/cli/commands/__init__.py +15 -0
- package/artemis-main/artemis/interfaces/cli/commands/batch.py +278 -0
- package/artemis-main/artemis/interfaces/cli/commands/doctor.py +468 -0
- package/artemis-main/artemis/interfaces/cli/commands/helper.py +226 -0
- package/artemis-main/artemis/interfaces/cli/commands/init.py +193 -0
- package/artemis-main/artemis/interfaces/cli/commands/mcp.py +862 -0
- package/artemis-main/artemis/interfaces/cli/commands/run.py +463 -0
- package/artemis-main/artemis/interfaces/cli/commands/server.py +151 -0
- package/artemis-main/artemis/interfaces/cli/commands/server_lifecycle.py +328 -0
- package/artemis-main/artemis/interfaces/cli/commands/trace.py +111 -0
- package/artemis-main/artemis/interfaces/cli/commands/ui.py +404 -0
- package/artemis-main/artemis/interfaces/cli/main.py +109 -0
- package/artemis-main/artemis/interfaces/sdk/__init__.py +31 -0
- package/artemis-main/artemis/interfaces/sdk/client.py +19 -0
- package/artemis-main/artemis/interfaces/sdk/task.py +72 -0
- package/artemis-main/artemis/llm/__init__.py +25 -0
- package/artemis-main/artemis/llm/fake_model.py +179 -0
- package/artemis-main/artemis/llm/google/__init__.py +57 -0
- package/artemis-main/artemis/llm/google/provider.py +185 -0
- package/artemis-main/artemis/llm/google/usage.py +148 -0
- package/artemis-main/artemis/llm/parser.py +32 -0
- package/artemis-main/artemis/llm/reliability.py +267 -0
- package/artemis-main/artemis/llm/router.py +389 -0
- package/artemis-main/artemis/llm/schemas.py +36 -0
- package/artemis-main/artemis/llm/structured.py +196 -0
- package/artemis-main/artemis/main.py +58 -0
- package/artemis-main/artemis/mcp/__init__.py +20 -0
- package/artemis-main/artemis/mcp/action_executor.py +760 -0
- package/artemis-main/artemis/mcp/action_manifest.py +320 -0
- package/artemis-main/artemis/mcp/action_names.py +172 -0
- package/artemis-main/artemis/mcp/action_server.py +202 -0
- package/artemis-main/artemis/mcp/action_session.py +245 -0
- package/artemis-main/artemis/mcp/action_specs.py +868 -0
- package/artemis-main/artemis/mcp/action_types.py +86 -0
- package/artemis-main/artemis/mcp/actuators/__init__.py +21 -0
- package/artemis-main/artemis/mcp/actuators/adb.py +414 -0
- package/artemis-main/artemis/mcp/actuators/base.py +113 -0
- package/artemis-main/artemis/mcp/actuators/mock.py +70 -0
- package/artemis-main/artemis/mcp/adb_server.py +490 -0
- package/artemis-main/artemis/mcp/observation.py +133 -0
- package/artemis-main/artemis/mcp/xml_search_server.py +297 -0
- package/artemis-main/artemis/memory/__init__.py +90 -0
- package/artemis-main/artemis/memory/chunking.py +1843 -0
- package/artemis-main/artemis/memory/context_policy.py +226 -0
- package/artemis-main/artemis/memory/step_capsule.md +73 -0
- package/artemis-main/artemis/memory/step_memory.py +281 -0
- package/artemis-main/artemis/memory/transcript.py +798 -0
- package/artemis-main/artemis/platform/__init__.py +61 -0
- package/artemis-main/artemis/platform/base.py +104 -0
- package/artemis-main/artemis/platform/darwin.py +184 -0
- package/artemis-main/artemis/platform/linux.py +207 -0
- package/artemis-main/artemis/platform/windows.py +193 -0
- package/artemis-main/artemis/resources/__init__.py +46 -0
- package/artemis-main/artemis/runtime/__init__.py +108 -0
- package/artemis-main/artemis/runtime/adb_endpoint.py +173 -0
- package/artemis-main/artemis/runtime/awake_lease.py +283 -0
- package/artemis-main/artemis/runtime/awake_service.py +343 -0
- package/artemis-main/artemis/runtime/cancel_requests.py +254 -0
- package/artemis-main/artemis/runtime/daemon_client.py +422 -0
- package/artemis-main/artemis/runtime/device_lock.py +1013 -0
- package/artemis-main/artemis/runtime/device_pool.py +478 -0
- package/artemis-main/artemis/runtime/helper_manager.py +1030 -0
- package/artemis-main/artemis/runtime/process_probe.py +98 -0
- package/artemis-main/artemis/runtime/server_lifecycle.py +435 -0
- package/artemis-main/artemis/runtime/supervisor.py +121 -0
- package/artemis-main/artemis/runtime/trace_store.py +375 -0
- package/artemis-main/artemis/sdk/__init__.py +26 -0
- package/artemis-main/artemis/sdk/agent.py +485 -0
- package/artemis-main/artemis/sdk/builders/__init__.py +29 -0
- package/artemis-main/artemis/sdk/builders/agent_config_builder.py +474 -0
- package/artemis-main/artemis/sdk/constants.py +15 -0
- package/artemis-main/artemis/sdk/run_outcome.py +58 -0
- package/artemis-main/artemis/sdk/types/__init__.py +61 -0
- package/artemis-main/artemis/sdk/types/agent.py +89 -0
- package/artemis-main/artemis/sdk/utils.py +28 -0
- package/artemis-main/artemis/services/llm.py +1040 -0
- package/artemis-main/artemis/services/token_meter.py +267 -0
- package/artemis-main/artemis/telemetry/__init__.py +35 -0
- package/artemis-main/artemis/telemetry/models.py +64 -0
- package/artemis-main/artemis/telemetry/replay.py +34 -0
- package/artemis-main/artemis/telemetry/storage/json_storage.py +47 -0
- package/artemis-main/artemis/telemetry/tracer.py +85 -0
- package/artemis-main/artemis/toolchain/__init__.py +52 -0
- package/artemis-main/artemis/toolchain/descriptors.py +92 -0
- package/artemis-main/artemis/toolchain/resolver.py +185 -0
- package/artemis-main/artemis/tools/base.py +232 -0
- package/artemis-main/artemis/tools/command_tool.py +1240 -0
- package/artemis-main/artemis/tools/committee_prompts.json +5 -0
- package/artemis-main/artemis/tools/committee_tool.py +422 -0
- package/artemis-main/artemis/tools/diagnoser_submit_answer_tool.py +87 -0
- package/artemis-main/artemis/tools/diagnostic_tool.py +120 -0
- package/artemis-main/artemis/tools/explorer_tool.py +581 -0
- package/artemis-main/artemis/tools/history/__init__.py +398 -0
- package/artemis-main/artemis/tools/history/replay.py +120 -0
- package/artemis-main/artemis/tools/history/screenshot.py +139 -0
- package/artemis-main/artemis/tools/history/search.py +563 -0
- package/artemis-main/artemis/tools/image_processor_tool.py +124 -0
- package/artemis-main/artemis/tools/index.py +47 -0
- package/artemis-main/artemis/tools/log_tool.py +108 -0
- package/artemis-main/artemis/tools/mobile/launch_app.py +132 -0
- package/artemis-main/artemis/tools/mobile/log_utils.py +138 -0
- package/artemis-main/artemis/tools/mobile/ocr.py +202 -0
- package/artemis-main/artemis/tools/mobile/read_hierarchy.py +108 -0
- package/artemis-main/artemis/tools/mobile/read_logs.py +116 -0
- package/artemis-main/artemis/tools/mobile/search_logs.py +260 -0
- package/artemis-main/artemis/tools/object_detection_tool.py +244 -0
- package/artemis-main/artemis/tools/scratchpad.py +819 -0
- package/artemis-main/artemis/tools/system/adb_shell.py +31 -0
- package/artemis-main/artemis/tools/tool_wrapper.py +270 -0
- package/artemis-main/artemis/tools/video_tool.py +261 -0
- package/artemis-main/artemis/tools/wait_tool.py +97 -0
- package/artemis-main/artemis/utils/app_launch_utils.py +207 -0
- package/artemis-main/artemis/utils/coordinates.py +606 -0
- package/artemis-main/artemis/utils/credentials_validator.py +201 -0
- package/artemis-main/artemis/utils/cv_canvas.py +189 -0
- package/artemis-main/artemis/utils/cython_compat.py +45 -0
- package/artemis-main/artemis/utils/element_hit_test.py +80 -0
- package/artemis-main/artemis/utils/image_diff.py +335 -0
- package/artemis-main/artemis/utils/image_hash.py +80 -0
- package/artemis-main/artemis/utils/notes.py +470 -0
- package/artemis-main/artemis/utils/ocr_api.py +105 -0
- package/artemis-main/artemis/utils/ocr_xml_fusion.py +318 -0
- package/artemis-main/artemis/utils/plan_grammar.py +513 -0
- package/artemis-main/artemis/utils/python_executor.py +213 -0
- package/artemis-main/artemis/utils/startup_progress.py +60 -0
- package/artemis-main/artemis/utils/task_tree.py +1174 -0
- package/artemis-main/artemis/utils/text.py +37 -0
- package/artemis-main/artemis/utils/ui_filter.py +651 -0
- package/artemis-main/artemis/utils/video.py +685 -0
- package/artemis-main/artemis/utils/visualization.py +802 -0
- package/artemis-main/config/artemis.example.jsonc +12 -0
- package/artemis-main/mcp_server/README.md +111 -0
- package/artemis-main/mcp_server/__init__.py +21 -0
- package/artemis-main/mcp_server/__main__.py +20 -0
- package/artemis-main/mcp_server/background/__init__.py +15 -0
- package/artemis-main/mcp_server/background/task_runner.py +453 -0
- package/artemis-main/mcp_server/base.py +49 -0
- package/artemis-main/mcp_server/notifiers/__init__.py +74 -0
- package/artemis-main/mcp_server/notifiers/agentapi.py +289 -0
- package/artemis-main/mcp_server/notifiers/base.py +45 -0
- package/artemis-main/mcp_server/notifiers/composite.py +87 -0
- package/artemis-main/mcp_server/notifiers/desktop.py +108 -0
- package/artemis-main/mcp_server/notifiers/file.py +69 -0
- package/artemis-main/mcp_server/notifiers/script.py +90 -0
- package/artemis-main/mcp_server/notifiers/webhook.py +87 -0
- package/artemis-main/mcp_server/rules.md +68 -0
- package/artemis-main/mcp_server/server.py +106 -0
- package/artemis-main/mcp_server/tools/__init__.py +29 -0
- package/artemis-main/mcp_server/tools/device_state.py +107 -0
- package/artemis-main/mcp_server/tools/diagnose.py +1249 -0
- package/artemis-main/mcp_server/tools/inspect_trace.py +394 -0
- package/artemis-main/mcp_server/tools/task_manager.py +627 -0
- package/artemis-main/mcp_server/tools/task_runner.py +548 -0
- package/artemis-main/mcp_server/utils/__init__.py +15 -0
- package/artemis-main/mcp_server/utils/device_utils.py +180 -0
- package/artemis-main/mcp_server/utils/env_utils.py +65 -0
- package/artemis-main/packages/artemis-accessibility-helper/ArtemisAccessibilityHelper.apk +0 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/build.gradle.kts +35 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/AndroidManifest.xml +49 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/A11yNode.java +274 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/ArtemisAccessibilityService.java +227 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/CommandServer.java +463 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/DisplayUtils.java +111 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/GestureController.java +232 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/HierarchyDumper.java +832 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/TokenReceiver.java +36 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/TokenStore.java +38 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/XmlUtils.java +102 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/res/values/strings.xml +4 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/res/xml/accessibility_service_config.xml +10 -0
- package/artemis-main/packages/artemis-accessibility-helper/build.gradle.kts +3 -0
- package/artemis-main/packages/artemis-accessibility-helper/build_apk.sh +215 -0
- package/artemis-main/packages/artemis-accessibility-helper/debug.keystore +0 -0
- package/artemis-main/packages/artemis-accessibility-helper/gradle.properties +2 -0
- package/artemis-main/packages/artemis-accessibility-helper/helper_manifest.json +7 -0
- package/artemis-main/packages/artemis-accessibility-helper/settings.gradle.kts +17 -0
- package/artemis-main/packages/artemis-client/DESIGN.md +89 -0
- package/artemis-main/packages/artemis-client/README.md +112 -0
- package/artemis-main/packages/artemis-client/examples/basic.py +30 -0
- package/artemis-main/packages/artemis-client/pyproject.toml +36 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/__init__.py +45 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/client.py +401 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/errors.py +66 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/models.py +212 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/py.typed +1 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/transport.py +134 -0
- package/artemis-main/packages/artemis-client/tests/test_client.py +289 -0
- package/artemis-main/packages/artemis-client/tests/test_transport.py +85 -0
- package/artemis-main/pyproject.toml +259 -0
- package/artemis-main/pyright-core.json +17 -0
- package/artemis-main/scripts/check_dependency_sources.py +68 -0
- package/artemis-main/scripts/install_deps.ps1 +520 -0
- package/artemis-main/scripts/install_deps.sh +533 -0
- package/artemis-main/scripts/quality_ratchet.py +97 -0
- package/artemis-main/scripts/real_device_video_acceptance.py +483 -0
- package/artemis-main/scripts/run_edge_case_part.py +327 -0
- package/artemis-main/scripts/run_ui.py +242 -0
- package/artemis-main/scripts/start.ps1 +500 -0
- package/artemis-main/scripts/test_all_edge_cases.py +269 -0
- package/artemis-main/scripts/verify_concurrency_and_devices.py +385 -0
- package/artemis-main/setup.py +164 -0
- package/artemis-main/start.bat +35 -0
- package/artemis-main/start.sh +423 -0
- package/artemis-main/third_party/mobile_use/LICENSE +190 -0
- package/artemis-main/third_party/mobile_use/METADATA +27 -0
- package/artemis-main/third_party/mobile_use/NOTICE +12 -0
- package/artemis-main/third_party/mobile_use/__init__.py +19 -0
- package/artemis-main/third_party/mobile_use/agents/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/agents/hopper/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/agents/hopper/hopper.md +22 -0
- package/artemis-main/third_party/mobile_use/agents/hopper/hopper.py +80 -0
- package/artemis-main/third_party/mobile_use/clients/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/clients/ui_automator_client.py +482 -0
- package/artemis-main/third_party/mobile_use/config/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/config/llm.py +183 -0
- package/artemis-main/third_party/mobile_use/config/output.py +184 -0
- package/artemis-main/third_party/mobile_use/context.py +119 -0
- package/artemis-main/third_party/mobile_use/controllers/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/controllers/platform_specific_commands_controller.py +151 -0
- package/artemis-main/third_party/mobile_use/controllers/types.py +92 -0
- package/artemis-main/third_party/mobile_use/controllers/unified_controller.py +183 -0
- package/artemis-main/third_party/mobile_use/graph.py +54 -0
- package/artemis-main/third_party/mobile_use/llm_service.py +193 -0
- package/artemis-main/third_party/mobile_use/main.py +130 -0
- package/artemis-main/third_party/mobile_use/sdk/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/sdk/agent.py +1060 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/agent_config_builder.py +225 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/index.py +33 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/task_request_builder.py +243 -0
- package/artemis-main/third_party/mobile_use/sdk/types/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/sdk/types/agent.py +98 -0
- package/artemis-main/third_party/mobile_use/sdk/types/exceptions.py +109 -0
- package/artemis-main/third_party/mobile_use/sdk/types/task.py +234 -0
- package/artemis-main/third_party/mobile_use/testing.py +59 -0
- package/artemis-main/third_party/mobile_use/tools/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/tools/index.py +44 -0
- package/artemis-main/third_party/mobile_use/tools/mobile/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/tools/mobile/launch_app.py +89 -0
- package/artemis-main/third_party/mobile_use/tools/tool_wrapper.py +52 -0
- package/artemis-main/third_party/mobile_use/utils/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/utils/app_launch_utils.py +217 -0
- package/artemis-main/third_party/mobile_use/utils/cli_helpers.py +60 -0
- package/artemis-main/third_party/mobile_use/utils/decorators.py +158 -0
- package/artemis-main/third_party/mobile_use/utils/file.py +31 -0
- package/artemis-main/third_party/mobile_use/utils/logger.py +216 -0
- package/artemis-main/third_party/mobile_use/utils/media.py +213 -0
- package/artemis-main/third_party/mobile_use/utils/shell_utils.py +39 -0
- package/artemis-main/third_party/mobile_use/utils/video.py +398 -0
- package/artemis-main/uv.lock +4908 -0
- package/bin/android-midscene-automation.js +1 -5
- package/bin/artemis-config.mjs +15 -0
- package/bin/artemis-embedded.py +56 -0
- package/bin/start-artemis.mjs +30 -0
- package/bin/start-dev.mjs +112 -0
- package/bin/test_artemis_embedded.py +44 -0
- package/package.json +4 -2
- package/server/artemis.ts +34 -0
- package/server/http-api.ts +12 -0
- package/src/App.vue +10 -5
- package/src/api.ts +5 -0
- package/src/appium-recorder/AppiumPage.vue +1 -1
- package/src/appium-recorder/components/ComponentInspector.vue +1 -1
- package/src/appium-recorder/components/FlowNodeSearch.vue +3 -3
- package/src/appium-recorder/components/ImageCheckDialog.vue +3 -3
- package/src/appium-recorder/components/RecorderWorkspace.vue +4 -4
- package/src/appium-recorder/flow-appearance.ts +4 -4
- package/src/components/AppSidebar.vue +8 -7
- package/src/components/MidsceneMaintenanceNotice.vue +17 -0
- package/src/components/analytics/AnalysisCharts.vue +4 -4
- package/src/components/analytics/ReportAnalysis.vue +1 -1
- package/src/components/generator/TestCaseFileUpload.vue +1 -1
- package/src/components/help/HelpCenter.vue +56 -37
- package/src/pages/AiGeneratorPage.vue +1 -1
- package/src/pages/ArtemisPage.vue +72 -0
- package/src/pages/ConfigPage.vue +18 -19
- package/src/style.css +340 -121
- package/src/types.ts +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 2026 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Copyright 2025-2026 Minitap, Inc.
|
|
2
|
+
# Modifications Copyright 2026 Google LLC
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
# Originally from mobile-use (https://github.com/minitap-ai/mobile-use).
|
|
17
|
+
# See third_party/mobile_use/METADATA for the upstream source and local modifications.
|
|
18
|
+
|
|
19
|
+
"""Builder for AgentConfig objects using a fluent interface."""
|
|
20
|
+
|
|
21
|
+
import copy
|
|
22
|
+
from typing import Any, ClassVar, Self
|
|
23
|
+
|
|
24
|
+
from langchain_core.callbacks.base import Callbacks
|
|
25
|
+
from artemis.config import get_default_llm_config
|
|
26
|
+
from artemis.sdk.constants import DEFAULT_PROFILE_NAME
|
|
27
|
+
from third_party.mobile_use.context import DevicePlatform
|
|
28
|
+
from third_party.mobile_use.sdk.types.agent import AgentConfigBase, ServerConfig
|
|
29
|
+
from third_party.mobile_use.sdk.types.task import AgentProfile, TaskRequestCommon
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class AgentConfigBuilderBase:
|
|
33
|
+
"""Builder class providing a fluent interface for creating AgentConfig objects.
|
|
34
|
+
|
|
35
|
+
This builder allows for step-by-step construction of an AgentConfig with
|
|
36
|
+
clear methods that make the configuration process intuitive and type-safe.
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
>>> builder = AgentConfigBuilder()
|
|
40
|
+
>>> config = (builder
|
|
41
|
+
... .add_profile(AgentProfile(name="HighReasoning",
|
|
42
|
+
llm_config=LLMConfig(...)))
|
|
43
|
+
... .add_profile(AgentProfile(name="LowReasoning",
|
|
44
|
+
llm_config=LLMConfig(...)))
|
|
45
|
+
... .for_device(DevicePlatform.ANDROID, "device123")
|
|
46
|
+
... .with_default_task_config(TaskRequestCommon(max_steps=30))
|
|
47
|
+
... .with_default_profile("HighReasoning")
|
|
48
|
+
... .build()
|
|
49
|
+
... )
|
|
50
|
+
|
|
51
|
+
Subclasses extend the built configuration by setting ``config_class`` and
|
|
52
|
+
overriding :meth:`_extra_config_fields`.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
config_class: ClassVar[type[AgentConfigBase]] = AgentConfigBase
|
|
56
|
+
|
|
57
|
+
def __init__(self, servers: ServerConfig):
|
|
58
|
+
"""Initialize an empty AgentConfigBuilder."""
|
|
59
|
+
self._agent_profiles: dict[str, AgentProfile] = {}
|
|
60
|
+
self._task_request_defaults: TaskRequestCommon | None = None
|
|
61
|
+
self._default_profile: str | AgentProfile | None = None
|
|
62
|
+
self._device_id: str | None = None
|
|
63
|
+
self._device_platform: DevicePlatform | None = None
|
|
64
|
+
self._servers: ServerConfig = servers
|
|
65
|
+
self._graph_config_callbacks: Callbacks = None
|
|
66
|
+
self._cloud_mobile_id_or_ref: str | None = None
|
|
67
|
+
|
|
68
|
+
def add_profile(self, profile: AgentProfile, validate: bool = True) -> Self:
|
|
69
|
+
"""Add an agent profile to the ARTEMIS agent.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
profile: The agent profile to add
|
|
73
|
+
"""
|
|
74
|
+
self._agent_profiles[profile.name] = profile
|
|
75
|
+
if validate:
|
|
76
|
+
profile.llm_config.validate_providers()
|
|
77
|
+
return self
|
|
78
|
+
|
|
79
|
+
def add_profiles(
|
|
80
|
+
self,
|
|
81
|
+
profiles: list[AgentProfile],
|
|
82
|
+
validate: bool = True,
|
|
83
|
+
) -> Self:
|
|
84
|
+
"""Add multiple agent profiles to the ARTEMIS agent.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
profiles: List of agent profiles to add
|
|
88
|
+
"""
|
|
89
|
+
for profile in profiles:
|
|
90
|
+
self.add_profile(profile=profile, validate=validate)
|
|
91
|
+
return self
|
|
92
|
+
|
|
93
|
+
def with_default_profile(self, profile: str | AgentProfile) -> Self:
|
|
94
|
+
"""Set the default agent profile used for tasks.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
profile: The name or instance of the default agent profile
|
|
98
|
+
"""
|
|
99
|
+
self._default_profile = profile
|
|
100
|
+
return self
|
|
101
|
+
|
|
102
|
+
def for_device(
|
|
103
|
+
self,
|
|
104
|
+
platform_or_device_id: DevicePlatform | str,
|
|
105
|
+
device_id: str | None = None,
|
|
106
|
+
) -> Self:
|
|
107
|
+
"""Configure the ARTEMIS agent for a specific device.
|
|
108
|
+
|
|
109
|
+
Supports both:
|
|
110
|
+
builder.for_device(DevicePlatform.ANDROID, "emulator-5554")
|
|
111
|
+
and:
|
|
112
|
+
builder.for_device("emulator-5554") (defaults to DevicePlatform.ANDROID)
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
platform_or_device_id: DevicePlatform or unique identifier for the device
|
|
116
|
+
device_id: The unique identifier for the device (if platform was passed first)
|
|
117
|
+
"""
|
|
118
|
+
if self._cloud_mobile_id_or_ref is not None:
|
|
119
|
+
raise ValueError(
|
|
120
|
+
"Device ID cannot be set when a cloud mobile is already"
|
|
121
|
+
" configured.\n> for_device() and for_cloud_mobile() are"
|
|
122
|
+
" mutually exclusive"
|
|
123
|
+
)
|
|
124
|
+
if isinstance(platform_or_device_id, DevicePlatform):
|
|
125
|
+
self._device_platform = platform_or_device_id
|
|
126
|
+
self._device_id = device_id
|
|
127
|
+
else:
|
|
128
|
+
self._device_platform = DevicePlatform.ANDROID
|
|
129
|
+
self._device_id = str(platform_or_device_id)
|
|
130
|
+
return self
|
|
131
|
+
|
|
132
|
+
def with_default_task_config(self, config: TaskRequestCommon) -> Self:
|
|
133
|
+
"""Set the default task configuration.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
config: The task configuration to use as default
|
|
137
|
+
"""
|
|
138
|
+
self._task_request_defaults = copy.deepcopy(config)
|
|
139
|
+
return self
|
|
140
|
+
|
|
141
|
+
def with_adb_server(self, host: str, port: int | None = None) -> Self:
|
|
142
|
+
"""Set the ADB server host and port.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
host: The ADB server host
|
|
146
|
+
port: The ADB server port
|
|
147
|
+
"""
|
|
148
|
+
self._servers.adb_host = host
|
|
149
|
+
if port is not None:
|
|
150
|
+
self._servers.adb_port = port
|
|
151
|
+
return self
|
|
152
|
+
|
|
153
|
+
def with_servers(self, servers: ServerConfig) -> Self:
|
|
154
|
+
"""Set the server settings.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
servers: The server settings to use
|
|
158
|
+
"""
|
|
159
|
+
self._servers = copy.deepcopy(servers)
|
|
160
|
+
return self
|
|
161
|
+
|
|
162
|
+
def with_graph_config_callbacks(self, callbacks: Callbacks) -> Self:
|
|
163
|
+
"""Set the graph config callbacks.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
callbacks: The graph config callbacks to use
|
|
167
|
+
"""
|
|
168
|
+
self._graph_config_callbacks = callbacks
|
|
169
|
+
return self
|
|
170
|
+
|
|
171
|
+
def _extra_config_fields(self) -> dict[str, Any]:
|
|
172
|
+
"""Fields a subclass adds to (or overrides in) the built configuration."""
|
|
173
|
+
return {}
|
|
174
|
+
|
|
175
|
+
def build(self, validate_profiles: bool = True) -> AgentConfigBase:
|
|
176
|
+
"""Build the AgentConfig object.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
default_profile: Name of the default agent profile to use
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
A configured AgentConfig object
|
|
183
|
+
|
|
184
|
+
Raises:
|
|
185
|
+
ValueError: If default_profile is specified but not found in
|
|
186
|
+
configured profiles
|
|
187
|
+
"""
|
|
188
|
+
nb_profiles = len(self._agent_profiles)
|
|
189
|
+
|
|
190
|
+
if isinstance(self._default_profile, str):
|
|
191
|
+
profile_name = self._default_profile
|
|
192
|
+
default_profile = self._agent_profiles.get(profile_name, None)
|
|
193
|
+
if default_profile is None:
|
|
194
|
+
raise ValueError(f"Profile '{profile_name}' not found in configured agents")
|
|
195
|
+
elif isinstance(self._default_profile, AgentProfile):
|
|
196
|
+
default_profile = self._default_profile
|
|
197
|
+
if default_profile.name not in self._agent_profiles:
|
|
198
|
+
self.add_profile(default_profile, validate=validate_profiles)
|
|
199
|
+
elif nb_profiles <= 0:
|
|
200
|
+
llm_config = get_default_llm_config()
|
|
201
|
+
default_profile = AgentProfile(
|
|
202
|
+
name=DEFAULT_PROFILE_NAME,
|
|
203
|
+
llm_config=llm_config,
|
|
204
|
+
)
|
|
205
|
+
self.add_profile(default_profile, validate=validate_profiles)
|
|
206
|
+
elif nb_profiles == 1:
|
|
207
|
+
# Select the only one available
|
|
208
|
+
default_profile = next(iter(self._agent_profiles.values()))
|
|
209
|
+
else:
|
|
210
|
+
available_profiles = ", ".join(self._agent_profiles.keys())
|
|
211
|
+
raise ValueError(
|
|
212
|
+
f"You must call with_default_profile() to select one among: {available_profiles}"
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
fields: dict[str, Any] = {
|
|
216
|
+
"agent_profiles": self._agent_profiles,
|
|
217
|
+
"task_request_defaults": self._task_request_defaults or TaskRequestCommon(),
|
|
218
|
+
"default_profile": default_profile,
|
|
219
|
+
"device_id": self._device_id,
|
|
220
|
+
"device_platform": self._device_platform,
|
|
221
|
+
"servers": self._servers,
|
|
222
|
+
"graph_config_callbacks": self._graph_config_callbacks,
|
|
223
|
+
}
|
|
224
|
+
fields.update(self._extra_config_fields())
|
|
225
|
+
return self.config_class(**fields)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright 2025-2026 Minitap, Inc.
|
|
2
|
+
# Modifications Copyright 2026 Google LLC
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
# Originally from mobile-use (https://github.com/minitap-ai/mobile-use).
|
|
17
|
+
# See third_party/mobile_use/METADATA for the upstream source and local modifications.
|
|
18
|
+
|
|
19
|
+
from artemis.sdk.builders.agent_config_builder import AgentConfigBuilder
|
|
20
|
+
from third_party.mobile_use.sdk.builders.task_request_builder import TaskRequestCommonBuilder
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class BuildersWrapper:
|
|
24
|
+
@property
|
|
25
|
+
def AgentConfig(self) -> AgentConfigBuilder:
|
|
26
|
+
return AgentConfigBuilder()
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def TaskDefaults(self) -> TaskRequestCommonBuilder:
|
|
30
|
+
return TaskRequestCommonBuilder()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
Builders = BuildersWrapper()
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Copyright 2025-2026 Minitap, Inc.
|
|
2
|
+
# Modifications Copyright 2026 Google LLC
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
# Originally from mobile-use (https://github.com/minitap-ai/mobile-use).
|
|
17
|
+
# See third_party/mobile_use/METADATA for the upstream source and local modifications.
|
|
18
|
+
|
|
19
|
+
"""Builder for TaskRequest objects using a fluent interface."""
|
|
20
|
+
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Generic, TypeVar, cast
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
from typing import Self
|
|
26
|
+
except ImportError:
|
|
27
|
+
from typing import Self
|
|
28
|
+
|
|
29
|
+
from artemis.constants import RECURSION_LIMIT
|
|
30
|
+
from artemis.sdk.types.agent import AgentProfile
|
|
31
|
+
from pydantic import BaseModel
|
|
32
|
+
from artemis.utils.cython_compat import CyFunctionDetector
|
|
33
|
+
from third_party.mobile_use.sdk.types.task import TaskRequest, TaskRequestCommon
|
|
34
|
+
|
|
35
|
+
TIn = TypeVar("TIn", bound=BaseModel | None)
|
|
36
|
+
TOut = TypeVar("TOut", bound=BaseModel)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class TaskRequestCommonBuilder(BaseModel):
|
|
40
|
+
"""Builder class providing a fluent interface for creating TaskRequestCommon objects."""
|
|
41
|
+
|
|
42
|
+
model_config = {"ignored_types": (CyFunctionDetector,)}
|
|
43
|
+
|
|
44
|
+
def __init__(self):
|
|
45
|
+
self._max_steps = RECURSION_LIMIT
|
|
46
|
+
self._record_trace = True
|
|
47
|
+
self._trace_path = Path("traces")
|
|
48
|
+
self._llm_output_path: Path | None = None
|
|
49
|
+
self._locked_app_package: str | None = None
|
|
50
|
+
self._app_path: Path | None = None
|
|
51
|
+
|
|
52
|
+
def with_max_steps(self, max_steps: int) -> Self:
|
|
53
|
+
"""Set the maximum number of steps the task can take.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
max_steps: Maximum number of steps
|
|
57
|
+
"""
|
|
58
|
+
self._max_steps = max_steps
|
|
59
|
+
return self
|
|
60
|
+
|
|
61
|
+
def with_trace_recording(self, enabled: bool = True, path: str | None = None) -> Self:
|
|
62
|
+
"""Configure trace recording for the task.
|
|
63
|
+
|
|
64
|
+
Traces record screenshots and actions during execution.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
enabled: Whether to enable trace recording
|
|
68
|
+
path: Directory path where traces should be saved
|
|
69
|
+
"""
|
|
70
|
+
self._record_trace = enabled
|
|
71
|
+
if enabled and path:
|
|
72
|
+
self._trace_path = Path(path)
|
|
73
|
+
return self
|
|
74
|
+
|
|
75
|
+
def with_llm_output_saving(self, path: str) -> Self:
|
|
76
|
+
"""Configure LLM output saving for the task.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
path: Path where to save the LLM output message
|
|
80
|
+
"""
|
|
81
|
+
self._llm_output_path = Path(path)
|
|
82
|
+
return self
|
|
83
|
+
|
|
84
|
+
def with_locked_app_package(self, package_name: str) -> Self:
|
|
85
|
+
"""Set the app package to lock execution to.
|
|
86
|
+
|
|
87
|
+
This ensures the specified app is launched and in the foreground before
|
|
88
|
+
the agentic loop starts.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
package_name: Package name (Android, e.g., 'com.whatsapp')
|
|
92
|
+
"""
|
|
93
|
+
self._locked_app_package = package_name
|
|
94
|
+
return self
|
|
95
|
+
|
|
96
|
+
def with_app_path(self, app_path: str | Path) -> Self:
|
|
97
|
+
"""Set the path to an app to install before running the task.
|
|
98
|
+
|
|
99
|
+
For Android: Path to an APK file.
|
|
100
|
+
|
|
101
|
+
The app will be installed automatically before the task starts.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
app_path: Path to the app file to install
|
|
105
|
+
"""
|
|
106
|
+
self._app_path = Path(app_path) if isinstance(app_path, str) else app_path
|
|
107
|
+
return self
|
|
108
|
+
|
|
109
|
+
def build(self) -> TaskRequestCommon:
|
|
110
|
+
"""Build the TaskRequestCommon object.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
A configured TaskRequestCommon object
|
|
114
|
+
|
|
115
|
+
Raises:
|
|
116
|
+
ValueError: If required fields are missing
|
|
117
|
+
"""
|
|
118
|
+
return TaskRequestCommon(
|
|
119
|
+
max_steps=self._max_steps,
|
|
120
|
+
record_trace=self._record_trace,
|
|
121
|
+
trace_path=self._trace_path,
|
|
122
|
+
llm_output_path=self._llm_output_path,
|
|
123
|
+
locked_app_package=self._locked_app_package,
|
|
124
|
+
app_path=self._app_path,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class TaskRequestBuilder(TaskRequestCommonBuilder, Generic[TIn]):
|
|
129
|
+
"""Builder class providing a fluent interface for creating TaskRequest objects.
|
|
130
|
+
|
|
131
|
+
This builder allows for step-by-step construction of a TaskRequest with
|
|
132
|
+
clear methods that make the configuration process intuitive and type-safe.
|
|
133
|
+
|
|
134
|
+
Examples:
|
|
135
|
+
>>> builder = TaskRequestBuilder[None](goal="Open Gmail and check unread
|
|
136
|
+
emails")
|
|
137
|
+
>>> task_request = (
|
|
138
|
+
... builder
|
|
139
|
+
... .with_max_steps(30)
|
|
140
|
+
... .using_profile("LowReasoning")
|
|
141
|
+
... .with_output_description("A list of email subjects and senders")
|
|
142
|
+
... .build()
|
|
143
|
+
... )
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
model_config = {"ignored_types": (CyFunctionDetector,)}
|
|
147
|
+
|
|
148
|
+
def __init__(self, goal: str):
|
|
149
|
+
"""Initialize an empty TaskRequestBuilder."""
|
|
150
|
+
super().__init__()
|
|
151
|
+
self._goal = goal
|
|
152
|
+
self._profile: str | AgentProfile | None = None
|
|
153
|
+
self._name: str | None = None
|
|
154
|
+
self._output_description = None
|
|
155
|
+
self._output_format: type[TIn] | None = None
|
|
156
|
+
|
|
157
|
+
@classmethod
|
|
158
|
+
def from_common(cls, goal: str, common: TaskRequestCommon):
|
|
159
|
+
res = cls(goal=goal)
|
|
160
|
+
res._max_steps = common.max_steps
|
|
161
|
+
res._record_trace = common.record_trace
|
|
162
|
+
res._trace_path = common.trace_path
|
|
163
|
+
res._llm_output_path = common.llm_output_path
|
|
164
|
+
res._locked_app_package = common.locked_app_package
|
|
165
|
+
res._app_path = common.app_path
|
|
166
|
+
return res
|
|
167
|
+
|
|
168
|
+
def using_profile(self, profile: str | AgentProfile) -> "TaskRequestBuilder[TIn]":
|
|
169
|
+
"""Set the agent profile for executing the task.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
profile: The agent profile to use
|
|
173
|
+
"""
|
|
174
|
+
self._profile = profile
|
|
175
|
+
return self
|
|
176
|
+
|
|
177
|
+
def with_name(self, name: str) -> "TaskRequestBuilder[TIn]":
|
|
178
|
+
"""Set the name of the task - useful when recording traces.
|
|
179
|
+
|
|
180
|
+
Otherwise, a random name will be generated.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
name: Name of the task
|
|
184
|
+
"""
|
|
185
|
+
self._name = name
|
|
186
|
+
return self
|
|
187
|
+
|
|
188
|
+
def without_llm_output_saving(self) -> Self:
|
|
189
|
+
"""Disable LLM output saving for the task."""
|
|
190
|
+
self._llm_output_path = None
|
|
191
|
+
return self
|
|
192
|
+
|
|
193
|
+
def with_output_description(self, description: str) -> "TaskRequestBuilder[TIn]":
|
|
194
|
+
"""Set the description of the expected output format.
|
|
195
|
+
|
|
196
|
+
This is especially useful for data extraction tasks.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
description: Description of the expected output format
|
|
200
|
+
"""
|
|
201
|
+
self._output_description = description
|
|
202
|
+
return self
|
|
203
|
+
|
|
204
|
+
def with_output_format(self, output_format: type[TOut]) -> "TaskRequestBuilder[TOut]":
|
|
205
|
+
"""Set the pydantic model for the expected output format.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
output_format: Pydantic model instance defining the output format
|
|
209
|
+
"""
|
|
210
|
+
self._output_format = output_format # type: ignore
|
|
211
|
+
return cast(TaskRequestBuilder[TOut], self)
|
|
212
|
+
|
|
213
|
+
def build(self) -> TaskRequest[TIn]:
|
|
214
|
+
"""Build the TaskRequest object.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
A configured TaskRequest object
|
|
218
|
+
|
|
219
|
+
Raises:
|
|
220
|
+
ValueError: If required fields are missing
|
|
221
|
+
"""
|
|
222
|
+
if not self._goal:
|
|
223
|
+
raise ValueError("Task goal is required")
|
|
224
|
+
|
|
225
|
+
if self._output_format and self._output_description:
|
|
226
|
+
raise ValueError("Output format and description are mutually exclusive")
|
|
227
|
+
|
|
228
|
+
task_request = TaskRequest(
|
|
229
|
+
goal=self._goal,
|
|
230
|
+
profile=self._profile.name
|
|
231
|
+
if isinstance(self._profile, AgentProfile)
|
|
232
|
+
else self._profile,
|
|
233
|
+
task_name=self._name,
|
|
234
|
+
output_description=self._output_description,
|
|
235
|
+
output_format=self._output_format,
|
|
236
|
+
max_steps=self._max_steps,
|
|
237
|
+
record_trace=self._record_trace,
|
|
238
|
+
trace_path=self._trace_path,
|
|
239
|
+
llm_output_path=self._llm_output_path,
|
|
240
|
+
locked_app_package=self._locked_app_package,
|
|
241
|
+
app_path=self._app_path,
|
|
242
|
+
)
|
|
243
|
+
return task_request
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 2026 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Copyright 2025-2026 Minitap, Inc.
|
|
2
|
+
# Modifications Copyright 2026 Google LLC
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
# Originally from mobile-use (https://github.com/minitap-ai/mobile-use).
|
|
17
|
+
# See third_party/mobile_use/METADATA for the upstream source and local modifications.
|
|
18
|
+
|
|
19
|
+
"""Agent configuration base models.
|
|
20
|
+
|
|
21
|
+
Artemis extends :class:`AgentConfigBase` as ``artemis.sdk.types.agent.AgentConfig``.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from typing import Literal
|
|
25
|
+
from urllib.parse import urlparse
|
|
26
|
+
|
|
27
|
+
from langchain_core.callbacks.base import Callbacks
|
|
28
|
+
from pydantic import BaseModel
|
|
29
|
+
|
|
30
|
+
from artemis.utils.cython_compat import CyFunctionDetector
|
|
31
|
+
from third_party.mobile_use.context import DevicePlatform
|
|
32
|
+
from third_party.mobile_use.sdk.types.task import AgentProfile, TaskRequestCommon
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ApiBaseUrl(BaseModel):
|
|
36
|
+
"""Defines an API base URL."""
|
|
37
|
+
|
|
38
|
+
model_config = {"ignored_types": (CyFunctionDetector,)}
|
|
39
|
+
scheme: Literal["http", "https"]
|
|
40
|
+
host: str
|
|
41
|
+
port: int | None = None
|
|
42
|
+
|
|
43
|
+
def __eq__(self, other):
|
|
44
|
+
if not isinstance(other, ApiBaseUrl):
|
|
45
|
+
return False
|
|
46
|
+
return self.to_url() == other.to_url()
|
|
47
|
+
|
|
48
|
+
def to_url(self):
|
|
49
|
+
return (
|
|
50
|
+
f"{self.scheme}://{self.host}:{self.port}"
|
|
51
|
+
if self.port is not None
|
|
52
|
+
else f"{self.scheme}://{self.host}"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def from_url(cls, url: str) -> "ApiBaseUrl":
|
|
57
|
+
parsed_url = urlparse(url)
|
|
58
|
+
if parsed_url.scheme not in ["http", "https"]:
|
|
59
|
+
raise ValueError(f"Invalid scheme: {parsed_url.scheme}")
|
|
60
|
+
if parsed_url.hostname is None:
|
|
61
|
+
raise ValueError("Invalid hostname")
|
|
62
|
+
return cls(
|
|
63
|
+
scheme=parsed_url.scheme, # type: ignore
|
|
64
|
+
host=parsed_url.hostname,
|
|
65
|
+
port=parsed_url.port,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class ServerConfig(BaseModel):
|
|
70
|
+
"""Configuration for the required servers."""
|
|
71
|
+
|
|
72
|
+
model_config = {"ignored_types": (CyFunctionDetector,)}
|
|
73
|
+
|
|
74
|
+
adb_host: str
|
|
75
|
+
adb_port: int
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class AgentConfigBase(BaseModel):
|
|
79
|
+
"""ARTEMIS agent configuration.
|
|
80
|
+
|
|
81
|
+
Attributes:
|
|
82
|
+
agent_profiles: Map an agent profile name to its configuration.
|
|
83
|
+
task_config_defaults: Default task request configuration.
|
|
84
|
+
default_profile: default profile to use for tasks
|
|
85
|
+
device_id: Specific device to target (if None, first available is used).
|
|
86
|
+
device_platform: Platform of the device to target.
|
|
87
|
+
servers: Custom server configurations.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
agent_profiles: dict[str, AgentProfile]
|
|
91
|
+
task_request_defaults: TaskRequestCommon
|
|
92
|
+
default_profile: AgentProfile
|
|
93
|
+
device_id: str | None = None
|
|
94
|
+
device_platform: DevicePlatform | None = None
|
|
95
|
+
servers: ServerConfig
|
|
96
|
+
graph_config_callbacks: Callbacks = None
|
|
97
|
+
|
|
98
|
+
model_config = {"arbitrary_types_allowed": True}
|