Liang Yao (姚亮)*
,
Shengxiang Xu(徐圣翔)*
,
Fan Liu (刘凡) ✉
,
Chuanyi Zhang (张传一)
,
Bishun Yao (姚必顺)
,
Rui Min (闵锐)
,
Yongjun Li (李勇俊)
,
Chaoqian Ouyang(欧阳超前)
,
Shimin Di (邸世民)
,
Min-Ling Zhang (张敏灵)
![]()
* Equal Contribution ✉ Corresponding Author
- 2026/4/9: Welcome to RemoteAgent! The preprint of our paper is available. Dataset and codes will be open-sourced at this repository.
Earth Observation (EO) systems are essentially designed to support domain experts who often express their requirements through vague natural language rather than precise, machine-friendly instructions. Depending on the specific application scenario, these vague queries can demand vastly different levels of visual precision. Consequently, a practical EO AI system must bridge the gap between ambiguous human queries and the appropriate multi-granularity visual analysis tasks, ranging from holistic image interpretation to fine-grained pixel-wise predictions. While Multi-modal Large Language Models (MLLMs) demonstrate strong semantic understanding, their text-based output format is inherently ill-suited for dense, precision-critical spatial predictions. Existing agentic frameworks address this limitation by delegating tasks to external tools, but indiscriminate tool invocation is computationally inefficient and underutilizes the MLLM's native capabilities. To this end, we propose RemoteAgent, an agentic framework that strategically respects the intrinsic capability boundaries of MLLMs. To empower this framework to understand real user intents, we construct VagueEO, a human-centric instruction dataset pairing EO tasks with simulated vague natural-language queries. By leveraging VagueEO for reinforcement fine-tuning, we align an MLLM into a robust cognitive core that directly resolves image- and sparse region-level tasks. Consequently, RemoteAgent processes suitable tasks internally while intelligently orchestrating specialized tools via the Model Context Protocol exclusively for dense predictions. Extensive experiments demonstrate that RemoteAgent achieves robust intent recognition capabilities while delivering highly competitive performance across diverse EO tasks.
remoteagent/
config/ # defaults and tool schemas
core/ # RemoteAgent + AgentResult
llm/ # vLLM OpenAI-compatible client
parsing/ # ToolCallParser for T_call parsing
services/ # ServiceExecutor and task mappings
utils/ # HttpUtils, ImageUtils, TextUtils
prompts/ # default system prompt
eval_common.py
cli.py
servers/ # external tool service implementations
test/ # evaluation and benchmark scripts
RemoteAgent: core inference orchestratorAgentResult: output container (text,history)ToolCallParser: parseT_call(...)to structured argumentsServiceExecutor: route tool requests to service backendsVLLMChatClient: chat/model calls to vLLM endpointRemoteAgentCLI: CLI parser and entrypoint
object_detectionreferring_expression_segmentationsemantic_segmentationbinary_change_detectionsemantic_change_detectionbuilding_damage_assessmentoriented_object_detectioncrossearth_semantic_segmentationcontour_extractionregion_contour_extractionsubobject_contour_extractionregion_subobject_contour_extraction
Create the remoteagent environment:
conda create -n remoteagent python=3.10 -y
conda activate remoteagent
python -m pip install -U pip setuptools wheel
python -m pip install --index-url https://download.pytorch.org/whl/cu128 \
torch==2.9.1 torchvision==0.24.1 torchaudio==2.9.1
python -m pip install \
vllm==0.15.1 \
openai \
nvidia-nvshmem-cu12 \
nvidia-cusparselt-cu12
python -m pip install opencv-pythonBefore using any external tools, make sure each tool service is fully deployed with all required model files, checkpoints, and runtime dependencies.
REMOTE_API_URLCHANGE3D_API_URLSM3DET_API_URLCROSSEARTH_API_URLSKYSENSE_DET_API_URLDIRECTSAM_API_URL
conda activate remoteagent
export PYTHONNOUSERSITE=1
unset PYTHONPATH
bash ./remoteagent/run_remoteagent_vllm.sh RemoteAgent-7B-merged-6000+9000 8000Run each command in a separate terminal:
# Terminal A (RemoteSAM)
conda activate RemoteSAM
python servers/RemoteSAM/remotesam.py
# Terminal B (Change3D)
conda activate Change3D
python servers/Change3D/change3d.py
# Terminal C (SM3Det)
conda activate SM3Det
python servers/SM3Det/sm3det.py
# Terminal D (CrossEarth)
conda activate CrossEarth
python servers/CrossEarth/crossearth.py
# Terminal E (SkySense)
conda activate skysense
python servers/SkySense/skysense.py
# Terminal F (DirectSAM)
conda activate subobjects
python servers/DirectSAM/directsam.pyconda activate remoteagent
export PYTHONNOUSERSITE=1
unset PYTHONPATH
python -m remoteagent.cli --image_path "/path/to/demo.jpg" "Describe this image."from remoteagent import RemoteAgent
agent = RemoteAgent.from_env(max_rounds=3, max_tokens=512)
result = agent.run(
query="Describe objects and scene in this EO image.",
image_path="/path/to/demo.jpg",
)
print(result.text)
print(result.history) # round-level logsimport os
from remoteagent import RemoteAgent
api_urls = {
"remotesam": os.environ.get("REMOTE_API_URL"),
"change3d": os.environ.get("CHANGE3D_API_URL"),
"sm3det": os.environ.get("SM3DET_API_URL"),
"crossearth": os.environ.get("CROSSEARTH_API_URL"),
"skysense_det": os.environ.get("SKYSENSE_DET_API_URL"),
"directsam": os.environ.get("DIRECTSAM_API_URL"),
}
agent = RemoteAgent(
vllm_url=os.environ.get("VLLM_URL", "http://localhost:8000"),
model_name=None,
api_urls=api_urls,
max_rounds=3,
)
result = agent.run("Find major roads.", "/path/to/demo.jpg")
print(result.text)Run one DIOR evaluation example (tool/vLLM URLs are optional here; script defaults are used when omitted):
python test/dior.pyWhen you add a brand-new backend service under servers/, update the agent side in this order.
- Add default port and environment variable key in
remoteagent/config/defaults.py:
SERVICE_PORTS["mytool"] = 6660
ENV_URL_KEYS["mytool"] = "MYTOOL_API_URL"- Add a CLI argument and default URL fallback in
remoteagent/cli.py:
p.add_argument(
"--mytool_url",
type=str,
default=RemoteAgentCLI._default_service_url("mytool"),
)and include it in api_urls:
api_urls["mytool"] = args.mytool_url- Register tool routing in
remoteagent/config/tools_schema.py:
MCP_TOOLS["mytool_new_task"] = ["image_path", "classes"]
TOOL_TO_SERVICE["mytool_new_task"] = "mytool"- Add task mapping (if needed) in
remoteagent/services/mappings.py:
MYTOOL_TOOL_TO_TASK = {"mytool_new_task": "new_task"}- Implement service call in
remoteagent/services/executor.py:
- route
service == "mytool"inexecute(...) - add
_call_mytool(...)to build payload and parse response
-
Update
remoteagent/prompts/prompt.txtso the model knows when/how to call the new tool. -
(Optional) Set
MYTOOL_API_URLin your shell to override the default port:
export MYTOOL_API_URL="http://127.0.0.1:6660"PowerShell:
$env:MYTOOL_API_URL="http://127.0.0.1:6660"After these changes, you can usually run CLI without passing --mytool_url because it will auto-fallback to SERVICE_PORTS["mytool"].
- Code in this repository is built on MS-SWIFT. We'd like to thank the authors for open sourcing their project.
Please Contact yaoliang@hhu.edu.cn
If you find this work useful, please cite our papers as:
@misc{yao2026RemoteAgent,
title={RemoteAgent: Bridging Vague Human Intents and Earth Observation with RL-based Agentic MLLMs},
author={Liang Yao and Shengxiang Xu and Fan Liu and Chuanyi Zhang and Bishun Yao and Rui Min and Yongjun Li and Chaoqian Ouyang and Shimin Di and Min-Ling Zhang},
year={2026},
eprint={2604.07765},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2604.07765},
}
@misc{yao2025RemoteSAM,
title={RemoteSAM: Towards Segment Anything for Earth Observation},
author={Liang Yao and Fan Liu and Delong Chen and Chuanyi Zhang and Yijun Wang and Ziyun Chen and Wei Xu and Shimin Di and Yuhui Zheng},
year={2025},
eprint={2505.18022},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2505.18022},
}