3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自作したAIエージェントをいつものSlackから使いたい!Private Agent Factoryで作ったAIエージェントをSlackから呼び出してみた

3
Posted at

はじめに

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スレッドへ投稿します。
処理の流れは以下の通りです。

  1. SlackでBotへメンションする
  2. Python製Slack BotがPAFのIntegration APIへ質問を送信する
  3. PAFのAIエージェントが回答する
  4. 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キーを生成

スクリーンショット 2026-10-04 201907.png

Endpoint URL タブに表示されたEndpoint URLをメモ

スクリーンショット 2026-10-04 201913.png

一先ず 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 を押下します。

スクリーンショット 2026-10-04 202215.png

From an app manifest を選択して Continue を押下します。

スクリーンショット 2026-10-04 202228.png

次の画面で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

スクリーンショット 2026-10-04 202250.png

以下は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 を押下します。

スクリーンショット 2026-10-04 202313.png

Manifestの登録後、次の設定を行います。

Install App からAppをWorkspaceへインストール
(以下はインストール後の画面です。)

スクリーンショット 2026-10-04 203758.png

OAuth & Permissions でBot User OAuth Token(xoxb-...)を取得

スクリーンショット 2026-10-04 203815.png

Basic Information → App-Level Tokensでconnections:writeを持つToken(xapp-...)を生成
(以下は設定後の画面です。)

スクリーンショット 2026-10-04 203839.png

Botを利用するSlackチャンネルへ招待する

スクリーンショット 2026-10-04 203903.png

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 で無効化します。
検証目的に限定した設定であり、本番環境では使用しないでください。

bot.py
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())

処理の流れは次のとおりです。

  1. app_mention でBotへのメンションを受信する
  2. メッセージからBotのメンション部分を除去する
  3. PAFへ {"message": "質問"} をPOSTする
  4. PAFの回答を thread_ts で同じSlackスレッドへ投稿する

4. Botを起動してみる

プロジェクト直下に .env を作成し、SlackのTokenとPAFの接続情報を記述します。

.env
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においてストレージアクセス遅延が発生しています。どういった原因と対策が考えられますか?

スクリーンショット 2026-10-05 004043.png

PAFから返された回答が以下のように同じSlackスレッドへ投稿されれば成功です。

スクリーンショット 2026-10-05 004058.png

まとめ

今回はPAFで作成したAIエージェントをPython製Slack Botから呼び出し、回答をSlackのスレッドへ返す仕組みを実装しました。

PAFで作成したAIエージェントは専用のチャット画面だけでなく、Integration APIを利用することでSlackのような普段使い慣れたツールから呼び出すことができます。

AIエージェントを既存の業務フローに組み込むことで、利用者は新しい操作方法を覚えることなく、日常のツールからそのままAIを活用できます。

PAFでAIエージェントを作成した際はエージェントそのものだけでなく、「どこから使ってもらうか」まで考えてみると活用の幅がさらに広がりそうです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?