概述
Shannon 支持三种添加自定义工具的方式:| 方法 | 最适合 | 代码更改 | 需要重启 |
|---|---|---|---|
| MCP 工具 | 外部 HTTP API、快速原型 | 无 | ✅ 仅服务 |
| OpenAPI 工具 | 带 OpenAPI 规范的 REST API | 无 | ✅ 仅服务 |
| 内置工具 | 复杂逻辑、数据库访问、性能 | Python 代码 | ✅ 仅服务 |
无需 Proto/Rust/Go 更改 - 所有工具都使用通用容器以获得最大灵活性。
- ✅ 通过 API 或 YAML 配置动态注册
- ✅ 内置速率限制和熔断器
- ✅ 用于安全的域白名单
- ✅ 成本跟踪和预算执行
快速开始:添加 MCP 工具
MCP(模型上下文协议)工具允许您将任何 HTTP 端点作为 Shannon 工具集成,无需任何代码更改。1
添加工具定义
编辑 必需字段:
config/shannon.yaml 中的 mcp_tools 部分:enabled: 设置为true以激活url: HTTP 端点(必须是 POST,接受 JSON)func_name: 内部函数名称description: 向 LLM 显示的清晰描述category: 工具类别(例如search、data、analytics、code)cost_per_use: 以美元计的估计成本parameters: 参数定义数组
2
配置域访问
开发环境(宽松):添加到 生产环境(推荐):
.env:3
添加 API 密钥
将您的 API 密钥添加到
.env:4
重启服务
您必须重新创建服务(而不仅仅是重启):
5
验证注册
检查日志:通过 API 列出工具:获取工具架构:
6
测试您的工具
直接执行:通过工作流:
MCP 请求约定
Shannon 以此格式发送 POST 请求:替代方案:运行时 API 注册
仅用于开发/测试(重启后工具丢失):
添加 OpenAPI 工具
对于具有 OpenAPI 3.x 规范的 REST API,Shannon 可以自动生成工具。特性
支持:- ✅ OpenAPI 3.0 和 3.1 规范
- ✅ 基于 URL 或内联规范加载
- ✅ JSON 请求/响应体
- ✅ 路径和查询参数
- ✅ Bearer、API Key(header/query)、Basic 认证
- ✅ 通过 operationId 或 tags 过滤操作
- ✅ 熔断器(5 次失败 → 60 秒冷却)
- ✅ 指数退避重试逻辑(3 次重试,可通过
OPENAPI_RETRIES配置) - ✅ 可配置的速率限制和超时
- ✅ 相对服务器 URL(根据规范 URL 解析)
- ✅ 基本
$ref解析(本地引用到#/components/schemas/*)
限制
Shannon OpenAPI 集成对于约 70% 的 REST API(基于 JSON 的简单认证)已经可以用于生产。以下功能尚不支持:文件上传 API (multipart/form-data)
文件上传 API (multipart/form-data)
- 无法上传文件或二进制数据
- 解决方法:在 JSON 体中使用 base64 编码的文件
- 受影响:图像生成、文件处理、文档上传 API
OAuth 保护的 API
OAuth 保护的 API
- 不支持 OAuth 2.0 流程(授权码、客户端凭据)
- 只能使用 Bearer 令牌(手动获取)
- 受影响:Google API、GitHub、Slack、Twitter 等
- 解决方法:手动获取 OAuth 令牌并使用
bearerauth_type
复杂参数编码
复杂参数编码
- 不支持
style、explode或deepObject序列化 - 仅基本路径/查询参数替换
- 受影响:具有复杂数组/对象查询参数的 API
多文件 OpenAPI 规范
多文件 OpenAPI 规范
- 不支持远程
$ref解析(例如https://example.com/schemas/Pet.json) - 仅支持本地引用(
#/components/...) - 解决方法:将外部架构合并到单个规范文件中
高级架构组合器
高级架构组合器
- 不支持
allOf、oneOf、anyOf - 仅基本类型映射
- 受影响:具有多态类型或复杂验证的 API
表单编码请求
表单编码请求
- 不支持
application/x-www-form-urlencoded内容类型 - 仅支持 JSON 请求体
- ✅ 具有 JSON 请求/响应的简单 REST API
- ✅ 使用 Bearer/API Key/Basic 认证的 API
- ✅ 读取密集型操作(GET 请求)
- ✅ 具有本地
$ref引用的结构良好的规范 - ✅ 路径和查询参数(原始类型)
对于具有相对服务器 URL 的规范(例如
/api/v3),您必须通过 spec_url(而不是 spec_inline)提供规范,以便 Shannon 可以解析完整的基础 URL。快速开始
1
添加工具定义
在
openapi_tools 下编辑 config/shannon.yaml:2
配置环境
添加到
.env:3
重启服务
4
验证和测试
首先验证规范:响应:执行工具:
认证示例
- Bearer Token
- API Key in Query
- Basic Auth
- API Key in Header
添加内置 Python 工具
用于复杂逻辑、数据库访问或性能关键操作。何时使用内置工具
使用内置工具的场景:- 需要直接的数据库/Redis 访问
- 需要复杂的 Python 库(pandas、numpy)
- 性能关键(避免 HTTP 往返)
- 需要会话状态管理
- 实现安全敏感的操作
- 集成外部 API
- 需要无代码部署
- 快速原型设计
- 第三方服务集成
1
创建工具类
在
python/llm-service/llm_service/tools/builtin/my_custom_tool.py 中创建文件:2
运行时注册(可选)
通过 API 动态注册 OpenAPI 工具(使用与 MCP 相同的管理员令牌):响应包括已注册的操作和有效限制。
3
注册工具
编辑
python/llm-service/llm_service/api/tools.py 第 228 行附近:4
重启服务
5
测试工具
高级:会话感知工具
对于需要在多次执行中维护状态的工具:配置参考
MCP 工具配置
OpenAPI 工具配置
环境变量
MCP 配置:测试与验证
健康检查
列出工具
执行工具
直接执行:故障排除
工具未注册
工具未注册
症状:工具未出现在
/tools/list 中调试步骤:域验证错误
域验证错误
症状:
URL host 'example.com' not in allowed domains解决方案:-
开发:使用通配符
-
生产:添加特定域
工具执行失败
工具执行失败
症状:
ToolResult { success: false, error: "..." }调试:熔断器触发
熔断器触发
症状:预防:
Circuit breaker open for <url> (too many failures)调试:- 增加失败阈值:
MCP_CB_FAILURES=10 - 增加恢复时间:
MCP_CB_RECOVERY_SECONDS=120 - 修复底层 API 问题
安全最佳实践
域白名单
- 开发
- 暂存
- 生产
API 密钥管理
永远不要在配置文件中硬编码 API 密钥!
.env 中(不被 git 跟踪):
- Docker secrets
- Kubernetes secrets
- HashiCorp Vault
- AWS Secrets Manager
危险工具
标记修改状态或访问敏感资源的工具:供应商适配器模式
用于特定领域的 API 和自定义代理 当集成需要特定领域转换的专有或内部 API 时,使用供应商适配器模式将供应商逻辑与 Shannon 的核心基础设施分离。何时使用
使用供应商适配器的场景:- 自定义字段名称别名(例如
users→my:unique_users) - 请求/响应转换
- 从会话上下文动态注入参数
- 特定领域的验证或规范化
- 具有自定义系统提示的专门代理角色
快速示例
1
创建供应商适配器
python/llm-service/llm_service/tools/vendor_adapters/myvendor.py:2
注册适配器
python/llm-service/llm_service/tools/vendor_adapters/__init__.py:3
使用供应商标志配置
config/overlays/shannon.myvendor.yaml:4
使用环境
优势
- ✅ 清晰分离: 供应商代码与 Shannon 核心隔离
- ✅ 无核心更改: Shannon 基础设施保持通用
- ✅ 条件加载: 如果供应商模块不可用,优雅降级
- ✅ 易于测试: 隔离进行单元测试适配器
- ✅ 密钥管理: 所有令牌通过环境变量
完整指南
有关以下内容的综合指南:- 专门领域的自定义代理角色
- 会话上下文注入模式
- 测试策略
- 最佳实践和故障排除
供应商适配器指南
学习如何使用适配器模式构建供应商特定的集成
总结
添加工具的三种方式:| 方法 | 命令 | 配置文件 | 代码更改 |
|---|---|---|---|
| MCP | docker compose up -d --force-recreate llm-service | config/shannon.yaml | 无 |
| OpenAPI | docker compose up -d --force-recreate llm-service | config/shannon.yaml | 无 |
| 内置 | docker compose up -d --force-recreate llm-service | api/tools.py + 新文件 | 仅 Python |
- ✅ 零 proto/Rust/Go 更改(通用
google.protobuf.Struct容器) - ✅ 内置安全性(域白名单、速率限制、熔断器)
- ✅ 自动成本跟踪(在元数据中设置
cost_per_use) - ✅ 架构驱动(OpenAI 兼容的 JSON 架构)