创建自定义工具
本文档将指导您如何在 GeniSpace 平台上创建和管理自定义工具,包括手动创建和从 OpenAPI 文档导入两种方式。
自定义工具 vs 系统工具
在开始创建自定义工具之前,让我们先了解自定义工具与系统工具的区别:
| 特性 | 自定义工具 | 系统工具 |
|---|---|---|
| 创建者 | 用户自主创建 | 平台管理员创建 |
| 配置权限 | 完全可配置和定制 | 只能配置用户部分,系统配置不可见 |
| 维护责任 | 用户自行维护 | 平台统一维护和更新 |
| 使用门槛 | 高,需要技术配置 | 低,启用即可使用 |
| 定制程度 | 完全定制 | 有限定制 |
| 共享范围 | 个人或团队内 | 全平台用户可用 |
建议使用场景:
- 选择系统工具:如果平台已有符合需求的工具,优先使用系统工具
- 选择自定义工具:需要特殊定制功能、集成私有服务或现有系统工具无法满足需求时
创建方式概览
GeniSpace 提供多种创建自定义工具的方式:
- 手动创建 - 从零开始构建工具
- OpenAPI 导入 - 从 OpenAPI 文档快速生成工具
- Docker 容器 - 基于容器化应用创建工具
手动创建工具
步骤 1:基本信息配置
首先需要配置工具的基本信息:
{
"name": "用户管理工具",
"identifier": "user-management",
"description": "提供用户信息的增删改查功能",
"category": "api",
"executionType": "api",
"version": "1.0.0",
"tags": ["用户", "管理", "API"]
}
字段说明:
name: 工具显示名称identifier: 唯一标识符,只能包含小写字母、数字和连字符description: 工具功能描述category: 工具分类(api、data-source、transform 等)executionType: 执行类型(api、worker、mcp、container)version: 版本号tags: 标签列表,便于搜索和分类
步骤 2:运行配置(用户配置)
自定义工具使用单层配置结构,所有配置都由用户完全控制。配置工具的全局运行参数:
{
"configuration": {
"schema": {
"type": "object",
"properties": {
"serverUrl": {
"type": "string",
"title": "服务器地址",
"required": true,
"description": "API 服务器的基础地址"
},
"apiKey": {
"type": "string",
"title": "API 密钥",
"sensitive": true,
"description": "访问 API 的密钥"
},
"timeout": {
"type": "number",
"title": "全局超时时间",
"default": 30000,
"description": "请求超时时间(毫秒)"
},
"headers": {
"type": "array",
"title": "全局请求头",
"items": {
"type": "object",
"properties": {
"key": {"type": "string"},
"value": {"type": "string"}
}
}
}
}
},
"values": {
"serverUrl": "https://api.example.com",
"apiKey": "your-api-key-here",
"timeout": 30000,
"headers": [
{"key": "Content-Type", "value": "application/json"}
]
}
}
}
注意:与系统工具不同,自定义工具的所有配置(包括敏感信息)都需要用户自行配置和管理。建议使用
sensitive: true标记敏感字段。
步骤 3:添加方法
每个工具可以包含多个方法,每个方法代表一个具体的功能:
方法基本信息
{
"name": "获取用户信息",
"identifier": "get-user",
"description": "根据用户ID获取用户详细信息",
"isDefault": true,
"order": 1,
"status": "ACTIVE"
}
输入 Schema
定义方法接受的输入参数:
{
"inputSchema": {
"type": "object",
"required": ["userId"],
"properties": {
"userId": {
"type": "string",
"title": "用户ID",
"description": "要查询的用户ID",
"isPort": true
},
"includeProfile": {
"type": "boolean",
"title": "包含详细信息",
"description": "是否包含用户详细资料",
"default": false
}
}
}
}
输出 Schema
定义方法产生的输出结果:
{
"outputSchema": {
"type": "object",
"properties": {
"user": {
"type": "object",
"title": "用户信息",
"properties": {
"id": {"type": "string", "title": "用户ID"},
"name": {"type": "string", "title": "用户名"},
"email": {"type": "string", "title": "邮箱"},
"profile": {
"type": "object",
"title": "详细资料",
"properties": {
"avatar": {"type": "string", "title": "头像"},
"bio": {"type": "string", "title": "简介"}
}
}
}
},
"metadata": {
"type": "object",
"title": "元数据",
"properties": {
"timestamp": {"type": "string", "title": "查询时间"},
"source": {"type": "string", "title": "数据源"}
}
}
}
}
}
方法配置
定义方法特定的配置参数:
{
"configuration": {
"schema": {
"type": "object",
"properties": {
"method": {
"type": "string",
"title": "请求方法",
"enum": ["GET", "POST"],
"default": "GET",
"required": true
},
"endpoint": {
"type": "string",
"title": "接口路径",
"description": "相对于服务器地址的接口路径",
"required": true
},
"caching": {
"type": "object",
"title": "缓存配置",
"properties": {
"enabled": {
"type": "boolean",
"title": "启用缓存",
"default": false
},
"ttlSeconds": {
"type": "number",
"title": "缓存时间",
"default": 3600
}
}
}
}
},
"values": {
"method": "GET",
"endpoint": "/api/users/{userId}",
"caching": {
"enabled": true,
"ttlSeconds": 1800
}
}
}
}
从 OpenAPI 导入
支持的格式
GeniSpace 支持从以下格式的 OpenAPI 文档导入工具:
- OpenAPI 3.0 (JSON/YAML)
- Swagger 2.0 (JSON/YAML)
导入方式
1. URL 导入
直接从 URL 导入 OpenAPI 文档:
https://api.example.com/openapi.json
https://api.example.com/swagger.yaml
2. 文件上传
支持上传本地的 OpenAPI 文档文件:
.json文件.yaml或.yml文件
自动生成内容
从 OpenAPI 文档导入时,系统会自动生成:
工具基本信息
{
"name": "User API", // 来自 info.title
"description": "User management API", // 来自 info.description
"identifier": "user-api", // 自动生成
"version": "1.0.0" // 来自 info.version
}
服务器配置
{
"configuration": {
"values": {
"serverUrl": "https://api.example.com" // 来自 servers[0].url
}
}
}
方法生成
每个 API 端点会生成对应的方法:
# OpenAPI 定义
paths:
/users/{id}:
get:
summary: "获取用户信息"
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: "用户信息"
content:
application/json:
schema:
type: object
properties:
id:
type: string
name:
type: string
生成的方法:
{
"name": "获取用户信息",
"identifier": "get-users-id",
"inputSchema": {
"type": "object",
"required": ["id"],
"properties": {
"id": {
"type": "string",
"title": "用户ID",
"isPort": true
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"result": {
"type": "object",
"properties": {
"id": {"type": "string"},
"name": {"type": "string"}
}
}
}
},
"configuration": {
"values": {
"method": "GET",
"endpoint": "/users/{id}"
}
}
}
导入后的调整
导入完成后,您可以进一步调整:
- 修改工具信息:调整名称、描述、分类等
- 优化 Schema:完善输入输出的数据结构定义
- 添加验证规则:为参数添加验证约束
- 配置缓存策略:设置合适的缓存规则
- 设置默认值:为可选参数提供默认值
配置安全性
敏感信息处理
自定义工具需要用户自行管理所有配置,包括敏感信息。建议遵循以下安全实践:
1. 标记敏感字段
{
"apiKey": {
"type": "string",
"title": "API 密钥",
"sensitive": true,
"description": "用于身份验证的密钥"
},
"password": {
"type": "string",
"title": "密码",
"sensitive": true,
"format": "password"
}
}
2. 使用环境变量
{
"configuration": {
"values": {
"apiKey": "${API_KEY}",
"serverUrl": "${SERVER_URL:-https://api.example.com}"
}
}
}
3. 配置验证
{
"apiKey": {
"type": "string",
"pattern": "^[A-Za-z0-9]{32}$",
"description": "32位字母数字组合"
},
"serverUrl": {
"type": "string",
"format": "uri",
"pattern": "^https://.*"
}
}
访问控制
- 团队共享:可以将自定义工具分享给团队成员
- 权限管理:设置不同成员的编辑权限
- 使用限制:可以限制工具的使用范围和频率
Docker 容器工具
基本配置
{
"executionType": "container",
"systemConfiguration": {
"schema": {
"type": "container",
"properties": {
"image": {
"type": "string",
"title": "容器镜像",
"required": true
},
"command": {
"type": "string",
"title": "执行命令"
},
"environment": {
"type": "object",
"title": "环境变量"
},
"resources": {
"type": "object",
"title": "资源限制",
"properties": {
"memory": {"type": "string", "default": "512Mi"},
"cpu": {"type": "string", "default": "0.5"}
}
}
}
},
"values": {
"image": "my-app:latest",
"command": "python app.py",
"environment": {
"API_KEY": "secret"
},
"resources": {
"memory": "512Mi",
"cpu": "0.5"
}
}
}
}
容器要求
容器化的工具需要满足以下要求:
- 输入输出规范:通过标准输入接收 JSON 格式的输入,通过标准输出返回 JSON 格式的结果
- 错误处理:使用适当的退出码表示执行状态
- 日志输出:将日志输出到标准错误流
- 资源管理:合理使用内存和 CPU 资源
示例容器代码
#!/usr/bin/env python3
import json
import sys
def main():
try:
# 从标准输入读取参数
input_data = json.load(sys.stdin)
# 处理业务逻辑
result = process_data(input_data)
# 输出结果到标准输出
json.dump(result, sys.stdout)
sys.exit(0)
except Exception as e:
# 错误信息输出到标准错误
print(f"Error: {str(e)}", file=sys.stderr)
sys.exit(1)
def process_data(data):
# 实际的业务处理逻辑
return {
"status": "success",
"data": data,
"timestamp": "2024-01-01T00:00:00Z"
}
if __name__ == "__main__":
main()
测试和调试
1. 配置验证
在保存工具之前,系统会自动验证:
- JSON Schema 格式正确性
- 必填字段完整性
- 数据类型一致性
- 标识符唯一性
2. 方法测试
可以在工具编辑界面直接测试方法:
{
"testInput": {
"userId": "12345",
"includeProfile": true
},
"expectedOutput": {
"user": {
"id": "12345",
"name": "张三",
"email": "zhangsan@example.com"
}
}
}
3. 工作流集成测试
将工具添加到测试工作流中,验证:
- 输入输出连接正确性
- 数据流转正常
- 错误处理机制
- 性能表现
版本管理
版本号规范
建议使用语义化版本号:
- 主版本号:不兼容的 API 修改
- 次版本号:向下兼容的功能性新增
- 修订号:向下兼容的问题修正
示例:1.2.3
更新策略
- 向后兼容更新:修复 bug、优化性能
- 功能性更新:新增方法、扩展配置
- 破坏性更新:修改现有接口、删除功能
迁移指南
当发布破坏性更新时,需要提供:
- 变更说明:详细说明修改内容
- 迁移步骤:指导用户如何升级
- 兼容性说明:说明影响范围
- 回滚方案:提供降级方案
最佳实践
1. 设计原则
- 单一职责:每个工具专注于一个特定领域
- 接口稳定:避免频繁修改公开接口
- 错误友好:提供清晰的错误信息
- 文档完整:编写详细的使用说明
2. 性能优化
- 合理缓存:为适合的操作启用缓存
- 超时设置:设置合理的超时时间
- 资源限制:避免资源过度消耗
- 并发控制:处理高并发场景
3. 安全考虑
- 输入验证:严格验证所有输入参数
- 权限控制:实现适当的访问控制
- 敏感信息:妥善处理敏感数据
- 审计日志:记录重要操作
4. 维护管理
- 监控告警:设置关键指标监控
- 日志记录:记录详细的执行日志
- 定期更新:及时修复问题和安全漏洞
- 用户反馈:收集和处理用户反馈
5. 选择指南
何时选择自定义工具
- 私有服务集成:需要连接内部或私有的 API 服务
- 特殊业务逻辑:需要实现特定的业务处理逻辑
- 定制化需求:现有系统工具无法满足特殊需求
- 数据处理:需要特殊的数据转换或处理能力
- 第三方集成:集成特定的第三方服务或工具
何时选择系统工具
- 通用服务:使用常见的第三方服务(微信、邮件等)
- 标准功能:需要标准化的功能实现
- 快速启动:希望快速开始使用,无需复杂配置
- 维护成本:希望减少维护工作量
- 最佳实践:希望使用经过验证的实现方案
相关文档
- 系统工具 - 了解系统工具的概念和使用方法
- 工具概览 - 了解工具的基本概念和类型
- 工具配置规范 - 详细的配置结构说明
- OpenAPI 支持说明 - 了解如何从 OpenAPI 文档导入工具
- 工作流集成 - 在工作流中使用工具