关于 dashAI (unofficial)
dashAI (unofficial) 是面向运行中 dashAI 机器学习工作台的 MCP 服务,供 Agent 查看数据集、训练和评估模型。它覆盖核心建模流程,且不提供删除工具。
主要功能
- 01查看数据集和组件
- 02异步训练模型
- 03跟踪任务进度
- 04查看运行记录与指标
- 05执行预测并查看类别计数
适用场景
- 01建模前检查数据集
- 02训练并比较模型运行结果
- 03跟踪耗时较长的训练任务
MCP 相关
它向 MCP 客户端提供 10 个工具,用于查询数据集和组件、训练模型、跟踪任务、检查运行记录及请求预测。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx dashai-mcpDASHAI_BASE_URLURL of the dashAI backend. Defaults to http://localhost:8000.DASHAI_ALLOW_REMOTESet to 1 to allow a non-localhost backend. dashAI's API has no authentication, so pointing this server at a remote host exposes an ML backend with no door on it — read the README before enabling.DASHAI_TIMEOUTSeconds to wait per request. Defaults to 30.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
10收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| params | any | 是 |
详细介绍
dashai-mcp
一个适用于 dashAI 的 MCP 服务。dashAI 是由智利大学(FCFM)牵头的开源机器学习工作台,由 DCC UChile 和 UTFSM 的学生与 CENIA 和 IMFD 共同打造。
非官方且独立。 这是一个第三方项目。它与 dashAI 项目或开发该项目的机构 无关联,也未获其认可或维护。
它让 Agent 能像人通过 GUI 使用 dashAI 一样操作:查看数据集、了解可用模型、训练模型、跟踪排队中的任务,并读取指标。
"Train a random forest on dataset 3 predicting 'species' and tell me the F1"
状态
v0.2.2 — 已通过针对运行中的 dashAI 0.9.7.post1 的验证。 确定性测试
(包括 predict 两步流程)以及实时运行:dashai_train_model →
dashai_job_status → 带指标的 dashai_get_run,以及已完成的 dashai_predict →
dashai_job_status。
实时表格数据运行(种子 students)
仅使用公开 dashAI 种子数据。目标为 placement_status(多数类占比约 83%)。
未将 exam_score 纳入输入(它会泄露标签)。数据集按 70/15/15 划分。目标指标:BalancedAccuracy —— 多数类上的 Accuracy 和 F1 都会造成误导。
| 模型 | 测试集 BalancedAccuracy | 测试集 MCC | 测试集 F1 | 测试集 Accuracy |
|---|---|---|---|---|
DummyClassifier(most_frequent) | 0.500 | 0.000 | 0.906 | 0.827 |
RandomForestClassifier(class_weight=balanced,深度 8,100 棵树) | 0.851 | 0.591 | 0.900 | 0.845 |
LogisticRegression(class_weight=balanced,L2) | 0.873 | 0.624 | 0.905 | 0.853 |
Dummy 模型总是预测多数类,因此 F1 得分最高。在线性模型真正衡量类别区分能力的指标上,它优于随机森林。每一行都来自各自的 70/15/15 划分(测试行并不相同)——但这已经足以说明不该再默认使用随机森林。如果客户端在这里仅报告 F1,那就是在误导。
在已完成的随机森林运行上调用 dashai_predict,返回了 prediction_id,且任务已完成。该操作评估的是模型训练所用的同一个种子数据集,而不是留出的文件——不要将其视为泛化能力检查。dashai_get_prediction 仅返回 {n, n_classes, class_counts}。
实时图像运行(种子 cifar10-subset)
公开种子数据:200 张图像,青蛙与卡车(各 100 张)。LeNet5ImageClassifier,CPU,32×32。按 70/15/15 划分 → 测试集 n=30。随机猜测基准为 0.5。
| 运行 | shuffle/stratify | 训练集 BalAcc | 验证集 BalAcc | 验证集 MCC | 测试集 BalAcc | 测试集 MCC |
|---|---|---|---|---|---|---|
| 10 个 epoch(受污染) | 关闭 | 0.879* | 0.467* | 0.000 | 0.633* | 0.000 |
| 40 个 epoch(受污染) | 关闭 | 0.950* | 0.733* | 0.000 | 0.867* | 0.000 |
40 个 epoch(cifar10-lenet5-40ep-stratified) | 开启 | 1.000 | 0.767 | 0.544 | 0.900 | 0.816 |
*这是 Accuracy,而非 BalancedAccuracy——在仅含单一类别的验证集/测试集上,两者会塌缩。该种子数据的随机猜测基准为 0.5。Dummy 表格分类器不适用(图像任务)。
图像的处理流程正常。0.867 不是有效结果:dashAI 默认使用 shuffle=False,因此验证集/测试集里有 30 张卡车,却没有青蛙。在仅含单一类别的划分上,sklearn 得出的 MCC 为 0。此服务发送 shuffle=true + stratify=true 后,验证集/测试集都包含两个类别,MCC 不再为 0。训练集达到 1.0(记住了 140 张图像)。验证集 0.767 是较为可信的数值;测试集 0.900 则是仅基于 30 行数据的偶然结果。不要将其发布为排行榜成绩。
针对实时实例进行验证时,发现了dashAI 文档与实际行为之间的差异。每一处差异都有对应的回归测试。第六处问题——shuffle=False 时采用顺序划分——只有在实时测试中才显现,因为 MCC 变为 0,而 Accuracy 却在变化。
dashai_predict 向 PredictJob 发送 run_id 的问题也只有实时测试时才显现(KeyError: 'prediction_id'),此前没有 predict 测试。
安装
pip install dashai-mcp
# or: uv pip install dashai-mcp
在你的 MCP 客户端配置中:
{
"mcpServers": {
"dashai": {
"command": "dashai-mcp"
}
}
}
dashAI 必须单独运行(通过 dashai 或桌面应用)。默认会在 http://localhost:8000 查找它。
工具
| 工具 | 功能 |
|---|---|
dashai_server_info | dashAI 是否正在运行?有多少个数据集和运行记录 |
dashai_list_datasets | 列出已加载的数据集 |
dashai_describe_dataset | 一次调用即可获取列、类型和样例 |
dashai_list_components | 可用的模型、指标、任务和优化器 |
dashai_train_model | 训练。 将任务加入队列,并返回 job_id + run_id |
dashai_job_status | 任务进度:not_started / started / finished / error |
dashai_list_runs | 已记录的运行,用于比较模型 |
dashai_get_run | 获取某次运行的配置和指标 |
dashai_predict | 使用已完成运行的模型进行预测 |
dashai_get_prediction | 获取已完成预测的类别计数——绝不返回行数据 |
dashAI 文档(或默认设置)中有误的六处
通过在真实实例上运行发现。如果你要为此 API 编写客户端,这些问题会让你吃尽苦头:
| 文档所述 | 代码实际行为 |
|---|---|
?select_types=["Model","Metric"] | 必须使用重复参数:?select_types=Model&select_types=Metric。JSON 数组会返回 422。 |
带 JSON 正文的 POST /job/ | 它使用的是表单数据,其中 kwargs 被序列化为 JSON 字符串。该路由自己的 openapi.json 未声明 requestBody,因为端点会手动解析 request。 |
将 splits 作为对象传递 | 它以JSON 字符串形式传递:Pydantic 架构将其声明为 str。 |
optimize(model_class, search_space, X, y, n_trials) | 实际签名是 optimize(model, input_dataset, output_dataset, parameters, metric),而且 model 是一个实例,不是类。 |
在任务中按 run_id 预测 | PredictJob.run 要求 kwargs["prediction_id"]。GUI 会先执行 POST /predict/({run_id, dataset_id}),然后才将任务加入队列。向任务传入 run_id 会触发 KeyError: 'prediction_id'。 |
数据集划分的 shuffle / stratify | prepare_for_model_session 默认将两者都设为 False。对于按类别排序的种子数据集(cifar10-subset 中先有 100 个 frog,再有 100 个 truck),按 70/15/15 划分会导致验证集和测试集只有一个类别。准确率仍会变动;sklearn 的 MCC 定义为 0。此服务会发送 shuffle=true,并在分类任务中发送 stratify=true。 |
组件注册表还有 13 种类型,而非文档所说的四种:Task、GenerativeTask、Model、GenerativeModel、DataLoader、DatasetSource、Metric、Optimizer、Job、LocalExplainer、GlobalExplainer、Explorer、Converter。
此外,GET /run/{id} 会返回包含完整索引列表的 split_indexes:对于包含 10,000 行的数据集,该字段有 59 KB,占响应的 99%。此服务会将其替换为每个数据集划分的计数,使响应缩减到约 1 KB。
三项设计决策
1. 十个工具,而非 142 个
dashAI 提供 142 个 REST 端点。为每个端点生成一个工具只是机械操作,而且是个错误:拥有 140 个工具的模型会耗费上下文来读取目录,选择也会更差。这十个工具涵盖了实际工作流程。
2. dashai_train_model 合并三次调用
在原始 API 中,训练需要按顺序进行多次调用:
POST /model-session/ → creates the experiment
POST /run/ → creates the run
POST /job/ → enqueues the ModelJob
还需要提供 GUI 会自行填入、但文档未说明的必需字段——plot_history_path、plot_slice_path、plot_contour_path、plot_importance_path。此外,splits 以 JSON 字符串而非对象的形式传递,尽管 dashAI 文档将其显示为对象:后端的 Pydantic 架构将其声明为 str。这类细节正是 Agent 在调用原始 API 时失败的原因。
这里将其合并为一次调用,而且不会阻塞:训练可能需要数小时,因此会立即返回 job_id,并通过 dashai_job_status 轮询进度。
dashai_predict 对 GUI 的两步流程也做了同样处理:先执行 POST /predict/,再执行带有 prediction_id 的 `POST /job/``。
3. 没有工具会删除任何内容
dashAI 的 API 没有身份验证——已逐个检查端点。对于以本地为先的工具来说,这样设计是合理的,但这也意味着,一句被误读的话和不可逆的 DELETE /dataset/{id} 之间没有任何屏障。删除操作通过 GUI 执行,操作前可以查看要删除的内容。
出于同样的原因,服务拒绝指向非本地主机:
DASHAI_BASE_URL points to 'ml.example.com', which is not local, and dashAI's API
has no authentication: exposing it to the network leaves the backend open to
anyone who can reach it.
如果目标主机通过其他方式受到保护,可以使用 DASHAI_ALLOW_REMOTE=1 有意关闭此限制。
配置
| 变量 | 默认值 | 用途 |
|---|---|---|
DASHAI_BASE_URL | http://localhost:8000 | 后端地址 |
DASHAI_ALLOW_REMOTE | (否) | 允许使用非本地主机(见上文) |
DASHAI_TIMEOUT | 30 | 每个请求的等待秒数 |
dashai_get_prediction 需要在 MCP 进程中安装 pyarrow,才能将 Arrow 文件转换为类别计数(运行 pip install 'dashai-mcp[counts]',或将 MCP 安装到与 dashAI 相同的环境中)。若未安装,该工具仍会返回状态信息,但不会导出行数据。
开发
python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest tests/ -q
测试使用 respx 模拟 HTTP 响应:无需 dashAI 实例或凭据。它们测试的是接口约定——会发出哪些调用、调用顺序、请求正文内容,以及发生故障时会告知 Agent 什么信息。
针对运行中的实例进行验证
只针对模拟响应测试过的客户端仍只是一个假设。scripts/smoke_live.py
会通过 Agent 使用的相同代码路径,针对实际运行中的 dashAI 执行每个工具:
python scripts/smoke_live.py # read-only tools
python scripts/smoke_live.py --train # + a real train -> predict loop
--train 循环会在目标实例上创建模型会话、运行和预测——请将其指向专用的测试实例,而非生产实例。只有每个被测试的工具都正常工作时,退出代码才为 0。每个版本都会通过这种方式进行验证;最近一次运行时所针对的版本,会由 dashai_server_info 在 compatibility.verified_against 中报告。
API 兼容性检查
dashAI 未提供版本端点,因此 dashai_server_info 会读取实例的 openapi.json,并将 API 接口与此服务实际调用的接口进行比较:端点是否仍然存在,以及 POST /model-session/ 是否要求此服务未发送的字段。检查结果会通过 compatibility.status 返回,可能是 ok、mismatch(会指出具体差异)或 unknown(无法读取架构;其他功能仍可能正常工作)。这项检查有实际用途:dashAI 的开发分支已经为模型会话添加了 evaluation_strategy 字段。
关于 SDK
需要 MCP Python SDK 2.x。2.0 版本移除了 mcp.server.fastmcp;现在使用 mcp.server.mcpserver.MCPServer,注释则使用 ToolAnnotations 对象,而非字典。大多数教程仍展示 1.x API。
许可证
MIT,与 dashAI 相同。关于关联关系,请参阅顶部的说明。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。