Toolathlon#

Toolathlon 用于评测智能体在真实 MCP 软件环境中的长程工具使用能力。EvalScope 的 toolathlon 集成是官方 Toolathlon evaluation service 的 wrapper,不重新实现 MCP 环境、任务容器、agent loop 或官方评分器。

安装#

pip install evalscope[toolathlon]

EvalScope wrapper 只需要客户端依赖 httpxwebsockets。如果使用官方公共服务,不需要安装完整 Toolathlon 仓库。

服务模式#

EvalScope 支持 Toolathlon 官方服务的 private mode。

在 private mode 中,Toolathlon 服务负责运行任务容器、MCP 环境、agent loop 和评分。EvalScope 会启动本地 WebSocket relay;当服务端需要模型响应时,请求会通过 WebSocket 转回 EvalScope 所在机器,再调用你的本地或内网 OpenAI-compatible endpoint。因此即使 Toolathlon 服务在远端,也可以使用 api_url=http://localhost:8000/v1

官方 Toolathlon client 还支持 public mode,即服务端直接用提交的 API key 调用公共模型 API。EvalScope wrapper 目前固定使用 private mode,让模型 endpoint 和 API key 留在 EvalScope 侧。

官方公共服务#

默认服务是官方公共服务:

  • HTTP service: 47.253.6.47:8080

  • WebSocket proxy: 47.253.6.47:8081

官方公共服务主要用于快速试跑和调试。根据官方文档,它按 IP 在 24 小时窗口内限流:

  • 每个 IP 每 24 小时累计执行时长 180 分钟

  • 每个 IP 每 24 小时 3 次 evaluation request

  • 累计执行时长低于 180 分钟时,不受 3 次请求数限制

  • 累计执行时长超过 180 分钟后,开始应用 3 次请求数限制

如果提交阶段返回 HTTP 503 Service Unavailable,通常表示官方服务忙,因为服务端一次只运行一个 evaluation job。如果返回 HTTP 429,则表示触发了 IP 限流。

快速调试#

建议先用很小的 task_list 调试:

from evalscope import TaskConfig, run_task

task_cfg = TaskConfig(
    model='your-model-name',
    api_url='http://localhost:8000/v1',
    api_key='your-local-api-key',
    datasets=['toolathlon'],
    dataset_args={
        'toolathlon': {
            'extra_params': {
                'task_list': ['find-alita-paper'],
                'skip_container_restart': True,
            }
        }
    },
    limit=1,
)

run_task(task_cfg)

skip_container_restart=True 只建议用于小规模调试。正式评测时应移除它,让官方服务在任务之间重启容器。

自建官方服务#

自建服务可以避开公共服务排队和公共 IP 限流,但它不是一个 docker compose up 就能完成的部署。官方 Docker 镜像 docker.io/lockon0927/toolathlon-task-image:1016beta 主要是任务运行镜像,不包含 Toolathlon evaluation service 所需的所有服务、账号、凭据和评测进程。

启动自建服务前,先按官方 Toolathlon 材料完成环境准备:

  • README.md:安装依赖、Docker/Podman、configs/global_configs.py、应用凭据、本地服务部署和 smoke check

  • global_preparation/how2register_accounts.md:MCP 任务需要的账号、token 和 session

  • configs/global_configs_example.py:复制为 configs/global_configs.py,并配置 podman_or_docker

  • global_preparation/pull_toolathlon_image.sh:拉取官方任务镜像

  • global_preparation/deploy_containers.sh:部署 Canvas、email、WooCommerce、k8s/kind 等本地服务

  • EVAL_SERVICE_README.md:启动官方 eval_server.py HTTP 服务和 private mode WebSocket proxy

完整 Toolathlon 环境准备好后,在 Toolathlon 仓库中启动官方服务:

python eval_server.py 8080 8081 3 10 180

参数含义:

  • server_port:HTTP 服务端口

  • ws_proxy_port:private mode 的 WebSocket proxy 端口

  • max_submissions_per_ip:每个 IP 每 24 小时请求数限制,-1 表示不限

  • max_workers:每个 job 内部最大的 Toolathlon workers 数

  • max_duration_minutes:每个 IP 每 24 小时累计执行时长限制,-1 表示不限

如果是内部自用服务,可以关闭限流:

python eval_server.py 8080 8081 -1 10 -1

在 EvalScope 中使用自建服务#

通过 extra_params 指向自建服务:

from evalscope import TaskConfig, run_task

task_cfg = TaskConfig(
    model='your-model-name',
    api_url='http://localhost:8000/v1',
    api_key='your-local-api-key',
    datasets=['toolathlon'],
    dataset_args={
        'toolathlon': {
            'extra_params': {
                'server_host': 'your.toolathlon.server',
                'server_port': 8080,
                'ws_proxy_port': 8081,
                'workers': 10,
                'task_list': ['find-alita-paper'],
            }
        }
    },
    limit=1,
)

run_task(task_cfg)

如果使用 CLI,把同样的配置放到 --dataset-argstoolathlon.extra_params 下即可。

运维注意点#

  • 官方服务一次只运行一个 evaluation job。workers 控制的是单个 job 内部并行度,不是提交 job 的并发数。

  • 官方服务为了驱动 agent loop 和评分,会接收 prompt、模型响应和工具上下文。

  • 需要保持 client protocol 和官方服务版本一致。当前 EvalScope wrapper 对齐 Toolathlon service protocol 1.3

  • 长期或正式评测建议使用 dedicated official service 或自建服务,不建议依赖共享公共服务。

官方来源: