Skip to content

Commit 408e7a1

Browse files
BCeZndengwx2026
andauthored
support Agent Run (alibaba#681)
* add docs * add job impl * feat: add harbor demo and related configs * refactor: add oss registry info fields and improve job script rendering comments * chore: disable httpx logging in harbor demo script * docs: translate comments and docstrings to English in harbor example and job modules * feat: add sandbox config and agent result models * refactor: update imports and add new model classes for job and trial results --------- Co-authored-by: dengwx2026 <dengwx2026@gmail.com>
1 parent 83ed1a0 commit 408e7a1

File tree

23 files changed

+3861
-1
lines changed

23 files changed

+3861
-1
lines changed

docs/dev/agent/README.md

Lines changed: 688 additions & 0 deletions
Large diffs are not rendered by default.

docs/dev/agent/plan.md

Lines changed: 1558 additions & 0 deletions
Large diffs are not rendered by default.

examples/harbor/harbor_demo.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env python3
2+
"""Harbor sandbox demo.
3+
4+
Run Harbor benchmark tasks inside a ROCK sandbox using a YAML config file.
5+
6+
Usage:
7+
python examples/harbor/harbor_demo.py -c examples/harbor/job_config.yaml
8+
python examples/harbor/harbor_demo.py -c examples/harbor/tb_job_config.yaml -t mailman
9+
"""
10+
11+
import argparse
12+
import asyncio
13+
import logging
14+
15+
from rock.sdk.agent import Job, JobConfig
16+
17+
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
18+
logger = logging.getLogger(__name__)
19+
# disable httpx
20+
logging.getLogger("httpx").setLevel(logging.WARNING)
21+
22+
23+
def parse_args() -> argparse.Namespace:
24+
parser = argparse.ArgumentParser(description="Run Harbor tasks inside a ROCK sandbox")
25+
parser.add_argument("-c", "--config", required=True, help="Path to JobConfig YAML file")
26+
parser.add_argument("-t", "--task", default=None, help="Task name to run (overrides config)")
27+
return parser.parse_args()
28+
29+
30+
async def async_main(args: argparse.Namespace) -> None:
31+
config = JobConfig.from_yaml(args.config)
32+
33+
# Override task_names if specified via CLI
34+
if args.task and config.datasets:
35+
config.datasets[0].task_names = [args.task]
36+
37+
result = await Job(config).run()
38+
39+
logger.info(f"result: {result}")
40+
logger.info(f"Job completed: exit_code={result.exit_code}, score={result.score}")
41+
if result.trial_results:
42+
for trial in result.trial_results:
43+
logger.info(f" {trial.task_name}: score={trial.score} ({trial.status})")
44+
if trial.exception_info:
45+
logger.info(
46+
f" error: {trial.exception_info.exception_type}: {trial.exception_info.exception_message}"
47+
)
48+
49+
50+
if __name__ == "__main__":
51+
args = parse_args()
52+
asyncio.run(async_main(args))
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# ── Rock 扩展字段(控制沙箱生命周期)──────────────────────────────────
2+
sandbox_config:
3+
base_url: "<your-rock-base-url>"
4+
xrl_authorization: "<your-xrl-auth-token>"
5+
image: "<your-harbor-image:tag>"
6+
cluster: "<your-cluster>"
7+
memory: "32g"
8+
cpus: 8
9+
startup_timeout: 1800
10+
auto_clear_seconds: 7200
11+
12+
auto_stop_sandbox: false
13+
14+
# ── Harbor 原生字段(序列化为 YAML 传给 harbor jobs start -c)────────
15+
agents:
16+
- name: "swe-agent"
17+
model_name: "custom_openai/<your-model>"
18+
env:
19+
OPENAI_API_KEY: "<your-openai-api-key>"
20+
OPENAI_BASE_URL: "<your-openai-base-url>"
21+
22+
datasets:
23+
- name: "princeton-nlp/SWE-bench_Verified"
24+
registry:
25+
split: "test"
26+
oss_access_key_id: "<your-oss-access-key-id>"
27+
oss_access_key_secret: "<your-oss-access-key-secret>"
28+
oss_bucket: "<your-oss-bucket>"
29+
oss_dataset_path: "<your-oss-dataset-path>"
30+
oss_region: "<your-oss-region>"
31+
oss_endpoint: "<your-oss-endpoint>"
32+
task_names:
33+
- "astropy__astropy-7606"

rock/sdk/agent/__init__.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from rock.sdk.agent.job import Job
2+
from rock.sdk.agent.models.job.config import (
3+
JobConfig,
4+
LocalDatasetConfig,
5+
OrchestratorConfig,
6+
OssRegistryInfo,
7+
RegistryDatasetConfig,
8+
RemoteRegistryInfo,
9+
RetryConfig,
10+
)
11+
from rock.sdk.agent.models.job.result import JobResult, JobStatus
12+
from rock.sdk.agent.models.metric.config import MetricConfig
13+
from rock.sdk.agent.models.trial.config import (
14+
AgentConfig,
15+
ArtifactConfig,
16+
EnvironmentConfig,
17+
TaskConfig,
18+
VerifierConfig,
19+
)
20+
from rock.sdk.agent.models.trial.result import (
21+
AgentInfo,
22+
AgentResult,
23+
ExceptionInfo,
24+
TrialResult,
25+
VerifierResult,
26+
)
27+
28+
__all__ = [
29+
"Job",
30+
"JobResult",
31+
"JobStatus",
32+
"TrialResult",
33+
"VerifierResult",
34+
"AgentInfo",
35+
"AgentResult",
36+
"ExceptionInfo",
37+
"JobConfig",
38+
"RegistryDatasetConfig",
39+
"LocalDatasetConfig",
40+
"OssRegistryInfo",
41+
"RemoteRegistryInfo",
42+
"OrchestratorConfig",
43+
"RetryConfig",
44+
"AgentConfig",
45+
"EnvironmentConfig",
46+
"VerifierConfig",
47+
"TaskConfig",
48+
"ArtifactConfig",
49+
"MetricConfig",
50+
]

0 commit comments

Comments
 (0)