Install
openclaw skills install @workopilot/workopilot-service-builder帮助开发者创建和集成喔壳(WorkoPilot)AI 能力到业务系统。涵盖创建 AI 服务、配置数字员工、注册 iframe 技能卡片、生成接入代码、提供集成方案、排查对接问题等完整流程。当用户提到 WorkoPilot 对接、喔壳集成、AI 服务创建、数字员工配置、iframe 嵌入、附件分类、文档处理、API 调用示例、鉴权配置、接口测试、集成故障排查,或需要自动化脚本来创建配置时,都应使用此技能。即使用户只是说"对接喔壳"、"创建 AI 服务"、"嵌入聊天窗口"、"测试接口"这样的简短表述,也要触发此技能提供端到端的指导。
openclaw skills install @workopilot/workopilot-service-builder喔壳是一个企业级 AI 应用平台,提供两种使用模式:
用户通过喔壳 App 或 Web 端直接使用数字员工。
数字员工 = Agent 聊天智能体 + 业务菜单
Agent 聊天智能体支持:
业务菜单提供:
示例 - 报价助理数字员工:
┌─────────────────────────────────────┐
│ 对话区: 协助用户生成报价单 │
│ "帮我做一份设备采购的报价单" │
│ → 通过对话收集信息 │
│ → 调用 MCP 生成报价 │
│ → 在技能卡片中展示报价单预览 │
├─────────────────────────────────────┤
│ 业务菜单: [报价单历史] [客户管理] │
│ → 点击后加载应用菜单 Iframe 页面 │
└─────────────────────────────────────┘
开发者如何定制数字员工:
第三方系统通过集成喔壳能力,快速实现 AI 化。
提供两类能力:
AI 服务 - 通过 API 接口调用
POST /api/aiagent/run数字员工 - 通过 Iframe 嵌入
典型场景:
本技能帮助开发者使用喔壳的开放 API 和集成能力:
配置自动化:
代码生成:
集成指导:
问题诊断:
定位: 类似"AI 函数",封装提示词和输入参数
典型场景:
创建流程: scripts/create_ai_service.py
定位: 完整的对话式 AI 应用
扩展能力:
创建流程: scripts/create_digital_employee.py
更新流程: scripts/update_digital_employee.py
定位: 从文件中自动提取结构化数据,消除手工录入
核心价值:
两种使用模式:
模式 A: 分类 + 提取 (文件来源复杂,使用较少)
上传杂乱文件 → 系统识别类型 → 提取数据
模式 B: 直接提取 (已知类型,高频使用 ⭐⭐⭐)
上传合同 → 指定"采购合同"编码 → 提取结构化数据 → 填充表单
快速示例:
// 合同管理系统 - 用户上传合同后自动填充表单
const result = await fetch(`${BASE_URL}/api/attachment/extract`, {
method: 'POST',
headers: { 'API-KEY': apiKey },
body: JSON.stringify({
fileUrl: uploadedFileUrl,
categoryCode: 'contract-purchase' // 指定采购合同分类
})
});
// 返回结构化数据
// { partyA: "北京公司", partyB: "上海公司", amount: 500000, ... }
// 自动填充表单
fillForm(result.data);
两种提取技术:
系统自动选择最优技术,也可手动指定。
开发流程:
ExtractRules(提取规则)关键概念:
常见分类:
创建脚本: scripts/create_attachment_classification.py
详细文档:
references/attachment-classification.md定位: 在对话中嵌入自定义 UI。数字员工旁边的固定业务菜单属于“应用菜单 iframe”,不要和对话中 showCard 触发的 Iframe 技能卡片混淆。
使用场景:
showCard 打开可交互卡片注册流程: scripts/register_iframe_card.py
定位: 文档格式转换和处理
能力:
定位: 数字员工使用额度消耗和校验
核心概念:
典型场景:
集成方式: 在 MCP 工具、iframe 技能卡片或后端 API 中集成
详细文档: references/billing.md
⚠️ 重要提醒: 如果你的数字员工提供以下高价值服务,强烈建议集成计费:
未集成计费的风险: 用户可以无限制使用高价值服务,导致成本失控。
┌──────────────────────────────────────────────┐
│ 应用层 │
│ ├─ 模式1: 喔壳 App/Web - 直接使用 │
│ └─ 模式2: 第三方系统 - Iframe嵌入/API调用 │
├──────────────────────────────────────────────┤
│ 集成层 │
│ ├─ Iframe 嵌入 - 界面集成 │
│ └─ 开放 API - 程序调用 │
├──────────────────────────────────────────────┤
│ 能力层 │
│ ├─ 数字员工 - Agent智能体+业务菜单 │
│ ├─ AI 服务 - 可复用的AI能力封装 │
│ ├─ 基础服务 - 附件分类、文档处理 │
│ └─ 计费模块 - 额度消耗和校验 ⚠️ │
├──────────────────────────────────────────────┤
│ 扩展层 │
│ ├─ MCP - 数据操作能力 │
│ ├─ 技能卡片 - UI交互扩展 │
│ └─ 知识库 - 领域知识 │
└──────────────────────────────────────────────┘
根据用户需求判断场景类型,选择相应的处理方式:
场景 1: 需要创建配置资源
当用户说"创建 AI 服务"、"配置数字员工"、"注册技能卡片"、"创建附件分类"时,使用对应的 Python 脚本:
scripts/create_ai_service.pyscripts/create_digital_employee.pyscripts/update_digital_employee.pyscripts/configure_app_menu.pyscripts/register_iframe_card.pyscripts/create_attachment_classification.py ⭐这些场景的关键是理解用户的业务需求,设计合理的配置参数。
应用菜单配置是配置阶段动作:当用户要给数字员工旁边增加“报价单历史”“客户资料”等固定业务菜单时,由 Agent 调用 configure_app_menu.py 新增或更新菜单。开发者运行时只需要实现菜单 iframeUrl 对应页面,并按 references/app-menu-iframe.md 处理 runtimeToken 单点登录。
特别注意 - 附件分类创建:
附件分类是文档智能化的基础,创建时要重点设计 extractRules:
典型附件类型:
场景 2: 需要调用已有服务
当用户说"如何提取合同数据"、"调用 AI 服务"、"使用附件识别"时,提供调用示例:
重点: 附件提取高频场景
附件提取是最常用的功能之一。用户通常的需求:
"我有一个合同管理系统,用户上传合同后,
需要自动提取甲方、乙方、金额等信息填充到表单"
标准流程:
场景 3: 需要集成代码或方案
当用户说"如何嵌入"、"怎么调用接口"、"对接流程"时,提供方案和代码:
references/iframe-embed.md,输出嵌入代码references/auth-and-config.md这些场景的关键是提供完整可运行的代码,包含错误处理和参数说明。
场景 4: 需要故障排查
当用户报告"接口报错"、"鉴权失败"、"数据不对"、"提取结果不准确"时,系统性诊断:
不要一次性加载所有 reference 文档。根据任务类型,按这个优先级读取:
第一步:总是先读鉴权配置
references/auth-and-config.md - 所有任务都需要了解鉴权和配置机制第二步:根据任务读取对应文档
| 用户任务 | 需要读取的文档 |
|---|---|
| 创建/调用 AI 服务 | references/ai-service.md |
| 创建/使用数字员工 | references/digital-employee.md |
| 附件分类场景 | references/attachment-classification.md |
| iframe 将数字员工嵌入到当前系统对接 | references/iframe-embed.md |
| iframe 技能卡片注册 | references/iframe-skill-card.md |
| 数字员工旁边的业务菜单 iframe、菜单 SSO、菜单 runtimeToken 解析 | references/app-menu-iframe.md |
| 文档服务对接 | references/document-service.md |
| 数字员工计费集成 | references/billing.md |
这种按需加载方式避免上下文浪费,让每个任务都能获得最相关的信息。
当用户需要创建 AI 服务、数字员工等配置资源时,遵循这个流程:
通过对话明确:
对于 AI 服务,特别重要:
设计有意义的 inputs 字段。不要只用通用的 user_message,而要根据业务场景设计具体的输入字段。
示例 - 合同审查服务:
{
"inputs": [
{
"name": "contract_type",
"label": "合同类型",
"type": "select",
"required": true,
"options": ["采购合同", "销售合同", "服务合同"]
},
{
"name": "contract_content",
"label": "合同内容",
"type": "textarea",
"required": true
},
{
"name": "review_focus",
"label": "审查重点",
"type": "text",
"required": false,
"placeholder": "如:付款条款、违约责任"
}
],
"systemPrompt": "你是一个专业的合同审查助手。请审查以下{{contract_type}}:\n\n{{contract_content}}\n\n{{#if review_focus}}重点关注:{{review_focus}}{{/if}}\n\n请从法律风险、条款完整性、权责平衡等角度给出审查意见。"
}
为什么这样设计更好?
{{input_name}} 引用输入,确保提示词和输入对应创建 AI 服务、数字员工或附件分类时,需要指定使用哪个大语言模型。不同场景应该选择不同的模型,因为各个模型有各自的优势领域。
附件分类和文档提取 → 优先选择 qwen 或 deepseek
这类场景主要是从中文文档中提取结构化数据(合同、发票、简历等)。qwen 和 deepseek 在中文理解和文档解析方面表现更优。
推荐优先级: qwen > deepseek > gpt-4 > gpt-3.5
使用场景:
AI 服务(通用任务) → 优先选择 GPT-4 或 GPT-3.5
AI 服务通常处理复杂的逻辑推理、内容生成、分析任务。GPT 系列在这些方面能力更强。
推荐优先级: gpt-4 > gpt-3.5 > qwen > deepseek
使用场景:
数字员工(对话交互) → 优先选择 GPT-4 或 GPT-3.5
数字员工需要多轮对话、上下文理解和自然流畅的交互。GPT 系列在对话能力上更突出。
推荐优先级: gpt-4 > gpt-3.5 > qwen > deepseek
使用场景:
脚本会自动调用 /api/aiagent/models 接口获取租户下可用的模型列表,并根据上述策略自动选择。
手动查询模型:
curl -X GET "${WORKOPILOT_BASE_URL}/api/aiagent/models" \
-H "API-KEY: ${WORKOPILOT_API_KEY}"
响应示例:
{
"code": 200,
"data": [
{
"id": 123,
"modelName": "通义千问 Plus",
"modelCode": "qwen-plus"
},
{
"id": 124,
"modelName": "DeepSeek V3",
"modelCode": "deepseek-chat"
},
{
"id": 125,
"modelName": "GPT-4 Turbo",
"modelCode": "gpt-4-turbo"
}
]
}
在配置文件中指定模型 ID:
{
"serviceCode": "contract-review",
"modelId": 125, // 使用 GPT-4 处理复杂的合同审查
"systemPrompt": "..."
}
{
"CategoryCode": "invoice-extract",
"ModelId": 123, // 使用 qwen 提取中文发票信息
"extractRules": [...]
}
根据设计生成 JSON 配置文件。配置字段直接对应后端接口的字段名。
运行对应的 Python 脚本。脚本会:
创建成功后:
scripts/smoke_test.py 或 curl 命令测试输出后续使用的代码示例,包括:
AI 服务是最常用的功能,也最容易配置不当。遵循这些原则:
根据业务场景设计输入字段,而不是只用 user_message 作为万能输入。
不推荐的做法:
{
"inputs": [{"name": "user_message", "label": "请输入", "type": "textarea"}]
}
这样的"空壳服务"没有体现业务逻辑,用户不知道该输入什么,AI 也无法给出专业回答。
推荐的做法:
根据业务场景设计具体字段。例如:
job_description(岗位要求)、resume_content(简历内容)、screening_criteria(筛选标准)product_name(产品名)、target_audience(目标人群)、tone(文案风格)、key_points(卖点)data_source(数据来源)、analysis_dimension(分析维度)、output_format(输出格式)systemPrompt 中使用 {{input_name}} 引用输入字段。创建前检查:
示例 - 正确的对应关系:
{
"inputs": [
{"name": "job_description", "label": "岗位描述", "type": "textarea"},
{"name": "resume_content", "label": "简历内容", "type": "textarea"}
],
"systemPrompt": "你是 HR 助手。请根据以下岗位要求:\n{{job_description}}\n\n评估这份简历:\n{{resume_content}}\n\n给出匹配度分析和建议。"
}
如果 systemPrompt 中没有引用某个 input,用户填写的数据就不会被 AI 使用,导致功能失效。
不要创建没有实际业务逻辑的服务。每个服务都应该:
当提供 iframe 嵌入代码、API 调用示例等集成方案时,确保输出包含:
不要只给代码片段,要给完整示例。用户应该能直接复制使用(修改参数后)。
示例 - AI 服务调用:
// 调用 AI 服务的完整示例
async function callAIService(serviceCode, inputs) {
const WORKOPILOT_API_KEY = process.env.WORKOPILOT_API_KEY; // 从环境变量读取
const BASE_URL = 'https://agent.workopilot.com/net-api';
try {
const response = await fetch(`${BASE_URL}/api/aiagent/run`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'API-KEY': WORKOPILOT_API_KEY
},
body: JSON.stringify({
serviceCode: serviceCode, // AI 服务的唯一标识
inputs: inputs, // 输入参数对象
stream: false
})
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`API 调用失败: ${response.status} ${errorText}`);
}
const result = await response.json();
if (result.code !== 200) {
throw new Error(`业务错误: ${result.msg || '未知错误'}`);
}
return result.data; // 返回 AI 生成的内容
} catch (error) {
console.error('调用 AI 服务时出错:', error);
throw error;
}
}
// 使用示例
callAIService('contract-review-001', {
contract_type: '采购合同',
contract_content: '...',
review_focus: '付款条款'
}).then(result => {
console.log('AI 审查结果:', result);
}).catch(error => {
console.error('调用失败:', error.message);
});
注释说明每个参数的:
包含 try-catch 和有意义的错误提示。帮助开发者快速定位问题:
明确告知:
说明如何测试和确认成功:
所有脚本都支持多种配置方式,优先级从高到低:
python scripts/create_ai_service.py \
--base-url https://agent.workopilot.com/net-api \
--api-key your_api_key_here \
--config service.json
适用场景:临时测试、CI/CD 环境、覆盖默认配置
export WORKOPILOT_BASE_URL="https://agent.workopilot.com/net-api"
export WORKOPILOT_API_KEY="your_api_key_here"
python scripts/create_ai_service.py --config service.json
适用场景:服务器部署、容器环境、多项目共享配置
在项目根目录创建 .env.workopilot:
# 生产环境(默认)
WORKOPILOT_BASE_URL=https://agent.workopilot.com/net-api
WORKOPILOT_API_KEY=your_api_key_here
# 测试环境
# WORKOPILOT_BASE_URL=https://agenttest.workopilot.com/net-api
# WORKOPILOT_API_KEY=your_test_api_key_here
然后直接运行脚本,无需指定参数:
python scripts/create_ai_service.py --config service.json
脚本会自动发现并加载 .env.workopilot 或 .env.local。
适用场景:本地开发(推荐)
如果以上都未配置:
https://agent.workopilot.com/net-apihttps://agenttest.workopilot.com/net-api使用测试环境需要显式配置 WORKOPILOT_BASE_URL 或 --base-url 参数。
注意: APIKEY 没有默认值,必须配置。生产和测试环境的 APIKEY 不同,需要分别申请。
应该做的:
.env.workopilot 存储本地开发配置,用于协助用户配置喔壳的各种服务.gitignore 包含 .env.workopilot 和 .env.local.env.workopilot.example 作为模板,但只包含占位值不应该做的:
示例 - .env.workopilot.example:
# 复制此文件为 .env.workopilot 并填入真实值
# 生产环境(默认)
WORKOPILOT_BASE_URL=https://agent.workopilot.com/net-api
WORKOPILOT_API_KEY=replace_with_your_api_key
# 测试环境(取消注释以使用)
# WORKOPILOT_BASE_URL=https://agenttest.workopilot.com/net-api
# WORKOPILOT_API_KEY=replace_with_your_test_api_key
iframe 技能卡片在测试时可以使用本地 URL,但发布到生产前必须:
本地测试 URL 只能在开发者本机访问,其他用户无法加载,会导致卡片空白。
在开发者项目根目录运行脚本,脚本会自动发现 .env.workopilot:
# 在项目根目录
python path/to/scripts/smoke_test.py
python path/to/scripts/create_ai_service.py --config ai-service.json
python path/to/scripts/create_digital_employee.py --config digital-employee.json
python path/to/scripts/configure_app_menu.py --employee-id 1001 --action create --config app-menu.json
python path/to/scripts/register_iframe_card.py --config iframe-card.json
python path/to/scripts/create_attachment_classification.py --config attachment-classification.json
所有脚本都支持:
--base-url <API_BASE_URL> # API 基础 URL
--api-key <API_KEY> # API 密钥
--env-file <ENV_FILE_PATH> # 自定义环境文件路径
--config <CONFIG_FILE> # 配置 JSON 文件
脚本实现轻量级幂等,避免重复创建:
create_ai_service.py - 按 serviceCode 查询,存在则复用create_digital_employee.py - 按 robotCode 查询,存在则复用configure_app_menu.py - create 遇到相同 menuKey 会提示改用 update;update 按 employeeId + menuKey 定位create_attachment_classification.py - 按 GroupCode+CategoryCode 查询,存在时默认编辑覆盖 ExtractRules(可用 --no-edit-existing 只复用不覆盖)register_iframe_card.py - 直接创建(当前开放接口只提供注册,不提供查询)幂等性让脚本可以安全重复运行,适合自动化场景。
帮助开发者完成任务后,确保输出包含:
serviceCode、robotId、robotCode、skillRegistryId附件分类与提取是喔壳的核心高频功能,特别是"直接提取"模式(90% 使用率)。
典型需求: "用户上传合同后,自动提取甲方、乙方、金额等信息填充到表单"
快速指引:
ExtractRules,关键是字段的 descriptioncategoryCode,上传文件详细内容包括:
👉 请阅读: references/attachment-classification.md
AI 服务的核心是 inputs 和 systemPrompt 的配合。设计时:
{{field_name}} 引用输入如果用户说的是数字员工旁边的固定业务菜单(如“报价单历史”),不要按技能卡片处理;应读取 references/app-menu-iframe.md,说明菜单 iframe 会带 runtimeToken、userId、tenantId,开发者后端需要用 API-KEY + X-Runtime-Token 调 runtime 接口解析上下文。
注册 iframe 技能卡片时,开发者需要了解:
触发条件设计
showCard 参数如何设置?数据获取
开发和发布流程
http://localhost:xxxx 测试维护或生成接口文档时,响应示例应:
{
"code": 200, // 业务状态码,200 表示成功
"msg": null, // 提示信息,成功时通常为空
"data": {
"id": 123, // AI 服务 ID(Agent 记录此 ID 用于后续调用)
"serviceCode": "xxx" // AI 服务唯一标识(Agent 记录此 Code 用于 /api/aiagent/run 接口)
}
}
在代码块前说明:"以下示例带注释,仅供理解,不可直接作为 JSON 发送"
注释中标注:"Agent 记录此 ID 用于..."、"Agent 使用此 Code 调用..."
让 Agent 清楚了解数据流向和使用场景。
这样 Agent 在阅读文档时,能准确理解需要提取哪些数据、如何使用这些数据。
references/billing.md 了解如何集成。