第5回ワークショップの1回目は見ていただけましたか?
自分だけのAIが、簡単に作成でき公開までできました。
OpenAI社のGPTsを使えば同じようなものが公開できますが、GPTsの場合にはChatGPTに固定され、Difyのように自由にAIモデルを組み合わせることができません。
今回は、更に使いやすくし最終的には自動化も狙います(今回のワークショップでは自動化までは含まれていません)。
作りたいモノ
今回作りたいモノは、以下のものです。
- Googleスプレッドシートのセルにキーワード、コンテキストを入力
- ボタンをクリックするとDifyのブログライターから記事を取得
- Difyは記事作成をGoogle Gemini Pro1.5にお願いする。

そんなメンドウなことをしないでも、「Difyで公開したアプリを使えば良いのでは?」
と思われるかもしれませんが、
- 作成した記事をWordPressへワンクリック投稿
- Difyで画像作成アプリを作り記事へ追加
- Googleのトリガーを使用しての自動化
などの拡張を考えると、アプリをGoogleスプレッドシートにまとめるのは一番簡単で効果的な方法と考えます。
手順
では最終形に向かう手順です。
- DifyアプリをAPIで使ってみる。
- Googleスプレッドシート上で実行できるプログラムにする。
DifyアプリをAPIで使ってみる
前回の作業でブログライターを公開しました。公開方法は、以下の3つです。
- Webアプリとして公開
- サイトへ埋め込み
- APIでの公開
まずは、PC(コンソール–黒い画面)からアプリを使ってみます。プログラム化は、手作業を行い、その作業をコードにしていくことです。
APIキーの取得
誰でも自由にアクセスできるのではなく、APIでのアクセスにはAPIキーと呼ばれるカギが必要です。
作成したアプリにアクセスし、左側メニューから「APIアクセス」をクリックします。

APIの解説ページの右上に「APIキー」ボタンがありますのでクリックします。

ダイアログが開きます。「新しいシークレットキーを作成」ボタンをクリックします。

別なダイアログが開き、APIシークレットキーが表示されます。右の「コピー」アイコンでコピーします。

閉じると、作成したAPIシークレットキーが表示します。

APIの使い方
APIアクセスページに使い方は書いてあるのですが、正直分かりません。
取りあえずコンソールを起動して、書いてあるコマンドを入力します。

送るデータは、”inputs”に入れるようですが、何を入れて良いのか分からないので、適当に「title」、「languate」、「context」として送信しました。
「curl」はコマンドからサーバーへデータを送信するプログラムです。
Mac、Windowsとも別途インストールが必要ですが、今回は記事を読むだけでインストールの必要はありません。
送信結果は、すぐに返ってきました。
- bad_request 不正な要求
- このサーバーが理解出来ないものを送って来た。
と、言われました。
❯ curl --location --request POST 'https://api.dify.ai/v1/completion-messages' \
--header 'Authorization: Bearer app-取得したAPIシークレットキー' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {title:"Google spreadsheetの優れている点", language: "Japanese, context:"Google spreadsheetの便利な点を初 心者にもわかりやすく解説してください。"},
"response_mode": "streaming",
"user": "abc-123"
}'
{"code": "bad_request", "message": "The browser (or proxy) sent a request that this server could not understand.", "status": 400}
送信するデータを調べる
APIアクセスページを読むと、パラメータの取得方法がありました。

このアプリのパラメータを取得します。
❯ curl -X GET 'https://api.dify.ai/v1/parameters' \
--header 'Authorization: Bearer app-取得したAPIシークレットキー' \
--header 'Content-Type: application/json'
返信は、以下のデータです。
「user_input_form」がアプリでの入力項目になります。
{
"opening_statement":null,
"suggested_questions":[
],
"suggested_questions_after_answer":{
"enabled":false
},
"speech_to_text":{
"enabled":false
},
"text_to_speech":{
"enabled":false,
"language":"",
"voice":""
},
"retriever_resource":{
"enabled":false
},
"annotation_reply":{
"enabled":false
},
"more_like_this":{
"enabled":false
},
"user_input_form":[
{
"text-input":{
"label":"Keywords",
"variable":"prompt",
"required":true,
"default":""
}
},
{
"select":{
"label":"Target Language",
"variable":"target_language",
"required":true,
"options":[
"\u4e2d\u6587",
"English",
"Portugu\u00eas",
"\u65e5\u672c\u8a9e"
],
"default":""
}
},
{
"paragraph":{
"label":"Context",
"variable":"context",
"required":true,
"default":""
}
}
],
"sensitive_word_avoidance":{
"configs":[
],
"enabled":false,
"type":""
},
"file_upload":{
"image":{
"enabled":true,
"number_limits":3,
"detail":"high",
"transfer_methods":[
"remote_url",
"local_file"
]
}
},
"system_parameters":{
"image_file_size_limit":"10"
}
}
パラメータを送る
コンソール上で入力するのはメンドウなので、テキスト・エディタ上で編集してコピペを送信します。
❯ curl --location --request POST 'https://api.dify.ai/v1/completion-messages' \
--header 'Authorization: Bearer app-取得したAPIシークレットキー' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {
"Keywords": "円安",
"Target Language": "\u65e5\u672c\u8a9e",
"Context": "円安を利用して資産を増やす方法"
},
"response_mode": "streaming",
"user": "abc-123"
}'
すると、呪文のような回答が送られてきました。どうやら、小さなデータで日本語はUTF8のコードで送ってきているようです。
data: {"event": "message", "message_id": "1b9d9937-fb2a-4659-8335-c76667e63117", "created_at": 1719167141, "task_id": "f0e9891c-dc07-4876-b0b4-aa83437f2f5c", "id": "1b9d9937-fb2a-4659-8335-c76667e63117", "answer": "##"}
data: {"event": "message", "message_id": "1b9d9937-fb2a-4659-8335-c76667e63117", "created_at": 1719167141, "task_id": "f0e9891c-dc07-4876-b0b4-aa83437f2f5c", "id": "1b9d9937-fb2a-4659-8335-c76667e63117", "answer": " Step 1: Article Outline \n\n| Heading | Subheading |\n"}
data: {"event": "message", "message_id": "1b9d9937-fb2a-4659-8335-c76667e63117", "created_at": 1719167141, "task_id": "f0e9891c-dc07-4876-b0b4-aa83437f2f5c", "id": "1b9d9937-fb2a-4659-8335-c76667e63117", "answer": "|---|---|\n| **\u5186\u5b89\u6642\u4ee3\u306e\u5230\u6765\uff1a\u8cc7\u7523\u904b\u7528\u6226\u7565\u3092\u518d\u8003"}
ChatGPTに変換してもらう
正しい結果を受け取れたのか確認するために、ChatGPTに変換してもらいました。
ChatGPTとの会話は、こちらが全文です。

正しい結果を得られたようです。

プログラムにしてもらう
毎回ChatGPTにコピペするワケにもいかないので、ChatGPTにプログラムにしてもらいます。
javascriptにしているのは、Googleスプレッドシートで使うためです。エクセルでのマクロ・VBAにあたります。


まとめ
Difyで作成したアプリをAPI経由で使う準備ができました。
行ったことは、
- APIシークレットキーの取得
- APIの使い方を探る
- 回答が読めないので読めるようにプログラム化
を行いました。
次回
次回は、Googleスプレッドシートへプログラムを書き込みます。
- セルから、キーワード、コンテキストを読み込みAPI送信
- 受信したデータを日本語に変換してセルへ格納
を行います。