概要
Shannonは、カスタムツールを追加するための3つの方法をサポートしています。| 方法 | 最適 | コード変更 | 再起動が必要 |
|---|---|---|---|
| MCPツール | 外部HTTP API、迅速なプロトタイピング | なし | ✅ サービスのみ |
| OpenAPIツール | OpenAPI仕様のREST API | なし | ✅ サービスのみ |
| 組み込みツール | 複雑なロジック、データベースアクセス、パフォーマンス | Pythonコード | ✅ サービスのみ |
Proto/Rust/Goの変更は不要 - すべてのツールは最大の柔軟性のために汎用コンテナを使用します。
- ✅ APIまたはYAML設定による動的登録
- ✅ 組み込みのレート制限とサーキットブレーカー
- ✅ セキュリティのためのドメイン許可リスト
- ✅ コスト追跡と予算の強制
クイックスタート: MCPツールの追加
MCP(Model Context Protocol)ツールを使用すると、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: USDでの推定コストparameters: パラメータ定義の配列
2
ドメインアクセスの設定
開発用(緩和):本番用(推奨):
.envに追加:3
APIキーの追加
.envにAPIキーを追加:4
サービスの再起動
5
登録の確認
ログを確認:APIを介してツールをリスト:ツールスキーマを取得:
6
ツールのテスト
直接実行:ワークフロー経由:
MCPリクエスト規約
Shannonはこの形式でPOSTリクエストを送信します:代替: ランタイムAPI登録
開発/テスト用のみ(再起動時にツールが失われます):
OpenAPIツールの追加
OpenAPI 3.x仕様のREST APIの場合、Shannonはツールを自動的に生成できます。機能
サポートされている:- ✅ OpenAPI 3.0および3.1仕様
- ✅ URLベースまたはインライン仕様の読み込み
- ✅ JSONリクエスト/レスポンスボディ
- ✅ パスおよびクエリパラメータ
- ✅ Bearer、APIキー(ヘッダー/クエリ)、Basic認証
- ✅ operationIdまたはタグによる操作フィルタリング
- ✅ サーキットブレーカー(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フロー(Authorization Code、Client Credentials)がありません
- Bearerトークン(手動取得のみ)を使用可能
- 影響を受ける: Google APIs、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キー/基本認証を持つAPI
- ✅ 読み取り重視の操作(GETリクエスト)
- ✅ ローカル
$ref参照を持つ構造化された仕様 - ✅ パスおよびクエリパラメータ(プリミティブ)
クイックスタート
1
ツール定義の追加
config/shannon.yamlのopenapi_toolsを編集:2
環境の設定
.envに追加:3
サービスの再起動
4
検証とテスト
まず仕様を検証:レスポンス:ツールを実行:
認証の例
- Bearerトークン
- クエリ内のAPIキー
- 基本認証
- ヘッダー内のAPIキー
ビルトイン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 キー管理
❌ 悪い例:.env に保存(git で追跡されない):
- Docker シークレット
- Kubernetes シークレット
- HashiCorp Vault
- AWS Secrets Manager
危険なツール
状態を変更したり、機密リソースにアクセスするツールにマークを付ける:ベンダーアダプターパターン
ドメイン特有の API とカスタムエージェント用 プロプライエタリまたは内部 API を統合する際に、ドメイン特有の変換が必要な場合は、ベンダーアダプターパターンを使用して、ベンダーロジックを Shannon のコアインフラストラクチャから分離します。使用するタイミング
API 統合が次のことを必要とする場合にベンダーアダプタを使用します:- カスタムフィールド名のエイリアス(例:
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インフラストラクチャは汎用的なまま
- ✅ 条件付きロード: ベンダーモジュールが利用できない場合の優雅なフォールバック
- ✅ 簡単なテスト: アダプターを単体でテスト可能
- ✅ シークレット管理: すべてのトークンは環境変数経由
完全ガイド
以下を含む包括的なガイド:- 専門分野向けのカスタムエージェントロール
- セッションコンテキスト注入パターン
- テスト戦略
- ベストプラクティスとトラブルシューティング
Vendor Adapters Guide
アダプターパターンを使用してベンダー特有の統合を構築する方法を学ぶ
概要
ツールを追加する3つの方法:| 方法 | コマンド | 設定ファイル | コード変更 |
|---|---|---|---|
| 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のみ |
- ✅ プロトタイプ/Rust/Goの変更なし(汎用的な
google.protobuf.Structコンテナ) - ✅ セキュリティが組み込まれている(ドメインホワイトリスト、レート制限、サーキットブレーカー)
- ✅ コスト追跡が自動(メタデータに
cost_per_useを設定) - ✅ スキーマ駆動(OpenAI互換のJSONスキーマ)