Google ColabでStripeのAgent ToolkitとLangChainを組み合わせたAIエージェントを実行しよう


この記事では、生成AIとStripeの新しいエージェント向けSDKを活用したAIエージェントの開発・テストを[Google Colaboratory (Google Colab)](https://colab.research.google.com/?hl=ja)で簡単に行う方法を紹介します。生成AIエージェントの作り方やLangChain系ツールの動かし方、そして決済や請求管理に関する業務の自動化に興味がある方はぜひご覧ください。


![スクリーンショット 2024-11-15 9.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ec4d114d-f4d5-fff2-85bf-e11567cfae81.png)



## Google Colabで生成AIエージェントを簡単に実装・テストする

[Google Colab](https://colab.research.google.com/?hl=ja)は、ブラウザ上でPythonコードを記述・実行できるウェブサービスです。Googleドライブにコードなどを保存し、Jupyterノートブックを利用してコマンドの実行やコードの記述・実行などをブラウザ上から行うことができます。このツールを利用することで、LangChainなどをの生成AI向けフレームワークやPythonスクリプトを簡単に評価・調査できます。


![スクリーンショット 2024-12-13 10.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/078c06d3-5ae0-88d5-d40a-9062c48f18f0.png)

そしてStripeでは、生成AIエージェントを利用して決済処理や請求管理等を自動化するために利用できる[Agent Toolkit SDK](https://github.com/stripe/agent-toolkit)の開発者プレビュー版を2024年にリリースしました。このSDKを利用して、生成AIを利用したPayment Linksの作成や請求書・顧客情報の作成処理などが簡単に実装できます。

ここでは、このAgent Toolkit SDKを簡単に試す方法として、Google Colabを利用し、LangChainと組み合わせで実行する方法を紹介します。

## Google ColabでLangChainを利用したエージェントを作る方法

Google Colabを利用して、実際にAIエージェントを構築してみましょう。まずは[Google Colabにて新しいノートブックを作成](https://colab.research.google.com/?hl=ja)します。

![スクリーンショット 2024-12-13 11.03.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/63ab4ea4-bb9f-efcb-2d07-2087d41ef7dc.png)

Jupyterノートを利用したエディタが開きます。ここでPythonアプリケーションコードやコマンドを実行し、エージェントアプリを実装してきます。

![スクリーンショット 2024-12-13 11.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/bb8ddd27-23b4-be6f-9bdc-260fc6ee1046.png)


### Step1: SDKのセットアップを行う

まずは利用するライブラリのインストールを行いましょう。LangChainはライブラリ本体と、利用する生成AIサービスのライブラリが必要です。例えばOpenAIのAPIを利用する場合は、次のコマンドを実行します。Anthropic ( Claude )やAmazon Bedrockなどのサービスを利用したい場合は、[LangChainのドキュメント](https://python.langchain.com/docs/integrations/providers/)から対応するプロバイダーのパッケージ名を確認しましょう。

```bash
!pip install langchain langchain-community langchain-openai
```

続いてStripeのAgent Toolkit SDKを利用するため、こちらもインストールを行います。1度にインストールしても良いのですが、どの用途で使うライブラリであるかを区別するため、便宜上ここでは2つのインストールコマンドに分割しています。

```bash
!pip install stripe-agent-toolkit  stripe
```

ライブラリのインストールが完了したら、次は生成AIサービスとStripeのAPIを利用する準備を始めましょう。

### Step2: Colabでシークレットキーの設定を行う

今回作るエージェントアプリでは、2つのAPIキーが必要です。OpenAIを利用する場合、次の2つをColabのシークレットとして登録しましょう。

 - `OPENAI_API_KEY`: [OpenAI APIのAPIキー](https://platform.openai.com/api-keys)
 - `STRIPE_SECRET_KEY`: [StripeのシークレットAPIキー](https://docs.stripe.com/keys?locale=ja-JP)

シークレットに登録する際、**ノートブックからのアクセス**をオンにしてください。

![スクリーンショット 2024-11-29 17.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1ac54852-cb1f-53fd-e857-d0ba5cd59641.png)

APIキーの設定が終われば、いよいよエージェントコードの実装をPythonにて行います。

### Step3: LangChainを使ったエージェントを実装する

ここからはPythonでLangChainのコードを実装します。LangChainでエージェントを実装・実行するには、`langchain.agents`にある`AgentExecutor`を利用します。ここに`create_structured_chat_agent`関数で登録した生成AIモデル(今回は`ChatOpenAI`)とプロンプト、そしてAgent Toolkit SDKで作成したToolsの3つを設定します。生成AIのモデルには、`userdata.get`関数を利用してシークレットへ保存したAPIキーを渡すようにしましょう。

```python
from google.colab import userdata
from langchain_community.chat_models import ChatOpenAI
from langchain.agents import AgentExecutor, create_structured_chat_agent

tools = // @TODO このあと実装する
prompt = // @TODO このあと実装する

model = ChatOpenAI(openai_api_key=userdata.get("OPENAI_API_KEY"))
agent = create_structured_chat_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
```

エージェントを利用することを指示するプロンプトを設定する必要があります。LangChainではプロンプトを[LangChain Hub](https://smith.langchain.com/hub)からインポートして、プロンプト作成や保守管理を効率化できます。[`hwchase17/structured-chat-agent`](https://smith.langchain.com/hub/hwchase17/structured-chat-agent)として公開されているプロンプトを利用しましょう。

```diff_python
from google.colab import userdata
+from langchain import hub
from langchain_community.chat_models import ChatOpenAI
from langchain.agents import AgentExecutor, create_structured_chat_agent

tools = // @TODO このあと実装する
-prompt = // @TODO このあと実装する
+prompt = hub.pull("hwchase17/structured-chat-agent")

model = ChatOpenAI(openai_api_key=userdata.get("OPENAI_API_KEY"))
agent = create_structured_chat_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
```

最後に`StripeAgentToolkit`を使ってLangChain向けのエージェントをセットアップします。`secret_key`でStripeのシークレットAPIキーを設定しますので、`userdata.get`を使ってColabに登録したデータを利用しましょう。`configuration`の値は、利用するエージェントが実行できるStripe APIリソースとオペレーションの種類を設定します。今回の例では商品・料金そして支払いリンクの3つの作成が許可されています。

```diff_python
from google.colab import userdata
from langchain import hub
from langchain_community.chat_models import ChatOpenAI
from langchain.agents import AgentExecutor, create_structured_chat_agent
+from stripe_agent_toolkit.langchain.toolkit import StripeAgentToolkit

+stripe_agent_toolkit = StripeAgentToolkit(
+    secret_key=userdata.get("STRIPE_SECRET_KEY"),
+    configuration={
+        "actions": {
+            "payment_links": {
+                "create": True,
+            },
+            "products": {
+                "create": True,
+            },
+            "prices": {
+                "create": True,
+            }
+        }
+    },
+)
+tools = stripe_agent_toolkit.get_tools()
-tools = // @TODO このあと実装する

prompt = hub.pull("hwchase17/structured-chat-agent")
model = ChatOpenAI(openai_api_key=userdata.get("OPENAI_API_KEY"))
agent = create_structured_chat_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
```

ここまででエージェントの準備ができました。最後にエージェントへ依頼するテキストを`agent_executor.invoke`関数で設定します。どのStripe APIを利用するかやAPIパラメータの設定はAgent Toolkit SDKが処理しますので、金額や商品名などの情報だけを文章に含めましょう。

```python
agent_executor.invoke({
  "input": "1枚1000円のライブチケットを注文するリンクを作ってください。"
})
```

ここまでの実装が完了したら、スクリプトを実行しましょう。実行に成功すると、次のような出力が表示されます。

```bash
{'input': '1枚1000円のライブチケットを注文するリンクを作ってください。',
 'output': 'こちらが1枚1000円のライブチケットを注文するリンクです： https://buy.stripe.com/test_xxxx'}
```

リンクにアクセスすると、プロンプトに基づいて作成されたPayment Linksの決済ページが表示されます。

![スクリーンショット 2024-12-13 11.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/543eb81d-92aa-5e73-b324-d777d0e08a91.png)

このようにして、生成AIとLangChainを利用したAIエージェントでStripeのAPIを操作することができます。

### 全てのコードはこちら

今回実装したコードの全文はこちらです。

```python
from google.colab import userdata
from langchain import hub
from langchain_community.chat_models import ChatOpenAI
from langchain.agents import AgentExecutor, create_structured_chat_agent
from stripe_agent_toolkit.langchain.toolkit import StripeAgentToolkit

stripe_agent_toolkit = StripeAgentToolkit(
    secret_key=userdata.get("STRIPE_SECRET_KEY"),
    configuration={
        "actions": {
            "payment_links": {
                "create": True,
            },
            "products": {
                "create": True,
            },
            "prices": {
                "create": True,
            }
        }
    },
)
tools = stripe_agent_toolkit.get_tools()

prompt = hub.pull("hwchase17/structured-chat-agent")
model = ChatOpenAI(openai_api_key=userdata.get("OPENAI_API_KEY"))
agent = create_structured_chat_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
```


## エラーが発生した場合は、プロンプトの情報不足も疑おう

Agent Toolkit SDKでは、Payment Linksの作成以外にも請求書の発行や確定などの操作もサポートしています。

```python
stripe_agent_toolkit = StripeAgentToolkit(
    secret_key=userdata.get("STRIPE_SECRET_KEY"),
    configuration={
        "actions": {
            "products": {
                "create": True,
            },
            "prices": {
                "create": True,
            },
            "invoices": {
                "create": True,
                "update": True,
            },
            "invoiceItems": {
                "create": True,
                "update": True,
            },
            "customers": {
                "create": True,
            }
        }
    },
)
prompt = hub.pull("hwchase17/structured-chat-agent")

tools = stripe_agent_toolkit.get_tools()
agent = create_structured_chat_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)

agent_executor.invoke({
  "input": "メールアドレスがtest@example.comの顧客へ請求書を発行します。請求書を発行した後、単価1000円のライブチケットを商品として登録してください。最後に請求書のinvoice_itemへライブチケットを2個追加してください。"
})
```

ただし場合によっては、次のような実行エラーが発生することもあります。もちろんPythonコードの実装内容が問題ないかを確認する必要がありますが、時にはプロンプトに渡された情報が不足しているケースも存在します。

 ```
  warnings.warn(
---------------------------------------------------------------------------
InvalidRequestError                       Traceback (most recent call last)
<ipython-input-3-8f39873d2282> in <cell line: 40>()
     38 agent_executor = AgentExecutor(agent=agent, tools=tools)
     39 
---> 40 agent_executor.invoke({
     41   "input": "1枚１０００円ライブチケットを2枚注文する請求書を発行してください。"
     42 })

16 frames
/usr/local/lib/python3.10/dist-packages/stripe/_api_requestor.py in handle_error_response(self, rbody, rcode, resp, rheaders, api_mode)
    334             )
    335 
--> 336         raise err
    337 
    338     def specific_v2_api_error(self, rbody, rcode, resp, rheaders, error_data):

InvalidRequestError: Request req_TkAxqEyUG5nI3K: Missing email. In order to create invoices that are sent to the customer, the customer must have a valid email.
 ```

このケースでは、コード自体にエラーはありませんでした。しかし請求書を作成する指示を行うプロンプトの中に、対象となる顧客のメールアドレスが漏れています。そのため、Stripe APIを利用して請求書を発行するタスクが失敗し、それによってエラーが発生しているという状況です。

Stripe APIがエラーを返したことによる実行エラーについては、ログに出力された`req_`から始まるリクエストIDを利用して調査を行います。[Stripeダッシュボードのワークベンチ機能](https://dashboard.stripe.com/test/workbench/logs)を利用し、対象のAPIリクエストログを調べましょう。ここで不足している情報などを調査して、プロンプトや会話フローを調整しましょう。

![スクリーンショット 2024-12-13 11.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/9c2abd4a-3eb5-91be-e6bd-ad53bbfaaf70.png)

## 開発者プレビューのAgent SDKにご参加ください

Agent Toolkit SDKは記事作成時点（2024/12）では開発者プレビューです。[サポートしているAPI](https://github.com/stripe/agent-toolkit/tree/main?tab=readme-ov-file#supported-api-methods)も限定的ですので、ぜひColabやLangChainなどを利用してお試しください。「このAPI・ユースケースで利用したい」や「APIパラメータの追加サポートが必要」などのフィードバックを[GitHub Issue](https://github.com/stripe/agent-toolkit/issues)へお寄せ頂くことで、このSDKをより便利に使いやすくしていくことができます。

生成AI・AIエージェントの開発に挑戦するためのパーツの1つとして、そしてRevOpsや収益財務・請求管理の自動化を目指すための新しいSDKとして、Stripeをぜひお試しください。

https://github.com/stripe/agent-toolkit