配置说明
Go server(server/server_config.json)
路径相对于进程工作目录解析。
本地配置文件不入库。
server/server_config.json在.gitignore里,因为含有 LLM key、数据库 DSN 这类敏感项。首次使用先复制模板再改:bashcp server/server_config.example.json server/server_config.json直接改被跟踪的模板文件,
git reset --hard时会被覆盖。
| key | 默认 | env 覆盖 | 说明 |
|---|---|---|---|
host / port | 127.0.0.1 / 8090 | — | 监听地址 |
dataDir | ../data | — | 数据目录,必须和编辑服务的 VIEWER_DATA_DIR 是同一个目录 |
nodeBin / converterScript | node / ../converter/convert.js | — | 转换器调用 |
maxUploadMB | 200 | — | 上传上限 |
webDist | ../web/dist | VIEWER_WEB_DIST | 前端构建产物目录。存在就由 server 托管,缺失时静态路径 503、API 照常 |
pgDSN | "" | VIEWER_PG_DSN | 配置即启用 PostgreSQL,空则用文件存储 |
editServiceURL | http://127.0.0.1:8100 | VIEWER_EDIT_SERVICE_URL | IFC 编辑服务地址 |
cadServiceURL | http://127.0.0.1:8200 | VIEWER_CAD_SERVICE_URL | DXF 编辑服务地址 |
llmAPIKey | "" | VIEWER_LLM_API_KEY | chat agent 的 LLM key。留空则进入离线模式,用确定性 mock,不产生真实回复 |
llmBaseURL | "" | VIEWER_LLM_BASE_URL | OpenAI 兼容端点,如 https://api.openai.com/v1 |
llmModel | "" | VIEWER_LLM_MODEL | 模型名,如 gpt-4o、deepseek-chat |
skillsDir | ../skills/dist | VIEWER_SKILLS_DIR | 正式 skill 集合目录,agent 只面对 dist,不感知开发版本 |
skillVenv | ../skills/.venv | VIEWER_SKILLS_VENV | skill 专用 venv,装法:bash tools/install_skill_venv.sh |
skillCLI | aiplan,aidxfv3,aiifc | VIEWER_SKILLS_CLI | agent 可执行命令的白名单 |
apiToken | "" | VIEWER_API_TOKEN | Bearer 鉴权。留空即关闭,只适合本机开发;生产必须设置 |
corsOrigins | http://localhost:5173,http://localhost:8080 | VIEWER_CORS_ORIGINS | CORS 白名单,逗号分隔 |
最小配置示例:
{
"host": "127.0.0.1",
"port": 8090,
"dataDir": "../data",
"nodeBin": "node",
"converterScript": "../converter/convert.js",
"maxUploadMB": 200,
"webDist": "../web/dist",
"pgDSN": "",
"editServiceURL": "http://127.0.0.1:8100",
"cadServiceURL": "http://127.0.0.1:8200",
"skillsDir": "../skills/dist",
"skillVenv": "../skills/.venv",
"skillCLI": "aiplan,aidxfv3,aiifc"
}鉴权与 CORS
鉴权默认关闭,因为编辑 API 会在沙箱里执行脚本,等于代码执行入口,所以生产环境必须设置 apiToken。设置之后,所有端点都要求 Authorization: Bearer <token>。只有三类只读文件端点豁免,因为 xeokit 和 <img> 标签带不了请求头:
GET /v1/models/{id}/model.xktGET /v1/models/{id}/metadata.jsonGET /v1/models/{id}/issues/{file}
浏览器端把 token 存在 localStorage,键名 aiifc_token。遇到 401 会弹输入框,保存后自动重试原请求。chat 的事件流用 EventSource,没法带自定义头,这一条路径放行 ?token= 查询参数。
两个 Python 编辑服务自身没有鉴权,安全完全靠只监听 127.0.0.1。不要把它们暴露到网络上。
chat agent
对话由 Go 进程内的 Eino agent 驱动,不依赖外部服务。要点:
- LLM 三参见上表。key 留空时用离线 mock,方便测试。
- skill 三项配置:
skillsDir指向正式集合,skillVenv提供 CLI 运行环境,skillCLI是命令白名单。 - 文件工具里 grep 依赖 ripgrep,没装会报错,用
sudo apt install ripgrep装上。 - 编排是主 agent 加子 agent 两层:orchestrator 负责对话和派活,ifc-agent 和 cad-agent 各带自己的 skill 干活,子 agent 的输出分组显示在对话栏里。
- agent 可以中途向用户提问,回答后继续执行。
- 旧的
VIEWER_OPENCODE_URL已退役,设置了也没有效果,可以从部署环境里删掉。
edit-service
| 环境变量 | 默认 | 说明 |
|---|---|---|
VIEWER_DATA_DIR | ../data | 数据目录。必须与 server 的 dataDir 一致,否则编辑请求 404 |
EDIT_SERVICE_PORT | 8100 | 监听端口 |
cad-edit-service
与 edit-service 同构,只多一项流目录配置:
| 环境变量 | 默认 | 说明 |
|---|---|---|
VIEWER_DATA_DIR | ../data | 数据目录,三方必须一致 |
AIDXF_FLOWS_DIR | flows | DXF 沙箱契约层目录 |
CAD_SERVICE_PORT | 8200 | 监听端口 |
沙箱环境变量
script/run 和 script/save 在服务端沙箱里执行脚本。机制见沙箱执行环境,部署相关的变量如下:
| 环境变量 | 默认 | 说明 |
|---|---|---|
SANDBOX_BACKEND | auto | auto、bwrap、rlimit 三选一。生产只有 bwrap,rlimit 仅供测试 |
SCRIPT_RUN_CONCURRENCY | 3 | run/save 并发上限 |
SCRIPT_MAX_FSIZE_BYTES / SCRIPT_MAX_OUTPUT_BYTES / SCRIPT_MAX_PRODUCT_BYTES | 256MiB / 1MiB / 256MiB | 沙箱资源限额 |
SANDBOX_ENV_CACHE_DIR | $XDG_CACHE_HOME/aibim-sandbox-envs | 依赖环境缓存根。不要配到 data/ 或 /tmp 下 |
SCRIPT_ENV_BUILD_TIMEOUT_S | 300 | 依赖环境构建超时 |
脚本可以用 PEP 723 块声明依赖,声明即全量替换默认集。run/save 依赖 uv 二进制,缺失报 503。
PostgreSQL
不配置时,Issue、override、修改记录全部落文件,零外部依赖。配置 DSN 后自动建三张表。模型文件和版本快照始终在文件系统里。
测试要用 VIEWER_TEST_PG_DSN 指向专用测试库,测试会删表。
端口
默认端口一览:server 8090,edit-service 8100,cad-edit-service 8200,web 开发服务器 5173。