iml-work

agent
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Fail
  • child_process — Shell command execution capability in iml-fde-studio/build/afterPack.cjs
  • execSync — Synchronous shell command execution in iml-fde-studio/build/afterPack.cjs
  • exec() — Shell command execution in iml-fde-studio/src/main/browse-executor.ts
  • process.env — Environment variable access in iml-fde-studio/src/main/ipc/admin.ts
  • network request — Outbound network request in iml-fde-studio/src/main/ipc/admin.ts
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

企业「工作分身」系统:员工电脑上跑一个能在 OA/CRM/ERP 里真正动手的 AI 分身 — 本体语义驱动 · 存量系统无侵入连接(browse-use) · 写操作确认+沙箱隔离可审计

README.md

iML Work

企业「工作分身」系统 —— 员工电脑上跑一个能在真实 OA / CRM / ERP 里真正动手的 AI 分身。

License: MIT TypeScript Java 21 Electron Spring Boot 3.3 PostgreSQL + pgvector last commit

iML Work · 客户端 × 管理后台 功能矩阵

读 OA 待办、审批流转、查 CRM 客户、写周报、生成 Word/PPT。写操作动手前先请示,凭证从不离开员工本机。

系统分四个端,外加一层四端共用的业务语义模型:

目录 职责 技术栈
iml-work-client 员工桌面客户端,分身本体 Electron + React + better-sqlite3
iml-work-admin/admin-backend 管理后端:岗位、技能、本体、知识库、审计 Java 21 / Spring Boot 3.3 / PostgreSQL 17 + pgvector
iml-work-admin/admin-frontend 管理前端 React + TypeScript + Vite
iml-fde-studio FDE 工作台:接系统、建模、造技能 Electron + React
iml-mock-oa 演示用 Mock OA / CRM / ERM Node(一进程起 8090/8091/8092)

分工一句话说完:管理平台定义,客户端执行,FDE 工作台构建。

flowchart LR
    FDE["iml-fde-studio<br/>录制 · 建模 · 造技能"] -->|发布技能 / 本体| ADMIN["iml-work-admin<br/>岗位 · 技能 · 知识 · 审计"]
    ADMIN -->|下发岗位 / 技能 / 本体| CLIENT["iml-work-client<br/>理解 · 确认 · 执行"]
    CLIENT -.->|Trace / 业务事件回传| ADMIN
    CLIENT -->|本人登录态读写| BIZ["企业业务系统<br/>OA / CRM / ERP / 桌面应用"]
    CLIENT -->|代码执行| BOX["Docker 沙箱(云端 / 本机可切换)<br/>一次性容器,跑完即毁"]
    ADMIN --- INFRA[("PostgreSQL + pgvector<br/>docling-serve · bge-m3")]

能做什么

普通 AI 工具停在「聊天」,iML Work 的分身能在真实企业系统里动手。支撑它的是三条主线——听懂业务语义、接得上存量系统、动手前过得了闸。三条主线各自怎么实现,见下文怎么做到的

本体 Ontology · 业务语义层

把用户的话解析成「对象 + 动作」,用企业语义驱动执行,而不是靠关键词硬猜。一个业务名词不再是孤立的词,而是接入它的关联对象与上下游链路,按企业流程推理执行。

红线:只存 Schema + 对象引用 + 业务事件;实例数据现查现用,不落库、不上传。

存量系统连接器 · 类似技能录制

把对存量系统(OA / CRM / ERP)的一次操作录一遍,沉淀成可复用动作,录制即对接。核心是 browse-use:没有 API 也能无侵入接入,员工在对话框里就能跨多个系统连续操作,页面小改也能自适应回放。

红线:凭证 / 登录态只在本地受管浏览器,平台只登记地址、不存密码。

安全运行 · 确认 · 隔离 · 不出域

写操作一律过闸:确认卡列明系统、真实对象、动作、字段,人工点头后签发一次性令牌,只对这一笔有效。代码执行送进一次性容器(跑完即毁、默认断网、限 CPU/内存),拿不到凭证也看不到宿主。

红线:读不到的对象绝不虚构,单号、金额、人名一个都不编。

预置技能

装完即用的一批基础能力,构成「分身能干什么」的底盘。这些技能不可删除——删掉任一个都会在能力面上留个洞。

技能 干什么 建立在什么之上
docx pptx xlsx pdf 生成与编辑 Word / PPT / Excel / PDF,含批注、改订、版式 Anthropic Skills 的技能包(SKILL.md + Python 脚本),在沙箱里跑
deep-research 多轮联网检索 → 交叉核对 → 缺口补查 → 带引用的调研报告 客户端内置引擎;算法骨架改造自 dzhng/deep-research(MIT)
a-stock-data A 股行情、财务、龙虎榜、资金流、研报取数与分析 a-stock-data(作者 Simon 林);沙箱内 mootdx / pandas / stockstats
image-gen 文生图:配图、插画、海报底图 客户端引擎经企业网关调用生成模型,产物落工作空间
video-gen 文生视频:短片段、演示动画(异步任务轮询) 同上
skill-creator 一句话说清要什么 → 生成新技能草稿 平台自带的技能创作引擎

两类技能的执行面完全不同:带脚本的(文档四件套、股票取数)送进沙箱跑,网络与资源都受限;IML-ENGINE 标记的(调研、图片、视频)走客户端内置引擎——它们要么需要联网多跳、要么需要厂商密钥,而沙箱两样都不给。

第三方技能可以从 GitHub 目录直接装,导入前强制安全扫描;对话里说一句「装个 xxx」也能装,同样过扫描与人工签字。

界面一览

真实运行截图(演示数据 · Mock OA)。按「员工怎么用 → 本机这一侧管什么 → 管理员怎么治理」三段看。

一、员工客户端

打开就是一个能干活的同事 —— 查资料、写文档、跑业务技能、联网检索、录入/审批,直接说需求

客户端 · 新会话

一条真实工作流:进 OA 读待办 → 写操作人工确认 → 本体驱动执行。

① 读存量系统 —— 分身 browse 进企业 OA,点开「统一待办」读出合同审批列表,执行轨迹逐步可查

客户端 · 读 OA 待办

② 写操作确认闸 —— 敏感写操作前弹出确认卡,人工点「确认并提交至企业系统」才落笔

客户端 · 写操作人工确认

③ 本体驱动执行 —— 消解成 OA.ApprovalTask.approve,状态机 pending → approved,对象消解与写入值全程留痕

客户端 · 本体执行

再看产出侧:取数分析、文档交付、多模态生成。

④ 取数即分析 —— 龙虎榜数据实时直采,产出的是带结论的分析而不是一张原始表

客户端 · A股取数分析

⑤ 生成交付物 —— 联网检索 + 行情直采,一句话产出 PPT / Word 汇报材料

客户端 · 生成 PPT/Word

⑥ 多模态生成 —— 文生图与文生视频,产物直接落工作空间(不是给一条几小时后失效的外链)

客户端 · 图片与视频生成

⑦ 对话里装技能 —— 说一句「装个 xxx」即可;安全扫描结论、落库状态、待办的下一步都如实告诉你

客户端 · 对话安装技能

二、本机这一侧:员工自己能控的开关

安全沙箱 —— 代码跑云端还是本机由你选;本机模式与云端完全同一镜像,数据不出机、断网也能跑

客户端 · 安全沙箱

语音输入 —— 按本机配置推荐 whisper 档位;录音与转写全程只在这台设备上完成,音频绝不上传

客户端 · 语音输入

三、管理后台:定义、治理、看得见

运行总览 —— 数智资产、执行漏斗(接收→安全通过→执行成功→自动完成)、任务趋势与模型消耗一屏尽览

管理台 · 运行总览

本体建模 —— 对象 / 动作 / 状态机 / 关系,四端共用的企业语义层(OA / CRM / ERM / 生产域)

本体建模 · Ontology

岗位专家 —— 定义岗位分身职责,从技能中心装配浏览器自动化 / 代码 / 知识技能

岗位专家与自动化技能

技能中心 —— 技能上架、版本、风险等级与岗位绑定;第三方技能包导入前强制安全扫描

技能中心

知识中心 —— 文档解析入库、向量检索、审批准入;个人文档可提名进企业库

知识中心

模型网关 —— 客户端只按档位请求(标准/推理/视觉),由中转站决定实际通道;图片/视频生成走独立通道。员工能否自配模型是一个可关的开关

管理台 · 模型网关

安全沙箱 —— 镜像、配额、并发与容器实时监控(只列沙箱容器,不混入常驻基础服务)

安全沙箱监控

审计追溯 —— 每次任务的全链路 Trace:路由到哪、每步干了什么、风险等级、最终状态,可逐条下钻

审计追溯 · AgentTrace

业务系统接入 —— 只登记地址与可达状态,不收密码;登录态留在员工本机的受管分区

业务系统接入

跑起来

开发环境一条命令,依次拉起 PostgreSQL、后端(:8080)、管理前端(:3000)、Mock OA:

bash scripts/dev.sh

桌面端各自启动:

cd iml-work-client && npm run dev     # 员工客户端
cd iml-fde-studio  && npm run dev     # FDE 工作台

沙箱、docling 文档解析、bge-m3 向量模型跑在 Docker 上,也是一条命令:

bash scripts/docker-services.sh up

首次启动自动播种初始数据:一个演示岗位「通用工作助理」+ 9 个预置技能(深度调研 / A股分析 / docx·pptx·xlsx·pdf / 图片视频生成 / skill-creator)+ OA·CRM 本体建模示例。初始账号:

账号 密码 登录哪里
admin admin123 管理后台 http://localhost:3000
demo demo123 桌面客户端、FDE 工作台

环境准备、模型接入、常见坑等完整说明见 开发与启动指南

有个坑值得单独提醒:向量模型缺失时系统不报错,检索会静默退化成字面匹配、知识库形同虚设——部署时务必先核验它就绪。

怎么做到的

上面三条主线,在工程上对应下面三组设计——听懂(本体 + 路由)、动手(两个平面 + 执行循环)、可信(过闸 + 留痕 + 不出域)。

一、听懂:本体驱动,不靠关键词硬猜

业务本体是地基

对象、属性、状态机、动作、事件,建模一次四端共用。「审批宝钢合同」不靠关键词硬猜,而是消解成 ApprovalTask.approve 加一个真实读到的对象。金额、风险阈值这类策略挂在对象状态上。平台只存 Schema 和对象引用,实例数据现查现用,不落库。

分身怎么听懂人话

路由分层,命中即走:本体消解 → 关键词快路径 → 模型意图路由(一次可选多个技能,比如"要 Word 报告和 PPT")。都不中就退回问答,且只根据真实读到的内容作答。

二、动手:两个平面 + 一个循环

执行分两个互不接触的平面

本地可信平面在员工本机:用本人登录态操作 OA/CRM/ERP 和桌面应用,浏览器登录态按系统隔离分区,有心跳保活。凭证和业务数据只在这一面。

沙箱平面跑不可信代码:代码执行型技能送进一次性容器,跑完即毁,默认断网,限 CPU/内存/超时,有并发闸。容器拿不到凭证,也看不到宿主文件。执行位置可切换——云端(公司级 Docker,默认)或本机 Docker(与云端完全同一镜像,数据不出机、断网可用;镜像由平台资源中心一键下发,本机无 Docker 时可一键安装 colima)。无论在哪跑,不可信代码永远不落员工的桌面环境。

技能本身只含步骤和脚本。平台登记业务系统只记地址和可达状态,不收密码。

执行内核:一个循环 + 一张工具表

模型在一个 function-calling 循环里自主决策——联网检索、浏览网页/业务系统(带本人登录态)、查知识库、跑沙箱代码、调用业务技能,全是它工具表里的牌。几件配套的事让它像个真同事:

flowchart TB
    IN["用户说一句话"] --> GATE1{"关键要素齐了吗"}
    GATE1 -->|缺| ASK1["澄清卡:补齐再开跑"]
    ASK1 --> ROUTE
    GATE1 -->|齐| ROUTE

    ROUTE["路由分层<br/>本体消解 → 关键词快路径 → 模型意图"] --> LOOP

    subgraph LOOP["AgentCore 执行循环(≤14 轮 / 墙钟预算)"]
        direction TB
        THINK["模型决策<br/>要么给答案,要么点工具"] --> PICK{"调工具?"}
        PICK -->|否| DONE
        PICK -->|是| PERM{"权限闸"}
        PERM -->|只读档拦写操作| DENY["拒绝并回灌原因"]
        PERM -->|写操作| SIGN["确认卡 + 一次性签名令牌"]
        PERM -->|只读工具| RUN
        SIGN --> RUN["执行工具"]
        DENY --> THINK
        RUN --> OBS["观察回灌"] --> THINK
    end

    LOOP --- TOOLS["工具表<br/>web_search · read_page · browse<br/>python 沙箱 · run_skill · 知识库<br/>ask_user · install_skill"]

    DONE["合成答复"] --> OUT["答复 + 交付物 + 来源卡"]
    DONE --> TRACE[("AgentTrace<br/>全链路可回放")]
  • 中途会问ask_user):缺出发地、日期、金额这类关键信息时弹表单卡(日期给日历控件、候选给点选、末尾带补充说明框),你回答后同一轮继续跑,不再是"一问一答"。
  • 讨论档出方案:只读档下侦查完毕产出行动方案卡,点「按此执行」自动切档带着方案继续——对齐 Claude Code 的 Plan 模式。
  • 写操作确认可批量:同类写动作首次签名时可勾选"本任务内不再逐条确认",授权随任务结束失效,每次放行都留审计。
  • 上下文可视:输入框旁的圆环显示上下文占用与会话 token 累计(计费审计同源的真实用量),点击即压缩早前轮次继续。
  • 看得懂图:截图、扫描件、图表直接发给分身,自动切视觉档识别。

技能从录制来,但不是录制回放

FDE 录制只做示范采集,落库的是语义脚本 DSL 加 SOP,按 label、可见文本、角色定位元素,不是坐标和 nth-of-type。页面小改不至于技能报废。捕获面覆盖 shadow DOM、富文本、radio/checkbox 组、文件上传、回车提交,门户点开新窗口、表单嵌 iframe 也照录照放。

录制值不焊死:录完自动识别哪些值是业务数据(点了列表行、检索选择、日期金额单号形态),出建议由作者逐项采纳成 {{参数}}——参数能注入到填写值,也能注入到"点谁"。录不稳的交互降级成一条 AI 指令步(每技能最多 3 步),回放时模型现场只完成那一步。上架前可以「安全试回放」:写入动作只验证定位不落笔,走到提交步自动停;试跑中智能体自愈成功的定位会固化回技能,下次回放不再花模型钱。

Agentic 技能包(SKILL.md + scripts)从仓库整目录安装,执行时模型读手册现场写 Python,送沙箱跑,失败把 stderr 喂回去自修复重试。

安全沙箱:跑不可信代码的那一半

分身要会写代码算数、出报表、画图,就得真跑代码;而技能包可能来自 GitHub、来自同事上传——默认按不可信对待。所以执行分两个互不接触的平面:碰业务系统的那条链路带你的登录态、但只做确定性回放;跑代码的这条链路能力很大、但被关在一次性容器里,够不着你的任何东西。

flowchart LR
    CODE["模型现场写的 Python<br/>/ 技能包脚本"] --> POOL{"并发槽位<br/>满了就排队"}
    POOL --> P1

    subgraph C1["一次性容器(跑完即毁)"]
        direction TB
        P1["① 装依赖<br/>联网,仅限白名单包"] --> CUT["② 断网<br/>disconnect 全部网络"]
        CUT --> VERIFY{"核实真断了?"}
        VERIFY -->|是| P2["③ 跑用户代码<br/>--network none"]
        VERIFY -->|否| KILL["不放行<br/>容器侧 120s 自杀"]
    end

    P2 --> OUT["产物 /out<br/>base64 回传工作空间"]

几个刻意的选择:

  • 两阶段切网,而不是全程断网。全程断网装不了依赖,全程联网又等于给不可信代码开了外网。所以装包阶段联网、装完立刻断掉容器的全部网络,核实真断了才落放行信号——核实不过就不放行,容器侧超时自杀(fail-closed,不是 fail-open)。
  • 配额是硬的:内存、CPU、PID 上限(256)、执行硬超时,跑完 --force 删容器。资源耗尽只会拖垮那一个容器。
  • 代码不走 shell 参数:代码与技能包 tar 上传进 /work,绕开参数长度限制,也避免命令行拼接引入注入面。产物统一 /out 回传。
  • 容器打标签。监控页只列沙箱容器——不打标签的话,文档解析、向量模型这些常驻基础服务也会出现在「沙箱监控」里,旁边还配着强杀按钮,一点就把基础服务干掉了。
  • 本机 / 远程一键切换:改 dockerEndpoint 即可,代码不动。个人试用跑本机,企业部署指向专用宿主。

镜像与依赖白名单由管理端治理,内网无外网时走平台托管的离线镜像。

三、可信:过闸、留痕、不出域

写操作一律过闸

写操作一律过闸。确认卡列明系统、真实对象、动作、字段,人工点头后签发一次性令牌,只对这一笔有效。读不到的对象绝不虚构,查不出来就降级人工指认,单号、金额、人名一个都不编。

审计

AgentTrace 记全链路:谁、问了什么、路由到哪个技能、每个 span 干了什么、风险等级、最终状态,管理端驾驶舱可逐条下钻。审计文本导出带分级脱敏。登录成功失败都记。

知识库

服务端 RAG 链路:docling 解析文档(表格、版面、OCR 扫描件)→ 切块 → bge-m3 算 1024 维向量 → pgvector 检索。相关性阈值按 bge-m3 实测标定过,换向量模型要改维度、重建全部向量(POST /api/v1/knowledge/reindex)并重新标定阈值,缺一步检索质量就崩。

员工本机另有一套完全离线的个人记忆:SQLite 按账号分库,ONNX 本地向量化,敏感语料不出网。个人文档可以提名进企业库,走审批。检索命中的文档插图会随答案图文并茂地呈现(【图N】占位由系统替换成真实插图,绝不虚构图片)。

语音输入与资源中心

语音输入用本机 whisper 转写(transformers.js 在 Web Worker 内推理):录音与音频全程不出设备,模型版本按本机配置推荐(tiny/base/small)。这类离线资源统一由管理端资源中心治理:语音模型、沙箱镜像、客户端安装包(含版本管理)都托管在平台,客户端一键下载安装——内网可用,平台缺失时自动回退公网镜像;公开下载页同步展示客户端与 Docker 运行时安装包。

生产部署

后端打包成可执行 jar,配置放 jar 外面,改配置不用重新打包:

bash scripts/package-backend.sh    # 产出 dist/backend/

没有外网的 Linux 服务器走离线方案:镜像(pgvector、ollama+bge-m3、docling、沙箱)在有网机器上 save 成 tar,拷过去 load,全容器化拉起。步骤见 admin-backend/deploy/DEPLOY-offline-linux.md(打包后复制到 dist/backend/)。有一个容易栽的地方:镜像 tar 分架构,arm64 的包放到 x86_64 服务器上会直接 exec format error,备制品前先在目标机跑一下 uname -m

prod 配置下 JWT 密钥、HMAC 密钥、初始管理员口令缺失或太弱,后端拒绝启动,这是故意的。

技术选型

选型就三条硬约束:能全私有离线部署(政企内网)、国产算力上能跑(信创)、凭证与数据不出内网(本地优先)。所以能自托管的一律自托管,模型用开源满血版。

用了什么 为什么这么选
后端 Java 21 · Spring Boot 3.3 政企运维熟这套栈,私有化交付省心
数据 + 检索 PostgreSQL 17 + pgvector 一个库同时装关系数据和向量,少一个中间件
迁移 · 鉴权 · 文档 Flyway · jjwt · springdoc-openapi schema 版本化、JWT 鉴权、OpenAPI 自动出文档
沙箱 Docker via docker-java 一次性容器隔离,不可信代码永不落员工机
前端 React 18 · TypeScript · Vite · Cytoscape.js 本体图谱用 Cytoscape 画
桌面端 Electron 30 + better-sqlite3 客户端要坐到员工工位、按账号本地分库
浏览器自动化 Playwright 语义定位、跨 iframe、有头无头都行
桌面自动化 nut.js + uiohook-napi 非浏览器的桌面系统,也能录制与回放
文档解析 Docling 表格、版面、OCR 扫描件都能拆
本地语音 transformers.js(v3)+ whisper 转写全程本机 Worker 内推理,音频不上传
向量模型 bge-m3 via Ollama 1024 维、中文强,可私有部署
联网检索 SearXNG 自托管元搜索,终端不裸连厂商
大模型 DeepSeek · 通义千问 开源满血版,昇腾等国产算力单机可跑

远程通道用飞书 / 钉钉 / QQ 官方 SDK(oapi-sdk-nodejs 等);技能包沿用 SKILL.md 约定(见上方预置技能);另用到 lucide(图标)、zustand(状态)、pdf.js(本地兜底解析)。

站在这些开源项目肩膀上,一并致谢。

交流与支持

开源出来的是思路和实现。想在真实企业里稳定落地,欢迎聊聊:

  • 加微信(备注 iML Work):有专业团队做更稳定的企业版本和落地交付。
  • 关注公众号「AI产品康Sir」:更多 AI 产品设计与实践。

微信 · 备注 iML Work

License

MIT

Reviews (0)

No results found