Agentic WorkflowをAPIで呼び出したい
watsonx Orchestrate上で開発したAgentic Workflowはこれまで、エージェントから呼び出されることが前提でしたが、昨年のアップデートでAPI経由でも呼び出すことができるようになりました。この記事ではAPIによるAgentic Workflowの使用方法について説明します。
Agentic Workflowとは?
Agentic Workflowはwatsonx Orchestrate上に実装可能なワークフローで、ツールの呼び出しや分岐、ユーザーへのデータ表示などをフロー形式で実装することが可能な機能です。
生成AIによるテキスト生成や、ドキュメント分類、テキスト抽出処理なども呼び出すことが可能なため、アップロードされたファイルの種類を分類してテキスト化して返すなどといった処理も可能です。
テスト用フローの作成
まずは以下のような、Stringの入出力のフローを定義してみます。

チャットから起動すると以下のように返答がきました。

こちらのフローをAPIで呼び出してみたいと思います。
APIによるフローの呼び出し
同期呼び出し用のAPIと非同期呼び出し用のAPIが用意されていますが、非同期呼び出しを行うにはコールバック用のエンドポイントを用意する必要があるため、今回は同期呼び出し用のAPIを使ってみたいと思います。
flow_idの取得
SaaS版のURLは以下の通りです。これを呼び出すには、まずflow_idを取得する必要があります。
https://api.{hostname}/instances/{tenant_id}/v1/orchestrate/flows/{flow_id}/run?request_timeout=REPLACE_THIS_VALUE
flow_idの取得方法は公式ドキュメント上では明確な記載が見つけられませんでしたが、Toolのidで良いようです。Toolのidは以下のAPIで取得可能です。
watsonx OrchestrateのAPIを呼び出すには、まず、JWTトークンを取得する必要がありますが、利用している環境によってトークンの取得方法が異なるため、ここでは割愛します。
flowの呼び出し
flow_idが分かったらフローを呼び出してみます。この時、入力データは以下のように通常のJSONオブジェクトとして指定すれば問題ありませんでした。
Postmanから実行したところ正しく結果を取得できました!

ファイルを送信したい場合はどうするのか?
フローの入力タイプとしては以下のものが利用可能です。

先程のフローの入力にファイルタイプのパラメータを追加し、ドキュメント抽出ノードを追加し、領収書の金額を抜き取る処理を設定します。

ファイルの場合はどのようにデータを送信するのか疑問だったのでいろいろと検証してみたのですが、結論から言うと以下のようなData URL形式で送付すればOKでした。
{"inputFile":"data:application/pdf;name=test.pdf;base64,JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PC9UaXRsZSA8RkVGRjMwQjkzMERFMzBGQzMwQzgwMDQ1MDA1OD4KL0NyZWF0b3IgKE1vemlsbGEvNS4wIFwoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0XCkgQXBwbGVXZWJLaXQvNTM3LjM2IFwoS0hUTUwsIGxpa2UgR2Vja29cKSBDaHJvbWUvMTQxLjAuMC4wIFNhZmFyaS81MzcuMzYpCi9Qcm9kdWNlciAoU2tpYS9QREYgbTE0MSkKL0NyZWF0aW9uRGF0ZSAoRDoyMDI1MTAyODExMTcxMSswMCcwMCcpCi9Nb2REYXRlIChEOjIwMjUxMDI4MTExNzExKzAwJzAwJyk+PgplbmRvYmoKMyAwIG9iago8PC9jYSAxCi9CTSAvTm9yb
以下のファイルをbase64でエンコードし、DataURL形式で送信してみます。

まとめ
この記事では、watsonx OrchestrateのAgentic WorkflowをAPIで呼び出す方法について説明しました。業務処理を実装する際には、チャット形式で自然言語を用いてエージェントとやりとりするパターンだけではなく、今回紹介したようなフローを呼び出せば十分なケースもあります。Agentic Workflowの機能としては、LLM呼び出しだけではなく、今回使用した文書処理や、ルール・エンジンの呼び出しなども含まれるので、これらを用いた共通処理フローを実装しておき、エージェントからだけではなく、APIで呼び出すパターンも実用的なのではないかと思います。

