構築する内容
このチュートリアルの最後には、次のような機能を備えた、動作するPythonサービスが完成します。- BoxのWebhookを使用して、指定された「Invoices Inbox」フォルダ内の新規ファイルを確認します。
- メタデータテンプレートを使用して、Box AIの抽出 (構造化) エンドポイントを呼び出します。
- 抽出されたキー/値ペアを、Boxのメタデータとしてファイルに書き戻します。
- 必要に応じて、抽出された集計データを記録し、ダウンストリームのERP統合で活用します。
前提条件
始める前に、以下が揃っていることを確認してください。- Box AIが有効化された。
- クライアント資格情報許可認証で構成されたBoxアプリケーション。
- Python 3.11以上。
- アプリで以下のスコープが有効になっていること。
- Boxに格納されているすべてのファイルとフォルダの読み取り
- Boxに格納されているすべてのファイルとフォルダへの書き込み
- AIを管理する
- Webhookを管理する
手順
このソリューションでは、以下に示す3つのBox Platform機能を使用します。| コンポーネント | 目的 | API |
|---|---|---|
| Webhook | 受信トレイフォルダに届いた新しいファイルを検出する | POST /2.0/webhooks |
| Box AI Extract | 各請求書PDFから構造化されたフィールドを抽出する | POST /2.0/ai/extract_structured |
| メタデータ | 抽出された値をファイルに書き戻す | POST /2.0/files/:id/metadata/:scope/:template |
メタデータテンプレートの作成
メタデータテンプレートは、Box AIが抽出するフィールドを定義します。一度作成すれば、本サービスで処理されるすべての請求書から、この形式で値が返されます。
- Box管理コンソールを開き、[メタデータ] を選択します。
- [請求書] タブで、[新規] をクリックして
Invoiceという名前を付けます。 - 以下のフィールドを追加します。
| フィールド名 | 型 | 説明 |
|---|---|---|
| ベンダー名 | テキスト | 請求書を発行するベンダーまたはサプライヤの名前 |
| 請求書番号 | テキスト | 一意の請求書識別子 |
| 請求日 | 日付 | 請求書の発行日 |
| 期日 | 日付 | 支払期日 |
| 合計額 | 数字 | 税金および手数料を含む合計支払い額 |
| 通貨 | テキスト | 3文字の通貨コード (例: USD、EUR、GBP) |
- [テンプレート名] の下にあるテンプレートキーをコピーします。後の手順で必要になります。
- [保存] をクリックします。
請求書受信トレイフォルダの作成
請求書の保存場所として使用する専用のフォルダを、Box内に作成します。
- Boxで、
Invoices Inboxという名前の新しいフォルダを作成します。 - フォルダIDがURLで決まることに注意してください。たとえばURLが
https://app.box.com/folder/123456789の場合、フォルダIDは123456789となります。 - このフォルダをアプリケーションのサービスアカウントと共有します。CCGアプリケーションは、コンテンツへのアクセス権限が自動的には付与されない別個のサービスアカウントユーザーとして動作するため、この設定が必要です。
開発環境のセットアップ
- ターミナルを開き、新しいプロジェクトディレクトリを作成します。
- Pythonの仮想環境を作成してアクティブ化します。
(.venv)と表示されます。これにより、仮想環境内で作業していることがわかります。新しいターミナルウィンドウやタブを開くたびに、プロジェクトディレクトリから
source .venv/bin/activateを実行して、仮想環境を再アクティブ化する必要があります。コマンドの実行中にModuleNotFoundErrorが表示される場合、通常、venvがアクティブ化されていないことを意味します。- 必要なパッケージをインストールします。
- 資格情報を保存するための
.envファイルを作成し、以下の内容を追加します。プレースホルダの値を、Box開発者コンソールで確認した実際の資格情報で置き換えます。
環境変数の理解:
.envファイルには機密情報 (実際の資格情報) が保存されています。Pythonコードは、os.getenv("VARIABLE_NAME")を使用してこれらの名前を参照することで、その値を読み取ります。たとえばos.getenv("BOX_CLIENT_ID")を実行すると、.envファイル内のBOX_CLIENT_ID=の隣に保存されている値を検索します。以下の手順でコードをコピーする際は、引用符で囲まれた変数名をそのまま正確に保持してください。実際の資格情報に置き換えないでください。抽出関数の構築
extract.pyという名前の新しいファイルを作成し、以下のコードを貼り付けます。これがサービスの核となる部分です。このコードはファイルIDを受け取り、Box AIを呼び出してメタデータテンプレートを使用してフィールドを抽出し、構造化された結果を返します。ファイルへのメタデータの書き戻し
metadata.pyという名前の新しいファイルを作成し、以下のコードを貼り付けます。この関数は、抽出された値をメタデータインスタンスとしてファイルに追加します。Webhookリスナーの作成
app.pyという名前の新しいファイルを作成し、以下のコードを貼り付けます。このFlaskアプリケーションは、受信トレイフォルダに新しいファイルが届いたときに、Webhook通知を受け取ります。本番環境では、リクエストがBoxから送信されたものであることを確認するために、Webhook署名を検証する必要があります。実装の詳細については、を参照してください。
統合のテスト
公開URLやWebhookを設定しなくても、ローカル環境で抽出パイプラインをテストできます。この手順では、新しいファイルが届いた際にBoxから送信される内容をシミュレートします。ターミナル1 - サーバーを起動する次のように表示されます。このターミナルは起動したままにしておきます。ターミナル2 - テストリクエストを送信する新しいターミナルタブまたはウィンドウを開きます。curlを使用して、シミュレートされたWebhookペイロードを送信します。結果の確認ターミナル1に戻ります。抽出されたフィールドが出力され、その後にメタデータが適用されたことを示す確認メッセージが表示されます。Boxでファイルを開き、[メタデータ] タブをクリックして、値が正しく書き込まれていることを確認します。
この手順では、2つのターミナルウィンドウを同時に開く必要があります。ターミナル1で、Flaskサーバーを実行します (これは常時稼働させておく必要があります)。ターミナル2では、このサーバーにテストリクエストを送信します。
invoice-intakeディレクトリを開いていることと、仮想環境がアクティブ化されていることを確認します。<FILE_ID>を、Boxにアップロードした請求書PDFのファイルIDに置き換えます。トラブルシューティング
ModuleNotFoundError: 「...」という名前のモジュールが見つからない
ModuleNotFoundError: 「...」という名前のモジュールが見つからない
仮想環境がアクティブ化されていません。
python3コマンドを実行する前に、プロジェクトディレクトリからsource .venv/bin/activateを実行してください。新しく開いたターミナルタブは、すべて個別にアクティブ化する必要があります。invalid_client: クライアント資格情報が無効である
invalid_client: クライアント資格情報が無効である
以下のように、
.envファイルを確認します。BOX_CLIENT_IDおよびBOX_CLIENT_SECRETが、開発者コンソール > [構成] の値と一致していることを確認します。BOX_ENTERPRISE_IDが自分のEnterprise IDであることを確認します (管理コンソール > [アカウントと請求]、または開発者コンソール > 右上のアイコン > [Enterprise IDをコピー] で確認できます)。- 開発者コンソールでアプリが承認されていることを確認します。
- アプリの種類がクライアント資格情報許可になっていることを確認します。
404 Not Found
404 Not Found
サービスアカウントに、そのファイルまたはフォルダへのアクセス権限がありません。開発者コンソール > [一般設定] に記載されているサービスアカウントのメールアドレスを、請求書ファイルが保管されているフォルダのコラボレータとして招待し、編集者の役割を付与します。
metadata_templateには、scopeとtemplate_keyの両方が含まれている必要がある
metadata_templateには、scopeとtemplate_keyの両方が含まれている必要がある
.envファイル内のBOX_METADATA_TEMPLATE_KEYの値が欠落しているか、空になっています。手順1でメタデータテンプレートを作成した際にメモしておいたテンプレートキーを追加します。省略可: ERPへの合計額の転送
メタデータの構造化が完了したら、ダウンストリームへのデータ転送は簡単です。メタデータの適用後に、ERP統合の手順を追加します。本番環境へのスケーリング
重複した配信の処理
重複した配信の処理
BoxのWebhook配信では、データが重複して送信される場合があります。処理を行う前にメタデータがファイルに既に存在するかどうかを確認することで、ハンドラに冪等性を与えます。
GET /2.0/files/:id/metadata/enterprise/:templateを使用し、インスタンスが既に存在する場合は抽出をスキップします。イベントストリームを使用した大規模な処理
イベントストリームを使用した大規模な処理
処理量が多い環境では、Webhookの代わりにの使用を検討してください。Enterprise Eventは、ポーリング方式による永続的なストリームを提供するため、数千件もの請求書のバッチ処理に適しています。
複雑な請求書での抽出エージェント (強化) の使用
複雑な請求書での抽出エージェント (強化) の使用
請求書に複雑なレイアウト、複数ページにわたる明細、または標準ではない書式が含まれている場合は、精度を高めるために を使用します。抽出の呼び出しでこのエージェントを指定します。
次の手順
営業用RFP回答集
Box HubsとBox AIを使用して、営業チーム向けのAI搭載ナレッジベースを構築します。
APIリファレンスの抽出
抽出 (構造化) のための詳細なAPI仕様を確認します。
