AI 能力
本文回答:AI 对话 / AI 绘 CAD / 地图 MCP 协议的 SDK 用法与集成方式。
一、AI 对话(vjchat)
自然语言 → 检索知识库 → 大模型生成代码 → 前端执行并操作地图。
集成(HTML)
<script src="https://vjmap.com/demo/js/vjmap/vjmap.min.js"></script>
<!-- 打开 map 之后 -->
<script>
(async () => {
// 假设 map 已初始化
window.vjmap = vjmap; // vjchat 需要全局 vjmap
if (typeof vjchat !== "object") {
await vjmap.addScript([{ src: "https://vjmap.com/server/_cloud/lib/vjchat.umd.js" }]);
}
const aiChat = vjchat.attachMap(map, vjmap, {
title: "唯杰地图 AI 对话",
theme: { mode: "dark" },
size: { width: 420, height: 500 },
position: { right: 10, top: 100 },
historyChatNum: 0, // 默认不关联历史对话
topK: 5, // 检索知识库条数
scoreThreshold: 0.5, // 相关性阈值
chat: { // 可选:自定义大模型
type: "openai",
model: "gpt-4o",
apiKey: "sk-...",
baseUrl: "https://api.openai.com/v1"
},
onClose: () => { /* closed */ }
});
// aiChat.destroy();
})();
</script>
集成(npm)
npm i vjchat
import { attachMap } from "vjchat";
attachMap(map, vjmap, { title: "AI 对话" });
支持的模型类型
type ChatOptions =
| { type: "openai", model, apiKey, baseUrl? }
| { type: "ollama", model, baseUrl };
提问技巧
- 命中知识库中的函数说明(例如
addMarker、getMapGeoBounds)。 - 多需求用逗号分开。
- 复杂任务分步骤(1. ... 2. ...)。
二、AI 绘 CAD(aidraw)
把"自然语言 → CAD 图形",通过 createMap 生成一张临时图。
- 提示 AI 生成
filedocJSON(格式见 upload-create-map)。 svc.updateMap({ mapid: vjmap.getTempMapId(30), filedoc, mapopenway })创建临时图。- 前端
map.switchMap({ mapid })切过去显示。
详见 https://vjmap.com/guide/aidraw.html。
三、地图 MCP 协议
基于标准 MCP (Model Context Protocol) 的地图工具集。Cursor / Trae / Cherry Studio 等通用 AI IDE 可直接通过 URL 接入。
MCP URL
https://vjmap.com/server/ai/mcp
?sessionId={sessionId}
&include_categories=query,map,draw,custom
&token={token}
无前端交互时 sessionId 可省。
后台服务 MCP(/server/mcp)
另一个独立入口:https://vjmap.com/server/mcp(Streamable HTTP),把图纸管理/查询/导出能力以 cad_* 工具直接给 AI 客户端,不依赖前端页面。
- 鉴权:
Authorization: Bearer <token>、头token或?token=。 - 工具筛选:
?tools=query,map(白名单,分类或工具名)、?exclude=admin(黑名单);默认加载 map/query/export/admin,draw/geom/symbol/workspace 需显式写进tools。 ?workspace=<名称>绑定本次连接的默认工作区。- 私有化部署默认关闭,需在服务配置里
mcp.enable=true;写操作工具另需mcp.enable_write=true。详见官方 aimcp。
内置工具(后端)
| 工具 | 作用 |
|---|---|
listmaps |
列出地图 |
createMap |
创建地图 |
deletemap |
删除地图 |
getMapImage |
生成 PNG |
fullSearch |
全文搜索 |
queryFeatures |
四种查询模式 |
extractTable |
自动提表格 |
sqlDocHelper |
提供 SQL 辅助文档 |
createDwgDocHelper |
提供图形定义辅助 |
内置工具(前端 SDK 注册)
| 工具 | 作用 |
|---|---|
map_get_info |
当前地图信息 |
map_open_or_switch |
打开 / 切图 |
map_view_control |
缩放 / 平移 / 旋转 |
map_execute_code |
执行任意 JS(沙箱) |
map_draw_geojson |
绘制 GeoJSON |
map_delete_drawn_features |
删绘制 |
map_create_markers |
批量建 Marker |
map_delete_markers |
删 Marker |
前端 SDK(vjmap-mcp-sdk)
npm i vjmcpsdk
import vjmap from "vjmap";
import { initializeMCP, createTool, z } from "vjmcpsdk";
const mcp = await initializeMCP({
apiBase: map.getService().baseUrl(),
autoConnect: true,
mapInstance: map
});
await mcp.registerMapTools();
// 自定义工具
const schema = z.object({
bounds: z.array(z.number()).length(4).describe("[minX,minY,maxX,maxY]")
});
const tool = createTool("map_flash_position", "闪烁显示指定范围", schema, "custom");
mcp.registerTool(tool, async ({ bounds }) => {
await flashPos(bounds); // 自己实现的动画
return { content: [{ type: "text", text: "已闪烁" }] };
}, "custom");
await mcp.getServiceManager().registerToolsToServer();
Cursor / Trae 接入
在 mcpServers 里加:
{
"mcpServers": {
"vjmap": {
"url": "https://vjmap.com/server/ai/mcp?include_categories=query,map&token=eyJhbGci..."
}
}
}
然后直接在 IDE 聊天窗说:"找出图里所有半径 > 10 的红色圆并在地图上闪烁显示"。
四、后端 AI 配置
data/ai/aisvr_config.yaml 配置模型、API Key、知识库路径、速率限制。
五、权限 / 安全
MCP 支持 include_categories / exclude_categories / include_tools / exclude_tools 精细控制工具开放度。生产环境建议 exclude_categories=delete 禁止删除。
六、常见坑
- vjchat 提问 AI 回答代码执行失败 → 提问不够精确,AI 匹配错了知识。打开"知识库搜索结果确认"手动选相关文档。
- MCP sessionId 没有 → 前端工具(
map_*)无法工作;服务端工具正常。 - 自定义工具注册后 IDE 看不到 → 忘了
registerToolsToServer()。 - OpenAI 自定义 baseUrl 但走代理超时 → 检查代理是否支持 SSE / 流式。