はじめに
AIエージェントを作ったものの、
「結局、専用のチャット画面を開かないと使えない」
となってしまうと、日常業務で使ってもらうハードルは意外と高くなります。
できれば利用者には新しい操作方法を覚えてもらうのではなく、SlackやTeamsなど、普段から使い慣れているツールの中で、そのままAIエージェントを使ってもらいたいところです。
Oracle AI Database Private Agent Factory(以下PAF)で作成したAIエージェントは、専用のチャット画面から利用するだけでなく、Integration APIを介して外部アプリケーションから呼び出すことができます。
つまり、
「AIを使うために人が新しい画面へ移動する」のではなく、「普段使っているツールの中にAIエージェントを組み込む」
といった使い方ができます。
そこで今回は、ChatOpsでもよく利用されるSlackとPAFを連携してみます。
PythonでシンプルなSlack Botを作成し、SlackでBotへメンションするとPAFのAIエージェントへ質問を送り、その回答を同じSlackスレッドへ投稿します。
処理の流れは以下の通りです。
- SlackでBotへメンションする
- Python製Slack BotがPAFのIntegration APIへ質問を送信する
- PAFのAIエージェントが回答する
- Botが回答を同じSlackスレッドへ投稿する
ちなみにPAFで作成したAIエージェントを外部アプリケーションから呼び出す仕組み自体は以前から用意されていましたが、従来はセッションCookieの取得など、認証まわりの準備が煩雑でした。
PAF 26.7より、外部連携用のAPIキーを生成できる API Key Integration が追加されました。
Integration optionsからAPIキーを生成し、Bearer Tokenとしてリクエストに指定するだけで認証できるため、Slack Botのような外部ツールとの連携を以前よりシンプルに実装できるようになっています。
なお今回Slackと連携するPAFのAIエージェントは以下記事で実装したものを流用します。
動作確認環境
PAFはOCI Compute の VM.Standard3.Flex (2 OCPU) 上で構築しました。
OSはOracle Linux 8です。
PAFのバージョンは記事を作成した時点で最新の 26.7 にしました。
インストール要件は下記をご確認ください。
1. PAF側の準備
PAFのチャット画面で対象エージェントを開き、Integration optionsから次の情報を取得します。
API Key タブでAPIキーを生成
Endpoint URL タブに表示されたEndpoint URLをメモ
一先ず curl でPAFから応答が返ることを確認します。
export PAF_ENDPOINT='your endpoint url'
export PAF_API_KEY='your api key'
curl -k --location "$PAF_ENDPOINT" \
--header "Authorization: Bearer $PAF_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"message":"VMwareのストレージ遅延について教えてください"}'
{"roomId":"5AA29...","message":"VMwareのストレージ遅延について、ナレッジ検索エージェントとWeb検索から得られた情報をもとに回答します。...(略)..."}
curl の -k はTLS証明書の検査を無効化します。
本記事では検証環境へ接続するために使用しますが、本番環境では証明書に一致するホスト名と信頼済みCAかどうかの検査をするようご検討ください。
2. Slack Appを作成する
Slack APIのApp管理画面 https://api.slack.com/apps で、Create New App を押下します。
From an app manifest を選択して Continue を押下します。
次の画面でManifestを入力します。
display_information:
name: PAF Assistant
description: PAFエージェントをSlackから呼び出すBot
features:
bot_user:
display_name: PAF Assistant
always_online: true
oauth_config:
scopes:
bot:
- app_mentions:read
- chat:write
settings:
event_subscriptions:
bot_events:
- app_mention
socket_mode_enabled: true
token_rotation_enabled: false
以下はManifestの簡単な解説です。
| 設定 | 内容 |
|---|---|
display_information |
Slack Appの名前と説明を設定します。 |
features.bot_user |
Slack上に表示されるBotユーザーを作成します。 |
app_mentions:read |
Bot宛てのメンションを受信する権限です。 |
chat:write |
BotがSlackへ回答を投稿する権限です。 |
app_mention |
Botがメンションされたときにイベントを送信します。 |
socket_mode_enabled |
公開Request URLではなく、WebSocket経由でイベントを受信します。 |
良ければ Next を押下します。
レビュー画面で確認して問題なければ Create を押下します。
Manifestの登録後、次の設定を行います。
Install App からAppをWorkspaceへインストール
(以下はインストール後の画面です。)
OAuth & Permissions でBot User OAuth Token(xoxb-...)を取得
Basic Information → App-Level Tokensでconnections:writeを持つToken(xapp-...)を生成
(以下は設定後の画面です。)
Botを利用するSlackチャンネルへ招待する
3. Botを実装する
まずはuvをインストールします。
なお今回は opc ユーザを利用しました。
curl -LsSf https://astral.sh/uv/install.sh | sh
任意の作業ディレクトリで次のコマンドを実行します。
mkdir paf-slack-bot
cd paf-slack-bot
uv init --python 3.12
uv add 'slack-bolt==1.30.0' 'aiohttp==3.14.3' 'httpx==0.28.1' 'python-dotenv==1.2.4'
bot.py を作成します。
このサンプルでは前述の curl -k と同様に、PAF接続時のTLS証明書検証を verify=False で無効化します。
検証目的に限定した設定であり、本番環境では使用しないでください。
import asyncio
import os
import re
import httpx
from dotenv import load_dotenv
from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler
from slack_bolt.async_app import AsyncApp
load_dotenv()
app = AsyncApp(token=os.environ["SLACK_BOT_TOKEN"])
@app.event("app_mention")
async def call_paf(event, say, ack):
await ack()
question = re.sub(r"<@[^>]+>\s*", "", event["text"], count=1)
async with httpx.AsyncClient(timeout=120, verify=False) as client:
response = await client.post(
os.environ["PAF_ENDPOINT"],
headers={"Authorization": f"Bearer {os.environ['PAF_API_KEY']}"},
json={"message": question},
)
response.raise_for_status()
answer = response.json()["message"]
await say(text=answer, thread_ts=event.get("thread_ts") or event["ts"])
async def main():
handler = AsyncSocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
await handler.start_async()
if __name__ == "__main__":
asyncio.run(main())
処理の流れは次のとおりです。
-
app_mentionでBotへのメンションを受信する - メッセージからBotのメンション部分を除去する
- PAFへ
{"message": "質問"}をPOSTする - PAFの回答を
thread_tsで同じSlackスレッドへ投稿する
4. Botを起動してみる
プロジェクト直下に .env を作成し、SlackのTokenとPAFの接続情報を記述します。
SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-...
PAF_ENDPOINT=<your paf endpoint url>
PAF_API_KEY=<your paf api key>
.env を作成したユーザーだけが読み書きできるように権限を設定してからBotを起動します。
chmod 600 .env
uv run python bot.py
正常に起動すると、BotはSocket Modeの接続を維持したままイベントを待ち受けます。
そのためコマンド実行後はシェルのプロンプトへ戻りません。
5. Slackから呼び出す
Botを招待したチャンネルで、次のように質問します。
@PAF Assistant VMwareにおいてストレージアクセス遅延が発生しています。どういった原因と対策が考えられますか?
PAFから返された回答が以下のように同じSlackスレッドへ投稿されれば成功です。
まとめ
今回はPAFで作成したAIエージェントをPython製Slack Botから呼び出し、回答をSlackのスレッドへ返す仕組みを実装しました。
PAFで作成したAIエージェントは専用のチャット画面だけでなく、Integration APIを利用することでSlackのような普段使い慣れたツールから呼び出すことができます。
AIエージェントを既存の業務フローに組み込むことで、利用者は新しい操作方法を覚えることなく、日常のツールからそのままAIを活用できます。
PAFでAIエージェントを作成した際はエージェントそのものだけでなく、「どこから使ってもらうか」まで考えてみると活用の幅がさらに広がりそうです。











