Vercel AI x Stripe AI Agent Toolkitで支払いリンクや請求書をエージェントにつくらせてみる
Vercel AIとStripe AI Agent Toolkitを組み合わせて、チャット内容から支払いリンクや請求書を自動生成するデモアプリを作成。簡単な実装方法と実際の動作例を紹介します。
目次
生成AIを利用して自律的にAPI呼び出しやタスク実行、テキスト生成を進めるAIエージェントが話題ですね。Stripeなどの一部SaaSでは、自社APIをエージェントに利用してもらうためのSDKもリリースされ始めています。今回は決済 x AIエージェントということで、支払いURLや請求書発行をエージェントが実行するデモアプリをVercel AIと組み合わせて作ってみました。
Stripe x AIエージェントで作れるものを一部紹介
今回試してみたのは2つです。1つ目は会話内容に基づいた決済URLを生成する仕組みです。SlackやLINE Worksなどの社内チャットででた議論から、そのまま決済URLを作らせるような使い方が考えられると思い設定してみました。

もう1つは請求書エージェントです。Stripeが持つ請求書発行・管理機能(Stripe Invoicing)を使って、会話内容に基づいた請求書発行や請求書の確認を行うデモを作りました。こちらも社内Slackで請求書発行や検索などができると、請求系業務がかなり捗るのではないかと思いますし、他にもオーダーメイド商品の見積もりなどにも使えそうです。

Agent Toolkitを AI SDK から利用する方法
このようなデモを組み込むことは、実はとても簡単です。まずは Stripe の Agent Toolkit をセットアップしましょう。
npm install @stripe/agent-toolkit
続いてクライアントを初期化しましょう。import時に@stripe/agent-toolkit/ai-sdk
を使うようにすることに注意しましょう。また、このツールを使う場合は、使いたい Stripe リソースに明示的な権限を付与する必要があります。Stripe Payment Links を作成する場合は、サンプルコードにあるpaymentLinks
/ products
/ prices
の3つを次のように指定しましょう。
import { StripeAgentToolkit } from "@stripe/agent-toolkit/ai-sdk";
const stripeAgentToolkit = new StripeAgentToolkit({
secretKey: STRIPE_SECRET_API_KEY,
configuration: {
actions: {
paymentLinks: {
create: true,
},
products: {
create: true,
},
prices: {
create: true,
},
},
},
});
あとはAI SDKのstreamText()
にtools
としてこれを渡すだけです。
const model = createAnthropic({
apiKey: CLAUDE_API_KEY
})('claude-3-5-sonnet-20241022')
const result = streamText({
model,
messages,
tools: stripeAgentToolkit.getTools(),
maxSteps: 5,
}
これだけで、あとはAI SDKが利用する LLM が必要に応じて Stripe API を代わりに実行してくれます。
作成を依頼するプロンプトを送信する
SDKのリポジトリにあるテキストをいれてみましょう。
Create a payment link for a new product called "test" with a price of $100. Come up with a funny description about buy bots, maybe a haiku.
返答文にURLが記載されています。これにアクセスすると、実際の決済URLが出てきました。

ログをmiddlewareでとってみると、商品の作成などを行なっていることもわかります。
{
type: 'tool-call-delta',
toolCallType: 'function',
toolCallId: 'toolu_01YPdfjJKMvennStT1cJsaeu',
toolName: 'create_payment_link',
argsTextDelta: ', "quantity"'
}
{
type: 'tool-call-delta',
toolCallType: 'function',
toolCallId: 'toolu_01YPdfjJKMvennStT1cJsaeu',
toolName: 'create_payment_link',
argsTextDelta: ': 1}'
}
{
type: 'tool-call',
toolCallType: 'function',
toolCallId: 'toolu_01YPdfjJKMvennStT1cJsaeu',
toolName: 'create_payment_link',
args: '{"price": "price_1QuoFoIhOCn7chfE05boPnAv", "quantity": 1}'
}
{
type: 'finish',
finishReason: 'tool-calls',
usage: { promptTokens: 1545, completionTokens: 110 },
providerMetadata: { anthropic: { cacheCreationInputTokens: 0, cacheReadInputTokens: 0 } }
}
Next Step: 請求書の発行と確定をさせてみる
もう1つ試してみましょう。今度は請求書発行ですので、権限を更新します。
const stripeAgentToolkit = new StripeAgentToolkit({
secretKey: STRIPE_SECRET_API_KEY,
configuration: {
actions: {
prices: {
read: true,
},
products: {
read: true,
},
invoiceItems: {
create: true,
},
customers: {
read: true,
},
invoices: {
create: true,
update: true,
},
},
},
});
続いてプロンプトで指示を行いましょう。確実性を高めるため、ある程度IDを明示的に指示しました。
下の画像が会話ログですが、よくみるとプロンプトにミスがあることがわかります。Stripeで請求書を出すには、商品IDではなく料金IDが必要でした。しかしプロンプトでは商品IDを提供しているため、料金IDを見つけることができていません。しかしVercel AIは会話のログを自動的に送信してくれることもあり、正しい料金IDを渡すだけで作業が再開されています。LangChainでいうところのMemory系の実装が省略できるのはVercel AI SDKを使う際の便利ポイントといえます。

ちなみにこの後、請求書の確定処理(finalize)を指示してみました。こちらもinvoices: { update: true }
が設定されていれば、実行してくれます。

情報の検索までやらせてみる
先ほどのやり取りではIDを渡す形でした。そのため、確かに処理は完了していますが、「これならAPIリクエストを作っているのと変わらないよね?」という印象があります。そこで今度は情報の検索までさせてみましょう。
今回のプロンプトは、[email protected] に対して、商品名「test」を1点請求するinvoiceを発行して
です。[email protected]
のメールアドレスを持つCustomerデータと、test
を商品名とするProduct + Priceデータを事前に作成しているので、AI Agentがこれらを自分で見つけてくれるかを検証しましょう。

検索結果が返答に含まれていないのは気になりますが、手順上は請求書が作れていそうです。Stripeダッシュボードを見ると、実際に請求書も作成されていました。

ちなみに作成した請求書の情報を教えて欲しい時は、そのように質問すると検索して表示してくれます。

顧客の作成なども行うことが可能
StripeAgentToolKit
の設定を更新すると、customerデータも作れます。customers
にcreate: true
を追加しましょう。
customers: {
read: true,
create: true,
}
先ほどの会話に追加して、また新しい請求書を作りたい。今度は同じ商品を、[email protected]に対して2点請求してください。
と依頼してみました。すると今度は、顧客データがないことを確認して作成後、商品情報は履歴から再利用しています。

なお、請求書を作成する際に内部的に通貨が日本円(JPY)になっていたためか、請求書の明細追加処理でエラーが発生しました。
{
"error": {
"message": "The price specified supports currencies of `usd` which doesn't include the expected currency of `jpy`.",
"param": "price",
"request_log_url": "https://dashboard.stripe.com/test/logs/req_xxxx?t=1740115710",
"type": "invalid_request_error",
},
}
エラーの詳細がStripeダッシュボードに行かないとわからない問題はありますが、通貨など料金の設定値が原因の場合は、prices: { create: true }
を設定して「1000円の料金を追加して、それをつかって
」のように指示することで解決できます。

エラーメッセージをどう伝えるか、UIにそのまま出すのが正解なのか・内部エラーとして扱うのが正解なのかも含めて、エージェントとの会話フローはまだまだ発展途上かもしれませんね。
モデルやProvider SDKによって精度や実行時間が変わる
ClaudeやOpenAIだとほぼ確実に生成してくれますが。それ以外のモデルやProvider、特にCommunity Providersを使う場合は事前の検証や必要に応じたコードリーディングが必要そうです。例えばCloudflare Workers AI経由でllama-3.3-70b-instruct-fp8-fastをテストしたところ、ツールを全く利用しませんでした。

モデルが対応していないケースもあるとは思いますが、可能性としてはToolを使う処理系統がProvider側に実装されていないパターンも十分に考えられます。そのため、Toolを利用する前提の場合は、利用するモデルやProvider SDKが対応しているかを事前にしっかり検証しておきましょう。
まとめ
このように Agent Toolkit SDK を利用すると、非常に簡単に Stripe API を 生成AI チャットやワークフローに取り入れることができます。もちろん利用判断などを 生成AI に委ねる以上、「必ずこの手順・リクエストで実行すること」という厳密さを期待することはできません。しかし問い合わせベースの顧客サポートや商談ベースの柔軟な対応が求められるユースケースなどでは、膨大な条件分岐を実装するよりも、 生成 AI に任せる方が効率的な可能性があります。ユースケースや使い所を見極めて、ぜひ AIを利用した FinTech 的な業務改善などに挑戦してみましょう。