CAPでAIエージェント化した発注アプリに、ファイルを添付できるチャット画面を付けました。見積書のPDFを渡すと、エージェントが中身を読み取り、人の確認を経て発注を登録するところまで動いています。改修はClaude Codeに任せ、BTPへのデプロイまで行いました。
個人の検証環境で試した記録です(2026年10月16日時点)。使っているプラグイン @cap-js/agents はバージョン 0.9 系で、今後仕様が変わる可能性があります。
ここでいう「発注」は、SAP標準の購買発注ではありません。検証用に作った簡易的な発注アプリです。アプリとエージェント化の概要は、コチラにまとめています。
まとめ
| 項目 | 内容 |
|---|---|
| やったこと | エージェントのチャット画面にファイル添付できるようにし、見積書PDFから発注を登録できるようにした |
| 結果 | 文字の入ったPDFは読み取れた。登録前に人が確認し、承認するとCAPにてS/4アドオンテーブルへデータが登録される。 |
| 読めないもの | スキャンしたPDF(画像だけのPDF)は読めない |
| 課題 | LLMが単位を勝手に置き換えるなど、ときどき変な動きをする。人の確認は必須 |
| 費用 | 追加のサービスは不要。LLMの利用料だけ |
やりたかったこと
LLMを活用すれば、キーボードで一つずつ入力しなくても、帳票から情報を読み取り、SAPへの登録まで自動化できるのではないかと考えました。
そこで今回は、見積書PDFをチャットに添付するだけで、内容の読み取りから発注登録までをエージェントに任せられるかを試してみました。
全体の流れ
見積書PDF
↓ チャット画面で添付(📎)
CAP(BTP)がファイルを受け取って保存(LLMにはファイル名と種類だけ伝わる)
↓ LLMがPDF読み取りツールの呼び出しを要求
CAPがPDFから文字を取り出してLLMに返す
↓ LLMが発注登録ツールの呼び出しを要求
CAPが実行の前に止めて、画面に確認カードを出す
↓ 人が内容を見て「承認」か「却下」、「承認」すると処理が進む
CAPが入力チェックをして発注を登録(合計10万円超なら「承認待ち」になる)
やったこと
| # | 内容 | 規模 |
|---|---|---|
| 1 | プラグインのファイル受け取り機能を有効にした | 設定1行 |
| 2 | ファイルを添付できるチャット画面を作った | プラグイン付属の画面をコピーし、📎ボタンを追加 |
| 3 | PDFから文字を取り出すツールを作った | CAPのアクション1つ+PDFライブラリ |
| 4 | 発注を登録するツールを作った | CAPのアクション1つ |
| 5 | チャット画面へのリンクとして発注画面に「エージェントに相談」ボタンを付けた | Fiori Elementsのカスタムアクション |
1. ファイル受け取りは、プラグインに最初から入っていた
@cap-js/agents には、送られてきたファイルを保存し、エージェントに読ませる仕組みが入っていました。初期値が無効になっているだけで、package.json に1行足すと有効になります。
"cds": { "agents": { "fileIO": { "enabled": true } } }
ただし、プラグインが読めるのはCSVやテキストだけで、PDFは「バイナリなので読めない」と断られました。そのため、PDFを読むツールを作成しています。
2. チャット画面は、付属の画面をコピーして改修した
プラグインには確認用のチャット画面が付いていますが、ファイルを添付する欄がありません。この画面は node_modules の中にあり、直しても更新のたびに消えてしまいます。そこで、画面をコピーして📎ボタンを足しました。
3. PDFを読むツール
CAPにアクションを1つ足し、添付されたPDFから文字を取り出して返すようにしました。ライブラリはMozillaの pdfjs-dist です。
4. 発注を登録するツール
発注を登録するアクションを足し、@agent.hitl を付けました。
これにより、エージェントが発注登録を実行しようとすると処理が一時停止し、画面に確認カードが表示されます。人が「承認」を押すまでは、登録処理は実行されません。
登録処理には、画面の「保存」と同じ処理を利用しています。そのため、画面から登録した場合と同様の入力チェックが適用されます。
5. 発注画面からチャット画面へのボタン
発注一覧のツールバーに「エージェントに相談」ボタンを付け、押すとチャット画面が別のタブで開くようにしました。
動かしてみた
見積書PDFを添付して、「添付した見積書の内容で発注を登録して」と頼みました。
- エージェントがPDFを読み、仕入先・品目・数量・単価を整理する
- 確認カードが出る(登録しようとしている内容がそのまま表示される)
- 「承認」を押すと登録される
はまったところ
- Chromeでボタンが表示されない:発注画面にチャット画面へのリンクを追加して再デプロイしましたが、Chromeでは古い画面定義がキャッシュされており、通常の強制再読み込みでは更新されませんでした。DevToolsで「Disable cache」を有効にして再読み込みしたところ、更新が反映されました。
環境と費用
| 項目 | 内容 |
|---|---|
| CAP | Node.js、@sap/cds 10、@cap-js/agents 0.9.7 |
| 発注データの保存先 | SAPのABAPローカル環境(Cloud Connector経由) |
| LLM | OpenAI gpt-4o-mini(SAP AI Coreは使っていない) |
| PDF読み取り |
pdfjs-dist(無料のライブラリ) |
| BTP | トライアル環境 |
添付ファイルはアプリ自身のDBに保存されるので、追加のサービスは要りませんでした。その代わり、アプリを再起動すると添付ファイルは消えます。
感想
- CAPとLLMがどのように連携するのか、これまで十分に理解できていませんでしたが、今回の実装を通じて、処理の流れを具体的に理解できました。
- 「PDFを読む」「発注を登録する」といった機能をツールとして用意するだけで、LLMが必要に応じて使い分けてくれる点は便利だと感じました。
- 一方で、LLMが常に指示どおりに動作するとは限りません。登録前に人が内容を確認する仕組み(HITL)は不可欠だと感じました。
- テストでは、Claude CodeがPlaywrightを使ってブラウザを操作し、ファイル添付から確認・承認までの一連の流れを検証してくれました。
- Playwrightの使用を明示的に指示しなくても、テストの目的に応じて使用するツールを判断していた点も興味深かったです。


