跳转到主要内容

概述

供应商适配器模式允许您将特定领域的代理和工具集成到 Shannon 中,而不会污染核心代码库。此模式在以下两者之间保持清晰的分离:
  • 通用 Shannon 基础设施(提交到开源)
  • 供应商特定实现(保持私有或在单独的仓库中)

零核心更改

无需修改 Shannon 的核心代码库

清晰分离

通用基础设施与供应商特定逻辑分离

易于维护

供应商逻辑隔离在单独的目录中

优雅降级

即使没有供应商模块,Shannon 也能正常工作

何时使用供应商适配器

当集成具有特定领域要求的专有或内部 API 时使用供应商适配器。
使用供应商适配器的场景:
  • 集成具有特定领域要求的专有/内部 API
  • 需要自定义请求/响应转换的 OpenAPI 工具
  • 为特定业务领域构建专门的代理
  • 字段命名约定与内部系统不同
  • 需要从会话上下文动态注入参数
  • 需要自定义身份验证或标头逻辑
示例用例:
  • 分析平台(指标别名、时间范围规范化)
  • 电子商务系统(产品字段映射、SKU 转换)
  • CRM 集成(联系人字段规范化)
  • 内部微服务(自定义身份验证令牌、租户 ID)
  • 特定领域的数据验证

架构

文件结构

组件职责

快速入门示例

让我们为一个虚构的分析平台 “DataInsight” 创建一个完整的供应商集成。
1

创建供应商适配器

创建 python/llm-service/llm_service/tools/vendor_adapters/datainsight.py:
2

注册适配器

编辑 python/llm-service/llm_service/tools/vendor_adapters/__init__.py:
3

创建配置覆盖

创建 config/overlays/shannon.datainsight.yaml:
4

创建供应商角色(可选)

创建 python/llm-service/llm_service/roles/datainsight/analytics_agent.py:
说明:allowed_tools 的语义(用于 /agent/query):
  • 省略/null → 由角色预设决定是否启用工具
  • [] → 禁用所有工具
  • ["name", …] → 仅允许列出的工具(名称需与已注册工具一致)
python/llm-service/llm_service/roles/presets.py 中注册:
5

添加环境变量

添加到 .env:
6

测试集成

重建并测试:

组件指南

1. 供应商适配器类

目的: 为供应商特定的 API 约定转换请求/响应 常见转换模式:
  • 字段别名revenuetotal_revenue
  • 指标前缀usersmy:users
  • 时间范围规范化{start, end}{startTime, endTime}
  • 排序格式转换{field, order}{column, direction}
  • 过滤器结构重塑:列表 → 带逻辑运算符的对象
  • 默认注入:从会话上下文添加缺失的必需字段

2. 配置覆盖

目的: 定义供应商特定的工具配置,而不修改基础配置 标头取值:
  • "${ENV_VAR}" - 从环境变量解析
  • 静态字符串 - 按原样使用
从请求体动态模板化标头(例如 {{body.field}})当前不支持。若标头需要依赖请求体/会话值,请考虑:
  • 在 OpenAPI 规范中将其定义为显式的 header 参数,并在调用工具时传参;或
  • 使用供应商适配器对请求体进行整形(标头仍通过静态/环境变量注入)。

3. 供应商角色

目的: 具有特定领域知识和工具限制的专门代理 模板:
说明:当显式传入 allowed_tools 时,LLM 仅能使用所列出的工具;传入空列表 [] 可显式禁用工具。

最佳实践

✅ 好:转换字段名称,注入默认值
❌ 坏:在适配器中编写业务逻辑
✅ 好:
❌ 坏:

测试与验证

单元测试适配器

集成测试

故障排除

症状:日志显示 “Vendor adapter ” applied”(空字符串)修复:
症状:ImportError: No module named 'myvendor'修复:
症状:API 收到原始请求体,未转换调试:
检查:
  1. 适配器已在 __init__.py 中注册
  2. 配置中的供应商名称匹配
  3. auth_config.vendor 字段存在
  4. 适配器返回修改后的字典(不是 None)
症状:适配器中的 prompt_params 为 None原因:编排器未发送会话上下文修复:确保在 gRPC 请求中发送上下文:

总结

供应商适配器优势

  • ✅ 清晰分离:通用代码与供应商特定代码
  • ✅ 无需更改 Shannon 核心
  • ✅ 条件加载,优雅降级
  • ✅ 基于环境的密钥管理
  • ✅ 可隔离测试
  • ✅ 易于维护和扩展
三个组件:
  1. 供应商适配器 - 请求/响应转换
  2. 配置覆盖 - 工具配置
  3. 供应商角色 - 专门的代理(可选)
快速参考:

下一步

自定义工具

学习如何添加自定义工具

扩展 Shannon

探索其他扩展方法

配置

完整配置参考

架构

了解 Shannon 的架构